OmniAICreator/Qiita-1.07M huggingface dataset:
clojureでmapのキーの表記法を変換してくれるライブラリ

clojureは関数名や変数名は基本的に小文字で書いて単語はハイフンでつなげることが多いかと思いますが、データベースから引っ張ってきたmapがスネークケースだったりするので、mapのkeyの記法の変換が必要になることもあるかと思います。　　
そういう時に便利なライブラリ  
https://github.com/qerub/camel-snake-kebab

# 使い方

```clj
(use 'camel-snake-kebab)
(->kebab-case :object_id)
; => :object-id
```

リファレンスにも記載されてますが、mapのキーを変換はちょっとした関数を作ることで簡単になります。

```clj
(use 'camel-snake-kebab)
(defn map-keys [f m]
  (letfn [(mapper [[k v]] [(f k) (if (map? v) (map-keys f v) v)])]
    (into {} (map mapper m))))
(map-keys ->kebab-case {:firstName "John", :lastNam "Smith"})
; => {:first-name "John", :last-name "Smith"}
```

記事の本筋とは関係ないけど、ライブラリのソースはdefnを使わずに"->kebab-case"といった関数をnamespaceに作ってます。
その辺のやり方も時間があったら調べておこう。
eclipseにEmmetをインストールするときのメモ

「Help」メニューから「Install New Software…」を選択

「Work with:」の箇所に以下のアドレスを入力

```
http://emmet.io/eclipse/updates/
```

「Add...」ボタンを押すと、ダイアログが出てくるので

「Name」に「Emmet」と入力し、「OK」ボタンを押す

Emmetのチェックボックスにチェックし「Next>」ボタンを押す

また「Next>」ボタンを押す

「I accept the terms of the license agreement」にチェックし、ライセンスに同意したら
「Finish」ボタンを押してインストール完了
今更ながらPythonでgit-catを組んでみる

Python思ってたよりすげー

# git-catとは
git-catというのは、gitのオブジェクト(.git/objects/以下にあるアレ)を人様向けにある程度分かりやすく表示してくれるgitのコマンドの一つであるcat-fileを単体のプログラムにしたもの
PHPでGitビューワー組むときに使えるかなと思って最近気になってたPythonで組んでみることにした。
# gitオブジェクトの概要
## ファイルツリー
gitバージョン管理システムという性質上、少し特殊な構造になっています。詳しいところは別のもっと詳しい方々に譲るとして、git-catを作るのに必要なのは次に挙げるいくつかです。

* .git/refs/heads/ブランチ名
* .git/objects/[0-9a-f]{2}/[0-9a-f]{38}

上のファイルを開くと40桁の16進数が載っていると思います。これはそのブランチの最新コミットハッシュです。(ハッシュを利用しているのは衝突の可能性が極めて低いからですね。)
下は、40桁のハッシュで構成されたファイルが大量に並ぶのは不格好だと考えたのか最初の二桁+残り38桁に分解し、最初の二桁をディレクトリ名としてある程度整理が付くようになっています。(それでも汚いと思うのは自分だけではないはず)
## まずは読んでみる
そのまま適当にファイルを開いてもよくわからない文字の羅列しか出てきません。なぜかといえば、それらは全てzlibによって圧縮された文字列だからです。
なのでまずは解凍しましょう。

```python
#!/usr/bin/python
import zlib
import sys

if __name__ = "__main__":
    fname = sys.argv[1]
    fd = open(fname, "rb");
    line = fd.read()
    print zlib.decompress(line)
```

これを適当な場所に保存し、zlibがPythonで使える状態になってるのを確認した上で`./git-cat xxx/.git/objects/00/112233445566778899aabbccddeeff00112233`とかを試してみると、意味の有る文字列になって表示されたと思います。
## やっぱ詳しく知りたい
色々なファイルを試す内に`必ず冒頭にtreeやcommitなどの識別子(?)と数字があり、¥0が挟まれた後にそれぞれの内容が入る`ということが分かると思います。
これの解説か何か無いかなーと思って調べてみるとhttp://linquize.blogspot.hk/2011/10/supplemental-information-for-git.html というページをラッキーなことに発見することが出来ました。
後はひたすら文字列処理をして行くだけなのでコードは割愛しますが、思っていたよりは簡単でした。この調子で作っていけばgitのpython/PHPラッパーも比較的簡単に作ることが出来るのではないでしょうか。
cやc++をビルドしたいので ./configureスクリプトの作り方調べた

c、c++ でちょっとしたコマンドラインツール作ろうと思ったが、全くやったことがなかったのでビルドツールの調査からするはめとなった。

## cやc++をビルドするには

cやc++のプログラムは、必要なファイル(ソース、ヘッダ、リンクするライブラリ)をコンパイル時にすべて指定してあげる必要がある。
これを、gcc等にコマンドライン引数として全て手打ちするのは大変だし、さらに、時にはgccを何度か実行して、できたものをリンクする必要があるので、必要な操作をファイルに書いておいて自動化したいのが人情。
makeは、皆のその気持ちに応えるためのツールで、必要な操作や依存ファイル、成果物のパスなどをまとめてMakefileというファイルに記述する仕組みになっている。

Makefileさえあれば、`make` って打ち込むとビルドすることができる。
Makefileさえあれば……。
ただし、Makefileに記述してある依存ライブラリのパスなどは、環境によって異なるため、環境によって正しいMakefileが変わってしまう。

そこで、環境ごとに正しいMakefileを生成してあげるスクリプトが、`./configure` 。
これはただのシェルスクリプトなのだが、環境ごとに必要なファイルのチェックをする等の機能の充実した シェルスクリプトを手で作成するのはめっちゃむずいので、自動で生成する。

## ビルドツール色々

#### autoconf

autoconfは、GNUのプロジェクト。 configureスクリプトを自動で生成するツール。

`configure.ac` という設定ファイルを作成し、`autoconf` を実行することで、 `configure` が生成される。
という理解だったが、実際にはいくつか準備が必要だった。

* `Makefile` を生成するためには、テンプレートの `Makefile.in` が必要。
* `Makefile.in` は、必要な値が変数になったMakefileのような感じで、手で書きたくないっす。となる。
* `Makefile.am` は、 `Makefile.in` を自動生成するための、ものすごく単純な誰でも手で書けるファイル。実際に編集するのはこれ。作成したら、 `automake` と実行すると、 `Makefile.in` が生成される。これと `configure` スクリプトを配布してあげると、皆が `./configure && make` ってできる。
* その他、
    * 設定をまとめた config.h を生成するための config.h.in等々、Makefile意外の成果物を作る仕組みある。

今回は僕はこれを使いました。
日本語情報を色々参考にさせていただきました。
http://d.hatena.ne.jp/fut_nis/20090624/1245849007


#### cmake

http://www.cmake.org/

おそらくautoconfより後発のツールだと思われる。
Makefileのことはまったく考えなくても、CamkeLists.txt という独自形式のファイルに、必要なソース等いくつかの設定をしておいて、`cmake` って実行するだけでビルドが実行できる。
また、windowsなどにも対応しておるようだ。

cmakeには、依存ライブラリを管理する *パッケージ* という仕組みがあるが、自分で無名のツールのパッケージを作成したり、利用するやり方が正直よくわからなかったので、今回は使いませんでした。

#### scons

http://www.scons.org/
cmakeと競合するツールのようだがあまり調べてない。

#### waf

ビルド設定をpythonスクリプトとして記述できるビルドツール。
Linux/Unix、windowsに加えMacOSのxcodeプロジェクトも生成できるようだ。
Linuxならpythonは絶対入ってるだろ! という前提があるのでけっこう良いのかもしれない。

#### gyp

https://code.google.com/p/gyp/
Google製で、node.jsプロジェクトがwafからこれに乗り換えたというのを読んで知った。
設定ファイルがJSON(厳密にはJSON拡張)なので自分にはわかりやすかった。
node.jsのネイティブアドオンを書くなら必ずこれを使うことになる。

僕は今回は、クロスプラットフォームな機能はあまり必要なかったし、オーバースペックに思えたので使わなかった。
Swiftで乱数を発生させる

#arc4random
やり方はObjective-Cと変わらず、arc4random関数を使って乱数を発生させられます。
今回はとりあえず1〜100の間で乱数を発生させます。
###コード

```

for var i = 0; i <= 4; i++ {
            var n = arc4random() % 100 + 1;
            
            NSLog("\(i) : \(n)")
        }

```

