OmniAICreator/Qiita-1.07M huggingface dataset:
KotlinでLoggerの生成を少し楽にした

logger使ってますか？
Log4jとかlog4j2とかslf4jとか　色々なloggerがあると思います。
javaだったらlombockのアノテーションでいい感じにloggerを注入してくれて便利ですが、kotlinでlombockを使っても、イマイチ捗りません。

だからといって下記のようにjavaのコードを素直にkotlinに書き換える感じもめんどくさいです。特に自分で生成したクラスをいちいちLoggerに渡さないといけないなんて面倒極まりない。
ということでkotlinならどう書いたら面倒が少ないのか考えてみました。
なお利用しているloggerはlog4j2ということにしてあります。但し、ちょっと書き換えれば他のloggerでも利用可能です。

```java:java
class LogExample{
    private static final Logger log = LogManager.getLogger(LogExample.class);
}
```

```kotlin:kotlin
class LogExample(){
    companion object{
        private val log = LogManager.getLogger(LogExample::class.java)
    }
}
```

##1.companion objectに継承
以下のうようにKtLogというクラスを作ります。(クラス名はなんでもいいです。)

```kotlin:KtLog.kt
open class KtLog(){
    var log:Logger = LogManager.getLogger(
        this.javaClass.name.let {
            val matchIndex = it.length - 10
            when (it.lastIndexOf("\$Companion")) {
                matchIndex -> it.substring(0, matchIndex)
                else -> it
            }
        }
    )
}
```

使うときは```companion object:KtLog()```のようにcompanion objectに継承します。

```kotlin:kotlin
class LogExample(){
    companion object:KtLog()

    fun nanika(){
        log.debug("なにか")
    }
}
```

デメリットとしてはcompanion objectに他のクラスを継承させることが不可能なことです。
またKtLogでは```this.javaClass```が```LogExample$Companion```となる為、クラス名を戻す処理をしています。

##2.byを使う
こちらもKtLogの様なクラスを作成します。(クラス名はなんでもいいです。)

```kotlin:KtLog.kt
class KtLog {
    var log:Logger? = null

    operator fun getValue(thisRef:Any,property: KProperty<*>):Logger{
        return log?:LogManager.getLogger(thisRef.javaClass.name.let {
                    val matchIndex = it.length - 10
                    when (it.lastIndexOf("\$Companion")) {
                        matchIndex -> it.substring(0, matchIndex)
                        else -> it
                    }
                }).apply { this@KtLog.log = this }
    }
}
```

使うときは```companion object```内で```private val log by KtLog()```を記述するだけです。

```kotlin:kotlin
class LogExample(){
    companion object{
        private val log by KtLog()
    }

    fun nanika(){
        log.debug("なにか")
    }
}
```

なお、```companion object```内に記述しなくてもOKですが、生成したオブジェクト毎にloggerが生成されてしまいます。パフォーマンスを気にしないのであればこれでも構いません。

```kotlin:kotlin
class LogExample(){
    private val log by KtLog()

    fun nanika(){
        log.debug("なにか")
    }
}
```

メリットとしては1の方法と違いcompanion objectは継承可能である点と、logの変数を自由に変更できる点です。

##結論
おそらく2のほうが使い勝手はいいと思います。
ただ欲を言えばアノテーションを書くだけで注入してほしい・・・。
Dockerコンテナに複数のNICを付与する方法 (CentOS 7)

# 最新のDockerを使用

CentOs7の標準yumでのインストールだとバージョンが古い。
```docker.x86_64  1.10.3-46.el7.centos.14```
上記でも実行出来るかも知れないですが、最新版をインストールします。

dockerproject.orgからインストール。
https://docs.docker.com/engine/installation/linux/centos/

```
$ sudo docker --version
Docker version 1.12.3, build 6b644ec
```

# Docker Networkでブリッジを作成
Docker Networkコマンドで仮想のブリッジを作成します。
内部では、brctlの同等な機能実行されて居るようですが、
brctlで作成しても、dockerでは使えません。

```
$ sudo docker network create --driver=bridge --subnet=10.10.10.0/24 --gateway=10.10.10.1 -o "com.docker.network.bridge.name=br_nic1" br_nic1
$ sudo docker network create --driver=bridge --subnet=10.10.20.0/24 --gateway=10.10.20.1 -o "com.docker.network.bridge.name=br_nic2" br_nic2
$ sudo docker network create --driver=bridge --subnet=10.10.30.0/24 --gateway=10.10.30.1 -o "com.docker.network.bridge.name=br_nic3" br_nic3
```

上記の設定では、「docker network create」で作成した名前を昇順ソートされて、
一番上に来た物(br_nic1)がDockerコンテナ内のデフォルト・ゲートウェイになります。

「-o "com.docker.network.bridge.name=[Bridge Name]"」を追加することで
brctlで確認した場合はに、「bridge name」に振られます。
省略すると、勝手にユニークな名前が振られますので確認が難しくなるので
保守しやすいように、同一名を振ると便利です。

```
$ sudo brctl show
bridge name     bridge id               STP enabled     interfaces
br_nic1         8000.XXXXXXXXXXXX       no
br_nic2         8000.XXXXXXXXXXXX       no
br_nic3         8000.XXXXXXXXXXXX       no

$ sudo docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
XXXXXXXXXXXX        br_nic1             bridge              local
XXXXXXXXXXXX        br_nic2             bridge              local
XXXXXXXXXXXX        br_nic3             bridge              local
...
```

# Docker runは使用しない

0. イメージの取得 (docker pull)
1. コンテナ化 (docker create)
2. ネットワーク追加 (docker network connect)
3. Dockerの実行 (docker start)

```
$ sudo docker pull tomat:8
$ sudo docker create -it --name tomcat --hostname tomcat tomat:8
$ sudo docker network connect --ip=10.10.10.10 br_nic1 tomcat 
$ sudo docker network connect --ip=10.10.20.10 br_nic2 tomcat 
$ sudo docker network connect --ip=10.10.30.10 br_nic3 tomcat 
$ sudo docker start tomcat 
```

上記では、Dockerコンテナ「tomcat」に対して複数のIPを設定しています。
下記の様に試せると思います。

```
curl http://10.10.10.10:8080/
curl http://10.10.20.10:8080/
curl http://10.10.30.10:8080/
```

# 実NICとの連係
上記の状態では実NICと連係出来無いので、
brctlで、実NICとコンテナをブリッジします。

```
$ sudo brctl addif br_nic1 [実NIC1]
$ sudo brctl addif br_nic2 [実NIC2]
$ sudo brctl addif br_nic3 [実NIC3]
```

# サービスで自動接続
Networkサービスより、Dockerの自動起動が遅いので、
ifcfgファイルでブリッジ設定は出来ませんでした。

下記の様にサービスを追加することで、
Boot時に自動的にネットワークが接続します。

```
$ sudo vi /etc/systemd/system/docker1.service
---
[Unit]
Description=docker1
After=docker.service
Requires=docker.service

[Service]
ExecStart=/root/bin/DockerBridge.sh

[Install]
WantedBy=multi-user.target
---


$sudo vi /root/bin/DockerBridge.sh
---
#!/bin/bash

/usr/sbin/brctl addif br_nic1 [実NIC1]
/usr/sbin/brctl addif br_nic2 [実NIC2]
/usr/sbin/brctl addif br_nic3 [実NIC3]
---

$ sudo systemctl daemon-reload
$ sudo systemctl enable docker1
```
【Wordpress】固定ページの本文のビジュアルエディタを使えなくする

wordpressで固定ページの本文でソース管理を行う場合、テキストエディタに切り替えてソースを貼り付けるが、
その状態からビジュアルエディタに切り替え、あるいは管理画面で一度もアクセスしたことがない人がその投稿を開くとビジュアルエディタで開かれてしまう。
その場合オリジナルで付与していたclassなどが一通り死ぬ。
なのでビジュアルエディタを選択できないようにする方法。

# functions.phpに下記を記述するだけ。

```php
function disable_visual_editor_in_page(){
	global $typenow;
	if( $typenow == 'page' ){
		add_filter('user_can_richedit', 'disable_visual_editor_filter');
	}
}
function disable_visual_editor_filter(){
	return false;
}
add_action( 'load-post.php', 'disable_visual_editor_in_page' );
add_action( 'load-post-new.php', 'disable_visual_editor_in_page' );

```

## 注意点

こうすれば固定ページではビジュアルエディタを使えなくできるが、
そのままHTMLタグを挿入して公開してもソースの改行を判定されpタグが付与されひどいことになる。
テンプレートでpタグを除去したりしないとあかん。

いちいち関数付与するのがアレな場合はglobal変数の$postに入っているpost_contentをそのまま利用すれば勝つる
ただし、ショートコードを適用させたい場合は下記みたく書いとく。

```php
global $post;

echo do_shortcode($post->post_content);

```

簡単よ。
nattoで分かち書き

## 環境
OS: Mac OSX El Capitan 10.11.6
natto: v1.1.1
mecab: 0.996
ruby: v2.3.0

## mecabでの分かち書き
`-Owakati`オプションをつける

