OmniAICreator/Qiita-1.07M huggingface dataset:
rubyでunicode, UTF8を扱うためのTips

# Unicodeコードポイント -> 文字列

```.ruby
0x1F5FF.chr("UTF-8")
=> "🗿"
```

# 文字列 -> Unicodeコードポイント

```.ruby
"🗿".codepoints.map{|v| v.to_s(16)}
=> ["1f5ff"]
```

# 文字列 -> UTF8 16進数

```.ruby
 "🗿".bytes.map{|v| v.to_s(16)}.join
=> "f09f97bf"
```

# UTF8 16進数 -> 文字列

```.ruby
puts ["f09f97bf"].pack("H*")
🗿
```

# 絵文字か知りたい

Unicodeプロパティを使うと楽

```.ruby
"🗿".match(/[\p{In_Miscellaneous_Symbols_and_Pictographs}\p{In_Emoticons}]/)
=> #<MatchData "🗿">
```

## Unicodeプロパティ?

Unicodeコンソーシアムが出した文字範囲に関する規格

- http://www.unicode.org/Public/UNIDATA/Scripts.txt

Rubyの正規表現エンジン「Onigmo」で使えるUnicodeプロパティについては、以下の「Character Property」を参照

- https://github.com/k-takata/Onigmo/blob/master/doc/UnicodeProps.txt

## 各Unicodeプロパティの文字範囲を知りたい

めちゃくちゃ長いファイルだけれど、Onigmo のヘッダファイルみればわかる

- https://github.com/k-takata/Onigmo/blob/master/enc/unicode/name2ctype.h

## 罠も多いので注意

### `Alphabetic` 

英文アルファベットではなく **全ての言葉の内、記号、数字、空白ではない文字** を指す

- 日本語も当然ヒットする

### `Katakana`