###結果
2014-07-13 22:40:56.669 TestSource[910:15388] 0 : 99
2014-07-13 22:40:56.670 TestSource[910:15388] 1 : 53
2014-07-13 22:40:56.670 TestSource[910:15388] 2 : 14
2014-07-13 22:40:56.671 TestSource[910:15388] 3 : 52
2014-07-13 22:40:56.671 TestSource[910:15388] 4 : 87
iOS で撮影した動画の変換


## 基本編
iOSで撮影した動画をいろいろいじる機会があったので、メモ。
まず、Mac OS Xで動画を変換するにはffmpegが王道なのでインストール。

```shell
brew install ffmpeg --with-libvpx --with-libvorbis
```

※libvpxとlibvorbisをつけないと、webmの変換ができない。

動画の変換はffmpegが拡張子をみて判断してくれるので、mov→mp4 の変換は

```shell
ffmpeg -i foo.mov bar.mp4
```

で完了する（そして、かなりファイルサイズが小さくなるw)

## 縦向きで撮影した動画

iOSで縦向きで撮影した動画をそのまま変換すると、QuickTime / Safariでは縦向きで再生されるが、Chromeでは90度反時計回りになった動画が再生される。

```shell
ffmpeg -i bar.mp4
```
の出力結果に

```shell
rotate: 90
```

とあるが、rotateして表示するかどうかはクライアントによる実装に任せてあるとのこと。

