OmniAICreator/Qiita-1.07M huggingface dataset:
AWS(EC2)にインストールしたECCUBE3のデータベースをRDSに設定するときの問題（奮闘中）

まだ未解決ですが進捗状況を記録しておきます。

分かる方がいたらアドバイスいただけると非常にありがたいです。

まず、AWS EC2にphp5.4以上 apache　MySQL などもろもろインストール
ECCUBE3をEC2上にインストール。

動作確認しましたが問題なし。

さて、RDSのインスタンスを作成し、データベースのダンプ、インポートをしたところ
フロント画面は表示されるものの商品画面が表示されない。

エラーをはいている場所を特定したところ
RDSのタイムゾーンがUTCであるため
EC2上のECCUBE3と時間がずれていることが原因と判明。

ずれの分をプログラム上で修復してやればよいことが
分かる。

Wiki
https://ja.wikipedia.org/wiki/%E5%8D%94%E5%AE%9A%E4%B8%96%E7%95%8C%E6%99%82

ちなみにECCUBE2では記事が存在している。
http://blog.serverworks.co.jp/tech/2012/03/14/ec-cube-on-aws-install/

要はここでいうDriver/mysql.php
や$connectionが見つかればよいのだが変数名の変更が
あったのかなかなか見つからない。

ということでUTCのタイムゾーンに９時間追加するため
該当箇所を探しております。

また更新させていただきます。
Rubyでクロージャを使いたい(カリー化・部分適用)

Procクラスとかラムダ式とかクロージャとかって知識としては知ってるけど、実際に使うことってあんまりない。というか使う腕がない、でも使いこなしたい。前回は初歩的なクロージャの練習として、いくつかのサンプルを作成してみた。

