OmniAICreator/Qiita-1.07M huggingface dataset:
ポリマーでの参照型データのバインディング


## 参照型による意図しないバインディング

参照型によって意図せずデータがバインディングされてしまうことが多々あったので検証メモ。

http://jsdo.it/sosuke4cs/polymer-object-binding-test

## テスト

### Step 0 (Polymer created)

* o1 ⇄ object (2 way data biding via Polymer system)

* o2 = o1 (参照型)

* o3.name = o1.name (非参照型)

### Step1 (ボタン１)

* object.name = "newValue1"

### Step2 (ボタン２)

* object = { name: "newValue2" }


## 結果

### Step 0 終了時

`o1.name`、`o2.name`、`object.name` がbindingされている。
`o2` が意図しないbinding（自分がjs知らなすぎるだけか）

### Step 1 終了時

`object.name`に参照型で __ない__ ものを代入
`o1.name`、`o2.name`、`object.name` のbindingは維持

### Step 2 終了時

`object`に参照型で __ある__ ものを代入
`o2` の意図しないbindingが意図せず解除


## 考察
参照型をバインディングする時はどの値を見にいっているか、いつ代入した注意。
（あたりまえか汗；；；）
これは使える。tutorialspoint

#1. はじめに

IT に関する教育サイトはよくありますが、tutorialspoint というサイトは範囲が広くて、ちょっとマイナーな技術や言語も載っています。さらにすごいところは、実際に対象の言語をお試しで動かしてみることができるところです。
![tutorialpoint.png](https://s3-us-west-2.amazonaws.com/tiny10be/wiki/img/tutorialpoint.png)
[tutorialspoint　ホームページ](http://www.tutorialspoint.com)

どんなところのサイトかと思ったら、インドのハイデラバードというところにある会社がやっているようです。
![tutorialpoint.png](https://s3-us-west-2.amazonaws.com/tiny10be/wiki/img/tutorialpoint_contact.png)

#2. どんな内容があるか

メニューは大きく３つに分かれていて、下のようになっています。

*    Tutorial Library
*    Coding Ground
*    Absolute Classes


##Tutorial Library

これは言語や技術の無料チュートリアルです。自分の知らない技術などのザクッとした知識を得るにはいいです。
![tutorialpoint.png](https://s3-us-west-2.amazonaws.com/tiny10be/wiki/img/tutorialpoint_library.png)

##Coding Ground

これは、ブラウザ上にシェルが起動し、実際に簡単なプログラムを書いて試すことができます(無料)。マイナーな言語などをマシンにインストールせずに試せるのはいいですね。
![tutorialpoint.png](https://s3-us-west-2.amazonaws.com/tiny10be/wiki/img/tutorialpoint_coding.png)

![tutorialpoint.png](https://s3-us-west-2.amazonaws.com/tiny10be/wiki/img/tutorialpoint_shell.png)



##Absolute Classes

これは有料の教育コースです。これで稼いでいるんでしょうね。英語なので日本人にはちょっと敷居が高いかな。

料金ですが、$100 前後です。個人で学習するのはちょっと大変なもの (例：Dataware House とか) は国内の教育コースと比べてかなりお安いのでいいんじゃないでしょうか。



[原文 ..](http://bonk.red/show.php?id=22)

(著作権に関して心配する人がいるのでひと言。著作者はこの投稿者と同じです)
NewrelicのServer一覧を見やすくする @Engine Yard Cloud

![Screen Shot 0027-02-25 at 17.50.01.png](https://qiita-image-store.s3.amazonaws.com/0/1232/db1dfcb9-d9fe-afd8-d647-76e695296d68.png)

Newrelicのサーバ一覧にて、適応される名前を変えるChefを書きました。
IPアドレスでは分かりにくいので、`環境名/インスタンスID` を使ってみました。

他にも好きな値を使に置き換えることができます。


レシピはこんな感じ。
https://github.com/ukitazume/ey-mini-cookbook/tree/master/cookbooks/goodname_newrelic

Newrelicのドキュメントはこちら。

https://docs.newrelic.com/docs/servers/new-relic-servers-linux/maintenance/changing-linux-server-name
Linuxのclangでlibhoge.aが取り込まれなかった件とその解決

# 背景

OSXで問題なく、ビルド出来てる[libtrusterd](https://github.com/trusterd/libtrusterd)、[ボス](https://github.com/matsumoto-r)がつけてる
バッチをつけようと、まえまえ、から断片的に知っていたtravis ciを
さくっと使い、近代的なgithubの使い方が出来てない俺でも、ボスを
あっと言わせてやろと考えた。

# Linuxでビルドするには茨の道

いろいろあったので、後で小出し予定ｗ

# 何でclang

trusterdがclang使ってる。

# libhoge.aをフルパスで指定するとNG

```bash
clang -shared ore.c -o libtrusterd.so mruby/foo/bar/libhoge.a -Lmruby/lib -lsugoi
```

他の.soライブラリもlibtrusterd.soを作成する際に指定しているが、
これらは問題無く、どうやら、libhoge.aの中のシンボルだけが
NG(nmコマンドの見方がイマイチ分からず、
ほんとに、libhoge.aだけかは確証をもって作業を指定なかったけど)

# h2oで知ったとっておきの技を試す

- [俺がlibh2oの記事を読んで学んだこと #osx #dylib](http://abrakatabura.hatenablog.com/entry/2014/12/03/120000)

ar コマンドでlibhoge.aをバラし、オブジェクトファイルにする。

```
ar x mruby/foo/bar/libhoge.a
```

これで、

```bash
clang -shared ore.c -o libtrusterd.so *.o -Lmruby/lib -lsugoi
```

のような感じで無事に実行してもシンボル参照エラーとならないlibtrusterd.soが
出来た。

# ふとGoのとある記事のことを思い出す。

- [Go言語@Windowsでmrubyを静的リンクする - Qiita](http://qiita.com/nocd5/items/4a1ebe5dfccedd3d6e2b)

この記事の中で、libhoge.aを-lhogeでもリンク出来ていた事を思い出した。

やってみた。

```bash
clang -shared ore.c -o libtrusterd.so -Lmruby/foo/bar/ -lhoge -Lmruby/lib -lsugoi
```

# まとめ

共有ライブラリを作る際の知識がまだまだ不足して、
理屈が分からず、試行錯誤で解決している。

まぁ、動くのが大事だけど、理屈もそのうち。

ただ、なんとく、フルパス指定だと、リンカに直接.aファイルを渡すことに成り、
とあるサイトでは、リンカは.so作成時に.aはリンク出来ない旨を見つけたから、
これが事実なら、今回の動きは納得できる。

あ、OSXではこれができてるんだよなぁ。。

# 関連投稿

- [Shift-JISのソースをiconvでUtf-8に変換してclangでエラー - Qiita](https://qiita.com/kjunichi/items/518e337d29cc5bf6a70b)
あなたはだんだん、ファイルを読むのにlessコマンドを使いたくなる

サーバー上のファイルの中身を確認するときって、どんなコマンドを使っていますか？
私は、短いファイルの場合はcat、長いファイルの場合はlessを使っています。
リモートエクスプローラーから、sakuraとかで開くより楽ちんです。

### あなたがlessを使いたくなる理由

#### **moreの上位互換**

「上位互換」という響きだけで、使いたくなりますよね？
名前の由来も、「moreの対義語だから」です。素敵ですね。
「moreと何が違うの？」という説明は、今どきmoreを使う機会が無いという理由から割愛します。

#### **manやgitコマンドのデフォルトのページャー**

何かが当たり前のようにlessコマンドを使っている。
これはもう、使いたくなりますよね？

#### **簡単、早い**

サーバー上で
```
$ less <ファイルパス>
```
と入力すればパッと画面が切り替わって、ファイルの内容を読むことができます。起動もとても早いです。
時間の節約になるんだから、使いたくなりますよね？


### lessを使いこなしてる感じが出る操作方法

使っていて気持ちがいいと、使いたくなりますよね？
矢印キー・マウスホイールを使う必要はありません。
キーボードから手を動かさずにスイスイとファイルが読めるようになる、必要十分なコマンドを紹介します。
大文字の場合は(Shift+)だと思ってください。
大抵の場合は、小文字の場合と逆の動作をします。

| キー       | 動作                         | 覚え方  |
|------------|------------------------------|--------|
| j          | 1行下へ （↓キーと同じ）数字入力後なら指定行下へ      | joshi  |
| k          | 1行上へ （↑キーと同じ）数字入力後なら指定行上へ      | kousei |
| d          | 半ページ下へ                 | down   |
| u          | 半ページ上へ                 | up     |
| f          | 1ページ下へ （PgDownと同じ）   | foward |
| b          | 1ページ上へ （PgUpと同じ）   | back   |
| /\<pattern> | patternの文字列を下方検索    |        |
| ?\<pattern> | patternの文字列を上方検索    |        |
| &\<pattern> | patternの文字列に一致する行のみを表示。"&"に続けて"!"を入力すると、マッチしない行のみの検索となる   |        |
| n          | 検索した文字列の次のマッチへ | next   |
| N          | 検索した文字列の前のマッチへ |        |
| g         | ファイルの先頭へ             |        |
| G          | ファイルの末尾へ             |        |
| n（数字）G | n行目へ                      |        |
| q          | 終了                         | quit   |

また、起動時にオプションでNを渡すか、起動後に"-N、\<Enter>"と入力すれば、行番号が表示されます。
**これがあるだけで、とてもいいページャーな気がしてきます。**
環境変数でデフォルトに設定することも可能です。（詳細は割愛）

私は、ローテートされていない長いエラーログを読むときなどは、起動後すぐにGを押しています。


### こんな時にもお役立ち

活躍の場は、ただ単にファイルを読むだけに留まりません。
役に立つ子って、使いたくなりますよね？

* コマンドの結果が標準出力に出る場合

ls -lR や tree を使った場合など、標準出力に長く結果が出てしまって、スクロールするのが面倒ですよね。
そんなときはこれ。

```
$ ls -lR | less
```
パイプで渡せば、じっくり&快適に読めます。


* ファイルの末尾を追跡する

tailfでもできますが、ログが追記された時などに、再度開き直す必要はございません。
Fを押すことで、末尾を追跡するモードになります。（抜けるのは Ctrl + c）


### 締めに

ファイルの中身を確認する時の方法として、lessコマンドを使いたくなりましたでしょうか？

その他、よく使うコマンドやオプションがありましたら、お気軽にコメントなどでご指摘いただけると助かります。
Macの物理マシンにLinuxをインストールする際、GUIDパーティションのラベルがマルチバイト文字を含んでいると死ぬ

Macの物理マシンにLinuxインストールを試みた人がひょっとしたら踏む罠について説明します。

## 背景

MacでLinuxを使いたいときに大半の人がVirtualBoxなどの仮想環境を利用するでしょうが、物理マシンに直接Linuxをインストールすることもできます。特にメモリの少ない古いマシンでは物理マシンにインストールしたい状況もあるのではないでしょうか。また、海外ではそうしたノウハウが一定たまっているように見えますので、ハマりどころは少ないだろうと筆者は想像していました（参考：https://help.ubuntu.com/community/MacBook）。

しかし、Macの物理マシン上にLinuxをインストールする際、一部のLinuxのインストーラが「ubi-partman failed with exit code 141」などといったエラーダイアログを出して先に進めなくなることがあるようです。筆者の場合はLinux Mint 17.1（Ubuntu 14.04LTSベース）のインストーラで発生しました。

このタイミングで/var/log/syslogを見ると次のようなエラーが見つかります。

```
Sep 14 06:04:44 kubuntu partman:   No matching physical volumes found
Sep 14 06:04:44 kubuntu partman:   Reading all physical volumes.  This may take a while...
Sep 14 06:04:44 kubuntu partman:   No volume groups found
Sep 14 06:04:44 kubuntu partman-lvm:   No volume groups found
```

（似た状況だと思われるロシア語の投稿より引用：http://forum.ubuntu.ru/index.php?topic=249796.0）

ネットで類似例を調べてもノーヒントに近い状態で、手詰まりになる人も多そうに感じました。

## 原因と対策

この原因はおそらくGPTディスクのGUIDパーティション情報にマルチバイト文字が入っていることです。私の場合はMacOSXのパーティションのラベルが「名称未設定 5」となっていました。

これはMacOSX上で次のようにして調べることができます。

```
$ diskutil info /dev/disk0s5
   Device Identifier:        disk0s5
   Device Node:              /dev/disk0s5
   Part of Whole:            disk0
   Device / Media Name:      名称未設定 5

   Volume Name:              Macintosh HD
   Escaped with Unicode:     Macintosh%FF%FE%20%00HD
（以下略）
```

これを修正するのにgptコマンドが使えます。

```
$ diskutil unmount /dev/disk0s5
$ sudo gpt label -i 5 -l "Macintosh HD" /dev/rdisk0 
```

ただし、これを行うには対象のGPTディスクをアンマウントする必要があるようです。つまり、修正したいディスクが起動ディスクの場合は不可能でしょう。筆者はたまたま外付けSSDからMacOSXを起動できる環境があったので、上記コマンドを打てました。

これが難しいような場合は、ディスクユーティリティの「修復」機能を使って一時的にMacOSXのパーティションを退避してパーティションを切り直すしか無いでしょう。パーティションを切る段階でパーティション名を「MacOSX」などと英数字だけにしておけば、このような問題は起きないように思います。

参考：http://apple.stackexchange.com/questions/23373/changing-a-volumes-device-media-name

## まとめ

筆者はこの作業を行うことで、無事MacBook Air(2010 Late)にLinux Mint 17.1をインストールできました。

それにしても仮想環境っていいものですね。
Project Euler 4 

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

では, 3桁の数の積で表される回文数の最大値を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%204

本能気ままに解いた。正解かどうかは確認していない。

```
(i,j)=(999,999)
max=1

while i>0:
    while j>0:
        k = i*j
        if k <= max: break
        if str(k)==str(k)[::-1]: max=k
        j -= 1
    (i,j)=(i-1,999)
print max
```

ほかにありうるとすれば、1. 3桁＋逆順3桁で6桁の回文数を作成し、それが3桁×3桁で表されるかどうかをチェックする 2. リスト内包表記を使ってみる、の2点だろうか。後で試してみよう。
Project Euler 3 高速化とは？

13195 の素因数は 5, 7, 13, 29 である.

600851475143 の素因数のうち最大のものを求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%203

思いつくまま解いてみた。

```
target = 600851475143
i = 1
while target != 1:
  i += 2
  while not target % i:
    target /= i
print i
```

これは600851475143が合成数であることを前提とした回答である。合成数であるがゆえに、while文もそんなに繰り返されるわけでない。よってこのコードでも問題はない。
ただ、600851475143が素数であった場合、このコードには問題が生じることとなる。600851475143/2 約3兆回程剰余を計算することとなる。

つまり、次のようなシュチュエーションが生じることとなる。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/70480/20909dda-2f5b-779f-31ea-6e9e0dd06ff5.png)


サービス提供においては、早くて問題になることはなく、遅いと問題になりがちである。このような観点からすると、仮に素数であったとしてもリスクヘッジの観点からその遅さを回避できる次のようなコードが好ましいのかもしれない。
次のコードではエラトステネスの篩もろもろでtargetの平方根まで素数のリストを作成し、そのリストを基に素因数分解を試みている。すべての素数で剰余計算を行わない点、targetの平方根までしか計算を行わない点で、安定した処理速度がでるんじゃないかと思われる。（targetの平方根までしか計算を行わないのは上のコードでもできるけど。）

```
import mymath
import math
target = 600851475143
pri = mymath.get_primes(int(math.sqrt(target)))
max_p = 1
for p in pri['list']:
    while not target % p:
        target /= p
        max_p = p
if target != 1:
    print target
else:
    print max_p
```
![002.png](https://qiita-image-store.s3.amazonaws.com/0/70480/267271fa-17a6-3d44-4e63-948a588d4253.png)

なお、mymathはこちら。
http://www.sato-pat.co.jp/
Fortigate 60d with PPPoE unnumbered

[Fortinet](http://www.fortinet.com/)のUTM [Fortigate 60d](http://www.fortinet.co.jp/products/fortigate/60DSeries.html)で[PPPoE Unnumbered](http://www.infraexpert.com/study/ip13.html)するときの基本的な設定です。

PPPoE Unnumberedについてはこちらが参考になります。
「ネットワークエンジニアとして」
(http://www.infraexpert.com/study/ip13.html)

FortigateにインストールされているOS([FortiOS](http://www.fortinet.com/technology/network-os-fortios.html))の動きを知ってないとはまるので、共有したいと思います。

> 例によって会社はほぼこの設定で動いてます。

あじぇんだ

* ネットワーク構成
* PPPoE Unnumberedの設定
* DMZのネットワーク設定

#ネットワーク構成
今回のネットワーク構成は以下になります。
また、インターネットへの接続形態はPPPoEのLAN型接続の場合です。

* ISPからIP8(グローバルIP8個分のセグメント)を提供されている。
* ISPとはPPPoEで接続する。

![FullSizeRender.jpg](https://qiita-image-store.s3.amazonaws.com/0/49986/994a4c37-7a48-2655-c84a-24d384a6c56c.jpeg)


今回の構成のポイントは、

* 60Dをフロントに配置
* 通常業務を行うセグメントは192.168.1.0/24
* 192.168.2.0/24セグメントは、業務ネットワークから分離し、特定の業務用のセグメントとする。[ASA5505](http://www.cisco.com/c/en/us/support/security/asa-5505-adaptive-security-appliance/model.html)のPublic側に、グローバルIPのうち1つを割り振って、特定業務のためだけにある別拠点へVPNを張る。

になります。

この構成を取るために、WAN1とDMZを同じグローバルIPセグメントのネットワークとして構成します。

# PPPoE Unnumbered の設定 
Fortigate 60d でPPPoEを設定するとすぐにはまるポイントがやってきます。

> PPPoE を設定すると、![forti_wan1.PNG](https://qiita-image-store.s3.amazonaws.com/0/49986/455c39ea-5d9a-abc9-1525-a0c4968d5b75.png)

FortoOS Handbookの[PPPoE addressing mode on an interface](http://docs-legacy.fortinet.com/fos50hlp/50/index.html#page/FortiOS%205.0%20Help/interfaces.100.17.html)
を確認すると、以下のような記載がみられます。

>Unnumbered IP
Specify the IP address for the interface. If your ISP has assigned you a block of IP addresses, use one of them. Otherwise, this IP address can be the same as the IP address of another interface or can be any IP address.

... どうも、IPセグメントが割り当てられている場合は、UnnumberedIPにISPから割り当てられたうちの一つを設定しろ、とのこと。

これで、WAN側がUnnumberedで通信するようになりましたが、まだせっかく配布されたグローバルIPをすべて使うことはできません。

FortiOSは、**PPPoE接続すると、ISPから配布されたIPセグメントの先頭アドレスが強制的に使われる**という動きをするためです。

内部的には、せっかくUnnumbered(=0.0.0.0)として設定したフロントWAN1のアドレスが、1.1.1.1で上書きされてしまう、ということになってしまいます。
上書きではなく、1.1.1.1→0.0.0.0への経路設定してくれることが必要なのです。

そこで、[pppoe-unnumbered-negotiate](http://docs-legacy.fortinet.com/fgt/handbook/cli_html/index.html#page/FortiOS%205.0%20CLI/config_system.24.034.html)コマンドでこの上書きを停止し、0.0.0.0でWAN1が通信するようにします。

```
config system interface
edit wan1
set pppoe-unnumbered-negotiate disable
end
```

#DMZのネットワーク設定
Unnumberedで通信できるようになったので、WAN1には、1.1.1.0/28宛ての複数のグローバルIPに向けられたパケットが到着するようになりました。
次は、DMZをWAN側と同じネットワークセグメントにします。こちらも、GUIでは設定できないので、[allow-subnet-overlap](http://docs-legacy.fortinet.com/fgt/handbook/cli_html/index.html#page/FortiOS%25205.0%2520CLI/config_system.24.082.html)を使用して、DMZとWAN1を同じネットワークに設定することを許可します。

```
config system settings
set allow-subnet-overlap enable
end
```

次に、DMZにISPから配布されたネットワークセグメントを設定します。
![forti_dmz.PNG](https://qiita-image-store.s3.amazonaws.com/0/49986/979ec722-79bf-9271-f613-2ddc53de5dd6.png)

これで、PPPoE UnnumberedでDMZ側に複数のグローバルIPを振ることができます。
自社では、ASA5505を接続していますが、DMZにHubを接続して、複数のWebServerを公開する、なんてことも容易にできるようになりました。

あとは、Fortigate 60DのFirewallでInbound、Outboundの必要なパケットを許可すればOKです。

せっかくIP8個もらっているので、有効活用したいですもんね。
Mokkosuでマンデルブロ集合を描画してみた

研究室の先輩が作ったプログラム言語Mokkosuで
マンデルブロ集合を描画するプログラムを作りました。

#スクリーンショット
![mandel.png]
(https://qiita-image-store.s3.amazonaws.com/0/70577/7e3b31ae-2435-18c4-3125-e72f1338bb23.png)

#ソースコード
```
include "Graphics.mok";

let window_size = 500;
let x = ~-. 0.740425 -. 0.3;
let y = 0.113265 +. 0.12;
let w = 0.5;
let iteration = 500;

let judge_mandel c =
  fun loop z count = 
    if count > iteration -> ~- 1 else 
    if pow (fst z) 2.0 +. pow (snd z) 2.0 > 2.0 -> count else 
    let zr = pow (fst z) 2.0 -. pow (snd z) 2.0 +. fst c in
    let zi = 2.0 *. (fst z) *. (snd z) +. snd c in  
    let next_z = (zr, zi) in
    loop (next_z) (count + 1)
  in
  loop (0.0, 0.0) 0;
  
let draw_mandel gr =
  let h = window_size / 2 in
  (for i <- ~-h .. h in
    let cr = w *. (int_to_double i) /. (int_to_double h) +. x in
    for j <- ~-h .. h in 
      let ci = w *. (int_to_double j) /. (int_to_double h) +. y in
      let judge = judge_mandel (cr, ci) in
      if (judge == ~- 1) -> ()
      else 
      let color = 360.0 *. pow ((int_to_double judge) /. (int_to_double iteration)) 0.33 in
      let h = color in
      let s = 0.60 in
      let v = 0.90 in
      let pixel_x = window_size / 2 + i in
      let pixel_y = window_size / 2 - j in
      let (r, g, b) = hsv_to_rgb h s v in
      draw_pixel gr r g b pixel_x pixel_y) |> ignore;
  
do scene "main" {
  ~Draw(gr) -> do
     draw_mandel gr;
   end;
  _ -> ();
};

do set_size window_size window_size;

do show_window "main";
```
KobitoのファイルをDropboxで同期とる(Kobito2.2.0)


# <span style="color:orange">注意(2017/07/14追記)</span>

最新のKobito(2.3.8)ではこの方法で上手く同期が取れなくなっていたのを発見したので注意してください。
少し調べてもうまいやり方が見つからなかった結果自分がどうしたかは[こちら](http://qiita.com/koyopro/items/ecfccae056f4ffd22826)。


# 背景

いざというときのために、Kobitoで作成したファイルもクラウド上に保存しておきたい。または、複数のMacで同じファイルを利用したい。
そのような需要に答える方法は以前からあった。しかし、最近のKobitoのバージョンアップにより(？)、従来の方法でのバックアップではエラーが出たので、最新のバージョンに対応させた方法をメモしておく。

# 環境

* MacOS X 10.9.2 (Mavericks)
* Kobito 2.2.0

# 過去バージョンとの違い

## Kobitoのファイル置き場

これらのファイルが置いてあるディレクトリが変更になった。

```
$ ls -1
Kobito.db
Kobito.db-shm
Kobito.db-wal
Kobito.db.2020000.bak
```

### 従来
`~/Library/Kobito/`

### 2.2.0
`~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/`

## シンボリックリンクでは動作しなくなった

従来は「[Dropbox - Qiita投稿フリークに贈る、Kobitoのデータを複数Macで同期する方法 - Qiita](http://qiita.com/zaru/items/065712232f3035a315cc)」のように、DropboxにDBの本体ファイルを置いてKobito側のディレクトリからシンボリックリンクを張ればよかった。しかし2.2.0では、シンボリックリンクからDBファイルを開こうとすると、読み込みエラーになってしまう。そこで、 **シンボリックリンクではなくハードリンクを利用する。**

# バックアップを作成する設定

Dropbox内、`~/Dropbox/Kobito/`というディレクトリにバックアップをとる例を示す。
※操作に失敗してもいいように、事前にコピーをとっておいてください。

まず、Dropbox側にディレクトリを作成し、DBファイルをDropbox側のディレクトリに移動。

```bash:
$ mkdir -p ~/Dropbox/Kobito
$ mv ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/* ~/Dropbox/Kobito/
```

そして、必要なファイルにハードリンクを張る。

```bash:
$ cd ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/
$ ln ~/Dropbox/Kobito/Kobito.db-wal Kobito.db-wal
$ ln ~/Dropbox/Kobito/Kobito.db-shm Kobito.db-shm
$ ln ~/Dropbox/Kobito/Kobito.db Kobito.db
```

これで、Dropbox側に置いたファイルが自動的に同期されるはず。
DBファイルが更新されるタイミングはQiitaを終了させたタイミングなので注意。なぜ保存を実行したタイミングでないのかは謎・・・。

# 参考

Dropbox - Qiita投稿フリークに贈る、Kobitoのデータを複数Macで同期する方法 - Qiita
http://qiita.com/zaru/items/065712232f3035a315cc
多段のループを抜ける方法

```pl
use strict;
use warnings;

LINE:
for (1..10) {
  for (1..10) {
    print "$_\n";
    last LINE if $_ == 3 ;
  }
}
__END__
1
2
3
```

perlstyle - Perl スタイルガイド - perldoc.jp
http://perldoc.jp/docs/perl/5.20.1/perlstyle.pod
日本語係り受け解析器CaboChaをRuby(とRubyGems)から扱う

日本語係り受け解析器CaboChaのRubyバインディング [cabocha-ruby](https://github.com/uetchy/cabocha-ruby) をリリースした。とは言っても [公式](https://code.google.com/p/cabocha/) のSWIGバインディングをベースにしたものだ。

## 導入

```console
$ gem install cabocha
```

でインストール出来る。
> cabocha-ruby をインストールする前に、CaboCha を`brew install cabocha`かなんかでインストールしておかないとmakeが失敗するので注意すること。

## 使う

requireする時は`require "cabocha"`と`require "CaboCha"`、どちらを使っても正しい。

```ruby
require "cabocha"

parser = CaboCha::Parser.new
tree = parser.parse("太郎は次郎に本を貸した")

p tree
```

なんてこった。これまでソースコードをダウンロードして`ruby extconf.rb && make install`していたのが、これからは`gem install cabocha`で済む。

バグを見つけたら [Pull request](https://github.com/uetchy/cabocha-ruby/pulls) を送ろう。
FirefoxでWebフォントが表示されないときの確認項目

1. リファラが有効になっているか

    1. `about:config` で `network.http.sendRefererHeader` が2であること

    3. Web Developerツールバーでリファラが無効になっていないか

2. ダウンロード可能なフォントが有効になっているか

    1. `about:config` で `gfx.downloadable_fonts.enabled` がtrueであること

3. ページが指定するフォントを優先する設定になっているか

    1. Preferences -> Content -> Font & Colors -> Web ページが指定したフォントを優先する

[参考リンク](http://help.typekit.com/customer/ja/portal/articles/807568-%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%AC%E3%82%A4%E3%83%89%EF%BC%9Aweb-%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%BF%E7%94%A8#firefox)
ServiceWorkerでモックサーバーを作る


実験環境は Chrome Canary 43.0.2314.0 だけど動かしてる分は現時点の安定版(40)でも動くはず

## やりたいこと

`http://localhost:3000/api/*` へのリクエストを全部serviceworkerに任せたい。

先行実装として [Jxck/response-injection](https://github.com/Jxck/response-injection "Jxck/response-injection") がある。

## やり方

sw.js(になるsw.coffee)

```coffee
console.log 'worker started'
self.onfetch = (event) ->
  console.log 'onfetch', event.request.url
  if event.request.url.indexOf(location.origin+'/api') > -1
    event.respondWith new Response '{"foo": "bar"}',
      status: 200
      headers:
        'Content-Type': 'application/json'
```

今回は location.origin+'/api', つまり http://localhost:3000/api 以下ならJSONを返却する。それ以外はスルーしてくれる(スルーする為の正しい定義がよくわからん。respondWithしなかったらデフォルトの挙動にフォールバックした)

ServiceWorkerのよくあるサンプルならCacheAPIを使ってアセットをキャッシュするんだけど、今回はどうでもいい。


browserで実行する側

```coffee
window.addEventListener 'load', =>
  navigator.serviceWorker.register 'sw.js', scope: '.'
  .then (r) ->
    console.log('service-worker registered')
    xhr = new XMLHttpRequest()
    xhr.open 'GET', 'api/foo'
    xhr.responseType = 'json'
    xhr.addEventListener 'load', (data) ->
      console.log 'loaded', data.target.response
    xhr.send()

  .catch (err) ->
    console.error('fail to register', err)
```

(どうも一回は失敗する。二回目以降有効？ `navigator.serviceWorker.ready` が promiseなのでthenを仕込んでみたけどダメだった。誰か解決策教えてください)

余計な要素が介入してこないように生のxhrでやった。(ここでfetch APIがあったらなぁ)


## ハマった点

最初、`scope: 'api/'` と書いてたら / からのアクセスがonfetchに飛ばず、URL直接踏むとJSON帰ってくる、みたいな挙動で悩んでいたんだけど、次の記事をみて気づいた

[Service worker が拓く mobile web の新しいかたち](http://www.slideshare.net/kinukox/service-worker-mobile-web "Service worker が拓く mobile web の新しいかたち")

serviceworkerは自分自身の属するドメインしか扱えないので、 / から /api/ のservice-workerを登録することはできても(なのでURL直接踏むと動く)、 / からの xhr は /api/ 以下に登録された service-workerに対して働かない！！


ということで3時間ぐらい悩みました。Twitterで質問に答えてくれた、ChromiumでServiceWorker実装している `@nhiroki_` さんありがとうございます…
Tick-Tack-Toe


```C++:Source.cpp
#include "Header.h"

TTT::TTT()
{
	for(int i=0; i<fild+1; i++)
		m_tttFild[i] = '*';
}

bool TTT::isWin(const char &mark)
{
	if((m_tttFild[1] == mark) && (m_tttFild[4] == mark) && (m_tttFild[7] == mark))
		return true;
	if((m_tttFild[2] == mark) && (m_tttFild[5] == mark) && (m_tttFild[8] == mark))
		return true;
	if((m_tttFild[3] == mark) && (m_tttFild[6] == mark) && (m_tttFild[9] == mark))
		return true;
	if((m_tttFild[1] == mark) && (m_tttFild[2] == mark) && (m_tttFild[3] == mark))
		return true;
	if((m_tttFild[4] == mark) && (m_tttFild[5] == mark) && (m_tttFild[6] == mark))
		return true;
	if((m_tttFild[7] == mark) && (m_tttFild[8] == mark) && (m_tttFild[9] == mark))
		return true;
	if((m_tttFild[1] == mark) && (m_tttFild[5] == mark) && (m_tttFild[9] == mark))
		return true;
	if((m_tttFild[3] == mark) && (m_tttFild[5] == mark) && (m_tttFild[7] == mark))
		return true;
	return false;
}

bool TTT::putMark(const int &putPlace, const char &mark)
{
	if(m_tttFild[putPlace] == '*'){
		m_tttFild[putPlace] = mark;
		return true;
	}
		return false;
}

const std::string TTT::solve(const std::string& input)
{
	for(int i=0; i<input.size() && i<fild; i++){
		if(i%2==0){
			if(!putMark((int)(input.at(i) -'0'), 'o')){
				return "Foul : x won.";
			}
			if(isWin('o')){
				return "o won.";
			}
		}
		if(i%2==1){
			if(!putMark((int)(input.at(i) -'0'), 'x')){
				return "Foul : o won.";
			}
			if(isWin('x')){
				return "x won.";
			}
		}
	}
	return "Draw game.";
}

int main()
{
	const std::string input = "35497162193";
	TTT ttt;
	std::cout << ttt.solve(input) << std::endl;
	return 0;
}
```


```C++:Source.h
#ifndef _HEADER_H
#define _HEADER_H

#include <string>
#include <iostream>

#define fild 9

class TTT
{
public:
	TTT();
	const std::string	solve(const std::string& input);
private:
	char m_tttFild[fild+1];
	bool isWin(const char &mark);
	bool putMark(const int &putPlace, const char &mark);
};

#endif
```
NavigationController内でScrollViewを使用すると空白に悩まされる

***
**【問題】**
標題どおり、NavigationControllerで、ScrollViewを使用するとなぞの空白に悩まされました。
***
####**1.プロジェクトを作成して、NavigationBarを設定する**
　通常通り、新規プロジェクトを作成して、NavigationControllerを設定する。
「Main.storyboard」を選択して、メニューの「Editor」＞「Embed In」＞「Navigation Controller」を選択する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/cbcd00d0-8119-2ee1-778b-d74a0d7caf2d.png" width="200"/>
Navigation Controllerが追加されたことを確認する。

###**2.ScrollViewを配置する**
　ScrollViewをView一杯に配置して、実行結果が分かりやすいように、背景色も変えておく。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/26dde8aa-662b-1b87-6428-be43dd75f961.png" width="200"/>

こんな感じ。

AutoLayoutを設定する。
ScrollViewを選択して、Pin制約を設定する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/2b626719-5e6e-5f3d-df09-27892bd93bcc.png" width="100"/>

からの

<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/e2404802-8551-3b86-5791-4c1fa60059e4.png" width="200"/>

「Add 4 Constraints」をクリックして、制約を追加する。
そうすると、制約と表示の不整合がでるので調整する。

「Horizontal Space - Scroll View - View」を選択して、
「Relative to margin」のチェックを外す。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/9380177b-92e5-61ec-67ee-c71e52695534.png" width="200"/>
同様に「Horizontal Space - View - Scroll View」を選択して、「Relative to margin」のチェックを外す。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/ef06d659-e68f-b126-a25d-378a8d046898.png" width="200"/>

これで、不整合が解消されます。

###**3.ScrollViewにアイテム配置する**
ScrollViewの上段に、ImageViewを配置して、分かりやすいように背景色を変更する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/f996fe87-655b-9262-a678-3ce2e4438b7b.png" width="200"/>
こんな感じ、同じようにScrollViewのTop配置されるように、AutoLayoutを設定する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/d2a129c2-0ccd-fd7e-46db-6fc549d000b3.png" width="200"/>

###**4.シミュレータで結果を確認する**
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/c1656000-75a7-957b-3957-0e7914cbd8c2.png" width="200"/>
ここまで長かったですが、これが言いたかったのです。
これを修正するために、無駄な時間を割いてしまいました。。。

###**5.修正方法と結果**
View Controlleの「Adjust Scroll View Insets」のチェックを外す。
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/642b8bb2-140a-24fb-5e9d-bdb3b5625e24.png" width="200"/>
結果、
<img src="https://qiita-image-store.s3.amazonaws.com/0/70430/6865e14b-522c-2749-cd15-8f5b895a636c.png" width="200"/>
先ほどの空白がなくなっています。

***
**【結果】**
修正内容については、まだ調査はしていませんが、これで余計な空白に悩まされることが、なくなりました。
(Markdownの画像は、サイズ指定できないんですね。）
***
**【課題】**
以下の設定が何を意味しているのか分からない。
・Relative to margin
・Adjust Scroll View Insets
***
ポーカー


```C++:Source.cpp
#include "Header.h"

const int&	Poka::checkSamaCard()
{
	int sameCards =0;
	for(int i=0; i<HAND; i++){
		for(int j=0; j<HAND; j++){
			m_numbers.at(i) == m_numbers.at(j) ? sameCards++ : sameCards;
		}
	}
	return sameCards;
}

const std::string Poka::checkRank()
{
	const int sameCards = checkSamaCard();
	if( sameCards == 17 )
		return "4K";
	if( sameCards == 13 )
		return "FH";
	if( sameCards == 11 )
		return "3K";
	if( sameCards == 9 )
		return "2P";
	if( sameCards == 7 )
		return "1P";

	return "--";
}

void Poka::getNumbers(std::string input)
{
	int index = 0;
	for(int i=0; i<HAND; i++){
		index = input.find_first_of("SHDC",index) +1;
		m_numbers.push_back(input.substr(index, 1));
	}
}

const std::string Poka::solve(const std::string& input)
{
	getNumbers(input);
	const std::string& rank = checkRank();
	return rank;
}

int main()
{
	const std::string input = "S8D10H10S10C10";
	Poka poka;
	std::cout << poka.solve(input) << std::endl;
	return 0;
}
```

```C++:Source.h
#ifndef _HEADER_H
#define _HEADER_H

#include <string>
#include <iostream>
#include <vector>

#define HAND 5

class Poka
{
public:
	const std::string			solve(const std::string& input);
private:
	const int&					checkSamaCard();
	const std::string			checkRank();
	void						getNumbers(std::string input);
	std::vector<std::string>	m_numbers;//10は1とする。
};

#endif
```
インストールされてるpackageをgitで管理したい


`~/.atom`をgitで管理してGitHubとかに置いといて、他の環境で使いたい場合にgitで持ってきてそのまま使えるようにしたい。

けど`~/.atom/packages`にあるインストールされてるpackageはリポジトリに含めたくない。だけど、どのpackageがインストールされているかという情報は含めたいし、その情報からpackageを復元したい。

npmだとpackage.jsonのdependenciesに依存パッケージを書いて同じようなことをするけど、apmだとちょっと勝手が違うらしい。

packages fileというテキストファイルを用意して、`--packages-file`オプションでそのテキストを指定する。

```
$ apm install --packages-file packages.txt
```

このpackages.txtは次のコマンドで出力できる。

```
$ apm list --installed --bare > packages.txt
```

なのでこのテキストファイルをリポジトリに含めて、復元すればよい。

ただ、今のところ`packages.txt`の生成は手動でやるしか解決方法が見つけられてなくて、本当はpackageをインストール/アンインストールするときに自動でこのファイルを変更したい。
Vim に惚れるシーン（ID 付きの項目の番号をまとめて加減算する）

# シーン 5

システムの開発時には、画面単位・機能単位に 「プログラム ID」なる番号を付与する場合があると思います。

> プログラムを ID で管理すること自体の是非や、画面系と帳票系を区別なく通しで連番にしてしまっているという ID の振り方のマズさに等ついては触れていません。身近に発生しそうな適当なシーンに置き換えて読み進めてください。

ここでは、下記のように「プログラム ID」を割り当てているとしましょう。

```
# プログラム一覧

## 画面一覧
 - PRG0010 … メニュー画面
 - RPG0020 … 〇〇照会画面
 - PRG0030 … 〇〇登録画面
 - PRG0040 … 〇〇一覧画面
 - PRG0050 … △△照会画面
      :
      :

## 帳票一覧
 - PRG100 … 〇〇帳票
 - PRG110 … △△帳票
      :
      :
 - PRG190 … □□帳票
 - PRG200 … ◎◎帳票
 - PRG210 … ▲▲帳票
      :
```

機能数を適当に見積もって、画面系のプログラムを PRG000 〜 PRG090 の範囲で、帳票系のプログラムを PRG100 〜 の範囲で割り当てようとしていましたが、機能を洗い出していくうちに、画面系が 10 画面では足りなくなってきました。

# どうしたい？

帳票系のIDについては、以下のように 余裕をみて PRG500 〜 の範囲に割り当て直すことにしましょう。

```
## 帳票一覧
 - PRG500 … 〇〇帳票
 - PRG510 … △△帳票
      :
      :
 - PRG590 … □□帳票
 - PRG600 … ◎◎帳票
 - PRG610 … ▲▲帳票
      :
```

# どうする？

Vim には、`Ctrl-A` でカーソル位置の後方にある数値を +1 することができます。
加算したい行を選択して、それぞれの行に対して一度に +400 してやれば良さそうです。

  1. まず、ID を加算したい帳票系の行を `Shift-V` で選択します。
  1. `:normal 400^A` を入力して、Enterキーを押します。

> 上記 2. の `^A` は、`Ctrl-A` を表しています。実際に入力する際には、`Ctrl-V` を入力した後、`Ctrl-A` を入力してください。

## 補足

上記の例では、`Ctrl-A` で加算していますが、`Ctrl-X` で減算もできます。
加減算する数値が `PRG0500` のように 0 で始まる場合には、8進数として評価されてしまいます。このような数値を10進数として評価したい場合には、事前に `:set nrformats-=octal` しておく必要がある点には注意が必要です。

# まとめ

ノーマルモードの `Ctrl-A` や `Ctrl-X` で数値のインクリメント・デクリメントは、単純な機能ですが地味に便利です。マクロと組み合わせても色々できそう。

あと、ノーマルモードのコマンドを、コマンドラインから実行するための `:normal` には、**無限の可能性** が秘められていると思いませんか？
VMにUbuntu入れました

##セットアップ手順

VM構築→OSインストール→インターネット接続確認
nodeをインストールしてhelloworld


```
$ sudo apt-get install emacs24

$ sudo install openssh-server
$ initctl restart ssh 

$ sudo apt-get install git curl build-essential libssl-dev
$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ . ~/.nvm/nvm.sh
$ nvm install  v0.10.19

```

ついでに~/.bashrcに、

```
. ~/.nvm/nvm.sh
nvm use node

```
を追記。


##動作確認

Hello.js作成

```
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('hello world\n');
}).listen(50000);
console.log('Server running at 50000');

```
　
はい。
![6b2a3c7b67c9460d6c0283a32af2984e.png](https://qiita-image-store.s3.amazonaws.com/0/54872/998f1ec1-6987-4aaa-0721-5d0ad8202068.png)

CentOS7でセットアップしてたけどどうしてもHelloWorld出来なかったのでUbuntuにしました。
一瞬で動きました。
CentOSのほうは4日ぐらいかけて頑張ったけど駄目だったよママン・・・

　

sshの設定
http://www.server-world.info/query?os=Ubuntu_14.04&p=ssh

nvmを使ってUbuntu 12.04に最新のNode.jsとnpmをインストール
http://d.hatena.ne.jp/hosikiti/20130925/1380093487

CentOSにnvmとNode.jsをインストールする 
http://kohkimakimoto.hatenablog.com/entry/2012/11/01/144007
Tomcat7でserverステータス(xml)をパースしようとしたらエラーになった件

tomcat6から7にアップデートしたときに、serverステータス取得API

```
http://{host}:{port}/manager/status?XML=true
```
から取得したをxmlパースする処理がエラーになったのでそのメモ。

結論から言うと、connectorの名前が変わっている(bioが付いている)、かつなぜかダブルクォーテーションが入ってます。

名前が変わってるのは許容できるとして、何でダブルクォーテを入れたw

## tomcat6
```xml
<connector name='http-8080'>
    <threadInfo  maxThreads="600" currentThreadCount="10" ... />
    <requestInfo  maxTime="872" processingTime="1783" ... />
    <workers>
        ...
    </workers>
</connector>
```

## tomcat7
```xml
<connector name='"http-bio-8080"'>
    <threadInfo  maxThreads="600" currentThreadCount="10" ... />
    <requestInfo  maxTime="872" processingTime="1783" ... />
    <workers>
        ...
    </workers>
</connector>
```
テーブルのセルをクリックしたときセレクタの選択に依存して遷移先を変える

テーブルのセルをクリックしたときセレクタの選択に依存して遷移先を変えるサンプル。

#サンプルの構成
・Navigation Controller：
・ViewController１：TableView, TableViewCell, ToolBar+Segment Controllを配置※1
・ViewController２："ViewController A"のLabelを配置
・ViewController３："ViewController B"のLabelを配置

・segueA：ViewController１とViewController２との間のセグエのidentifier名※2
・segueB：ViewController１とViewController３との間のセグエのidentifier名※2
・selMode：Segment Controllの変数名

#参考
※1 [Storyboard - UIViewにUITableViewを追加する](http://enamelsystems.com/0012/ "Storyboard - UIViewにUITableViewを追加する")
※2 [条件によって遷移先のシーンを変更する方法](http://www.bhnt.co.jp/blog/ツール/xcode/【xcode5】条件によって遷移先のシーンを変更する方/ "条件によって遷移先のシーンを変更する方法]")

#ソースコード
```SelectorTableViewController.h
#import <UIKit/UIKit.h>

@interface SelectorTableViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UISegmentedControl *selMode;
@end
```

```SelectorTableViewController.m
#import "SelectorTableViewController.h"

@interface SelectorTableViewController ()
@end

@implementation SelectorTableViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"testIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    
    // Configure the cell...
    cell.textLabel.text = @"Test";
    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"didSelectRowAtIndexPath");
    NSLog(@"SegmentedControle =%d", _selMode.selectedSegmentIndex);
    NSString *segueName;
    if (_selMode.selectedSegmentIndex == 0 ) {
        segueName = @"segueA";
    } else {
        segueName = @"segueB";
    }
    [self performSegueWithIdentifier:segueName sender:self];
}

#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
    NSLog(@"prepareForSegue");
}
```

#ストーリーボード

![スクリーンショット 2015-02-25 23.04.33.png](https://qiita-image-store.s3.amazonaws.com/0/68991/456fdef1-2b97-9060-a90f-1e0a37fda296.png)
「Apache Zeppelin」のインストール方法まとめ


次世代データ分析基盤としてApache Sparkが非常に注目されていますが、データ分析の重要な要素としてデータの可視化（Visualization）が挙げられます。
PythonやRではその辺のツールも充実しています。（Matplotlib, ggplot etc...)
さらに、インタラクティブ環境下でコード実行したり、グラフを描画することが可能な[iPython Notebook](http://ipython.org/notebook.html)やRStudioなどは分析者にとって非常に便利です。

Apache SparkをiPython Notebookのような環境で動作させるソフトウェアとして、現在Databricksが「[Databricks Cloud](https://databricks.com/product/databricks-cloud)」を開発しています。

しかし、現在一部のユーザにしか公開されていないため、誰でも気軽に使える環境にはなっていません。そこで、Databricks Cloudと同じような環境を提供してくれる「[Apache Zeppelin(Incubator)](http://zeppelin-project.org/)」のインストール方法を紹介します。

公式サイトにもある通り、ZeppelinはNotebookという単位でインタラクティブシェルのようなものを用意しており、SparkSQLを使って構造化されたデータを用意することや、SparkStreamingを使ってtwitterからデータを取得しつつ、実行結果をグラフなどで表示することができるようになっています。
また、100％オープンソースでもあるので、気軽に利用することが可能です。

## 環境

* Mac OSX 10.9.5 Mervericks
* JDK 1.7.0_76
* Maven 3.2.5
* Node.js (npm) 0.10.33

## インストール

まず、ローカルにリポジトリをクローンします。

``` shell
git clone https://github.com/apache/incubator-zeppelin.git
cd zeppelin
```

次に、Mavenを使ってビルドします。
この際、sparkのver.を指定することができます。
（defaultが古いので新しいver.を指定しましょう。）

``` shell
mvn clean package -Pspark-1.2 -DskipTests
```

ビルドが終了すれば、もう実行することができます。

``` shell
./bin/zeppelin-daemon.sh start
```

[localhost:8080](http://127.0.0.1:8080)にアクセスするとトップページが見れます。

![top.png](https://qiita-image-store.s3.amazonaws.com/0/30866/1ac526e9-4f55-6969-1aca-23fe7d61fec0.png "スクリーンショット 2015-02-25 23.31.26.png")

サーバーを停止する際は次のコマンドを入力します。

``` shell
./bin/zeppelin-daemon.sh stop
```


## Tutorial
起動するとNotebookを選択することが可能になります。
選択項目を見ると最初から「Zeppelin Tutorial」のNotebookが用意されています。
これを見るとSparkSQLとVisualizationでどんなことができるか把握することができます。
また、公式ページ内にはSparkStreammingを使ってtwitterから取得したデータに対して簡単な言語処理をやっています。


## 便利と感じた機能
### Display
HTMLや画像、簡単なテーブルなどを標準出力経由で表示することができます。

```
println("%html <p style=\"font-size:200%; color:red\">Important!!</p>")
```

![display.png](https://qiita-image-store.s3.amazonaws.com/0/30866/eca0f050-9e9f-455a-4800-759b248b48da.png "スクリーンショット 2015-02-25 23.40.18.png")

### Dynamic forms
templateのようにコードの中に次のような変数を埋め込むことができます。

``` scala
// Hello world
println("Hello, " + z.input("name", "world"))
```

``` sql
-- maxAgeよりageの高いuserを取得する
%sql SELECT * FROM users WHERE age > ${maxAge=30}
```

このように埋め込んだ変数は描画された結果の横にフォームが設置され、コードを変更せずに値だけを変更することができます。
また、値を変更すればその結果がすぐにグラフなどに反映されます。

![zeppelin.png](https://qiita-image-store.s3.amazonaws.com/0/30866/7d6d9941-5d85-1ae0-db7c-e04666020300.png "スクリーンショット 2015-02-25 23.41.53.png")


### Collaboration
同じURLに対して複数の人間が操作することが可能になります。
内部でWebSocketが動いており、更新があれば今見ているページが非同期に更新される。
また、実行結果だけをURLとして切り出すことが可能になっており、他人などに共有することもできます。
paperclipとS3を連携して会員限定のダウンロード機能を作る


## 前提
* 会員限定のダウンロード機能を作りたい。
* S3は非公開設定になっている。（つまり下記のようにS3にリダイレクトさせるような形は、ダウンロードリンクを共有されるで採用しない）

`redirect_to @department.annual_report.url` 

## 課題
paperclipを使いPDFをS3にアップした際に、アップしたPDFのダウンロードができなかった。

```
[Date]  INFO -- : Completed 500 Internal Server Error in 33ms
[Date] FATAL -- :
ActionController::MissingFile (Cannot read file /path/sample.pdf):
  app/controllers/departments_controller.rb:xx:in `annual_report'
```

コードはこんな感じだった。

```rb
def download
  unless user_signed_in?
    redirect_to @department
  else
    send_file @department.annual_report.path, type: @department.annual_report.content_type
  end
end
```

## 解決方法
[Restricting Access to Objects Stored on Amazon S3](https://github.com/thoughtbot/paperclip/wiki/Restricting-Access-to-Objects-Stored-on-Amazon-S3)
上記リンクに書いてるように `expiring_url` を指定することで、`:s3_permissions => :private` と指定されたS3に対して、指定時間内限定でアクセスできる一時的なURLを発行することができる。

```rb
def download
  redirect_to @department.annual_report.expiring_url(1.minute)
end
```
上記コードのようにとても手軽に実装できる。
上の例だと1分間だけ認証が解除された固有のURLが生成される。
ただリダイレクトさせてしまうとアクセス先がS3になってしまい、且つアクセス可能時間を過ぎたら下記のようなエラー画面が出るので、サービスの選択肢としてはない。

![S3_log.png](https://qiita-image-store.s3.amazonaws.com/0/3251/ff5b2ae2-4f43-c110-ecd0-8420a0fc5c16.png "S3_log.png")

### send_dataと組み合わせる
よって上記URLをsend_dataで返すようにした。
これにより、ダウンロードボタンをクリックする度に指定時間の間アクセス可能なURLが発行され、そのURLに存在するファイルをバイナリで読み込み、クライアントに返すということができるようになった。

```rb
def download
  unless user_signed_in?
    redirect_to @department
  else
    download_url = @department.annual_report.expiring_url(1.minute)
    file_name    = @department.annual_report_file_name
    content_type = @department.annual_report.content_type

    open(download_url, 'rb') do |data|
      send_data data.read, filename: file_name, type: content_type
    end
  end
end
```

1. ログイン判定。
2. `expiring_url(1.minute)` で1分間だけアクセス可能なURLを生成。(file_nameはダウンロード時のファイル名)
3. open-uriでURLをバイナリで読み込み、send_dataでクライアントに返す。

## 参考
* [Restricting Access to Objects Stored on Amazon S3 -github/paperclip-](https://github.com/thoughtbot/paperclip/wiki/Restricting-Access-to-Objects-Stored-on-Amazon-S3)
* [Using send_file to download a file from Amazon S3? -stackoverflow-](http://stackoverflow.com/questions/12277971/using-send-file-to-download-a-file-from-amazon-s3)
cocos2d-xやるのにgit-new-workdirを覚えた for Mac


## はじめに

仕事でUnityとCocos2d-xのiOS/Androidの
ブリッジファイルを作成する出番がきそうなので、アップを始めました。

Cocos2d-x v3.4を落としてきて、動かしたらiOSシミュレータでエラーエラー。
v3.2環境で動かす分にはエラーでないし、なにこれ。

このエラー内容は置いとくとして、環境のいったりきたりがしんどいので、
下記方法で対応することにした。

[git-new-workdir が便利](http://subtech.g.hatena.ne.jp/secondlife/20121207/1354854068)


## git-new-workdirを導入する

僕の家のMBAだと、 **git-core** の **contrib** が存在しなかったので
だいたい、こんなことをすればok

```
$ mkdir -p /usr/local/share/git-core/contrib/workdir
$ cd /usr/local/share/git-core/contrib/workdir
$ wget https://raw.githubusercontent.com/git/git/master/contrib/workdir/git-new-workdir
$ chmod +x git-new-workdir
$ ln -s /usr/local/share/git-core/contrib/workdir/git-new-workdir ~/.bin/
```

### wgetがなかた

```
$ brew install wget
```

### パスを通してなかた

`~/.bin`にパスを通していない場合はパスを通すか、`/usr/local/bin`とかにつけなおすかなど


## git-new-workdirを使う

Cocos2d-xのセットアップこみこみで、こんな感じ

```
$ git clone https://github.com/cocos2d/cocos2d-x.git
$ git-new-workdir . ~/cocos2d-x/3.4 cocos2d-x-3.4
$ cd ~/cocos2d-x/3.4
$ python download-deps.py
$ git submodule update --init
$ ./setup.py
$ source ~/.zprofile
```
jinja2のincludeとmacroをやってみた。

jinja2でネストしていく部分を試したので覚書。

でも``{{% block %}}``の使いどころが理解できない（感覚と逆というか）ので、``include``と``macro``をやってみた。

Angularjsのdirectiveでtemplate使う感じ。




本体から``include``で``content.html``を呼んでいる。

```html:index.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	test
	{% include "./templates/content.html" %}
</body>
</html>

```

``from``でマクロを呼んでいる。

```html:content.html

{%from "./templates/macro.html" import card with context%}

{{card("wowow","#522222")}}

{{card("rerere","#ffcc00")}}


```


呼ばれるマクロがこれ。

```html:macro.html

{% macro card(text,color) %}
<div style="width:100px;height:200px;background-color:{{color}};">
	{{ text }}
</div>
{% endmacro %}

```

メインの.pyで``return template('index.html')``で表示されるのだが、ネストしてる部分のパスがファイル名だけだと通らない（``TEMPLATE_PATH.append("./templates")``してるところに置いてあるのに読まれない）ので、パス指定してあげている。ちゃんとenv設定みたいなのが必要なのかもしれない。
Ruby Business Users Conference リンク集 #ruby #ruby_biz_conf

## :gem:<i class="fa fa-building" style="font-size:1em;"></i><i class="fa fa-users" style="font-size:1em;"></i> 概要
<i class="fa fa-external-link" style="font-size:1em;"></i> [Ruby Business Users Conference](http://rubybusiness-conf.org/) のリンク集です。
現地には行けなかったのですが、ツイートを見ていて詳細の情報が気になりました。

見つかった範囲でリンクをまとめます。
もし、他のリンク先をご存知の方は編集リクエストをいただけると嬉しいです。

## <i class="fa fa-building" style="font-size:1em;"></i> 公式サイト
http://rubybusiness-conf.org/

## <i class="fa fa-building" style="font-size:1em;"></i> Twitter Hash Tag
`#ruby_biz_conf`

※ただし、ハッシュタグの使用率が低いのかこのタグだけみていても情報を収集しきれない

## <i class="fa fa-building" style="font-size:1em;"></i> 発表スライド
* <i class="fa fa-external-link" style="font-size:1em;"></i> [株式会社 永和システムマネジメント 伊藤 浩一 様 | Agile software development meets Ruby 10 years after](http://www.slideshare.net/koic/agile-software-development-meets-ruby-10-years-after)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [LT枠 Yohei YASUKAWA 様 | Railsガイドを支える技術](https://speakerdeck.com/yasulab/railsgaidowozhi-eruji-shu)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [LT枠 吉政創成 様 | インテグレーターから見たRuby市場の今後](https://www.transnet.ne.jp/jodw522qe-21/#_21)
    * ※要会員登録＋ログイン

## <i class="fa fa-building-o" style="font-size:1em;"></i> 参加情報（今後資料が公開されるかも？）
* [pixiv engineering blog](http://inside.pixiv.net/entry/2015/01/28/105456)
* [Crowd Works ENGINEERING BLOG](http://engineer.crowdworks.jp/)
* [EY-Office ブログ](http://www.ey-office.com/blog_archive/)
* [株式会社ウィルド](http://wyrd.co.jp/)
Pythonスクリプトをサービスで起動させる


ほぼ、[Getting a Python script to run in the background (as a service) on boot](http://blog.scphillips.com/2013/07/getting-a-python-script-to-run-in-the-background-as-a-service-on-boot/)のまま。

# pythonスクリプトの作成
たとえば、ここでは/usr/bin/local/test/test.pyをサービスで起動したと仮定する。

# Deamon Spcriptの作成
## ひな形
下記のスクリプトをmyservice.shとして/usr/local/bin/testに作成する。

```myservice.sh
#!/bin/sh

### BEGIN INIT INFO
# Provides:          myservice
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Put a short description of the service here
# Description:       Put a long description of the service here
### END INIT INFO

# Change the next 3 lines to suit where you install your script and what you want to call it
DIR=/usr/local/bin/myservice
DAEMON=$DIR/myservice.py
DAEMON_NAME=myservice

# Add any command line options for your daemon here
DAEMON_OPTS=""

# This next line determines what user the script runs as.
# Root generally not recommended but necessary if you are using the Raspberry Pi GPIO from Python.
DAEMON_USER=root

# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/$DAEMON_NAME.pid

. /lib/lsb/init-functions

do_start () {
    log_daemon_msg "Starting system $DAEMON_NAME daemon"
    start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON -- $DAEMON_OPTS
    log_end_msg $?
}
do_stop () {
    log_daemon_msg "Stopping system $DAEMON_NAME daemon"
    start-stop-daemon --stop --pidfile $PIDFILE --retry 10
    log_end_msg $?
}

case "$1" in

    start|stop)
        do_${1}
        ;;

    restart|reload|force-reload)
        do_stop
        do_start
        ;;

    status)
        status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
        ;;
    *)
        echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
        exit 1
        ;;

esac
exit 0
```


## スクリプトの編集
pythonスクリプトの保存場所に合わせて、下記の内容を編集。

```
DIR=/usr/local/bin/myservice
DAEMON=$DIR/myservice.py
DAEMON_NAME=myservice
```

たとえば、/usr/local/bin/test/test.pyをデーモン化させる場合は、次のように編集すればいい。

```
DIR=/usr/local/bin/test
DAEMON=$DIR/test.py
DAEMON_NAME=test
```

## /etc/init.dへコピー
パーミッションなどを変更後、/etc/init.dへコピーする

```
cd /usr/local/bin/test
sudo chown root.root myservice.sh
sudo chmod 755 myservice.sh
sudo cp myservice.sh /etc/init.d/
```

# Pythonスクリプトのパーミッション変更
pythonスクリプトも合わせてパーミッションを変更しておく

```
cd /usr/local/bin/test
sudo chmod 755 test.py
```

# Serviceへの登録
## デーモンスクリプトの動作確認
以下のコマンドで、動作確認しておく

```
sudo /etc/init.d/myservice.sh start
sudo /etc/init.d/myservice.sh status
sudo /etc/init.d/myservice.sh stop
```

## サービスへの登録
以下のコマンドでサービスへ登録する

```
sudo update-rc.d myservice.sh defaults
```

サービスに登録できているかどうかは、下記のコマンドで確認できる

```
ls -l /etc/rc?.d/*myservice.sh
```
[baserCMS]現在のURL判定に isCurrentUrl($url) を使うと少しだけラクになる


現在アクセスしているURLを見て表示切替え。。。よくあるケースです。
そんなときの判定の仕方。

## 発生状況

1. テーマ側（Layoutとか）で、今アクセスしているURLを見て、表示切替えしたいなぁ
2. よし！getHere()の出番だ！
3. わぁ！判定2つ要る。。。


### 環境

- baserCMS 3.0.6.1
- PHP 5.4.19


## URL判定サンプル

```php
<?php $currentUrl = $this->BcBaser->getHere() ?>
<?php if ($currentUrl == '/nowurl/' || $currentUrl == '/nowurl/index'): ?>
/nowurl/ または /nowurl/index にアクセスしているときに表示する
<?php else: ?>
/nowurl/ または /nowurl/index 以外にアクセスしているときに表示する
<?php endif ?>
```

他にも、現在のURLを取得したいときに使えるもの。

```php
// 現在アクセスしているURLが文字列で返って来る
$this->request->here

$this->BcBaser->url()

Router::url()
```

というように、URLの末尾が「/」で終わるものは、「/index」の場合においても判定しておく必要があります。

## 対処策 isCurrentUrl($url)
そんなときに使える判定方法のサンプルは以下。

```php
<?php if ($this->BcBaser->getHere() == $this->BcBaser->isCurrentUrl('/nowurl/')): ?>
/nowurl/ にアクセスしているときに表示する
<?php else: ?>
/nowurl/ 以外にアクセスしているときに表示する
<?php endif ?>
```

これで「/index」の場合を判定する必要がなくなります。
BcBaser::isCurrentUrl($url) では、スラッシュのみの場合と、スラッシュ＋index の場合は、同一のURLとして判定します。
Groovy のスクリプトを Windows で動かした場合、引数に含まれる半角スペースは省略される

```groovy:test.groovy
println args
```

```bash:CentOSで実行
$ groovy test.groovy "aaa bbb    ccc"
[aaa bbb    ccc]
```

```text:Windows7で実行
> groovy test.groovy "aaa bbb    ccc"
[aaa bbb ccc]
```

どうも、 `startGroovy.bat` の中で引数をごにょごにょしている間にスペースがなくなっている模様。

```bat:startGroovy.bat（154～168行目）
set _ARG=
:win9xME_args_loop
rem split args by spaces into first and rest
for /f "tokens=1,*" %%i in (%_ARGS%) do call :get_arg "%%i" "%%j"
goto process_arg

:get_arg
rem remove quotes around first arg
for %%i in (%1) do set _ARG=%_ARG% %%~i
rem set the remaining args
set _ARGS=%2
rem remove the leading space we'll add the first time
if "x%_ARG:~0,1%" == "x " set _ARG=%_ARG:~1%
rem return
goto :EOF
```

`for %%i in (%1) do set _ARG=%_ARG% %%~i` ここで `%_ARG%` に引数が詰め替えられており、間に存在した半角スペースが１つに省略されている模様。

何故この処理が必要なのかは、正直良くわからない。
JenkinsからAndroid Emulatorを起動する

#はじめに
通常、AndroidでTestを実行するにはAndoird用のJVM(Dalvik、ART)で実行する必要があるため、実機またはEmulator上でTestを実行する必要があります。
したがって、JenkinsでAndroidのTestを実行するにはTest実行前に実機を接続しておくか、Emulatorを起動しておかなければなりません。
この記事では、JenkinsからAndroidのEmulatorを起動する方法を紹介します。

※Android SDKのインストールがすでに済んでいる事を前提とします
※[robolectric](http://robolectric.org/)を使って開発マシンのJVMでTestを実行する方法もあります

#Jenkins Pluginのインストール
[Android Emulator Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Android+Emulator+Plugin)を使用してJenkinsからEmulatorを起動します。
「Jenkinsの管理」-> 「プラグインの管理」からAndroid Emulator Pluginをインストールしておきます。

#ジョブの設定
まずはじめにAndroidのTestを起動するジョブを作成します。
Android Emulator Pluginのインストールが成功していれば、ジョブの設定画面のビルド環境のカテゴリに「Run an Android emulator during build」という項目ができているはずです。
この項目にチェックを入れて、下記画像のように起動するEmulatorの設定を入力していきます。
Andorid OS versionは起動したいAndroidのVersionを入力して下さい。（Android SDKで対応しているversionがインストールサれていないと失敗するので気をつけて下さい）
Emulator optionsの項目など入力し忘れると起動しない場合があるので間違えないように入力して下さい。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/36352/b5aed42b-65b2-0507-c75b-d516374de921.png)

#ジョブの起動
以上の設定でビルドの処理が実行される前にJenkinsからEmulatorが起動するようになります。
Android Studioでプロジェクトを作成しているならconnectedCheckのタスクを実行すればTestが実行されはずです。
CentOS 6.5系にAnsible入れたかった

多分これが最速。

```sh:install_ansible.sh
sudo yum install gcc python-devel python-crypto -y
curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python
sudo pip install ansible
```

経緯としては、PCを入れ替えた際に改めてこの辺のインストール作業をしたので、どうせだから残しておこうかなと。

Vagrant使っていて、普段から仮想マシンの構成管理はAnsibleを利用しているのだけど、WindowsにAnsible入れたくなくて、Ansible動かす専用の仮想マシンをVagrantで立ててるのでした。
jacksonで正体不明のJSONを読み込む

jacksonで正体不明のJSONを読み込むメモ。

json.orgのライブラリやjsonicあたりだとゆるく読み出せたりもするJSON。

jacksonだと標準では意外とゆるくない。
そこで同様のことを取り回しやすいスタイルのままjacksonで実装してみる。

まずは解析結果を受け取るオブジェクトは次のように。
今回のような状況がきちんと想定されていてアノテーションが用意されている。

(import文などは省略)

```java:UnknownObject.java
public class UnknownObject {
    @JsonIgnore
    private Map<String, Object> anyProperties = new HashMap<>();

    @JsonAnyGetter
    public Map<String, Object> getAnyProperties() {
        return this.anyProperties;
    }

    @JsonAnySetter
    public void setAnyProperties(String name, Object value) {
        this.anyProperties.put(name, value);
    }
}
```
要素を個別に追加したり読み出すメソッドを実装してもよいかもしれない。

実際の解析は次のようにする。
sourceは何かしらJSON形式でパースできるデータ。
読み出した要素数に関係なくListに格納することで後々の扱いを一本化するケースとなる。

```java
ObjectMapper mapper = new ObjectMapper();
List<UnknownObject> jsonlist = new ArrayList<>();
JsonNode node = mapper.readTree(source);
if (node.isArray()) {
    jsonlist.addAll(Arrays.asList(mapper.readValue(node.traverse(), UnknownObject[].class)));
} else {
    jsonlist.add(mapper.readValue(node.traverse(), UnknownObject.class));
}
```
配列で格納されているかもしれないため先に判定している。意外と忘れがち。
配列か単体かが事前にわかっていればもちろん不要な判定。

ObjectMapperは実際にはインスタンスを使い回すことになるはず。
そうしないとせっかくのjacksonのパフォーマンスを無駄にしてしまう。

この正体不明のデータを受け取る技法はArangoDBのJavaドライバあたりでも使われている。

jacksonはyaml、csvなど他のフォーマットとの相互変換もやりやすいので最近はこればかり使っている。protobufへも対応中らしく楽しみ。
Scala: Listで前後の値を参照した処理の記述

Scalaで`List(1, 2, 3, 4, 5)`というリストがあったときに、`(1, 2), (2, 3), (3, 4), (4, 5)`と前後２つペアにして、`List(3, 5, 7, 9)`のような足し算の処理になるような式の書き方。

varとかforとかを使えばできるけどスマートじゃないし負けた気がするので、考えたら`Iterable#zip`を使った方法を思いついた、`Seq`でも同じはず。

```scala
val list = List(1, 2, 3, 4, 5)

(list.init zip list.tail).map{ case (a, b) => a + b }
```

もっと楽な方法があれば教えて下さい。