- 全角カナ
- 半角カナ
- ㋐〜㋾ (!)
- ㌀〜㍗ (!!!)
- 𛀀(?)
    - katakana letter archaic e (U+1B000)
    - あ行のえを表した「衣」に由来する片仮名(http://www.akenotsuki.com/eyeben/fonts/)

などなど...

- 厳密にやりたいなら、下のように正規表現を使ってコードポイントの範囲指定をした方が良いと思う

# UTF-8で4バイトになる文字が知りたい

正規表現で範囲指定すれば楽

```.ruby
"𠮷".match(/[\u{10000}-\u{10FFFF}]/)
=> #<MatchData "𠮷">
```



# 参考

- [Unicode文字プロパティ](http://www.slideshare.net/ShozoHatta/unicord-charproperties)
Unicode, UTF についてひっかかったので色々メモ

もう[文字コード](http://qiita.com/kasei-san/items/cfb993786153231e5413)は[おなかいっぱい](http://qiita.com/kasei-san/items/3ce2249f0a1c1af1cbd2)なのですが...

# Unicode と UTF の違い

- Unicode : 符号化文字集合
- UTF : 符号化方式

符号化文字集合と、符号化方式についてはこちらを参照 -> [本当は怖くないCP932](http://qiita.com/kasei-san/items/cfb993786153231e5413#shift_jis-%E3%81%A3%E3%81%A6%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E3%81%AA%E3%81%AB%E3%82%92%E6%8C%87%E3%81%99%E3%81%AE)

# Unicode

- 文字セットの切り替えなしに、世界中の文字を単一文字集合として扱う符号化文字集合規格
- 21ビットの範囲(0x00000〜0x10FFFF)
- 各文字の位置は先頭に `U+` をつけて表す( **Unicodeコードポイント** と呼ぶ)
    - 例えば 🗿 ならば `U+1F5FF`

# UTF-8, UTF-16, UTF-32 の違い

## UTF-32

- Unicodeコードポイントをそのままつかった符号化方式
- 21ビットだと切りが悪いので、32ビット

## UTF-16

- 1文字16ビット
- **元々、unicodeは16ビットの固定長として開発されたため** 、最初はUTF-16が、unicodeの唯一の符号化方式だった
- 16ビット以上の文字については、 **サロゲートペア** という仕組みで16ビットx2で表現

### サロゲートペア

- Unicode1.0では、16ビット固定で、2^16(=65,536)個に全ての文字を入れる計画だった
    - U+0000〜U+FFFF
    - 漢字圏のこと考えてねぇ...
- 漢字入りきらねぇよ! ってなって、Unicode3.0で拡張された
    - U+0000〜U+10FFFF
- で、元々全て16ビットの範囲内に入ると思って作られたUTF-16だと入りきらない! となって、対応方法が検討された

### サロゲートペアの方法

- U+D800〜U+DFFF までには文字を割り当てない
  - これらを **サロゲートコードポイント** と呼ぶ
- U+D800〜U+DBFF を **上位サロゲート** と呼ぶ
- U+DC00〜U+DFFF を **下位サロゲート** と呼ぶ
- UTF-16では、上位サロゲートと下位サロゲートの組み合わせで、U+10000以降の文字を表現している
- UTF-16専用の仕様であるが、これらの為にUnicodeがサロゲートコードポイントを策定しているので、他のUTFも影響を受けた
    - サロゲートコードポイントには、当然どのUTFでも文字は宛てられていない

## UTF-8

- UTF-16の内、1バイトで表せる文字(ASCII)については、1バイトで表す( **ASCIIの上位互換** )
- 残りについては、範囲に応じて 2バイト〜4バイト にエンコードする
    - エンコード方法についてはこちらを参照 -> [UTF-8](http://exlight.net/devel/unicode/utf8.html)
- 必要に応じて文字のバイト数が変動するので、容量の無駄が少ないのが特徴

### UTF-8 mb4

- 4バイト対応のUTF-8のこと
- Unicode2系までは、UTF-8は最大3バイトだったので、3バイトまでしか対応していないUTF-8実装があった
- 例えばMySQLは、5.5.33までは4バイト対応しておらず、後から追加された絵文字や追加漢字(𠮷とか)は格納できなかった

# 絵文字についてメモ

- 絵文字が追加されたのは、2010年の Unicode 6.0から
- 以下のバージョン以降のOSは標準で対応している
    - windows : 8以降
    - MacOS : 10.7(Lion)以降
    - それ以前のバージョンでも絵文字対応しているフォントを落とせば見れるらしい
    - 参考 : [Help:特殊文字 - Wikipedia](https://ja.wikipedia.org/wiki/Help:%E7%89%B9%E6%AE%8A%E6%96%87%E5%AD%97#.E6.90.BA.E5.B8.AF.E9.9B.BB.E8.A9.B1.E3.81.AE.E7.B5.B5.E6.96.87.E5.AD.97)


# その他色々

- Microsoft Windows や Javaでは "Unicode" といえば **UTF-16 のリトルエンディアン** という暗黙の了解になっている。
    - 元々Unicodeが16ビット固定長で開発されたという歴史的経緯のため

# 参考

- https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
- [Unicode - Wikipedia](https://ja.wikipedia.org/wiki/Unicode)
- http://graphemica.com/%F0%9F%97%BF
    - 文字コード毎の詳細情報が見れて便利
- [絵文字がある種のUnicodeバグを世界から一掃しつつある件について｜Rui Ueyama｜note](https://note.mu/ruiu/n/nc9d93a45c2ec)


## サロゲートペア関係
- [Unicode のサロゲートペアとは何か - ひだまりソケットは壊れない](http://vividcode.hatenablog.com/entry/unicode/surrogate-pair)
- [サロゲートペア入門：CodeZine（コードジン）](http://codezine.jp/article/detail/1592)
[Oracle]OUIの文字化けでトーフ（口口口）になった場合の回避方法(*口▽口)

環境：VirtualBOX+Oracle Linux 5.4

OUIでがデフォルトで使用するJavaの場合だと、文字化けしてしまうため、その回避方法の備忘。
今まで文字化けした記憶ないんだけどなー。ディストリビューションに寄るのかな。

```
[oracle@node1 database]$ export LANG=ja_JP.UTF-8
[oracle@node1 database]$ which java
/usr/bin/java
[oracle@node1 database]$ ls -l /usr/bin/java
lrwxrwxrwx. 1 root root 22 12月 20 23:24 2015 /usr/bin/java -/etc/alternatives/java
[oracle@node1 database]$ ls -l /etc/alternatives/java
lrwxrwxrwx. 1 root root 46 12月 20 23:24 2015 /etc/alternatives/java -/usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
[oracle@node1 database]$ 

[oracle@node1 database]$ ./runInstaller -jreLoc /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/
```

あと、dbca、netca起動時も同じように文字化けするが、その時は、$ORACLE_HOME/bin/dbcaの"JRE_DIR="を別のOS標準のパス（上記の/usr/lib/jvm～）に変更！
Amber Smalltalk から引数が複数の JavaScript コンストラクタを呼ぶ

 　[KLab アドベントカレンダーの記事](http://klabgames.tech.blog.jp.klab.com/archives/1047508930.html)を書いていて困ったことネタです。

　まぁ、調べればすぐ分かりますし、他の Smalltalk 処理系を触ったことがあれば見当がつくのですが、[ドキュメントには引数三つの場合まで](https://github.com/amber-smalltalk/amber/wiki/Call-javascript-constructors-with-arguments)しか書いていないので…。

　引数が三つ以上(複数)の場合は ``` BlockClosure>>#newWithValues: ``` を使えば良いです。良く考えたら記事でも触れていますが…。
Amber Smalltalk で引数が複数の JavaScript のメソッドを呼ぶ

 　[KLab アドベントカレンダーの記事](http://klabgames.tech.blog.jp.klab.com/archives/1047508930.html)を書いていて困ったことネタです。

　引数が一つの場合は ``` console.log('hello world') ``` を ``` console log: 'hello world' ``` のように書き換えれば良いのですぐに見当がつくのですが、``` jqObj.css('background', 'red') ``` のように引数が複数ある場合はどうすれば良いでしょうか？
　実は ``` jqObj css: 'background' color: 'red' ``` だろうが ``` jqObj css: 'background' hogehoge: 'red' ``` だろうが最初のキーワードが JavaScript のメソッド名にさえなっていれば、第二引数以降はキーワードはなんでも良いみたいです。ずこー。

　良く見ると[ドキュメント](https://github.com/amber-smalltalk/amber/wiki/From-smalltalk-to-javascript-and-back)にもちゃんと書いてあるんですけどね…。流し読みしていて見逃しちゃいました。
ESP-WROOM-02 > IO15 > UART Download Mode: Lレベル / Flash Boot Mode: Lレベル > HSPICS / UART0_RTS

http://qiita.com/drafts/7f1d001237ebe354e5c8/edit
の続き

## IO15

- IO15 : GPIO15; MTDO; HSPICS; UART0_RTS

上記の意味はIO15は以下のいずれかで使うとのことのようだ。

  - GPIO15として
  - MTDO
  - HSPIのCSとして
  - UART0_RTSとして

UART Download ModeでLowにしているのは、UART0_RTSとして使う時のため?

Flash Boot ModeでLowにしているのは、HSPIでCS以外はLOWで有効にしているということだろうか？

関連 http://www.geocities.jp/zattouka/GarageHouse/micon/SPI/SPI3.htm
数学的な問題をそのまま解く〜制約・論理プログラミングの考え方

多くの場合、プログラムは「手続き型」や「関数型」といったパラダイムのもとに書かれるものですが、そうでないパラダイムとして制約型や論理型というのがあります。

# 手続き型のパラダイム
コンピューター自体がメモリに並んだ命令列を読み取って実行していく、という構造をとっていることもあって、アセンブラから高級言語に至るまで、多くの言語で「実行する内容を並べる」手続き型、という仕組みになっています。実行するものを順序通り並べていく、ということで、単純なことをする上では見通しもいいのですが、そもそも「順番通り」に実行しない非同期処理になると、とたんに見通しが悪くなってしまいます。

また、マシンの構造に関連していることもあって、最適化などもやりやすいのは間違いないですが、逆に万人がこれで書く必要もないというのも間違いないところです。

# メジャーな非手続き型言語…SQL
では、手続き型というパラダイムを超えた言語にはどのようなものがあるでしょうか。「関数型」という声も聞こえては来ますが、それは置いておいて、ここではSQLを考えてみます。

RDBMSを扱うにはほぼ必須に近い言語のSQLですが、これは手続き型ではありません。

```sql
SELECT col1, col2 FROM some_table WHERE other_col >= 5 ORDER BY col1;
```

上のようにSQL文を書いてみると、どのデータをどんな順番で持ってくるかは書いていますが、そのデータを「どんなふうに」取ってくるかは何も書かれていません。SQLの立脚するモデルは現実のコンピューターではなく、「関係論理」や「関係代数」と呼ばれる数学的なものなのです（厳密にはSQLがこれら2つに則っているかの議論もありますが、それは置いておきます）。このように、手続き型以外のプログラミング言語も存在しますが、総称して「宣言型言語」と呼ばれることもあります。

宣言型言語のメリットとしては、物理的な詳細に立ち入らず、論理的にすっきりした世界で物事を考えられるということがあります。逆に、詳細な最適化を行うのは難しくなります（SQLでは、「どのインデックスを使う」といったヒントを与えることができたりしますが、それでも挙動を直接コントロールすることはできないのでチューニングしづらいです）。

# 制約プログラミング・論理プログラミング
宣言型に分類されているパラダイムとして、大きく分けると「関数型」「制約型」「論理型」があります。関数型はそこそこメジャーなのでパスして、制約型・論理型について考えていきます。

制約プログラミングは、上で書いたSQLのように、解に必要な「条件」を記述したうえで、それを適切なエンジンに解かせて解を求める、というものです。数学でお馴染みの「線形計画法」がありますが、これも制約プログラミングの一種です。そして、線形計画法に変数が整数という制限をかけた整数計画法というものもあります。

また、それ以外にも、不等式や論理式を組み合わせた条件の列から、それを満たす解を見つける「制約充足問題」（CSP）というのがあります。

論理プログラミングは、論理式を組み合わせて結論を導いていくというようなスタイルです。いちばんわかりやすいものでは充足可能性問題（SAT）があり、近年高速化したSATソルバーを活用して、CSPなど他の問題をSATへ還元して解く、ということもよく行われています。

これらの制約・論理プログラミングは、それ自体をプログラミング言語として使うことは多くないかもしれませんが、ライブラリとして手続き型言語から呼び出す形で使うこともできます。たとえば、[JavaScriptからSATソルバーを使う](http://qiita.com/jkr_2255/items/c2572528e8f1cf232421)こともできますし、Chefには依存関係を解決する処理のために、CSPのソルバーであるGecodeを使うようになっています。
HBase Masterプロセス と RegionServerプロセスの概要

## HBase には２つのプロセスが存在する
- Master
jpsコマンドで、「HMaster」というプロセスが確認出来る

- RegionServer
jpsコマンドで、「HRegionServer」というプロセスが確認出来る

## 各プロセスの役割
[Master]

- Table の管理

- RegionServer の調整
（Regionの割り当て・ロードバランサ、RegionServer のフェイルオーバー）

クライアントとのデータのやり取りは行わないので、Master がデータやり取りにおけるボトルネックにはならない。
実際にデータやり取り時、Master プロセスに割り当てられている Javaヒープ領域使用量に変化はほとんど見られない。

[RegionServer]

- クライアントとのデータやり取り

- 割り当てられた Region の管理（Flush など）

クラスタ構成の場合、クライアントとのデータのやり取りは 各RegionServer で分散される。
一度に扱うデータサイズが大きい場合、ヒープサイズの設定に依っては、OutOfMemoryError が発生する可能性も考慮する。

## 障害時の動作
[Master]

- ホットスタンバイを立てられるため、Master ダウンしてもサービス継続が可能

- データのやり取りは Master を経由していないため、Master がダウンしてもクライアントとのデータのやり取りは継続可能

- Master のフェイルオーバが完了するまでの間、RegionServer の調整は出来ない

[RegionServer]

- Region の再割り当てを行い、自動的にフェイルオーバする

HBase は高可用性を実現したデータベースとして、「落ちない」とされている。
全ての RegionServer が同時にダウンしてしまうと、さすがにサービス継続することは出来なくなる。
gdbserverから起動したGoのプログラムをリモートデバッグしてみるとどうなるか

2つのDockerコンテナー間でGoのプログラムを gdb to gdbserver でリモートデバッグしてみます。

結論としては、この方法はおすすめできないです。

確認に使ったソースコードはこちら

[github.comkai-zoa/golang-debug-guest-app](https://github.com/kai-zoa/golang-debug-guest-app)

# 利用するツールと構成

- go
- gdb
- gdbserver

プログラムを実行するコンテナではgdbserverでプログラムを実行し、リモートデバッグの接続を待ち受けます。

[リモートデバッグするコンテナ(Dockerfile)](https://github.com/kai-zoa/golang-debug-guest-app/blob/master/debugger/Dockerfile)
[gdbserverからアプリケーションを実行するコンテナ(Dockerfile)](https://github.com/kai-zoa/golang-debug-guest-app/blob/master/runner/Dockerfile)

２つのコンテナをdocker-composeで起動して確認します。

    # docker-compose.yml
    debugger:
      container_name: my_debugger
      build: debugger
      tty: true
      volumes:
        - ./bin:/go/bin
      links:
        - runner:runner
    runner:
      container_name: my_runner
      build: runner
      tty: true
      ports:
        - "9091:9091"
      volumes:
        - .:/go/src/github.com/kai-zoa/golang-debug-guest-app
        - ./bin:/go/bin
 
起動します。

    docker-compose build && docker-compose up -d

# gdbserverからGoのプログラムを実行

内容はこんな感じ、起動すると名前の入力を求めて、挨拶する単純なコード

    package main
    import (
      "os"
      "bufio"
      "fmt"
    )
    
    func main() {
      var s string
      scanner := bufio.NewScanner(os.Stdin)
      fmt.Print("Enter Name: ")
      for scanner.Scan() {
        s = scanner.Text()
        fmt.Printf("Hello %s!!\n", s)
        fmt.Print("Enter Name: ")
      }
      if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, err)
      }
    }
    
ビルドしてgdbserver上で実行。

    # デバッグビルド
    $ docker exec -it my_runner go install -gcflags "-N -l" github.com/kai-zoa/golang-debug-guest-app
    # gdbserverを立ち上げて起動
    $ docker exec -it my_runner gdbserver localhost:9091 golang-debug-guest-app
    Process golang-debug-guest-app created; pid = 24
    Listening on port 9091

これでデバッグ接続の待受が開始されます。

# 接続してリモートデバッグしてみる

リモートデバッグ用のコンテナからgdbを起動してプロンプトで```target remote runner:9091```して接続する

    $ docker exec -it my_debugger gdb golang-debug-guest-app
    GNU gdb (Debian 7.7.1+dfsg-5) 7.7.1
    Copyright (C) 2014 Free Software Foundation, Inc.
    ...
    ...
    (gdb) target remote runner:9091
    Remote debugging using runner:9091
    _rt0_amd64_linux () at /usr/local/go/src/runtime/rt0_linux_amd64.s:8
    8               LEAQ    8(SP), SI // argv
    (gdb) 

接続されたっぽい…
とりあえずソースコードが見れるか確認してみる。

    (gdb) l
    3       // license that can be found in the LICENSE file.
    4
    5       #include "textflag.h"
    6
    7       TEXT _rt0_amd64_linux(SB),NOSPLIT,$-8
    8               LEAQ    8(SP), SI // argv
    9               MOVQ    0(SP), DI // argc
    10              MOVQ    $main(SB), AX
    11              JMP     AX
    12

ファッ！？

なんかアセンブラのコードが見えますね。
直接、gdbからプログラムを動かしたときと大分勝手が違うようです。

諦めましょう…

# 本当にやりたかったこと

普段OSX上から開発用Dockerコンテナでgoのプログラムを動かしているので、ホストOS側からデバッグできないのかなと考えて試してみました。

良いデバッグの方法があったら誰か教えてください。

メリークリスマス！
ESP-WROOM-02 > 空きGPIOの整理 > 6ポート + TOUT / HSPI, I2C使用時は別途考慮

ESP-WROOM-02の実装後に空いているGPIOの整理

http://qiita.com/7of9/items/bc96d1cf17d4d87e1fcd

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d135964a-368a-ba31-43a3-649910a1f5b2.png)

- IO4
- IO5
- IO12
- IO13
- IO14
- IO16
- TOUT

上記のうち以下がHSPI, I2C接続を使う場合、空きではなくなる (ESP-WROOM-02 WiFi Moduleデータシートv0.4より).

- HSPI
  - IO12 (MISO)
  - IO13 (MOSI)
  - IO14 (CLK)
  - IO15 (CS)

- I2C
  - IO14 (SCL)
  - IO2 (SDA)

IO15とIO2はUART Download ModeとFlash Boot ModeでH/Lの設定が決まっているが、HSPIやI2Cで使う時はどうするのだろう、という疑問が出てきた。
iOS9のSpriteKit/SKShaderの不具合

iOS9 より、SpriteKit が Metal を使ってレンダリングされるようになりました。
その影響か、いくつかの不具合があるようです。

> 下記の内容は iOS9.1 で確認しています。

## フラグメントシェーダでエラーが出る

シェーダの言語仕様の違いか、下記のエラーが発生します。

```
error: use of undeclared identifier 'gl_FragCoord'
```

回避策は、後述の「OpenGL を使ってレンダリングを行う」しか無さそうです。

なお、関数の外に定数を定義すると、下記のエラーが発生します。

```
error: global variables must have a constant address space qualifier
```

こちらは、関数内に定数定義を移せば発生しなくなります。

## フラグメントシェーダの Uniform 変数 u_sprite_size が使えない

u_sprite_size が常に (0, 0) で来るため、使い物になりません。。。

対策としては、下記のように自力でスプライトのサイズを計算し、Uniform 変数として渡します。

```swift
let spriteSize = node.calculateAccumulatedFrame()
let uniformSpriteSize = SKUniform(name: "sprite_size", floatVector2: GLKVector2Make(Float(spriteSize.width), Float(spriteSize.height))
```

参考: http://stackoverflow.com/questions/31492404/spritekit-shader-crash-ios-9-skdefaultshading-gl-fragcoord

## SKEffectNode で CIGaussianBlur を使うと、スプライトの位置がずれることがある

SKEffectNode で CIGaussianBlur を使うと、inputRadius の値によって子ノードのスプライトの位置がずれることがあります。

こちらも後述の「OpenGL を使ってレンダリングを行う」で回避するか、CIBoxBlur など他のブラーで代用するしかなさそうです。

## Tips: iOS9/SpriteKit で OpenGL を使ってレンダリングを行う

リファレンスを読むと、SceneKit には OpenGL/Metal どちらでレンダリングを行うかを指定できるのですが、SpriteKit には見当たりません。
別の方法として、`Info.plist` に以下の設定を行うことで、OpenGL によるレンダリングに変更することができます。

```
PrefersOpenGL: YES
```

参考: https://developer.apple.com/library/ios/qa/qa1904/_index.html
buffer_queue_full_actionについて


fluentdのv0.12.19から，`buffer_queue_full_action`というパラメータを追加したので，その説明をします．

## 目的

fluentdのバッファはキューが全部埋まってデータをもう入れられない場合，Inputプラグイン側に`BufferQueueLimitError`を返します．これによって，`in_forward`であれば送信側にエラーを返せるなど，リトライ/フォールバックがやりやすくなってます．
その一方`in_tail`のような場合には，どうせキューが空かないと次のデータを読み込んでもまたエラーになるので，ブロックして待って欲しいこともあります．
ということで，この二つを選べるようにしました．

v0.14でプラグインやバッファ周りのAPI改善を考えており，そこでback-pressure相当の機能を考えています．もし入るのであれば上の機能はいらなくなる予定ですが，そもそも入るのか，入るとしてもどの段階で入るか，はまだ未定なので，暫定的に`buffer_queue_full_action`をサポートしたという流れです．

## 使い方

バッファ用の設定なので，BufferedOutput系のプラグインで指定することになります．

```aconf
buffer_queue_full_action exception # default
buffer_queue_full_action block # バッファのキューが空くまでInputがブロック
```

たとえば`in_tail`から`out_elasticsearch`に投げる場合などは，大抵Elasticsearch側が詰まってひたすらInput側にエラーが返ることになります．こういう場合には`block`が有効です．
一方，`in_forward`からの入力を受け付けるOutputでこれを使うと，`in_forward`から送信元の`out_forward`にレスポンスが返らなくなるので，`block`を使うべきではありません．
`block`はある意味最終手段とかミニバッチ用として，本当に使って良いか検討してから使ってください．

## 今後

重要ではないOutput向けにデータを捨てる`drop_last`もサポートしようかと思いましたが，あまり需要が無さそうだったので，今回は見送りました．何か問題がありましたら，issueにでも報告してもらえると助かります．
ESP-WROOM-02 > datasheet へのリンク

データシートのリンク

[ESP-WROOM-02 WiFi Module v0.4 @ 秋月電子](http://akizukidenshi.com/download/ds/espressifsystems/0C-ESP8266__WROOM_WiFi_Module_Datasheet__EN_v0.4.pdf)

[ESP8266EX Datasheet v4.3 @ switch-science](http://doc.switch-science.com/datasheets/0A-ESP8266__Datasheet__EN_v4.3.pdf)
Unity: Pass a value between scenes

# static modifier
As long as your script has a derived class of Monobehaviour and has a static variable in it and add the script to some component in a scene, you can share the value between scenes.

I thought it would be better to show the visual aid.
![static modifier explanation.png](https://qiita-image-store.s3.amazonaws.com/0/53282/9535ce2a-0bc8-d5ce-8696-c3ebd4527936.png)

As seen in the image, the "Score.cs" has a variable "score", which is 0. The value  could be shared between scenes. Obviously there are other ways to do the same thing, but I just thought my way is easy, and understandable for beginners just like me.
【VSTO】ファイルを開いたときのイベントを捕まえる

ファイルを開いたタイミングでデータを取得したいです。色々やってみると、WordとExcelで若干違うようです。ハマったのでメモ

###Wordの場合
Startupに開いた時の処理を書きます。
しかし、現在のファイルから別のファイルを開いた時に処理されませんので、
Openイベントにも書きます。

```csharp:ThisAddIn.cs
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            //起動時の処理を書きます～

            //現在のファイルから別のファイルを開いた時に動かすために書きます
            this.Application.DocumentOpen += Alication_Open;
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {

        }

        void Alication_Open(Word.Document Doc) {
           //起動時の処理を書きます～
        }
    }
```

###Excelの場合
Startupまたは、Openイベント時に書くとエラーになります。
Excelの場合はActiveの時に書きます。Windowを切り替えるたびに実行されると思いきや、そうではないみたいです。

```csharp:ThisAddIn.cs
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
     	{
	    //ファイルを開いた時しか通りません
            this.Application.WorkbookActivate += Application_Active;
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        void Application_Active(Excel.Workbook wb) {
 		//起動時の処理を書きます～
        }
    }
```

ちなみにWordでActiveのタイミングで処理を書くと、画面をクリックするたびに処理が流れてしまいます。

この微妙な仕様の違いが難しい・・・

また、その他のイベントについてはＭＳＤＮに詳しく書いてあります。
Word：https://msdn.microsoft.com/ja-jp/library/office/ff198329.aspx
Excel：https://msdn.microsoft.com/ja-jp/library/office/ff198091.aspx
ChatOpsのバッドノウハウ

これは[ChatOps Advent Calendar](http://qiita.com/advent-calendar/2015/chatops)の記事です。

昨日の記事は[__papix__](https://twitter.com/__papix__)さんの[小さい部品を組み合わせてChatOpsを作っていく話](http://papix.hatenablog.com/entry/2015/12/19/000000)でした。

# バッドノウハウ

どの記事も具体的な内容がTipsが並んでおり、個人的に非常に楽しんで読んでいます。
自分は少し趣向を変えて、ChatOpsを進めつつ**失敗した失敗した失敗した失敗ｓ(ry**となった事を書きたいと思います。

## その1: 通知部屋：そして誰も見なくなった・・・

GitHubのIssuesやPRの更新をチャットに流して、検知を早くしようと思いました。
その時に普段チームで話す部屋以外の「通知部屋」を作ったのですが、これが失敗・・・(；´Д｀)

1. 興味のある人しか入室しない
2. 始めた当初は物珍しいが段々と慣れる
3. 流れる情報が通知だけとわかっていると見ない
4. 新メンバーに対して「チームのチャットルーム」は案内しても「通知用チャットルーム」を案内するかは・・・時と場合と人による

まぁ**通知しか流れない部屋とか見ないですよね**
今はチームのチャットルームに流しています。

今度は通知多すぎ問題が発生していたりしますが、
「通知便利だけど邪魔じゃね。何とかしよ」という話題も出ているので健全な範疇かなと思ってます。


## その2: 周知不足：( ﾟдﾟ)ﾎﾟｶｰﾝ

システムのアラートを流したのです。チャットに。

思惑：ふっふーん。これでみんなでエラーを共有して、対応が早くなるぞー

ここで、**「みんなきっとエラーってわかるから、特に説明しないでいいよね」**
ってやったのが失敗。みんな、済まぬ

突然見知らぬ機械的なメッセージが届いてもノイズとして処理されてしまうようで、
大して効果がありませんでした。生ログだと長いこともあり、逆にうざい邪魔と言われてしまう始末。

そういえば、自分も長文のメールとか読む気が失せるなー・・・。

ChatOpsに限らずですが、**導入の意図と「試しにやってみるからうざかったら言って下さい。見直すので」という事前のシェア**は必要だと思います。特にチャットはコミュニケーション上大事なので荒らすのは良くない。

## その3: 企画倒れ：壮大に何も始まらない

世の中には素敵な事例が溢れています。

* Botがリリースしてくれる
* Botが売上レポート出してくれる
* Botが面白いこと言ってくれる

見てると楽しそうなのでやる気になります。よーしやるぞー((o(´∀｀)o))ﾜｸﾜｸ

Hubotベースで、チャットから対話的に色々、うーん、上手く動かないな、おっと、案件の締め切りが、また時間があるときにやるか（終了）

あれ・・・**結局何もできてない**

それこそ最初に紹介したIssuesやPRの通知から始めるだけでもかなり効果はあると思います。
しかし、**何となくBotとおしゃべりしたくなる**ので、手間をかけてしまって結局何もできないということが何度かありました。

また、冷静に考えてみると、頑張って完成させたとしてもそれがチームで受け入れられるかは別なので
**最初は気張らずにゆるふわで小さく小さく始める**のが良いなーと思っています。

**便利だと互いにPR送り合うので勝手に育つ**し。

# まとめ

* 通知専用部屋は危険。
* やる事の意図はちゃんと周知。コミュニケーションの場を（結果的に）荒らすのはだめ、ぜったい。
* ChatOps＠がんばらない。ゆるふわでいい

きっと、他にも沢山バッドノウハウあるはず。持っている方、是非教えて下さい。

# 宣伝
最後に宣伝をさせて下さい。先日発売された[Software Designの2016年1月号](http://gihyo.jp/magazine/SD/archive/2016/201601)の第1特集｢はじまっています。ChatOps｣にて、ヤフーの事例を紹介しました。

```
昨日の__papix___さんも書かれてとのこと。世間は狭い。。
```

自分は、主に序盤から事例その1までを担当しました。
ヤフー内製の独自チャットツールMYMの紹介から具体的な事例、
ここでまとめたバッドノウハウにも少し触れているので是非お手にとって見て下さい(๑•̀ㅂ•́)و✧
なぜ◯◯なあなたが今すぐCloudera Managerを使い始めるべきなのか

[Cloudera Manager Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cm)の21日目です。

---
Cloudera Manager が大変素晴らしい Hadoop 運用管理ソフトウェアであることは言うまでもないことだが、世の中にはまだまだこのソフトウェアの存在を知らずに苦労されている方が多いように思う。
本記事では、様々なタイプ別に、どのような人が Cloudera Manager を使うべきなのかについて紹介していきたい。


# はじめに

この記事はCloudera社員によって作成された記事です。

# データ解析をメインに行いたい。構築・運用に手間をかけたくない


データサイエンティストであれば、当然データの解析そのものに集中したいはずだ。
構築、運用はなるべく楽に済ませたい。
社内にHadoop担当のインフラエンジニアがいればいいが、小規模なチームであればそうもいかない。
しかし、Hadoop単体の構築・運用は難しく、データサイエンティストと言いながらその時間のほとんどをクラスタの運用に費やしてしまうというのはよく聞く話である。


Cloudera Manager なら、構築もあっという間に終わり、運用もとても楽である。
こちらの[日本語の説明つきインストール動画](https://www.youtube.com/watch?v=8aaf-C-LPkI)を見れば、どれほど簡単にインストールできるか理解できるだろう。
この動画で用いているClouderaはC4.5系と少々古いが、最新のC5.5とほとんど変わらない。


# 開発をメインに行いたい。構築・運用に手間をかけたくない

ビッグデータアプリケーションの開発者も、データサイエンティスト同様、構築や運用にはなるべく時間を使いたくないだろう。
障害解析となると、さらに大変な思いをすることになる。
アプリケーションのバグなのか、基盤側の障害なのかを切り分けるのも一苦労だ。
分散システムというのはとにかく障害解析が難しい。ネットワーク遅延などの問題は障害の再現性を困難にするし、各サーバのログを一つ一つ読むのも多大な労力を要する。

Cloudera Manager なら、障害解析もとても簡単である。[クラスタ横断のログ検索](http://qiita.com/d1ce_/items/f8e171ed8e63f441b29d)もできるし、SQL接続するアプリケーションを開発している場合は[Impalaのクエリ検索](http://qiita.com/yushin/items/39de23dd92509fa77c5b)なども簡単だ。
[Cloudera Managerを使ったトラブルシューティングのスライド](http://www.slideshare.net/Cloudera_jp/troubleshooting-using-cloudera-manager-cwt2015)や、[その補足記事](http://qiita.com/d1ce_/items/9dd13a71f574ad1000af)などにも目を通すといいだろう。


# Hadoopの運用について勉強したいので管理ツールなしで手作業で構築・運用したい

運用管理ツールを使うと、内部動作について不明な点が多くなるため、ツールなしで運用をしたいという人もいることだろう。
そういう人にこそ、是非Cloudera Managerを使ってほしい。

[Cloudera Managerでは全ての操作について、Linuxコマンドレベルでの実行ログを閲覧することができる。](http://qiita.com/shiumachi/items/150f2377efe9a570cdab)
これにより、Cloudera Managerなしでの操作を正しく追いかけることができる。

利点はそれだけではない。Cloudera Managerを使えば運用時の正しい手順を学ぶことができる。
Hadoopクラスタは起動・停止一つとってもかなりのステップの作業が必要となり、しかも手順を間違えると障害発生に至ってしまうようなケースもある。
HDFSだけ、Hiveだけといったような個々のコンポーネントのみの運用手順であればともかく、多数のコンポーネントを複雑に組み合わせたクラスタの正しい運用手順を示すようなドキュメントは存在しない。
しかし、Cloudera Manager なら構成や設定から正しい手順を自動的に実行していくことになる。
これにより、運用における正しい方法を効率よく学ぶことができるようになるのだ。


# CDH単体で運用してるけど辛い

「昔CDHだけで構築して3-4年運用しているだけどもう辛いです」という悲鳴はあちこちで聞く。
安心してほしい。Cloudera ManagerならCDH単体での運用からCloudera Manager管理下に移行できるのだ。
詳しくは[こちらの記事](http://qiita.com/s_wool/items/4fa7932dda7e3f473815)を参考にしてほしい。


# まとめ

本記事では、様々な課題を抱えている人にとってCloudera Managerが最適な運用管理ソフトであることを紹介した。
もし本記事で挙げたようなケースに当てはまる人は、今すぐ使い始めてみよう。
OS X 10.11/El CapitanでAdobe Illustrator CS6を最新Java SE 8で動かす

2017年9月24日現在、macOS 10.13 (High Sierra) GM (Golden Master) において、本件を確認 :D 

---

この文章は、Adobe Illustrator CS6 起動時に要求される Java 6 SE ランタイムをインストールせずに、最新版 Java SE 8 で Illustrator CS6 を起動させる方法をまとめました。このタイトルには、「OS X 10.11/El Capitan で」が入っていますが、El Capitan で変更があった System Integrity Protection（SIP）を除けば、CS6 が動作する OS X 10.8 (Mountain Lion)からmacOS 10.13 (High Sierra)でも通用します。

# El Capitan でIllustrator CS6を起動したら、Java 6 SEランタイムを要求された＞＜

先日、OS X Yosemite 10.10.5からOS X El Capitan 10.11.2へアップグレードしたところ、Adobe Illustrator CS6 の起動時に Java SE 6 ランタイムを要求してきた。

<img width="532" alt="needJava.png" src="https://qiita-image-store.s3.amazonaws.com/0/43618/931d2b35-9457-b895-4b65-3fb642dd2b1a.png">

手元の El Capitan 上には、Java SE 8 をすでに入れており、今さら、Apple の legacy [Java for OS X 2015-001](https://support.apple.com/kb/DL1572?locale=ja_JP) を入れたくなかった。そこで、Illustrator CS6 の起動時の挙動とグーグル先生からの回答を合わせると、どうやら以下の2つの空ディレクトリを作れば十分であることが分かった[^EclipsJavaSE6][^2]。

```bash
$ sudo mkdir -p /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
$ sudo mkdir -p /System/Library/Java/Support/Deploy.bundle
```

[^EclipsJavaSE6]: [Eclipse Kepler for OS X Mavericks request Java SE 6 - stack overflow](http://stackoverflow.com/questions/19563766/eclipse-kepler-for-os-x-mavericks-request-java-se-6/)

[^2]: [Java SE 8 on Mac OS X - Oliver Downling](https://oliverdowling.com.au/2014/03/28/java-se-8-on-mac-os-x/)

ちなみに、Adobe公式のこのヘルプ[Illustrator Help / 
起動時に強制終了するかまたは Java 6 のインストールを要求される（Mac OS X 10.8 | llustrator CS6）](https://helpx.adobe.com/jp/illustrator/kb/cq07170220.html) では、あくまでも Apple の legacy Java for OS X を入れるように勧めている。

# El Capitan 以降で /System 以下に書き込めない＞＜

はいはい、OS X 10.11/El Capitan で変更があった例の System Integrity Protection （SIP）ですよねー♪
それゆえ、以下の一連の手順を実行することで、無事に目的に達した[^El_Capitan_and_Homebrew]！

 1. リカバリーモード（⌘ キーと R キーを押しながら起動）で起動し、ターミナルを立ち上げる。
 2. ターミナルで `# csrutil disable` を実行する[^TryMkdirTwoJavaDirs]。
 3. リブート `# reboot` して、OS X El Capitan を標準起動する。
 4. ターミナルを立ち上げて、前述の2つの空ディレクトリを作成する。
 5. 再び、リカバリーモードで起動し、ターミナルを立ち上げる。
 6. ターミナルで `# csrutil enable` を実行する。
 7. リブート `# reboot` して、OS X El Capitan を標準起動すると、Illustrator CS6 が最新 Java 8で立ち上がる。

[^El_Capitan_and_Homebrew]: [El_Capitan_and_Homebrew](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/El_Capitan_and_Homebrew.md#if-usrlocal-does-not-exist)
[^TryMkdirTwoJavaDirs]: SIPが有効（`$ csrutil status`）であるときに、リカバリモードで書き込めないのが当たり前だと思っていて、実際に友人は、SIP有効のときに例の2つのディレクトリを書き込めなかったと教えてくれました。SIP有無に依らず、リカバリモードでマウントされている `/Volumes/Macintosh HD/` に潜って、直接例の2つのディレクトリを書き込む試行をやってみてもよいかもしれない。
ABテストで使える！？仮想ページビューとは

#仮想ページビュー（Virtual Page View）とは？
LPO（ABテスト）を行う場合に、Googleアナリティクスで表示するページ名をパターン毎に分けたいケースがある。
例えば、●●●ドットコム（Aパターン）や××ジェイピー（メイン画像変更）など。
**SEO上の問題から&lt;title&gt;タグを変更することは避けたい…**、こういった場合に使えるのが**「仮想ページビュー」**である。

#どうやるか

通常のユニバーサルアナリティクスのコード箇所を…

```html
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-XXXXXXXX-X', 'auto');
  ga('send', 'pageview');

</script>

```
このように修正します。

```html
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-XXXXXXXX-X', 'auto');
  ga('send', 'pageview', {
  'page' : '/pattern_b.html',
  'title' : 'パターンB'
  });

</script>
```

##ページ名の表示が変更された
![ページ.png](https://qiita-image-store.s3.amazonaws.com/0/95865/963555ed-3d7c-5286-8418-99147448bf52.png)

##ページタイトルが変更された
![タイトル.png](https://qiita-image-store.s3.amazonaws.com/0/95865/791de13a-8ead-b2a4-4b1e-774603bd25ea.png)

下記は変更したい方のみの記述でも良い。
'page' : '/pattern_b.html'
'title' : パターンB'

#ABテスト以外の利用ケース
例えば、利用しているシステムの兼ね合いで、下記のようにフォームのURLが明示的に変わらない場合などにも利用できます（HTMLの編集は可能な環境であると仮定します）。
（入力）http://www.example.jp/form/
（確認）http://www.example.jp/form/
（完了）http://www.example.jp/form/

```js:入力
ga('send', 'pageview', '/form/input');
```
```js:入力エラー
ga('send', 'pageview', '/form/error');
```
```js:確認
ga('send', 'pageview', '/form/confirm');
```
```js:完了
ga('send', 'pageview', '/form/thanks');
```

Googleタグマネージャーで同様のことを行う場合は、下記が参考になるでしょう。

[URLが変わらないフォームをGoogleタグマネージャを使って正しく計測する設定 | Webコンサルティング/Webマーケティングのパワー・インタラクティブ]
(http://www.powerweb.co.jp/column/gtm-ua-virtualPV.html)

#【PR】経由媒体ごとにABテストが出来る！「Smile LPO」
弊社：アンダス株式会社のサービス「Smile LPO」では、ページでのABテストのみならず、デザインパーツ単位でのテストも出来ちゃいます！詳細はコチラ！

[SmileLPO スマイルLPO | Smile Tools スマイルツールズ]
(http://smiletools.jp/slpo.html)
Cloudera Managerによる操作ログをLinuxコマンドレベルで閲覧する

[Cloudera Manager Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cm)の20日目です。

----

「Cloudera Manager を使うと便利だけど、裏で何をやっているのかよくわからない」という意見を聞くことがある。
安心してほしい。Cloudera Manager は、CDHに対するあらゆる操作をLinuxのコマンドレベルで表示することができる。

Cloudera Manager と CDH は疎結合になっていて、CDH自体への操作はほとんどがシェルスクリプトなどによるコマンド実行で行われている。
よって、それらの操作を外部から閲覧することは非常に容易であり、またその操作を手動で再現することも可能である(普通このようなことを行う必要はないが)。


# 環境

- Cloudera Manager 5.5


# 本編

Cloudera Manager のホーム画面に `全ての最近のコマンド` というタブがある。これをクリックすると、最近実行したコマンド一覧を表示することができる。
ここでいうコマンドは Linux 上のコマンドではなく、あくまで Cloudera Manager 上での操作単位( *起動*、*停止*など)であることに注意してほしい。

![cm-command-01-home.png](https://qiita-image-store.s3.amazonaws.com/0/17749/5aa6202a-87c4-b25c-3ce8-9a7bf2846d09.png)


## すべての最近のコマンド

すべての最近のコマンドのページには、文字通り最近実行されたコマンドがリスト表示されている。ここを閲覧すれば、「◯月×日△時にサービスを再起動した」などの作業記録を正確にたどることができる。

このページで表示されているコマンドは、更にいくつかのサブコマンドに分かれている。それぞれのコマンドのリンクをクリックすると、コマンドの詳細ページに移動することができる。
ここでは例として、 *IMPALA-2* というサービスの *再起動* コマンドの詳細を調べることにする。

![cm-command-02-command-list.png](https://qiita-image-store.s3.amazonaws.com/0/17749/4b7303bc-2b0e-0570-728e-ad5da002ce57.png)


## コマンド詳細ページ

Impalaの再起動コマンドの詳細はとてもシンプルで、 *停止*・*開始*の2つのコマンドから構成されている。

これらのコマンドもさらにドリルダウンすることができる。
ここでは例として、*開始*コマンドを展開してみる。

![cm-command-03-command-impala.png](https://qiita-image-store.s3.amazonaws.com/0/17749/2ceb9b15-8f29-594d-9164-15d8b821ed3b.png)

*開始*コマンドの中には、*IMPALA-2*サービスに属する各種ロールの*開始*コマンドが内包されている。
もちろん、これらのロール別の*開始*コマンドについても詳細を閲覧することが可能である。
ここでは*nightly55-6*というサーバの*Impala Daemon*ロールの詳細を見てみよう。

![cm-command-04-command-impala-start-expand.png](https://qiita-image-store.s3.amazonaws.com/0/17749/8327c879-d31d-7b76-190c-5954b228751b.png)


## コマンドの実行ログ

*Impala Daemon*の*開始*コマンドを見ると、*stdout*・*stderr*・*Role log*の3つのログを閲覧することができる。

![cm-command-05-command-impala-start-role.png](https://qiita-image-store.s3.amazonaws.com/0/17749/8d96737f-01a1-3efa-2275-78ac8cdfda80.png)

それぞれ以下のような内容が書かれている。

- stdout: コマンドを実行したシェルスクリプト自体の標準出力。
- stderr: コマンドを実行したシェルスクリプトの実行内容そのものの出力。
- Role log: 対象ロール自体の持つログファイル。この例では Impala Daemon が生成するログファイルのこと。

上記のスクリーンショットは *stdout* が表示されているが、 *stderr*、*Role log* タブをクリックするとそれぞれの直近数行のログを表示する。

まずは *stderr* のログである。

![cm-command-07-command-impala-start-role-stderr.png](https://qiita-image-store.s3.amazonaws.com/0/17749/bdad3969-e5f2-0b8e-c064-59707c8c2bc3.png)

こちらは *Role log* の結果である。

![cm-command-08-command-impala-start-role-log.png](https://qiita-image-store.s3.amazonaws.com/0/17749/d2141be7-6f21-cbdc-7bff-5d766a090d74.png)


この Cloudera Manager のページ上にはあくまで直近一部のログしか表示していない。
(画面を表示している間は、新しいログが生成され次第随時アップデートされ、新しいログに置き換わっていく)
ログを全て閲覧したいのであれば、 *完全なログファイル* をクリックすればいい。

例えば *Role log* の *完全なログファイル* をクリックすると、ログ閲覧のページに遷移する。

![cm-command-09-command-impala-log-page.png](https://qiita-image-store.s3.amazonaws.com/0/17749/a3a3417e-20c5-7fe8-d732-485cfda1a103.png)


# まとめ

Cloudera Manager から実行したコマンドについて、履歴の閲覧とLinuxコマンドレベルでの詳細な実行結果についての閲覧が可能なことが分かった。
Linux ディストリビューション上での調査が必要な場合はもちろんのこと、Hadoopの運用などについてコマンドレベルで学びたい場合にも大いに役に立つことだろう。
borg sensor system1 > 開始

ESP-8266(ESP-WROOM-02)を使った何かを作ろうと考えて以下の考えに至った。

![DSC_0037.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/64945ca1-9ede-5578-ec5f-d1bedee1e8d0.jpeg)

このプロジェクトの主要目的

- 関連技術の整理 (borgSensorSystem1タグで整理)

今後の空き時間の２割をこのプロジェクトに割り当てる予定。残りはほとんどがZynq関連。

ある程度形になるのは１年後くらいだろうと思われる。
BeginnerShieldの紹介

# 概要
この記事はArduino Advent Calendar 2015 21日めの記事です。
遅くなって申し訳ありません。

今回は自作シールドについて紹介したいと思います。

# BeginnerShield
## どんなシールドか
BeginnerShieldはその名の通り、初心者が使うシールドです。
Arduino(組み込み)を初めて勉強しようとしている人の敷居を下げるために作成しました。
![beginnershield.jpg](https://qiita-image-store.s3.amazonaws.com/0/11010/25e2d97f-28ff-bf4a-0964-77f052e7afc6.jpeg)

初心者が勉強しようとするとき、ブレッドボードや各種素子を用意しなければならずソフトウェアとハードウェアを両方扱うので大変です。
なのでまずはソフトウェアの学習に専念できるように、よく使用する素子などを搭載してオールインワンで学習できる環境をものを作成しました。
より詳しくはGitHubに書いていますのでよければそちらも見て下さい。

[Beginner Shield](https://github.com/ligun/BeginnerShield)

## 搭載機能
次のような素子を搭載しています。

* LED
    * R,G,B各一色
    * フルカラーLED
    * 7セグメントLED
* タクトスイッチ
* 可変抵抗
* 温度センサー
* 圧電スピーカー

## 学習環境
BeginnerShieldを作成するにあたって、基板だけではなく学習環境自体を整備したいと考えGitHub上に情報を公開しました。

GitHubのサンプルページに各素子の使い方を説明しながらサンプルプログラムを載せています。
まだ3つしかないですが、随時執筆していく予定です。

## 反省点
今回はじめてまともな回路を作成するにあたり、回路はまじめに作ってきたつもりです。(配線は自動ですが…)
しかし、ちょっと冗長にしすぎたようで次のミスが有りました。
スイッチ回路を丁寧にチャタリング防止回路を含めていたのですが、AVRの仕様を調べたところ入力ポートはすべてシュミットトリガになっているので7414は入りませんでした。PICマイコンの頃の感覚でやっていたのでちょっと無駄になってしまいました。(更に言うと内臓プルアップあるのでキャパシタだけでも良かった気が…)

## シールド作成
このシールを作成するにあたりPCB CADソフトとしてEagleを使用しました。
今回が初めての基板作成だったので本屋で「プリント基板CAD Eagleでボード作り」という本を購入して読みながら作成しました。
今までユニバーサル基板でしかやって来ませんでしたがなんとかなるものですね。
幾つかミスはあったものも動作には問題ないものでした。
![schematic.png](https://qiita-image-store.s3.amazonaws.com/0/11010/687c42b6-41a8-2566-c598-cb592c5dd9f6.png)
基盤の配線は面倒だったので全部自動配線ですましたせいでちょっとイケてないです。

基板を作成したあと、発注はメジャーなところでFusionPCBにお願いしました。
これは中国のSeedStudioが提供しているサービスでなんといっても安さが魅力です。
基板10枚で送料込み30ドル未満です。

ちょうど去年の今頃最初の試作版を発注しました。
発注から到着までだいたい20日程度かかったと思います。
実装して動作チェックを行ったあとは数枚友人に上げました。

そして今年9月に山口県でYamaguchi Mini Maker Faire(YMMF)が行われたのですがそれに合わせて少し修正したRev1.1を作成しました。
今回は赤色基板にしたかったので、カラー基板の追加料金の掛からない[Elecrow](http://www.elecrow.com/10pcs-2-layer-pcb-p-1175.html)というサービスを利用しました。FusionPCBとほとんど値段は変わりません。
発注がぎりぎりになったのでFedExで送ってもらったので追加で20ドルほど払いました。

![IMG_20150917_232030.jpg](https://qiita-image-store.s3.amazonaws.com/0/11010/45267441-d18c-de32-e62f-5008bd4634ac.jpeg)

ちょっとこだわって裏面をにわかお面にしました。(それで赤色基板にしたかった)
YMMFではこの基板の展示と、最初の緑バージョンの基板あまりの無料頒布を行いました。
その時に渡した方のお一人がきちんと実装されたようでYouTubeに動画を載せてくれていました。

[動画](https://www.youtube.com/watch?v=ULQ5fZGaDQ4)

こうやって自分の作ったものが使われているのを見ると嬉しいですね。

## その後
こんな感じで基板を作りながら資料の拡充を目指しています。
最近は少し仕事が忙しく作業できずにいますが年が明けたらまた頑張りたいと思います。

そして、今回第3弾の発注を行います。(Rev1.2)
シルク印刷やボリュームの向き等がおかしかったので少し修正しています。
また配線ももう少しこだわって裏面グランドベタくらいはやりたいなと思っています。

そして今回は正式に基板を有料頒布したいと思っています。
来年1月の23日、24日に福岡で「[つくると！](http://tsukuruto.net)」というイベントが行われます。
そこで出展するのでその時に頒布予定です。
初心者むけということもあってあまり高くはしたくないので実装済みのもので1500円、組み立てキットが1200円くらいで販売できたらいいなと思っています。(まだ未定です)

# 最後に
まとまっていない文章を最後まで読んでいただきありがとうございます。
本当は休みのうちに文章を練って投稿しようと考えていたのですが忙しくて作業できずに当日になってしまいました。
ちょっと余裕ができたらおかしな所を修正いたします。

今回はじめてシールドを作成してみて、意外と簡単にできたのでみなさんも思いついたものは気軽に作ってみてください。
brew search して GitHub API rate limit で怒られたときの対処方法


brew search を何度も実行していると、以下のように怒られるときがあります。

```
$ brew search apache
apache-activemq                       apache-fop                            apache-spark                          homebrew/versions/apache-spark131
apache-archiva                        apache-forrest                        apachetop                             homebrew/versions/apache-spark141
apache-drill                          apache-opennlp                        homebrew/versions/apache-spark121
Error: GitHub API rate limit exceeded for xxx.xxx.xxx.xxx. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)
Try again in 28 minutes 13 seconds, or create a personal access token:
  https://github.com/settings/tokens/new?scopes=&description=Homebrew
and then set the token as: HOMEBREW_GITHUB_API_TOKEN
```

GitHub API へのアクセス数がリミットを超えたときにこのエラーが出るようです。

回避するには、エラーメッセージにある通り、自分の GitHub アカウントでアクセストークンを作ります。

https://github.com/settings/tokens/new?scopes=&description=Homebrew へアクセスして、ログインします。

そのまま、何もチェックせずに Generate Token ボタンを押してトークンを作成します。

作成したトークン（文字列）をコピーし、自環境にて環境変数を設定します。.bashrc とかに書いてあげるとよいでしょう。

```.bashrc
export HOMEBREW_GITHUB_API_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxx
```

再度 brew search を実行して、エラーで怒られなければ設定は成功です。

Homebrew 公式の説明はこちら:
https://github.com/Homebrew/homebrew/blob/d28a4ba62d17914982ae86ebef1e021cc242eb36/Library/Homebrew/manpages/brew.1.md
ベストな気がするGIFアニ作成方法

独身、妙齢、デザイナー(女)です。
今日は非デザイナーの方向けに何か生活の役に立つことを書こうと思います。
でもごめんなさい、ここから先はphotoshopをインストールしていないと何の意味の持たない言葉の羅列となるため、
お持ちで無い方はphotoshop体験版をインストールしてからもう一度遊びに来てくれると幸いです…。

早速今日のテーマなのですが、アプリじゃ作れない凝ったGIFアニの作り方についてお話ししようと思います。
昔はGIFアニなんか作ってもエロい系バナーとかしか活かす道がなかったですが今やtwitterやインスタでも投稿できますし、
イベントのWEBフライヤー等でもGIFアニを使ったものが増えているのす。

他の奴らと差をつけるぞと勇んでGIFアニを作り出すとコマ数が20とか30とかになってしまうことがあります。
GIFアニなのに、レイヤーがめちゃくちゃカオス状態になりデータが重くなったりしがち。あまりの負荷に次に開いたらぶっ壊れてたりとか。。
そんな問題を解決するために今私がベストだと思っているGIFアニメ制作方法、「レイヤーカンプ＆タイムラインでレイヤーすっきりGIFアニメ」方法を伝授したいと思います。ググったけど出てこなかったので！初耳だと嬉しいです。

今回はこんな4コマの短いGIFアニを作ってみます。
![01setumei.png](https://qiita-image-store.s3.amazonaws.com/0/105994/3ccbd776-d52b-bc2a-dccf-9241cf61f9a1.png)



モノクロのビル街→流れ星が走ったら→光って→綺麗

まず背景画像や流れ星の素材などを作ってざっくりレイヤー分けします。
背景を一番下に、その上に星・光・など登場する順にのせていってください。
![02setunmei.png](https://qiita-image-store.s3.amazonaws.com/0/105994/d02fd08d-8134-eb40-0e4c-0006faf53840.png)

ここでウィンドウ＞レイヤーカンプを登場させてください。
レイヤーカンプとは…photoshopヘルプによると…
-------------------------------------------------------------------------------
レイヤーカンプを使用すると、1 つの Photoshop ファイルで、複数のレイアウトバリエーションを作成、管理および表示することができます。

レイヤーカンプとは、レイヤーパネルの各レイヤーの状態を記録したスナップショットのことです。レイヤーカンプには、次の 3 種類のオプションが記録されます。

・レイヤーパネル内のレイヤーの表示と非表示

・ドキュメント内のレイヤーの位置

・レイヤースタイルや描画モードの適用によるレイヤーの外観

だそうです。

オブジェクトの位置を移動させたり非表示にしたりして記憶させることができるので、たとえば流れ星の場合…
![04setsumei.png](https://qiita-image-store.s3.amazonaws.com/0/105994/bceb4701-2ac8-f1a7-d374-1811401a1c4a.png)


位置をそれそれ記憶させることで簡単にパラパラ漫画みたいな動を確認できるうえ細かい修正にも対応でき非常に便利なんです。

※レイヤーカンプ・レイヤー・タイムライン全て新規作成する時は
![5.png](https://qiita-image-store.s3.amazonaws.com/0/105994/280f3852-cc07-9c8d-ba6a-e1a9ac5517fb.png)
こいつをクリックです！ドラッグ＆ドロップで複製もできます。

レイヤーカンプですべての静止画を記録させたら…
次は表示時間を決めます。使うのは
ウィンドウ＞タイムライン

※この時タイムライン左下でサムネマークを選択してください。
![samu.png](https://qiita-image-store.s3.amazonaws.com/0/105994/8fe703e8-38f4-56b3-b8fc-d897ff98d4ad.png)


こちらでレイヤーカンプを使って作った静止画を表示させる時間を設定。
レイヤーカンプと連動させた名前を付けておくと分かり易いです。
![04setsumei.png](https://qiita-image-store.s3.amazonaws.com/0/105994/82ae4941-1f05-ab68-ef8b-617c4626b74f.png)

※タイムラインは１回・３回・無限と選べます、一般的にネットに投稿されてるものなどは「無限」です。タイムラインの左下で設定をしてください。
![名称未設定-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/105994/f621eaea-5441-1fc2-ec1d-1749ac11dd66.jpeg)



web用保存でGIFに書きだしたらこんな感じに動きます。
![kantangifani.gif](https://qiita-image-store.s3.amazonaws.com/0/105994/0aa16835-3efa-71a0-2dfd-80302c9af571.gif)



素材を作成・静止画を作成・表示時間を設定



というシンプルな3工程で結構コマ数の多いGIFアニメも簡単に作成でき、修正も簡単です。
フォトショお持ちの皆さま、ぜひお試しあれ！
NSURLRequestにいろんな情報を付加しとくと色々と捗るぞ

ネットワーク通信をした後様々なことをすると思います。
例えばダウンロードした情報をディスクに保存したり、アップロードした一時ファイルを削除したりなどです。

この時、そのネットワークリクエストにどのファイルが紐付いているのかなど、その辺の情報を管理する必要があります。
NSURLSessionではblockベースの処理が追加され、かなり楽になりましたが、backgroundSessionなど一部の処理では許可されておらず、delegateベースの処理が必要になってきます。その時のこれらの処理はとってもめんどくさかったりします。
そこでNSURLProtocolのpropertyForKey, setPropertyクラスメソッドが役に立ちます。

使い方としては黒魔術のAssociated Objectに似ています。これはNSURLRequest限定のAssociated Objectのようなものです。
例えばNSURLRequestにnameプロパティを追加してみます。extensionを使うと次のようになります。

```swift
private let nameKey = "name"

extension NSURLRequest {
    var name: String? {
        return NSURLProtocol.propertyForKey(nameKey, inRequest: self) as? String
    }
}

extension NSMutableURLRequest {
    override var name: String? {
        get {
            return super.name
        }
        set {
            if let newValue = newValue {
                NSURLProtocol.setProperty(newValue, forKey: nameKey, inRequest: self)
            }
            else {
                NSURLProtocol.removePropertyForKey(nameKey, inRequest: self)
            }
        }
    }
}


```

値の取得にはNSURLProtocol.propertyForKeyクラスメソッドを使います。取得はNSURLRequestに対して行います。
値の付与・削除はNSURLProtocol.setProerty, removePropertyForKeyクラスメソッドを用います。名前がバラついてしまっているのはObjCの名残ですね。
これらはRequestの変更なのでNSMutableURLRequestに対してのみ行えます。

これでRequestからnameを設定・取得ができるようになりました。

設定できるものはAnyObjectなので、なんでも付与できるようです。
ViewControllerのインスタンスもセットすることができました。

このsetPropertyが特にすごいところはプロセスを超えて値を保持できることです。
NSURLSessionのbackgroundSessionでのタスクが完了した時や、Share Extensionからの送信失敗がフォールバックされた時も、付与されたStringやNSDataなどの値は復元されます。おそらくNSDictionaryでシリアライズできるものは復元されると思います。

したがって、Share Extensionで送信が完了した後、送信した一時ファイルを削除したいなどといった時に、RequestにfileURLなどを付与してあげれば、送信失敗後不要になったファイルを削除するといったことができます。


このようにNSURLRequestにNSURLProtocol.setPropertyで値を付与すると、ネットワーク周りの処理が捗ると思うので、使ってみてもいいですね。
Hashを回してHashを返す処理の比較


group_byメソッドを使用した時、返り値のHashを処理してHashで返す処理を行いたいケースがあった。
その処理方法を「each」「map」「reduce」「each_with_object」で比較。

### 前提

```
users = [
  {id: 1, name: 'suna', group: 1, score: 100},
  {id: 2, name: 'kawa', group: 1, score: 10},
  {id: 3, name: 'kazu', group: 2, score: 10},
  {id: 4, name: 'ya', group: 2, score: 30}
]

grouped_users = users.group_by {|item|
  item[:group]
}
```


### each

```
each_result = {}
grouped_users.each do |k, v|
  each_result[k] = []
  each_result[k] = v.max_by {|item| item[:score]}
end
```
最初に変数宣言しないといけない。

### each&tap

```
tap_each_result = {}.tap {|item|
  grouped_users.each do |k, v|
    item[k] = []
    item[k] = v.max_by {|item| item[:score]}
  end
}
```
1つ前の処理の初期化処理を無くすためにtapを使ったパターン

### map

```
map_result = grouped_users.map do |(k, v)|
  [k, v.max_by {|users| users[:score]}]
end.to_h
```
返り値がArrayであるため、to_hメソッドなどでHashにしなければならない。

### reduce

```
reduce_result = \
  grouped_users.reduce({}) do |result, (k, v)|
    result[k] = v.max_by {|users| users[:score]}
    result
  end
```
returnを書かないと結果が返らない。

### tap&reduce

```
reduce_tap_result = \
  grouped_users.reduce({}) do |result, (k, v)|
    result.tap {|result| result[k] = v.max_by {|users| users[:score]} }
  end
```
tapでreturn処理を消しているが、その分ブロックは増える。


### each_with_object

```
each_with_object_result = \
  grouped_users.each_with_object({}) do |(k, v), h|
    h[k] = v.max_by {|user| user[:score]}
  end
```
Hashで返す。ブロック1つで済む。シンプル。
(だが、メソッドとその引数宣言などが長い & reduceと比較して、パイプの中の変数宣言が順番が異なるのが気になる)



### テスト
```
p    each_with_object_result == each_result \
  && each_with_object_result == tap_each_result \
  && each_with_object_result == map_result \
  && each_with_object_result == reduce_tap_result \
  && each_with_object_result == reduce_tap_result \
# true
```


### 追記(2015/12/24)
Structでラップする方法を教えてもらったので追加。
ユーザー情報を構造体として扱うのなら、Structのメソッドで扱いやすくなるので良さげ。

```
user = Struct.new("User", :id, :name, :group, :score)

users = [
  user.new(1, 'suna', 1, 100),
  user.new(1, 'kawa', 1, 10),
  user.new(1, 'kazu', 2, 10),
  user.new(1, 'ya', 2, 30)
]

Hash[*users
  .group_by(&:group)
  .map { |k, v| [k, v.max_by(&:score)] }
  .tap {|item| p item}
  .flatten]
```
hamlでアスキーアート

## 問題点

hamlでアスキーアート的なものを貼ろうとすると、
インデントが考慮されるため、ズレてしまう。

## 解決策

:plainを使う。
その後、インデントを開けて`<!--`と`-->`で挟む。

```
:plain
  <!--
    ∧＿∧　 
　（　´∀｀） 
　（　　　　） 
　　｜ ｜　｜ 
　（_＿）＿） 
  -->
```
Railsのコードを書けないAndroidアプリ開発者がnifty cloud mobile backendを使ってチャットアプリを作る


たまたま[nifty cloud mobile backend](http://mb.cloud.nifty.com/) というサービスがあることを知ったので、[Parse](http://www.parse.com/)とかとくらべてどのくらいイケてるのかなぁと、お試しで触ってみました。


## アプリを登録する

![Kobito.pdbFyL.png](https://qiita-image-store.s3.amazonaws.com/0/74571/715ff14e-d716-8504-9d12-96dd209e1acf.png "Kobito.pdbFyL.png")


## APIキー・クライアントキーをApplicationクラスに入れる

```java:HogeHogeApplication
public class HogeHogeApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        NCMB.initialize(this,
                "90bdda4..............59bbf", //APP KEY
                "cf0276...............0143"); //CLIENT KEY
    }
}
```

```xml:AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.co.crowdworks.hogehogeworks">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:name=".HogeHogeApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
```


## ビューを作る

すごい適当に、以下の様な感じでつくります。

![Slice 1.png](https://qiita-image-store.s3.amazonaws.com/0/74571/2d39ad7a-6625-3ad7-5831-90a9c97e11a9.png "Slice 1.png")

とりあえず[XMLでレイアウトファイル](https://github.com/YusukeIwaki/HogeHogeWorks/blob/dc70cd50eb6e2b534fb98d842eeda1027c3acbc1/app/src/main/res/layout/main.xml)を追加。

Activityの細々とした動きは後ほど。


## 会員登録・ログイン・ログアウトなど

ようやくmobile backendの恩恵を少しだけ受けられます。

![Slice 2.png](https://qiita-image-store.s3.amazonaws.com/0/74571/a9884105-61a2-ab5f-35fd-daabbcfa9f3f.png "Slice 2.png")

こんなかんじの画面遷移をつくります。
とりあえず[結果](https://github.com/YusukeIwaki/HogeHogeWorks/commit/d8e59767a9c1ba9fad5535ca11c2f2ced778eb49)だけ。

## データストアのIOを実装

![Kobito.ikour1.png](https://qiita-image-store.s3.amazonaws.com/0/74571/3da4d7cb-67ff-a686-02ae-6afe259ceeed.png "Kobito.ikour1.png")

クラスを作成して、「message」というクラスを作っておきます。
（リファレンスを読む限りだと、これはやらなくてもOKかも）

で、

* ログインができたら、messageをロード
* Sendボタンをおしたらmessageオブジェクトを作成

という[至極シンプルなロジックを追加](https://github.com/YusukeIwaki/HogeHogeWorks/commit/9137542bbdb782d4b97aff418707fbdc79f479c8)します。


とりあえずこんな感じになりました。

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/74571/5920c35a-7557-80ac-49b7-93bb25b5ce2e.gif "test.gif")


## Going Reactive
![Slice 1.png](https://qiita-image-store.s3.amazonaws.com/0/74571/301bc091-9fe4-2895-17d6-5e2e15d914d1.png "Slice 1.png")

これが、mobile backendでなんでやってくれないの？！と非常に不満な点。
（Meteorみたいにデータをリアルタイムで反映してくれたら素敵なのに… と）

「サーバ側でmessageが追加されたらクライアントにPUSH通知」みたいなことができません。
よって、現状だと、定期的にfetchするしかなさそう。

と、ここで、心が折れて、続きをやるのをやめました・・・ｗ
＃AlarmManagerで定期的にloadMessage() 呼ぶだけなんですけどね...。


## まとめ

現状の nifty cloud mobile backendだと、

**良かった点**

* ログイン周りが超かんたんに実装できる
* データストアがSharedPreferenceに毛が生えた程度のコードで実装できる

**イケてない点**

* データストアの変化通知をPUSH受信できないので、定期的にデータストアを監視しないといけない
* PUSH通知にはGCMのIDが必須（[Parse](http://www.parse.com/)だと、GCMなしでもある程度のPushはできる）
	* プロトタイプでとりあえず〜　にはGCM登録は面倒
	* そもそもGoogle開発者サービスが入ってないスマホには、PUSHを届けられない


というかんじですね。

ログインまわりはかなり省力化できるけど、ログイン周り以外はほとんど省力化できた気はしませんでした。
とはいえ、わりとAPI設計のセンスがいい（けっこう直感的）ので、今後に期待できそう。
Babylon jsで独自attributeを設定するメモ

Babylon jsでカスタムattributeを設定するやり方がドキュメントで詳しく載ってなかったのでメモ。

まずShaderMaterialを作るときに、attributesに設定したい値の名前を入れる。
ここで設定した名前がshader上でのattribute名に。

```js
new ShaderMaterial("material", scene,
  {
    fragmentElement: document.getElementById('frag'),
    vertexElement: document.getElementById('vert')
  },
  {
    attributes: ['velocity']
  }
```

fragment,vertexのあたりはてきとーに自分の環境に合わせる。

このmaterialをつけるmeshにattributeデータを設定

```js
mesh.setVerticesData, 'velocity', velocities, true, 3
```

引数は順番に
  - attribute名
  - データ(Array)
  - 変更可能かどうか(true/false)
  - 個々のデータ長（Vector3だと3、Vector2だと2、みたいな感じ）

これでvelocitiesにずらっと値を入れとけば、vertex shader上でindicesに対応したデータがとれるはず。
CakePHP 3 メモ

# CakePHP 3 で躓いたところをメモ書きしていく
- 日本語訳のドキュメントが僅かしかない。（CakePHP 2で賄える？）
- コントローラで任意のモデルが複数使えない？
- フォーム helper が使いづらい。（Datetime ではなく Date）が欲しい。
- フォーム helper の日付フォーマットは固定？桁数を合わせることができない。
- メソッドのオプションが配列だったり、そうでなかったり、統一感がなさそう。
- チュートリアルでControllerからViewへの変数のセットについて、compactと_serializeが使われているが、説明がない。
- Timeクラスで曜日の取得が分からない。PHPの標準DateTimeクラスの使い方がドキュメントでサポートされていない。い。
-TimeクラスのフォーマットがICU dateになっている。ICU dateの曜日は添字が「1」から始まる。つまり、日曜日は「1」である。PHPのDateTimeクラスと異なるので注意。
- ACLどこいった？
- 認証コンポーネントを使用するとUserControllerがアクセス不可になる。自壊？。UserController以外は大丈夫そうだ。
- CakePHP は認証コンポーネントと相性が悪い。
- CakePHPの認証コンポーネントは、認証に使用するテーブルは認証制限ができない仕様かな。（CakePHPが考える認証って、何を指しているんだろう？）
- Form HelperのLabelオプションはinputメソッドだけ有効。他のメソッドでは無効化されている？
- Themes を設定すると、コントローラが行方不明になる？bake plugin で CakePHP が自壊？Eclipseが破壊している？Themes が機能していない？
- Themes はplugins以下のcssファイルを読み取って、スタイルタグに出力する方式。htmlテンプレートを適用しようとすると、cssのimport機能が使えない。
- Form Helper でLabelタグがオプションとそうでないタグがある。ちょっと不便？統一感がない気がする。
- Form Helper で日付（date）や時間（time）に「セパレータ」って欲しくないですか？
- bin/cake でロケールファイルを作成すると拡張子がマニュアルと異なるため機能しない
- pluginのテーマでロケールが機能しない
- CakePHP+Composerで自分のアプリのインストールはどうするんだ？
- **CakePHP 3のMemcachedはGAEでは動作しない***ので**Apc**を使う。CakePHPの行儀が悪い？
- **CakePHP 3のEngineでGAEのCloudSQL（~~第1世代~~、第2世代）に接続できない。**CakePHPの行儀が悪い？
- Security コンポーネントのバグ？formヘルパー使わずにhtml5のinputタグを使うと、フォームデータがブラックホール行きになる。カスタムformヘルパー必須？Security コンポーネントの設定を変更してもブラックホール行き。

    ```php:add.ctp
    <input type="time" name="example_time" id="example_time">
    ```

    ```php:ExamplesController.php
    public function beforeFilter(Event $event)
    {
        $this->Security->unlockedFields = [
            'example_time',
            ];
        $this->Security->validatePost = false;
    }
    ```

- （自信ないけど）命名規則に沿ってクラス名・ファイル名を決定しているが、使用できない？単語がある。ローカル（Microsoft Windows）では問題ないけど、GAEでは、ファイルが見つからないと言われた。（この時はWeeklyReportsでした）
- Themes機能は、（たぶん）cssファイルを読み取って、styleタグに出力することで実現しているため、無料のテンプレートによるレスポンシブデザインが機能しなくなっている。この機能は、パソコンでしか使えない？
- Elementディレクトリに任意のディレクトリで階層を作ると、GAEではFile not foundが発生する。GAEには、ディレクトリ階層の概念がない？
-テンプレートで配列変数に直接アクセスできない？配列変数はループしなければならない？DBから取得はできるけど、テンプレートに展開できない？データ取得後にどうするかマニュアルに記載が見当たらない。（ResultSetの説明が見当たらない）

    ```php:index.ctp
    <?= $examples[0]->name ?> 
    ```
    ```php:ExamplesController.php
    debug($examples);
    ```

debug関数でitemsメソッド？プロパティ？に（で）データを取得できそうにみえるが、itemsは実在しない？
- Tutorialのままだと、常時パスワードを取り出して持ち歩くことになる。問題あり？
SharedPreferencesに出力したデータの確認

## Device File Explorer
[stackoverflow](https://stackoverflow.com/a/44089388)

AndoridStudio3.0以降はこれを使うのが便利。

1. メニューから　View > Tool Windows > Device File Explorer
2. 目当てのパッケージの箇所を拡げる  /data/data/[package-name]
3. shared_prefs を開く

debugビルドのアプリしか中身は見れないので注意

以下は付録

##そもそもAndroidでのSharedPreferencesとは
データをxml形式でファイルに保存する、永続化のための仕組みの一つ。
iOSで言えばNSUserDefaultsを使うのと同じようなもの。   

##以下のコードがあるとして
```
SharedPreferences preferenceService = PreferenceManager.getDefaultSharedPreferences(context);
preferenceService.edit().putString("hogehoge", "foofoo").commit();
```
contextはアプリケーションコンテキスト
上記のコードでプリファレンスに保存した場合

##保存パス 
```/data/data/"パッケージ名"/shared_prefs/"パッケージ名_preferences.xml"
```
パッケージ名がjp.co.hoge.hoge だとすると

```
/data/data/jp.co.hoge.hoge/shared_prefs/jp.co.hoge.hoge_preferences.xml
```

##パッケージ名_preferences.xmlの形式
```
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
  <string name="hogehoge">foofoo</string>
</map>
```

##保存した値の読出し
```
SharedPreferences preferenceService = PreferenceManager.getDefaultSharedPreferences(context);
String foo = preferenceService.getString("hogehoge" , null);
```

##保存したファイルの中身を確認したい場合

[アプリの実機でのデバッグ時に、SharedPreferencesの内容を確認する方法](http://honnybreed.hatenablog.com/entry/2013/04/06/171504)

##前提
対象アプリがデバッグモードであること
ターミナルでadb コマンドを使えること（PATHが通っていること）

1.adb shellを実行
```adb shell
```
2.run-asコマンドでアプリを起動しdataディレクトリに入る
```run-as [対象アプリのパッケージ名]
```
上記コマンドを実行すると /data/data/[対象アプリのパッケージ名]/ へカレントディレクトリが移動し、files,databases,shared_prefs ディレクトリが見えるようになります。

3.SharedPreferencesが保存されているディレクトリに移動
```cd shared_prefs
```
SharedPreferencesはshared_prefs配下にxmlで保存されています。

4.SharedPreferencesの内容の確認
```cat [対象SharedPreferencesのファイル名]
```
## 対象ファイルをローカルPCにコピーする場合

```
# jp.ne.hogehoge は任意のパッケージ名とする
# /storage/sdcard0 は端末内の任意の保存場所とする
adb -d shell "run-as jp.ne.hogehoge cp /data/data/jp.ne.hogehoge/shared_prefs/jp.ne.hogehoge_preferences.xml /storage/sdcard0/jp.ne.hogehoge_preferences.xml"
# データファイルをPCに保存
adb pull /storage/sdcard0/jp.ne.hogehoge_preferences.xml ./jp.ne.hogehoge_preferences.xml
```
この方がPCの好きなエディタで確認できる。