[Rubyでクロージャを使いたい(導入編)](http://qiita.com/EastResident/items/8abf587bc78bf989e2df)


今回は部分適用やカリー化について勉強してみました。

## 部分適用、カリー化の定義
言葉の定義については以下のリンクが詳しいです。
[カリー化:Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96)
[Proc#curryについて](http://qiita.com/kasei-san/items/000a604f72a78fd76fab)

つまり、複数の引数をとる(一般的な形式の)関数を、部分適用可能な形の関数に変換することをカリー化と呼ぶのかな？

例えば二つの引数の和を返す関数func_sumがあるとする。

```rb
def func_sum(x, y)
    x + y
end

p func_sum(3,6) #=>9
```

これを部分適用可能な形にすると、次のようになる

```rb
#この書き方は無効です。
def func_sum(x)
	def func_sum_y(y)
		x + y
	end
end

p func_sum(3)(9)
```

と言いたいところだけど、Rubyではこのような構文は存在しないので実際はProcオブジェクトを用いて以下のように書く。

```rb
func_sum = ->(x){
	->(y){
		x + y
	}
}

p func_sum.call(3).call(9) #=>12
```

## サンプル

### 部分適用

例えば与えられた整数nの倍数が順番にm個格納されている配列を返す関数を作るとする。そしてこの整数nの部分を部分適用したい。具体的には以下のような感じ

```rb

multiple_of_3 = multiple_of.call(3)
p multiple_of_3.call(3) #=>[3,6,9]
p multiple_of_3.call(6) #=>[3,6,9,12,15,18]
```

multiple_ofオブジェクトを基としたmultiple_of_3インスタンスを宣言し、倍数の数が3個と6個でcallしている。

このmultiple_ofオブジェクトは例えば以下のように定義できる。

```rb
multiple_of = ->(n){
	->(m){
		ary = []
		m.times do |i|
			ary << (i+1) * n
		end
		return ary
	}
}
```

しかしこの書き方はラムダ式がネストされており、見づらい上に分かりづらい。

### カリー化

上で行った処理をカリー化を用いて再現すると以下のようになる

```rb
multiple_of = ->(n, m){
	ary = []
	m.times do |i|
		ary << (i+1) * n
	end
	return ary
}

multiple_of_3 = multiple_of.curry.call(3)
p multiple_of_3.call(3) #=>[3,6,9]
p multiple_of_3.call(6) #=>[3,6,9,12,15,18]
```

Proc#curryメソッドを用いてmultiple_ofをカリー化し、第一引数を渡した上でmultiple_of_3インスタンスに渡している。これなら引数を二つ受け取る通常のメソッドに近い形なので読みやすい。今回は引数が二つだけなのでありがたみが感じられないが、もっと複雑な処理を部分適用させたい場合は便利かも。
  
    
    
十分に理解できてないので、うまく説明できていないと思う。実際に有効活用できる場面がイマイチ想像できない。
Storyboardのデフォルトで設定されているmarginを0にする

#直したいのはコレ！
storyboardでUILabelの左右を画面サイズに合わせて引き伸ばし、constraintsを左右マージン０に設定したが、何故かupdateすると自動的に-20のマージンが設定されてしまう。

![Screen-Shot-2015-11-09-at-20.10.22.png](https://qiita-image-store.s3.amazonaws.com/0/59560/fccaf02a-7cfe-6264-44cb-248ec0c434c7.png)


#解決方法
##左マージン
![Screen-Shot-2015-11-09-at-20.21.18.png](https://qiita-image-store.s3.amazonaws.com/0/59560/bea51fc1-f4c2-0e73-d34d-ce4180857b10.png)

該当のconstraintを選択し、「First Item」にある「relative to margin」のチェックを外します。
<img width="261" alt="Screen Shot 2015-11-09 at 20.21.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/7b4b4b8f-b63b-450a-b529-203e92725f62.png">

そして、「Constant」を０に設定します。
<img width="261" alt="Screen Shot 2015-11-09 at 20.21.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/af8cbab5-0d07-8406-09ef-ac4f2f388526.png">

##右マージン
![Screen-Shot-2015-11-09-at-20.20.03.png](https://qiita-image-store.s3.amazonaws.com/0/59560/bd34525c-d6b0-a9be-a249-8ffcec5d748e.png)

該当のconstraintを選択し、今度は「Second Item」にある「relative to margin」のチェックを外します。そして、同様に「Constant」を０に設定します。

これだけ！

![Screen-Shot-2015-11-09-at-20.21.53.png](https://qiita-image-store.s3.amazonaws.com/0/59560/424cdcd2-4a6c-8643-ab61-a86fc66518a7.png)
unityのアプリでios9のキーボードから音声入力するとぶっ落ちる問題

# unity4.6系でios9のキーボードで音声入力すると落ちる。

文字入力のUIかなにかでソフトウェアキーボードを表示して、キーボード上に音声入力のマイクキーがあると思うのですがそれを押すと普通に落ちます（初回は音声入力を有効にするかのダイアログでて、そのあと落ちる）。

これはunityの中の人が対応してほしい箇所なのですが、以下の新しめの環境で試したところまだ起きているようでした。

- unity4.6.9
- ios9.1
- xcode7.1


# 解決編：フォーラムに載ってた。
unityのフォーラムに解決法が載ってました。
unityでビルドし吐き出されたxcodeのプロジェクト内のソースコードを、以下リンクの通り修正すれば正常に動作するようになります。Unityの中の人が回答しているので安心？！
[Unity Forum Dictation (Siri) keyboard crash][siricrash]
[siricrash]:http://forum.unity3d.com/threads/dictation-siri-keyboard-crash.358123/

ただ、xcodeプロジェクトを吐き出すたびにこの対応を行うのはバカらしいので
以下のリンクを参考にして吐き出されるxcodeプロジェクトのテンプレートを書き換えてしまうのも手だと思います（再インストールするともちろん消えます）。
[テラシュールブログ Unityが出力するXcodeプロジェクトを修正する][xcodeテンプレート]
[xcodeテンプレート]:http://tsubakit1.hateblo.jp/entry/20140224/1393252545

検索してもうまくひっかからず調べるのに時間がかかったので日本語で調べられるようにこの記事を書きました。
何か間違いあればご指摘お願いいたします。
Google Maps swift2.0

## Dependencies ##
swift >= 2.0
Deployment Target == 9.1

[Google Maps SDK for IOS](https://developers.google.com/maps/documentation/ios-sdk/)
1. API Keyの取得
2. Google Maps SDK のインストール

> Build Settings > Build Options > Enable Bitcode をNoにする。
> ( error: linker command failed with exit code 1 )

```swift:AppDelegate.swift
import UIKit
import GoogleMaps

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?
  let cGoogleMapsAPIKey = "==API_KEY=============================="

  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    GMSServices.provideAPIKey(cGoogleMapsAPIKey)
    return true
  }

  func applicationWillResignActive(application: UIApplication) {}
  func applicationDidEnterBackground(application: UIApplication) {}
  func applicationWillEnterForeground(application: UIApplication) {}
  func applicationDidBecomeActive(application: UIApplication) {}
  func applicationWillTerminate(application: UIApplication) {}
}
```
```swift:ViewController.swift
import UIKit
import GoogleMaps

class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()

    let camera = GMSCameraPosition.cameraWithLatitude(-33.868,
      longitude:151.2086, zoom:6)
    let mapView = GMSMapView.mapWithFrame(CGRectZero, camera:camera)
    
    let marker = GMSMarker()
    marker.position = camera.target
    marker.snippet = "Hello World"
    marker.appearAnimation = kGMSMarkerAnimationPop
    marker.map = mapView
    
    self.view = mapView
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }
}
```
[Ruby]nokogiriがlibxml2のせいでインストールできない件〜El Captain版〜


`libxml2 version 2.6.21 or later is required!`

というのが出て、nokogiriのインストールができなかった。

`bundle config build.nokogiri --with-xml2-include=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/libxml2 --use-system-libraries`

`bundle install`

でOK！

以下のサイトで解決に至りました、ありがとうございます。
[OSX yosemite(10.10)でnokogiriのインストールに失敗](http://qiita.com/mist_dev/items/be2efa5913fa0fc861af)
[Error to install Nokogiri on OSX 10.9 Maverick?](http://stackoverflow.com/questions/19643153/error-to-install-nokogiri-on-osx-10-9-maverick)
CocoaPodsで新たにRealmを追加して出たエラー

#起きたエラー
Swift2.0版のRealmをCocoaPodsにて追加したところ、Bridge-Headerでもともと使っていた別のライブラリのimportの行で「file not found」のエラーが起こった。
#エラーが起きる前の状況
・CocoaPodsにてSVProgressHUDを導入
・Bridging-HeaderにてSVProgressHUD.hをimport済みで使用できていた
#エラーが起きるまで
CocoaPodsにてRealmを追加。
この際Realmの公式サイトのSwift2.0版インストール方法にのっとり、Podfileの中に「use_frameworks!」と「pod 'RealmSwift'」を追加してPodをインストールし直す。

いつもどおりworkspaceを開いてビルドするとBridging-Headerの、

```ruby:ProjectName-Bridging-Header.h
#import <SVProgressHUD.h>
```

このimport文にて「'SVProgressHUD.h' file not found」のエラーがおこる。

#原因と解決策
原因は簡単に言うならばuse_frameworks!だった。
[こちら](http://qiita.com/taketin/items/8264aeebc5a626c6d48f)を参考にしてようやく理解。
CocoaPodがSwiftに対応したことでSwiftのライブラリを導入するのにuse_framework!の記述が必要だが、この記述をするとBridge-Headerにimportを書かずにライブラリを使用するファイルで

```ruby:hoge.swift
import SVProgressHUD
```

と書くだけ使える。
この際SVProgressHUD.framework(CocoaPodsで導入したObjective-Cのライブラリのframework)を追加しておく必要がある。
VBA(Excel)高速化対策 -描画処理無効化編-

# 概要
[前回](http://qiita.com/sango/items/c46a30c62e154077a0c7)に引き続きVBA高速化対策です。

今回の「描画処理の無効化」も処理回数が嵩む場合にはかなり有効です。

早速、実働サンプルを綴っていきます。

# 本編
## サンプル
このような処理があったとします。

```vbnet
Private Sub MyButton_Click()

    Dim myRange, e As Range: Set myRange = Selection
    
    ' - 処理 -
    For Each e In myRange
        With e
            .Value = CInt(Rnd * 9) ' 0～9の値をランダムで格納
            .Interior.color = RGB(Rnd * 255, Rnd * 255, Rnd * 255) ' セルの色もランダムで変更
        End With
    Next e

End Sub
```

(選択中のセルにランダムで0～9の値を格納し、色を変える処理だよ。)

これを、50*50の2,500セルに実行してみるよ。
![ss_105.png](https://qiita-image-store.s3.amazonaws.com/0/97611/07b1ba5c-8a5f-aa03-d1ce-ac4d3c27e33e.png)


こんな感じ。

結構時間が掛かったよね。

## 速度計測を追加
具体的にどれぐらい掛かるのか、計測できるようにしてみるよ。

先のコードに2行追記するよ。

上側に `Dim startTime As Single: startTime = Timer`
下側に `MsgBox "所要時間 : " & Format(Timer - startTime, "0.00") & "秒"`
を追記してね！

```vbnet
Private Sub CommandButton1_Click()
    
    Dim startTime As Single: startTime = Timer ' [追記]
    Dim myRange, e As Range: Set myRange = Selection
    
    ' - 処理 -
    For Each e In myRange
        With e
            .Value = CInt(Rnd * 9)
            .Interior.color = RGB(Rnd * 255, Rnd * 255, Rnd * 255)
        End With
    Next e

    MsgBox "所要時間 : " & Format(Timer - startTime, "0.00") & "秒" ' [追記]

End Sub
```

出来たかな？

この状態で実行すると、処理が終わった後に、実行に掛かった時間が表示されるよ！
![ss_106.png](https://qiita-image-store.s3.amazonaws.com/0/97611/0451b770-411e-a28c-86af-b087fc0523f2.png)
約15秒…。 (※環境によって異なるよ)


## 描画処理を無効化
今度は今回の高速化対策「描画処理無効化」を導入してみるよ！

またまた処理の上下に2行追記するよ。

上側に `Application.ScreenUpdating = False`
下側に `Application.ScreenUpdating = True`
を追記してね！

```vbnet
Private Sub CommandButton1_Click()
    
    Dim startTime As Single: startTime = Timer
    Dim myRange, e As Range: Set myRange = Selection
    
    ' 画面更新無効化
    Application.ScreenUpdating = False ' [追記]
    
    ' - 処理 -
    For Each e In myRange
        With e
            .Value = CInt(Rnd * 9)
            .Interior.color = RGB(Rnd * 255, Rnd * 255, Rnd * 255)
        End With
    Next e
    
    ' 画面更新再開
    Application.ScreenUpdating = True ' [追記]
    
    MsgBox "所要時間 : " & Format(Timer - startTime, "0.00") & "秒"

End Sub
```

もう一度実行してみると…？
![ss_107.png](https://qiita-image-store.s3.amazonaws.com/0/97611/90c3fb00-8dce-3b2a-3194-0ee7bdb91f70.png)
約8.5秒！ (※環境によって異なるよ)

半分ぐらいになったね！


## 解説

コンピューターにとって描画処理はとても重労働なんだね！

今回の場合、

```vbnet
        With e
            .Value = CInt(Rnd * 9)
            .Interior.color = RGB(Rnd * 255, Rnd * 255, Rnd * 255)
        End With
```

この処理の度に描画処理が行われるから、2,500セルを対象にした場合、2,500回も描画処理が行なわれちゃうよ！

途中経過を表示する必要がない場合は、処理に入る前に描画処理をOFF(`Application.ScreenUpdating = False`)にして、
処理が終わった後に描画処理をON(`Application.ScreenUpdating = True`)することで、描画処理を1回にすることができるよ！

たった2行で導入できるから、とっても簡単ね！

有効に使っていこう！
ios9でunityのwebviewが表示できない問題

# ios9でなんかwebview表示できね。。なんや。。

ゲームアプリなどで組み込まれているwebviewですが
以下の環境でビルドしたときにエラーがでて表示できない状態になりました。
別のios9の不具合調査中に、あれなんか出てなくね？という感じで発覚。


- OS X El Capitan 10.11
- unity4.6.9
- xcode7.1
- [gree/unity-webview][gree/unity-webview_url]


どうもios9ではhttpでのアクセスができなくなっているようなので調べてみたら、httpを自動的にhttpsに切り替えるApp Transport Securityという機能が入っているようです。

[iOS9 ATS問題][iOS9 ATS問題_url]

# 解決?：ATSの無効化

[【iOS9】HTTP→HTTPSだと！App Transport Security(ATS)について][【iOS9】HTTP→HTTPSだと！App Transport Security(ATS)について_url]

上記のサイトを参考にとりあえずATSを無効化することでwebviewが表示されるようになりました。
ただATSを無効化はApple非推奨な方法だそうなので、ドメインを指定してhttp通信を許可する方法に切り替えようと思います。


短いスパンでxcodeやos更新してきて、いろいろと困難投げかけてくるApple様にはいつも殺意と感謝しかありませんね⭐︎

何か違うとかあればご指摘お願いします。





[【iOS9】HTTP→HTTPSだと！App Transport Security(ATS)について_url]:http://mushikago.com/i/?p=6150
[iOS9 ATS問題_url]:http://qiita.com/yanayanalte/items/e6d83c12af77fa238a58
[gree/unity-webview_url]:https://github.com/gree/unity-webview
Slappy - 簡単にslackのbotを作れるgemを作った


## 概要

[slack apiでbotを作ってみた](http://qiita.com/takesato/items/f640be2af2c802938827)を見て、 `slack-api` gemを使ったら便利だったけれど、いくつか不便な点があったのでgemを作ってみました。

https://github.com/wakaba260/slappy

動機としては、rubyとdsl使ってhubotぐらいのノリでさくっとbot script書きたかったから。

[ruboty](https://github.com/r7kamura/ruboty)とか[lita](https://github.com/litaio/lita)とかも見ましたがコードが長くなりそうで、もっとカジュアルに書けるものが欲しいなと。


## Slappy？
### slack-apiでbotを作る際に不便な点

- `slack-api` の仕様の問題で、slackから返ってくるパラメータがJSONそのまんま返ってくる
- イベントハンドラが1つしか登録できない

### slack-apiをそのまま使う場合

```ruby:slack_api_sample.rb
require 'slack'

Slack.configure {|config| config.token = ENV['SLACK_TOKEN'] }
client = Slack.realtime

client.on :message do |data|
  # data['channel']はIDで返ってくる
  # data.key?('text')にしているのは、textのキーがないJSONが返ってくることがあってそこでbotがしぬため
  if data.key?('text')
    # イベントハンドラが1つしか登録できないのでcase文で分岐する
    case data['text']
    when 'hoge'
      params = {
        channel: data['channel'],
        username: "botname",
        text: "message!"
      }
      Slack.chat_postMessage params
    end
  end
end

client.start
```

コードが長くなって面倒でした。
（`slack-api` はSlack APIのwrapperなので仕方ないですが）

### Slappyの場合

```ruby:slappy_sample.rb
hear '^hoge$' do |event|
  say 'message!', channel: event.channel, username: "botname"
end
```

このぐらい短くなります。

## Slappy Quick Start
### 1. SlackのAPI TOKENを取得する

[ここ](https://api.slack.com/web)で作成。

### 2. 環境変数SLACK_TOKENにAPI TOKENを設定

デフォルトで `ENV['SLACK_TOKEN']` を見るように鳴ってます。
dotenv使ってもいいですね。dotenv使う場合は `slappy_config.rb` の中で `Dotenv.load` を呼んでください。

### 3. generatorでテンプレート作成

`rails new` みたいなノリで作れます。

```bash
$ slappy new project-name
```

カレントディレクトリを対象にする場合は下記で。

```bash
$ slappy new
```

### 4. コードを書く

生成されたディレクトリに `slappy-scripts` というディレクトリがあるので、コードを書きます。
ファイルは複数設置できて、ファイルごとにスコープは独立してます。

```ruby:sample.rb
# catch pattern
hear '^hello, slappy!' do |event|
  say 'hello!!', channel: event.channel #=> respond message to channel
end
```

`hear` に渡す文字列を正規表現に変換してパターンマッチして、マッチしたらブロックを実行します。

### 5. 起動

```
$ slappy start
```

で起動します。

## その他

`slappy_config.rb` でconfigureしてます。

```ruby:slappy_config.rb
require 'slappy/dsl'

Slappy.configure do |config|
  config.token = 'foobar'
  config.robot.username   = 'slappy'
  config.robot.channel    = '#general'
  config.robot.icon_emoji = ':slappy:'
end
```

ここの `config.robot` で設定した値が `say` でSlackのAPIに渡されるパラメータのデフォルト値になります。
パラメータは[公式ドキュメント](https://api.slack.com/methods/chat.postMessage)を参考にしてください。

## 今後の拡張とか

- スケジューラ
    - botなら必須で欲しい機能かなと思うので入れたい
    - [whenever](https://github.com/javan/whenever)とか使ってもいいんですが、herokuだとcron使えない
    - rubotyでも使われてる[chrono](https://github.com/r7kamura/chrono)あたりを使えば良さそう
- private channelへの投稿
    - 現状private channelはチャンネル名で投稿できない（IDならできるので、replyには使えます）
    - Incomming webhook使うなりAPI叩くなりでchannel list取ってこれればいけそう
- hubotでいうrespond
    - bot nameをprefixにつけたやつだけ反応する機能
- shellでの実行
    - testableにするために欲しい
- `hear`へのオプション
    - `here 'hoge', channel: 'foo'` でfooチャンネルにだけ反応するとか
- メッセージ以外への反応
    - 誰かがjoinしたときとか、メッセージ投稿以外のイベントを拾って反応するハンドラ
- 画像アップロードなど
    - `slack-api`が対応してるので、そちらに委譲すれば楽に出来そう

## 最後に

初めてgem作ったのでいろいろ勉強になりました。
Pull Request歓迎してます。

特に英語が壊滅的なのでそちらチェックして欲しい
Javadocの概要ページ設定

JavaDocの先頭ページにプロジェクトの概要を表示する方法とJavadocにpackageの情報ページを入れる方法です。Javadocを公開する場合は必須、テストソースのjavadocの場合はテスト観点や目的、結果を乗せるページとなるので割と重要。
プロジェクト概要ページは構成管理者、パッケージ情報ページはそのパッケージの開発者が作成時にまとめるルールが必要でしょう。特にパッケージ情報は忘れがちなのでCheckstyleでチェックした方がいいかも。

<h1>プロジェクト概要</h1>

プロジェクト概要ページは開発の最初に作成してしまえば特にメンテナンスをする必要もないので是非作成してほしいところ。

１. 以下のようなhtmlファイル(名前は任意。例：overview.html)を作成し、任意の場所に保存する(通常はJavadoc生成対象のルートディレクトリとかに置くのがよいかも)。
Javadocの概要ページには\<body>タグの中身が表示される。

``` overview.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title></title>
</head>
<body>
  概要コメントファイルの例です。最初の一文は、概要ページの先頭にも表示されます。
  <p>
  概要コメントファイルには、通常以下のような内容が記述されます。
  <ul>
    <li>アプリケーション全体の説明
    <li>標準、規格等へのリンク
    <li>その他もろもろ
  </ul>
  他にも、テストのJavadocの場合はテストの前提条件、観点等を記載するといいでしょう。
</body>
</html>
```

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/96681/73935a45-99fe-603b-8de7-26a8cef3f63d.png)

２. Javadocコマンドのオプション-overviewでこのファイルを指定する。
Eclipseの場合はパッケージエクスプローラの
``` Javadoc出力フォルダルート右クリック⇒エクスポート⇒Java-Javadoc ```
のダイヤログの3面目の[追加のJavaオプション]に
``` -overview D:\xxxx\overview.html ```
のように設定します。
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/96681/2e0214d2-765b-d9aa-dcac-cbdea6360163.png)
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/96681/d09379bc-6cfb-6505-0052-fafe3f96b2f7.png)

３. 結果
赤枠で囲った部分が反映されたところ。
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/96681/444dc3f5-f959-0f91-cf2d-a44705e27fc0.png)

<h1>パッケージ情報</h1>

Javadocではパッケージ毎にそれぞれ説明を入れることができる。通常の業務開発ではあまりありがたみがないが、基盤開発の場合はlib、common、util配下のそれぞれのパッケージの説明がかなり重要になる。
seleniumのテストソースの場合等は機能毎にパッケージを分けて作成し、それぞれのパッケージ情報にテストする機能概要、観点等を記載しておけばテスト仕様書の作成が楽になるかも。

１. 説明を付与したいパッケージのディレクトリの直下に「package-info.java」という名前で配置する。
![image5.png](https://qiita-image-store.s3.amazonaws.com/0/96681/878e57f8-0b64-7fa7-c34d-edaf4bae95e0.png)

２. package-info.javaにJavadocで説明を記載する。Javadoc生成時は特にオプションの指定の必要はない。

``` package-info.java
/**
 * 最初の文はタイトルの直下にも表示されます。
 * 説明本文です。ここでは一般的なHTMLタグが使用できます。
 */
package hogehoge.hugahuga.burabura;
```

３. 結果
トップページ
![image6.png](https://qiita-image-store.s3.amazonaws.com/0/96681/479b9a76-f5bb-4fe6-cb47-f3e24fae00d8.png)

パッケージの先頭ページ
![image7.png](https://qiita-image-store.s3.amazonaws.com/0/96681/d184665b-5a60-1710-2f19-c06db9f928b6.png)
Clojure で書いたアプリケーションを速く実行する

[これ](http://qiita.com/bori_so1/items/16b5e0e2d61e6b897fca)を読んでたら Clojure でも同じこと書けるなーって思ったんだけど、全く同じことを書いても面白くないのでちょっと色々書いてみる。

こんな感じの素朴なコードを書く。

```clj
(ns fib.core
  (:gen-class))

(defn fib [n]
  (if (<= n 1)
    n
    (+ (fib (- n 1))
       (fib (- n 2)))))

(defn -main []
  (println (fib 40)))
```

project.clj はこんな感じ。

```clj
(defproject fib "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.7.0"]]
  :main fib.core)
```

さて、 `lein run` で実行してみましょう。

```bash
$ time lein run
102334155
lein run  33.51s user 3.17s system 118% cpu 30.965 total
```

34 秒くらいかかってます。遅いです。とはいえ、 `lein run` で実行することなんて普通あり得ないので uberjar しましょう。

```clj
(defproject fib "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.7.0"]]
  :main fib.core
  :aot :all)
``` 

`:aot` をたして `lein uberjar` します。

```bash
$ time java -jar target/fib-0.1.0-SNAPSHOT-standalone.jar
102334155
java -jar target/fib-0.1.0-SNAPSHOT-standalone.jar  3.04s user 0.41s system 127% cpu 2.709 total
```

3 秒くらいになりましたが、まだ遅いですね。折角 Clojure 使ってるのに素朴な実装しているのが良くないので Clojure らしくよしなに書きましょう。

```clj
(ns fib.core
  (:gen-class))

(defn l-fib* [a b]
  (cons a (lazy-seq (l-fib* b (+' a b)))))

(defn l-fib [n]
  (first (drop n (l-fib* 0 1))))

(defn -main []
  (println (l-fib 40)))
```

```bash
$ time java -jar target/fib-0.1.0-SNAPSHOT-standalone.jar
102334155
java -jar target/fib-0.1.0-SNAPSHOT-standalone.jar  1.08s user 0.43s system 174% cpu 0.865 total
```

これでもまだ 1 秒かかりますが、これはもうほとんど JVM の起動時間みたいなもんなので [drip](https://github.com/ninjudd/drip) を使って JVM の起動時間をカットしましょう。

```bash
$ time drip -jar target/fib-0.1.0-SNAPSHOT-standalone.jar
102334155
drip -jar target/fib-0.1.0-SNAPSHOT-standalone.jar  0.05s user 0.14s system 85% cpu 0.212 total
```

とても速くなりました。

## もう一歩踏み込む

今回書いたプログラムは引数を実行時に受け取るわけではないので、実は実行時間に計算をする必要がありません。 Clojure にはマクロがあって、このようなプログラムであればコンパイル時間で解決できます。

やってみます。

```clj
(defmacro m-fib [n]
  (l-fib n))

(m-fib 40)
```

これだけです。これをマクロ展開すると `102334155` という結果が出てきます。引数が充分にちいさいので実行時、コンパイル時のどちらで実行してもあまり時間差はありませんが、これが `1e5` くらいのサイズになると少し差が出てきます。

通常コンパイル時間に問題が解決出来ることはあまり多くないですが、実行時間で計算する必要がないものはコンパイル時間で計算しておくことによって最終的なアプリケーションの実行時間を短くすることが出来ます。

という当たり前の話を書いてみました。

## 宣伝

[【参加者募集】 Clojure ワークショップ(仮)](https://japanclojurians.doorkeeper.jp/events/34090)
UnityでMonoBehaviourのシングルトン

いろいろなところでかかれているから、何番煎じかわからんけど書いてみます。

```csharp:SingletonMonoBehaviour.cs
using System;
using UnityEngine;

public abstract class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour
{
	private static T instance;
	public static T Instance
	{
		get
		{
			if (instance == null)
			{
				Type t = typeof(T);

				instance = (T)FindObjectOfType(t);
				if (instance == null)
				{
					Debug.LogError(t + " をアタッチしているGameObjectはありません");
				}
			}

			return instance;
		}
	}

	virtual protected void Awake ()
	{
		// 他のGameObjectにアタッチされているか調べる.
		// アタッチされている場合は破棄する.
		if (this != Instance)
		{
			Destroy(this);
			//Destroy(this.gameObject);
			Debug.LogError(
				typeof(T) +
				" は既に他のGameObjectにアタッチされているため、コンポーネントを破棄しました." +
				" アタッチされているGameObjectは " + Instance.gameObject.name + " です.");
			return;
		}

		// なんとかManager的なSceneを跨いでこのGameObjectを有効にしたい場合は
		// ↓コメントアウト外してください.
		//DontDestroyOnLoad(this.gameObject);
	}

}
```

```csharp:NewBehaviourScript 
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : SingletonMonoBehaviour<NewBehaviourScript>
{
	override protected void Awake()
	{
		// 子クラスでAwakeを使う場合は
		// 必ず親クラスのAwakeをCallして
		// 複数のGameObjectにアタッチされないようにします.
		base.Awake();
	}

}
```

SingletonMonoBehaviourを継承すればとりあえずできます。
実行時にプログラムなどで行うような(prefabにアタッチされInstantiateとか、AddComponent)のようなものではなく
用意されるシーンのHierarchyにはじめからあるGameObjectにアタッチして使うようなことを想定かも。

↓こんな感じでインスタンスは取得

```csharp
NewBehaviourScript obj = NewBehaviourScript.Instance;
```
コレクションエディタのメンバペインの表示名変更

コレクションエディタのメンバー名は規定ではコレクション要素のクラス名が表示されます。これを任意文字列に変更するサンプルです。

（元の表示）
![CollectionEditor00.png](https://qiita-image-store.s3.amazonaws.com/0/41649/7eab8392-7004-e443-c832-7145beb3b68e.png)

`code`

    /// <summary>
    /// プロパティグリッドでプロパティを設定するクラス
    /// </summary>
    public class PropertyGridSample
    {
        public List<Sample> Samples { get; set; }
    }

    /// <summary>
    /// コレクションエディタで設定するプロパティ
    /// </summary>
    public class Sample
    {
        public string Content { get; set; }
    }

（プロパティに設定した文字列を使用）
![CollectionEditor01.png](https://qiita-image-store.s3.amazonaws.com/0/41649/ed90026a-5fa6-9f55-1d72-aa56e274784a.png)

`code`

    /// <summary>
    /// コレクションエディタで設定するプロパティ
    /// </summary>
    public class Sample
    {
        public string Content { get; set; }

        /// <summary>
        /// メンバーに表示する文字列を返す
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            if (string.IsNullOrEmpty(Content))
            {
                return "Sample";
            }
            return Content;
        }
    }
REPLを実装する

プログラミング言語に触れてたらREPLを実装したくなるじゃないですか。

> Read-eval-print loopの略
> 字のごとく読んで評価して表示して繰り返す。対話型評価環境を指す。

[REPLとは - はてなキーワード](http://d.hatena.ne.jp/keyword/REPL)

なるほどね。

```lisp
(loop (print (eval (read))))
```

右から順に読んで“Read-Eval-Print Loop”でたしかに**REPL**だ。

> この記事の内容を実行して途中で停止したいときは<kbd>Ctrl+D</kbd>とか<kbd>Ctrl+C</kbd>で

Rubyでやってみよう。

```sh
% ruby -e'loop{p eval gets}'
1 + 2 * 3
7
"Pixiv".downcase
"pixiv"
```

うん、ばっちりだね。“Gets-Eval-P Loop”で**GEPL**だ。

PHPだとちょっと長くなる。

```sh
% php -r'while(1){ $code = sprintf("\$result = %s;", fgets(STDIN)); eval($code); var_dump($result); }'
1 + 2 * 3
int(7)
strtolower("Pixiv")
string(5) "pixiv"
```

“Vardump-Eval-Fgets While”で**VEFW**だ。なにがなんだか。

Python(2.7)ではどうか。ワンライナーで書くのがたいへんつらい。

```sh
% python -c "while True:
    print(input())
"
1 + 2 * 3
7
"Pixiv".lower()
pixiv
```

なんでかわかんないけど、Python 2系の`input()`は`eval(raw_input(prompt))`と同じです。誰が得するんだろう… とみんな思ったのか、Python 3000の`input()`は2系の`raw_input()`と同じです。

“Input-Print While”で**IPW**だ。もしくは“Rawinput-Eval-Print-While”で**REPW**か！

## 最後に

適当にLispでは〜 みたいなことを書いたけど、実はCommon Lispをまともに書いたことがないのでやってみた。

```lisp
% sbcl
This is SBCL 1.2.16, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
* (loop (print (eval (read))))
(+ 1 (* 2 3))

7
debugger invoked on a END-OF-FILE in thread
#<THREAD "main thread" RUNNING {1002C74753}>:
  end of file on #<SB-SYS:FD-STREAM for "standard input" {100632C013}>

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(SB-IMPL::INPUT-CHAR/UTF-8 #<SB-SYS:FD-STREAM for "standard input" {100632C013}> T 0)
0] (string-downcase "Pixiv")

"pixiv"
0] ^D
*
```

よくわかんないけど、デフォルトのプロンプト`*`が出てないので動いてる気がした。(もしかしたら動いてないのかも)

あとPerlを勉強してみようかと思ったけどデータ型がよくわかなかったので諦めた。
Reduxで大量に発生するactionを間引く

scrollイベントに関連するactionなど、大量に発生するactionを間引く、Redux middlewareを作りました。

https://www.npmjs.com/package/redux-throttle-actions

## インストール

```
$ npm install --save redux-throttle-actions
```

## 使い方

第1引数は間引きたいAction Typeを配列もしくは文字列で指定します。文字列の場合は、
内部で配列にして処理します。
第2引数は間引きたい秒数をmillisecondsで指定します。

```js
import {createStore, applyMiddleware} from "redux";
import throttleActions from "redux-throttle-actions";
// combineReducersされたreducer達
import reducers from "./reducers";
import {someType} from "./constants/actionTypes";

// someTypeが実行頻度が100msに一度になるように間引く
const throttleSomeType = throttleActions(someType, 100);
const store = applyMiddleware(throttleSomeType)(createStore)(reducers);

// In view
store.dispatch({ type: someType, ... }); // dispatchされる
store.dispatch({ type: someType, ... }); // 間引かれて、dispatchされない
store.dispatch({ type: someType, ... }); // 間引かれて、dispatchされない

// 一度目のdispatchから100ms経過

store.dispatch({ type: someType, ... }); // dispatchされる
```

内部で[lodashのthrottle関数](https://lodash.com/docs#throttle)を使っており、
第3引数はthrottle関数の第3引数に渡される。（options.leadingとoptions.trailing）

```js
// そのまま内部で使っている_.throttleの第3引数に渡される
const options = { leading: true, trailing: true };
const throttleSomeType = throttleActions(someType, 100, options);
```

バグや要望とはGithubのIssueでお願いしますー

https://github.com/pirosikick/redux-throttle-actions/issues
HP Stream 11にAntergosをインストールしてすこぶる快適になっている話

3ヶ月ほど前に[HP Stream 11にUbuntuをインストールしてすこぶる快適になっている話 - Qiita](http://qiita.com/ka_/items/671bc04e7ee28c92cdf8)という記事を投稿しました．

最近，インストールが簡単に出来るArch Linuxベースの [Antergos](https://antergos.com/) というディストリビューションに移り変わって，当時悩んでいた問題が全てデフォルトで解決しています．

なんでArch Linuxをそのままインストールしなかったのかというと，インストールの最後の最後，`grub-install`コマンドを実行してマシンが自分一人でブート出来る状態にしよう，というところがGPTとかEFIとかナニソレおいしいの状態の私には越えられなかったからです．というかそもそもeMMCデバイスでのパーティションの切り分け方が，`/boot`と`/boot/efi`とをどうしたらいいのかとか全然分かってないという．

しかしAntergosを使うと，UbuntuのDesktop Editionのインストーラと同様の簡単さで，その辺も適当にやってたら上手いことやってくれました．Arch Linuxインストールバトルで挫折した人，マジおすすめです．

ちなみに私はパーティションの切り分けは先にLubuntuのインストーラを使ってやっておきました．やっておいたというか，パーティションを全部消しておきました．Antergosインストーラ先生にこまけぇことは任せました．

GUI環境も，いくつかの候補から選ぶだけで，勝手に作ってくれます．私はとりあえずOpenbox(※LubuntuというかLXDEで採用されてるやつ)を選択して，後で [awesome](http://awesome.naquadah.org/) をインストールしました．

プリンタやBluetoothのサポートも不要ならここで切っておけます．後からインストールするのも(多分)楽です．

完全に負け惜しみになりますが，そもそも自分のやりたかったことは`pacman`とか`yaourt`とかを使って最新バージョンのビルド済みパッケージをぽんぽん手元に持ってきて開発環境を構築したい，というだけのことだったので，GUIとか簡単に作ってくれるならそれに越したことは無いですね．

もうUbuntuメイン時代に何回手元でVimとRubyのビルドをしたことやら．シェルスクリプトにビルド手順を自分でまとめておけば(参考: [kaosf/ubuntu-setup](https://github.com/kaosf/ubuntu-setup))いいっちゃいいのですけど，それなら

```bash
sudo pacman -S ruby
sudo pacman -S gvim
```

ってやるだけの方が簡単です．速いし．

件のawesomeだって，


```bash
sudo pacman -S awesome
```

だけで最新版(現在 3.5.6)が入ります．`add-apt-repository`でリポジトリを追加して`apt-get update`して…なんてしなくて良い．

ちなみにHP Stream 11は貧弱マシンなので開発環境にするというよりはSSHのクライアントになることが多いです(最近はmoshを使うことが多いけど)．開発の主体は，ConoHa VPS上に作ってあるArch Linuxの環境です．なんとConoHa VPSでは標準のイメージのリスト内にCentOSやUbuntuに交じってしれっとArch Linuxがあります．とりあえず一番簡単に試せるんじゃないでしょうか？

ということで，Antergos環境でUbuntuの頃に出来てたけど今出来ないから困ってる，ってことは一つも無く，快適に過ごせていますという話でした．

まだぶっ壊れたパッケージに遭遇したとか依存関係で死んだとかそういうよく聞く(？)感じの問題にブチ当たってないだけなのかもしれませんが…

そしたらその時はその時できっと [ArchWiki](https://wiki.archlinux.org/index.php/Main_page)([日本語版](https://wiki.archlinuxjp.org/)) なりTwitter上なりでなんか情報が出てて解決出来る…んじゃないかなぁ．多分．

次にマシンを買い替えなりOS入れ直しなりするときには，改めて素のArchのインストールに再挑戦してみたくはあります．

ちなみに，HP Stream 11は売上がよかったらしくて[まもなくマイナーチェンジモデルが出ます](http://little-beans.net/exposition/hp-stream11-2015-winter/)．eMMCの仕様は変わってないので，誰か買って素のArchをインストールしてみませんか？
Stringリソースで%を文字として表示する


文字列の一部をプログラムから扱うなどするとき

```string.xml
<string name="string_samples">取得中……%1$d </string>
```

動的に文字をいれたあとに「%」をいれることで少し詰まった。

NG 落ちる。

```string.xml
<string name="string_samples">取得中……%1$d% </string>
```
NG 落ちないが表示されない

```string.xml
<string name="string_samples">取得中……%1$d\% </string>
```

OK

```string.xml
<string name="string_samples">取得中……%1$d %% </string>
```


[参考]http://qiita.com/le_skamba/items/3c7c05d8d137185f753f
ありがとうございます
activity起動の仕方を変更する


Activityを起動するとき、デフォルトだと下から画面が立ち上がる。
ハンバーガーメニューからメニュー画面を開きたい時など、必ずしも下から上にニュッっと出てきてほしくないときもある。

そんなときは
Activityに用意されているメソッド```overridePendingTransition()```を使うと簡単でかなり細かい指定までできた。


画面起動時は、onCreateに書く

```

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.app_menu);
        overridePendingTransition(R.anim.slide_in_left, R.anim.not_move);
        
        }
        
```


画面終了時はfinishに書く

```

 @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.not_move, R.anim.slide_out_left);
    }


```


もともとのメソッド定義は以下のようになっている。

```Activity

public void overridePendingTransition(int enterAnim, int exitAnim) {
        try {
            ActivityManagerNative.getDefault().overridePendingTransition(
                    mToken, getPackageName(), enterAnim, exitAnim);
        } catch (RemoteException e) {
        }
    }
    
```

activityの動きを一括して決めるのではなく、startActivityされたときに新しく立ち上がるactivity,backgroundに回るactivityの動きを指定できるみたい。

色々試してみると楽しい。
animationListの切り替え時・終わりを取得するクラスの作成


画像やdrawableを用意すれば簡単に切り替えアニメーションが作れるanimationListの切替時・終わりを取得するクラスを作った。


参考にさせていただきました＞＜
[アニメーションの完了が分かるAnimationDrawer]http://qiita.com/Hoshi_7/items/053af5dab53896205081




```drawable

<?xml version="1.0" encoding="utf-8"?>
<animation-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/shape_progressbar_0" android:duration="1000"/>
    <item android:drawable="@drawable/shape_progressbar_14" android:duration="1000"/>
    <item android:drawable="@drawable/shape_progressbar_31" android:duration="1000"/>
    <item android:drawable="@drawable/shape_progressbar_43" android:duration="1000"/>
    <item android:drawable="@drawable/shape_progressbar_52" android:duration="1000"/>
    <item android:drawable="@drawable/shape_progressbar_68" android:duration="1000"/>
    <item android:drawable="@drawable/shape_progressbar_82" android:duration="1000"/>
    <item android:drawable="@drawable/shape_progressbar_100" android:duration="1000"/>
</animation-list>


```

こちらのdurationを取得してきて操作操作しています。


```

public class InformStateAnimationDrawable extends AnimationDrawable{
    private OnAnimationStateListener mListener;
    private Handler mHandler;
    private List<Integer> durationList;


    public InformStateAnimationDrawable(AnimationDrawable drawable) {
        mHandler = new Handler();
        for (int index = 0; index < drawable.getNumberOfFrames(); index++) {
            this.addFrame(drawable.getFrame(index)
                    , drawable.getDuration(index));

        }
    }

    public void setOnAnimationStateListener(OnAnimationStateListener listener){
        mListener = listener;
    }

    @Override
    public void start() {
        super.start();
        if(mListener != null) {
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    mListener.onAnimationEnd();
                }
            }, getTotalDuration());

        }
    }




    public int getTotalDuration() {
        int duration = 0;
        for (int i = 0; i < this.getNumberOfFrames(); i++) {
            //frameが変わった時を検知するため
            final int finalI = i;
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mListener.onFrameChanged(finalI);
                }
            },duration);
            duration += this.getDuration(i);
        }

        return duration;
    }

    public interface OnAnimationStateListener {
        public void onAnimationEnd();
        public void onFrameChanged(int i);
    }

}


```


activity側ではstartして、OnAnimationStateListenerをimplementsして操作する。

```activity.onCreate()

AnimationDrawable animation = (AnimationDrawable) mCompleteProgressView.getBackground();

        InformStateAnimationDrawable frameAnimation = new InformStateAnimationDrawable(animation);
        frameAnimation.setOnAnimationStateListener(this);
        frameAnimation.start();
        animation.start();
        
```


二重にstartしていたりもう少しスマートな方法がある気がする…。
ZFS on Linux を設定する(1) - ストレージプールの作成

[続き](http://qiita.com/flny/items/340c41b8406dc699b99a)

# そもそもZFSとは
on Linux でなく本家Solaris版に対する評価ですが、[こちら](http://www.atmarkit.co.jp/ait/articles/0903/13/news125.html)の記事がわかりやすいと思います。用語の説明は[オフィシャルサイト](https://docs.oracle.com/cd/E24845_01/html/819-6260/ftyue.html#scrolltoc)が詳しいでしょうか。少し使ってみて感じた個人的な評価は下記の通りです
## メリット
* クラウドサービスベンダのごとく、ありもしないディスク領域を割り当てしてみせることで ディスクの空き容量を共有できる
* ファイルシステムレベルでRAIDが構成できる
* 何となく堅牢な気がして安心(特にRAID5/6の書き込みホール対策)
* 色々カスタマイズができて楽しいかもしれない

## デメリット
* 物理的にドライブを追加するのが意外と難しい
* メモリがたくさん必要
* 色々カスタマイズしても何となく遅い

# ストレージプールを作成する
まず zpool create コマンドでストレージプールを作成します。-f はディスク上に既存の定義があっても上書きするオプションです。tank はプールにつける名称、raidzはRAID5に相当するRAIDレベルを表します。raidzの後に続くデバイスファイル(今回は4つ)でraidzを構成します。のちの構成変更に備えるため、デバイスの指定には/dev/sd[a-z]でなく /dev/disk/by-id/hoge を使うとよいです。

```
$ sudo zpool create -f tank raidz /dev/disk/by-id/ata-TOSHIBA_MQ01ABD100_Y4FIP28VT /dev/disk/by-id/ata-WDC_WD10EACS-00D6B0_WD-WCAU41201490 /dev/disk/by-id/ata-WDC_WD20EZRX-00D8PB0_WD-WMC4M0E2Y15L /dev/disk/by-id/ata-WDC_WD5000AADS-00S9B0_WD-WCAV90513859
```
プールの作成はすぐに終わり、/tank にマウントされます。

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        94G  1.5G   92G   2% /
(略)
tank            1.3T  128K  1.3T   1% /tank
```
今回、1TB, 2TB, 1TB, 500GB の4台のディスクでraidzを構成しましたので、一番小さいサイズの 500GB x (4 - 1) = 約1.5TB がプールの容量になります。500GBのディスクを構成に含めることによって むしろ容量が減っているのですが、なぜそうまでして4台構成にしたいのか、以下で説明します。

## プールの容量を増やすには
raidzは、最初に構成するときにだけ ディスク台数を指定できます。あとからディスクを追加することはできないのです。従って ディスクを増設してプールの容量を増やしたいときは、
1. raidzを構成しているディスクそれぞれを、よりサイズの大きいものに置き換える
2. 同じプールにもう1つraidzを追加し、既存のraidzとストライピングする(RAID5+0に相当)
のいずれかの対処が必要となります。個人利用では1も2も結構な投資になるため おいそれとはできません。デメリットに記述した「物理的にドライブを追加するのが意外と難しい」は この事を指しています。
"家庭内サーバの移行"という要件で ZFSを使おうとしており、移行が済めば2TBのディスクがいくつか余る予定です。raidzを4台構成としておき、1TB/500GBのディスクを2TBと置き換えれば 2TB x (4 - 1) = 約6TB がプールの容量となります。これが一時的に500GBのディスクを借り出してでも4台構成としたかった理由です。

[続く](http://qiita.com/flny/items/7b55acc571a5fe129db1)
Babel + Browserfyでコメントを除去したいだけなら特殊なpluginなどはいらなかった話


minifyじゃない。コメントだけ消したいんだよ！
みたいなのにちょっと苦戦したのでメモ。

# 結論
特にpluginなどはいらなかった。`babelify`で十分

```js
gulp.task('babel-build', function(){
  browserify({
    entries: "someFile.js",
    extensions: ['js', 'jsx'],
  })
  .transform(babelify.configure({
    comments: false // これ！
  }))
  .pipe(source("bundle.js"))
  .pipe(gulp.dest("/dest"))
})
```

## ドキュメントとか
https://babeljs.io/docs/usage/options/
↑
ここ。
`comments`オプションがあった。最初は「コメント除去とかはbabelの責務なわけ無い」と思ってたけどどうもそうでもないらしい。思い込みだった。
sourcemapとかも多分一番綺麗に対応してくれる気がする。

## 経緯とかメモとか

- 最初、[gulp-uglify](https://www.npmjs.com/package/gulp-uglify)を試してみた
	- → 失敗。コメントだけ消したいけど結構色々変換されててだるい。
	- 色々オプションいじってみるが思った感じにならぬ。辛い。
	- まあ別にそれでもいいんだけど・・・
- 次に[minifyify](https://www.npmjs.com/package/minifyify)を試す
	- → callbackの書き方とgulpの組み合わせが微妙そうで挫折。
- 次に[gulp-strip-comments](https://www.npmjs.com/package/gulp-strip-comments)を試す
	- → 一応動くっぽいがsourcemapがうまくいかない・・・
- ここでbabelのドキュメント読み返す。
	- あるじゃん！
	- おしまい。
初めて学ぶ言語ではまずfizzbuzzを書いてみると捗る。

[新言語を学ぶ時の３つのポイント～見習いPGのメモ～](http://qiita.com/ultrabirdtech/items/b00380a9ca73494a75cd)を読んで、
fizzbuzzは新しいプログラミング言語の入門に最適だと思ったという話。

## fizzbuzzとは

fizzbuzzとは、数字を使った言葉遊びです。
日本では世界のナベアツ（桂三度）さんのネタでも有名な、
「実数を読み上げていき、決められたタイミングで違うことをする」やつです。
それをプログラムの設問にすると以下のようになります。

> 1から100（あるいは任意の実数）までの各実数値をひとつずつ表示するプログラムを作成せよ。
> ただし、数値が3の倍数の場合は数値の代わりに"fizz"、5の倍数の場合は"buzz"、
> 3の倍数かつ5の倍数の場合は"fizzbuzz"と表示させること。

処理のアルゴリズムについては解説を省きます。
プログラミング自体の初学者におかれましては、
「どう処理すればこれが実現できるのか？」を考えるのも
プログラミングの工程のひとつですので、自分で考えてみるのもいいかもです。

## なぜfizzbuzzが最適か

今までは特に深い理由はなく、以下の翻訳記事を読んでから、
新しい言語を学ぶ時はまずfizzbuzzを書こう、と思って実践してました。
[どうしてプログラマに…プログラムが書けないのか？](http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm)

その後、冒頭で取り上げた記事を読んでいるうちに、
fizzbuzzは以下のような*通常のプログラミングで頻繁に使う要素*を
最低限含んでいる簡潔なプログラムなんだなーと思いました。

* 数列（配列、リストなど）の生成とその扱い
* 画面表示（標準出力、ウィンドウ、アラートなど）
* ループ
* 条件分岐

また同時にこれらの書き方には
言語による違いが如実に現れていたり、お作法が大きく違っていたりします。
そのため、言語の習熟度によってソースの書き方にも違いが生まれ、
プログラマ業務でよくある以下の作業についても、学ぶことができます。

* コードの簡素化
* コードの効率化

さらに、上級fizzbuzzerにいたっては、
処理がシンプルでコードがいかようにも書けることを活かし、
設問に更なる枷を加えてfizzbuzzを書くチャレンジを行う人もいます。

* 1行で書いてみる（ワンライナー）
* 不適切に書いてみる

## たとえばこんな感じ

以下は自分で書いてみた例です。参考程度にどうぞ。

```php:fizzbuzz.php
<?php
for ($i = 1; $i <= 100; $i++) {
    if ($i % 15 == 0) {
        echo "fizzbuzz";
    } elseif ($i % 5 == 0) {
        echo "buzz";
    } elseif ($i % 3 == 0) {
        echo "fizz";
    } else {
        echo $i;
    }
    echo "\n";
}
```

```rb:fizzbuzz.rb
(1..100).each do |n|
  puts case 0
  when n % 15 then :fizzbuzz
  when n % 5  then :buzz
  when n % 3  then :fizz
  else n
  end
end
```

```py:fizzbuzz.py
for i in range(1, 101):
    if   i % 15 == 0:
        print "fizzbuzz"
    elif i % 5 == 0:
        print "buzz"
    elif i % 3 == 0:
        print "fizz"
    else:
        print i
```

```coffeescript:fizzbuzz.coffee
for i in [1 .. 100]
    fizz = i % 3 == 0
    buzz = i % 5 == 0

    if fizz and buzz
        console.log 'fizzbuzz'
    else if buzz
        console.log 'buzz'
    else if fizz
        console.log 'fizz'
    else
        console.log i
```

## まとめ

これからもfizzbuzzでプログラミング言語の学習を楽しんでいこうと思います。
Qiitaマークダウンの癖

TumblrとかGithubとかとも少し違う。Kobitoを使って書いているとリアルタイムでレンダリングしてくれるので楽チンだなぁと思っていたけれど。。。

中の人の[Markdown記法のチートシート](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)をよく読めば書いてあるんですけどね。

## $記号の表示はエスケープ必要
てか\$記号があると数式のレンダリングが始まっちゃって、\$が表示されない。PowerShellの変数が\$始まりだから結構\$書く機会が多いのに。

Kobitoでは数式に変換されずにちゃんと表示されちゃうから、うっかりそのまま投稿しちゃう。

**\$記号を表示する時は\\でエスケープを忘れずに。**

※ただし見出し部を除く。

## リスト表示は一行おきに
行頭に*なり-なり数字なり…。つけてやるとリスト表示にはなるんだけど、Qiitaは自動で行末の改行を補完するから行間が空きすぎて間抜けになる。

これもKobitoではそんなことないのに、Qiitaでは一行おきにリストが並んでしまう。

**ところがなぜか各リストを一行おきに書いてやると綺麗なリスト表示に。**

## 段落行末の空白は不要
GitHubと違って段落行末に二つの空白を入れなくても改行だけで段落が終了する。ま、これは楽でいいけど。Kobitoは勝手に行末の空白を削除してしまうので特に気にする必要はなし。

マークダウンって難しいね。
Dockerの中でbundle installする

Dockerに慣れるためにとりあえず現在Vagrantでやってることを置き換えようと思ったが、ちょっとハマったのでメモ。

## やりたかったこと

ホストOSからコンテナのrailsディレクトリで`bin/bundle install`したかったのだが、`docker exec`でディレクトリを変える手段が分からなかった。

## 結論

以下のようになった。

```bash
docker exec -t CONTAINER_NAME bash -c 'cd /path/to/app && bin/bundle install --path .bundle'
```

`-t`オプションがないと出力のカラーリングをしてくれなかった。

## ちなみに

```bash
docker exec -t CONTAINER_NAME bash -c cd /path/to/app && bin/bundle install --path .bundle
```

とかだと`bin/bundle`がホスト側で実行されてしまう。
`exec`に渡すコマンドは1つだけのよう。
あと`cd`は`bash`の組み込みコマンドなので単に`cd`では使えない。

あとこれはあくまでちょっと試し書きしたい時にDockerを使いたいという趣旨であって、当然デプロイなどを考慮した用途ではない。念のため。
Bluemixのnode.jsでホスト名を取得する


Bluemixのアプリで自分のアプリのホスト名(xxx.mybluemix.net)※を取得しようとして、ちょっと手間取ってしまったのでメモ。
※別名：「経路」とか「Application Route」とか

#VCAP_APP_HOSTがあるじゃないか -> ×
と思って叩いたら、戻り値が"0.0.0.0"でした。firewallの内側だし、実行しているインスタンスにインターネット上のホスト名(FQDN)を割り振られているわけではないですよと。

```
console.log("process.env.VCAP_APP_HOST=" + process.env.VCAP_APP_HOST );//->0.0.0.0
console.log("process.env.VCAP_APP_PORT=" + process.env.VCAP_APP_PORT );//->61076
```

ちなみに同じようにNode.jsのosモジュール使っても取れませんでした。11桁くらいの文字列(例.1941uvtfexx)が返ってきます。

```
var os = require('os');
var hostname = os.hostname();
console.log("os_hostname=" + hostname );//->1941uvtfexx
```

#VCAP_APPLICATIONを使う -> ○
Bluemixの環境変数にはダッシュボードのGUIから確認できるVCAP_SERVICESの他に、VCAP_APPLICATIONてのもありまして、この中の'application_uris'にありそうでした。

```
VCAP_APPLICATION: '{"limits":{"mem":128,"disk":1024,"fds":16384},"application_version":"ffcaf4eb-14f4-4efc-8ef7-279c02765303","application_name":"xxx-mfs","application_uris":["xxx-mfs.mybluemix.net"],"version":"ffcaf4eb-14f4-4efc-8ef7-279c02765303","name":"xxx-mfs","space_name":"dev","space_id":"ae9ac0c1-240e-4391-b104-ad667a014xxx","uris":["xxx-mfs.mybluemix.net"],"users":null,"application_id":"dbfc0e91-8e87-4a0c-b169-920d22c5xxxx","instance_id":"a34ea5fd8b63405e9df603d4e2fxxxx","instance_index":0,"host":"0.0.0.0","port":62106,"started_at":"2015-11-04 09:24:17 +0000","started_at_timestamp":1446629057,"start":"2015-11-04 09:24:17 +0000","state_timestamp":1446629057}'
```

ので、例えば↓のような感じでとりあえずは良いのかなと。

```

var applicationRoute;
if (process.env.VCAP_APPLICATION ){
	var vcapApplications = JSON.parse(process.env.VCAP_APPLICATION);
	applicationRoute = vcapApplications.application_uris[0];
	console.log("applicationRoute=" + applicationRoute);
}else{
    applicationRoute= "xxx.mybluemix.net";//ローカル実行時とかはこっちで
};
```

#参考.BluemixのLiberty Javaの場合
同じく「VCAP_APPLICATION」を使うか、「HttpServletRequest.getServerName()」など幾つかの方法でで取れるらしいです。

How to get the real request (route) hostname in a liberty web app?
https://developer.ibm.com/answers/questions/163490/how-to-get-the-real-request-route-hostname-in-a-li/?smartspace=bluemix
python > 文字列が含まれているかどうか > if "\n" in res: print "found 3"

```txt:動作確認
CentOS 6.5(32bit)
```

文字列に`\n`が含まれるかのチェック。

参考　http://d.hatena.ne.jp/laco0416/20121022/1350907756
> [追記]
関数を使わずにinステートメントでも解決できるようです。
if 'fuga' in 'hogehoge':


```151109a.py
def main():
	res = ""

	str = ""
	if (len(str) > 0):
		res = res + str
	if "\n" in res:
		print "found 1"

	str = "hello"
	if (len(str) > 0):
		res = res + str
	if "\n" in res:
		print "found 2"

	str = ".bonjour\n"
	if (len(str) > 0):
		res = res + str
	if "\n" in res:
		print "found 3"

if __name__ == "__main__":
	exit(main())
```

```txt:結果
found 3
```
Perl で URL から任意のパラメータを削除する


元のパラメータ順を気にしないなら `query_form` を使うとクエリパラメータをハッシュとして操作できるので簡単。

```perl
use strict;
use warnings;

use Data::Dumper;
use URI;

my $uri = URI->new('http://example.com/foo/bar/baz?qux=123&hoge=123&fuga=999');

print $uri->as_string, "\n";
#=> http://example.com/foo/bar/baz?qux=123&hoge=123&fuga=999

# クエリパラメータを削除して再設定
my %query_hash = $uri->query_form;
delete($query_hash{hoge});
$uri->query_form(%query_hash);

# 削除されているが、Hash を経由するためパラメータの順序は保持されていない
print $uri->as_string, "\n";
#=> http://example.com/foo/bar/baz?fuga=999&qux=123
```

元のパラメータ順を保持したまま不要なパラメータのみ削除したい場合、`URI::QueryParam` によって提供される `query_param_delete` が使える。

```perl
use strict;
use warnings;

use Data::Dumper;
use URI;
use URI::QueryParam;

my $uri_base = URI->new('http://example.com/foo/bar/baz?qux=123&hoge=123&fuga=999&abc=DEF');
print $uri_base->as_string, "\n";
#=> http://example.com/foo/bar/baz?qux=123&hoge=123&fuga=999&abc=DEF

my $uri1 = $uri_base->clone;
$uri1->query_param_delete('qux');
print $uri1->as_string, "\n";
#=> http://example.com/foo/bar/baz?hoge=123&fuga=999&abc=DEF

my $uri2 = $uri_base->clone;
$uri2->query_param_delete('fuga');
print $uri2->as_string, "\n";
#=> http://example.com/foo/bar/baz?qux=123&hoge=123&abc=DEF

my $uri3 = $uri_base->clone;
$uri3->query_param_delete('hoge');
$uri3->query_param_delete('fuga');
print $uri3->as_string, "\n";
#=> http://example.com/foo/bar/baz?qux=123&abc=DEF

my $uri4 = $uri_base->clone;
$uri4->query_param_delete('abc');
print $uri4->as_string, "\n";
#=> http://example.com/foo/bar/baz?qux=123&hoge=123&fuga=999

my $uri5 = $uri_base->clone;
$uri5->query_param_delete('qux');
$uri5->query_param_delete('hoge');
$uri5->query_param_delete('fuga');
$uri5->query_param_delete('abc');
print $uri5->as_string, "\n";
#=> http://example.com/foo/bar/baz

# 存在しないパラメータ名を指定しても無視されるだけ
my $uri6 = $uri_base->clone;
$uri6->query_param_delete('AAA');
$uri6->query_param_delete('BBB');
print $uri6->as_string, "\n";
#=> http://example.com/foo/bar/baz?qux=123&hoge=123&fuga=999&abc=DEF
```

## 参考

URI::QueryParam - URI のための追加のクエリメソッド - perldoc.jp 
http://perldoc.jp/docs/modules/URI-1.35/URI/QueryParam.pod
Cookieを活用してトップページのスライダーを切り替える方法


「特定のページを見た」とか、「あるページを何回以上アクセスした」という情報を Cookie に保存し、その条件をルールに設定して、サイトのトップにあるスライダーの内容を変更する設定を紹介してみます。

今回は site2015 のテーマを利用している時の設定になります。

## Cookie の設定

どんな条件にするかによりますが、今回は products/domestic の詳細ページを見た時と、products/business の詳細ページを見た時に カテゴリーコードを interest という名前の Cookie に保存します。 

/themes/site2015/products/entry.html の head 内に以下の JavaScript を設定します。

```html:entry.html
	<script>
	var cookie_interest = 'interest';
	var expires_day = 30;
	var ary_ccd = ['domestic','business'];
	
	ACMS.Ready(function() {
		if( ary_ccd.indexOf( '%{CCD}' ) >= 0 ){
			// 保存
			$.cookie( cookie_interest, '%{CCD}', { expires: expires_day , path: '/' });
		}
	});
	</script>
```

## ルールの設定 (家庭用製品の時)

### 条件の設定

ルールに Cookie の名前 (interest) と値 (domestic) を設定します。

interest = domestic で家庭用製品のページにアクセスしたことがあるという条件になります。

![ルールの設定画面](https://qiita-image-store.s3.amazonaws.com/0/5132/067e39a5-541c-5ab5-0b98-6dbbecdf0a17.jpeg "Google ChromeScreenSnapz054.jpg")


### モジュールID の設定

Ver.2.5 からルール機能でモジュールID の設定ができるようになりました。家庭用製品の時の「モジュールID」ボタンをクリックすると、家庭用製品の時のモジュールID一覧が表示されます。

![ルールの設定一覧](https://qiita-image-store.s3.amazonaws.com/0/5132/728d99c4-d97f-ae5a-bd69-a7e00cb77046.jpeg "Google ChromeScreenSnapz055.jpg")


topImage「トップページのメイン画像」というモジュールID の設定を変更することでスライダーの画像を変更することができます。

![モジュールIDの一覧](https://qiita-image-store.s3.amazonaws.com/0/5132/79e9f8c7-fcb7-e6a5-b5e9-63c6c2942b6f.jpeg "Google ChromeScreenSnapz056.jpg")


## 回数をカウントする例

最初の JavaScript とは違い、回数をカウントするサンプルになります。

```html:entry.html
	<script>
	var cookie_repeat = 'repeat';
	var expires_day = 30;
	
	ACMS.Ready(function() {
		num = $.cookie( cookie_repeat );
		if( !( parseInt(num) > 0) ){
			num = 1;
		}else{
			num = parseInt(num) + 1;
		}
		$.cookie( cookie_repeat, num, { expires: expires_day , path: '/' });
	});
	</script>
```
CodeIgniter 3系列でのセッション管理

CodeIgniterもバージョン3となり、「いちばん変わったのはライセンス」という程度に、フレームワークの大枠にはあまり大きな変化がなかったのですが、セッションまわりのライブラリは完全に書き換えられています。

CodeIgniter 2時代は付属のセッションライブラリが機能不足で、[いろいろ学んで](http://qiita.com/jkr_2255/items/075d1d518ae7a98141b3)自ら手を入れざるを得なかったのですが、新バージョンではどうなっているか見て行きましょう。

# `$_SESSION`の利用
まずいちばんの注目点は、`$this -> session -> userdata`というCodeIgniter独自の流儀ではなく、PHP標準のスーパーグローバルである`$_SESSION`を使う形となっていることです。すなわち、`$_SESSION`を使うような（CodeIgniterとは別系統の）ライブラリも、そのままCodeIgniterのセッションを使えるようになるということです。

いったいどういう仕組みかと思って調べてみると、実はPHP標準で[`session_set_save_handler`](http://php.net/manual/ja/function.session-set-save-handler.php)という関数があって、これを使うことで`$_SESSION`の挙動を自前の関数に置き換えられるのです。CodeIgniter 3では、この仕組みを使っています。

なお、互換性のために`$this -> session -> userdata`形式のアクセスも残ってはいますが、直接`$_SESSION`を使う、あるいは`$_SESSION['hoge']`を`$this -> session -> hoge`という形でアクセスできるような[マジックメソッド](http://php.net/manual/ja/language.oop5.overloading.php)を使うこともできます[^1]。

# セッションデータの削減
`$_SESSION`の枠組みを使うことになったこと、また後述のようにCookieへの保管が廃止されたこともあって、セッションが持つCookieには純粋にセッションIDだけが入るようになり、またセッションデータとしてもIPアドレスやユーザーエージェントなどは入らなくなっています。こういった値が何かで必要なら、別途取得しましょう。

# セッション同士のロック
CodeIgniter 2では、同じセッションから複数の接続が来ると、同時に同じセッションへアクセスできるようになっていました。このような「ノンブロッキング」なセッションでは、同時に書き換えを行うとややこしい問題を生じることになります（状況によっては、セッションが切れます）。

CodeIgniter 3ではこの点も改められ、同じセッションでは同時に1接続しか処理しないようになりました。もしセッションの書き換えが必要ない処理が続くのであれば、[`session_write_close`](http://php.net/manual/ja/function.session-write-close.php)でセッションを閉じることで次のリクエストがセッションを処理できるようになります。

また、CodeIgniter 2でAjaxなどのリクエスト時にセッションが切れていた問題も、ロックと標準関数の利用で解決しているようです。

# セッション本体とドライバーの分離
CodeIgniter 3では、実際にセッションを制御する`Session`クラス以外に、データ保管のロジックを書いたドライバライブラリを組み合わせて使う形式となっています。標準添付されるドライバーとして、

* ファイル（デフォルト）
* RDB
* memcached
* Redis

へそれぞれ保存するようなドライバーが用意されています。もちろん、自分で別なシステム向けのドライバーを書くこともできます。

## Cookie保存の廃止
CodeIgniter 2ではデフォルトで存在していた、Cookieへデータを保存するセッションですが、Cookieという性質上全データが通信に乗ってしまうので数々の問題を起こす、ということから、CodeIgniter 3では廃止されています。マニュアルでも「改めて作ろうとしないでくれ」と明記してありました。

# その他
これはセッションライブラリとは別なのですが、暗号化ライブラリではMcryptもしくはOpenSSLが必須となっていて、CodeIgniter 2であったような「オレオレ暗号化」は行わないようになっています。

# 情報源
* [CodeIgniter上のソース](https://github.com/bcit-ci/CodeIgniter/blob/3.0-stable/system/libraries/Session/Session.php)
* [公式ドキュメント](http://www.codeigniter.com/user_guide/libraries/sessions.html)

[^1]: PHPでは、何故かこの機能が「オーバーロード」と呼ばれています。