OmniAICreator/Qiita-1.07M huggingface dataset:
Retrofitを使ってSORACOM APIを呼び出すライブラリを作ってみた

SORACOM APIを使えばSORACOMのサービスをプログラム内でコントロールする事ができます。今回はSquare社製のOSSライブラリ「Retrofit」を使ってAndroidからSORACOM APIを呼び出すプログラムを作ってみました。

SORACOM API
https://dev.soracom.io/jp/docs/api/

Retrofit (今回は2.0.0-beta2を使用)
http://square.github.io/retrofit/


# RetrofitでAPI呼び出し部分をどうやって書いたか
Retrofitを使えば以下のように書くだけで呼び出し部分が完成します。ここではauthAPIを呼び出す部分だけ書いてみます。

```java:SORACOMのauthAPIをRetrofitで実装した例
public class Soracom {

    public static final Api API;

    static {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.soracom.io/v1/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        API = retrofit.create(Api.class);
    }    

    public interface Api {

        @POST("auth")
        Call<AuthInfo> auth(@Body AuthRequest authRequest);
    }
}
```

Request用、Response用のモデルクラスを作ったのち、Apiインターフェイスを上記のように書くだけで呼び出しインターフェイス部分はOKです。
初期化の部分はstaticブロック内で全て完結しています。SORACOM APIのレスポンスのフォーマットは全てJSONなのでJSONパーサである`CsonConverterFactory`を使います。ちなみに、このパーサは内部でGsonを使っているのでモデルクラスもそれに対応した形で作っていきます。

# 作ったAPIをどのように呼び出すか？
ワーカースレッド内で以下のように呼び出すだけでOKです。

```java:API呼び出し例
Call<AuthInfo> call = Soracom.API.auth(new AuthRequest(email, password));
Response<AuthInfo> response = call.execute();
AuthInfo authInfo = response.body();
```

`Call<?>`はRetrofitのクラスなので`enqueue`メソッドを使えばUIスレッドから呼び出しすことができます。(このメソッドを呼ぶことでAPI問い合わせの処理を非同期呼び出しています。)

```java:enqueueメソッドを使った例
Call<AuthInfo> call = Soracom.API.auth(new AuthRequest(email, password));
call.enqueue(new Callback<AuthInfo> (){
    @Override
    public void onResponse(Response<AuthInfo> response, Retrofit retrofit) {
        AuthInfo authInfo = response.body();
    }

    @Override
    public void onFailure(Throwable t) {
    }
});
```

# そのライブラリ、使えます。
Retrofitを使えばAndroidで簡単にSORACOM APIを呼び出すことができます。そして、このAPIを実装したライブラリを用意しました。ApacheLicense2.0で公開しています。

SoracomApiAndroid
https://github.com/LyricalMaestro/SoracomApiAndroid

まだまだ不完全なところがありますが少しずつパワーアップさせていきます。(プルリクトかも受け付けます)
ライブラリはbuild.gradleのdependenceブロック内に`com.lyricaloriginal:soracom-api-android:+`と記載すれば使うことができます。

```groovy:build.gradle
    //中略

dependencies {
    
    //中略

    compile 'com.lyricaloriginal:soracom-api-android:+'
}
```

これを使ったアプリもあります。ぜひ動かしてみてください。

SoracomSampleApp
https://github.com/LyricalMaestro/SoracomSampleApp
Seleniumによるテストの自動化

# はじめに
Seleniumという自動テストツールということで、今回は誰でも簡単にテストケースが書けるSelenium IDEを紹介します。

# Selenium IDEとは
ブラウザの動作を記録し、テストスクリプトの生成をしてくれるツールです。Firefoxのプラグインとして使います。

## Selenium IDEのインストール
1.Firefoxでhttp://docs.seleniumhq.org/download/からSelenium IDEのアドオンをダウンロードする。
2.再起動を求められるので、再起動する。
3.右上にSeのアイコンが出ればOK!

##実際に動かしてみる!
Seのアイコンを押して起動します。

ポップアップが出てきたらすでにテストの記録を始めています。
![saisyo.PNG](https://qiita-image-store.s3.amazonaws.com/0/105909/dea4e7d4-345f-50d6-b4e4-cd717b1349bc.png)

試しにhttps://www.google.co.jp/のページにアクセスして、検索フォームにselenium ideと入力して検索ボタンをクリックします。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/105909/26cbc1f2-fbd5-6571-b759-eb0c59dfc968.png)



するとポップアップの方に操作が記録されていっているのが分かるので、右上の記録ボタンを押して停止します。

実行ボタンをクリックすると、先ほど記録した内容が再生されていきます。

## Selenium IDEを使う上での注意点
Selenium IDEはテストケースを作成するのに非常に優れたツールです。ただ、Selenium IDEだけでは記録できない操作(マウスオーバーやドラッグなど)もあるので、単体で用いる場合テストするページに記録できない操作がないか確認が必要です。

ただ、記録できない操作があってもSelenium WebDriverという別のツールを併用することで、作成できる場合もあります。

##まとめ
Selenium IDEでは、FireFoxだけではなく他のブラウザのDriverも入れるとIEやGoogleChromeでもテストができます。また、今回はHTMLでテストケースを自動生成しましたが、フォーマットを変えることで、JAVAやPythonなどでもテストケースの生成ができるのでやってみると楽しくなれるかもしれません。
【メモ】Notification API

```js
if(window.Notification != null) {
  // Notificationを許可するかどうかを問い合わせる
  Notification.requestPermission(function(permission){
    // 許可されなかったら何もしない
    if(permission !== "granted"){
      return;
    }
    
    // タイトルと本文、アイコンを表示
    var options = {};
    options.icon = '';
    options.body = 'HogePiyoFooBar';
    new Notification('Title', options);  // instance作っても何もできなくない？
  });
}
```

ChromeでもFirefoxでも動作自体はしてびっくり。
意外と簡単に実装できるようになってるんですね、Notification API。

しかしなんでinstance作るんだろう…。
何か使うことになるのかな。
jruby sinatraでつくるスタンドアローンサーチエンジン

先日のohkawaさんの記事に比べると大分カジュアルな内容になります。m(_ _)m
あれと比べると全然時間かけてません。

# jruby sinatraでつくるスタンドアローンサーチエンジン

jruby sintraにelasticsearchを内蔵した簡易サーチエンジンを作ってみました。
注意) 実用的ではありません、やりたかっただけです。

sinatraで作ったオレオレサーバーにelasticsearchを組み込み
簡易REST APIから検索できるようにしてみました。

config/elasticsearch.ymlを適切に設定すれば既存のelasticsearch clusterに接続することももちろん可能です。
(そこまでするなら普通にruby api使えよって説もある)

webサーバーにはpumaを使用していて、それなりにパフォーマンスは出るはずです。

https://github.com/shinjiikeda/jruby_embedded_elasticsearch

## とりあえず動かす

### gradleインストール

for mac

```bash
$ brew install gradle
```

#### 起動

```bash
$ git clone git@github.com:shinjiikeda/jruby_embedded_elasticsearch.git
$ ./gradlew run
```

elasticsearch起動を確認

```bash
$ curl -XGET http://localhost:9200/
```

elasticsearchのendpointもそのまま使えます。

## データフィード

データフィードはelasticsearchのAPIをそのまま使います。

別のターミナルから

```bash
$ cd example
$ ./import.sh
```

### テスト

```bash
$ curl -XGET http://localhost:4567/test/type1?query=test1
{
  "took" : 12,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.4375,
    "hits" : [ {
      "_index" : "test",
      "_type" : "type1",
      "_id" : "1",
      "_score" : 0.4375,
      "_source":{ "title" : "test1", "description": "a b c d" }
    } ]
  }
}
```

## 解説

### Directoryレイアウト

```
config/  <- elasticsearch.ymlなどelasticsearchのコンフィグはここ
scripts/ <- ruby scriptはここ
data/    <- elasticsearchのindexはここ
plugins/ <- elasticsearchのpluginはここにいれる
```

### ruby rest apiソース

scripts/app.rb

```rb
# encoding; utf-8

require 'java'

java_import org.elasticsearch.node.NodeBuilder
java_import org.elasticsearch.action.search.SearchResponse
java_import org.elasticsearch.action.search.SearchType
java_import org.elasticsearch.index.query.QueryBuilders
java_import org.elasticsearch.index.query.QueryStringQueryBuilder

require 'sinatra/base'
require 'json'

$node = NodeBuilder.nodeBuilder().node();
$client = $node.client();

class App < Sinatra::Base
  configure do
  end

  get '/:index/:type' do
    index = @params['index']
    type = @params['type']
    query = @params['query']
    fields = ! @params['fields'] ? ["_all"] : @params['fields'].split(/,/)
    from = @params['from'] ? @params['from'].to_i : 0
    size = @params['size'] ? @params['size'].to_i : 10

    qsq = QueryBuilders.queryStringQuery(query)
    fields.each do | f |
      qsq.field(f)
    end
    qsq.defaultOperator(QueryStringQueryBuilder::Operator::AND)

    response = $client.prepareSearch(index)
                      .setTypes(type)
                      .setSearchType(SearchType::DFS_QUERY_THEN_FETCH)
                      .setQuery(qsq)
                      .setFrom(from).setSize(size)
                      .execute()
                      .actionGet()
    response.to_s
  end

  run!
end
```

今回は時間もなかったのでjava apiを直で呼んでおります。
この辺は好きに加工してもらっていいと思います。
出力形式もhaml等使ってカスタマイズも簡単です。

小規模の検索サービスで既存のものを置き換えたいとか専用api作る必要あるけど、それだけのためにelasticsearchとapiをそれぞれ立てるのが面倒くさいときなどに役に立つかもしれません。
認証つきprivate registryを簡単に立ててみる

## 環境

- MacOSX Yosemite
- docker 1.9.1
- docker-compose 1.5.2
- docker-machine 0.5.2

## 概要

