OmniAICreator/Qiita-1.07M huggingface dataset:
Confluenceでも「Qiitaのあれ」的な表示を出したい！




[Atlassian Advent Calendar 2015](http://qiita.com/advent-calendar/2015/atlassian)の12/3枠で参加させていただきます、@akiko-pusu と申します。どうぞ宜しくお願いいたします。

### 20160826 追記

こちらの記事（実際には、Bitbucket Snippets) に掲載している方法は、オンプレミス版（自分たちの管理対象のサーバにインストールした環境）で検証した方法になります。

- OnDemand (Cloud) 版では、管理権限その他の制約で、設定ができない可能性がありますので、ご了承ください

### 今回の内容について

管理者じゃないんだけれど、Confluenceのページを色々カスタマイズしたい...という方は多いのではないかと思います。
方法は色々あるかと思いますが、今回は、「Qiitaのあれ」的な表示を出す方法を書いてみます。

「あれ」とは、こんなの。

![konnnano.jpg](https://qiita-image-store.s3.amazonaws.com/0/27976/9b589227-6763-3272-13fe-604013dfc5da.jpeg "konnnano.jpg")

つまり、1年以上そのページが更新されていなかったら出てくるメッセージですね。
個人的にはこのメッセージが好きなので、日頃お世話になっているQiitaリスペクトとして、題材とさせていただきました！

### BitbucketのSnippetsに書いてみました！

さて、せっかくAtlassian関連のアドベントカレンダーなので、本文は **[BitbucketのSnippets](https://bitbucket.org/snippets/akiko_pusu/rLMy7)** を使って記事を書いてみました。

#### Confluenceネタはこちらを見てね！

外部リンクになってしまって申し訳ございませんが、よかったらBitbucketのSnippetsはどんな感じかの確認も兼ねて、ご訪問いただけると幸いです :)

- [『Confluenceのページに最終更新日から1年以上が経過しています』的な表示を出したい！](https://bitbucket.org/snippets/akiko_pusu/rLMy7)

流れ的にはこんな感じです。

- きっかけ
- スペースカスタマイズでやってみる
 - 設定例（スクリーンショット）
 - 使ったJS / CSSのソース
 - Confluence上でアイコンフォント的なものを使いたい場合
- この方法での注意点

今回は管理者でなくとも（パーソナルスペースなど）自分で管理できるスペースの範囲内でできる方法について触れています。

一部、AJSやプロダクトデザインの情報にも触れています。
できれば同じものを、プラグインにして組み込む方法もやってみて紹介したいなあと思っています。


### Snippetsで記事を書いて公開する際のメモ

さて、『Qiita外部には遷移したくないなあ...』というみなさま向けに、申し訳ないので一応AtlassianネタとしてSnippetsについて触れておきます。

基本はGistと同じようなサービスです。

- Bitbucketの機能の一部です
 - 無料でも利用できます
- プライベート/パブリックの切り替えが可能です
- 言語がプルダウンで選択できます（ここはイイ！）
- Markdownはほぼ同じ感じ？
- 残念ながらQiitaからSnippetsにコードの一部は投稿できない
- 各種サイトに埋め込みできるプラグインなんかはまだ少ないかも？


![snippets-edit-screen.jpg](https://qiita-image-store.s3.amazonaws.com/0/27976/ddc6508d-71c5-3415-dd1b-119bc82fc96a.jpeg "snippets-edit-screen.jpg")

基本はGistと同じノリで書いていけばいいのですが、今回は最初プライベート設定にしておき、コツコツ修正を重ねていきました。

また、画像については基本的にWebからドラッグ&ドロップでもローカルからコミットでも追加できるのですが、Markdownで埋め込む際に、本文からの相対パスのような指定ができないので、先に画像をリポジトリに追加して、表示用のURLを確認してから、Markdown側にリンクを貼ったりする作業をしています。

なので、公開する前には、ちょっと恥ずかしい修正履歴もふくめ履歴を綺麗にしておきたい...。

![git-with-sourcetree.jpg](https://qiita-image-store.s3.amazonaws.com/0/27976/fbc12b47-832e-1d95-b15c-5da0e4458706.jpeg "git-with-sourcetree.jpg")

禁じ手かもしれませんが、今回は公開前に手元にCloneしてきて、コミットをまとめてしまい、リモートブランチに強制pushして歴史を書き換えています。

まだGistほど利用は広がっていないと思いますが、Confluenceも含め埋め込みしやすいライブラリやプラグインが増えてくると良いですね！


## AdventCalendarについて

ということで、Atlassian Advent Calendar 2015 の 12/3の記事とさせていただきました。

- 12/2の記事は、[tnagasawaさん](http://qiita.com/tnagasawa) の [JIRAとインベーダーゲーム](http://qiita.com/tnagasawa/items/6d165d33d8b0dd6c347f) でした！
- 12/4の記事は、[ninuyama](http://qiita.com/ninuyama) さんです。どうぞ宜しくお願いいたします！
Vueifyの簡単お試しセットを作った

![vue-cristmas.png](https://qiita-image-store.s3.amazonaws.com/0/32596/deeeaf07-2451-f21a-d47f-cceac962a9f0.png)

[Vue.js Advent Calendar 2015](http://qiita.com/advent-calendar/2015/vue)の二日目です。
今回は、**Vueifyのお試しに便利なツール**を作ってみました。

# Vueifyについて

Vueify、使ってますか？

Vueifyはコンポーネントを定義するのに便利ですが、最近ではホットリローディングに対応し、開発体験の向上にも大きく寄与するものになっています。エディタでゴリゴリvueファイルを書き換えると、ブラウザ上でSPAがリアルタイムに組み上がっていくのは、単純に開発速度が上がりますし、実際感動します。

Vueifyは便利なのですが、セットアップがなかなかに大変です。
おすすめは[vueify-example](https://github.com/vuejs/vueify-example)をgit cloneして使うことですが、今回は、もっと手軽にvueifyを体験出来るエディタを作ってみました。

# リポジトリ

こちらです。
https://github.com/hashrock/vueify-editor


# 動作の様子

![dWG4Wtvj5Y.gif](https://qiita-image-store.s3.amazonaws.com/0/32596/16ed6692-eeec-6dd5-81c0-67f758440a8a.gif)

# インストール

下記のコマンドを実行します（Windowsでは動作しないかもしれません）。

```bash
git clone https://github.com/hashrock/vueify-editor
cd vueify-editor
npm install
npm start
```

その後、下記アドレスを開いて下さい。
http://localhost:3000

※browserifyのビルドに時間がかかるので、ページが空白になっている場合はリロードして下さい。

# 使い方

![スクリーンショット_2015-12-02_18_20_37.png](https://qiita-image-store.s3.amazonaws.com/0/32596/caf492a1-1d12-eb0d-3342-4d42586f54c7.png)

左側の画面は、app.vueという一枚のvueファイルを編集するエディタになっています。
ここにHTMLやCSS, JSを入力すると、数秒してbrowserifyのビルドが実行され、即時に見た目に反映されます。

（※dataの反映には、ブラウザをリロードする必要があります。vueifyのホットリロードは、dataの内容はリアルタイム反映されない仕様となっています。イニシャライズされてしまうと、逆に面倒という考えからでしょう。）

# おわりに

ファーストプロトタイピング用のエディタとして使えるかもしれません。

複数のvueファイルを構成するときはいずれにしろ、ちゃんと開発環境を整える必要があります。とりあえずお遊び用ですね。

なお、このエディタ自体もVue.jsで作成されています。Codemirrorとの連携が無理やりな感じですが…まあ動くのでいいとしましょう。では、明日のAdvent Calenderもお楽しみに！
zip 覚書

# Usage:
```
zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
```

list から zipfile のエントリーを追加または置換する。
zipfile と list が省略された場合 zip は標準入力から標準出力へ圧縮を実行する。

## zip -f
更新のあったファイルのみを更新する。

## zip -u
更新のあったファイルまたは新規作成されたファイルのみを更新する。

## zip -d
zipfile からエントリーを削除する。

## zip -m
ファイルを zipfile 内へ移動し、元ファイルを削除する。

## zip -r
ディレクトリを再帰的に圧縮する。

## zip -j
ディレクトリ名を記録しない。

## zip -0
圧縮は実行せず、 zipfile への保存のみを実行する。

## zip -l
LF を CR LF へ変換する。

## zip -ll
CR LF を LF へ変換する。

## zip -1
通常の圧縮を実行する。

## zip -9
圧縮率の高い圧縮を実行する。

## zip -q
メッセージを表示しない。

## zip -v
zip のバージョンまたは実行結果の詳細を表示する。

## zip -c
一行コメントを追加する。

## zip -z
zipfile コメントを追加する。

## zip -@
標準入力から名前を読み込む。

## zip -o
make zipfile as old as latest entry
(???)

## zip -x
指定したファイルを除外して圧縮する。

## zip -i
指定したファイルのみを圧縮する。

## zip -F
zipfile を修復する。

## zip -FF
より本格的に(?) zipfile を修復する。

## zip -D
ディレクトリエントリを追加しない。

## zip -A
自己解凍圧縮ファイル(.exe)を作成する。

## zip -J
zipfile の接頭辞を記録しない。

## zip -T
zipfile の整合性をテストする。

## zip -X
追加ファイル属性を除外する。

## zip -y
ファイルの参照の代わりにシンボリックリンクを保存する。

## zip -e
パスワードを設定し、暗号化する。

## zip -n
指定した接尾辞を持つファイルを圧縮しない

## zip -h2
より詳細なヘルプを表示する。
Go言語をWindows 8.1にいれてみたよ！

## どうしたって？？
避けてきたGoで、サーバーサイドをやることになってな・・・。
なぜWindowsでしかも10じゃないのかとかはお察しください。

## 方法
1. msiなインストーラでインストール
2. Zipを展開

　
1. でお願いします。

## 手順
1. インストーラでインストール
2. GOPATHの設定
3. 作業用ディレクトリ作成
4. Hello!!

たった４手順！

## 1. インストーラを使ってインストール
Goの日本語[公式サイト](http://golang-jp.org/doc/install)からインストーラをダウンロード。

実行して、インストール。インストール先は変更できる。
このとき、ついでに環境変数`GOROOT`と`Path`を勝手に追記してくれる。

## 2. GOPATHを設定
Goのお作法として、GOPATHで指定したディレクトリを作業用スペースとして使います。
これは自分で決めないといけない。
goのインストール先のどこかに作るのが基本だけど、インストール先と全く一緒じゃだめ。
GOROOT直下じゃだめってことです。
今回はこんな感じ。
(12/3 追記 ココ書いてなかった・・・・)

```cfg:.gitconfig
[ghq]
  root = D:/Documents/Projects/_ghq
```

## 3. 作業用ディレクトリ
GOPATHで指定したディレクトリ内に、公式で指定されてるディレクトリを３つ作ります。
* bin/
* pkg/
* src/
の３つ。srcはもちろんソースコード。あと２つはビルド後の生成物が入ります。
詳しくは、公式サイトの[イントロダクション](http://golang-jp.org/doc/code.html)で！

ここらへん、自動で作ってくれてもいいと思うんだ。

## 4. Hello,Golang!
ようやくHelloWolrd!

まずは、新しいディレクトリを作りましょう。
`github.com/username/hello`
こんな感じで。

Goでは、オープンソースコードを扱うことを意識した作りになっていて、外部ライブラリなども同じような形式で配置されます。

___
(12/3　追記)
__外部ライブラリの所得方法__
たとえば`https://github.com/username/app`にソースがあるライブラリを使いたいとして

```shell:
$ go get github.com/username/app
$
```
とします。こうするとダウンロードからインストールまで全部してくれます。何も表示されないけど、正常な動作です。
このときどこにダウンロードされるかというと、
`GOPATH/github.com/username/app`
内。ディレクトリ名を揃えておくと何かと便利だと思います。
___


無論、githubとかはつけなくてもいいし公開する必要もないんだけど、名前がかぶると困るのでユニークになるようにしましょう。

そしたら、ディレクトリ下に以下のファイルを作って、、、

``` go:
package main

import "fmt"

func main() {
	fmt.Printf("Hello, Golang!.\n")
}
```

`go install github.com/user/hello`

を実行。パスを指定していますが、このパスにいる場合は、`go install`だけで大丈夫。

そして、`hello`を実行すると、

```
```

ちゃんと表示されましたね！
これでGo導入おしまい。
Mavenでビルドする際にpomによく書くことメモ

Mavenでビルドする際に、Pom.xmlによく書くことメモ。

# ソースコードのエンコード指定

```
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>
```

エンコードの指定は

```
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
```
というエラーを無くすため。

javaバージョンはmaven-compiler-pluginに渡して、JDK8でビルドさせるため。

# コンパイルオプション付加用の変数

```
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <compilerArgument>${compilerArgument}</compilerArgument>
                </configuration>
            </plugin>
        </plugins>
    </build>
```

compilerArgumentはコンパイルオプションを追加で指定するため。

というのも

```
 [javac] 注:詳細については、-Xlint:deprecation オプションを指定して再コンパイルしてください。
```

といったメッセージがコンパイル時に出ることがあるため、mvnコマンド時に上記のオプションを渡せるようにしたいので。

実際にコンパイルオプションを付ける場合は、以下のようにする。
```
$ mvn clean compile -DcompilerArgument=-Xlint:deprecation,unchecked
```

Xlintにはカンマ区切りで複数指定できるようだ。
【しずおかアプリ部】活動ログ　第12回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/46bce21c-62c3-ab29-b435-c63bcfef065a.jpeg)


■タイトル
第１２回



■開催日
２０１５年１１月２８日（土）　１６：００～１８：００



■参加者
８名



■活動内容（概要）
・監査法人トーマツが開催している「Morning Pitch in 静岡」の案内

・部員さんプレゼン「Arduino入門 ～センサとUnityをつないで遊んでみよう～」
　「第2回 LED点滅・スイッチ編」

・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム　～壊す対象を置いて当たり判定をとろう編～」

・部員さんプレゼン「Unityのエディタ拡張入門」

・菅原プレゼン「Unityはじめるよ　～すごいよサウンド機能　実践編～」
　※時間の都合により次回に繰り越し





■活動内容（詳細）
・監査法人トーマツが開催している「Morning Pitch in 静岡」の案内
　「Morning Pitch in 静岡」は静岡県内のベンチャー企業が取り組んでいる事業をプレゼンする場。
　2015年12月16日に開催される「Morning Pitch in 静岡」では「音」に関する技術を紹介する。
　参加費無料で新しい技術に触れる事ができ、その後に名刺交換会もあるので非常に有用な場である。
　参加申し込みはこちらから
　https://tohmatsu.smartseminar.jp/public/seminar/view/2762



・部員さんプレゼン「Arduino入門 ～センサとUnityをつないで遊んでみよう～」
　「第2回 LED点滅・スイッチ編」
　
　ブレッドボード、素子、LED、スイッチなどの部品の説明。
　それらの部品を使ってまずは、Arduino無しでLEDを光らせる回路を紹介。
　そして、Arduinoを使ってLEDを光らせる方法を紹介。
　Arduinoの入出力のPINの設定を行い、入力判定と出力を行うプログラムを説明。

　資料：<A HREF="http://monolizm.com/sab/pdf/第12回_プレゼン資料(LED点滅・スイッチ編).pdf">第12回_プレゼン資料(LED点滅・スイッチ編).pdf</A>

　
　ゆるキャラ「今川さん」のサウンドシステムを進化させるための方法の相談。
　現状は、外部操作で音を鳴らすので、「今川さん」の動きとのズレが問題となっている。
　Arduinoに「SDカードの音を鳴らすシールド」を装着する方法を提案頂いた。
　スイッチと組み合わせれば、遠隔操作不要で鳴らせるので、ズレが解消できる可能性あり。

　資料：<A HREF="http://monolizm.com/sab/pdf/第12回_プレゼン資料(SDカード).pdf">第12回_プレゼン資料(SDカード).pdf</A>





・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム　～壊す対象を置いて当たり判定をとろう編～」
　プログラム上で壊す対象を生成。
　それに物理演算用パラメータを設定することで、挙動を制御する。
　まだパラメータの単位は未調査のため、今回はとりあえず感覚で値を設定。
　衝突検知用のコールバック登録を行い、無事あたり判定を検出できた。
　物理演算の効いたオブジェクトが動き続けてしまうなど、
　ゲームとして成立させるためには、色々な制御が必要と思われる。

　プロジェクト一式：http://monolizm.com/sab/src/AngryChicken12.zip

　資料：<A HREF="http://monolizm.com/sab/pdf/第12回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム　～壊す対象を置いて当たり判定をとろう編～).pdf">第12回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム　～壊す対象を置いて当たり判定をとろう編～).pdf</A>





・部員さんプレゼン「Unityのエディタ拡張入門」
　C#の機能である「属性(Attribute)」を利用して、エディタを拡張することが可能。
　インスペクタビューの入力ボックスを拡張することで、
　非常に使いやすいインターフェースにすることができる。
　想定外の値を入力を防いだり、使いやすさが向上するので、
　デザイナーも利用することが多いUnityではかなり有用。

　他には、メニュー操作などをトリガーにして、自動でプログラムを実行させる方法も紹介。
　おまけで、キャッシュの話、LINQの話も。

　資料：<A HREF="http://monolizm.com/sab/pdf/第12回_プレゼン資料(Unityエディタ拡張入門).pdf">第12回_プレゼン資料(Unityエディタ拡張入門).pdf</A>
ひさしぶりのHello world ~ Go編 ~


「Hello world」を出力するコードを書くのは何年ぶりだろうか。こんなしょうもない記事を書くのはどうかと思うが、テンションが上がったので、書いてしまった。

# 下準備
## Goのインストール
下記のページから適切なソースをダウンロードする。
https://golang.org/dl/

```bash
$ wget https://storage.googleapis.com/golang/go1.5.1.linux-amd64.tar.gz
$ tar xvzf go1.5.1.linux-amd64.tar.gz
```

`.bashrc`等に環境変数を設定する。PATHは適宜、ソースを解凍した場所に変えてください。

```bash:.bashrc
export GOROOT=$HOME/go
export GOPATH=$GOROOT/packages
export PATH=$PATH:$GOROOT/bin
```

`.bashrc`を読み込む

```bash
$ source .bashrc
```

これでインストール完了です。goコマンドが使えるようになると思います。

```bash
$ go
Go is a tool for managing Go source code.

Usage:

        go command [arguments]

The commands are:

        build       compile packages and dependencies
        clean       remove object files
        doc         show documentation for package or symbol
        env         print Go environment information
        fix         run go tool fix on packages
        fmt         run gofmt on package sources
        generate    generate Go files by processing source
        get         download and install packages and dependencies
        install     compile and install packages and dependencies
        list        list packages
        run         compile and run Go program
        test        test packages
        tool        run specified go tool
        version     print Go version
        vet         run go tool vet on packages

Use "go help [command]" for more information about a command.

Additional help topics:

        c           calling between Go and C
        buildmode   description of build modes
        filetype    file types
        gopath      GOPATH environment variable
        environment environment variables
        importpath  import path syntax
        packages    description of package lists
        testflag    description of testing flags
        testfunc    description of testing functions

Use "go help [topic]" for more information about that topic.
```


# Hello world
`hello.go`を作成して、下記のように編集します。

```go:hello.go
package main

import "fmt"

func main() {
  fmt.Printf("Hello world\n")
}
```

`fmt`は、標準出力、標準入力が実装されているパッケージです。そのため、`import`する必要があります。
`package main`はなんとなく意味はわかるんですが、簡単に調べた結果、
>The first statement in a Go source file must be 
package name

とか

>Executable commands must always use package main. 

しか書かれていたので、`main`関数をパッケージ化してくれるんだろうｗぐらいの認識です。


最後にコンパイルと実行

```
$ go run hello.go
Hello world
```
runコマンドはコンパイルと実行してくれるコマンドです。
下記のようにすると、コンパイルして実行ファイルを作成、実行もできます。

```bash
$ go build hello.go
$ ls 
hello hello.go
$ ./hello
Hello world
```

# 参考
- [お盆なのでGo言語を触ってみた 〜 hello, world 編 〜](http://qiita.com/isseium/items/48dce58b64516c70ceb1)
- [Goをインストールし、Vimで書く環境を整えるまでの手順](http://qiita.com/uchiko/items/4c186292f007535116cc)
- [fmtパッケージ](http://golang.jp/pkg/fmt)

# あとがき
こういう記事は、普及する前に書きたいね。
Rigidbody2DでLOS追跡

GameAIの勉強がてらUnityを使って敵を追跡するアルゴリズムを実装してみた。

LOS追跡、Line-of-Sighは的に対して最短距離で追い込むようなものです。
仕組みは非常に簡単でプレイヤーとのVectorの差分を計算し、その方向に力を加えるだけです。

実際のコードはこんな感じ。

``` c#
using UnityEngine;
using System.Collections; 

public class LosEnemyControlScript : MonoBehaviour {
    //追跡対象
    public GameObject objTarget;

    //今までいた位置を保持
    public Vector2 prev; 

    //初期化処理
    void Start () {
        prev = transform.position;
    }

    void Update () {
        Move(); 
    }

    //移動関数
    void Move(){
        //ユーザの場所を特定
        Vector2 Predetor = objTarget.transform.position;

        float x = Predetor.x;
        float y = Predetor.y;
        //追跡方向の決定
        Vector2 direction = new Vector2(x - transform.position.x, y - transform.position.y).normalized;
        //ターゲット方向に力を加える
        GetComponent<Rigidbody2D> ().velocity = (direction * 4);

        //本体の向きを調整
        Vector2 Position = transform.position;  
        Vector2 diff = Position - prev;
        if (diff.magnitude > 0.01) {
            float angle = Mathf.Atan2 (diff.y, diff.x) * Mathf.Rad2Deg - 90;
            transform.rotation = Quaternion.AngleAxis (angle, Vector3.forward);
        } 
        //次回角度計算のために現在位置を保持
        prev = Position;
    }
}
```

これを動かすとこんな感じになります。
<img src="https://i.gyazo.com/3e9c44e18167c50eea2196928f117a5a.gif" alt="LOS追跡" width=500px>

かわいらしいですね♪
JPCERT/CC のRSS 配信を読む

12月02日、現在、「google.feeds 」が、動かない。
[jsdo](http://jsdo.it/ohisama1/AVKK)


サイバーセキュリティ注意喚起サービス (icat) を利用する。
[jsdo](http://jsdo.it/ohisama1/EBAP)
ghq get は -p オプションでssh cloneができる

今まで、ghq getするときは

gitプロトコルの場合
```
ghq get foo/bar
```

sshプロトコルの場合
```
ghq get git@github.com:DQNEO/myrepo
```

していて、後者のURLフル入力が面倒だなと感じていました。

ですが実は -p オプションというのがあって、これをつけるとsshプロトコル でcloneしてくれるようです。

```
ghq get -p DQNEO/myrepo
```

べんり！！


(しかし `-p`ってのが若干分かりにくいような気がする。`-s`とか`--ssh`ではダメだったのだろうか。とつぶやいてみる)
RPi / CentOS > python > 実行環境の区別 > import os / print os.uname() > raspberrypiを含むかどうか

```txt:動作確認
Raspberry Pi2 + raspbian
CentOS 6.5
```

pythonコードから実行環境がCentOSなのか、RaspberryPiなのかの区別をしたい。

参考
http://raspberrypi.stackexchange.com/questions/5100/detect-that-a-python-program-is-running-on-the-pi

```151202b.py
import os
print os.uname()
```

```txt:RaspberryPi2での結果
$ python 151202b.py
('Linux', 'raspberrypi', '4.1.7-v7+', '#817 SMP PREEMPT Sat Sep 19 15:32:00 BST 2015', 'armv7l')
```

```txt:CentOS上での結果
$ python 151202b.py
('Linux', 'localhost.localdomain', '2.6.32-431.el6.i686', '#1 SMP Fri Nov 22 00:26:36 UTC 2013', 'i686')
```

raspberrypiというキーワードを含むかどうかでRaspberry Piかどうかは分かりそう。
Rで天気と気温をスクレイピング（デフォルト東京）

# 気象庁にダウンロードサイトがありますが
気象庁にもっとよいダウンロードサイトがあることに、作ってから気が付いたのですが、あえてRでYahoo!から過去の天気を取得します。
Windowsで動かす想定なのでところどころにiconvが入っていますが、Linux等の環境の場合は"cp932"->"utf-8"にする必要があります。

※iconvによって、html_nodesの結果（単純な文字列のリストではない！）が単純な文字列のリストになるみたいなので、iconvが本質的に意味のある操作になっている箇所があります。取得の仕方がhtml_textだったり文字列置換だったりしますが、統一のとれていないクソコードでごめんなさい。。。

```r:weather.R
library(rvest)
library(stringr)
library(plyr)
library(dplyr) # plyrだけでいいかも

getYahooWeather <- function(y, m, url.base = "http://weather.yahoo.co.jp/weather/jp/past/13/4410.html"){
  # 東京の天気を取得
  # q <- html("http://weather.yahoo.co.jp/weather/jp/past/13/4410.html")
  q <- html(sprintf("%s?c=%s&m=%s", url.base, y, m))
  
  # 年の取得
  year <- html_nodes(q, xpath = '//div[@id="yjw_past_area_navi"]/p') %>%
    html_text() %>%
    iconv("utf-8", "cp932")
  
  # 月の取得
  month <- html_nodes(q, xpath = '//td[@colspan=7]') %>%
    html_text() %>%
    iconv("utf-8", "cp932")
  if(length(month) > 2){
    month <- month[c(1,3)]
  }
  
  # 日付、天気の取得
  l <- html_nodes(q, xpath = '//td[@align="center"]/a') %>%
    iconv("utf-8", "cp932")
  
  weather <- l %>% str_replace_all("\\n", "") %>%
    str_replace_all(".+amp;d=", "") %>%
    str_replace_all(".+alt=\"", "") %>%
    str_replace_all("\".+", "")
  
  df <- data.frame(d = 1:(length(weather)/2))
  
  df$day <- as.numeric(weather[(1:(length(weather)/2))*2 - 1])
  df$weather <- weather[(1:(length(weather)/2))*2]
  
  # ソートした時にイマイチなのでas.numericする。
  df$month <- as.numeric(str_replace_all(ifelse(df$day == df$d, month[[1]], month[[2]]), "月", ""))
  df$year <- as.numeric(str_replace_all(year,"年",""))
  
  # 気温の取得
  temp <- html_nodes(q, xpath = '//td[@align="center"]/small/font') %>%
    html_text() %>%
    iconv("utf-8", "cp932")
  
  df$temp_max <- temp[(1:(length(temp)/2))*2 - 1]
  df$temp_min <- temp[(1:(length(temp)/2))*2]
  df
}

# 以下、実際の利用方法

df.all = data.frame(d=1,day=1,weather="a",month=1,year=1,temp_max=1,temp_min=1)
df.all <- df.all[F,]

for(y in c(2014,2015)){
  for(m in c(1,3,5,7,9,11)){
    df.all <- merge(df.all, getYahooWeather(y,m), all.x=T, all.y=T)
  }
}

df.all <- df.all[order(df.all$day), ]
df.all <- df.all[order(df.all$month), ]
df.all <- df.all[order(df.all$year), c("year","month","day","weather","temp_max","temp_min")]
write.csv(df.all, "temp.csv", row.names = F)
```

もっとスマートなやり方があれば、ぜひ教えて頂けると助かります。
AWS LambdaでPhalconを使用できるようにする


AWS LambdaでPhalconやその他のphpなextensionsを使用する方法のご紹介
需要があるのかどうかは不明
AWS LambdaでPHPを使う方法については[こちら](http://qiita.com/oh-sky/items/646d326ee23ae640153f)を参照

## phalconのコンパイル
AWS LambdaはAmazon Linuxで動いているので、Linuxな環境でコンパイルする。
基本的に[公式のマニュアル](https://docs.phalconphp.com/en/latest/reference/install.html#compilation)通りで良いが、installスクリプトはインストールまでするように書かれているので、ビルド用の環境にphalconをインストールしたくない場合には書き換えが必要。

```diff:build-only.patch
diff --git build/install build/install
index 60f5e29..29f4d85 100755
--- build/install
+++ build/install
@@ -61,4 +61,4 @@ if [ -f Makefile ]; then
 fi
 
 #Perform the compilation
-phpize && ./configure --enable-phalcon && make && make install && echo -e "\nThanks for compiling Phalcon!\nBuild succeed: Please restart your web server to complete the installation"
+phpize && ./configure --enable-phalcon && make && echo -e "\nThanks for compiling Phalcon!\nBuild succeed"
```

共有ライブラリファイルは`build/64bits/modules/phalcon.so`として生成される。

## ファイル構成例

```bash:file-tree
├── index.js
├── script.sh
├── app
│   └── index.php
└── php
    ├── ext
    │   └── phalcon.so #phalcon extension
    ├── php            #php cli
    └── php.ini
```

### 各ファイルについて簡単な説明

```javascript:index.js
exports.handler = function(event, context) {
  var exec = require('child_process').exec;
  var uri_path = "undefined" == typeof event.uri_path
                 ? '' : event.uri_path;
  exec('sh script.sh ' + uri_path, function (error, stdout, stderr) {
    if(stdout){
      console.log('stdout: ' + stdout);
    }
    if(stderr){
      console.log('stderr: ' + stderr);
    }
    if (error !== null) {
      console.log('Exec error: ' + error);
    }
    context.succeed(stdout);
  });
};
```
↑index.js はAWS Lambdaが起動した時に最初に読み込まれるファイル。ここからscript.shを起動する。

```sh:script.sh
#!/bin/sh
./php/php -S localhost:8080 -t ./app &
until curl http://localhost:8080/$1
do
    :
done
kill $!
```
↑phpのbuilt-in serverを立ち上げ、curlコマンドでリクエストを投げる。
built-in serverが立ち上がるより先にcurlコマンドが動いてしまう場合があるため、正常にレスポンスを受け取るまでリトライするよう、untilを使用している。

```php:app/index.php
<?php
phpinfo();
```
↑script.shで立ち上げたbuilt-in serverが参照するファイル。phalconが読み込まれているか確認するため、phpinfo()を出力。

```bash:php.ini
date.timezone="Asia/Tokyo"
extension_dir="/var/task/php/ext"
extension=phalcon.so
```
↑extentionであるphalconを読み込むための設定。

```bash:php-configure-options
./configure \\
--prefix=/var/task/php \\
--disable-all \\
&& make
```
↑phpのconfigureオプション。
アップロードするphp.iniを参照するよう、prefixを設定する。

## AWS Lambdaへのアップロード
`zip -r phalcon.zip app index.js php script.sh`
でファイルをzipにまとめてアップロードする。
今回、zipファイルは3MB程度になったので、AWS LambdaのWebコンソールからアップロードできた。

他の拡張を使用する場合やPHPのアプリケーションが大きい場合など、10MBを超えるケースでは、一旦S3へアップロードする必要がある。


## 結果
API Gateway経由でアクセスし、phpinfoの出力を確認。
phalconがextensionとして読み込まれている。

![Screen Shot 2015-12-01 at 3.27.58 PM.png](https://qiita-image-store.s3.amazonaws.com/0/13038/6dd61850-19db-9eec-a97b-6aabaa0cecf0.png "Screen Shot 2015-12-01 at 3.27.58 PM.png")

API Gateway経由でAWS LambdaにHTMLを出力させる方法については[こちら](http://www.slideshare.net/oh-sky/php-aws-lambdawebapp)を参照。

## まとめ

php.iniを参照するようphpのconfigureオプションを設定することが重要。
同じように配置をすれば、他のextensionも使用できる。
RPi > ユーザpiのuidとgid > ともに1000

```txt:動作確認
Raspberry Pi2 + raspbian
```

```
$ uname -a
Linux raspberrypi 4.1.7-v7+ #817 SMP PREEMPT Sat Sep 19 15:32:00 BST 2015 armv7l GNU/Linux
```

ファイルを作成した時にrootオーナーでなく、piをオーナーとしたい。
そのため、uidとgidを調べる必要がある。

上記環境にて

```
pi@raspberrypi ~ $ grep pi /etc/passwd
pi:x:1000:1000:,,,:/home/pi:/bin/bash
```

uidとgidともに1000のようだ。

参考 http://www.cyberciti.biz/faq/understanding-etcpasswd-file-format/
Pythonのpickle（cPickle）とmarshalについて

## はじめに
Pythonにはpickle（cPickle）という、オブジェクトの直列化モジュールがあります。
pickleはとても有名だと思います。
実は、似たようなモジュールとしてmarshalというのもあります。
こちらはあまり有名ではありませんね。
永続化してくれるモジュールではありませんし、バージョン間の互換性も保証されていませんので、わざわざmarshalを使う理由がありませんからね。有名ではないのも当然です。

pickleに比べて欠点だらけのmarshalですが、marshalにも良いところがあることが分かりましたので、今回はそれをテーマにします。
marshalの良いところ、それは「速度」です。

## 速度をチェック
早速、書き出しと読み込みの速度をチェックしてみましょう。
今回、速度を比較したのは「cPickle」と「marshal」です。

まずは書き出し。

```py
#!/usr/bin/env python
# -- coding:utf-8 -*-
import marshal
import cPickle as pickle
import time
import numpy as np


def main():
    a = np.ndarray(shape=(10000, 10000))
    start = time.time()
    pickle.dump(a, open('output.pkl', 'wb'))
    p_time = time.time() - start
    start = time.time()
    marshal.dump(a, open('output.msl', 'wb'))
    m_time = time.time() - start
    print p_time, m_time

if __name__ == '__main__':
    main()
```

コードはこんな感じです。
多次元配列を生成して、それを書き出しています。

それでは出力を見てみましょう。

```
143.123441935 5.09839010239
```

左がcPickle、右がmarshalで、単位は秒です。
思っていたよりも差が出ましたね、予想外でした。

次は読み込み。

```py
#!/usr/bin/env python
# -- coding:utf-8 -*-
import marshal
import cPickle as pickle
import time
import numpy as np


def main():
    start = time.time()
    a = pickle.load(open('output.pkl', 'rb'))
    p_time = time.time() - start
    start = time.time()
    b = marshal.load(open('output.msl', 'rb'))
    m_time = time.time() - start
    print p_time, m_time

if __name__ == '__main__':
    main()
```

コードはこれです。
dumpをloadにしているだけです。

結果がこちら

```
445.698551893 1.64994597435
```

同じく左がcPickle、右がmarshal、単位は秒です。
いやぁ、すごい差ですね……、かなり驚いています。


## まとめ
はい。というわけで速度ではmarshalがはやいということが分かりました。
なんででしょうか、理由は調べていません。

しかしながら、速度ではmarshalが勝っていますが、永続化してくれるpickleの方が圧倒的に便利なので使うならやっぱりpickleですね。
だったらなんで比較したんだって話ですね。
理由としては、気になったからという他ありません。

というわけで、ほとんど使うことのないであろうmarshalにスポットを当てたよ！、という話は以上になります。
さくらレンタルサーバでマルチドメイン毎にPHPの設定やバージョンを切り替える

## 前置き

さくらのビジネスプロ、マネージドプランはモジュール版PHPを利用することができます。
モジュール版はCGI版と比べて負荷が少なく動作が早いため、可能であればモジュール版を使うに越したことはないのですが、PHPの設定（php.ini）はサーバに対して1つの設定しか適用できません。
つまり、マルチドメインで運用している場合、全てのサイトに対してPHP設定を共有しなくてはなりません。  

いや、.htaccess があるじゃないか、と思われますが、さくらのレンタルサーバの仕様では .htaccess に `php_flag` や `php_value` を指定することができません（Internal Server Error になります）。
サイト全体の共通箇所に `ini_set()` を記述して対応する方法もありますが、それが叶わない状況もあります。
サイト毎に設定が違うのは当然のことなので、ここは何とかしたいところです。

## .user.ini ファイルを使う

PHP 5.3.0 以降ではディレクトリ単位で php.ini の設定を反映する、.user.ini ファイルをサポートしています。
何故かさくらのサポートで「user.ini」を検索してもカスりもしませんが、PHPが正式にサポートしているものなので、さくらのレンタルサーバでも.user.ini は有効になります。
ただし、

> このファイルは、CGI/FastCGI SAPI の場合にのみ処理されます。  

とあるように、モジュール版では動作しません。とは言え、いまさらサーバ全体をCGI版で動かすのは稼働中のサービスへの影響が大きいですし、パフォーマンスも落ちるので選択肢としては避けたいところです。

## マルチドメイン毎にPHPをCGI版に切り替える

CGI版PHPであれば、.user.ini ファイルが有効になるので、設定の上書きが必要なサイトのみCGI版として動作させられれば目的が達せられます。（CGI版にしたサイトのパフォーマンスは落ちますが、イレギュラーケースとしてとりあえず受容します。）
特定ディレクトリ以下のみ、CGI版PHPで動作させるには以下手順を行います。

### 1. マルチドメインのドキュメントルートに以下内容の php.cgi ファイルを格納

```sh:php.cgi
#!/bin/sh
exec /usr/local/php/5.6/bin/php-cgi
#exec /usr/local/php/5.4/bin/php-cgi
#exec /usr/local/php/5.3/bin/php-cgi
#exec /usr/local/php/5.2/bin/php-cgi
#exec /usr/local/php/4.4/bin/php-cgi
```

それぞれのパスはさくらに用意されている各PHPのバージョンファイルです。
動作させたいPHPのバージョンの行を残してそれ以外はコメントアウト、もしくは削除します。 
また、ファイルのパーミッションを **705** に設定しておきます。

### 2. マルチドメインのドキュメントルートに以下内容の .htaccess を格納

```apache:.htaccess
Action myphp-script /php.cgi
AddHandler myphp-script .php .html
```

※既に.htaccess が存在する場合は上記内容を追記してください。

### 3. PHPの設定を適用したいディレクトリに .user.ini を格納

```ini:.user.ini
display_errors = On
error_reporting = 6135
```
※設定内容は任意です。

以上でそのドメイン配下のPHPは指定したバージョンのCGI版として動作し、個別にPHP設定もできるようになります。

もともとはマルチドメイン毎のphp.iniの設定方法を探していましたが、PHPのバージョンも切り替えることが可能ということが分かったのは収穫でした。  

## 注意点
- PHPのバージョンを5.2以下で指定した場合は .user.ini のサポート外となるため、上記の方法ではPHPの設定は適用されません。
- .user.ini 形式の INI ファイルがサポートするのは、 モードが PHP_INI_PERDIR および PHP_INI_USER の項目のみです。

## 参考サイト
- http://php.net/manual/ja/configuration.file.per-user.php
- http://php.net/manual/ja/ini.list.php
- http://www.y-com.info/contents/?p=1266
Realm の検索条件に QueryKit を使ってみる

この記事は [- スピカ Advent Calendar 2015 -](http://qiita.com/advent-calendar/2015/spika) ３日目の記事です。

弊社の [サービス](https://itunes.apple.com/jp/app/id994869271) では [Realm](https://realm.io) を絶賛使っていますが、その検索条件部分を**より Swift っぽく**書いてみようをテーマに投稿します。

# はじめに

Realm では通常、以下の `filter` メソッドに文字列で条件を記述するのですが、タイポなどした場合は実行時に、はじめてエラーとして現れます。

```swift

public func filter(predicateFormat: String, _ args: AnyObject...) -> Results<T>
```

これでは折角のコンパイル言語としての Swift の魅力が半減してしまいます。
そこで今回は QueryKit というライブラリを組み合わせて、そういった部分を解消しようという試みになります。

# <img src="https://raw.githubusercontent.com/QueryKit/QueryKit/master/QueryKit.png" width="24px" /> [QueryKit](https://github.com/QueryKit/QueryKit) 



QueryKit 自体は CoreData 向けのライブラリなのですが、CoreData, Realm どちらも `NSPredicate` を利用したインターフェースになっているため、 Realm でも利用することが出来ます。

QueryKit を用いると `NSPredicate` が以下のような構文で表現されます。

>
```swift
// Name is equal to Kyle
name == "Kyle"
>
// Name is either equal to Kyle or Katie
name << ["Kyle", "Katie"]
>
// Age is equal to 27
age == 27
>
// Age is more than or equal to 25
age >= 25
>
// Age is within the range 22 to 30.
age << (22...30)
```
https://github.com/QueryKit/QueryKit#operators


# 具体例

## 定義部分

以下のように `RealmSwift.Object` を普通に継承したクラスに対して、必要に応じて `Arrtibute< AttributeType>` 型のクラス変数を定義します。

```swift

import RealmSwift

class Dog: Object {
    dynamic var name = ""
    dynamic var age = 0
}
class Person: Object {
    dynamic var name = ""
}


import QueryKit

extension Dog {
    static var name: Attribute<String> { return Attribute("name") }
    static var age: Attribute<Int> { return Attribute("age") }
}

extension Person {
    static var name: Attribute<String> { return Attribute("name") }
}

```

## クエリ部分

Realm からオブジェクトを取り出す際は、以下のように記述することが出来ます。


```swift
let realm = try! Realm()

// "name = %@", "Taro"
realm.objects(Dog).filter(Dog.name == "Taro")

// "name IN %@", ["Taro", "Jiro"]
realm.objects(Dog).filter(Dog.name << ["Taro", "Jiro"])

// "name = %@ AND age > %@", "Taro", 2
realm.objects(Dog).filter(Dog.name == "Taro" && Dog.age > 2)
```


# メリット

+ 文字列ではないので、入力補完が働く ✨
+ Generics を用いて型の一致も判断されるので、以下のような式はコンパイル時にエラーとなる ✨

```swift
realm.objects(Dog).filter(Dog.age > "2")

// Binary operator '>' cannot be applied to operands of type 'Attribute<Int>' and 'String'
```

# おわりに

駆け足でしたが、 Realm に QueryKit を組み合わせた例を紹介してみました 😎
Permission Scope で写真のパーミッションを再取得する

アプリがユーザーの写真にアクセスするにはパーミッションを取得する必要があります。
このとき パーミッションをいちど拒否されると再許可してもらうには設定アプリを階層深くまで辿ってもらわねばなりません。 

しかし [Permission Scope](https://github.com/nickoneill/PermissionScope) を使うと 再許可までカンタンにナビゲーションできます。

# Permission Scope とは

> PermissionScope is a Swift framework for intelligently requesting permissions from users.It contains not only a simple UI to request permissions but also a unified permissions API that can tell you the status of any given system permission or easily request them.
> https://github.com/nickoneill/PermissionScope

パーミッション取得をカンタンにしてくれるのが Permission Scope です。
さまざまなパーミッションを取得するのに統一された API を提供してくれます。

インストールは CocoaPods と Carthage で出来ます。

# パーミッションを取得する

README を読んでサンプルを書いてみました。
ビューにある imagePickerボタンを押すことで 下記の IBAction を起動しています:

```Swift
    @IBAction func imagePickerButtonTapped(sender: AnyObject) {
        let permissions = PermissionScope()
        // ダイアログの表示に self(ViewController) を使う
        permissions.viewControllerForAlerts = self
        // 設定アプリ遷移後にパーミッションの設定が変わったときにコールバックされる
        permissions.onAuthChange = { [unowned self] (finished, results) in
            if results[0].status == .Authorized {  //再許可とれた
                self.presentImagePickerController()//ImagePickerController 起動
            }
        }
        
        switch permissions.statusPhotos() {  // 写真のパーミッションをチェック
        case .Authorized: // すでに写真へのアクセスを許可済みのとき
            presentImagePickerController()   // ImagePickerController 起動
        case .Unknown, .Unauthorized, .Disabled:
        // Unknown: パーミッション未設定, Unauthorized: アクセス拒否, 
        // Disabled: システムレベルで無効
            permissions.requestPhotos()  // 未設定やいちど拒否されたときは
                                         // 再度問い合わせする
        }
    }
```

requestPhotos メソッドのなかでは いまのパーミッションに応じたダイアログを表示してくれます。
たとえば 写真へのアクセスをいちど拒否したあとで再取得するときは"写真へのアクセスを拒否したけど どうする？"的な感じです: 

![Simulator Screen Shot 2015.12.02 20.32.23.png](https://qiita-image-store.s3.amazonaws.com/0/98187/490b8fab-f542-c31b-2bd0-26e4b4b42cfd.png)


# ほかにできること

今回は試していませんが、Camera と Notification など複数のパーミッションの組み合わせを取得したいときは いい感じにパーミッションを取得してくれるようです: 

![Simulator Screen Shot 2015.12.02 20.33.13.png](https://qiita-image-store.s3.amazonaws.com/0/98187/c0b09939-217d-27a3-84de-d1e97a6ba5d6.png)

UI のカスタマイズもいろいろできるとのことです。

# 参考資料

- https://github.com/nickoneill/PermissionScope#calling-request-methods-directly
rbenvからのrubyインストール

# 前提条件
-> [Amazon Linuxでrbenv+ruby-buildを使えるようにする方法](http://qiita.com/maromaro0013/items/ac078815a08f09e866a9)

# 概要
rbenvのruby-buildを使ってrubyをビルドする

## インストールできるrubyのバージョンを表示する
``` rbenv install -l ```

## インストールする
``` rbenv install 2.2.3 ```

## インストールしたrubyをglobalに設定する
``` sudo rbenv global 2.2.3 ```

## ローカルで使うrubyのバージョンを設定する
``` echo "2.2.3" > .ruby-version ```
Perl6の無限リストで遊ぶ

こんにちは！
Perl6初心者です！

Perl6のドキュメントは http://design.perl6.org/ で読むことができるようです。
今回は無限リストで遊んでみましょう。

Perl6では無限リストを作ることができます。
たとえば、`1` から `Inf` までの無限リストは以下のようにして作ることが出来ます。

# Rangeを使った無限リスト

```pl6
(1...Inf)
```

`Inf` を `*` と表現することもできるのでもっと簡潔に書くこともできます。

```pl6
(1...*)
```

# 関数を使った無限リスト

無限リストということで、`Sub...Inf` のように書くことで関数も扱うことが出来ます。
たとえばランダムで `True` または `False` が返る無限リストを作ることができます。

```pl6
(-> { (True, False).pick } ... *)
```

さらに、初期値を与えることで、前回の値をもとに次の値を生成するといったこともできます。
等差数列を簡単につくることができますね。

```pl6
(1, -> $n { $n + 3 } ... *)
```

なお、値を取る場合は、引数を `*` で表すことでラムダ式を以下のように簡易的に書くこともできます。

```pl6
(1, * + 3 ... *)
```

2つ以上の値を初期値として取ることもできます。

```pl6
(0, 1, * + * * 2 ... *)
```

これを発展させると、mattnさんの [Perl6 の無限リストとダイナミックバインディングが最強すぎる](http://mattn.kaoriya.net/software/lang/perl6/20151026144119.htm) で書かれているようなフィボナッチ数列を表す無限リストを書くことができます。
詳しくは [tokuhiromさんが解説している](http://blog.64p.org/entry/2015/10/27/103325) のでそっちを読むと良いです。

当たり前に無限リストに対するmap/grepなどもできます。

```pl6
(1...*) ==> map { $_ + 2 }
```

# あそぶぞー

FizzBuzzでもやってみましょうかね！
mapで書いてみる。

```pl6
(1...*) ==> map { $_ % 15 == 0 ?? "FizzBuzz" !!  $_ % 5 == 0 ?? "Buzz" !! $_ % 3 == 0 ?? "Fizz" !! $_ }
```

関数でも書いてみる。
クロージャにすることでうまくいった。もっとすっきり書けそう。

```pl6
my $n = 0;
(-> { $n++; $n % 15 == 0 ?? "FizzBuzz" !! $n % 5 == 0 ?? "Buzz" !! $n % 3 == 0 ?? "Fizz" !! $n } ... *)
```

# 無限リストをO/R Mapperで採用する可能性

無限リストでデータベースを扱うことも可能かもしれませんね！（愚直にやるとクソクエリ吐きそうだけど）

```pl6
my ($user1, $user2, $user3) = DB.users()[1..3]
```

# まとめ

無限リストたのしい！

明日は @B73W56H84 さんによる "Perl6 Cookbook的な内容！" です。おたのしみに！
すぐできるステータスバーの透過対応

API16以上で確認しました。

## dimen要素の追加

```xml:values/dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="toolbar_height">56dip</dimen>
    <dimen name="status_bar_height">24dp</dimen>
    <dimen name="toolbar_padding">0dp</dimen>
</resources>
```


```xml:values-v21/dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="toolbar_height">80dip</dimen>
    <dimen name="status_bar_height">0dp</dimen>
    <dimen name="toolbar_padding">24dp</dimen>
</resources>
```

## styleの指定

```xml:values/styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="YourTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="colorPrimary">@color/primary</item>
        <!-- 好きな色で透過 -->
        <item name="colorPrimaryDark">@color/black_alpha_40</item>
    </style>
</resources>
```


```xml:values-v21/styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="YourTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="windowActionModeOverlay">true</item>
        <item name="android:windowTranslucentStatus">true</item>
    </style>
</resources>
```

## アプリ内の各Toolbarのレイアウトを修正

```xml:toolbar_common.xml
<android.support.v7.widget.Toolbar
                android:id="@+id/some_toolbar"
                android:layout_width="match_parent"
                android:layout_height="@dimen/toolbar_height"
                android:background="@android:color/white"
                android:paddingTop="@dimen/toolbar_padding" />
```

### その他

- 独自Viewを使っている画面でToolbarの高さを使った処理を行っている場合は対応が別途必要
- Drawerを使っている場合はpaddingを設定してコンテンツに被らないようにする

これだけです :joy_cat:
epub 3のファイルフォーマットその１

この記事は[ePub Advent Calendar 2015](http://qiita.com/advent-calendar/2015/epub)の2日目です。

#epub3の中身
電子書籍(epub)ファイルは[zip](https://ja.wikipedia.org/wiki/ZIP_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88))形式でOCF ZIP コンテナと呼びます。


どのepubファイルも
1. mimetype
2. META-INF/container.xml
の二つはファイルエントリに含まれます。

![サンプル.PNG](https://qiita-image-store.s3.amazonaws.com/0/28939/8dc81126-bb0b-8af5-1612-a567bc7403b6.png)

##mimetype
```text:mimetype
application/epub+zip
```
メディアタイプを書きます。type/mediaTypeName[+suffix]
typeがapplication
mediaTypeNameがepub
suffixがzip

##META-INF/container.xml
```xml:META-INF/container.xml
<?xml version="1.0"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
   <rootfiles>
      <rootfile full-path="opfファイル" media-type="application/oebps-package+xml"/>
   </rootfiles>
</container>
```
OCF 抽象コンテナ(META-INFディレクトリ)にcontainer.xmlが入っています。
rootfileタグのfull-path属性にOCF ZIP コンテナからopfファイルへのフルパスを書きます。

ここから先の追加ファイルはOCF 抽象コンテナ(META-INFディレクトリ)以外で作る人の好きな所にファイルを設置できます。

[IDPFのサンプル](https://github.com/IDPF/epub3-samples/tree/master/30/haruko-html-jpeg/OPS)ではOPSディレクトリにpackage.opfを設置しているので

```xml:META-INF/container.xml
<?xml version="1.0" encoding="UTF-8"?>
<container xmlns="urn:oasis:names:tc:opendocument:xmlns:container" version="1.0">
  <rootfiles>
    <rootfile full-path="OPS/package.opf" media-type="application/oebps-package+xml"/>
  </rootfiles>
</container>
```
full-path属性はOPS/package.opfになります。
以上、epubファイルの中身に必ずある2個のファイルでした
今日から使える！ RSpec でテストの実行サンプル it を素早く絞り込み・スキップする方法

# 状況

RSpecでSpecを書く際、特定のexample(it)のみ実行したい場合、focus: タグを付けます。
(spec_helper での設定か、実行時オプションが必要です。後述)

```rb
it 'has 25 days', focus: true do
  expect(calendar.size).to eq(25)
end
```

ですが、絞り込みしたい時に毎回タイプするのが大変です。

# 対応

こういった時、it を focus に書き換えることが可能です。

```rb
focus 'has 25 days' do
  expect(calendar.size).to eq(25)
end
```

## 更に短縮形

it を消して focus に書き換える、これもまた面倒です。
こういったとき、 it の手前に focus の頭文字である f を付けた、fitという別名が用意されています。

特定のテストを実行したいときのみ、fをタイプし、終わったらfを消すという手順で、specを書きやすくなります。

```rb
fit 'has 25 days' do
  expect(calendar.size).to eq(25)
end
```

## 別名

it には、 example や specify という別名があり、文脈によって使い分けることが出来ますが、これらについても focus するための名前が用意されています。

```rb
fexample 'Advent calendar has 25 days' 
fspecify '師走は12月'
```

# example のスキップ

同様に、特定のexampleのみテストから除外したい場合に :skip というタグが用意されていますが、

```rb
it 'has 25 days', skip: true do
  expect(calendar.size).to eq(25)
end
```

これらも it を skip, xit, xexample, xspecify に置き換えることでスキップできます。

```rb
skip 'has 25 days' 
xit 'has 25 days' 
xexample 'Advent calendar has 25 days' 
xspecify '師走は12月' 
```

xit 等では、素早く特定の example をスキップすることができます。
skip では、実行しない仕様であるという意思表示が可能です。

# グループの除外、絞り込み

仕様テストのグループ（describe, context）についても、同様のショートカットが可能です。

```rb
# 古い仕様などをskip
xcontext 'サンタクロースを待つ時' 
xdescribe 'サンタクロースが来る'
# 絞り込み
fcontext '年末になった時' 
fdescribe '仕事を増やす' 
```

# 補足：spec_helper の設定

最初に生成される spec_helper ではコメントアウトされていますが、以下のオプションを有効にします。

```rb:spec_helper.rb
RSpec.configure do |config|
  config.filter_run :focus
  config.run_all_when_everything_filtered = true
end
```
(Mac)素のChromeでキーボードブラウジングする

主にポインティングデバイスが使用できない時用。
快適にキーボードでブラウジングしたい場合は`vichrome`等のChrome Extentionを使用すると良い。

キーはMac表記をするのでWindowsの方は適宜`Ctrl`と読み替えてください。

## 主力コマンド

### `Command` + `F`

皆さんご存知検索機能。
検索バーへフォーカスを移動する。
リンク文字列に検索があたっている状態(背景がオレンジ色)に`ESC`を押すとそこに**フォーカスが移動**する。
その状態でエンターを押せば遷移できる。

## フォーカスの移動

基本これができれば大丈夫。

### `TAB`

次の要素へフォーカスを移動する。

### `TAB` + `Shift`

前の要素へフォーカスを移動する。

## 画面遷移系

リンク文字列にフォーカスが当たっていることが前提。

### `Enter`

通常の画面遷移。
Form系要素にフォーカスがある場合はSubmitをすることができる。(textareaの場合は普通に改行されるだけ)

### `Command` + `Enter`

別タブで開く。

### `Shift` + `Enter`

別ウィンドウで開く。

### `Shift` + `Command` + `Enter`

別タブで開き、現在のタブをその開いたタブへ移動する。

## タブ、ウィンドウ系操作

### `Ctrl` + `TAB`

次のタブへ移動する。

### `Ctrl` + `Shift` + `TAB`

前のタブへ移動する。

### `Command` + 1〜9

指定の番号のタブへ移動する。
一番左が1。

### `Command` + `W`

現在のタブを閉じる。

### `Command` + `Shift` + `W`

現在のウィンドウを閉じる。

### `Command` + `N`

新しいウィンドウを開く。

### `Command` + `T`

タブを開く。

## ブラウザ上部にあるボタンの操作

### `Command` + `R`

いわゆる`F5`。更新する。

### `Command` + `←`

戻る。ひとつ前のページへ戻る。

### `Command` + `→`

進む。ひとつ先のページヘ進む。

### `Command` + `D`

ブックマークへ登録する。

### `Command` + `P`

プリントする。

### `Command` + `S`

ページを保存する。



## 感想

コマンド解説してみると、意外と多かった。
ViewのListenerをRxで受け渡してみる

AndroidでRecyclerViewを使ったリスト系のアプリを作るとき、今まではViewHolderのitemViewにOnClickListenerをセットしてやって、そこからinterfaceを介してAdapter、Fragmentにイベントを流していました。

ただ、毎度毎度Interface定義しなくちゃいけないし、AdapterやFragmentはそのInterfaceの実装クラスをセットしなきゃならないなどめんどいので、これをRxJavaとか使って書けないかなーと思って試しに書いてみました。

やっていることは、ViewのイベントをObservableで受け取れる状態にして、それをAdapterにあるHot Observableに繋いで垂れ流し状態にしています。それをFragmentなどでsubscribeすると、Viewのイベントを受信できるといった感じです。

https://github.com/bl-lia/ActionObserverToy

イベントの発火元はViewHolderの中のViewなので、ここのClickListenerをObservableで受け取れるようにします。

https://github.com/bl-lia/ActionObserverToy/blob/master/app/src/main/java/com/krsk/actionobservertoy/ListAdapter.java#L75-L87

```java:ListAdapter.java
private final Observable<Item> mClickActionObservable = Observable.create(new Observable.OnSubscribe<Item>() {
    @Override
    public void call(final Subscriber<? super Item> subscriber) {
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mItem != null) {
                    subscriber.onNext(mItem);
                }
            }
        });
    }
});
```

これ自身はCold Observableなので、ViewHolderが生成されるタイミングでは何もしません。

次に、AdapterでHot Observableを定義してやって、そこにonBindViewHolderのタイミングでViewHolderのCold Observableを繋ぎ込んでやります。

https://github.com/bl-lia/ActionObserverToy/blob/master/app/src/main/java/com/krsk/actionobservertoy/ListAdapter.java#L29-L33
https://github.com/bl-lia/ActionObserverToy/blob/master/app/src/main/java/com/krsk/actionobservertoy/ListAdapter.java#L42-L50

```java:ListAdapter.java
private final PublishSubject<Item> mItemPublishSubject = PublishSubject.create();

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof ItemViewHolder) {
        final Item item = mItems.get(position);
        ((ItemViewHolder) holder).applyItem(item);
        final Observable<Item> actionObservable = ((ItemViewHolder) holder).getClickActionObservable();
        actionObservable.subscribe(mItemPublishSubject);
    }
}
```

これでHot Observableになったので、あとはこれをFragment側でsubscribeするだけです。

https://github.com/bl-lia/ActionObserverToy/blob/master/app/src/main/java/com/krsk/actionobservertoy/ListFragment.java#L50-L55

```java:ListFragment.java
mListAdapter.getItemPublishSubject().subscribe(new Action1<Item>() {
            @Override
            public void call(Item item) {
                Log.d(ListFragment.class.getSimpleName(), String.format("Item: %s", item.name));
            }
        });
```

onCompletedも呼んでないしunsubscribeもしてないのでお行儀悪い感じになってしまったので、そこら辺はもうちょっと工夫したいかなと思います。
Android Studio2.0のInstant Runを既存プロジェクトに適用したら65K問題を踏んだ(未解決)


##きっかけ
[Androidアプリの開発を爆速化させるInstant Runを今日から使おう](http://qiita.com/tnj/items/970febffcb3518c5a3c3)

可及的速やかに導入しようと思ってトライしました。

##現象
先ほどの記事にある手順で、既存アプリにInstant Runを適用してみました。
だがしかし、ビルドすると下記エラーが出ます。

```
Error:Execution failed for task ':appname:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
```

[ここ](https://code.google.com/p/android/issues/detail?id=195319&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars)にあるようにgradleのオプションを足してみたのですが、


```build.gradle
android {

    ....
    
    dexOptions {
        dexInProcess = true
    }
    
    ...
}    
```

今度は別のエラーが出ました。

```
Error:Execution failed for task ':appname:transformClassesWithDexForDebug'.
> java.lang.reflect.InvocationTargetException
```

ホントAndroid界厳しい。

##原因
どうやらInstant Runを適用すると20K個ほどのメソッドが既存プロジェクトに足されるようです。
[65K問題が起きた時の犯人を調べる方法](http://qiita.com/mattak@github/items/f27db9a7862ab9c84c6c)を見ながらおそるおそるメソッド数を数えてみたところ...。

＿人人人人＿
＞　63195　＜
￣Y^Y^Y^Y￣

それにより[メソッドの65K問題](http://d.hatena.ne.jp/gfx/20140704/1404431315)を踏んでしまったのが原因のようです。

##対策(未解決)
`com.android.tools.build:gradle:2.0.0-alpha3`で修正される模様。気長に待つとします。
Unix系(Mac,Linuxなど)で一括でファイルのタブを空白に変換するコマンド

```
find . -name "*.cs" | xargs -IFILE sh -c 'expand -t4 FILE > temp;mv temp FILE'
```

これで、カレントディレクトリ以下のすべてのcsファイルのタブを、空白4つで置き換えれます。
対象のファイルを変更したい場合は、findのところの '*.cs'を変更してください。
空白の数を変えたい場合は、expandのところの'-t4'の数字を変更してください。


てか、MonoDevelopのデフォルト設定保存できるようにするか、デフォルトタブをスペース置換にして欲しい。
Amazon Linuxでrbenv+ruby-buildを使えるようにする方法

# 概要
"users"グループに属するユーザーなら誰でもrbenvを使えるようにする。
公式の説明(https://github.com/rbenv/rbenv) だとユーザーごとに設定が必要になる。
※この手順+αを記載した雑recipe -> https://github.com/maromaro0013/rackapp

## 必要なパッケージのインストール
```
sudo yum install -y git gcc openssl-devel readline-devel zlib-devel libcurl-devel
```

## rbenvをgithubからclone
```
sudo git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
```

## ユーザーログイン時に実行するスクリプト
```sh:rbenv.sh
export RBENV_ROOT="/usr/local/rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init --no-rehash -)"
```
これを"/etc/profile.d/"に置く
※ログイン時には"rehash"はいらないそうです

## スクリプトのパーミッションを変更
```
sudo chmod 0644 /etc/profile.d/rbenv.sh
```

## rbenvの持ち主とパーミッション変更
```
sudo chown -R root:users /usr/local/rbenv
sudo chmod -R 775 /usr/local/rbenv
sudo mkdir /usr/local/rbenv/versions
sudo chmod -R 775 /usr/local/rbenv/versions
sudo chown -R root:users /usr/local/rbenv/versions
```
## スクリプト実行しておく
```
. /etc/profile.d/rbenv.sh
```

## pluginsディレクトリ作っておく
```
sudo mkdir /usr/local/rbenv/plugins
sudo chmod -R 775 /usr/local/rbenv/plugins
sudo chown -R root:users /usr/local/rbenv/plugins
```

## ruby-buildのclone
```
sudo git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
sudo chown root:users /usr/local/rbenv/plugins/ruby-build
sudo chmod -R 775 /usr/local/rbenv/plugins/ruby-build
```
nginx設定 httpをhttpsにリダイレクト



nginxでhttpのアクセスをhttpsにリダイレクトする方法
returnを使う方法。

```Nginx
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443;
    ssl on;
    # ...
}
```
フォールトトレラントヒープ(FTH)

# フォールトトレラントヒープ(FTH)

VS2013で、プログラムのデバッグをしようとしたら死ぬほど実行が遅く、いろいろ調べた結果表題のFTHに行き当たりました。もしプログラムに問題がないのに実行が遅い場合で、開発中に頻繁にクラッシュさせた場合などは、FTHを疑ったほうがいいかもしれません。

FTHが有効になってると、Visual Studioの出力ペインに以下のメッセージが出ます。(????は数字で場合によって変わります)
```
FTH: (????): *** Fault tolerant heap shim applied to current process. This is usually due to previous crashes. ***
```
このようなメッセージが出た時はFTHが起動して実行が大幅に制限されるようです。FTHについて詳しくは[Microsoftのサイト](https://msdn.microsoft.com/ja-jp/library/dd744764%28v=vs.85%29.aspx)にかかれていますが、ここの情報だけでは実は解決できませんでした。

まずは、次回以降FTHが動かないようにレジストリをいじります。不安な人は触る前にレジストリのバックアップを取っておきましょう。
```
HKLM\Software\Microsoft\FTH@Enabled
```
上記の値を0にします。
次に以下の場所にある、実行したいプログラム名を探して削除。
```
HKCU\Softeware\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
```
最後にコマンドプロンプトから次のコマンドを打ち込む。（これは必要かどうかわかりません。サイト情報ではこれでプログラムリストのリセットが出来ると書いてあるんですが、どうもできてないようです）
```
Rundll32.exe fthsvc.dll,FthSysprepSpecialize
```
最後に再起動。

以後は、クラッシュしてもリストアップされることはないようです。（たぶん）
Python + openpyxl で SSH ログイン先の rpm 一覧を Excel シートに出力してみた。


## openpyxl とは

openpyxl は Python で *.xlsx を読み書きするためのライブラリ。

A Python library to read/write Excel 2010 xlsx/xlsm files
https://openpyxl.readthedocs.org/en/default/

単独で使ってもあまり面白くないが、SSH ログイン先の構成情報を拾ってきて Excel のパラメータシートまで自動生成できると嬉しい人が居るかもしれないので、少しだけ試してみた。

## コードを書いてみる

使えそうな機能を一つずつ試してみて、出来上がったサンプルコードがこちら。

```python:createlPackageList.py
import ssh
from openpyxl import Workbook
from openpyxl.styles.borders import Side, Border
from openpyxl.styles import Style, PatternFill

hostname = 'foo.bar.com'
username = 'root'
password = 'XXXXXXXX'
port = 22

client = ssh.SSHClient()
client.set_missing_host_key_policy(ssh.AutoAddPolicy())
client.connect(hostname, username = username, password = password, port = port)
stdin, stdout, stderr = client.exec_command('rpm -qa --queryformat="%{NAME},%{VERSION},%{RELEASE},%{ARCH},%{GROUP}\n" | sort')

wb = Workbook()
ws = wb.active

ws.append(['Name', 'Version', 'Release', 'Architecture', 'Group'])

for line in stdout.read().split('\n'):
    ws.append(list(line.split(',')))

thin_border = Border(left = Side(style = 'thin'), 
                     right = Side(style = 'thin'), 
                     top = Side(style = 'thin'), 
                     bottom = Side(style = 'thin'))
 
my_style = Style(border = thin_border)

for _row in ws.iter_rows('A1:E' + str(ws.max_row)):
    for _cell in _row:
        _cell.style = my_style

lightblueFill = PatternFill(start_color = '0000FFFF',
                      end_color = '0000FFFF',
                      fill_type = 'solid')

for _row in ws.iter_rows('A1:E1'):
    for _cell in _row:
        _cell.fill = lightblueFill

ws.column_dimensions['A'].width = 45
ws.column_dimensions['B'].width = 15
ws.column_dimensions['C'].width = 28
ws.column_dimensions['E'].width = 30

wb.save("output.xlsx")
```

openpyxl は内部的に Excel の行をリストとして扱っているので、ここでは SSH ログイン先で実行した rpm -qa … | sort の実行結果 (stdout) を一行ずつ読み込み、カラム単位に split したものをリストに変換して Workbook クラスのワークシート ws に append していけばよい。

セルに罫線をかけたり、色を指定したり、あるいは列の幅を変えるようなことも Styles モジュールで指定することが可能だ。

## 生成された Excel ファイル

上記のスクリプトを実行して出来上がったのが以下の Excel ファイル。
ファイル生成後の人為的な編集作業はもちろん行なっていない。

![openpyxlの画面出力例_20151202_002.png](https://qiita-image-store.s3.amazonaws.com/0/103651/d0acb4bb-bfc8-c655-18ff-cc79f5e828a6.png)


Python で使いやすいライブラリがあれば、数十行のコードでこれだけのことが簡単に出来るのでとても便利。

環境: Python 2.7.9 + openpyxl 2.3.1 にて確認。