```
$ echo よしいくぞ | mecab -Owakati
=> よし いく ぞ
```

## nattoで分かち書き
インスタンス化するときに`output_format_type`オプションに値を渡せばよい。

```ruby
nt = Natto::MeCab.new(output_format_type: :wakati)
nt.parse('よしいくぞ')
=> 'よし いく ぞ'
```
オプションに渡せる値は他にも、`chasen`, `yomi`がある。

## 参考
http://www.rubydoc.info/gems/natto/Natto/MeCab
C++ Builder XE4, 10.2 Tokyo > debug > イベントログのスクロール停止を解除 > Endキー / 最後のイベントをクリック

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

「イベントログ」ウィンドウをクリックした時、イベントの表示スクロールが解除される。

スクロール解除をやめるには以下のようだ。
[［イベント ログ］ウィンドウ@docwiki.embarcadero](http://docwiki.embarcadero.com/RADStudio/Seattle/ja/%EF%BC%BB%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88_%E3%83%AD%E3%82%B0%EF%BC%BD%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6)

>  スクロールを再開するには、END を押すか、表示されている最後のイベントをクリックしてください。 ［スクロールして新しいイベントを表示］オプションは、［ツール｜オプション...｜デバッガ オプション｜イベント ログ］ページで設定することができます（「［イベント ログ］のオプション」を参照してください）。

(追記 2017/12/28)
10.2 Tokyoで[End]キーを押下することで、スクロールが再開することを確認した。
Unity5でビルドしたアプリをAdrenoProfilerを使ってプロファイルする方法-活用編-

# はじめに
前回の[導入編](http://qiita.com/fuminyami/items/d6d1940b0ed3abc7da36)を踏まえたうえで実際に活用するにはどこを見ればいいのか、私なりのやり方に関してまとめます。（フルに活用したい方は公式のドキュメント及びチュートリアルビデオを見ると理解が深まると思います。~~私は英語苦手なのでかいつまんで利用しました~~）

# 手順
以下の順番で説明していきます。

1. ScrubberGLESからシーンをキャプチャする
2. ドローコールの一覧から赤くなっている項目を見てみる
3. 負荷の要因をはっきりさせるためにシェーダーやテクスチャリソースを見る
4. コメントの欄もよく見る

## ScrubberGLESからシーンをキャプチャする
メニューにあるScrubberGLESを押せばウィンドウが立ち上がるのでそのウィンドウ内のCaptureFrameを押せばキャプションできます。

## ドローコールの一覧から赤くなっている項目を見てみる
シーンをキャプチャするとそのフレームでの描画命令が全てRenderCallsウィンドウに表示されます。
もしこの中で負荷の高い処理を行った描画があれば赤く表示されています。
赤く表示された部分を選択する事で実際のシーンにおけるどの部分の描画であったかが点滅して表示されます（わかりやすい）
とりあえず赤いところクリックして隣のAPICallsタブ等から原因を探ります。

## 負荷の要因をはっきりさせるためにシェーダーやテクスチャリソースを見る
DrawCallを選択した状態でAPICallsを見ると、詳細な処理内容を見ることが出来ます。
ここでも負荷の高い部分は赤く表示されるので、目星がつけられます。

次に負荷の高い部分で使用されたシェーダやテクスチャリソースを確認したい場合はGLContextの欄を見ると紐付けされたIDから見ることが出来ます。
シェーダのコードはMiscellaneousのActiveProgramのIDから。TextureはTexturingのそれぞれのBindingIDから確認できます。

両方ともResourceBrowserからResourceタブではシェーダを、Texturesタブからはテクスチャを先ほどのIDから見つけることが出来ます。
後はシェーダの中身を確認し、無駄にプロセスが長くないか、とかテクスチャであれば無駄に大きくないか、ミップマップの設定は適切か･･･とか色々調べることが出来ます。便利。

## コメントの欄もよく見る
そのフレームにおける全体的な評価が書かれています。
例えばオクルージョンの効果がないよとか、圧縮されていないテクスチャがあるよとか。参考にしても良いかなと思います。


## 　

以上AdrenoProfilerの私なりの見方でした。
ものすごく簡単に見るならこの程度で十分情報は得られると思います。
LaravelでCSRFエラーのハンドリング

## エラーページが出るのはダサい:angel::anger: 

Laravelに標準で付いてるCSRFチェック機能みなさん使ってますか？
準備が楽かつ便利なのに強力なので、できるだけ使ってWebアプリを実装しましょう。

ただ、デフォルトのエラーページがイケてません。

![csrf-error.png](https://qiita-image-store.s3.amazonaws.com/0/138819/a6a5941a-0401-9b56-abc0-44640475a0c2.png "csrf-error.png")

この画面はCSRFアタックを行ったり、長時間フォーム画面で放置してPostした際(セッションタイムアウト)などに表示されます。
さすがに本番環境でデバッグ設定ONにしてる人はいないでしょうが、エラー画面をそのままユーザに見せるわけにはいかないので、CSRFチェックに引っかかった際のエラー処理を実装しましょう。

ちなみに今回対象となるLaravelのバージョンはLTSである5.1になります。5.2と5.3は触っていないので分かりません。ごめんなさい。

## 処理の流れ
CSRFチェックに引っかかった際は`\Illuminate\Session\TokenMismatchException`例外が発生します。これをキャッチして何らかの処理を行うといった流れです。

今回は例外をキャッチしたらエラーメッセージ付きでログイン画面に飛ばすといったような処理を実装します。

## 実装方法
app/Exceptions/Handler.phpを編集します。`Handler`クラス内の`render`メソッドを以下のように書き換えます。

```php
public function render($request, Exception $e)
{
    // csrf例外だった場合はログイン画面に飛ばす
    if ($e instanceof \Illuminate\Session\TokenMismatchException){
        session()->flash('csrfError', true);
        return redirect()->to(ログイン画面パス);
    }

    return parent::render($request, $e);
}
```

これで例外が発生した際はログイン画面に遷移します。

次にエラーメッセージを表示します。以下ログイン画面のビューです。
デザインはよしなにしてください。

```php
@if(session()->has('csrfError'))
	<p>お好みのエラーメッセージ</p>
@endif
```


これで 例外キャッチ->ログイン画面に遷移->エラーメッセージ表示 を実装することができました。
MacBook Proでスリープからの復帰時にキーボードやトラックパッドが反応しない不具合

# 要旨

MacBook ProのRetina 13-inch, Early 2015のモデルは、トラックパッドやキーボードを接続するケーブルが構造上ダメージを受けやすい位置にあるようです。
そのため、このモデルで以下の症状が出た時はAppleに修理を依頼するのが最も早い手段だと思われます。
ちなみに、修理費用は1万円程度、修理期間は最短なら即日、混んでいる時は３日程度でした。

# 環境

MacBook Pro (Retina 13-inch, Early 2015)
OS X El Capitan(10.11.6)

# 症状

・MacBookの画面を開いてログイン画面が表示されるが、トラックパッドやキーボードを操作しても反応がない。
・ログインのパスワード入力欄に文字入力カーソルが点滅している。
・電源ボタンによるスリープ、強制終了は可能。

・上記症状が出るときもあるし、出ないときもある。
・稀に上記症状に加えて「Bluetooth キーボード設定」が表示される。

# 対処

## NVRAMクリア

参考:[Mac の NVRAM をリセットする方法 - Apple サポート](https://support.apple.com/ja-jp/HT204063)

電源ボタン長押しによる強制終了後、上記のページの手順を参考に電源ボタンを押した後command+option+P+Rの同時押しを実施。

結果、改善せず。
起動した後、ログイン画面が表示される。キーボード、トラックパッドによる操作に無反応。

## SMCリセット

参考:[Mac の SMC (システム管理コントローラ) をリセットする - Apple サポート](https://support.apple.com/ja-jp/HT201295)

結果、改善せず。
起動した後、ログイン画面が表示される。キーボード、トラックパッドによる操作に無反応。

## セーフモード

参考:[Mac の起動を完了できない場合にセーフモードを試す - Apple サポート](https://support.apple.com/ja-jp/HT201262)

結果、改善せず。
稀にセーフモードではなく通常通り立ち上がるケースも発生。

## OS再インストール

参考:[macOS を再インストールする方法 - Apple サポート](https://support.apple.com/ja-jp/HT204904)

手順に従って「MacOSを再インストール」を選択して再インストールを実行する。

結果、改善せず。

## 外部キーボード接続

起動直後ログイン画面の反応しない状態で外部キーボードをUSB接続すると認識できた。
外部キーボードを使ってログインしたところ以下のメッセージが表示された。

> キーボード設定アシスタント
> はじめに
> キーボードを認識できません。識別できるまで、このキーボードは使用できません。
> このキーボードを識別するには、"続ける"をクリックしてください。

## Genius Bar 持ち込み

Genius Barに持ち込み。
どうやらトラックパッドとキーボードとの接続部分の部品が故障していたようです。
当日の修理で直りました。

# 参考

ググって調べた時に非常に近い症状が出ているケースを発見。
[「接続されているキーボードがありません」と表示され操作不能 | コミュニティ](https://discussionsjapan.apple.com/thread/10096989?start=0&tstart=0)


### 追記(2017/09)

また同様の症状が2回発生しました。
何回かの強制終了→再起動で直りました。
NVRAMクリアとSMCリセット、セーフブートを試して経過待ちです。

今回もまたGenius Barに持ち込みで修理してもらいました。
故障箇所は前回と同じ場所でした。
どうやらMacBookのモデル（MacBook Pro (Retina 13-inch, Early 2015)）がこういう故障を起こしやすい構造らしく、素早く対応していただけました。
background-size: contain;を指定しても画像が縮小表示できない問題

## 状況
Retina対応のために大きさ２倍の画像を使ってコーディングをしているとき、本来見せたい大きさに縮小して表示しようとした。

```
width: 30px;　（表示したい大きさ）
background-size: contain;
background: url(img.png);　（表示したいものの2倍の大きさ）
```
と指定しても効かない。

Developer Toolで見ても、上書きされて取り消し線が引かれている形跡がない。↓

<img width="386" alt="スクリーンショット 2016-11-30 17.47.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/32e4dd3d-edaf-7b39-4423-5a21cb0cc588.png">

他のところは指定できているところもある。なぜ...とハマった。

## 解決法
以下のように`background`と`background-size`の指定の順番を入れ替えたら解決した。
```
background: url(img.png);
background-size: contain;
```
確認したところ、`background`プロパティは
・`background-clip`
・`background-color`
・`background-image`
・`background-origin`
・`background-position`
・`background-repeat`
・`background-size`
・`background-attachment`
のプロパティをまとめて指定できるため、
`background-size`プロパティが`background-size: auto auto;`で上書きされてしまうようだ。
MDN（英語版）にも初期値はautoと明記してある。日本語版から確認したが、日本語版にはこのような説明はないようだった。
<img width="1035" alt="スクリーンショット 2016-11-30 18.05.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/65ec1590-54b4-833f-26f5-92dee88df197.png">


原理を考えたら納得できるが、Developer Toolでは上書きされていないように表示されているので、要注意。
<img width="378" alt="スクリーンショット 2016-11-30 18.00.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/26ef97e9-f171-99ec-69c9-c53109b9c565.png">

忘れないようにしたい。



## 参考
まぼろしの小林さんのブログ
https://maboroshi.biz/clearskysource/?p=642
MDN英語
https://www.w3.org/TR/2014/CR-css3-background-20140909/
GR-CITRUSをmacOS(Sierra)で使うときにハマったことと簡易的な解決策 2016.11

先日ルネサスさんのmrubyを使ってGR-CITRUSでIoTデバイスを扱うというワークショップに参加させてもらったところ、MacBookProおよび(El capitan以上?)macOSにてハマるポイントがあったのでクイックハックで逃げたので、雑なスクリプト付きでメモ。

2016年11月30日現在のファームウェア(WAKAYAMA.RB Board Ver.CITRUS-2.19(2016/11/19)f3(256KB), mruby 1.2.0)を基にした情報なので、将来的には解決されると思います。

  - 2016.12.6 追記: Rubic0.9.2で問題(512バイト分しか実行されない)は解消された模様。しかし強引なリトライ機能が便利なので、そのままスクリプトを使い続けるワタクシなのであった... 

##環境および前提
- GR-CITRUS  (2.19)
- MacBookPro(late 2013) 
- macOS Sierra
- Rubic 0.9

##ハマったポイント
1. MBPのUSBポートによってGR-CITRUSを認識しない
	- 結果として左側ポートが使え、右側は使えない。他の参加者のMBPはLate2013以外もあったんじゃないかとおもうが、同様のばらつきがあった。使用電流に差があるのではとの意見もあった（未検証）
2. Rubic上での開発ということだったが15行程度のスクリプトがビルド後転送できない(ビルドはできている)。10行付近であれば問題なく動作するし、同一スクリプトをWindows上のRubicで試すと問題がない。
3. ターミナル上でmrbcを直接実行してできたmrubyの中間ファイル(.rb)をCoolTermで転送すると問題なく動く。が、いちいちコマンドでmrbcしたあと、バイト数をカウントして、ファームウェア上のアップローダでXコマンドを用いて転送しないといけない。面倒すぎる
  
##応急策  
mrubyの中間ファイル生成したあと、バイト数を数えて、自動で転送するスクリプトをrubyで書いた。

rubyでバイト数カウントしてもいいのにwcを呼び出しているのは、元がシェルスクリプトだったりする。

下記スクリプトを chmod +x しておき、引数にスクリプトファイルをあたえる。
スクリプト自体はEmacsでもVimでもお好みのものを使えばいいので、CrioneやRubicで編集するよりも楽だったりした(個人の感想です)

```
chmod +x mt.rb

% ./mt.rb  i2c_lcd82.rb                                                                
>¥r¥n>>>>¥r¥nX main 2056
Wait for upload
X main 2056¥r¥n>>>>>>>>>>¥r¥nX main 2056
Wait for upload
.
.
.


```

上記のようなかんじでターミナル上で実行します。
内部でSerialPortを読んでるので、事前に

```
% sudo gem i serialport
```

...とかなんとか準備しておきましょう。



```ruby:mt.rb
#!/usr/local/bin/ruby
# coding: utf-8
=begin

make and transfer .mrb file

mrbc hoge.rb
wc -w < hoge.mrb
したあと、SerialPort経由でファイルを送り込み
ターミナルモードに移行

=end
require 'serialport'

port = "/dev/tty.usbmodem1_1"
bps  = 9600
send_script_name = "main"
sending_timeout = 10 #sec

script_file = ARGV.shift
mrb_file    = script_file.split(".").first + ".mrb"

`mrbc #{script_file}`
size = open("|wc -c <#{mrb_file}").readlines.join.chomp.strip.to_i


sp = SerialPort.new(port,bps,8,1,SerialPort::NONE)

$wait4upload = true
$buf = ""

Thread.new{ #Waiting xx xx を受信するまではアップロードまちで、受信内容を表示
  loop do
    line = sp.getc

    $wait4upload = false if $buf =~ /Wait/

    $buf += line
    $buf == "" if line == "¥n"
    print line
  end
}

#
#sp.print "L¥r¥n"
sp.write "¥r¥n"
sleep 4

#
# Transfer  .mrb file (Xコマンド送信)
#
retry_count = 0
begin
  first_send_time = Time.now
  cmd = "¥r¥nX #{send_script_name} #{size}"
  STDERR.puts cmd
  sp.write "X #{send_script_name} #{size}"
  sp.write "¥r¥n"

  #雑な待ち受け
  STDERR.puts "Wait for upload"
  while $wait4upload
    raise "Time Out "  if Time.now-first_send_time >= sending_timeout
  end
  STDERR.puts
rescue
  if  retry_count <= 2
    retry_count += 1
    retry
  else
    STDERR.puts "timeout error;_;"
    exit
  end
end

STDERR.puts " ** sending #{mrb_file} : #{size} bytes ** "
sleep 5
open(mrb_file,"rb") do |io|
  io.each_byte do |b|
    sp.putc b
  end
end
sp.write "¥r¥n"

#
# そのままターミナルモードに移行(^Cでとまる)
#
loop do
  line = gets
  sp.write line
end
sp.close
```
PHPの配列のkeyをスネークケースからキャメルケースに変換する


### 配列のkeyをスネークケースからキャメルケースに変換する処理
---

```php
function camelizeArrayRecursive(array $array)
{
    $results = [];
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $results[Illuminate\Support\Str::camel($key)] = camelizeArrayRecursive($value);
        } else {
            $results[Illuminate\Support\Str::camel($key)] = $value;
        }
    }
    return $results;
}
```
<span style="color:red;">※</span> 依存モジュールがあります。composerとかで、Illuminate\Supportのモジュールをインストールしてください。Laravel使っている方は、デフォで入ってます。

### 使うとこんな感じ
---

```php
$array = [
    'id' => 1,
    'name' => 'name1',
    'zip_code' => '111-0001',
    'comments' => [
        [
            'blog_id' => 1,
            'comment' => 'comment11',
            'zip_code' => '111-0011',
        ],
        [
            'blog_id' => 1,
            'comment' => 'comment12',
            'zip_code' => '111-0012',
        ],
    ],
];
$_array = camelizeArrayRecursive($array);
=> [
     "id" => 1,
     "name" => "name1",
     "zipCode" => "111-0001",
     "comments" => [
       [
         "blogId" => 1,
         "comment" => "comment11",
         "zipCode" => "111-0011",
       ],
       [
         "blogId" => 1,
         "comment" => "comment12",
         "zipCode" => "111-0012",
       ],
     ],
   ]
```

### あとがき
---
Eloquent ORMいじっていた時に、テーブルのカラム名がスネークケースからキャメルケースに変えられないので、変える処理を書いてみた。

基本的にORMが嫌いなのですが、Eloquent ORM良いよと言われて、調べてた時の副産物です。
（触ってもいないのにディスれない的な）（Eloquent ORMの話は別記事で）

PHPの標準関数「array_walk_recursive」もkeyを変える場合は使えないし、Eloquent ORMも、スネークからキャメルに変える需要はありそうなのに提供してないしで、えいやっと書きました。性能面を考えると参照渡ししたほうがよさそうですが、バグが無いほうが良いかなぁと、とりあえずやってないです。（使うときは、処理速度測ったり、テスト書いて使わないとですね。）
【Wordpress】自動Pタグ除去方法

# 通常本文

```
<?php
remove_filter ('the_content', 'wpautop');
the_content();
?>
```

# ACFのWYSIWYG

```
<?php
remove_filter ('acf_the_content', 'wpautop');
the_field("カスタムフィールド名", $post_id);
?>
```
【Xamarin】AndroidのFragmentでタッチイベントを取得する

#Xamarin.Formを使わずにタッチイベント
Xamarin.Formを使わずに、Fragmentでタッチイベントを取得したかっただけなのに、かなり苦労してしまったので、メモメモ。

##環境
XamarinStudio6.1.2
ソリューション:App"Native(iOS,Android)"
Shared Code:"Use Portable Class Library"

##コード
検索するとSetOnTouchListenerを使う的なことが書かれてますが、これではエラーになってしまいます。
こちらが正解のようです。
ボタンのイベントとかと同じ方法ですね。

```Fragment.cs
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View view = base.OnCreateView(inflater, container, savedInstanceState); // タッチイベントを取得したいビュー
    view.Touch += (object sender, View.TouchEventArgs e) => 
    {
        // タッチした時の処理
    };

    return view;
}
```
python で重み付きrandom choice

`numpy` 使うと楽。

```python
import numpy as np

d = [("foo", 98), ("bar", 844), ("baz", 1028)]
a, w = zip(*d)
print(a, w)
# -> ('foo', 'bar', 'baz') (98, 844, 1028)

w2 = np.array(w) / sum(w)
v = np.random.choice(a, p=w2)
print(v)
# -> baz


# 確認
from collections import Counter
c = [ np.random.choice(a, p=w2) for i in range(sum(w)) ]
print(Counter(c))
# -> Counter({'baz': 1051, 'bar': 824, 'foo': 95})
```

だいたい合ってる。

# numpy 使わない版

これだけのために `numpy` 入れるのもなぁ…な場合は `bisect` 使うといいかも。

```python
import bisect
import itertools
import random

d = [("foo", 98), ("bar", 844), ("baz", 1028)]
a, w = zip(*d)
print(a, w)

ac = list(itertools.accumulate(w))
f = lambda : bisect.bisect(ac, random.random() * ac[-1])
v = a[f()]
print(v)

# 確認
from collections import Counter
c = [ a[f()] for i in range(sum(w)) ]
print(Counter(c))
# -> Counter({'baz': 1010, 'bar': 851, 'foo': 109})
```

だいたい合ってる。
Edisonにgit 2.11.0を導入する

# はじめに
## なぜ？
git submoduleが使えない旨のエラーが出たので

## 作業前に
古いgitを削除する
```
opkg remove git
```

# 手順
## 依存の解決
```
opkg install perl perl-module-extutils-makemaker perl-module-extutils-mm-unix perl-module-extutils-command perl-module-extutils-command-mm
```

既に環境には色々入っていたから他にもあるかもしれない

## ビルド
```
wget https://www.kernel.org/pub/software/scm/git/git-2.11.0.tar.gz
tar xf git-2.11.0.tar.gz
cd git-2.11.0.tar.gz
make
sudo make install
```
無効な証明書なサイトに、file_get_contents する方法

開発環境で自己署名しているhttps環境において、file_get_contentsすると、

```
Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in xxxxx
```
というエラーが表示されます。
証明書入れてくれよと思うのですが、導入できない時もあります。その場合は、optionを付与することで回避できます。

```PHP
$url = "https://xxxxxx";
$options['ssl']['verify_peer']=false;
$options['ssl']['verify_peer_name']=false;
$response = file_get_contents($url, false, stream_context_create($options));
```

PHP5.6.15で動作しました。[この](http://php.net/manual/ja/migration56.openssl.php)あたりも目を通しておくとよいと思います。
React素人がReactNativeでAndroidアプリ作成の夢を見て環境設定した

この記事は[mediba advent calendar 2016](http://qiita.com/advent-calendar/2016/mediba) 3日目です。

mediba制作部の土方です。

- Reactを触ったことがない
- Javascriptはわかる

そんな私がReactNativeを使ってネイティブアプリ作成に挑戦したく、とりあえず環境設定完了までの記録です。
実際に作成した記録は完成したらということで。。。

# 環境
- Mac OX X El Capitan 10.11.6
- node.js v4.4.2
- Android Studio 2.2.2

# 作成するもの
http://ceblog.mediba.jp/
当社のCreator×EngineerBlogのビューア作成を目指します。

# 環境設定
Facebookの[GettingStartedページ](https://facebook.github.io/react-native/docs/getting-started.html#content)を参考に、開発環境を設定します。

## 設定でハマッた点
### AndroidStudioのパス
[GettingStarted - 4. Set up the ANDROID_HOME environment variable](https://facebook.github.io/react-native/docs/getting-started.html#4-set-up-the-android-home-environment-variable)
に、パスを通す記述があります。
~/.bashrcに記述するように記載されていますがMacのデフォルトは~/.bash_rcを読んでくれません。
~/.bash_profileに
```source ~/.bashrc```
を記載し、パスを通しました。

### Androidエミュレータの作成
GettingStartedに記載されている、
```$ android avd```
からAndroidVirtualDeviceManagerを実行し、CreateAVDしようとすると
CPU/ABIが**No system images installed for this target**となり選択できませんでした。

これは、**3. Install the Android 6.0 (Marshmallow) SDK**で指示されていたSystem Imageがインストールされていない場合に発生するものです。
SDKのインストール時にデフォルトのままですとインストールされませんので、SDKと一緒にインストールするか、Android SDK Managerから追加でインストールする必要があります。

パスが通っていれば下記コマンドでAndroid SDK Managerを起動することが出来ます。
```$ android```

サクッと追加インストールしましょう。（そこそこ時間がかかります）
<img width="692" alt="スクリーンショット 2016-11-30 11.19.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/147466/9ede765a-2b9a-b9eb-9ca7-3f49f1790132.png">

### Androidエミュレータが重い
AndroidVirtualDeviceManagerからデフォルト設定でエミュレータを作成、起動するとものすごく動作が重いです。

- Intel x86 Emulator Accelerator(HAXM installer)をインストールしておく
- VirtualDevice作成時に下記設定とする
    - CPU/ABI - Intel Atom(x86)を選択
    - Emulation Options - Use Host GPUをON

ことで最適化され、快適に動作させることができます。

### エミュレータを起動
*AndroidVirtualDeviceManagerを起動して、エミュレータを選択して、Startボタンを押下*
なんてダルくて毎回やってられないです。
コマンドで一発起動しましょう。
```$ ~/Library/Android/sdk/tools/emulator -avd [AVD Name]```

パスが正しく通っていれば
```$ emulator -avd [AVD Name]```
で起動できます。

### Project作成〜起動
任意のフォルダでinitializeし、サンプルコードをビルド&実行します。
このときAndroidエミュレータを起動させておく必要があります。

```
$ emulator -avd Nexus6
$ react-native init medibaBlog
$ cd medibaBlog/
$ react-native run-android
```

エラーが出てしまいました。

```
FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> failed to find Build Tools revision 23.0.1
```

Android SDK Managerを起動し、Android SDK Build-tools 23.0.1をインストールします。

インストール後、同コマンドを実行すると。。。
<img width="456" alt="スクリーンショット 2016-12-01 15.44.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/147466/a56aeb3a-a75b-f7f0-fba3-970bfeca377a.png">
無事起動できました！

引き続き、チュートリアルで勉強中です。。。
Mac OSX 10.11(El Captain)にCPUモードでCaffeをインストールするメモ

**(Dockerの知識がある人は、圧倒的にDocker Imageをインポートして使った方が楽です！（[こちら](http://rikipafe.hatenablog.com/entry/2016/07/01/mac_OS_X%E3%81%AB%E3%80%81caffe%2Bjupyter_notebook%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%83%A1%E3%83%A2)）)**

##環境
マシン、OS : MacBookPro 10.11.4
CPU : 2.2 GHz Intel Core i7
メモリ : 16 GB

##手順
※Pythonは2.7.10を使っています。
Anaconda-2系を使う場合は、[こちら](https://hack-le.com/47695407-2/)を参照。
System（Macに最初から入っているPython）だと、PyCaffeをインポートする時にエラーが起きます。
pyenvで新しいPython2.7系を入れるのが良いかと思われます。
※CMake(僕は3.5)を使います。

**1.依存パッケージをhomebrewでインストール**

```
brew install -vd snappy leveldb gflags glog szip lmdb
brew tap homebrew/science
brew install hdf5 opencv
brew install --build-from-source --with-python -vd protobuf
brew install --build-from-source -vd boost boost-python
```

下の2つ（protobufとboost）はかなり時間がかかります。

**2.Caffeをダウンロードする**
Githubからクローンするのが良いやり方だそうです。
`git clone https://github.com/BVLC/caffe.git`

**3.Makefile.configを書き換える**
・まず以下を実行します（コピーの作成）
`cp Makefile.config.example Makefile.config`

・Makefile.configの以下を書き換えます。

```ruby:Makefile.config
# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1 #コメントアウトを外す。

...

# Homebrew puts openblas in a directory that is not on the standard search path
# openblasをインストールしたパスを記入します。
BLAS_INCLUDE := /usr/local/cellar/openblas/0.2.18_2/include
BLAS_LIB := /usr/local/cellar/openblas/0.2.18_2/lib

...

# 追記した方が良さそうです。
LIBRARIES += cblas
LDFLAGS += -framework Accelerate
```

**4.コンパイルをする**
\:star:CMakeを使う（普通のMakeだとLinker Errorが出ます。）
caffe/に移動して、以下を実行。

```
mkdir build
cd build
cmake ..
make all
make install
make runtest
```

これでおそらくビルドできます。
使えるかどうかは、サンプルプログラムを動かして確認してください。
（Mnistだと[この記事](https://hack-le.com/47695407-2/)で詳しく書かれています。）
これでC++ではすでに使えるようになっています。
（基本は./build/tools/caffe train --solver=**.prototxtを実行します。
詳しくは公式ページをみてください）

**5.Python用にビルドする**
caffe/buildに移動して、以下を実行するだけです。

```
make Pycaffe
```

Pathを追加するのを忘れずに。（僕は.zshrc）

```
export PYTHONPATH=(path to caffe)/caffe/python:$PYTHONPATH
```

これで、`import caffe`が使えるとおもいます。

##参考記事（お世話になりました！）
・[Caffeの公式ページ](http://caffe.berkeleyvision.org/installation.html)
・[MAC OS X El CapitanでDeep Learningができるように、Caffeをインストールしてみた](http://qiita.com/veronica/items/93269835de2fe64c661c)
・[Mac OSX 10.11でDeepLearningフレームワークCaffeのサンプルを動かすまで](https://hack-le.com/47695407-2/)
ソフトウェアテスト界隈のシンポジウム・勉強会・カンファレンス・イベントまとめ隊

ソフトウェアテスト関連の定常的なイベントを適当な口調でまとめてみました。
追加ありましたら編集リクエストください。

---

##[JaSST](http://www.jasst.jp/)##
何を置いてもまずはこちら。

こういったシンポジウムはどうしても東京での開催がメインになりますが、このJaSSTはそれにとどまらず各地方でも開催されており、年々活気づいています。
2016年は東京の他にも北海道、東北、新潟、東海、関西、四国、九州でも開催されました。
なぜ新潟だけ県名なのでしょう。あ、北海道もか。
ともあれJaSSTを知らないテスト関係者は間違いなくモグリと言えるでしょう。
ちなみに JaSST = Japan Symposium on Software Testing の略です。
そしてaを大文字にしたり、a以外を小文字にしたりしたらN先生に絶交されます。

##[WACATE](http://wacate.jp/)##
1泊2日で三浦半島の保養施設に泊まり込みソフトウェアテストにどっぷり浸かることが出来る合宿系ワークショップです。
年に２回、「WACATE夏」「WACATE冬」が開催されています。
WACATEとはいえ年齢制限はありませんし、ある程度の手練が参加してもとても身につくイベントです。
情熱的な夏の夜、人肌恋しい冬の夜、ひとつ屋根の下で同じ志を持った男女が夜を明かすわけですから、毎回最低一組はカップルが誕生するとかしないとか。

```
２０１６１２１８追記：
WACATE'16冬に参加してきました。
楽しかったです。また夏も行くつもりです。できれば本当の若手も一緒に行きたいDEATH。
```

##[Ques](http://quesqa.com/)##
おフザけの説明に凝りすぎていささか疲れたのでシンプルに行きます。
良いイベントです。年２回くらいやってます。いよいよ次回で第１０回！

##[ICST](http://aster.or.jp/conference/icst2017/)##
ソフトウェアテストの国際会議です。
世界です。英語です。

##[ソフトウェア品質シンポジウム](https://www.juse.jp/sqip/symposium/)##
通称Sqip（スキップ）。
組み込み系が強いイメージがあって個人的にWEBよりな自分はあまり詳しくありません。
参加もしたことありません。
喰わず嫌いかもしれません。
どなたか補足おねがいします。

----
あとは、[Connpass](https://connpass.com/)とか[dots.](https://eventdots.jp/)とかで定期的に調べて不定期イベントを把握すると良いと思います。
rbenv のversionをpromptに表示させる

# TL;DR
- 複数のレポジトリを行ったり来たりすると、設定しているrubyのバージョンがわからなくなることがるので promptに表示させる
- zsh-hookで表示させるscriptを登録する
- 色や、位置などはお好みで

# script

```zsh

autoload -Uz add-zsh-hook

rbenv_version () {
  local ruby_v=$(rbenv version-name)
  if [[ "`rbenv version | grep '.rbenv/version'`" = "" ]];then
    if [[ "`rbenv version | grep 'RBENV_VERSION'`" = "" ]];then
      local setting="%{$fg[green]%}[$ruby_v (local)]%{$reset_color%}"
    else
      local setting="%{$fg[blue]%}[$ruby_v (global)]%{$reset_color%}"
    fi
  else
    local setting="%{$fg[blue]%}[$ruby_v (global)]%{$reset_color%}"
  fi
  RPROMPT="$setting"
}
add-zsh-hook precmd rbenv_version
```

![rbenv_version_prompt.jpg](https://qiita-image-store.s3.amazonaws.com/0/3447/a70552e2-9b15-b788-54d2-86430411b640.jpeg)
AWS re:Invent 2016に参加してみた 2日目

まだなんとか頑張れてます。1日目の内容はこちらから。

[AWS re:Invent 2016に参加してみた 1日目](http://qiita.com/kojiisd/items/0b1c5ebe9118bd26147e)

日中帯にある程度書き溜めればいけるんじゃないかと思ったので頑張ってみよう。

# Certified Lounge
朝一で資格保持者だけが入れるラウンジにチェックイン。~~このためだけに資格取ったようなものですからね。~~
![20161129_081826.jpg](https://qiita-image-store.s3.amazonaws.com/0/102769/7e71a11a-97b5-648a-7cc5-a872b24b0547.jpeg)

思ったより具合が良かったです。各シートに電源完備。無限コーヒーもあり、かつ資格保持者のみが参加できるディナーの招待券ももらえました。他にも特典でTシャツ。（全部の資格を保持した五冠の人には、五冠Tシャツが渡されるとか）

# GPS01 - Global Partner Summit Keynote
詳細は別途出るでしょうから簡単に。いくつかAPN向けの新サービスが紹介されたり、プレミアコンサルティングパートナーの紹介がされたりしました。日本の企業はNECとNTT DATAが追加されて計７社がプレミアとして登録されていることになりました。

と思っていたら、すでにAWSの方で記事が書かれていました。早い！

[[速報] 2017年度のプレミアパートナー様が発表されました！！](http://aws.typepad.com/aws_partner_sa/2016/11/apnpremier2017.html)

55社のグローバルプレミアコンサルティングパートナーのうち、７社が日本てすごいですよね。

# 食事はホールで
ベネチアンホテルで朝食やランチをとりましたが、広すぎですね。2.5万人収容できる場所らしいです。出てくるランチはまあ食べられる、程度のお味でした。
＃写真ぶれてら。。。

![20161129_073955.jpg](https://qiita-image-store.s3.amazonaws.com/0/102769/482cd649-d9e3-142f-5164-eb9d0bdf8c55.jpeg)

# SEC307 - Microservices, Macro Security Needs: How Nike Uses a Multi-Layer, End-to-End Security Approach to Protect Microservice-Based Solutions at Scale
セキュリティレイヤーなどの基礎的なお話の後に、Secure Property Store for Cloud Application」としてCerberusの紹介。詳細は公式ページを見たほうがいいです。
アプリケーションの利用を考えたときに、

- ユーザのアクセス
- 運用者のアクセス
- 他のアプリからのアクセス

など様々な状況があり、それぞれの権限を正しく管理しようとして出来上がったプロダクトのようです。

[Cerberus](http://engineering.nike.com/cerberus/)

こういうものをNIKEがやっていたんですね。意外に感じました。~~（自分が色々と知らなすぎなのかな汗）~~

デモを見せているときにまさかのタイポによるバグ混入で参加者がデバッグの手助けをする場面もあったり。

# GPSCT310 - Chalk Talk: Ingesting, Storing, Processing and Extracting Value from Real-Time Big Data
大量のデータをリアルタイムにデータ処理をするための手法の説明。途中のAWSサービスの説明はいらなかった気がしますが（とはいえそこで質問が結構出た）、航空機の位置情報（だったかな）を監視するためにKinesisやLambdaなどを使い、DynamoDBへの保持やKinesis Firehose → Redshiftでのデータ処理を実現する、という内容は面白かったです。

データ処理をする前にMachineLeraningを一旦かませて、いわゆるIf文の羅列を避けた実装をLambda上でしていたのは新鮮でした。（Predict関数を呼んでました）

# GPST404 - Building Complex Serverless Applications
今日一わからなかったセッション。内容のレベルが一歩抜けていた気がしました。（英語の発音も・・・。）Lambda、API Gateway、Kinesisなどなどのいわゆるフルマネージドサービスをふんだんに使って複雑なアプリケーションを組むための考え方やハマりポイントの解説でした。

またCloudFormation向けツールとしてのServerless用アプリケーションモデル「SAM」も紹介されていました

バージョニングとエイリアスの管理でLambdaコードをうまく管理するんだよー、みたいなこと言ってました。

詳しくはこちらのページで！（わからないことが多かったので雑）

[AWS Lambda Function Versioning and Aliases](http://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html)

# GA01 - Welcome Reception
展示会場行きましたが、混みすぎ！行きたいブースがだいたい人でごった返していたんで、また明日にでも行ってみます。

# GA02 - Tuesday Night Live with James Hamilton
実はこの前の展示会場の見学の後、そこらへんをぶらぶらしてたら迷って戻れなくなり（そもそもホテルからでれずに２つくらい館内でホテルを行き来してた）、開始から遅れること30分強。James Hamilton氏が新しく作ったルータの話をしていました。

宇宙とAWSとの関わり方、火星移住計画（？JavaOneに続きAWS Night Liveでも火星！？と思いました）の話題。最後はDeep Learningのためのフレームワークの紹介でした。
（ここら辺は特にSNSで盛り上がっていたので、近いうちに詳細なレポートが誰かから出るはずです）

宇宙の話あたりから、Machine LearningとかDeep Learningとかそっち側の話題にかなり力が入っているように見えました。これって何か新サービスを関係あるのですかね？楽しみです。


（今日は寝る前に書けたぞ）
pam_succeed_if.soでエラーが出た場合


前回、[PAMの記事](http://qiita.com/knqyf263/items/15b6032a1215e3603d59)を書いたのですが、エラーに苦しんだのでメモです。

# 環境
以下の環境で試しました。

- OS
	- CentOS 6.5
- PAM
	- 1.1.1
- OpenSSH
	- 5.3p1

# エラー内容
以下のような設定を書いていました。

```shell-session
auth      required pam_sepermit.so 
auth      [success=ignore default=1] pam_succeed_if.so user in test1:test2
auth      [success=done default=die]        pam_duo.so
auth      [success=done default=ignore] pam_yubico.so id=XXXXX key=hoge authfile=/etc/yubikey_mappings
auth      required                      pam_deny.so
```

この状態で正しく認証してログインしようとすると、PAMでエラーが出ました。

```
Nov 30 13:15:56 iudev0007 sshd[8126]: fatal: PAM: pam_setcred(): The return value should be ignored by PAM dispatch
```

意味がよくわかりませんでしたが、調べたら以下のブログがヒットしました。
https://josemaas.net/blog/yubikey-pam-on-linux.html

どうやら `ignore=ignore` が必要っぽいです。

```
auth      [success=ignore ignore=ignore default=1] pam_succeed_if.so user in test1:test2
```

こうするとうまく行きます。

ignoreの意味など調べたのですが、未だに意味がわかっていません。
同じエラーで苦しむ人がいるかもしれないので一応書いておきましたが、もし誰か理由が分かる人がいたら教えてください！！
Carthage の update を速くする


Carthage、iOS アプリの Build が早くなるのは良いんだけど、update が遅い…。

また、落としてきたバイナリがうまく使えないこともあり、毎回 ```--no-use-binaries``` をつけている、フルコンパイルすこぶる遅い、そんな経験ありませんか。

```
$ carthage update --platform ios --no-use-binaries
```

だと、毎回ビルドが走ってすこぶる遅いため、変更があったライブラリだけ雑に上げる rake タスクを作りました。

```
$ rake carthage:update
```

すると、適当にチェックして、更新がありそうなライブラリだけ update のオプションとして実行します。

```ruby
require 'pathname'
PROJECT_ROOT = Pathname(__FILE__).parent

namespace 'carthage' do
  def update_libs(libs, no_use_binaries: true)
    command = 'carthage update --platform ios'.split(' ') + libs
    command << '--no-use-binaries' if no_use_binaries
    puts command.flatten.join(' ')
    system(*command)
  end

  desc "minimal update"
  task :update do
    puts "Checking: carthage outdated"
    outdated = `carthage outdated`

    targets = outdated.split("\n").
      select {|l| l.include?(' "') }.
      map    {|l| l.split(' ').first }

    libs = outdated.split("\n").
      select {|l| l.match(/\s(Cloning|Fetching)/) }.
      map {|l| l.split(' ').last }

    installed_libs = Pathname.glob(PROJECT_ROOT + 'Carthage/Build/iOS/*.framework').
      map {|path| path.basename('.framework').to_s }

    targets = (targets + libs - installed_libs).uniq
    if targets.empty?
      puts "Maybe all libs are newest"
    else
      puts "Install: #{targets.join(" ")}"
      update_libs targets
    end
  end
end
```
特定のフォントがインストールされているか調べる方法

あるフォントがインストールされている場合は、そのフォントを使いたい。でもない場合は、WEBフォントを使用したい。そういった場合にフォントがマシンにインストールされているかどうかを調べる方法です。

ダミーのフォントと調べたいフォントで適当な文字列を見えない場所に置いてみてその大きさを比較するといいみたいです。大きさが違ったらそのフォントがインストールされているのがわかります。なるほどと思いました。

**[追記]**

こちら、Canvasの文字要素のフォントの選択の際に作成しました。
HTML要素の、ウェブフォントとローカルフォントの選択の際は、コメント欄に書いていただいた方法が有用です。


以下CoffeeScriptです。

```coffeescript
fontCheck = (fontname)->
  # クォーテーション付きのfont-family対応
  fontname = fontname.replace /\'/g,"\'"
  fontname = fontname.replace /\"/g,"\'"

  testText = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!?1234567890あいうえおかきくけこさしすせそ"
  testStyle = "font-size:100pt; position:absolute; top:-10000px; left:-10000px; color:white; text-align:left; border:0; margin:0; padding:0 ;white-space:nowrap; "
  dummyStyle = testStyle+"font-family:dummyfont;"
  fontStyle = testStyle+"font-family:"+fontname+";"
  dummyText = "<div id='dummyText' style='"+dummyStyle+"'>"+testText+"</div>";
  fontText = "<div id='fontText' style='"+fontStyle+"'>"+testText+"</div>";

  $("body").append dummyText
  $("body").append fontText

  dummyTextSize = [$("#dummyText").width(),$("#dummyText").height()]
  fontTextSize = [$("#fontText").width(),$("#fontText").height()]

  $("#dummyText").remove()
  $("#fontText").remove()

  dummyTextSize[0] != fontTextSize[0] || dummyTextSize[1] != fontTextSize[1]
```

下記を参考にしました。
<blockquote><a href="http://www.lalit.org/lab/javascript-css-font-detect/">JavaScript/CSS Font Detector › lalit.org</a></blockquote><blockquote><a href="http://d.hatena.ne.jp/uupaa/20100128/1264630442">レンダリングに使われているフォントと、ブラウザで使えるフォントを取得する - latest log</a></blockquote>
CSSのキーフレームアニメーションの開始位置をランダムにする方法

<p>CSSのキーフレームアニメーションの開始位置をランダムにする方法をご紹介します。</p>
<p>CSSアニメーションのプロパティには、</p>

<ul>
  <li>animation-name : アニメーションの名称</li>
  <li>animation-duration : アニメーションの長さ</li>
  <li>animation-timing-function : イージング</li>
  <li>animation-delay : 何秒後にアニメーションを始めるか</li>
  <li>animation-iteration-count : 繰り返し回数</li>
  <li>animation-direction : アニメーションを逆再生するかどうか</li>
</ul>
といったものが用意されていますが、アニメーションを途中から再生するためのプロパティはありません。ですので、読み込むたびに毎回ランダムな再生位置でアニメーションを再生させたいという場合にどうすればよいか？

実は、"animation-delay"には負の値を設定することが出来ます。

"animation-iteration-count"を"infinite"にして、アニメーションを無限繰り返し状態にしている時に、"animation-delay"に負の値を設定すると、アニメーションの終わりから逆上った時点からスタートされます。

例えば"animation-duration:20s"、"animation-delay:-5s"のようにすると、15秒後の位置からスタートされます。

後は、Javascriptで、ランダムな秒数のアニメーションを読み込み時に設定してあげれば、開始位置がランダムなアニメーションが出来るというわけです。

以下は、背景色がじわじわと変わるCSSアニメーションのデモです。四角をクリックするたびに違う色からスタートするのがわかります。

```Haml
%html
  %body
    #box
```

```sass
@import compass

#box
  width: 200px
  height: 200px

@-webkit-keyframes anime1
  0%
    background-color: #DBAD00
  10%
    background-color: #CC6700
  20%
    background-color: #CC2F00
  30%
    background-color: #CC0090
  40%
    background-color: #6A00CC
  50%
    background-color: #000ECC
  60%
    background-color: #00A1CC
  70%
    background-color: #00CC75
  80%
    background-color: #00CC02
  90%
    background-color: #A8CC00
  100%
    background-color: #DBAD00

```

```coffeescript
$ ->
  $('#box').css
  	'animation':'anime1 10s ease -'+Math.random()*10+'s infinite'
  
 $(document).on 'click','#box',->
    $('#box').remove()
    $('body').append '<div id="box"></div>'
    $('#box').css 'animation':'anime1 10s ease -'+Math.random()*10+'s infinite'
```

<p class="codepen" data-height="268" data-theme-id="0" data-slug-hash="YPwGoa" data-default-tab="result" data-user="shagggy">See the Pen <a href="http://codepen.io/shagggy/pen/YPwGoa/">YPwGoa</a> by TAKAYASU SAGAWA (<a href="http://codepen.io/shagggy">@shagggy</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script src="//assets.codepen.io/assets/embed/ei.js" async=""></script>
Photoshop CC2015のメニューから「Web用に保存」が消えてた

# いつのころからか、メニューから「WEB用に保存」が消えてた

いつもショートカットキーを使ってたんで気が付かなかった。
なお、消えたわけではなく、[ファイル]-[書き出し]の下に[Web用に保存(従来)]として移動していたもよう。

# 「Web用に保存」はオワコン

> Photoshop CCの「Web用に保存」機能の話
> https://blogs.adobe.com/creativestation/photo-saveforweb

上記ブログによると、

> 特に大きなポイントは、JPEG圧縮技術自体も向上し、JPEGの最高画質を選択した時、従来の「Web用に保存」と比較して、最終画像が半分のファイルサイズになる場合もあります。（これは写真によって結果が異なることは事前に了承ください）

とのこと。
ほほう。

# 見せてもらおうか、向上したJPEG圧縮とやらを

テストに使った画像(2048×768ピクセル)は権利上の問題で公開できないんですが、実際業務で使うやつです。
[レナ](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%8A_(%E7%94%BB%E5%83%8F%E3%83%87%E3%83%BC%E3%82%BF))でもいいかなと思ったんですが、ライセンスやらQiitaの規約調べるのも面倒だったし。

|品質|Web用に保存|新しい書き出し|%|
|---:|---:|---:|---:|
|100|1,241,032|1,240,850|99.98%|
|51|298,669|298,411 |99.99%|
|30|162,044|161,355|99.95%|

…なんかやりかた間違ってるのか、俺。

ちなみに [compressor.io](https://compressor.io/) に「Web用に保存」の画像をlossyでブッこんだ結果。

|品質|Web用に保存|compressor.io|%|
|---:|---:|---:|---:|
|100|1,241,032|242,500|19.54%|
|51|298,669|242,114|81.06%|
|30|162,044|161,122|99.43%|

# 結論
Photoshop用のcompressor.ioプラグインでたら$50までなら出す。
ポッゲンドルフ錯視

```r
library(grid)
library(jpeg)

r1 = readJPEG("20161201_face.jpg")

png("sakuad2016120201.png", 800, 400)

yy = 0.8
yd = 0.1
pushViewport(viewport(0.25, 0.5, 0.5, 1, xscale = c(-1, 1), yscale = c(-1, 1)))
grid.lines(c(-0.8, 0), c(yy, 0), default.units = "native", gp = gpar(col="black", lwd = 3))
grid.lines(c(0, 0.8), c(0, -yy), default.units = "native", gp = gpar(col="red", lwd = 3))
grid.lines(c(0, 0.8), c(0-yd, -yy-yd), default.units = "native", gp = gpar(col="green", lwd = 3))
grid.lines(c(0, 0.8), c(0+yd, -yy+yd), default.units = "native", gp = gpar(col="blue", lwd = 3))
grid.raster(r1, 0, 0, 0.75, 1.5, default.units = "native")
popViewport()

pushViewport(viewport(0.75, 0.5, 0.5, 1, xscale = c(-1, 1), yscale = c(-1, 1)))
grid.raster(r1, 0, 0, 0.75, 1.5, default.units = "native")
grid.lines(c(-0.8, 0), c(yy, 0), default.units = "native", gp = gpar(col="black", lwd = 3))
grid.lines(c(0, 0.8), c(0, -yy), default.units = "native", gp = gpar(col="red", lwd = 3))
grid.lines(c(0, 0.8), c(0-yd, -yy-yd), default.units = "native", gp = gpar(col="green", lwd = 3))
grid.lines(c(0, 0.8), c(0+yd, -yy+yd), default.units = "native", gp = gpar(col="blue", lwd = 3))
popViewport()

dev.off()
```

![sakuad2016120201.png](https://qiita-image-store.s3.amazonaws.com/0/4390/649b4089-6160-07da-1a0a-16d92272b285.png)

左側を見て下さい。株式会社ホクソエム代表取締役のご尊顔で線が隠れています。
左の黒い線は、右の赤・緑・青のどの線とつながって見えますか？

多くの人は、「青」とつながっているように見えるんじゃないでしょうか？
実は、右側を見てもらうとわかるように、真ん中の赤い線とつながっています。

黒が赤へ・・・。

これはポッゲンドルフ錯視というものです。
実際のところ、何故この錯視が起きるのかは完全にはわかっていません（直接的には角度の過大視が原因という説が濃厚ですが、なぜ角度が過大視されるのか考えるとまた謎は深まります。もしかしたらある程度わかっているかもしれませんが）。

というか、多くの錯視は原因が不明です。

人間の認識の仕組みは、それくらい謎に満ちているということですね。

株式会社ホクソエムのホームページです。 http://hoxo-m.com/
vue 2.x 単一ファイルのコンポーネント間通信(親子関係なしの場合)

# vue2.07 Communication Between Sibling Components
## はじめに。
vue2から$dispatchが非推奨となりコンポーネント間の通信仕様に変更があったようで実装してみた。
と言うより本格的なvueの使用は2からだったのでむしろ良かったのかもしれない。
当初、コンポーネント間のメソッドの呼び出しは自由に出来るものと思っていたが甘かった。

公式サイトの
**全てのコンポーネントや Vue インスタンスは自身のライフサイクルを持ちます** や
**全ての Vue.js コンポーネントはそれ独自のスコープを持つ個々の Vue インスタンスです。それはコンポーネントを使用する時にスコープがどのように機能するか理解することが大事です。**
を読み飛ばしていた。

比較的親子間の通信はやっている方が多かったのだが
親子関係を持たないコンポーネント間の通信に関するページが少なく

"Communication Sibling Components vue"

で検索してやっと解決方法のヒントに出会ったのでメモ書き。
"Sibling"がキーワード。親子でなく兄弟（対等な）関係

## やりたかった事
 1.コンポーネントAから渡されたパラメータをコンポーネントBで取得しtemplate内のタグにバインド
 2.コンポーネントBのメソッドをコンポーネントAでキック

## 実装方針
http://012-jp.vuejs.org/guide/components.html
にあるように基本的に$$emit + $onを使用して実装可能だが
下準備が必要。公式サイトにそれっぽいことが載ってなかった。

## 実装
### app.js
公式サイトが不親切でフロントエンドに詳しくない私にとって 
ES5 or ES6 or plain Jsの違いもわからない状態からではちょと厳しかった。
以下のように
ダミーオブジェクトのようなもの(eventHub)を用意してexportの必要があった。
ソースが汚くてすみません。大事なのは※部分。

```
var eventHub = new Vue();
module.exports = eventHub;//←※これだとok
//exports.eventHub = eventHub; ←これはngだった

var vue = new Vue({
  el: '#app',
  data:{
    itemList: null,
    outline : null
  },
  created: function () {
    	// initialize
  },
  components: {
    ArticleGrid: require('./template/com1.vue'), //呼び出す側のコンポーネント
    ArticleDetail: require('./template/com2.vue'),//呼び出さるメソッドを保持
  }
})
```

### com1.vue
呼び出す方のコンポーネント
setDetailという名前で呼び出す。($emit)
直接呼び出すのではなくapp.jsのeventHub経由で呼び出しています。

```
<template>
	<a class="grid__item" v-on:click="showDetail">
　　　　　　　　...
	</a>
</template>

<script>
// ※ここでimportが必要
// 海外サイトでこれがないために動いてないソースも多かった。
import eventHub from '../app'
export default {
    props: ['abc'],
    methods: {
        showDetail: function () {
            // ※第2引数にパラメータを渡せる⇒これでコンポネント間の値の受け渡しも可能
            eventHub.$emit('setDetail', tmpoutline) 
            console.log("dispatch--");
        }
      },
}
</script>
```

### com2.vue
呼び出される方のコンポーネント
setDetailという名前で登録。（$on）

```
<template>
	<article class="content__item">
        ...
	</article>
</template>
    
<script>
import eventHub from '../vueTop'

export default {
    created: function () {
　　　// ※メソッドの登録。実際に呼ばれるのは以下のmethods内
      eventHub.$on('setDetail', this.setDetail)
    },
    methods: {
      setDetail: function (param) {
        console.log("--called");
      }
    }
}
</script>
```
jQueryのready、load関連の実行順序

jQueryを使っていて、ファイル内でのready・loadまわりの実行順序があやふやになるので、まとめておきたいと思います。以下coffeescriptです。

```coffeescript
# どの行に書いても以下の種類の順番で動作します。

# ====================================
# 1
# ベタ書きが一番最初で、上から順に実行される
console.log '1'

# ====================================
# 2
# 以下の２つは同じで、上から順に実行される
# DOMが用意された時に実行される

$(document).ready -&gt;
  console.log '2'

$ -&gt;
  console.log '3'

# ====================================
# 3
# ※jquery 1.8以降では非推奨。
$(document).on 'ready',-&gt;
  console.log '4'

# ====================================
# 4
# loadは、画像なども含めて読み込み終了後
$(window).on 'load',-&gt;
  console.log '5'
```

知らなかったのは、`$(document).on 'ready'`が非推奨になっていたことでしょうか。
zabbix画面から監視対象サーバ上でコマンドを実行する（マップの自動作成編）

# zabbix2.0で自動登録されたホストをマップでも自動登録させる


## はじめに

zabbixのホストをマップに自動登録する事に対して意味はないと思ってます。
しかし、各サーバで任意のコマンドを実行して結果を参照したい時（障害対応とか）にマップに登録されているととても都合が良いのです。
今回は、障害時に各サーバでコマンドを実行できる環境を作る準備としてマッピングの自動化を設定してみます。

## 環境

* Zabbix 2.0.14
* ServerOS RHEL 6.6

## アイコンのマッピングを登録する

「管理」→「一般設定」→「アイコンのマッピング」
「アイコンのマッピングの作成」
から新しいマッピングを作成する。

![2016-11-30_143407-mapping01.png](https://qiita-image-store.s3.amazonaws.com/0/149632/dfb79710-f2f9-e543-e46a-307477ab8786.png)

→この設定は、インベントリを使用してい無い方は作るだけで良いです。
　関係しているのは、標準の個所のアイコンなのでマップに表示させたいアイコンにしてください。
※インベントリの条件でアイコンを変える場合はルールを増やしていく。

## マップを作成する

マップは、ホストグループ単位で作成します。
（1つのマップに表示させるホストのこと）

監視対象の台数によりますので、自分の都合の良いホストグループを選ぶ。

「設定」→「マップ」
「マップの作成」

![2016-11-30_143613-map.png](https://qiita-image-store.s3.amazonaws.com/0/149632/50dedd41-41be-331c-e261-f0364476c877.png)

デフォルト設定から変更するのは、

* 名前→お好みで
* アイコンの自動マッピング→作成したアイコンのマッピングを選ぶ
* 「アイコンのハイライト」～「障害が1つの時に詳細を展開」は必要な項目をチェックする（下記参照）

https://www.zabbix.com/documentation/2.0/jp/manual/config/visualisation/maps/map

* アイコンラベルのタイプ→アイコン名を選ぶとホスト名で表示される

## 作成されたマップを編集する

作成したアイコンを表示したら、仮アイコンを一つ作成する。（アイコン＋）

![2016-11-30_143708-icon.png](https://qiita-image-store.s3.amazonaws.com/0/149632/7587f11d-4255-e07f-3af1-d49115ad849b.png)

作成されたアイコンを左クリックすると、↓の変更メニューが出てきます。

![2016-11-30_143846-group.png](https://qiita-image-store.s3.amazonaws.com/0/149632/7472c8ad-d167-979f-62aa-2c5ec6fd809a.png)

主な変更箇所は、

* タイプ→ホストグループ
* 表示→ホストグループ内のホスト
* ホストグループ→マップ化したいホストグループを選択する

で適用した後に閉じる。

## 表示を確認する

「監視データ」→「マップ」
で作成したマップを選択すると、自動的に登録されているホストが配置されたマップになっています。

![2016-11-30_154420-mapsample.png](https://qiita-image-store.s3.amazonaws.com/0/149632/7a2d1ded-6f7b-ef17-c0bc-ec262400f3cb.png)

次回、このマップでコマンド実行したいサーバ上で指定されたコマンドを実行して結果を確認する。
を書きたいと思います。

## 参考にしたサイトに感謝

[zabbix 2.0公式ドキュメント（一般設定）](https://www.zabbix.com/documentation/2.0/jp/manual/web_interface/frontend_sections/administration/general)
[zabbix 2.0公式ドキュメント（ネットワークマップの設定）](https://www.zabbix.com/documentation/2.0/jp/manual/config/visualisation/maps/map)
[全自動zabbix](http://www.zabbix.com/jp/img/zabconf2013/presentations/13-ito.pdf)
Heroku　コマンド

※　メモ用

# 基本
## 新規作成
```bash:新規作成
$ heroku apps:create my_app
```
## ログイン・ログアウト
```bash:ログイン
$ heroku login
```
```bash:ログアウト
$ heroku logout
```
## ブラウザで確認
```bash:ブラウザで開く
$ heroku open
```
## ログ
```bash:ログ確認
$ heroku logs
```
```bash:ログ確認（リアルタイム）
$ heroku logs --tail
```
## デプロイ
```bash:デプロイ
$ git push heroku
```
## アプリの一覧
```bash:作成済みアプリの一覧を表示
$ heroku apps
```
# あまり使わない
## タイムゾーンを日本に変更
```bash:タイムゾーン変更
$ git heroku config:add TZ=Asia/Tokyo
```
## メンテナンスモード
```bash:メンテナンスモード　ON
$ heroku maintenance:on
```
```bash:メンテナンスモード　OFF
$ heroku maintenance:off
```
CSSのみで1px以上の間隔のボーダーを作る

通常CSSのborderのdottedは、1px間隔のボーダーになります。
ですが、デザイン的には1px間隔以上のドットのボーダーを使う局面はよくあると思います。そのたびに、背景画像でその部分を作るのは、なんだかもう時代遅れな感じがしたので、cssのみで作れないかと思って調べていたら、グラデーション背景を使うことで作れそうだったのでmixinを作りました。以下Sass表記です。

``` sass
=dotted($pos: left,$color:rgba(#000, 1.0), $stripe: 1, $spacing: 4, $width:1)
  border: none
  @if $pos == left or $pos == right
    background: linear-gradient(to bottom,$color 0%,$color $stripe/($stripe+$spacing)*100%,transparent $stripe/($stripe+$spacing)*100%,transparent 100%)
    background-repeat: repeat-y
    background-size: ($width)*1px ($stripe+$spacing)*1px
    background-position: $pos ($stripe)*1px
  @else if $pos == top or $pos == bottom
    background: linear-gradient(to left,$color 0%,$color $stripe/($stripe+$spacing)*100%,transparent $stripe/($stripe+$spacing)*100%,transparent 100%)
    background-repeat: repeat-x
    background-size: ($stripe+$spacing)*1px ($width)*1px
    background-position: ($stripe)*1px $pos

```


<p class="codepen" data-height="268" data-theme-id="0" data-slug-hash="YqGaGy" data-default-tab="result" data-user="shagggy">See the Pen <a href="http://codepen.io/shagggy/pen/YqGaGy/">dotted border mixin</a> by TAKAYASU SAGAWA (<a href="http://codepen.io/shagggy">@shagggy</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script src="//assets.codepen.io/assets/embed/ei.js" async=""></script>

<strong>+dotted(ボーダー位置[top,bottom,left,right],ボーダーの色,ドットの幅,ドットの間隔)</strong>

で使えます。

おそらくそのうち、cssで正式に対応する部分ではあると思いますが、それまでは便利に使えると思います。
VVVのVV(Variable VVV)が404で表示されない


タイトルのとおりですが、
最初にいくら`vv create`で作成しても、404で表示されないなぁと悩んでました

## `vv create`で作成したフォルダに`htdocs`を作って、そこにファイルを入れる


はい、どうやら`htdocs`というフォルダがルートになるようでした。

あぁ・・・、書くことこれしかない
同じ悩みを抱えて人がいればいいなって・・・

---

### 蛇足
最近VCCWというのが少し名前が出てきたように思います
http://vccw.cc/

WordMoveで本番環境と開発環境を同期したりできるみたいですね
https://github.com/welaika/wordmove

VCCWはVVV以上に手軽に準備できるかなと思いました。
その分、VVVほど設定できなかったり、拡張性が今のところ見れなかったりします（個人的見解）

MAMP、VVV、VCCWとか他にもいろいろあるかと思うんですが、
自分にあった環境、必要に応じた環境を作るのがいいかなと（シミジミ


おしまい
[Ruby on Rails] ループの最初と最後のみ特別扱いする書き方

rubyでループで処理するときに、最初だけor最後だけに特別な処理をしたい場合の書き方メモ

```ruby:
@hoges.each_with_index do |hoge, i|

  if i == 0
   最初だけにしたい処理
  end

  共通の処理

  if i == @hoge.length - 1
    最後だけにしたい処理
  end

end
```