簡単にprivate registryを立てれる環境が欲しかったので、作ってみました。
リポジトリは[こちら](https://github.com/yuemori/docker-registry-auth)になります。

### 認証つきprivate registry

dockerはデフォルトだとHTTPSで通信を行うのですが、SSLの証明書を作成したりプロキシサーバを立てたりするのが面倒でした。
また、認証や権限周りの設定を一からやっていくのもめんどくさい……。

というわけで、こちらのimageを利用することに。
https://github.com/cesanta/docker_auth#installation-and-examples

### docker_auth

概要はリポジトリのREADMEを読んでもらえれば雰囲気がわかるかと。
また、こちらの記事が非常にわかりやすかったです。
https://the.binbashtheory.com/creating-private-docker-registry-2-0-with-token-authentication-service/

### リポジトリ

リポジトリの中身は、docker_authとprivate registryを `docker-compose up` で立ち上げられるようにしたものです。

## クイックスタート

READMEを読んでもらえばわかると思いますが一応。

### git clone

```
$ git clone https://github.com/yuemori/docker-registry-auth
$ cd docker-registry-auth
```

### SSL証明書の作成

```
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.pem
$ mkdir ssl
$ mv server* ssl
```

### auth_config.ymlの編集

[こちら](https://github.com/cesanta/docker_auth#installation-and-examples)を参考に、設定を変更してください。

```
$ vi config/auth_config.yml
```

### insecure-registryの設定

`insecure-registry` は指定したホストとHTTP通信でregistryと通信するためのオプションです。
以下はdocker-machineの例です（CentOSとUbuntuの場合はREADMEに書いてありますが未検証です）。

`my-registry` の部分は立ち上げたホストのアドレスを入れてください。
docker-machineを使っている場合は、`docker-machine ip hogehoge` でIPアドレスを調べましょう。

```
$ docker-machine ssh default "echo $'EXTRA_ARGS=\"--insecure-registry my-registry:5000\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"
```

### 起動

```
$ docker-compose up
```

デーモンで起動する場合は `-d` をつけましょう。


### ログイン

```
$ docker login my-registry:5000
Username:
Password:
Email:
```

ログインが成功すると、 `$HOME/.docker/config.json` に認証情報が保存されます。

### push

とりあえず、公式のruby imageをpullしてpushする例。

```
$ docker pull ruby:2.2.3
$ docker tag ruby:2.2.3 my-registry:5000/ruby:2.2.3
$ docker push my-registry:5000/ruby:2.2.3
```

### search

```
$ docker search my-registry:5000/ruby
NAME           DESCRIPTION   STARS     OFFICIAL   AUTOMATED
library/ruby                 0
```

### pull

```
$ docker pull my-registry:5000/ruby:2.2.3
```

## private registryのバージョンについて

private registryは現在v1とv2があります。
推奨はv2ですが、v2は `docker search` をサポートしていないのがネックだったりします。
リポジトリの `docker-compose.yml` にはlatest(v1)を指定してあるので、お好みで変えてください。

## まとめ

globalなところにprivate registryを置く場合でも、認証があれば安心ですね。
`docker_auth`を使えば権限も細かく設定できるので、開発の際などに活用できそうです。

一方で、認証の遅さなどが気になる場合はやはりnginxなどをフロントに立てた方が良いかもしれません。
相手の読む気を無くさせるPowerPointスライドの作り方

# はじめに
PowerPointで資料を作成する際に気をつけていることがある．見ている相手に「読みたくない」と思わせる要素を減らすことである．内容が良くても，相手の読む気を無くさせては意味がない．自分がPowerPointの資料を作り始めた時，相手の読む気を無くさせる要素を知らなかった．そこで今回は，自分の経験から相手の読む気を無くすスライドの作り方を紹介する．

# スクリーンが4:3でスライドが16:9

発表スクリーンのアスペクト比4:3が多い．その中で16:9のスライドを表示すると画面が小さくなる．最近のPowerPointではデフォルトのアスペクト比が16:9になっているが，自分が発表するであろうスクリーンのアスペクト比に合わせることを気にしたい．

# フォントサイズ18未満

後ろの座席に座る人から見えるスクリーンは，スマホのスクリーンよりも小さい．細かい字を表示することは，相手に読ませる気がないのではないかと思わせる効果がある．

# 長い文章

簡単な文章で言い表せるかもしれないと様々な人が思うであろう表現に対して個人的な意見であるがやはり余計な形容詞や副詞をつけたり主語がながかったりするようななにかよくわからない一文を見かけることがあるかもしれないがそういった文章を見た人に何を伝えたいのか一度はっきりさせてから簡潔な言葉でかけないか考えてほしいといえないことはないというのは冗談である．

# 偏った位置につく文字

[ すこしずれただけで結構気になる　   ]


# 外枠の近くにコンテンツを置く

こちらは，スライドを後で編集する人（自分を含む）を困らせる方法．余白がないと別のスライドに移植が困難となる場合がある．

# 位置やサイズが不規則

スライドマスターをいじらずに，全体のレイアウトを変更するとこうなる．さらに，整列コマンド，グリッド，ルーラーを使わないことで不規則になる．画像を配置するときに顕著に表れる．

# デフォルトの色や図形の効果

発表を聞く人は大抵PowerPointで資料を作成したことがある．楽をするとすぐにわかる．積極的にデフォルトを利用することで，楽にスライドを作ったことがアピールされる．

# 謎な余白

スライドの妙な部分に余白を作ることで，相手の注意をスライドの内容からそれる．

# 視線が下から上に向かうスライド

以下の手順1,2,3で作る

3 説明文をスライドの上部に書く
2 矢印を下から上に引く
1 スライドで紹介する概念をスライドの下の部分に書く

# 図の説明文を図よりも前に載せる

図を見せればすぐにわかる概念も，説明文から先に見せることであたかも難しい概念であるかのような印象になる．

# 解像度の高い画像を使う

「図の圧縮」の機能を使わずに一眼で撮影した画像をそのまま載せるとこうなる．解像度の高い写真を利用すると動作が重くさせ，スムーズな編集が困難になる．さらにデータを移動に時間と手間がかかる．

# WMV以外の動画を使う

WMV以外の形式で動画を入れた場合，別のパソコンで動画が再生できない場合がある．Windowsであれば，WMVは再生できる．興味深いことに，WMVの動画を入れたとしても．「互換性の最適化」コマンドをすることで，WMV以外の形式に勝手に変換し互換性を無くすことができる．互換性の最適化コマンドが互換性を無くなる．スライド内の動画の拡張子に興味がある方は，pptxのファイル名の拡張子名の".pptx"の部分を".zip"に変更しzipを展開することで確認できる．展開したフォルダの中のmediaの中に動画がある．

# 印刷時のデザインだけ崩壊させる

画面に表示するスライドと，印刷するスライドとのデザインが異なる場合があることを利用したテクニックである．特に，「図の効果」の影などが無視されることがある．白い背景に，白いコンテンツを載せ，それに影をつけた場合には，画面には表示されて印刷した書類には見えないといった不思議な現象が発生する．


# まとめ

今回は相手の読む気を無くさせるPowerPointスライドの作り方について紹介した．相手の読む気を無くさせる要因を避けてスライドの作成をしていきたい．
洗濯物を干しながら最適化してみた

## きっかけ
「洗濯物、干しておいて」と言われて、干しながら考えたもの。
## 洗濯物問題
座標 p=[-3, -2, -1, 0, 1, 2, 3] に重量 w=[7, 8, 9, 11, 13, 15, 17] の洗濯物を1つずつ順番に干した時に、重心位置の絶対値が最小になる干し方を求めよ

## 定式化
定式化の仕方については、[組合せ最適化を使おう](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721)を参考のこと。
<table>
<tr><td>変数</td><td>$x_{ijk} \in \{0, 1\}$</td><td>$i$番目に位置$j$に洗濯物$k$を干すかどうか</td></tr>
<tr><td></td><td>$y$</td><td>重心位置の絶対値</td></tr>
<tr><td>目的関数</td><td>$y$</td><td>$\rightarrow$ 最小</td></tr>
<tr><td>制約条件</td><td>$\sum^n_{i=0}{ \sum_j{ \sum_k{ p[j] ~ w[k] ~ x_{ijk}} } } \le y$</td>
<td>$\forall n \in \{0, 1, \dots \}$</td></tr>
<tr><td></td><td>毎回置くこと<br>全ての位置に置くこと<br>全ての洗濯物を置くこと</td><td></td></tr>
</table>

## pythonで解いてみる

```py3:
from pulp import * # pip install pulp
def addvar(lowBound=0, var_count=[0], *args, **kwargs):
    var_count[0] += 1
    return LpVariable('v%d' % var_count[0], lowBound=lowBound, *args, **kwargs)

p = [-3, -2, -1, 0, 1, 2, 3]
w = [5, 6, 7, 9, 10, 11, 12]
r = range(len(p))
m = LpProblem()
x = [[[addvar(cat=LpBinary) for _ in r] for _ in r] for _ in r]
y = addvar()
m += y
for n in r:
    m += lpSum(x[n][j][k] for j in r for k in r) == 1
    m += lpSum(x[i][n][k] for i in r for k in r) == 1
    m += lpSum(x[i][j][n] for i in r for j in r) == 1
    if n:
        m += lpSum(p[j] * w[k] * x[i][j][k]
                   for i in range(n+1) for j in r for k in r) <= y
        m += lpSum(-p[j] * w[k] * x[i][j][k]
                   for i in range(n+1) for j in r for k in r) <= y
m += lpSum(x[0][len(p) // 2][k] for k in r) == 1
m += lpSum(x[1][j][k] for j in range(len(p) // 2) for k in r) == 1
%time m.solve()
print(LpStatus[m.status], value(m.objective))
>>>
Wall time: 2 s
Optimal 10.0
```

位置座標0にはいつ置いてもいいので、最初に置くことにしている。また、次は左右どちらでもいいので、左に固定している。

```:結果表示
for i in r:
    for j in r:
        for k in r:
            if value(x[i][j][k]) > 0.5:
                print(i, j, k)
>>>
0 3 6
1 2 4
2 5 3
3 1 2
4 6 0
5 0 1
6 4 5
```

最適解は複数あるようなので、おそらく局所探索法などの近似解法の方が有効だろう。

## 追記
定式化において pandas を使うと下記のように見やすくなる。

```:py3
import pandas as pd
from pulp import * # pip install pulp
def addvar(lowBound=0, var_count=[0], *args, **kwargs):
    var_count[0] += 1
    return LpVariable('v%d' % var_count[0], lowBound=lowBound, *args, **kwargs)
def Σ(s, f=None):
    if not f:
        return lpSum(t.query(s.format(**globals())).x)
    return lpSum(t.query(s.format(**globals())).apply(f, axis=1))

p = [-3, -2, -1, 0, 1, 2, 3] # 座標
w = [5, 6, 7, 9, 10, 11, 12] # 重量
r = range(len(p)) # 範囲
m = LpProblem() # 数理モデル
t = pd.DataFrame([(i, j, k, addvar(cat=LpBinary))
    for i in r for j in r for k in r], columns=['順番', '位置', '重量', 'x'])
y = addvar() # 重心位置の絶対値
m += y # 目的関数
for n in r:
    m += Σ('順番=={n}') == 1 # 順番 n で置くこと
    m += Σ('位置=={n}') == 1 # 位置 n に置くこと
    m += Σ('重量=={n}') == 1 # 洗濯物 n を置くこと
    if n:
        # 重心位置の絶対値が y 以下
        m += Σ('順番<={n}', lambda q: p[q.位置] * w[q.重量] * q.x) <= y
        m += Σ('順番<={n}', lambda q: -p[q.位置] * w[q.重量] * q.x) <= y
m += Σ('順番==0 & 位置==3') == 1 # 順番 0 に 位置 3 に置くこと
m += Σ('順番==1 & 位置<=2') == 1 # 順番 1 に 位置が 2 以下に置くこと
m.solve()
print(LpStatus[m.status], value(m.objective))
```
Day of D言語くん

Merry Christmas !!!

今回 [Effekseer](http://effekseer.github.io) でD言語くんを彩るエフェクトを作ってみました。

各シーンに特に意味はないぞ！

##デジタルマァズの世界から召喚されたD言語くん
![キラキラ！](http://nsplus.dojin.com/ueshita/dman/nativity.gif)

異世界からやってきたぞ！

##デコられるD言語くん
![キラキラ！](http://nsplus.dojin.com/ueshita/dman/deco.gif)

イマドキ流行してるクリスマスツリーだぞ！

##人気者のD言語くん
![ピカピカ！](http://nsplus.dojin.com/ueshita/dman/obj.gif)

光の魔法でクリスマスのお祝いをするぞ！

##発射されるD言語くん
![ｺﾞｺﾞｺﾞｺﾞ…](http://nsplus.dojin.com/ueshita/dman/riftoff.gif)

ロケットエンジンで飛べるぞ！

##飛翔するD言語くん
![](http://nsplus.dojin.com/ueshita/dman/flying.gif)

回転するとジャイロ効果によって飛行が安定するぞ！

##疲れからか黒塗りの高級車にぶつかってしまうD言語くん
![やったぜ](http://nsplus.dojin.com/ueshita/dman/yattaze.gif)

完全に撃破したから示談とか関係ないぞ！

##量産されるD言語くん
![完成していたのか…！](http://nsplus.dojin.com/ueshita/dman/production.gif)

なかまがふえるぞ！

##空から降る1億のD言語くん
![やばい](http://nsplus.dojin.com/ueshita/dman/xday.gif)

やがて世界はD言語くんで包まれるだろう。
人はそれを審判の日と呼んだ。

終
定期的に発行SQLのdump

毎日一回DBのdumpをとっているんですが、もっと細かくdumpとりたい。っていうお話が来ました。

なのでbinlogから定期的にsqlのdumpをとるようにしました。

パフォーマンスとかあんま考えなくてもいい感じだったので、1時間に１回定期的にbinlogから更新系SQLを抜き取っています。


    #!/bin/sh

    ### MySQLのパスワード
    MYSQL_PASSWORD='**********'

    ### プロジェクトのフルパス
    PROJECT_PATH='/var/www/project/'

    ### dumpファイル格納先
    DUMPFILE_PATH='data/dump'

    ### 開始日
    START_DATE=`date -d "1 hours ago" "+%Y-%m-%d %H:00:00"`

    ### 終了日
    END_DATE=`date "+%Y-%m-%d %H:00:00"`

    ### ファイル接尾語
    FILE_SUFFIX=`date "+%H"`

    ### dumpファイル名
    FILENAME="today_sql_${FILE_SUFFIX}.sql"

    ### mysqlデータ格納先フォルダ
    MYSQL_DIR=/var/lib/mysql

    ### bin-log-indexファイル名
    MYSQL_BIN_LOG_FILENAME='mysql-bin.index'

    ### 使用中のbinログファイル名
    BINLOG_FILE=`echo ${MYSQL_PASSWORD} | sudo -S tail -n 1 ${MYSQL_DIR}/${MYSQL_BIN_LOG_FILENAME}`

    ### dump実行
    echo ${MYSQL_PASSWORD} | sudo -S mysqlbinlog $MYSQL_DIR/$BINLOG_FILE \
        --start-datetime "${START_DATE}" \
        --stop-datetime "${END_DATE}" | \
        perl -e 'while(<>){ chomp; next if m!^#!; if ( m{/*!*/;$} ) { $p .= $_; print "$p\n"; $p="" } else { $p .= $_." "} }' | \
        perl -nle 'm!^(DELETE FROM|REPLACE INTO|INSERT INTO|UPDATE)\s+([^ ]+)!i && print' > $PROJECT_PATH/$DUMPFILE_PATH/$FILENAME


1日1回のdumpだけだと最悪丸一日の空白があるので、それをなるべく埋めるための1時間に１回のdumpになります。
GStreamer でアスキーアート


GStreamer plugins good に [aasink (Ascii Art Sink)](http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-aasink.html)というものがあります。
これは[aalib](http://aa-project.sourceforge.net/aalib/) を使っているプラグインなので残念ながらWindowsのインストーラーには含まれていません...

Linux 環境がある方はお試しあれ！

```
$ gst-launch-1.0 v4l2src ! videoconvert ! aasink
```

こんなのが取れます

![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/97187/a79f30c5-ac16-0db6-e9a8-829c38c4588a.png)

この画像は X に出していますが、もちろん今開いている端末上にもだすことができます。

RasPi に ssh でログインして、X Forward せずにカメラ映像が!? なんてこともできないことはないですね。(それで足りるかは別として...)
様々なコマンド達を何も考えずにWP REST APIとつないで遊ぶ



<a href="http://qiita.com/greymd/items/a4ecf8e70f11eb1e5f72" >シェル芸 - 【たのしいな】様々なコマンド達を何も考えずにつないで遊ぶ - Qiita</a>が面白かったので、WP REST APIを使って遊んでみました。

##用意するもの
- jq
- WP REST API(Version2)が入っているWebサイト
- [あの記事](http://qiita.com/greymd/items/a4ecf8e70f11eb1e5f72)

##[cowsay](http://qiita.com/greymd/items/a4ecf8e70f11eb1e5f72#-cowsay)

###wp-cowsay.sh
```
#!/bin/sh
URL=${1}
if [ "${URL}" = "" ]; then
  echo "Please set URL"
  exit 1
fi
curl -XGET ${URL}"wp-json/wp/v2/posts" | jq ".[0].title.rendered" | cowsay
```

###wp-cowsay.shの使い方
```
$ /bin/bash wp-cowsay.sh http://hoge.example.com/
```
![スクリーンショット_2015-12-23_23_40_28.png](https://qiita-image-store.s3.amazonaws.com/0/23936/cd9c4b81-7770-3f65-6d07-18f5e720dd87.png "スクリーンショット_2015-12-23_23_40_28.png")

新着記事１件目を牛が話す

##[mecab](http://qiita.com/greymd/items/a4ecf8e70f11eb1e5f72#-mecab)
```
#!/bin/sh
URL=${1}
if [ "${URL}" = "" ]; then
  echo "Please set URL"
  exit 1
fi
curl -XGET ${URL}"/wp-json/wp/v2/posts/" | jq ".[0].content.rendered" | mecab                                             
```
こちらは真面目に新着記事１件目の記事本文を形態素解析かけるだけ。

![スクリーンショット_2015-12-24_0_07_49.png](https://qiita-image-store.s3.amazonaws.com/0/23936/f1b56e08-ceaa-b4d3-704e-cbd1c48783e7.png "スクリーンショット_2015-12-24_0_07_49.png")


##[matsuya-generator-ruby](http://qiita.com/greymd/items/a4ecf8e70f11eb1e5f72#-matsuya-generator-ruby)

###wp-matsuya.sh
```
#!/bin/sh
URL=${1}
if [ "${URL}" = "" ]; then
  echo "Please set URL"
  exit 1
fi
ID=${2}
if [ "${ID}" = "" ]; then
  echo "Please set POST ID"
  exit 1
fi
COMMENT=`matsuya`
curl -XPOST ${URL}"/wp-json/wp/v2/comments/" -d "post=${ID}" -d "content=${COMMENT}"                                                                                   
```

###wp-matsuya.shの使い方
```
$ /bin/bash wp-cowsay.sh http://hoge.example.com/ 1
```
![スクリーンショット_2015-12-24_0_00_05.png](https://qiita-image-store.s3.amazonaws.com/0/23936/b487e476-e0d0-7308-cc8c-5d2d610722da.png "スクリーンショット_2015-12-24_0_00_05.png")
URLと記事のIDを指定することで、松屋のメニューをコメントしていく。

![スクリーンショット 2015-12-24 0.01.57.png](https://qiita-image-store.s3.amazonaws.com/0/23936/f42705b1-9cc2-60f5-48ec-7a915628c65e.png "スクリーンショット 2015-12-24 0.01.57.png")
ただの嫌がらせである。
サイトに画像アップロードすると向きがおかしくなる問題

最近、 「デジカメで撮影した画像がプレビューでは正常に表示されるのに、いざアップロードすると横向きになる。」という問題にぶつかったのですが、その際に調べたことならびに解決策をまとめてみます。


## 結論

先に結論を書いておくと、Exif の orientation に起因する問題でした。

アプリケーションは Rails で、アップロード周りは CarrierWave + MiniMagick を使っているので、以下のようなワークアランドを入れました。

#### config/initializers/carrierwave.rb

```rb
module CarrierWave
  module MiniMagick
    def fix_exif_rotation
      manipulate! do |img|
        img.auto_orient
        img = yield(img) if block_given?
        img
      end
    end
  end
end
```

#### app/uploaders/your_image_uploader.rb

```rb
class YourImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  process :fix_exif_rotation

  snip...

end
```


## 原因調査

本問題を最初に発見した時は、なかなか原因に当たりがつきませんでした。

というのも、ブラウザで見ると90度回転しているにも関わらず、URL直接指定すると正常に表示されており、またダウンロードしてプレビューアプリで見ても正常に表示されていたからです。

CSSに原因があるのではないかと Inspector で調べるも、怪しいところは発見されず悶々としていたところ、同僚エンジニアが https://twitter.com/pastak/status/436793706377535488 という tweet を教えてくれ、これが解決の糸口となりました。

実際に [identify](http://www.imagemagick.org/script/identify.php) コマンドで確認すると、orientation が 6（時計回りに90度回転）となっていることが確認できました。

```
$ identify -vervose file-name.jpg

  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Mime type: image/jpeg
  Class: DirectClass
  Geometry: 800x600+0+0
  
  snip...
  
  exif:Orientation: 6
  exif:ResolutionUnit: 2
```

## 解決策

今回はかなり一般的な問題（自身は知らなかったわけですが^^）だったので、解決策を見つけるのはさほど難しくありませんでした。書いたコードは冒頭の通りです。

関連する CarrierWave のコードとドキュメントも読んだので、ここに記載しておきます。

- http://www.rubydoc.info/github/jnicklas/carrierwave/CarrierWave/MiniMagick
- https://github.com/carrierwaveuploader/carrierwave/blob/master/lib/carrierwave/processing/mini_magick.rb



## まとめ

Exifについて詳しくなかったので勉強になりました。同時に、引き出しをたくさん持っていたほうが問題解決スピード早いよね、ということも改めて実感しました。

最後に、解決策を探すにあたって参考にしたサイトを挙げておきます。

 * http://dqn.sakusakutto.jp/2009/02/jpegexiforientaion.html
 * http://lxyuma.hatenablog.com/entry/2013/12/07/095742
 * http://www.nodenerd.com/make-carrierwave-respect-exif-orientation
片手用Dvorak配列

http://qiita.com/advent-calendar/2015/dvorak

Dvorak Advent Calendar 24日目．

-----

## メリークリスマス・イヴ！

さて，事故に巻き込まれて片腕失ったらどうしましょうか？
手首から先がなくなったり，片手側の指が欠損したらどうしましょうか？

そこで，Dvorak配列です

### Dvorak配列には3種類ある

- Dvorak配列（一般的なやつです）
- 右手用Dvorak配列
- 左手用Dvorak配列

Dvorak配列には片腕でも打鍵し易いように改良された片手用Dvorak配列が左右それぞれあります．

![](https://upload.wikimedia.org/wikipedia/commons/8/87/KB_Dvorak_Right.svg)
↑右手用Dvorak配列


![](https://upload.wikimedia.org/wikipedia/commons/b/b5/KB_Dvorak_Left.svg)
↑左手用Dvorak配列


### 片手用Dvorak配列

情報がほとんどない．

ホームポジションが存在するのかすら分かりません．
 *コメント欄参照
国内で使ってる人も噂レベルか，試しにちょっとやってみるかレベルで本格的に使っている方を余り聞いた事がありません．

有事の後にこういった配列がある事を頭の片隅に入れておくと役立つかもしれません．
     
     
-----

片手用Dvorak配列について何か情報がございましたら，コメント頂ければ幸いです．
WebVRのちょっとした仕様変更がもうすぐくるみたい

Chromium(Blink)のソースを見てみるとPoseSensorVRDeviceという新たなクラス関連のファイルが追加されています。
https://chromium.googlesource.com/experimental/chromium/src/+/refs/wip/bajones/webvr
PositionSensorVRDevice.idlを見てみるとコメントに
>
PositionSensorVRDevice is deprecated, and defined here to provide some backwards compatibility for an older version of WebVR. Should be removed at a future date

と書かれており、PositionSensorVRDeviceクラスは今後廃止されるようです。

そして、新たにPoseSensorVRDeviceクラスが追加されています。
PoseSensorVRDevice.idlを見てみるとコメントに
>
An PositionSensorVRDevice represents a user interface that provides an orientation and position in space. This may be a Head Mounted Display or any number of other six-degree-of-freedom devices that provide, for example, hand tracking.

英語苦手なのでなんて書いてあるかわからないのですが、最後に、for example, hand tracking.と書かれているように、ハンドトラッキングなどをサポートするっぽい？

英語話せないのに、無謀にもSlackで質問したら、@tojiroさんから、
>
I sent out a proposal to the WebVR-discuss mailing list to update the verbiage from Position to Pose, because Position only describes part of what the object reports.
The proposal was generally well received, so I made the change in the code to ensure it will go smoothly, but I'm kinda waiting for Mozilla to comment before I commit to it.

という返事をいただきました。
googleで翻訳してみると、Positionという名前が、特定の(つまりはPosition)ものを指してしまっているので、もっと広い意味を持つPoseにかえようという提案をMLで出したら好評を得たので、実装したということなんだそうです。(訳間違っていたらどうか指摘してください)

ただ、今のところWebVRのスペックページはこのことに関する修正がありません。
コメントをいただき、現在、修正作業を行っている最中だそうです。教えていただいた[リンク](https://github.com/MozVR/webvr-spec/pull/9)をみると、PRを出していました。
http://mozvr.github.io/webvr-spec/webvr.html
実践：MagJS で TodoMVC

みんな大好き [TodoMVC](http://todomvc.com) を [MagJS](https://github.com/magnumjs/mag.js) で書いてみました。一応 MagJS も仮想 DOM ファミリーの一員とみなせなくもないし、空きがあったのでお邪魔しまーす。

https://github.com/t-suwa/todomvc-magjs

たぶんどこかで詰まるだろうなーという事前の予想に反して半日くらいでほぼ形になったので、なんとか頑張ってみました。コメント少なかったり、ちょっと微妙なところもあると思いますが、ご笑覧ください。

[React + Alt](https://github.com/tastejs/todomvc/tree/gh-pages/examples/react-alt) や [Mithril](https://github.com/tastejs/todomvc/tree/gh-pages/examples/mithril) などと見比べて、あーだこーだ言うのが楽しくていいんじゃないでしょうか ;-)

# 動作確認状況

Chrome と Firefox、Safari は大丈夫そうです。IE は Promise の Polyfill 入れて Edge だけ確認しました。ダブルクリックで編集した後 Enter で確定すると、テキストボックスは消えるのにカーソルが点滅するというオカルト現象が発生しますが、それ以外は動いてます。

あと、IE の localStorage はローカルファイルのブラウズ時は無効なので、もし試すなら http サーバー立てて下さい。

変なところあったらコメントもらえれば。または PR ください。

# とりあえずの感想

`mag.module` を使ったコンポーネント分割が自然で、依存関係も必要最小限で済みます。今回はトップレベルのコントローラーも書いてますが、これは MagJS のライフサイクルイベント調査するのが目的だったので、実は削除しても問題なく動きます。

そうするとアプリの基本構成はブートストラップ、ビュー、モデルぐらいで足りる。必要なところだけ書けば良いので、ボイラープレート感もない。何より素の js だけってのが爽快です。Mithril 由来の仕組みもとても便利なので、書いてて楽しい。

ビューは何か困った時すぐに dom を弄れるので安心感あります。ただ、第一引数の `state` が、コントローラーのインスタンスと dom をマージしたオブジェクトなので要注意。最初よくわからず、間違ってコントローラーのメソッドを上書きして悩んだりしました。

というわけで、ちょっと気をつけるところはあるものの、総じてシンプルで素直。あ、ちなみに一箇所だけ js に html が混じったところあります。まあ、そういう風にも書けるよというサンプルとして良いかなと思い、そのままにしてます。

# 今後の予定

TodoMVC 書いて色々気付きがあったので、コード解説がてら何回かに分けて書きます。あとできれば、テストも追加してみたいです。どっちも年明け以降になりますが。

パフォーマンステストは誰か好きな人がやればいいと思います。

# まとめ

MagJS でも、ある程度実用的なアプリケーションを開発できる手応えを掴むことができて良かったです。TodoMVC は小さくて取るに足らないアプリかも知れませんが、まずそのレベルを見通しよく書ける（た）ということは、今後の展開を考える上での最低条件をクリアできたかなと思います。

学びが多くてなかなかいい一年でした。来年もまたよろしくお願いします。

# 参考

- [TodoMVC 仕様](https://github.com/tastejs/todomvc/blob/master/app-spec.md)
スーパーエンジニアじゃなくてもOSS活動できる話


こんにちは。[岩手県立大学アドベントカレンダー](http://qiita.com/advent-calendar/2015/ipu)24日目の記事です。

僕の友人が[記事を書いていたので](http://qiita.com/gates1de/items/074fd48173e68e8cd751)、書きたくなって勝手に登録しました。

# はじめに
OSSの活動ってなんとなくハードル高い気がしませんか？
僕自身、OSSってのはスーパーエンジニアのやることで、僕には関係ないことだと思っていました。

でも、実はそんなことないです。まずはやること、やろうとすることが重要なんです。

# やったこと
[mizzy/specinfra](https://github.com/mizzy/specinfra)はコマンド生成のFrameworkです。その中でも `Darwin` のパッケージ管理ツールである、 `brew` の `uninstall` コマンドを追加しました。

追加するまでの経緯はいたって単純で、[itamae-kitchen/itamae](https://github.com/itamae-kitchen/itamae)を使ってサーバの構成管理をしていたときです。サンプルとして作成した `レシピ` をローカルで実行してみたときにインストールされたパッケージを `レシピ` を変更してアンインストールしようとしたときに、エラーでパッケージをアンインストールできませんでした。試しに、サーバ上で実行してみたら問題なくインストールもアンインストールもできました。エラーメッセージから、どうやら `Darwin` のパッケージ管理ツールの `remove` メソッドが無いよって感じでした。

で、いろいろ原因調査してたら `itamae` じゃなくて、パッケージのコマンド自体は `specinfra` を使って作成されていることがわかりました。

実際に `specinfra` がどのようにコマンドを生成しているのかをみてみると結構単純でしたので、他の `remove` メソッドを参考に `Darwin` ようの `remove` メソッドを作成して `PR` 送ってみました。

<img width="774" alt="Screen Shot 2015-12-23 at 6.15.33 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/32211/7d8652d0-7a87-5b72-f549-6dd2baa2d4e1.png">

テスト落ちているけど、いくつかフィードバッグをいただいた後に `Merged` されました :)

# おわりに
この `PR` では本当大した変更はしていないけれどマージされたし、OSS活動できたと言えると思います。こういう小さいことからコツコツやっていくことは重要だと思います。バグを見つけたとき、ググッて解決してあ〜良かったとか思っているときがチャンスです！もしかしたらそれはバグかもしれませんよ。

<img width="773" alt="Screen Shot 2015-12-23 at 6.20.11 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/32211/eefede11-de65-28cf-a461-ab86cd5c357c.png">
コミュニケーションは学習すると良いということをニューロ・ロジカル・レベルを例にご説明します。

# はじめに
もしあなたがこれまでにコミュニケーションについて学習する期会に恵まれていなかったとしたら、それは、これからあなたが育ててきたその人間性を、より前に出せる、相手に伝えられる、ぐんぐんと押し上げていける、そんな素晴らしい可能性をあなたの内に秘めているということです。

世の中には、その知識を少しだけでも知っていると、大きく結果が良くなること、というものがあります。
コミュニケーションはその中の一つで、あなたがもし本投稿の知識を知ったとすると、あなたとその周りとの関係が大きく改善する可能性があります。

コミュニケーションはいろいろと研究されており、その中でより良いコミュニケーションとはどうあるべきかが検討されています。
にも関わらず、すでに禁忌とされてる一言を平然と口にしてしまう、典型的なアンチパターンで堂々と人と接してしまう方を度々目にします。そして、そのことについて、ああしたらいい、こうしたらいいと議論していることをよく聞きます。
かくいう私もそうでした。
そして、コミュニケーションを少し学ぶと、自分がいかに良くないコミュニケーションをして来たかということに気付かされ、足元が崩れ去るような感覚に襲われました。

本投稿ではニューロ・ロジカル・レベルをご紹介することで、コミュニケーションを学習、習得することについて思いを馳せていただければ幸いです。

ところで、なぜ、今日ニューロ・ロジカル・レベルかというと、図がクリスマスツリーに見えるからです。メリー・クリスマス（イブ）。

# ニューロ・ロジカル・レベル
ニューロ・ロジカル・レベルとは意識レベル、物事の捉え方や感覚をピラミッド型に図式化し、情報によりその人の本質的なものを配置するものです。
![ニューロ・ロジカルレベル.png](https://qiita-image-store.s3.amazonaws.com/0/25176/adb89b32-4401-bb5d-622c-67a98e8d49d4.png)

下の方にはその人と直接関わりの低いことがあり、上の方に行くに従って、その人の本質や深層心理に近くなります。上の方に行くに従って、インパクトが強くなります。また、下に行くに従って、客観視しやすくなり、対峙もしやすくなります。

ニューロ・ロジカル・レベルは、コミュニケーションにおいて、相手に与える影響度のコントロールに使えます。
褒めるときは相手の本質を話し、インパクトを強めます。
指摘するときは対象を環境として捉え、その現象を話すことで、問題に共に対峙する姿勢をとり、相手が素直に話を聞くことができるようにします。

# 良い例
人を褒めるときや指摘するときの良い例は以下です。

## 褒めるコミュニケーション例
- 細部を大事にする君だから出来たのだよ。（その人の信念を褒める。）
- 普段の積み重ねの成果だね。（その人の普段の有り様を褒める。）
その人のモチベーションを上げるために、より影響度の強い、より本質的な点をほめます。その人が大事にしていること、信念を汲み取り、言及します。

## 指摘するコミュニケーション例
- 悪いことが起こった原因はこれだね。これを排除するためにはなにをしたらいいだろう？（周りの環境に問題点を投影し、指摘する。）
- これがなにか起こるサインだったね。
対峙しやすいことを引き合いに出して、共に対峙するようにすることで、問題の解決に取り組みやすくします。

# アンチパターンは以下です。
アンチパターンは以下です。

## 褒める時のアンチパターン
- 顔がいいね。（能力か、環境に近く、その人の本質を捉えていない。「顔つきがいいね」だと、本質に近くなるので良い。）
- バグを出さなかったね。（結果論の環境を褒めると、その人が自分の事として捉えにくい。「丁寧さをうまく活かしたね。」だと、本質に近くなるので良い。）
表面/上っ面を褒められても、自分の事として捉えにくくなります。

## 指摘する時のアンチパターン
- 人としてどうなの？（その人自身を責める。）
- お前はいつもそうだよね。（その人の普段の有り様を責める。）
その人の否定になってしまっています。対象は自己を否定されたと感じるでしょう。
自己を否定されたと感じてしまうと、信頼関係が崩れ、効率的にコミュニケーションができなくなってしまいます。

残念ながら、アンチパターンのコミュニケーションを行った記憶があなたにもあるのではないでしょうか？
本投稿で知っていただいたニューロ・ロジカル・レベルを適切に使用することで、相手に伝えたいことややってほしいことを適切なレベルで伝えることができます。

話す前に、今話そうとしている内容はニューロ・ロジカル・レベルのどのレイヤーに当たるのか考えてみて、褒めるときはひとつ上のレベルを、注意するときはひとつ下のレベルに置き換えてみてください。あなたとその周りの状況が、きっと一変します。

# 本投稿も、コミュニケーション
本投稿も、私からあなたへのコミュニケーションの一つです。したがって、ニューロ・ロジカル・レベルを使うことができます。例えば、この文章の頭出しを以下の様にしたらどうでしょう？
違った印象になりませんか？

```
あなたがダメなのは、そもそもコミュニケーションの学習に目も向けず、人の話も聞こうとしない、
勝手に振る舞ってばかりいるあなた自身に問題があるからです。
```
インパクトは強いものの、これを面と向かって言われたら、いい気分はしないですよね。
炎上を狙ってないのであれば、私はこんな書き出しはしません。

# 〆に。
我々の日々の生活はコミュニケーションによって成り立っています。コミュニケーションを学ぶことはとても費用対効果が高いともいえます。
また、試す期会も多いので、少し学習した内容をすぐに実践することもできます。
今回ご紹介した、ニューロ・ロジカル・レベル以外にも、コミュニケーションについての研究、考察、概念、手法はたくさんあります。
ぜひ、コミュニケーションを学習してみてください。
なお、本投稿は必ずしも私めの雇用主、関係者の立場、戦略、意見を代表するものではありません。

少し説教臭くなってしまいました。最後まで読んでいただいたあなたは、前向きで心の綺麗な方です。感謝とともにその人柄を尊敬させていただきます。
【vte.cx応用】23.サーバーサイドJavascriptを使用したエクセル出力の方法


今回はサーバーサイドjavascriptを使用したエクセルファイルの出力と、その書き方の仕方について説明します。

# vtecxblankを最新の状態にしてください
Xls出力は古いバージョンのvtecxblankプロジェクトだと動作しません。
お手数ですが、vtecxblankプロジェクトを最新にしていただきますようよろしくお願い致します。
(2015/12/18付)

# XLSのサンプルソース
エクセルファイルを出力する際は、テンプレートとなるXLSファイルとリソースデータが必要になります。
XLSファイルで型となるテンプレートを作成し、そのテンプレートにリソースデータの値を代入して出力するイメージとなります。

このリソースデータをxlsとして出力するとします。

```lang:/d/hoge（リソースデータ）
    {
    	feed: {
    		entry:[{
    			title: 'Hello World',
    			link: [{
    				___href: '/hoge',
    				___rel: 'self'
    			}],
    			id: '/hoge,1'
    		}]
    	}
    }
```

リソースデータのtitle項目の「Hello World」をXLSとして出力したい場合、以下のようなファイルをテンプレートとして用意してください。

hello_world.xls（XLSテンプレート）
![hello_world.xls（XLSテンプレート）](https://qiita-image-store.s3.amazonaws.com/0/59710/9aaedc0f-1093-8693-e43d-6e3b486700bd.png "hello_world.xls（XLSテンプレート）")

表示したい項目をセルに**「${項目名}」**で指定します。
こうすることでtitle項目の「Hello World」をセルに埋め込めます。

## テンプレートのエクセルファイルの保存場所
テンプレートのHTMLはvtecxblankプロジェクトの以下の場所に配置してください。

```lang:ファイルの置き場所
   /app/xls
      hello_world.xls
```

# サーバーサイドjavascriptでReflexContext.toXls()を実行する

エクセルを作成し出力するためにはサーバーサイドjavascriptが必要になります。
ReflexContext.toXls()メソッドを使用することでエクセルを出力できます。

以下のサーバーサイドjavascriptを用意してください。

```lang:test.xls.js（サーバーサイドjavascript）
module.exports = function () {

  // リソースデータ取得
  var data = ReflexContext.getEntry('/hoge');

  // エクセル出力
  ReflexContext.toXls(data, '/xls/hello_world.xls', 'test.xls');

};
```

ReflexContext.toXlsメソッドの引数は以下のようになります。

```
    ReflexContext.toXls({リソースデータ}, {HTMLのURL}, {XLSのファイル名（拡張子含む）})
```

# デプロイを実行し、実際にアクセスしてみる

* hello_world.xls（テンプレートXLS）
* test.xls.js（サーバーサイドjavascript）

をapp配下に置いたら、デプロイを実行したら、以下のURLでアクセスしてみてください。

```lang:アクセスURL
   /s/test.xls
```

するとXLSが表示（またはダウンロード）されると思います。

# グローバルなoutput_xls.jsを作成する
一つのXLSファイルに対して一つのサーバーサイドjavascriptを作成するのは何かと手間になるケースがあります。そういうときはxls作成用の共通したサーバーサイドjavascriptを作成するといいと思います。

```lang:Xls作成用のサーバーサイドjavascript
GET /s/output_xls?data=/hoge&template=/xls/person_template.xls&name=test.xls

// output_xls.js
module.exports = function () {

  var querystring = ReflexContext.querystring();

  // 各パラメータ取得
  var data_path = querystring.split('&')[0].replace('data=', '');
  var template_path = querystring.split('&')[1].replace('template=', '');
  var xls_name = querystring.split('&')[2].replace('name=', '');

  // リソースデータ取得
  var data = ReflexContext.getEntry(data_path);

  ReflexContext.toXls(data, template_path, xls_name);

};
```

こうすることで、引数により生成するエクセルを変更することができます。

以上でエクセル出力の説明を終わります。
WindowsでAtomが削除できない問題とその対策

## One Liner

Node.jsベースであるAtomのpackageには階層がとても深い[nested node_modules](https://github.com/nodejs/node-v0.x-archive/issues/6960)を生成するものがあるので、Winodwsの標準的な機能では[パス名の制約により](http://windows.microsoft.com/ja-jp/windows/file-names-extensions-faq#1TC=windows-7)削除できなくなる。

## 事の起こり

11月13日、[Atomの1.2がリリース](http://blog.atom.io/2015/11/12/atom-1-2.html)された日のこと。

その頃、会社でWindows8.1環境に入れたAtomがかなり不調で、またAtom本体の自動アップデートがかかるとインストール済みのpackageがAtomの最新バージョンに未対応というエラーメッセージを出す現象が頻繁に起こっていたので、1.2が出たのを機にAtomのクリーンインストールをすることにした。1.2ではElectronやらnode.jsなどのAtomの根幹的な部分でのアップデートがあるし。

さて、Windows環境でのAtomのアンインストール方法であるが、以下の手順を踏んだ。

1. まずいつもおなじみの手順、コントロールパネルの「プログラムのアンインストールまたは変更」でAtomを選択してアンインストール
2. さらにエクスプローラーからユーザーフォルダにあるC:\Users\xxx\\.atomを選択して削除、、、できない？

> 「フォルダーには名前が長すぎる項目が含まれていてごみ箱に移動できません」

なんですか、それ？


## 原因

1. インストールされたAtomのpackageはWindows環境ではユーザーフォルダのC:\Users\xxx\\.atom\package以下に配置される
2. このpackage（とりあえずhogeとする)がnpmのモジュールに依存している場合、そのモジュールはC:\Users\xxx\\.atom\package\hoge\node_modulesに配置される。
3. 配置されたnpmモジュールが別のnpmモジュールに依存している場合、そのモジュールは依存元のnpmモジュールのnode_modulesに配置される。hogeが依存するnpmモジュールをare,areが依存するモジュールをkoreとすると、koreが配置されるパスは以下のようになる

> C:\Users\xxx\.atom\packages\hoge\node_modules\are\node_modules\kore

このモジュールkoreが依存するモジュールをsoreとすると...というプロセスが繰り返されるとnode-modulesのネストがどんどん深くなる。以下はatom-beautify package以下にあるnode-modulesフォルダの例である。

> C:\Users\xxx\.atom\packages\atom-beautify\node_modules\atom-message-panel\node_modules\space-pen\node_modules\grim\node_modules\emissary\node_modules\es6-weak-map\node_modules\es5-ext\node_modules\es6-symbol

1.このnode-modulesのネストが深くなる現象はnode.jsの立場では即座に問題とはならない。Windows版のnode.jsはNTFSの長いパス名に対応している。許容されるパス名の最大長は32768文字で、実用上は十分な範囲と思われる。
2. 問題はWindowsのOSがNTFSの長いファイル名に対応していないことである。Windows環境では互換性維持のためにパスの最大長はパスは最大260文字までに制限されている。そのためWindowsのエクスプロラーやコマンドラインでは260文字を越えるパス名を生成できない。
3. やっかいなのはこの260文字制限が削除に対しても適用されることで、よってWindowsの標準的な機能の範囲では260文字を越えるパス名のファイルやフォルダーは削除できない。
4. その一方でAPIを使えば260文字を越えるパス名のファイルやフォルダーが生成できるので、node.jsなどの非標準的なアプリケーションが生成した260文字を越えるパス名のファイルやフォルダーが、エクスプローラーなどの標準的機能では削除できないという奇妙な現象が発生する。


これはnode.js方面ではnested node_modulesのWindows非互換性として知られている問題(ex https://github.com/nodejs/node-v0.x-archive/issues/6960 )であるが、この件について言及している日本語の文献は少ないようである。筆者はQAサイトの質問事例以外では見かけなかった。日本ではnode.jsというか先端的なJavascriptの開発者が開発環境として概ねMacOSXかLinuxを使っていてWindowsユーザーが少ないので[^1]、この問題に直面する機会が少ないからであろう。[^2]

## 対策

この長すぎるパス名の問題は多くの人が悩まされているようで、「Windows 長いファイル名　削除」というキーワードで検索すると多くの事例が出てくる。以下はQiita内の事例

[「フォルダーには名前が長すぎる項目が含まれていてごみ箱に移動できません」](http://qiita.com/rico/items/a54776163c91a390d210)

これらの知見を総合すると解決策は以下の三つに集約されるようだ

1. 長いパス名に対応したツールを使う
2. 長いパス名を削除するプログラムやスクリプトを書く
3. 長すぎるパス名の途中の階層のフォルダにネットワークドライブを割り当てて削除するパスの長さを260文字未満にする。

技術者としては当然2の方法でやるべきだろうが、筆者は面倒くさがりなので3の方法を用いた。といっても途中の階層にネットワークドライブを割り当てるのではなく、深いフォルダの先頭のあたりを移動して長すぎるパスの長さを少しづつ削っていくというやり方にしました。もっとも途中で削除プログラムを書いた方がよかったとかなり後悔しました。

というわけで、WindowsでAtomというかWindows環境以外から来たツールなり技術なりを使うといろいろ面倒な現象に遭遇しますが、めげずにがんばりましょう。

では皆さん、Merry Christmas!



[^1]: Paul Grahamの2007年の予言が未だに有効というのが驚かされるが、そろそろ賞味期限切れか。( http://www.paulgraham.com/microsoft.html )

[^2]: 未確認だがMacOS Xではパス名の長さが2024文字、ただし実用上は1024文字という制限があるらしいので似たような問題が起きる可能性はありうる。
Xamarin.Mac フレームワークの歩き方

[Xamarin Advent Calendar 2015](http://qiita.com/advent-calendar/2015/xamarin) 第24日目は，またもXamarin.Macの人しかわからないネタをお届けします。
##Problem
Xamarin界隈ではフレームワークという言葉がたくさん出てきます。
本稿でのフレームワークは，動作環境としてのFrameworkです。
本当はUI Frameworkもやりたかった。。。

##Target Framework
Xamarin.Mac ではターゲットフレームワークを3種から選択することができます。
![TargetFrameworks](https://qiita-image-store.s3.amazonaws.com/0/34563/65f51e71-dec6-2c0c-3259-101d14348b79.png "TargetFrameworksInXamMac.png")
それぞれの特徴と，ハマりポイントをご紹介します。
###tl;dr
これらは，

* 利用できるAPI範囲
* NuGet ターゲット解決の順序

に影響します。特に問題なければ，Mobile Frameworkにしましょう。
使える範囲は，Edit Referencesウィンドウで確認するのが手っ取り早いです。ここにすんなり出てきたら使えると。
![EditReferences](https://qiita-image-store.s3.amazonaws.com/0/34563/ed2c2755-3110-6689-c496-6d2975986a7f.png "EditReferences")

###Xamarin.Mac Mobile Framework
Mobileと銘打つとおり，iOS, Androidでの動作環境とほぼ同じです。
**リンクできるのはこれを選択したときだけです。**
`System.Configuration`，`System.ServiceProcess`といったまあいわゆる，そんなに使われていないだろうもの，モバイル環境で使わないであろうものはばっさりと切られています。
ただしXamarin.Macにおいては空実装の`System.Configuration`名前空間とそのAPIが残されている，らしいです。

>NOTE: An empty, stubbed-out version of the System.Configuration API has been included in Xamarin.Mac to avoid breaking some 3rd-party PCL files. So while the namespace is included, it is non-functional and should never be used in a Xamarin.Mac project.

ふんふん。試してみましょう？
![TypeLoadException](https://qiita-image-store.s3.amazonaws.com/0/34563/c09efbd9-0b60-9bf9-3138-a18f79b39ff7.png "TypeLoadException")
えっ？

NuGetパッケージは下記の順に参照解決されます。

```
Xamarin.Mac20 > Xamarin.Mac10 > portable-net45
```

いずれもパッケージ内にない場合は，パッケージのインストールに失敗します。
**つまり`net45`しかない場合はインストールに失敗します。**

###Xamarin.Mac .NET 4.5 Framework
ほとんどMobile Frameworkと同一です。ただほとんどのBCLを参照することができます（あくまでサブセットです）。
これと引き替えに，リンカーによる最適化は使えなくなります。
だいたいのNuGetパッケージ，サードパーティ製品を動作させることを目的としたフレームワークです，と明言されています。
含まれているアセンブリは[Supported Assemblies](http://developer.xamarin.com/guides/mac/advanced_topics/assemblies/)を参照してください。

**NuGetパッケージは`net45`が優先されます。**
従って，このフレームワークにも含まれないアセンブリを参照している場合 -- たとえば`System.Web`とか`System.Drawing`とか -- は，当然実行できません。
これらの参照を解除しても動作するライブラリに関しては動作させることができます。

`Mono`としてはサポートしているけど`Xamarin.Mac .NET 4.5`としてはサポートされてないライブラリが参照されてた場合はこんな感じにビルド時エラーが。
![BuildError45.png](https://qiita-image-store.s3.amazonaws.com/0/34563/c98cc2f4-50c6-0047-766b-fd1a4229f942.png "BuildError45.png")

あとは，`Xamarin.Mac .NET 4.5`でサポートされていても`Xamarin.Mac Mobile`でサポートされていない場合は，ターゲットを変更したときにこんな表示が出ます。
![AssemblyNotFound](https://qiita-image-store.s3.amazonaws.com/0/34563/73fcf59a-13a8-b1f0-f387-8b52842865ea.png "AssemblyNotFound")
NuGetパッケージ導入時も同様の表示が出るので，×表示が出たら何らか対策が必要な目安にはなります。

###Unsupported Framework(s)
Xamarin.Mac .NET 4.5でも足りないアセンブリを参照するときにはこれを使うことになります。つまりフルのMonoを使って動作させることができます。
ただしXamarin社が公式にサポートしないと明言しているため，サポートに泣きつくことはできなくなります。
当然リンクも動作しません。NuGetも`net45`優先で解決されます。

##Conclusion
これから作るならできるだけ`Mobile Framework`で。
それ以外は混乱のもとなのでできるだけ使わないほうがいいです。
NuGet パッケージを作られる方。できれば `Xamarin.iOS20+Xamarin.Mac20`とでもして，ご配慮いただけますと幸いです。
SourceTreeでSubversionを管理する

git-svnを利用して、SourceTreeでsvnを管理する方法について紹介します。

## 手順

- チェックアウトしたいディレクトリを作成
- チェックアウトしたいディレクトリにcd（ターミナル）
- 下記コマンド実行（ターミナル） 
 
``` 
git svn clone --prefix svn/ -s [URL]
```

- コマンド完了後SourceTreeで開く
    - SourceTreeのバージョンによってはコマンドを使用せず直接開けます。そちらのほうが楽ですが、エラーで失敗するようならコマンド使いましょう。

## コマンドの意味
- git svn clone __[URL]__  

  -> チェックアウト： init(初期化) + fetch　

- --prefix

  -> ブランチ名のプレフィックスをつける
（リモート側（svn）とわかりやすくなる）

- -s

  -> ルートディレクトリ以下が下記構成になっている場合のオプション  
__「trunk, branches, tags」__


## SourceTree設定

### システムのGitを使用する（デフォルトは内蔵のGit）
-> 環境設定 -> Gitのバージョン「システムのGitを使用する」を押下
※バージョン（1.5.6）の場合、内蔵のGitのバージョンが古かったのでプッシュ等でエラーが発生したため
     - システムのGitの場所
  下記コマンド実行（ターミナル）

```
which git
```
gitのパスが出てくるので、コピペする
  
### ローカルブランチをSVN（リモートブランチ）と揃える  
リモートブランチをダブルクリック -> ローカルブランチも作るかと聞いてくるので作る 
※「Trunk」はローカルブランチでは「master」となる  

## おわりに
もともとgit環境でSourceTreeを使っていました。

プロジェクトが変わってSubversion環境になりましが、Macでいまいちピンとくるクライアントがありませんでした。
そんなときSourceTree使えるよという話を聞き、本投稿の内容を実行した次第です。

基本的な操作（チェックアウト、コミット、プッシュ、プル…）は特に問題なく使えています。
ただし、自分の環境ではリモート側（svn側）のマージがエラーになってしまいます。
svnのディレクトリ構成が一般的な構成ではないのも原因のひとつかもしれません。
今のところはそこだけSourceTree以外でやってます。

SourceTreeに慣れていて、Subversionには不慣れな方だと日々の業務の負担が軽減されるかもしれません。
コマンドやその他ツールと併用しつつ、試してみていただければと思います。
クリスマスだからツクールMVで乙女ゲーを作って彼氏をゲットすることにした

今日はクリスマスイブですね。皆さんいかがお過ごしでしょうか。
私は職場近くのけやき坂のイルミネーションを見ていると心にブリザードが吹き荒れます。
ということで、せっかくなのでベータテスターに当選したツクールMVで乙女ゲーを作って彼氏をゲットすることにしました。
あまり技術的に深い記事ではありませんが、ツクールもエディタの一種だと思うのでこちらに投稿します。

##なぜ乙女ゲーなのか
ツクールなんだからRPGを作れよ!と言われそうなところですが、

* もともと乙女ゲーが好きでずっと前から作りたかった
 * 研修で乙女ゲーを作ったこともありますが時間の関係で作りきれなかった
* でも自分は絵がかけない
* そもそもゲームプログラミングの知識がない
 * web屋見習いが出自なので･･･

という状況だったのですが、そんな折にツクールMVのベータテスターに当選し「これで乙女ゲー作れるんじゃね?」となったのが発端です。
また、最近自分の中で乙女ゲー熱が盛り上がっていることもあり、せっかくクリスマス（暇）なのでこの機会に作ってしまいました。

##そもそも何ができれば乙女ゲーなのか

一言で乙女ゲーと言っても、さまざまな種類のものがあります。「金色のコルダ」や「ときめきメモリアル Girl's Side」、「遥かなる時空の中で」などの王道の恋愛アドベンチャー形式のものから、「うたの☆プリンスさまっ♪」や「アイドリッシュセブン」、「夢色キャスト」など音ゲーと組み合わさったものや、パズルゲーと組み合わさった「夢王国と眠れる100人の王子様」、店舗経営ゲーと組み合わさった「ときめきレストラン」など･･･。

<!-- 上記乙女ゲーの画像を引用したい -->

これらはすべて乙女ゲーと呼ばれるジャンルのゲームですが、自分がゲームを作った場合、どういうゲームで何ができれば乙女ゲーと呼べるのかという視点で、上記に挙げたゲームの共通点を探ってみました。

###素敵な異性が複数人出てきて恋愛できる
これは言わずもがなで譲れないところです。なぜイケメンでないのかというと、「学園ハンサム」や「はーとふる彼氏」などの例外があるからですが、これらも**れっきとした乙女ゲー**です。
ようは、イケメンでなかろうが、人間でなかろうが、素敵！と思える相手なら何でもいいってことです。いや乙女ゲーは懐が深い（適当）。

そして「複数人出てくる」という部分ですが、やはり恋をする相手は選べないと嫌ですよね。複数人から選ぶことによって、「私がこの人を選んだ」とより能動的にキャラクターに思い入れをしやすくなるのではないかと思います。

<!-- 上記乙女ゲーの画像を引用したい -->

###選択肢がある
これは乙女ゲーに限らないとは思いますが、選択肢があり、選んだ結果によりなんらかの効果があることも共通点です。
会話文中の選択肢でなくても、行動を選択（次は誰に会うのか、など）ができることも選択肢があることに含みます。

<!-- 上記乙女ゲーの画像を引用したい、ステージ選択なども選択肢の一部、として紹介 -->

###物語の重要部分でスチル（一枚絵）が表示される
主に彼との仲が進展したとき（抱きしめられたりなど）に表示される一枚絵も乙女ゲーの共通点です。特に、アドベンチャーゲームでは大体、プレイ後もこのスチルを見返すことができるよう&コンプリート要素としてスチル図鑑があったりします。

<!-- スチル図鑑 -->

##とりあえず作ってみた
というわけで、

* 素敵な異性が複数人出てきて恋愛できる
* 選択肢がある
* 物語の重要部分でスチルが表示される

という要素を取り入れてゲームを作ってみました!↓
[「村人Ａのクリスマスクエスト」](http://chipmunk-web.com/christmas-quest/)
![そのまんまなタイトル](http://f.st-hatena.com/images/fotolife/h/haruna_nishiwaki/20151223/20151223145311.png)

村人Ａがモンスター達をばっさばっさとなぎ倒し、クリスマスを一緒に過ごす相手を倒してゲットするというストーリーです。
![Ａ子は憂鬱なのです･･･](http://f.st-hatena.com/images/fotolife/h/haruna_nishiwaki/20151223/20151223145310.png)

###複数人出てくる異性と恋愛できます
攻略キャラは今のところ2人しか居ませんが･･･憧れの騎士団長と
![騎士団長](http://f.st-hatena.com/images/fotolife/h/haruna_nishiwaki/20151223/20151223145307.png)

ぶっきらぼうだけど優しい幼馴染。
![幼馴染](http://f.st-hatena.com/images/fotolife/h/haruna_nishiwaki/20151223/20151223145308.png)

###選択肢があります
文中の選択肢はもちろん、基本的に24日までは自由行動なので好き勝手できます。
![選択肢](http://f.st-hatena.com/images/fotolife/h/haruna_nishiwaki/20151223/20151223145309.png)
ちなみに、普通に24日越えられる抜け穴（不具合というか･･･面倒くさくて穴をふさがなかった）があるので、ひたすらモンスターを狩り続け、ゲームを終わらせないという選択肢も･･･って違うか。

###そしてスチルも･･･
そしてもちろんスチルもあるよ･･･と言いたかったところなのですが、もうお気づきかと思いますが私は**絵が描けないんです!!**
ということで、エンディング時のスチルは**絶賛募集中です!!!**

##まとめ
ここまでダラダラと書いてきましたが、言いたいことを一言でまとめると、**ツクールで乙女ゲーは作れます！**

乙女ゲーを作りたいけど、自分の作りたいゲームはADV系のエディタでは難しい･･･かといってUnityは高機能すぎて学習コストが高い･･･と感じている乙女のみなさん！ツクールMVで乙女ゲーを作りましょう!!
GASでAdmin SDKを利用する（Reports編）その1

## Reports APIについて
公式ドキュメント：https://developers.google.com/admin-sdk/reports/v1/get-start/getting-started

Reports APIは、Google Appsの利用状況を取得するAPIです。指定するパラメータによって、以下の利用状況を取得する事ができます。

* admin（管理者イベント）
* calendar（カレンダー）
* drive（Google Drive）
* groups（Google Groups）
* login（ログイン）
* token（OAuthを使った認証）

## 今回は、Activitiesを取得してみる。
今回は、[Activities](https://developers.google.com/admin-sdk/reports/v1/reference/activities/list)を使って、すべてのイベントのリストを取得します。


## 今日のコード.gs
今回は、Spreadsheetに出力するようにしました。eventの数が複数になるようなので、ちょっとソースコードは整理されていない感じになっています。

```js:コード.gs
function myFunction() {
  var applicationNames = ["admin", "calendar", "drive", "groups", "login", "token"];
  var cells = [];
  
  cells.push(["id", "actor", "ipAddress", "ownerDomain", "event.name", "event.type", "event.parameters"]);
  for(var name in applicationNames) {
    var pageToken = "";
    Logger.log(applicationNames[name]);
    do {
      var page;
      if(pageToken != "") {
        page = AdminReports.Activities.list("all", applicationNames[name], {pageToken: pageToken});
      } else {
        page = AdminReports.Activities.list("all", applicationNames[name]);
      }
      pageToken = page.nextPageToken;
      if(page.items) {
        for(var i = 0; i < page.items.length; i++) {
          var rows = [];
                    
          if(page.items[i].events.length > 0) {
            for(var j = 0; j < page.items[i].events.length; j++) {
              rows.push(page.items[i].id);
              rows.push(page.items[i].actor);
              rows.push(page.items[i].ipAddress);
              rows.push(page.items[i].ownerDomain);
              rows.push(page.items[i].events[j].name);
              rows.push(page.items[i].events[j].type);
              rows.push(page.items[i].events[j].parameters);

              cells.push(rows);
            }
          } else {
            rows.push(page.items[i].id);
            rows.push(page.items[i].actor);
            rows.push(page.items[i].ipAddress);
            rows.push(page.items[i].ownerDomain);
            rows.push("なし");
            rows.push("なし");
            rows.push("なし");
            
            cells.push(rows);
          }          
        }
      }
      Logger.log(pageToken);
    } while(pageToken != undefined);
  }
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  sheet.getRange("A1:G" + cells.length).setValues(cells);
}
```

## 実行時に承認
ほぼ毎回のことですが、実行時に承認をする必要があります。
![許可のリクエスト.png](https://qiita-image-store.s3.amazonaws.com/0/11925/c52e4e96-c3ef-bf39-3e6d-0d181b9de454.png "許可のリクエスト.png")

## 実行結果
今回は利用頻度が少なすぎたのか、あまりデータが取得できなかったのと、リアルタイムでActivityのログが取得できるわけではないようです。あまりに取得結果が少なかったので、カレンダーを追加してみたのですが、すぐに取得できるようにならなかった。

## 結論
Google Appsはしっかり使おう！

## Disclaimer
* この記事は個人的なものです｡私の雇用者とは全く関係はありません｡（一応つけておきます）
BiocStyleの紹介

[R Advent Calendar 2015](http://qiita.com/advent-calendar/2015/r-rstudio)の第24日目です。


# BiocStyleとは
Rでは、

```r
?plot
help(plot)
```

のようなオブジェクト毎のヘルプページだけでなく、

```r
install.packages("foreach")
library("foreach")
vignette("foreach")
```

のように、vignette関数で出力されるpdfファイルで、そのパッケージの基本的な使用方法が習得できる場合があります（もちろんパッケージによるが）。
このpdfファイルの事をvignette（ビネットまたは、ビニエット）といいます。

特にバイオインフォマティクスに関するパッケージを公開しているレポジトリBioconductorでは、このvignetteの作成が半ば義務付けられています。

このvignetteは、もともとは、シンプルなフォーマットだったのですが、Bioconductor 2.13から登場した、BiocStyleパッケージによって、より洗練された見た目になりました。

例えば、AnnotationDbiパッケージは、Bioconductor 2.14からBiocStyleを導入しており、Bioconductor 2.13時点のvignetteと比較すると、フォントや、色、レイアウト等で幾つも見やすい工夫がされていることがわかります。

[AnnotationDbiのvignette（Bioconductor 2.13、BiocStyle導入前）](http://bioconductor.riken.jp/packages/2.14/bioc/vignettes/AnnotationDbi/inst/doc/AnnotationDbi.pdf)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/17038/ef1b7a68-8052-fa9b-9340-00e86aa7e607.png)

[AnnotationDbiのvignette（Bioconductor 2.14、BiocStyle導入後）](http://bioconductor.riken.jp/packages/2.14/bioc/vignettes/AnnotationDbi/inst/doc/AnnotationDbi.pdf)
![1.png](https://qiita-image-store.s3.amazonaws.com/0/17038/2ec2369c-201c-1b03-15f1-bff8d8bac46a.png)


また、vignetteをpdfではなく、htmlで出力する場合もあり、これもBiocstyleの機能です。

[paxtoolsrのvignette](https://bioconductor.org/packages/release/bioc/vignettes/paxtoolsr/inst/doc/using_paxtoolsr.html)
![1.png](https://qiita-image-store.s3.amazonaws.com/0/17038/d1e2682f-5e10-36d4-6da8-ea58d8b04537.png)


# BiocStyleの使い方
vignette自体の作成方法は、[biopapyrusのvignetteのページ](http://stat.biopapyrus.net/dev/vignette.html)などを読むと良いです。
実態は.Rnw（Sweaveファイル）がパッケージ内に置かれていて、vignette関数で呼ばれているだけです。

vignetteを更にBiocStyleにしたい場合は、パッケージのDESCRIPTIONファイルに

```
Suggests: BiocStyle
```

と記述した後、.Rnwの\documentclass{article}と\begin{document}の間に、

```
<<style-Sweave, eval=TRUE, echo=FALSE, results=tex>>=
    BiocStyle::latex()
    @
```
と記述すればいいだけです。

詳細はBiocStyleの[vignette](https://www.bioconductor.org/packages/3.3/bioc/vignettes/BiocStyle/inst/doc/LatexStyle.pdf)を読みましょう。
Magento2のVagrantBox「VAM2-box」を配布開始しました

Magento温泉合宿@湯河原からこんにちは。

新兵＠Magento日本コミュニティの@kzkiq2ndです。

[Magento Advent Calendar 2015](http://www.adventar.org/calendars/931) 23日目は、作業報告になります！

## VAM2がboxになりました！
[VAM2](https://github.com/Magento-Japan/VAM2)で構築されたvmboxを、Vagrantのboxリポジトリ[Atlas](https://atlas.hashicorp.com/)にMagento2のboxを登録しました。（[kzkiq2nd/vam2](https://atlas.hashicorp.com/kzkiq2nd/boxes/vam2)）

回線速度にもよりますが、boxをダウンロードしてしまえば、どなたでもVagrantを利用して__Magento2.0+サンプルデータ__の入った仮想環境を何度でもすぐにつくることができます。

## 何に使えるのか？
VAM2の最終的な目標は__「誰でもすぐに手に入るMagento2開発環境」__を日本語圏にて提供することにあります。

現在の[vam2-box(0.0.2)](https://atlas.hashicorp.com/kzkiq2nd/boxes/vam2)は、
#### __とりあえずMagento2がどんなものか試してみたい__
といった程度に利用できます。

今はMagento公式が2.0.1に向けて内部リポジトリでガンガン開発を続けている、という状況もあり安定性に欠くため、__「参考程度に動かして壊せるMagento2環境」__と理解ください。

## 利用方法
Vagrantにboxをaddしてupすれば、Magento2仮想環境を作ることができます。動作環境は`vagrant 1.7.4`+`virtualbox`になります。

## 利用方法
0. Vagrant(1.7.4)のインストール
これに関しては[公式](https://www.vagrantup.com/downloads.html)、もしくはググって用意ください。

1. Vagrant boxの追加(1.14GBと重いので注意）
`vagrant box add kzkiq2nd/vam2`

2. Vagrant の初期化
`vagrant init kzkiq2nd/vam2`

3. Vagrantfileの設定
ネットワークの設定などはお好みで

4. Vagrant の起動
`vagrant up`

## 仕様
[DevDocs](http://devdocs.magento.com/)インストールにほぼ準拠（tar.gz版）しており、CentOS7.1 + PHP5.6 + MariaDB10にMagento2 + SampleDataをセットアップしたboxになります。

管理画面URL = `/admin/`
管理ユーザー = `admin`
管理パスワード = `admin123`

DBネーム = `magento2_db`
DBユーザー = `magento2_db_user`
DBパスワード = `magento2_db_pass`

## 今後
まず自分が欲しいという意味の__「誰でもすぐに手に入るMagento2開発環境」__という方向性で手を入れていき、適当な区切りでMagento日本グループのアカウントで配布いたします。

以上になります！

[明日はMomokoさんお願いします！](http://www.adventar.org/calendars/931)