* [iPhone で縦向きに撮影した動画が Chrome や FFmpeg だと横向きになってしまう原因と対策](http://shiba-yan.hatenablog.jp/entry/20140708/1404775800)

そこで、

```shell
ffmpeg -vf "transpose=1" -i foo.mov bar.mp4
```

とすれば、Chromeで縦向きで再生されるが、今度はQuickTime/Safariで90度回転された動画が表示される。
transpose=1 + rotate=90 の結果のようだ。
というわけで、transpose=1 + rotate=0にしてあげると、すべてのブラウザで同じように表示されるはず。

```shell
ffmpeg -i foo.mov -vf "transpose=1" -metadata:s:v:0 rotate=0 bar.mp4
```

面倒ですね。
nginxにvalue-sslで発行したサーバ証明書と秘密鍵を設定する

手こずったのでメモします。

##利用したサービス ValueSSLのRapidSSL
http://valuessl.net/products/rapidsslre.php

##サーバー証明書の準備
証明書として`hoge.pam`を作ります

````/etc/nginx/ssl/hoge.pam
-----BEGIN CERTIFICATE-----

   ... fuga fuga .... サーバー証明書

-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----

   ... fuga fuga .... 中間証明書

-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----

   ... fuga fuga ...　クロスルート証明書

-----END CERTIFICATE-----
````

サービス申込時に作成を依頼したサーバー証明書はメールで送られてきます。
（注文詳細ページにあるcsrでは秘密鍵とマッチせず、サーバを起動させることが出来ませんでした。）
中間証明書とクロスルート証明書は、自分が申し込んだサービスの証明書を下記urlからコピーします。
http://ssl-process.com/support/intermediate.php

##秘密鍵の準備
秘密鍵`hoge.key`を作成します。

````/etc/nginx/ssl/hoge.key
-----BEGIN RSA PRIVATE KEY-----

   ... fuga fuga ... 秘密鍵

-----END RSA PRIVATE KEY-----
````
秘密鍵はサービス申し込みの確認ページからコピーします。

##confge fileの設定

````/etc/nginx/conf.d/hoge.conf
 server { 
   error_log ~/nginx_error.log; 
   listen 80; 
+  listen 443 ssl; 
   server_name hoge.jp; 

+  ssl_certificate /etc/nginx/ssl/hoge.pam; 
+  ssl_certificate_key /etc/nginx/ssl/hoge.key; 
 
+  ssl_session_timeout  5m; 
 
+  ssl_protocols  SSLv2 SSLv3 TLSv1; 
+  ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; 
+  ssl_prefer_server_ciphers   on; 
 
   root /var/www/hoge/current; 

   location / {
+    proxy_set_header X-Forwarded-Proto $scheme;
     proxy_set_header Host $http_host;
     proxy_pass http://hoge.jp;
   }
 }
````
上記設定で動作しました。
config fileは書いている内容の半分くらいしか理解できていません。
もっと良い書き方があったら教えてください。

##対応したエラー

```
nginx: [emerg] SSL_CTX_use_certificate_chain_file("/etc/nginx/ssl/hoge.pem") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line error:140DC009:SSL routines:SSL_CTX_use_certificate_chain_file:PEM lib)
nginx: configuration file /etc/nginx/nginx.conf test failed
```

```
nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/nginx/ssl/hoge.key") failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
nginx: configuration file /etc/nginx/nginx.conf test failed
```

自分の場合、webページから取得したcsrを使っていたので、メールで送られサーバ証明書を使ったら上記のエラーは出なくなりました。

以上です。
誰かの参考になれば幸いです。
間違いなどがありましたらご指摘ください。

##参考
http://d.hatena.ne.jp/ria10/20130612/1371037762
http://www.plustar.jp/lab/blog/?p=7330
http://blog.toor.jp/2011/05/cacert_to_nginx/
http://d.hatena.ne.jp/Kmusiclife/20120319/1332086260
[PHP] Travis CI で runkit を使う

Travis CI で runkit を使うことができました。ざっくりとした手順は下記のようになります。

- GitHub から runkit を clone する。
- それをコンパイルする。
- runkit が利用できるように php.ini に設定を追加する。

`.travis.yml` の `before_script` の部分に下記のコマンドを記述します。

```.travis.yml
before_script:
  - git clone --depth=1 git://github.com/zenovich/runkit.git
  - cd runkit
  - phpize
  - ./configure
  - make
  - make install
  - cd ../
  - phpenv config-add travis.php.ini
```

また、下記の内容を記述した `travis.php.ini` を用意します。


```travis.php.ini
extension=runkit.so
runkit.internal_override=1
```

Travis CI で runkit を使うための(恐らく)最小の構成を Github に置きました。
https://github.com/suzuki86/sample-of-using-runkit-on-travisci

そのリポジトリに対する Travis CI でのビルドです。
https://travis-ci.org/suzuki86/sample-of-using-runkit-on-travisci

下記を参考にしました。ありがとうございます。
https://github.com/phpmyadmin/phpmyadmin/blob/0077614e96161a116fec0f403408ef788e90a1e6/.travis.yml
Node.js+Coffeescript+MochaをTravis.ci上で動かす

(chaiとsinonも使ってます)

#概要
Node.js+Coffeescriptで書いている際に、
Mochaを使ってテストをする方法が
ちょっと調べないとわからない感じだったのでまとめました。

#Node.jsでテストする

## 必要なものをpackege.jsonに書く
package.jsonのscript部分にテストするためのコマンドを、
devDependencies部分にテストだけで使うライブラリを書いていきます。
なお、テスト設定等はCakefileに書きます

```json
{
  "scripts": {
    "test": "cake test"
  },
  "dependencies": {
    "coffee-script": ">= 1.1.0"
  },
  "devDependencies": {
    "chai": "~1.0.3",
    "mocha": "~1.1.0",
    "sinon": "~1.10.2"
  }
}

```


## Cakefileの設定
以下のように書きます。
テストの出力方法を変えたい場合は、
REPORTER部分を後述するmochaの設定を参考にして適当に変えてください。

```coffeescript
{exec} = require "child_process"

REPORTER = "spec"

task "test", "run tests", ->
  exec "NODE_ENV=test
    ./node_modules/.bin/mocha
    --compilers coffee:coffee-script/register
    --reporter #{REPORTER}
    --require coffee-script
    --require test/test_helper.coffee
    --colors
  ", (err, output) ->
    throw err if err
    console.log output

```
[出典](http://www.danneu.com/posts/14-setting-up-mocha-testing-with-coffeescript-node-js-and-a-cakefile/)

なお、リンク元では古い書き方
`--compilers coffee:coffee-script`だったため、
`--compilers coffee:coffee-script/register`に変更してます。



## テスト時に共通で読み込むファイル作成
chaiとsinonを両方requireする必要がありますが、
毎回書くのは大変なので、Cakefileで
`--require test/test_helper.coffee`と指定し、
このファイルにrequireを書きます。

```coffeescript
global.assert = require("chai").assert
global.sinon = require('sinon')
```


## テストを書く
testフォルダにファイルを置いてテストを書いていきます

```coffeescript
User = require('../src/scripts/user.coffee').User

describe "test", ->
  name = undefined
  beforeEach (done) ->
    name = "testuser"
    done()

  it 'set date', (done)->
    name = new User name
    assert.equal user.name, name
    done()
```

## テストする
`npm test` 
でテストできます 


# Travis.ciでテストする

## テスト用設定ファイルの作成
Travis.ciの設定の為に、ルートフォルダに.travis.ymlを作ります。 
node用の設定は以下のようになります。

```yml
language: node_js
node_js:
  - "0.10"
```
[Travis CI: Building a Node.js project](http://docs.travis-ci.com/user/languages/javascript-with-nodejs/)

これで、Travis.ciが指定したバージョンで 
`npm test`を利用してテストをしてくれます。
   
また、node_jsの下にテストしたいバージョンを列挙すると、 
その全てでテストをしてくれます。

便利(｀・∀・´≡｀・∀・´)
Windowsに環境変数JAVA_HOMEを設定するときのメモ

コントロールパネル
->システム
->右のシステムの詳細設定メニュー
->システムのプロパティウィンドウが立ち上がる
->詳細設定タブ
->環境変数ボタン

システムの環境変数に新規で追加
JAVA_HOME
C:\Program Files\Java\jdk1.8.0_05
JSFの複合コンポーネント(Composite Component)作成

# 複合コンポーネントとは？

複合コンポーネント(Composite Component)は、複数のコンポーネント(ラベルやテキストなど)を1つのコンポーネントとして再定義することができる仕組みです。

# 確認環境
* Windows 8
* JDK 1.8.0_05
* NetBeans 8.0
* GlassFish 4.0.1 b6

# 準備

Mavenで作成したプロジェクトを前提とします。

![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/47737/355a7c07-ba93-845d-33f7-651de479b160.jpeg)

Webページ配下にresourcesフォルダを追加し、複合コンポーネントを格納するフォルダ(ここではmycomp)を作成します。
![1.5.JPG](https://qiita-image-store.s3.amazonaws.com/0/47737/e9400452-a5b3-bcce-2176-25eb347008d1.jpeg)

# 複合コンポーネントを定義

サンプルとしてラベルとテキストを１つの部品とした複合コンポーネントを作成します。

```xml:labelText.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:composite="http://java.sun.com/jsf/composite">

    <!-- コンポーネントの属性で外から指定できるようにするものを定義する -->
    <composite:interface>
        <composite:attribute name="label" shortDescription="ラベルの表示名" 
             default="ラベル表示名が設定されてない！" />
        <composite:attribute name="value" shortDescription="テキストの値" />
    </composite:interface>
    
    <!-- 複合コンポーネントに含むコンポーネントを定義する -->
    <composite:implementation>
        <h:outputLabel id="lbl" for="txt" value="#{cc.attrs.label}" />
        <h:inputText id="txt" value="#{cc.attrs.value}" />
    </composite:implementation>
</html>
```

以下のように配置します。

![2.JPG](https://qiita-image-store.s3.amazonaws.com/0/47737/9284fde7-edc3-3437-3f81-d399e7607696.jpeg)

# 複合コンポーネントの利用

```xml:index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:my="http://xmlns.jcp.org/jsf/composite/mycomp">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form prependId="true">
            <my:labelText label="ラベル" value="ほげほげ" />
        </h:form>
    </h:body>
</html>
```

# 実行結果

![5.JPG](https://qiita-image-store.s3.amazonaws.com/0/47737/17b39194-f782-8d32-f1ec-f6aa253cf4b6.jpeg)

定義でdefaultを指定しているので、例えばlabel属性を明示的に指定しなかった場合には

![4.JPG](https://qiita-image-store.s3.amazonaws.com/0/47737/45a61eda-cb03-7e7c-9902-e0476a775c48.jpeg)

のように表示されます。
HTML5のcanvas内に複数の画像を任意の順序で表示する

## 概説
HTML5のcanvas内に1枚の画像を表示するのは簡単です。
複数の画像を表示するのも結構簡単なのですが、これを任意の順序で表示しようとするとちょっと工夫が必要でした。

#### まずは1枚の画像を表示してみます。
```js:JavaScript
<body>
<canvas id="canvas" width="600" height="400"></canvas>
<script>
(function() {
    var canvas = document.getElementById('canvas');
    var context = canvas.getContext('2d');

    var image = new Image();
    image.src = '1.png';
    image.addEventListener('load', function() {
        context.drawImage(image, 0, 0, 150, 100);
    }, false);
})();
</script>
</body>
```

#### 問題なく表示されます。
![1枚のみ](https://qiita-image-store.s3.amazonaws.com/0/23093/9c9951c0-416d-e962-ea5c-a21774a5eb63.png)

#### 次に同じ要領で、4枚の画像を左上から順にちょっとずつずらして重なるように表示してみたいと思います。
```js:JavaScript
<body>
<canvas id="canvas" width="600" height="400"></canvas>
<script>
(function() {
    var canvas = document.getElementById('canvas');
    var context = canvas.getContext('2d');

    var image1 = new Image();
    image1.src = '1.png';
    image1.addEventListener('load', function() {
        context.drawImage(image1, 0, 0, 150, 100);
    }, false);

    var image2 = new Image();
    image2.src = '2.png';
    image2.addEventListener('load', function() {
        context.drawImage(image2, 50, 70, 150, 100);
    }, false);

    var image3 = new Image();
    image3.src = '3.png';
    image3.addEventListener('load', function() {
        context.drawImage(image3, 100, 140, 150, 100);
    }, false);

    var image4 = new Image();
    image4.src = '4.png';
    image4.addEventListener('load', function() {
        context.drawImage(image4, 150, 210, 150, 100);
    }, false);
})();
</script>
</body>
```
#### 単純に同じ処理を連続で書くと、画像のサイズによって読み込み順が保証されないため、うまくいかないパターンが発生します。どうやら、2枚目、4枚目よりも1枚目と3枚目が後に読み込まれたため、このような表示になっているようです。
![4枚でうまくいってないパターン](https://qiita-image-store.s3.amazonaws.com/0/23093/684f1502-2668-721f-cf18-c8a706760675.png)

#### 画像サイズによって読み込み順が変わることがあるということが分かったので、今度は4枚の画像の読み込みが終わった時点で、表示を行うようしてみます。

```js:JavaScript
<body>
<canvas id="canvas" width="600" height="400"></canvas>
<script>
(function() {
    var canvas = document.getElementById('canvas');
    var context = canvas.getContext('2d');

    var srcs = [
        '1.png',
        '2.png',
        '3.png',
        '4.png',
    ];
    var images = [];
    for (var i in srcs) {
        images[i] = new Image();
        images[i].src = srcs[i];
    }

    var loadedCount = 1;
    for (var i in images) {
        images[i].addEventListener('load', function() {
            if (loadedCount == images.length) {
                var x = 0;
                var y = 0;
                for (var j in images) {
                    context.drawImage(images[j], x, y, 150, 100);
                    x += 50;
                    y += 70;
                }
            }
            loadedCount++;
        }, false);
    }
})();
</script>
</body>
```

#### 期待する表示になりました。

![4枚でうまくいったパターン](https://qiita-image-store.s3.amazonaws.com/0/23093/0755c559-aab0-c8b5-4c9f-f9134add0ae3.png)
ksnctf q11 Riddle

http://ksnctf.sweetduet.info/problem/11
なぞなぞプログラム。
## やったこと（ネタバレ）
何も考えずにIDAに突っ込んでGetWindowTextあたりで判定関数を探す。
見つかったものの結構複雑な処理をしていたので、Visual Studioにアタッチさせて挙動を見てみることに。
いろいろ入力を試した結果、判定関数は前処理で入力された文字列を変換した後に指定の文字列と一致しているか確認しているようだった。変換関数が結構複雑で解析に時間がかかりそうだったので指定の文字列のメモリダンプを見ながら1文字ずつ入力を変えていって一致する文字列を調べた。
Android Wearのホーム画面というかWatchFaceを追加するアプリの作り方

# はじめに
AndroidWearのホーム画面の呼び名（WatchFaceでいいんですよね？）が検索ワードでもうまくヒットしなくて苦戦しました。

## 参考
こちらのgithubで公開されてるSampleソースを参考にしました。

[github - PaulTR/AndroidDemoProjects](https://github.com/PaulTR/AndroidDemoProjects/tree/master/WearCustomWatchFace)

`Custom Watch Face`で必死にググってたらたどり着きました。。。。

# やりたかったこと
Wearは電池少ないとかもあって、すぐ画面が消灯モード？になるので表示時の画像とか背景をランダムにしたかった。（結局、チラチラ見て電池なくなる。。。）

プリインストールの`Photos`が、それっぽいことやってるから技術的にできないはずがないということで・・・調べてました。

## 実装してみた結果

静止画だと全然伝わりませんが、とりあえず`drawable`においてある10ファイルの`png`をランダムに`onResume()`時に表示するようにして実現しました。

![p1.png](https://qiita-image-store.s3.amazonaws.com/0/40887/2f917213-1c50-0e59-69c5-c716330701b1.png)

![p2.png](https://qiita-image-store.s3.amazonaws.com/0/40887/31b7fd06-c9bf-58d7-dc05-0b36f6e3e147.png)

無理矢理実装した感じがすごい・・・

# Wear側のAndroidManifest.xmlの設定

mobile側で実装して何か飛ばす感じかと思ってたのですが、普通にWear側にActivityを実装すればいいっぽいです。

## パーミッションの設定

2つパーミッションが必要みたいです。

後者は知ってるけど、前者は新しいやつ？かなAndroid久しぶりなので、ちょっと自信ないです・・・たぶん新しいやつかと。

```xml:AndroidManifest.xml
<uses-permission android:name="com.google.android.permission.PROVIDE_BACKGROUND" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
```

## intent-filterの設定

WatchFaceにしたいActivityのintetn-filterに以下を指定します。

これは初めてみた気がします。

```xml:AndroidManifest.xml
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="com.google.android.clockwork.home.category.HOME_BACKGROUND" />
</intent-filter>
```

あとは普通のActivityみたいにlayout.xmlに色々ImageViewとか配置してやるだけです。

思った以上に簡単でした。
何か補足等ありましたらお手やわらかに・・・
iOSでAcknowledgementsを簡単につくる

Acknowledgements, オープンソースのライブラリを使ったときには載せるべきものです。
が、いちいち何のライブラリを使っているか調べ、ライセンス条文を取ってきて書き下していくのは面倒ですね。

そこで、CocoaPodsにはacknowledgementsを自動で作る機能があります！

![スクリーンショット 2014-07-13 20.41.01.png](https://qiita-image-store.s3.amazonaws.com/0/19168/3979b39f-f372-5cf0-5a63-46b23759f6fc.png)

こんな感じのacknowledgementsを自動で作ってくれます。

`Pods / Pods-acknowledgements.markdown` にありますので、適当に整形してアプリのWebViewで出すとかすれば良いと思います。
または、「設定」以下に出すとか。
vagrant-vsphereでvCenter+ESXi環境をコントロール

投稿者はvCenterとESXi5.5の知識に乏しいので、そのせいなのかも知れませんが、vagrant-vpshereでvCenter+ESXi5.x環境をコントロールしようとしたら結構ハマったので参考にしてみてください。5.0、5.5環境それぞれで試しましたが同じ設定で動作しました。


vagrant-vsphereのインストール
`vagrant plugin install vagrant-vsphere`

Dummy Boxの用意
Vagrant-vsphereではダミー用のboxを使う為、ダミー用のboxイメージを用意します
`cd ~/.vagrant.d/gems/gems/vagrant-vsphere-0.8.2/example_box`
`tar czvf dummy.box metadata.json`

boxイメージは任意の場所に置きます
`mv dummy.box ~/vsphere-test/host01/`

vagrantfileを用意
vagrantfileとvspehre側の設定の関連は画像参考にしてください
vsphere.passwordについて<sub>[1](#1)</sub>

```ruby:vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = 'dummy'
  config.vm.box_url = './dummy.box'
  config.ssh.private_key_path = '/home/kinunori/.ssh/id_rsa_vagrant'
  config.ssh.username = 'kinunori'

  config.vm.provider :vsphere do |vsphere, override|
    override.vm.network 'private_network', ip: '192.168.0.101'
    # 作成したVMに設定するIPアドレス
    vsphere.customization_spec_name = 'template-spec'
    # VMクローニング時に使用するカスタマイズスペック名
    config.ssh.host = '192.168.0.101'
    # vagrant up実行時にアクセスするssh接続先
  end

  config.vm.provider :vsphere do |vsphere|
    vsphere.host = '172.30.200.31'
    vsphere.name = 'deptest-01'
    # 作成するVMの名前
    vsphere.clone_from_vm = true
    # クローニングを使用するかどうか
    vsphere.template_name = 'dep-template'
    # クローン元のVM名
    vsphere.data_center_name = 'Lab01'
    # vCenterのデータセンター名
    vsphere.compute_resource_name = '172.30.200.112'
    # VMを作成する先のホストマシン名
    vsphere.user = 'host-admin'
    # VM作成可能な権限を持つvCenterのユーザ名
    vsphere.password = 'P@ssw0rd'
    # 上記ユーザのパスワード
    vsphere.insecure = true
    # 証明書のWarningを無視
  end

end
```

vSphereの設定
まずはvagrantfileとの関連を確認
![vc1_fix.png](https://qiita-image-store.s3.amazonaws.com/0/46756/879ee1e1-991e-d35d-0b08-846137aa686e.png)

クローニング対象のVMとカスタマイズスペックを作る
1. クローニング対象のVMを選択して右クリック
2. クローン作成を選ぶ
3. 必要な内容を入力してウィザードを進めていく
4. ゲストのマスタマイズのところで"カスタマイズウィザードを使用してカスタマイズする"を選ぶ
5. カスタマイズの内容を入力(IPはvagrant up時に変更されるので仮でOK)
6. 仕様の保存で名前を入力(ここがvsphere.customization_spec_nameで指定するカスタマイズスペックの名前になる)
7. 完了まで進めて終わり

あとは、vagrantfileとdummy.boxを置いたディレクトリに移動してvagrant upを実行
`vagrant up --provider=vsphere`

<a name="1">1.</a> vsphere.passwordをvagrantfileに記述するのはセキュリティ上好ましくないので以下のように毎回指定したほうが良いです
`VSPHERE_PASSWORD=P@ssw0rd vagrant up --provider=vsphere`
RuboCop | Style/MethodName

# RuboCop | Style/MethodName

## 概要

RuboCopの「Style/MethodName」警告について。

メソッド名をチェックします。
デフォルトはsanake caseを正とします。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-----|:---|:---|:---:|
|EnforcedStyle|snake_case|sanake caseではない場合は警告する|○|
|EnforcedStyle|camelCase|camel caseではない場合は警告する|--|

## MethodName

各設定値での検証結果をまとめます。

### 検証プログラム

method_name.rb

~~~ruby
def snake_case
  puts 'snake'
end

def camelCase
  puts 'camel'
end
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

~~~yaml
MethodName:
  EnforcedStyle: snake_case
~~~

~~~bash
$rubocop method_name.rb
Inspecting 1 file
C

Offenses:

method_name.rb:5:5: C: Use snake_case for methods.
def camelCase
    ^^^^^^^^^

1 file inspected, 1 offense detected
~~~

### 実行結果 camelCase に設定します

.rubocop.yml

~~~yaml
MethodName:
  EnforcedStyle: camelCase
~~~

~~~bash
$rubocop method_name.rb
Inspecting 1 file
C

Offenses:

method_name.rb:1:5: C: Use camelCase for methods.
def snake_case
    ^^^^^^^^^^

1 file inspected, 1 offense detected
~~~

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
CoreData の不要なモデルバージョンを削除する方法

CoreDataのモデルバージョンは普通には削除できない。

Xcode内で削除することはどうやら不可能らしく、ちょっと変わった手順を踏む必要がある。
具体的には下記のような手順を踏む。


1. プロジェクト内で使用するモデルバージョンを削除しないものに指定する。
2. コアデータモデルファイルをプロジェクトから削除する。
**注：参照のみを削除すること**

3. プロジェクトフォルダ内にあるモデルファイルを「パッケージの内容を表示」で開く。
4. 不必要なバージョンのモデルファイルを削除する。
5. 最後に、モデルファイルをプロジェクトに追加し直す。



[参考](http://stackoverflow.com/questions/7708392/how-to-delete-an-old-unused-data-model-version-in-xcode-4)
Fedora rawhideを日本仕様にした (120.8 MB)

@MiCHiLUさんの作成した michilu/fedora-zero を日本仕様にした。

* 121.9 MB (michilu/fedora-zero は 120.8 MB)
* LANG=ja_JP.UTF-8
* timezone: Asia/Tokyo

# /usr/lib/locale/locale-archive を縮める方法

言語情報は/usr/lib/locale/locale-archiveに詰まっている。
100MBくらいあるが、使う言語以外を削除すると1.1MBになる。

```bash:glibc-をインストール
yum reinstall -y glibc-common
```

```bash:不要な言語を削除
localedef --delete-from-archive $(locale -a | grep -v ja_JP.utf8)
localedef --list-archive
build-locale-archive /usr/lib/locale/locale-archive
ls -lh /usr/lib/locale/locale-archive
```

# 日本仕様作成手順

```bash:上で小さくしたlocale-archiveを転送する
docker cp <コンテナID>:/usr/lib/locale/locale-archive .
docker run -it -v `pwd`:/root -w /root michilu/fedora-zero /bin/bash

ln -s /usr/share/zoneinfo/Japan /etc/localtime

cp locale-archive /usr/lib/locale/
echo "export LANG=ja_JP.UTF-8" > /.bashrc
```
Windows8.1でRaspberry Pi用のSDカードにOSのイメージを焼く

Raspberry Pi用のOSイメージをSDカードにコピーするメモ。

## 用意するもの

・SDカード(4GB以上のものが良いらしい)
・SDカードが読み書きできる環境

## ダウンロード

・イメージコピーソフト

イメージを焼くソフトは「DD for Windows」を使う。
以下からダウンロード。

DD for Windows
http://www.si-linux.co.jp/techinfo/index.php?DDforWindows

インストール型でないので、zipを展開したらそのまま使える。


・Raspberry Pi用OSイメージ

以下からお好きなものを。

Raspberry Pi OSイメージ
http://www.raspberrypi.org/downloads/

今回はRaspbianを使用する。

![Win81_000206.png](https://qiita-image-store.s3.amazonaws.com/0/45890/e9789183-bd3b-167e-4ebf-ffa7a6217c5f.png)

## DDでOSイメージを焼く

DDWin.exe を管理者権限で実行する。
管理者権限で実行しないとディスクが見えない。

管理者でないとこうなる。
![Win81_000197.png](https://qiita-image-store.s3.amazonaws.com/0/45890/b8348afe-54c8-1e52-ce53-3e960900b90a.png)

ディスクは慎重に選ぶこと。
特にSDカードを複数刺してたりすると違うディスクに焼いてしまったりする（経験者は語る）。

![Win81_000235_1.png](https://qiita-image-store.s3.amazonaws.com/0/45890/14586367-2da9-c34d-3ee0-caa0b0f54270.png)

![Win81_000236_1.png](https://qiita-image-store.s3.amazonaws.com/0/45890/44f16bf4-44e9-e047-9c45-3f07ad534622.png)

![Win81_000237_1.png](https://qiita-image-store.s3.amazonaws.com/0/45890/513eac2b-1e40-38e0-dc71-49d0cba53552.png)

OSファイルの選択。
拡張子がddiでないので、All files に変更してから選択。

![Win81_000237_2.png](https://qiita-image-store.s3.amazonaws.com/0/45890/8e95c766-5c5f-5e8d-598e-6c92e2a7c906.png)

![Win81_000235_2.png](https://qiita-image-store.s3.amazonaws.com/0/45890/f1699623-c259-9c8d-44d5-2082f2bc1773.png)

![Win81_000236_2.png](https://qiita-image-store.s3.amazonaws.com/0/45890/7ebaaa45-2ac8-31b4-26f2-292e337744d8.png)

![Win81_000238_1.png](https://qiita-image-store.s3.amazonaws.com/0/45890/eb47fc04-b42a-a913-aca3-aee85ad381ab.png)

「<< 書込 <<」ボタンをクリック。

![Win81_000238_2.png](https://qiita-image-store.s3.amazonaws.com/0/45890/bb3432a6-9eed-482c-89c6-df8c33cd4ca7.png)

途中警告がいっぱい出るので、それぞれ内容を確認して「はい」で進む。

![Win81_000241.PNG](https://qiita-image-store.s3.amazonaws.com/0/45890/9dd756d6-de30-c3ff-a396-f88fb3e33103.png)

![Win81_000242.PNG](https://qiita-image-store.s3.amazonaws.com/0/45890/73dcb763-d451-48db-19a1-9eb861c5eed6.png)

![Win81_000243.PNG](https://qiita-image-store.s3.amazonaws.com/0/45890/acd0ead0-99ee-b2cd-b313-59f4cc1f16c7.png)

![Win81_000244_1.png](https://qiita-image-store.s3.amazonaws.com/0/45890/6ac6fb4e-b5a9-5ae4-2b19-3924c319b80b.png)

書込み完了、と出たら完了。

![Win81_000245_1.png](https://qiita-image-store.s3.amazonaws.com/0/45890/808f10d3-2add-bf0c-aa42-c62653017e7b.png)
Node経由でJuliusを操作する


オープンソースの音声認識エンジン[Julius](http://julius.sourceforge.jp/) を使って node 上でディクテーションしたい。
ディクテーションとは口述書き取りのこと。

ようするに自動書記的なことをやりたいというわけです。
精度的にも [Web Speech API](https://www.google.com/intl/ja/chrome/demos/speech.html) を使うのがよいのですが、ネットワークが使えない場合などはローカルでどうにかするしかない。

ちなみに音声認識だったら、凹みさんの [node-julius](https://github.com/hecomi/node-julius) が簡単便利。

しかし今回は、音声を文章化するのが目的なので、ディクテーションキットを落としてくる
http://julius.sourceforge.jp/index.php?q=dictation-kit.html

Mac環境なので [Mac OS X版 DNN版Juliusディクテーション実行キット v4.3.1](http://sourceforge.jp/projects/julius/downloads/60416/dictation-kit-v4.3.1-osx.tgz/) をDLする。
解凍後、dictation-kit-v4.3.1-osx ディレクトリに移動し、サーバー（モジュール）モードで起動

```sh
./bin/julius -C main.jconf -C am-gmm.jconf -module 10500
```

だだだっとログが出力され、最後に下記がでたら起動成功

	Stat: server-client: socket ready as server
	///////////////////////////////
	///  Module mode ready
	///  waiting client at 10500
	///////////////////////////////


telnet localhost 10500 でも接続できる。
これを node の net モジュールで接続するには下記のようにする。

```js:server.js
var net = require('net');

var client = net.createConnection(10500, 'localhost', function()
{
    console.log('connected.');
});

client.on('data', function(data)
{
    console.log(data.toString());
    client.end();
});

client.on('end', function()
{
    console.log('disconnected.');
});

```

Julius とは別プロセスで　node を起動。

```sh
node server.js
```

マイクにむかって発話すると候補を出力してくれる。
精度は...うーん...

	<RECOGOUT>
	  <SHYPO RANK="1" SCORE="-2287.151367">
    		<WHYPO WORD="" CLASSID="
" PHONE="silB" CM="0.407"/>
    		<WHYPO WORD="中嶋" CLASSID="中嶋+名詞" PHONE="n a k a j i m a" CM="0.036"/>
    		<WHYPO WORD="。" CLASSID="
" PHONE="silE" CM="1.000"/>
  		</SHYPO>
	</RECOGOUT>
_アキラっていったつもり_

結果はXMLで出力されるので、パースしてよしなに使う。
phonegap導入 -iOS編-

phonegapを使用する理由ができちゃったので、導入の仕方書いておきます
phonegapの名前がかわったってcordovaとなったのでそれを使用していきます。

注意：実験しながらいれたので、余分なところが多いかも。

環境
・Mac OSX 10.9
・iOSアプリをXcodeで開発できる状態

対応
・cordovaバージョン 3.5.0-0.2.6

#1:node.jsインストール
node.jsをインストラーで、普通にインストール
ターミナルにて"node -v"でバージョンがかえってこればよい
参考：http://nodejs.org/

#2:phonegap周りをインストール
ターミナルにて

```bash:script.sh
#!/bin/sh
sudo npm install -g phonegap #たぶん、いらない
sudo npm install -g ios-deploy #たぶん、いらない
sudo npm install -g ios-sim #たぶん、いらない
sudo npm install -g cordova
```
#3:ターミナルにcordova系のパスを通す
.bash_profileに下記を追記

```bash:script.sh
PATH=$PATH:/usr/local/lib/node_modules/cordova/bin 
export PATH
```
設定後、ターミナルを再起動

#4:プロジェクト作成
下記コマンドを実行する。作成場所はカレントディレクトリです。

```bash:script.sh
cordova create "ディレクト名" "Bundle Identifier" "プロジェクト名"
```

例：cordova create hello com.example.hello HelloWorld

#5:作成したプロジェクトのプラットフォームを設定

```bash:script.sh
cd "ディレクト名" #
cordova platform add ios #iOSの場合
```

#6:プロジェクト実行
作成したディレクトリのplatforms/iosの中にプロジェクトファイルがあるので、実行してみてください。
DockerfileのTips


Dockerfileを書いていて詰まったところなど。

## WORKDIR は ADD には効かない

[公式ドキュメント](http://docs.docker.com/reference/builder/#workdir)にちゃんと書いてあるが、`WORKDIR `が効くのは`RUN` `CMD` `ENTRYPOINT`のみ。
下記のように書いても`/var/app`には配置されません。

```bash:Dockerfile
WORKDIR /var/app
ADD Gemfile.local ./
```

## WORKDIR のバグ

下記のように記載しても、`WORKDIR`のディレクティブで環境変数が効かない。

```bash:Dockerfile
ENV APP_PATH /var/app

WORKDIR ${APP_PATH}
RUN bundle install
```

これは[バグ](https://github.com/dotcloud/docker/issues/2637)のようで、修正されるまでは直接書くしか無さそう。

```bash:Dockerfile
WORKDIR /var/app
RUN bundle install
```

## EXPOSE のバグ

下記のように記載しても、`EXPOSE `のディレクティブで環境変数が効かない。
これもバグっぽい。

```bash:Dockerfile
ENV PORT 80
EXPOSE ${PORT}
```

## 実行順序について

Dockerfileにかかれている内容は一行毎にコンテナに入り実行されているみたいなので、下記のような書き方だと上手く実行されない。

```bash:Dockerfile
RUN /etc/init.d/mysqld start
RUN mysqladmin -u root password "password"
RUN /etc/init.d/mysqld stop
```

これは１行目でmysqlを実行したあとに状態を保存し、再度立ち上げたコンテナ上で２行目が実行されているから。（たぶん）

なので、以下のようにまとめて書けばOK。（見難いので改行しています）

```bash:Dockerfile
RUN /etc/init.d/mysqld start && \
    mysqladmin -u root password "password" && \
    /etc/init.d/mysqld stop
```

## RUN の上限

dockerのv0.7.2以降における、AUFXの積み上げ可能なRUNの上限は **127** みたいです。
参考：[stackoverflow](http://stackoverflow.com/questions/21467638/number-of-commands-in-dockerfile/21468956#21468956)

なので、`&&`とかで節約するのはいいことです。
Rでベイズ推定を行う環境の構築


先日の[BUGS/stan勉強会 #3](http://atnd.org/events/52769)に参加（聴講のみ）したのでそのリポート、というわけではなく環境の整備をしたという記事。...形から入りたい性格だから（小声）。詳しいことはまた勉強する or ブログ記事を読む。

（致死させない程度の） **マサカリ歓迎**

主催の@TeitoNakagawa さんからのメッセージ。

<blockquote class="twitter-tweet" lang="en"><p>なお、参加される方へ、本日は初心者セッション等はございませんので過去資料や関連するblog記事等に目を通しておくこと、RStanのインストールをお勧めします。 <a href="https://twitter.com/hashtag/TokyoBUGS?src=hash">#TokyoBUGS</a></p>&mdash; Teito Nakagawa (@TeitoNakagawa) <a href="https://twitter.com/TeitoNakagawa/statuses/487750325093167104">July 12, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

過去の勉強会

* [BUGS/stan勉強会 #1](http://atnd.org/events/43260)
* [BUGS/Stan勉強会 #2](http://atnd.org/events/44361/)

入門セッションは過去のものを参考に。

## BUGS/Stanとは... おまけにJAGS

> BUGS/Stanとは何ぞやということを説明しておくとベイズ推定による柔軟なモデリングを実現するためのDSL言語 [第1回BUGS/Stan勉強会を開催しました - Analyze IT.](http://d.hatena.ne.jp/EulerDijkstra/20130930/1380547174)

とのこと。

**MCMC**（マルコフ連鎖モンテカルロ法: Markov chain Monte Carlo methods） を用いたベイズ推定という枠組み、は共通しているけど、[BUGS](http://www.mrc-bsu.cam.ac.uk/software/bugs/), [Stan](http://mc-stan.org/), [JAGS](http://mcmc-jags.sourceforge.net)はそれぞれ別物。用途に応じて使い分けるのが良さげ↓（参考）。

<iframe src="//www.slideshare.net/slideshow/embed_code/26159695?startSlide=22" width="512" height="421" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/berobero11/bugs-26159695" title="BUGSを使うメリット" target="_blank">BUGSを使うメリット</a> </strong> from <strong><a href="http://www.slideshare.net/berobero11" target="_blank">berobero11</a></strong> </div>

### 間違っているかもしれないまとめ

**BUGS** をマルチプラットフォームで使えるように改良してあるのが **JAGS** で姉妹のようなもの。 **Stan**は、BUGSを参考にしつつも処理の方法が前２つとは異なっていて、高速。ちなみにBUGSとJAGSは略称で、Stanの由来はStanislaw Ulamにちなんでいるとか。

（きっとほかにもある）

## BUGS (WinBUGS)

http://www.mrc-bsu.cam.ac.uk/software/bugs/

BUGSというのはBayesian inference Using Gibbs Samplingの略で、その名の通りギブズサンプラーによるベイズ推定を行う

Macにインストールする方法（[Mac OS X上で、WinBUGS+R2WinBUGSを使用する](http://www001.upp.so-net.ne.jp/ito-hi/stat/winbugs.html)など）もあるけど面倒なのでやめた。

## JAGS (rjags)

http://mcmc-jags.sourceforge.net

JAGSはJust Another Gibbs Samplerの略。ギブス抽出法を用いたベイズ階層モデルを実装できる。`rjags`パッケージはR上でJAGSを実行するインターフェイス。

### 手順

* `JAGS`: [sourceforge](http://sourceforge.net/projects/mcmc-jags/files/) -> JAGS 3.3.0
* `rjags`: 20140712現在、最新のバージョン（3.13）はmavericksに対応していない。[Mavericksでのrjags：Taglibro de H：So-netブログ](http://ito-hi.blog.so-net.ne.jp/2014-06-28)にあるとおり、Snow Leopard用のバイナリ版をインストール

## Stan (rstan)

http://mc-stan.org/index.html

真打ちというか導入が一番楽だった。C++で処理を行うため高速化されているというのが特徴。開発が盛んでマニュアルや実例もまとめてあるので大変良い印象。

### インターフェイス

* `CmdStan` -> コマンドラインからStanを操作
* `RStan` -> R上でStanプログラムを実行する
    * こちらを使う
* `PyStan` -> PythonでStan
* 開発中... -> MATLAB, **Julia**!!, Stata

### 手順

https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started

ここに書いてある手順に従えば良い。MacではR、RStudio、Xcodeを適宜用意する必要がある。自分の環境ではRcppパッケージの再インストールが必要だった。

## まとめ

[BUGS/stan勉強会 #3](http://atnd.org/events/52769)でもStanを使った発表が多かったし、速さは正義なのでRStanで勉強進めていく。
supermin (febootstrap後継)

* [febootstrap](https://github.com/libguestfs/febootstrap)
* [supermin](http://people.redhat.com/~rjones/supermin/)

CentOS7で実施

```bash:
# yum install -y supermin
# supermin -V
supermin 4.1.4
```

バージョンが古いので[Index of /download/supermin](http://libguestfs.org/download/supermin/)からダウンロードしてくる。


あとは@MiCHiLUさんの[supermin - fedoraのDockerイメージを作成する - Qiita](http://qiita.com/MiCHiLU/items/762275df727b60c3ff41)を参考。
OS Xからboot2dockerのコンテナに一発でnsenterするalias

# `dsh`

`alias dsh='boot2docker ssh -t ". /home/docker/.profile; sudo docker-enter"'`



# 条件

`docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter`

boot2dockerに`docker-enter`コマンドを追加しておくこと。
Debian jessieでホストに`nsenter`と`docker-enter`を作ってくれる
[jpetazzo/nsenter](https://github.com/jpetazzo/nsenter)というありがたいコンテナがあるので使わせてもらいましょう。

## 一応解説

`ssh -t`でpseudo-ttyオプションがつき、インタラクティブにコマンド実行ができます。
あくまでpseudoなので、dockerユーザーのプロファイルを読み込むために
`. /home/docker/.profile`を手前につけています。

# こんなかんじで

```
❯ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
32a9db8f33e4        centos:latest       bash                59 minutes ago      Up 59 minutes                           pensive_mayer

❯ dsh 32
root@32a9db8f33e4:/#
```

```
❯ alias dps='docker ps'
❯ alias dp='dps -lq'

❯ dsh `dp`
root@32a9db8f33e4:/#

```
パスワードを忘れたときの操作（Tumblr編）

パスワードを忘れたときの操作について、Tumblrではどのような動きをするのかについてメモします。

* 言葉が少なく、アイコンかわいい、シンプルで好き
* それでも、パスワード再発行メール送信完了画面で、わざわざ迷惑メールになってないか確認してください、と出るあたりは、ユーザー対応大変ですよねと感じる。

# Tumblrにてパスワードを忘れたときの操作

## ログイン画面にて

パスワードを忘れたユーザーのために、パスワード入力フォームの右側に「？」というアイコンがある

![Tumblrのログイン画面](https://qiita-image-store.s3.amazonaws.com/0/43593/e072cd21-9db7-d218-f7f3-f873a8758675.png)

## メールアドレス入力画面

「？」をクリックすると、メールアドレスを入力する画面になるので入力して「パスワードをリセット」をクリック。

![メールアドレス入力画面](https://qiita-image-store.s3.amazonaws.com/0/43593/9ec263b1-7d11-9d64-6b07-e357211528ee.png)

メールアドレス入力完了画面が表示される。

![メールアドレス入力完了画面](https://qiita-image-store.s3.amazonaws.com/0/43593/2c92c094-6ce0-3a1e-eb39-48203b1a7e68.png)

## 送信されてきたメールの内容

とてもシンプル。何時間以内に・・など書いていない。リンクをクリックする。
件名：Tumblr Password

![送信されてきたメールの内容](https://qiita-image-store.s3.amazonaws.com/0/43593/d2c021e7-18e3-bbd7-705f-fb2098147b03.jpeg)

## 新パスワード入力画面

メールのリンクをクリックすると新パスワード入力画面が表示。メールアドレスは既に入力された状態。入力して「新しいパスワードを設定」をクリックすると、ログインされた状態でダッシュボードへ遷移する。

![新パスワード入力画面](https://qiita-image-store.s3.amazonaws.com/0/43593/3b1d25bb-c1ac-f01e-441b-e3210d1b10ec.png)

パスワードの強さを表すアイコンがかわいい。わかりやすい。パスワード入力フォームの右側にちょこっと出る。

![新パスワード入力画面のパスワードの強さを表すアイコンがかわいい](https://qiita-image-store.s3.amazonaws.com/0/43593/16d9ecee-c634-bae3-564c-6d16df120163.png)
Github pages に 特定のディレクトリだけデプロイする

SPAなサイトを作ってると、ディレクトリのほとんどがソースコードで、`public/` だか `dist/` だけ公開したいケースがあると思います。

そういうときはgit subtree コマンドで特定ディレクトリだけを新しいブランチとして切り出してpushします

```sh
$ git subtree push --prefix public/ origin gh-pages
```

参考: [Deploy to `gh-pages` from a `dist` folder on the master branch. Useful for use with [yeoman](http://yeoman.io).](https://gist.github.com/cobyism/4730490 "Deploy to `gh-pages` from a `dist` folder on the master branch. Useful for use with [yeoman](http://yeoman.io).")


`deploy.sh` とかにこれだけ書いとけばいいかもしれませんね。drone.ioのCIにやらせても良いかも。
mercurial で SSH 鍵を指定して作業する

鍵が複数ある場合、~/.ssh/config を編集すれば良いのだけど、諸事情で編集できない場合は以下の方法で作業できる。

## http 経由で clone して、リポジトリの .hg/hgrc を編集する。

ドメイン名などは自分のに合わせる。

```bash
hg clone http://example.com/hg/hoge hoge
vim hoge/.hg/hgrc
```

```vim
[ui]
ssh = /usr/bin/ssh -i ~/.ssh/id_rsa-hoge -p ポート番号
[paths]
default = ssh://myuser@example.com/hg/hoge
```

-p ポート番号はデフォルトの 22 番を使っているなら必要なし。
default の値は http://... を ssh://ユーザ名@... に変えるだけ。

## --ssh オプションを使う

一時的であれば、コマンドに以下のオプションを追加すれば良い。

```bash
--ssh "ssh -i ~/.ssh/id_rsa-hoge -p <port>" 
```

## 組み合わせる

```bash
hg clone --ssh "/usr/bin/ssh -i ~/.ssh/id_rsa-hoge" ssh://myuser@example.com/hg/hoge hoge
vim hoge/.hg/hgrc

以下を追加する
[ui]
ssh = /usr/bin/ssh -i ~/.ssh/id_rsa-hoge
```

リポジトリごとに鍵を管理するなら、多分これが一番楽。
例外をtrue, falseに変換する

if文で例外が投げられたか判定したくて調べたけどなかったので、作ってみた。

例えばIntegerメソッドがArgumentErrorを投げるかどうか判定したいとき、こういうふうに書くことができる

```rb
Thrown.thrown?(ArgumentError){ Integer('10') } # false
Thrown.thrown?(ArgumentError){ Integer(10) } # false
Thrown.thrown?(ArgumentError){ Integer('a') } # true

Thrown.thrown?(ArgumentError){ Integer(:a) }
# TypeError: can't convert Symbol into Integer
```

実装はかなりシンプル。

```rb
class Thrown
  class << self
    def thrown?(exception_klass)
      begin
        yield
      rescue
        if $!.is_a? exception_klass
          return true
        else
          raise $!
        end
      end
      return false
    end
  end
end
```
Qiita の Markdown Syntax

# 見出し1
```
# 見出し1
```

## 見出し2
```
## 見出し2
```

### 見出し3
```
### 見出し3
```

#### 見出し4
```
#### 見出し4
```

##### 見出し5
```
##### 見出し5
```

###### 見出し6
```
# 見出し6
```

####### 見出し7 は無い (見出し6になる)
```
####### 見出し7 は無い (見出し6になる)
```

h1 の alias
=====
```
h1 の alias
=====
```

h2 の alias
-----
```
h2 の alias
-----
```

見出しの alias は1個からでも認識されるけど、人が読む時に辛いので自分は5個程並べてる．

強調
=====
斜体
-----
' * ' マークか ' _ ' マークを1つずつで挟むと
*斜体* _斜体_
```
*斜体* _斜体_
```
強調
-----
2つずつで挟むと
**強調** __強調__
```
**強調** __強調__
```

リスト
=====
数字無し
-----
* リスト表示は
* 行頭に * マークか - マーク
- で
- 作れる！
    - ネストも
    * 可能!
        * 3段ネスト！
            * 4段ネスト！！
                - 5段ネスト！！！
- リストの次は空行を
はさまないと続きと勘違いされる              

```
* リスト表示は
* 行頭に * マークか - マーク
- で
- 作れる！
    - ネストも
    * 可能!
        * 3段ネスト！
            * 4段ネスト！！
                - 5段ネスト！！！
- リストの次は空行を
はさまないとリストの続きと勘違いされる              

```

数字付き
-----
1. 数字付きの
2. リストは
3. 数字にドット(1.)
4. で
5. 作成可能！
    6. これまた
    7. ネストも
        8. 可能！！
        * しかも
    - 数字無しと
    - 混ぜても
        - いける！
            - でも
                - 数字の
    - 番号が
    - グチャグチャに
- なるから
1. 気をつけて
2. いや、まぁちゃんと
    * ルールは
    * あるみたいだけどね

```
1. 数字付きの
2. リストは
3. 数字にドット(1.)
4. で
5. 作成可能！
    6. これまた
    7. ネストも
        8. 可能！！
        * しかも
    - 数字無しと
    - 混ぜても
        - いける！
            - でも
                - 数字の
    - 番号が
    - グチャグチャに
- なるから
1. 気をつけて
2. いや、まぁちゃんと
    * ルールは
    * あるみたいだけどね
```

Syntax
=====
Syntax Highlight は

```bash
echo "Hello World"
```

って感じで
' ``` 'マークで囲む．
なんの言語かの指定も可能!!
でも空行で挟まないと上手く色分けしてくれないから気をつけて！

    ```bash
    echo "Hello World"
    ```

あと indent(スペース4つ) を行頭に入れる事で preタグ と同じ意味になるっぽい

Link
=====
Link は

    [title](URL)

の形式で書く．

    [このページへのリンク](http://qiita.com/da0shi/items/42f0c4ba58b09df88b47)

[このページへのリンク](http://qiita.com/da0shi/items/42f0c4ba58b09df88b47)

外部管理型
-----

リンクを貼る文章と実際のリンクの記述を分けて書く事で管理を楽にする方法がある．
形式は以下の通り．

    [title][link-id]
    [link-id]: URL "title (if you want)"
    or
    [link-id]: <URL> "title (if you want)"

ここでは同じ場所に書いているが別々の場所で書いて構わない．
URLの部分を分かりやすくするために `<>` で括る事も可能．

一番最後にまとめて書くのが一般的... ですよね？

    [このページへのリンク][this]
    [this]: http://qiita.com/da0shi/items/42f0c4ba58b09df88b47

[このページへのリンク][this]
[this]: http://qiita.com/da0shi/items/42f0c4ba58b09df88b47

"title (if you want)" の部分に任意の文字を入れると，カーソルを載せた時に出てくる文章を指定できる．
ダブルクオート(`"`)で括らないといけないので注意．

    [このページヘのリンク タイトル付き][this-with-title]
    [this-with-title]: <http://qiita.com/da0shi/items/42f0c4ba58b09df88b47> "このページ"

[このページヘのリンク タイトル付き][this-with-title]
[this-with-title]: <http://qiita.com/da0shi/items/42f0c4ba58b09df88b47> "このページ"

以下のように `[title]` の部分を link-id と同じにする事で link-id を一々指定しなくて良くなる．

    [link-id][]
    [link-id]: URL

こんな感じに書くと

    [このページへのリンク 省略バージョン][]
    [このページヘのリンク 省略バージョン]: http://qiita.com/da0shi/items/42f0c4ba58b09df88b47

こんな感じになる

[このページへのリンク 省略バージョン][]
[このページヘのリンク 省略バージョン]: http://qiita.com/da0shi/items/42f0c4ba58b09df88b47

.... 日本語はダメみたい？

    [this page][]
    [this page]: http://qiita.com/da0shi/items/42f0c4ba58b09df88b47

[this page][]
[this page]: http://qiita.com/da0shi/items/42f0c4ba58b09df88b47

.... ダメみたい．

とりあえずそんな感じで
ubuntu-debootstrapを日本仕様にしといた

officialのubuntu-14.04のイメージサイズが276.1MBと大きかったので
常用するために小さいイメージを用意した。

* イメージ化するときにサイズを小さくするための一連のコマンドを用意した。
  * `apt-clean`

todo: ミラーサイトを ubuntutym.u-toyama.ac.jp にしたい

## 追加パッケージ

1. vim-tiny
1. dialog


# 使い方

```bash:90.56MB
docker run -it tukiyo3/ubuntu-bootstrap-ja:14.04 /bin/bash
```

```bash:126.6MB
docker run -it tukiyo3/ubuntu-bootstrap-ja:14.10 /bin/bash
```

```bash:2014-12-27作成
docker run -it tukiyo3/ubuntu-bootstrap-base /bin/bash
```

# 作成手順

```bash:
docker run -it ubuntu-bootstrap:14.04 /bin/bash
```

```bash:作り方
unlink /etc/localtime
ln -s /usr/share/zoneinfo/Japan /etc/localtime
cp -a .bashrc /.bashrc
cp -a sources.list /etc/apt/
locale-gen ja_JP.UTF-8

apt-get update -qq
apt-get install -y vim-tiny dialog

mv /etc/apt/sources.list /etc/apt/sources.list.bak
apt-get clean
apt-get update
mv /etc/apt/sources.list.bak /etc/apt/sources.list
```

## ファイル

```bash:sources.list
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.

deb http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty main restricted
#deb-src http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty-updates main restricted
#deb-src http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty-updates main restricted

## Uncomment the following two lines to add software from the 'universe'
## repository.
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty universe
#deb-src http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty universe
deb http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty-updates universe
#deb-src http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty-updates universe

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
# deb http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty-backports main restricted
# deb-src http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty-backports main restricted

deb http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty-security main restricted
#deb-src http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty-security main restricted
deb http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty-security universe
#deb-src http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty-security universe
# deb http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty-security multiverse
# deb-src http://ubuntutym.u-toyama.ac.jp/ubuntu/ trusty-security multiverse
```

```bash:.bashrc
export LANG=ja_JP.UTF-8
apt-clean() {
    mv /etc/apt/sources.list{,.bak}
    apt-get clean
    apt-get update
    mv /etc/apt/sources.list{.bak,}
}
```
RailsでFacebookログインを実装する

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2099">元の記事はコチラ</a>
- - - - - - - - - - - 
RailsでFacebookログインを実装する

これを実装する度に毎回[Railscasts](http://railscasts.com/episodes/360-facebook-authentication?autoplay=true)を確認しているので、いい加減自分でまとめておきます。

<!-- extract -->

###準備
[omniauth-facebook](https://github.com/mkdynamic/omniauth-facebook)


https://developers.facebook.com でアプリをつくる。
赤い四角の所は必須だと思います。+Add Platform ウェブサイトの入力欄もつくります。
![facebook-app](http://image.workabroad.jp/upload/2014/153/workabroad.jpg)

　　

Gemfile

```

gem 'omniauth-facebook'

```

　　
config/initializers/omniauth.rb

```ruby

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET']
end

```

　　
FACEBOOK_KEYとFACEBOOK_SECRETは環境変数なので、
CentOSとかの場合は ~/.bash\_profile なんかを編集、
herokuの場合は```heroku config:set FACEBOOK_KEY=0123456789```などとして設定しておいてください。

　　

###ルーティングの設定

failureは、なんらかの原因でログインが失敗した時に、表示させるページ。
ログインボタンのリンクは```/auth/facebook```です。

```ruby

get '/auth/:provider/callback',    to: 'users#create',       as: :auth_callback
get '/auth/failure',               to: 'users#auth_failure', as: :auth_failure

```

　　

###コントローラー

Facebookから返ってくる情報を使って、ユーザーを作成したり、ログインさせたりします。
ログインの度に、iconや名前を更新したいので、@user.saveしています。
sign\_inメソッドについては説明しませんが、current\_userに該当のuserを代入しているだけです。

　　
```from_omniauth```メソッドや```context: :facebook_login```についてはモデルにて。
env['omniauth.auth']にいろいろ情報が入っているので、引数として渡しています。

controllers/users_controller.rb

```ruby

	def create

		if env['omniauth.auth'].present?
			# Facebookログイン
			@user  = User.from_omniauth(env['omniauth.auth'])
			result = @user.save(context: :facebook_login)
			fb 		 = "Facebook"
		else
			# 通常サインアップ
			@user  = User.new(strong_params)
			result = @user.save
			fb 		 = ""
		end
		if result
			sign_in @user
			flash[:success] = "#{fb}ログインしました。" 
			redirect_to @user
		else
			if fb.present?
				redirect_to auth_failure_path
			else
				render 'new'
			end
		end
	end

```

　　

###モデル

同じメールアドレスが見つかれば、そのユーザーとしてログイン。
そうでなければ、新しくユーザーを作成します。

Facebookログインでは、パスワードが必要ありませんので、パスワードのバリデーションを無効にしています。
```on: :facebook_login```を加えておいて、コントローラーでセーブする際に```@user.save(context: :facebook_login)```としています。

models/user.rb

```ruby

	validates :password, presence: false, on: :facebook_login

	def self.from_omniauth(auth)
		# emailの提供は必須とする
		user = User.where('email = ?', auth.info.email).first
	  if user.blank?
	  	user = User.new
	  end
    user.uid   = auth.uid
    user.name  = auth.info.name
    user.email = auth.info.email
    user.icon  = auth.info.image
    user.oauth_token      = auth.credentials.token
    user.oauth_expires_at = Time.at(auth.credentials.expires_at)
    user
	end

```

　　
/auth/facebook を叩けば、Facebookのダイアログが表示されるはず。

以上か、な…？
なんかまとめ忘れている気もしなくもないが。。




 → <a href="http://workabroad.jp/posts/2099">http://workabroad.jp/posts/2099</a>
smoothstep

故あってsmoothstepという関数がなにをしているのか調べてみた。

仕様書によると、Hermite interpolationというのをやってくれるようだ。(読み方がわからない。)

http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/smoothstep.html

> Returns 0.0 if x less than or equal to edge0 and 1.0 if x greater than or equal to edge1 and > performs smooth Hermite interpolation between 0 and 1 when edge0 < x < edge1. This is useful in cases where you would want a threshold function with a smooth transition.

仕様書通りにJavaで実装してみる。

```java
    public static float smoothstep(float edge0, float edge1, float x) {
        float t = clamp((x - edge0) / (edge1 - edge0), 0, 1);
        return t * t * (3 - 2 * t );
    }
```

ふむ。よくわからない。

いろいろぐぐった結果、グラフをみつけて納得。

http://www.fundza.com/rman_shaders/smoothstep/index.html