OmniAICreator/Qiita-1.07M huggingface dataset:
Android StudioでBuild Variantsがreleaseの時にデバッグをしたい場合

通常は、Project Structureで、debugに、Signing(署名)の設定を入れればよいと思います。
(InAppBillingなどのデバッグ時も、Build Typesがreleaseである必要はありません。)

---
以下、参考のため残しておきます。

#現象
Build Variantsがreleaseの場合は、デバッガを接続できない。
(Attach debugger to Android processで、デバッグ対象のプロセスが表示されない)

デバッグを有効にするには、対応法1、2共に設定する必要があります。
**※アプリのリリース時は、必ず設定を元に戻しましょう。**
#対応法1　Build Types (release)にDebuggableの設定を追加する
1.File/ Project Structure...
2.Modules/appを選択する。
3.Build Typesタブを選択する。
4.relaseのDebuggeableをtrueに設定する。

#対応法2　マニフェストの設定
※この設定をしない場合は、プロセスに接続できるだけという、中途半端な設定になります。
1.Projectツールウインドウで、manifests/AndroidManifest.xmlを選択する
2.applicationノードに、次の設定をする。
> android:debuggable="true"
> tools:ignore="HardcodedDebugMode"

※tools:ignore～は、
android:debuggableの上でAlt-Enter　(またはShow Intension Actionsに設定したショートカットキー) ->
Suppress: Add tools:ignore="HardcodedDebugMode" attributeで追加した方が楽です。

3.manifestノードに、(2で自動的に追加されていない場合は、)
```xmlns:tools="http://schemas.android.com/tools"```
を追加する。

### 補足 InAppBillingなどのデバッグをする場合は、Playストアに (テスト)公開済みのバージョンと、デバッグに使うapkのバージョンを同じにする。
署名も一致させる(デバッグ用の署名だと購入テストができない)

デバッグ可能版を、デバイスにインストールする場合は、
1.Project StructureでSigningの設定を入れる
2.Build Variantsでreleaseを選択する
3.Run/ Debug app
※Playストアからダウンロードしたバージョンがインストール済みの場合は、先にアンインストールしてから、デバッグ可能版をインストールしましょう。

[Qiita - Android StudioでRun app (あるいはDebug app)した時に、Error apk is not signedが表示される場合]
http://qiita.com/toris-birds/items/fb28fb616ae6ee58202f

#参考
[Stackoverflow - Is it possible to debug locally Google Play's in-app billing in Android Studio?]
http://stackoverflow.com/questions/36113347/is-it-possible-to-debug-locally-google-plays-in-app-billing-in-android-studio


---
さらに補足
署名を一致させればよいのだから、Build Variantsはdebugでよいのでは？
ということで実験結果。
条件：
Build Variants: debug
Signingの設定：あり　※In-App billingなどのデバッグ時は、必須。
結果：
正常に、テスト用の購入処理に推移する。
購入状態(定期購入)なども取得できる。

---
蛇足
購入のテスト時に表示されるエラーは、実際の内容と異なる場合があるので注意する。
表示例：
エラー　認証が必要です。Googleアカウントにログインしてください。
原因の例：
アプリが未公開、またはアプリ内アイテムが無効。(skuが不一致の場合も発生するとのこと。)

[Qiita - AndroidのIn-app Billingのテスト時に、「エラー　認証が必要です」が表示される場合]
http://qiita.com/toris-birds/items/ec5f4b191e3ae2b47bfb
Goでつまづいたところ

## Go以前の話
El capitanでbrewを使う
 `sudo chown -R (whoami) /usr/local && brew prune && brew update`

## Macにインストール

古いgoは直接ディレクトリを消す。
  `sudo rm -r /usr/local/bin/go`
古いpathを見ている場合は `brew unlink　go` する
 `brew install go`

## GOPATH
 brew install goでMACにインストールした場合、GoPATHは次のように書いた

```
 export PATH=$PATH:$GOROOT/bin
 export GOROOT=/usr/local/Cellar/go/1.7.1/libexec
 export GOPATH=$HOME/_go <=好きなところ
　
```

## httpサーバとstats確認

[go-lang-api-stats-hander](https://github.com/fukata/golang-stats-api-handler)を使用

`go get github.com/fukata/golang-stats-api-handler`

sampleを以下変更

``` gostats.go

package main
import (
    "fmt"
    "net/http"
    "log"
    "github.com/fukata/golang-stats-api-handler"
)

func handler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "Hello, World")
}

func main() {
    http.HandleFunc("/", stats_api.Handler)
    log.Fatal( http.ListenAndServe(":8080", nil) )
}

```

結果

```
$ curl -i http://localhost:8080
HTTP/1.1 200 OK
Content-Length: 513
Content-Type: application/json
Date: Thu, 15 Sep 2016 11:48:01 GMT

{"time":1473940081157567012,"go_version":"go1.7.1","go_os":"darwin","go_arch":"amd64","cpu_num":2,"goroutine_num":3,"gomaxprocs":2,"cgo_call_num":1,"memory_alloc":313712,"memory_total_alloc":313712,"memory_sys":3180792,"memory_lookups":7,"memory_mallocs":4896,"memory_frees":144,"memory_stack":294912,"heap_alloc":313712,"heap_sys":753664,"heap_idle":114688,"heap_inuse":638976,"heap_released":0,"heap_objects":4752,"gc_next":4194304,"gc_last":0,"gc_num":0,"gc_per_second":0,"gc_pause_per_second":0,"gc_pause":[]}
```
specの悪いPC:cry:

## 学んだこと
package mainは書かないとエラーとなり実行できない。
`test.go:1:1: expected 'package', found 'import'`
Android StudioでRun app (あるいはDebug app)した時に、Error apk is not signedが表示される場合

#現象
appモジュールのBuild Variantsがreleaseの場合、
Android StudioでRun app (あるいはDebug app)した時に、
Edit configurationダイアログが表示され、下部に、
Error: The apk for your currently selected variant (app-release-unsigned.apk) is not signed. Please specify a signing configuration for this variant (release).
のメッセージと共に、「Fix」ボタンが表示される。

#対処法　Project Structureで、Signing(署名)の設定を入れる。

[Stackoverflow - android studio: release apk is not signed]
http://stackoverflow.com/questions/34553272/android-studio-release-apk-is-not-signed

1.File -> Project Structure...
2.Modules/app (または他のモジュール)を選択する
3.Signing タブを選択し、必要事項を入力する
※Key Alias とKey Password が先に来ます。
Generate Signed APK ダイアログとは順番が逆なので注意しましょう。

パスワードの入力欄を間違えた時の表示例：
> \* What went wrong:
> Execution failed for task ':app:packageRelease'.
> \> Failed to read key ～ : Keystore was tampered with, or password was incorrect

4.Build Types タブを選択し、releaseを選択します。
Signing config ドロップダウンリストで、"config"(またはSigning タブで設定したもの) を選択します。
5.OK をクリックしてProject Structureを閉じます。

#原因
Run appやDebug appが使うのは、(おそらく)Build/ Build APKで生成されるapk。
Build Variantsでappモジュールをreleaseに設定した場合は、署名済みのapk(app-release.apk)が生成される必要がある。

※Generate Signed Apk...相当ではない　というのがミソ。
事前にGenerate Signed Apk...したかどうかに関わらず、というよりも、outputフォルダにapp-release.apkがあるかどうかに関わらず、Signingの設定を入れていない場合は、同じ現象が発生します。

###蛇足1
Build Typesタブにある、Signing configは、ドロップダウンリストでなくコンボボックスだろう、という突っ込みが来そうな予感が。
ちなみに、設定した値("config"など)を外したい場合は、コンボボックスをクリックすれば編集できます。

###蛇足2
少し混乱しそうな回答内容が含まれていますが、参考リンクその2。
[Stackoverflow - app-release-unsigned.apk is not signed]
http://stackoverflow.com/questions/25001479/app-release-unsigned-apk-is-not-signed
Hive関数で週番号を取得

# 困ったこと
Hiveで週次集計をしたい。
、、、が、わざわざ日付情報を7で割って、、というのがちょっと面倒だし、
ありあわせの関数でナントカならんもんか、と思った。
(´・ω・｀)

# 方針
週番号を付加して、そいつで`group by`すればいいじゃまいか！
(※) 「週番号」ってこういうやつ↓
> その年の最初の週をWeek 1とし、以降の週を連番で表示するウィークカレンダー方式での週の指定は、ヨーロッパやアメリカでよく使われますが、1週間のはじまりを「月曜日」とするか「日曜日」にするかという違いと、1月1日が含まれる週を必ずWeek 1とするかどうかで、数え方に違いがあります。
(http://www.toishi.info/email/week_calendar_2016.html より引用)

# 解決策
`weekofyear`関数を使おう！

## フォーマット
```sql
weekofyear("yyyy-mm-dd")
```
に対して、週番号を返してくれる。

## 例
```sql
select weekofyear("1970-11-01")
---44
```

## 何曜始まりかを確認
```sql
select weekofyear("2016-09-11")
---36 <- 日曜
select weekofyear("2016-09-12")
---37 <- 月曜
```
ということで、月曜始まり！

## 年末年始
例えば、2015年末は`2015/12/29`が月曜で同じ週に年が明けます(`2016/1/1`は木曜)

```sql
select weekofyear('2015-12-28')
 --- 53 <- 月曜

select weekofyear('2016-01-01')
 --- 53 <- 木曜
 
select weekofyear('2016-01-03')
 --- 53 <- 日曜

select weekofyear('2016-01-04')
 --- 1 <- 月曜
```
ということで、1/1が月曜でない(今回のケースのような場合)は、昨年末の週番号を引き継ぎ、
次の月曜が週番号1となるものを採用！

## 日付のフォーマットが異なる場合
データの持ち方によっては日付が`yyyy-mm-dd`でない場合もある。
そんな時は`from_unixtime`, `unix_timestamp`で無理矢理形式を揃えれば出力される。

```sql
select weekofyear(from_unixtime(unix_timestamp('20151228','yyyymmdd'), 'yyyy-mm-dd'))
 --- 53
```


# 参考サイト
- 月曜日から始まる週番号の計算
    - http://qiita.com/txmy/items/34d4dce0bf8cef279e0c
- 欧州や米国のWeekカレンダーとウィークナンバーの違い
    - http://www.toishi.info/email/week_calendar_2016.html
- HiveのUDFサイト
    - https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
Cloud9でRuby on Rails5環境を構築

cloud9でRuby on Rails5環境を構築したときのメモです。

-  cloud9でworkspaceを作る。種別は「blank」を用いました。
-  Ruby
    1. https://www.ruby-lang.org/ja/downloads/ からソースをダウンロード
    2. 今回は"ruby-2.3.1.tar.gz"をダウンロード。
    3. cloud9のワークスペースにアップロード
    4. 以下のコマンドを投入

~~~ bash
$ tar zxvf ruby-2.3.1.tar.gz
$ cd ruby-2.3.1
$ ./configure
$ make
$ sudo make install
$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
~~~

- SQLite
    1. https://www.sqlite.org/download.html からソースをダウンロード
    2. 今回は"sqlite-autoconf-3140200.tar.gz"をダウンロード。
    3. cloud9のワークスペースにアップロード
    4. 以下のコマンドを投入
    5. sqliteのドライバもインストール

~~~ bash
$ tar zxvf sqlite-autoconf-3140200.tar.gz
$ cd sqlite-autoconf-3140200
$ ./configure
$ make
$ sudo make install
$ sqlite3 -version
3.14.2 2016-09-12 18:50:49 29dbef4b8585f753861a36d6dd102ca634197bd6
~~~


~~~ bash
$ gem install sqlite3
~~~

- Node.js
    1. https://nodejs.org/en/download/ からソースをダウンロード
    2. 今回は"node-v4.5.0.tar.gz"をダウンロード。
    3. cloud9のワークスペースにアップロード
    4. 以下のコマンドを投入

~~~ bash
$ tar node-v4.5.0.tar.gz
$ cd node-v4.5.0
$ ./configure
$ make
$ sudo make install
$ node -v
v4.5.0
~~~

- Ruby on Rails
    4. 以下のコマンドを投入

~~~ bash
$ gem install rails
$ rails -v
Rails 5.0.0.1
~~~

以上。
このワークスペースをcloneして使う。
Xcode8だけどSwift2.3で実行したい人向け対応


Xcode8が9月13日にとうとう正式にでたので早速インストールしてみました。案の定いろいろエラーが出てきたので即席対応した内容を共有します。

## Use Legacy Swift Language Version

起動時にLaterを選択したにもかかわらず、シミュレーターや実機に書き込もうとすると

```
Use Legacy Swift Language Version
```

というエラーがでて、Convertを推奨してきます…。
これを解除してSwift2.3で書くには

```
TARGETS -> Build Setting -> Swift Compiler -> Use Legacy Swift Language Version
```

をYESに変更します。
これでSwift2.3で書かれたモノでも上記のエラーが出なくなります。

## ライブラリを使用していた場合

僕はcarthageで導入していたObjectMapperのimport文で以下のようなエラー文がでました。

```
Module file was created by an older version of the compiler; rebuild 'ObjectMapper' and try again
```

```
Carthage/Build
```
を削除して

```
TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 carthage update --platform iOS
```

Swift2.3を指定して、carthageで導入するライブラリをビルドします。ビルド後に、プロジェクトに追加してください。

以上で、シミュレータに書き込んで実行することができました。
gulpfile.jsをディレクトリにする

#gulpfile.jsをディレクトリにするとどうなるか

Gulpは`require("./gulpfile.js")`のようなことをやっているようなので、にgulpfile.jsというディレクトリを用意し、中にindex.jsを置くことでそのindex.jsファイルが実行されます。

#メリット

gulpfile.jsが肥大化するとまずやるのがファイルの分割ですが、分割したファイルが散らかりにくくなります。ただでさえプロジェクトルートはツールの設定ファイルだらけになりがちです。

#デメリット

意図を中々理解してもらえません。
RubyのModuleの使い方とはいったい

# Module

Rubyにはオブジェクト指向で一般的なクラス以外にも、モジュールという概念が存在します。モジュールではクラスと同じように定数やメソッドをまとめたり、クラスに組み込んで多重継承を実現したり、クラスなどをまとめることで名前空間を提供するなど、いろいろな使い方ができます。
この記事では以下の内容について解説します。

- 定数やメソッドをまとめる
- クラスに組み込んで多重継承を実現する
- 名前空間を提供する

リファレンスマニュアル（2.3.0）
http://docs.ruby-lang.org/ja/2.3.0/class/Module.html:title


# 定数やメソッドをまとめる

モジュールではクラスと同様に、定数やメソッドをまとめる機能があります。

## 定数

モジュール内で定義した定数は、モジュール名を経由して呼び出すことが可能です。

```ruby
module Mod
  Version = "2.3.0"
end

Mod::Version #=> "2.3.0"
```

## インスタンスメソッド

インスタンスメソッドは定義するだけでは呼び出すことができません。module_functionメソッドを使い、メソッドをモジュール関数にすることで呼び出すことができるようになります。

```ruby
module Mod
  def hello
    puts 'Hello'
  end

  module_function :hello
end

Mod.hello #=> "Hello"
```

## クラスメソッド

モジュール内で宣言されたクラスメソッド（self. から宣言されるメソッド）はincludeやextendで拡張したクラスから呼び出すことができませんが、クラスと同様にモジュールから直接呼び出すことができます。

```ruby
module Mod
  def self.hello
    puts 'Hello'
  end
end

Mod.hello #=> "Hello"
```

## モジュール関数とクラスメソッドの優先度

同名のモジュール関数とクラスメソッドがあった場合、後に定義されたメソッドのほうが実行されます。

```ruby
module Mod
  def hello
    puts 'module'
  end

  def self.hello
    puts 'class'
  end

  module_function :hello
end

Mod.hello #=> "module"
```

```ruby
module Mod
  def hello
    puts 'module'
  end

  module_function :hello

  def self.hello
    puts 'class'
  end
end

Mod.hello #=> "class"
```

# クラスに組み込んで多重継承を実現する（Mix-in）

Rubyのクラスは単一継承のみですが、モジュールをクラスに組み込むことで多重継承を可能にしています（ここだけ聞くとJavaで言うinterfaceのようですが、moduleではメソッドの機能を実装することができます）。クラスにモジュールをincludeしたりextendすることをMix-inと言い、Mix-inによってクラスの肥大化を防いだり、クラスをまたがった同じ処理を切り出して繰り返しを防ぐことができます。
モジュール関数、クラスメソッドは組み込むことができません。

## include

includeでは、対象のクラスにincludeしたモジュールのメソッドが**インスタンスメソッド**として組み込まれます。クラスからnewで作成したインスタンスで呼び出すことができます。これをクラスメソッドとして呼びだそうとすると、undefined methodのエラーが出ます。

```ruby
module Mod
  def hello
    puts 'Hello'
  end
end

class Obj
  include Mod
end

ins = Obj.new
ins.hello #=> "Hello"
```

## extend

extendでは、対象のクラスにextendしたモジュールのメソッドが**クラスメソッド**として組み込まれます。クラスメソッドなのでインスタンスでは呼び出すことができず、いつも通りクラスから直接呼び出します。こちらもインスタンスから呼びだそうとすればundefined methodです。

```ruby
module Mod
  def hello
    puts 'Hello'
  end
end

class Obj
  extend Mod
end

Obj.hello #=> "Hello"
```

# 名前空間を提供する

## 名前空間

ruby gemなどでは、クラス名やメソッド名の重複による使用者からのモンキーパッチを防ぐためにgemの中身を全て1つのモジュールで梱包することが多いです。

```ruby
module Name
  class Hoge
    def self.hello
      puts 'hello'
    end
  end
end

Name::Hoge.hello #=> "hello"
```

## 名前空間とMix-in

モジュールを重ねることで、MIx-inに使うモジュールを名前空間内で提供することができます。

```ruby
module Name # 名前空間としてのモジュール
  module Mod  # Mix-inとしてのモジュール
    def hello
      puts 'Hello'
    end
  end
end

class Obj # Mix-in
  extend Name::Mod
end

Obj.hello #=> "Hello"
```
[ActiveRecord]activerecord-import-0.15系で気をつけること

最近DBのBulk Insert用に、activerecord-importを使用してるのですが、Rails5対応で最新版のactiverecord-importにupdateし使用したところ、思いがけないところでハマってしまったので、備忘録として残しておきます

## ハマってた内容

- Insert用に用意したActiveRecordのModelインスタンス数とimport後のレコード数に差分が生じていた

## 原因

- 0.15系だとvalidationがデフォルトで`true`の状態になっており、validationで引っかかっていることに気づかなかった

https://github.com/zdennis/activerecord-import/blob/master/lib/activerecord-import/import.rb#L344

## 対策

optionに`false`を渡すのも考えたが、validation通ってないデータが保存されるべきデータではないので、エラーメッセージ等、補足できないかなと調べた

どうやらreturn instanceに以下のものがあるっぽい

- failed_instances : validationに失敗したり、commit失敗したinstanceを配列にして返す
- num_inserts : 発行したInsert文の数
- ids : adpaterがサポートされていればimportしたprimary keyのリストを返す

結論として下記のようにエラーが有無を判定することにしました

```rb
result = model_module.import instance_arr
if !result.failed_instances.blank?
  logger.warn(result.failed_instances)
end
```

余談だが、MySQLの場合、下記のことも頭の片隅においておくと、原因解明に役立つかもしれないです(よほど大量のBulk Insertを発行しない限りは起きないとは思いますが...)

- 1ステートメントあたりのパケットサイズのチェックを行っている

https://github.com/zdennis/activerecord-import/blob/master/lib/activerecord-import/adapters/mysql_adapter.rb#L34

- パケットサイズの設定値の確認

```sql
SHOW VARIABLES like 'max_allowed_packet';
```

- パケットサイズについて

https://dev.mysql.com/doc/refman/5.6/ja/packet-too-large.html
roslaunchからrvizを立ち上げる時に，特定の設定を読み込む

rvizから保存した設定ファイル(.rvizとする場合が多い)が，PACKAGE_NAME/config/SETTING.rvizの場合．

```xml
<?xml version="1.0"?>
<roslaunch>

  <node pkg="rviz" type="rviz" name="rviz" args="-d $(find PACKAGE_NAME)/config/SETTING.rviz"/>

</roslaunch>
```
cocos2d-x-3.13.1 の iOS static ライブラリをビルド

# 目的

1. Cocos2d-x を既存アプリに組み込む準備
2. Xcode が Cocos2d-x ライブラリ部分に対して表示する警告を見たくない
3. Cocos2d-x アプリのビルドを速くしたい
    1. ```cocos new``` コマンドで作成した Xcode プロジェクトでは、クリーンビルドの度にライブラリ部分も再ビルドする

# 環境

1. Mac OS X 10.11.6 (英語)
2. Xcode 7.3.1
3. Cocos2d-x 3.13.1

# 方針

1. iOS SDK は 9.3
2. iOS Deployment Target は 8.0
3. アーキテクチャーは armv7 arm64 i386 x86_64
    1. [アーキテクチャーとデバイスの関係](http://iossupportmatrix.com/)
    2. armv7s は external でビルドされてないし armv7 とほとんど差がない模様
4. bitcode をサポート

# 手順
cocos2d-x-3.13.1 を展開したディレクトリから

```
$ cd build

$ xcodebuild -project cocos2d_libs.xcodeproj -scheme "libcocos2d iOS" -configuration Release -sdk iphoneos9.3 \
    clean build ARCHS='armv7' VALID_ARCHS='armv7' IPHONEOS_DEPLOYMENT_TARGET=8.0 \
    TARGET_BUILD_DIR=tmp/arm BUILT_PRODUCTS_DIR=tmp/arm OBJROOT=tmp/arm SYMROOT=tmp/arm \
    OTHER_CFLAGS=-fembed-bitcode

$ xcodebuild -project cocos2d_libs.xcodeproj -scheme "libcocos2d iOS" -configuration Release -sdk iphoneos9.3 \
    clean build ARCHS='arm64' VALID_ARCHS='arm64' IPHONEOS_DEPLOYMENT_TARGET=8.0 \
    TARGET_BUILD_DIR=tmp/arm64 BUILT_PRODUCTS_DIR=tmp/arm64 OBJROOT=tmp/arm64 SYMROOT=tmp/arm64 \
    OTHER_CFLAGS=-fembed-bitcode

$ xcodebuild -project cocos2d_libs.xcodeproj -scheme "libcocos2d iOS" -configuration Release -sdk iphonesimulator9.3 \
    clean build ARCHS='i386' VALID_ARCHS='i386' IPHONEOS_DEPLOYMENT_TARGET=8.0 \
    TARGET_BUILD_DIR=tmp/i386 BUILT_PRODUCTS_DIR=tmp/i386 OBJROOT=tmp/i386 SYMROOT=tmp/i386 \
    OTHER_CFLAGS=-fembed-bitcode

$ xcodebuild -project cocos2d_libs.xcodeproj -scheme "libcocos2d iOS" -configuration Release -sdk iphonesimulator9.3 \
    clean build ARCHS='x86_64' VALID_ARCHS='x86_64' IPHONEOS_DEPLOYMENT_TARGET=8.0 \
    TARGET_BUILD_DIR=tmp/x86_64 BUILT_PRODUCTS_DIR=tmp/x86_64 OBJROOT=tmp/x86_64 SYMROOT=tmp/x86_64 \
    OTHER_CFLAGS=-fembed-bitcode

$ lipo -create -output "libcocos2d iOS.a" \
    "tmp/arm/libcocos2d iOS.a" \
    "tmp/arm64/libcocos2d iOS.a" \
    "tmp/i386/libcocos2d iOS.a" \
    "tmp/x86_64/libcocos2d iOS.a"

$ rm -rf tmp
```

  1. libcocos2d iOS.a は 313.2MB
  1. これだけだと [cocos2d-x-3rd-party-libs-bin](https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin) で bitcode が有効になっていないので利用時に以下のエラーが出てしまう
    1. [cocos2d-x-3rd-party-libs-src を bitcode 有効にしてビルド](http://qiita.com/ken1ma/items/702572ba98c783c5e9b2)してから上記手順を実施すると bitcode のエラーがなくなる

    ```
ld: 'libcocos2d-iOS.a(ftbase.ios8_armv7.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture armv7
```

# 確認

1. ```cocos new``` コマンドで作成した Xcode プロジェクトから `cocos2d_libs.xcodeproj` サブプロジェクトを Delete
    1. ビルドエラーが起きる状態になる
2. 作成した libcocos2d iOS.a を Finder から Xcode で開いたプロジェクトの Frameworks へドラッグ＆ドロップ
    1. クリーンビルドが早くなった

# 参考

1. [Build cocos2d-x fat static library](http://www.nicnocquee.com/2016/01/20/build-cocos2d-x-fat-static-library.html)
Laravel5でSQLを確認する(お手軽版)

## Query Builder を使った時にどんなSQLになるのか知りたい

[2020-07-30 追記]
最新のLaravel 7.x でもこの方法が使えることを確認しました。
[/2020-07-30 追記]

ここでは開発中に簡単に確かめる方法を載せています。
じっくりとログに出力してSQL調整したいとかだったらこちらが参考になると思います。
~~[Laravel5でSQLログを取る](http://qiita.com/deadcheat/items/1161efe5484a83ca3a2e)~~
[laravel5.2 実行SQLのログを取る - web開発メモ](http://djredhuman.hatenablog.com/entry/2016/04/28/120809)

## 答え: toSql() を使う
APIドキュメントにありました。[QueryBuilder::toSql()](https://laravel.com/api/master/Illuminate/Database/Query/Builder.html#method_toSql)

## 以下はそのやり方です

```php
$users = DB::table('users')
            ->where('status', '<>', 1)
            ->get();
```
という有効なユーザーのリストを取得する場合のSQLを確認するには

```php
$sql = DB::table('users')
            ->where('status', '<>', 1)
            ->toSql();
var_dump($sql);
```
とします。

すると

```
string(44) "select * from `accounts` where `status` <> ?"
```
というような出力になります。
ここで気づくのはプレースホルダが `?` のままということですが、 **どんなSQLができるのか** ということならこれでいいんじゃないでしょうか？

## Eloquent ORMの場合も同じ

```php
$sql = User::where('status', '<>', 1)
            ->toSql();
var_dump($sql);
```
となります。

## プレースホルダの値も取得したい

プレースホルダの値は [getBindings()](https://laravel.com/api/master/Illuminate/Database/Query/Builder.html#method_getBindings) で取得できます。

```php
$query = DB::table('users')
            ->where('status', '<>', 1)
;
var_dump($query->toSql(), $query->getBindings());
```
Oculus Rift DK2を最新のOculus Runtimeを使ってXbox Oneコントローラー無しでセットアップする

Oculus Rift DK2は2016年9月15日現在の[Oculus Runtime](https://www3.oculus.com/en-us/setup/)でも使えるようです。
しかしながら、新規にOculus Runtimeをインストールしセットアップを進めていくと、Oculus Homeに於いてXbox Oneコントローラー無しでは先に進めない場面に遭遇します。

私もその一人でしたが、[このRedditのスレッド](https://www.reddit.com/r/oculus/comments/4d6h2r/use_this_to_actually_show_oculus_home_on_the/)に書かれた情報を元にコントローラー無しで乗り切ることが出来ました。

使い方は、元記事(英語)の通り、Oculus Homeが起動中にHomeUnhiderを起動してコントローラーが必要な段階になったら、代わりにキーボードやマウスで操作すればOKです。

(Oculus Homeの操作方法やReddit上の情報はこれからも更新されていくと思うので、あっさり目の内容ですみませんがご参考まで)
Lambda(js)とDynamoDBを連携する

# やりたいこと

LambdaでDynamoDBに書き込んだり読み込んだりしたいのです。

# 取得
## 方法

1. DynamoDBでテーブルを作る
    2. テーブルの作成でテーブル名、プライマリキーを設定する
3. DynamoDBの読み書きができるIAMロールを作る
    4. IAMロールでDynamoDBのフルアクセス権を付けたロールを作る
5. Lambdaでコードを書く

``` javascript
var AWS = require('aws-sdk'),
    dynamo = new AWS.DynamoDB();

exports.scan = function( event, context ) {
  dynamo.scan( {
    "TableName": "TableName"
  }, function( err, data ) {
    console.log( JSON.stringify( data ) );
  } )
};
  ```

## 結果

"S"とか、"N"とかいらないから、オブジェクトでほしかった。。。

``` json
{
  "Items":
  [{
    "key1":{
      "S":"value1"
    },
    "key2":{
      "S":"value2"
    },
    "primaryKey":{
      "N":"0"
    }
  }],
  "Count":1,
  "ScannedCount":1
}
```

## いい感じのオブジェクト形式で取得する方法(追記)

* DynamoDBクライアントを変更します。

``` javascript
var AWS = require('aws-sdk'),
    documentClient = new AWS.DynamoDB.DocumentClient();

exports.scan = function( event, context ) {
  documentClient .scan( {
    "TableName": "TableName"
  }, function( err, data ) {
    console.log( JSON.stringify( data ) );
  } )
};
```

# 書き込み
## 方法


``` javascript
var AWS = require('aws-sdk'),
    documentClient = new AWS.DynamoDB.DocumentClient();

exports.scan = function( event, context ) {
  documentClient .put( {
    "TableName": "TableName",
    "Item": {
      "primaryKey": 0,
      "key1": "hello",
      "key2": "world!"
    }
  }, function( err, data ) {

  } )
};
```

## 結果

![SnapCrab_NoName_2016-9-16_9-7-9_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/71143/c3c1be44-b1ab-9fa0-d8dc-c59ae800a9dc.png)
[Java]GoogleDriveAPIで指定ディレクトリにファイルをアップロードする 

[前回の記事](http://qiita.com/tsyki/items/f0d7e008e021aad470d3)で紹介したGoogleDriveAPIのサンプルコードは、ルートディレクトリ直下にアップロードする実装になっている。
しかし、ファイルをアップロードする際は任意のディレクトリにアップロードしたいもの。
指定ディレクトリにアップロードするためには、以下の手順で行える。  

## 指定のディレクトリを取得  
効率のよい取得方法が分からなかったので、愚直にルートディレクトリからたどった。
ルートディレクトリ直下のファイル、ディレクトリ一覧は以下のようにして取得できる  

```
com.google.api.services.drive.Drive drive;
...
FileList fileList = drive.files().list().execute();
for(File file : fileList.getItems){
  // IDとファイル名
  System.out.println(file.getId() + " " + file.getTitle());
}
```

指定のディレクトリ以下を取得する場合、以下のようにsetQメソッドで親ディレクトリのIDを条件に追加する。

````
FileList fileList =  drive.files().list().setQ( "'" + parent.getId() + "' in parents").execute();
````
## アップロードするファイルの親ディレクトリを指定 

目的のディレクトリのFileオブジェクトを取得できたらば、ファイルアップロード時にFile#setParentsメソッドで親ディレクトリを指定すればよい。

````
File uploadFileMetadata = new File();
...
uploadFileMetadata.setParents( Arrays.asList( new ParentReference().setId( parent.getId())));
````

はまりどころ
------
* デフォルトの設定だとGoogleDriveAPIで作成したファイル、ディレクトリしか参照することができない  
ブラウザからアップロード先のディレクトリを作っても見えなくてはまった
* デフォルトの検索条件だとゴミ箱にあるファイル、ディレクトリもヒットしてしまう  
ゴミ箱のファイルを除外するにはsetQメソッドで`trashed = false`を追加する必要がある。親ディレクトリの指定と合わせる場合は以下のようにandで条件を結合する。

````
setQ( "trashed = false and '" + parent.getId() + "' in parents")
````

実装されたコード
-------

指定ディレクトリへのアップロードを行うCLIツール。
https://github.com/tsyki/backup-to-google-drive

GoogleDriveUploaderのgetDir, uploadFileで上記処理を実装してある。


参考URL
-------
* setParentsの引数の作り方  
https://github.com/taiProject/taiProject/blob/be62e5a38b2070c072a7d3ecbcdb2b53b4b88c50/dfs/src/main/java/pl/edu/agh/dfs/googledrive/GoogleDriveImpl.java
※GitHubからsetParentsで検索してそれらしいコードを探して見つけた

* ファイル取得時のクエリ指定の方法  
https://developers.google.com/drive/v3/web/search-parameters
ServersMan@VPS(CentOS7)でユーザ毎にディスク利用量制限をかける方法

前提： user01 が作成されているとする。FTP接続可能であるとする。

root権限にて、下記のコマンドを実行する。

    edquota -u user01


下記のように設定すると、1024KB(1MB)までしかディスク容量を利用できなくなる。

	Disk quotas for user user01 (uid 1000):
	  Filesystem                   blocks       soft       hard     inodes     soft     hard
	  /dev/simfs                       24       1024       1024          7        0        0



blocksは現在のディスク使用量。
softは警告を出す閾値。
hardは制限をかける閾値。
値を0にすると無制限になる。

設定後、再起動などは必要ない。
試しにFTPで、1MBを超えるファイルをアップロードしてみるとエラーになる。
それ以下のサイズのファイルであれば問題なくアップロードできる。
Laravel の whereRaw は使っても良い

[【whereRawは使わない】Laravelで複数条件をする方法【既出】](http://qiita.com/3upjp/items/1ddb375934ad80f705a7)

この記事をみて、ちょっと気になったので。

結論から言うと ``` DB::whereRaw() ``` であっても、第2引数の $bindings を使えば言及されているようなSQLインジェクション問題は起きません。

言及されている問題のある書き方

```php:リンク先のコード
$user = Input::get("user");
$password = Input::get("password");//ハッシュ化するものとするが例なので省略
User::whereRaw("user = '" . $user . "AND password = '".$password."'"); 

```

正しい DB:: whereRaw() の書き方

```php:php

$user = Input::get("user");
$password = Input::get("password");//ハッシュ化するものとするが例なので省略
User::whereRaw('user = :user and password = :password', ['user' => $user,'password' => $password]);

// または

User::whereRaw('user = :user',['user' => $user])->whereRaw('password = :password',['password' => $password]);

```

確かにあげられているケースであればリンク先に書かれているように「```DB::where()``` を2回使う」という対応がシンプルで正しいけれど、Laravel から利用できないデータベース側の関数を使いたい場合などには自分で頑張ってエスケープして ``` DB::raw() ``` を使うよりも、```DB::whereRaw()``` を正しく使う事でエスケープを Laravel 側に任せるほうが安全。


```php:こんな感じ

DB::table('posts')->whereRaw('YEARWEEK(:postDate,1) = YEARWEEK(created_time,1)',['postDate' => $postDate]);

```
オブジェクトの中からしかアクセス出来ない “プライベート” インスタンス変数は、 Python にはありません。

ちょっと色々あって調べたのでぺたり

```python:
# -*- coding: utf-8 -*-

class Hoge(object):

    def __init__(self):

        self.__foo = 'foo'
        self._bar = 'bar'


hoge = Hoge()

# AttributeError: 'Hoge' object has no attribute '__foo'
# print hoge.__foo

print hoge._bar
print hoge._Hoge__foo

print hoge.__dict__

```

実行結果
> 
bar
foo
{'_Hoge__foo': 'foo', '_bar': 'bar'}


なにかっちゅうとHoge.__fooはprivate風のプロパティだよと。
アンスコ2つ付けたプロパティはネームマンダリングが行われるからprivateっぽい挙動になるよとのこと。

変数の隠蔽が主目的じゃないっぽいのでそこは頭にとりあえず入れとく。

> 難号化の規則は主に不慮の事故を防ぐためのものだということに注意してください; 確信犯的な方法で、プライベートとされている変数にアクセスしたり変更することは依然として可能なのです。デバッガのような特殊な状況では、この仕様は便利ですらあります。

http://docs.python.jp/2/tutorial/classes.html#tut-private
pymongoでObjectId（主キー）を生成してみた

参考：
https://docs.mongodb.org/manual/reference/object-id/
https://api.mongodb.org/python/current/api/bson/objectid.html

```python:
# coding=utf-8

from bson.objectid import ObjectId

print "# GEN"
oids = []
for x in range(10):
    oid = str(ObjectId())
    print oid
    oids.append(oid)

print "# DESC"
oids.sort(reverse=True)

for oid in oids:
    print oid

print "# ASC"
oids.sort()

for oid in oids:
    print oid


```

>
# GEN
5660f8b837dbc4066fd1c26b
5660f8b837dbc4066fd1c26c
5660f8b837dbc4066fd1c26d
5660f8b837dbc4066fd1c26e
5660f8b837dbc4066fd1c26f
5660f8b837dbc4066fd1c270
5660f8b837dbc4066fd1c271
5660f8b837dbc4066fd1c272
5660f8b837dbc4066fd1c273
5660f8b837dbc4066fd1c274
# DESC
5660f8b837dbc4066fd1c274
5660f8b837dbc4066fd1c273
5660f8b837dbc4066fd1c272
5660f8b837dbc4066fd1c271
5660f8b837dbc4066fd1c270
5660f8b837dbc4066fd1c26f
5660f8b837dbc4066fd1c26e
5660f8b837dbc4066fd1c26d
5660f8b837dbc4066fd1c26c
5660f8b837dbc4066fd1c26b
# ASC
5660f8b837dbc4066fd1c26b
5660f8b837dbc4066fd1c26c
5660f8b837dbc4066fd1c26d
5660f8b837dbc4066fd1c26e
5660f8b837dbc4066fd1c26f
5660f8b837dbc4066fd1c270
5660f8b837dbc4066fd1c271
5660f8b837dbc4066fd1c272
5660f8b837dbc4066fd1c273
5660f8b837dbc4066fd1c274

Process finished with exit code 0
vagrantでmodern.IE動かす

昔やって出来なかったのでリベンジ

とりあえず書いた時のバージョン

```
$ vagrant -v
Vagrant 1.8.1
$ virtualbox -h
Oracle VM VirtualBox Manager 5.0.16
```

## 共通

```
$ mkdir ~/modern_ie/ && cd $_
$ vagrant init win81-ie11
```

## Windows8.1 + IE11

### box追加する

```
$ vagrant box add win81-ie11 http://aka.ms/vagrant-win81-ie11
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'win81' (v0) for provider:
    box: Downloading: http://aka.ms/vagrant-win81-ie11
==> box: Box download is resuming from prior download progress
==> box: Successfully added box 'win81-ie11' (v0) for 'virtualbox'!
$ mkdir ~/modern_ie/win81-ie11/ && cd $_
$ vim Vagrantfile
```

### Vagrantファイルに下記追記
```
  # 追記
  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
  end
  config.vm.guest = :windows
  config.vm.communicator = "winrm"
  config.vm.network :forwarded_port, guest: 3389, host: 3389
  # メモリ
  vb.memory = "1024"
  # クリップボードの共有: 双方向
  vb.customize ["modifyvm", :id, "--clipboard", "bidirectional"]
  # ビデオメモリー(MB)
  vb.customize ["modifyvm", :id, "--vram"  , "128"]
```

### 立ち上げる
```
$ vagrant up
```

とりあえず立ちあがるところまで確認した

## Windows10 + edge
```
$ vagrant box add win10-edge modernIE/w10-edge
==> box: Loading metadata for box 'modernIE/w10-edge'
    box: URL: https://atlas.hashicorp.com/modernIE/w10-edge
==> box: Adding box 'modernIE/w10-edge' (v0.0.3) for provider: virtualbox
    box: Downloading: https://atlas.hashicorp.com/modernIE/boxes/w10-edge/versions/0.0.3/providers/virtualbox.box
==> box: Successfully added box 'win10-edge' (v0.0.3) for 'virtualbox'!
$ mkdir ~/modern_ie/win10-edge/ && cd $_
$ vagrant init win10-edge
$ vim Vagrantfile
```

### Vagrantファイルに下記追記
```
  # 追記
  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
    # メモリ
    vb.memory = "1024"
    # クリップボードの共有: 双方向
    vb.customize ["modifyvm", :id, "--clipboard", "bidirectional"]
    # ビデオメモリー(MB)
    vb.customize ["modifyvm", :id, "--vram"  , "128"]
  end
  config.vm.guest = :windows
  config.vm.communicator = "winrm"
```

### 立ち上げる
```
$ vagrant up
```

とりあえず立ちあがるところまで確認した

先駆者が居ると楽だわね

http://qiita.com/sl2/items/935be39daa549c3d279c
http://dackdive.hateblo.jp/entry/2016/03/11/094501
オブジェクトの回転軸を変更する


r78

デモ：https://mo49.github.io/qiita/20160908/billboard-pivot.html

![flag.png](https://qiita-image-store.s3.amazonaws.com/0/136286/f2e6e314-5bf9-4523-7ffa-f16d05bff2f0.png "flag.png")

例えばこのような画像をビルボード風に配置したい時に、普通に配置してしまうと赤い旗の真ん中が中心軸になってしまう。しかし、本来の中心軸とすべきなのは白いポール（左端）である。

```javascript:必要量だけ中心軸をずらせるようにした
geom.applyMatrix( new THREE.Matrix4().makeTranslation( offsetX, offsetY, offsetZ ) );
```

`createMesh (src, width, height, posX, posY, posZ, offsetX, offsetY, offsetZ)`というメソッドを用意しているので、中心軸をズラす必要がない場合はoffsetを未入力で使えば良い。


![スクリーンショット 2016-09-15 18.19.08.png](https://qiita-image-store.s3.amazonaws.com/0/136286/9f88e2f9-7226-c2db-bdcc-97c3919c8549.png "スクリーンショット 2016-09-15 18.19.08.png")

ポールが中心に来るようにピボットを修正した旗。
その上の旗は中心軸を修正していない。


> 参考
[Change the pivot point of my object?](https://github.com/mrdoob/three.js/issues/1364)
MessangerのBOT開発でBOT側に絵文字を送ってもらいたい時のTips

#Facebook Messangerで絵文字を使いたい時
FacebookのBOT開発をしている中で、BOTにある程度キャラクター性をもたせたい時が度々起きると思います。
ただ天気やニュースを伝えてくるだけでは飽きてしまうからです。

思い立ったのはいいもののどうやるのかわからなかったので、公式のドキュメントを見てみると、**「text must be UTF-8 and has a 320 character limit」**と書いてありました。
次に、文字コードutf-8の絵文字を使わないといけないのかと思って検索してみました。
結局、[こういうサイト](http://qpon.quu.cc/pc/utf_emoji.htm)が出てきたので解決かと思い、そのままコピペすると絵文字として表示されませんでした・・・

#解決法
いろいろ調べてみると、Facebook上で絵文字として変換してくれる文字列や記号が登録されていました。
[このサイト](http://qpon.quu.cc/pc/utf_emoji.html)を見てみると、100を優に超える種類の絵文字が使えるようです。

ただPCとスマホで見た目が変わるのは注意が必要です。

![スクリーンショット 2016-09-15 18.23.50.png](https://qiita-image-store.s3.amazonaws.com/0/78362/e4345b7b-7519-5eac-7f10-2b3980d97535.png)


そして

```js:sample
var messageText = {
                 text :"✋ おはよう！！元気かい?? :-) ✋ "
            };
```

といったように実装してみると・・・

![スクリーンショット 2016-09-15 18.25.37.png](https://qiita-image-store.s3.amazonaws.com/0/78362/606a7312-9c2a-9f02-b85a-475bde9bf2ba.png)


見事実装されましたとさ。めでたしめでたし。
yumでrpmをインストールする際に、「Public Key Not Installed」が出ました

#解決法#

yumのlocalinstallコマンドでローカルディスクにあるrpmファイルをインストールすることができますが、「Public key for ****.rpm is not installed」のようなエラーが出てくるかもしれません。それを解決する方法をまとめてみました。

- GPGキーをインポートする　

```
rpm --import キーのＵＲＬ
```

- キーチェックを一時無効化してインストール 

```
yum localinstall --nogpgcheck ＲＰＭファイル名
```

- セッティングファイルより無効化 

```
/etc/yum.repos.d/your_file.d
```

の中に`gpgcheck=0`を記入

#参考#
- http://www.linuxquestions.org/questions/fedora-35/public-key-not-installed-468615/
- http://snickerjp.blogspot.jp/2013/08/install-splunk-yum-command.html
- http://blog.layer8.sh/ja/2011/12/21/yum%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E4%B8%AD%E3%81%AB%E3%80%8Cpublic-key-for-rpm-is-not-installed%E3%80%8D%E3%81%A8%E3%81%84/
XCode8への移行でしたこと

ハマリポイントとしては

- 外部ライブラリはきっちりSwift2.3でビルドすることを指定する必要がある
- Gym+Xcode8でのSigningの情報が少ない

という感じでした。

## 構成環境
- CircleCI (OSX)
- Xcode7.2 -> Xcode8 への移行
- Swift2.2 -> Swift2.3 への移行
- Cocoapods 1.0.1
- Carthage 0.17.2
- Fastlane 1.103.0
- Gym 1.9.0

## CircleCI
### Xcode8 を使う設定
Fastfile に以下のように記述する

```yaml
machine:
  xcode:
    version: "8.0"
```

## Xcode
### Swift2.3 を使う設定
Target -> Build Settings -> `Use Legacy Swift Language Version` を Yes に設定する

### Automatically manage signing の無効化 (Gymで署名する場合)
Target -> General -> `Automatically manage signing` のチェックを外す。

せっかくの機能なので使いたいところだが、Gymが以下のエラーを吐くので一旦無効化

```
**** has conflicting provisioning settings. **** is automatically signed, but code signing identity iPhone Distribution: **** has been manually specified. Set the code signing identity value to "iPhone Developer" in the build settings editor, or switch to manual signing in the project editor.
```
エラーに従って設定してみてもエラーが解消されないため、一旦無効化した。(要調査)

- このようなコメントもあったりしたが、結局解消せず http://stackoverflow.com/questions/38971075/code-signing-apple-watch#comment66086796_38971075

### Signingの設定 (Gymで署名する場合)
circle.yml に `GYM_CODE_SIGNING_IDENTITY` を指定していても、xcodeproj の設定情報が未設定もしくは指定と矛盾があったときに GYM がエラーを吐くため、以下を設定しておく。
- Code signing identity
- Provisioning profile

`Provisioning profile` はUUIDではなく名前を指定するようになったので、そちらを設定する。(再発行されても変わらないので地味にありがたい)
## Cocoapods
### Swift2.3 を使う設定
ライブラリ側がXcode8対応済みであれば何もする必要はないが、一つでもされてなければ次の記述を追加する

```rb:Podfile
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '2.3'
    end
  end
end
```

先述した `Use Legacy Swift Language Version` を YES にする作業をしている

## Carthage
### Swift2.3 でビルドする
`carthage` のコマンドを叩く際に以下のようにする

~~$ TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 carthage XXXX~~

Cathage 0.17 以降では以下のように記述できるようです。

```bash
$ carthage XXXX --toolchain com.apple.dt.toolchain.Swift_2_3
```

## Fastlane
### Gymが使用するToolchainをSwift2.3に設定する
gymを呼び出している箇所に、以下のように`toolchain` を追加する。

```rb:Fastfile
gym(
  scheme: 'XXXX',
  configuration: "XXXX",
  toolchain: "com.apple.dt.toolchain.Swift_2_3"
)
```
気軽にプッシュ通知のテストがしたい【iOS10以降対応】

[Timers Techblog](http://techblog.timers-inc.com/entry/2016/09/15/125320) より転載です

掲題の通り気軽にプッシュ通知のテストがしたかったのでDockerでプッシュサーバーを構築しました。
構築したものは [こちら](https://github.com/fromkk/apns_docker) です。

Mac OSに [Docker](https://www.docker.com/) がインストールされている事を前提にしています。  
構築する環境は下記の通りです。

- OS: Ubuntu 16.04
- ミドルウェア： [nghttp2](https://github.com/tatsuhiro-t/nghttp2)、 [curl](https://curl.haxx.se)

また、iOS端末のデバイストークン、 **.pem** ファイル、アプリのBundle Identifierはご自身で用意して下さい。  

## ソースをダウンロード

まずは、ターミナルでソースを落としてきます。

```bash
git clone git@github.com:fromkk/apns_docker.git
cd ./apns_docker
```

## イメージを作成

Dockerのイメージを作成します。

```bash
docker build -t apns:ubuntu .
```

暫く時間が掛かるのでその間に **share/apns/apns.sh** ファイルを編集して下さい。

```bash
# iOSデバイストークン
token="YOUR TOKEN HERE"
# .pemのフルパス
pemfile="/apns/key.pem"
# Bundle Identifier
bundleIdentifier="BUNDLE IDENTIFIER HERE"
# Pushで送信するデータをJSON形式で記述
pushData='{"aps": {"alert": "Push Test", "sound": "default", "badge": 3}}'
```

※追記(2016/09/22)

- ホスト側で **.pem** ファイルを **share/apns/key.pem** に配置
- **apns.sh** の **pemfile** を **/apns/key.pem** とすることで **.pem** ファイルを読み込む事が出来ます

@yimajo さん有難うございます。

## Dockerの起動

Dockerのイメージの作成が無事完了したら起動してみましょう。

```bash
docker run -it -v `pwd`/share/apns:/apns apns:ubuntu /bin/bash
```

## プッシュの送信

下記コマンドで指定したデバイストークンにプッシュを送信します。

```bash
sh /apns/apns.sh
```

無事届きましたでしょうか？
iOS 9まではAPNSの仕組みが凄くややこしくて大変だったんですがiOS 10からHTTP2に対応してプッシュの送信が簡単になりました！
細かい仕様は [こちら](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html) を参照下さい。
これで通知に関するテストが凄くしやすくなったのでどんどん新しい機能を試していきましょう！

[スター下さい！](https://github.com/fromkk/apns_docker)
ズンドコキヨシで決定性有限オートマトン (DFA)

　最近こんな記事を書きました。

[ズンドコキヨシを見かけた男子中学生がプログラミングを勉強していく話](http://qiita.com/rotelstift/items/30ae4f1431c1f688323d)

　タイトル通り、以下のツイートを見た男子中学生がプログラミングを学んでいく話です。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016年3月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


　そんなわけで夫にもズンドコキヨシの話を振ったりするわけですが、夫はこんな感じのことを言っていました。

夫：僕だったらズンドコキヨシは白と黒のとびらを使って実装するな。
私：それって私が最近読んだ[オートマトンと形式言語についての入門書、白と黒のとびら](https://www.amazon.co.jp/dp/4130633570/)の？応用できるの？
夫：うん。部屋と扉を二次元配列にすれば解ける。
私：ちょっと待って、自分で考えて実装してみる。

　というわけで、状態遷移図を書きながら、次のようなプログラムを作ったわけです。
　ちなみに部屋とは何かなんですが、この白と黒のとびらという本では、オートマトンの状態を部屋に、入力を扉に例えています。

![IMG_2607.JPG](https://qiita-image-store.s3.amazonaws.com/0/116105/f53674f9-f74c-5e68-4b64-fde5da9f7073.jpeg)


```ruby
def sing

  phrase1 = "ズン"
  phrase2 = "ドコ"

  if Random.rand > 0.5 then
    puts phrase1
    return phrase1
  else
    puts phrase2
    return phrase2
  end
end

room = [[1,0],[2,0],[3,0],[4,0],[4,5],[nil]]

i = 0

until room[i] == [nil] do
  if sing == "ズン" then
    i = room[i][0]
  else
    i = room[i][1]
  end
end

puts "き・よ・し！"
```

　まず、配列 room ですが、この room の添え字がそのまま部屋番号になります。0号室から5号室まで、全部で6つの部屋があります。
　次に、この部屋にはズンとドコのとびらがあります。i号室のズンのとびらは room[i][0] 、 ドコのとびらは room[i][1] です。
　そして、配列の各要素には移動先の部屋番号が書いてあります。例えば、4号室に居るときにズンのとびらを開いたら4号室にまた戻ってきます。ドコのとびらを開いたら5号室に移動します。最後の部屋にはこの部屋が最後だと示すためのnilを入れます。

※状態遷移図表

| 状態＼入力 | ズン | ドコ |
|:-:|:-:|:-:|
| 0 | 1へ移動 | 0へ移動 |
| 1 | 2へ移動 | 0へ移動 |
| 2 | 3へ移動 | 0へ移動 |
| 3 | 4へ移動 | 0へ移動 |
| 4 | 4へ移動 | 5へ移動 |
| 5 | 終了 | 終了 |

　こうすることで、ズンかドコを0回以上繰り返した後ズンを4回以上繰り返してからドコで終わる文だけを受け入れる決定性有限オートマトンが出来上がりました。



私：ところで、このプログラムは何が利点なの？
夫：超速い。あと、配列 room の中身だけ直せば他の文にも対応できる。君が書いたお話にはこのプログラムを取り入れることはできないだろうけど、こういうものもあるよと。
私：なるほど。



　私にとっては速さよりも本で学んだことが早速活かせたことが楽しかったです。
　ちなみに、この投稿は[自身のブログ](http://kze.hatenadiary.jp/entry/2016/09/14/233404)のほぼ転載です。ご了承ください。
iOS10でIDFAを取得できるか！？


## オプトアウトした端末のIDFAは取得できない？

__iOS10__ アップデート以降、`オプトアウトした端末のIDFAは取得できない`といった情報が、巷でまことしかやに囁かれている。
僕自身の __iOS10__ に端末をアップデートし、検証を試みた。

### 検証しみてる

__iOS9__ まではユーザが自身の端末上でオプトアウトしても、IDFAの取得自体は可能だった。
しかし、 __iOS10__ アップデート（2016年9月14日 日本時間2時）以降、有効なIDFAが取得できない。
もう少し詳細に書くと、 __文字列は取得できるが、一意のユーザーを表すものではない__。
実際に、オプトアウトした後に取得した値は、`00000000-0000-0000-0000-000000000000` というゼロパディングされた文字列が返ってきてた。

```
cf. ASIdentifierManager Overview 3.
Get the advertising identifier using the advertisingIdentifier property (note that when ad tracking is limited, the value of the advertising identifier is 00000000-0000-0000-0000-000000000000).

https://developer.apple.com/reference/adsupport/asidentifiermanager
```

### iOS端末でオプトアウトするための方法
[設定] - [プライバシー] - [広告] - 「追跡型広告を制限」 をオンにする

### まとめ

大抵の広告事業者は端末側でIDFAとオプトアウトフラグの両方を取得して、広告配信サーバへ投げているはず。
CV計測目的の場合、広告配信という目的の延長線上としてオプトアウトフラグの状態に関わらずIDFAを使用していると思われる。
たぶん、問題の焦点はこの世の中でオプトアウトしているユーザが何人いるのかによって、影響度合いが大きく変わるところだと思う。
FTPで特定のユーザに上位ディレクトリを見せないための設定

たとえば
user01が存在し、ホームディレクトリが
/home/user01
だとする。
FTP接続時のrootはuser01にしたい。
つまり、user01によるFTP操作は、ディレクトリuser01にのみ実施可能であり、
その他のディレクトリ（上位ディレクトリ）にはアクセスさせたくない場合。

vsftpd.conf に下記を追記する。そして vsftpdを再起動する。

    #anonymous_enable=YES
    anonymous_enable=NO
    chroot_local_user=YES
    allow_writeable_chroot=YES

なお、

	allow_writeable_chroot=YES

が抜けていると、下記のエラーが出て接続できないので注意。

    vsftpd: refusing to run with writable root inside chroot()
MySQLの外部接続の設定

#MySQLの外部接続の設定

外部の端末からMySQLに接続可能にするための設定。
忘れそうなのでメモ。
接続用のユーザは追加済み。

##環境

* Ubuntu Server 16.04 LTS
* MySQL-server 5.7

##設定

いくつかのサイトで、設定ファイルのbind-addressに接続端末のIPアドレスを追記するかコメントアウトするとあったが、設定ファイルmy.cnfにはbind-addressの記述はないし、my.iniは見当たらないし。
で、mysqld.cnfにそれらしき記述を発見。

mysqld.cnfを編集する

```
$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

43行目のbind-addressをコメントアウトする。

# bind-address = 127.0.0.1
```

MySQLを再起動

```
$ sudo service mysql restart
```

これで外部接続できたので、たぶんこれでいいのかな・・・？

以上
GitHubのProjects機能を使ってみました

GitHubのイベント「GitHub Universe 2016」にて、GitHubの新機能として[「Projects」](http://www.publickey1.jp/blog/16/githubprojectsgithub_universe_2016.html)が発表されました。
[ZenHub](https://www.zenhub.com/)というChrome Extensionとそっくり、という意見が多いようですが、自分はそれすら使ったことがなかったので純粋にProjects機能を使ってみることにしました。

## 何ができるか
**カンバン機能**です！ ([カンバンを知らない方はこちら](https://en.wikipedia.org/wiki/Kanban_board))
issueを一つのタスクとして管理し、それが今どのようなステータスであるかを視覚化することができます。
今までは大きな紙と付箋を用意してペタペタやるのが通例でしたが、この作業をGitHub上ですべて行うことができます。


## 早速やってみましょう
この機能ではProjectという単位でカンバンボードを1個管理することができます。
Projectの作成方法から始まり、issueを登録してカンバン上でうにょうにょ動かすところまでやってみようと思います。

## Projectの作成
GithubにProjectsというタブがあるのでクリックします。
タブに移動すると「New Project」というボタンがあるのでクリックします。
![53331a48aef4f798cd6d.png](https://qiita-image-store.s3.amazonaws.com/0/55807/0a8281fa-8bf0-28c2-6d57-65d9ca3c99b1.png)


プロジェクトのタイトル(Name)と概要を入力し、「Save project」をクリックするとProjectが作成されます。
![805015c1bdaf8cadfea1.png](https://qiita-image-store.s3.amazonaws.com/0/55807/025c4e39-9d5b-1eb8-8e08-cef5ea46015e.png)



## カラムの追加
プロジェクトが作成されると、カンバンの表示画面になります。
issueを登録する前に、今の状態ではただの真っ白なカンバンなので、まずはステータスを表す「column」を新規に追加します。
「Add column」をクリックし、columnの名前を入力すると作成することができます。
![434800408786ad8f0fe3.png](https://qiita-image-store.s3.amazonaws.com/0/55807/b4ce1110-3dda-7fa2-8e77-d3277bc1e948.png)
↑ Add columnをクリック   ↓ columnの名前を入力してcolumnを作成
![f140fc94fb45fa549d38.png](https://qiita-image-store.s3.amazonaws.com/0/55807/f021f66a-f063-8439-8686-3aa9c63cbe30.png)

こんな感じでcolumnを作成します。最初は最もシンプルな「TODO」「Doing」「Done」の3columsを作ってみます。
![42a67af0375bcec81679.png](https://qiita-image-store.s3.amazonaws.com/0/55807/c53b3259-1c18-78df-19db-4959a600bf8d.png)


## issueの登録
ここまでくればissueをカンバン上に反映させることができます。※ 予めissueが作成されていることが前提です。
画面右上の「Add cards」をクリックすると、そのリポジトリのissue一覧が出てきます。Projects上ではissueではなく、cardと呼ぶようですね。
そしてcardをを移動させたいcolumnまでドラッグ&ドロップするとカンバン上に反映させることができます。
![dowihoihwqoih.png](https://qiita-image-store.s3.amazonaws.com/0/55807/ccc45feb-f51a-a056-da02-a987b987d20b.png)

適当にいろいろ置いてみました。

![fiewhoifehwoifew.png](https://qiita-image-store.s3.amazonaws.com/0/55807/b9765953-dcb6-2916-6457-12309020496c.png)

別columnへの移動もドラッグ＆ドロップでできますし、issue側で登録してあるLabelやAssigneesもcard内に見やすく表示されています。
issueがCloseされているかどうかも一目で分かるのでいいですね。

こういったツールは一人でやってもあまり意味はないかもしれませんが、複数人での開発だと絶大な効果を発揮します！
issueとの連携がとてもシンプルで見やすく表示されているので、一度使ってみてはどうでしょう？
MySQLで新規ユーザを作成してパスワードを付与し、ユーザ名のDBを作成して全権限を与えるためのクエリ

下記の要件を実現するクエリ。
・user02 というユーザを新規作成する。
・0123 というパスワードを付与する。
・user02というデータベースを作成し、全権限を与える。

下記のクエリをrootで実行すればよい。

	CREATE USER 'user02'@'localhost' 
	IDENTIFIED WITH mysql_native_password;GRANT USAGE ON *.* TO 'user02'@'localhost' 
	REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
	SET PASSWORD FOR 'user02'@'localhost' = PASSWORD('0123');
	CREATE DATABASE IF NOT EXISTS `user02`;GRANT ALL PRIVILEGES ON `user02`.* TO 'user02'@'localhost';
FirebaseCrashとGoogle Play Services 9.6.80でアプリの起動が極端に遅くなる問題

# 問題 #
Firebase Crash Reportingを使用しているアプリの最新版をリリースしてPlayストアから落としてテストしていると起動が異常に遅い。
起動はするが、遅すぎて実質クラッシュ状態。起動できても、そこでクラッシュする。

# 原因 #
デバッグやテストでは問題がなかったが、コードのバグ探しを探していたら、クラッシュの原因はまさかのFirebase Crachでした。
クラッシュがクラッシュを起こしていた…

# 対策 #
下記リンクを見ると、Firebase Crash ReportingとGoogle Play Services 9.6.80(2016.9.15 現在最新版)の相性問題だった。
現状は以下のようにfirebase-crashをオフするしかなさそうです。

```build.gradle
compile "com.google.firebase:firebase-crash:${firebaseVersion}"

↓

// compile "com.google.firebase:firebase-crash:${firebaseVersion}"
```

Google Play Services の version up で直る予定みたいです。
Googleの対応を待ちましょう。

昨日リリースしてから気づいたので焦りました。
すでにリリースしているアプリでも、端末側のGoogle Play Servicesが最新版 9.6.80 になると発動するので、どデカイ爆弾です。

みんな、こういうCriticalな問題は華麗に回避しているのだろうか?
是非、教えてほしい

# 参考 #
[Firebase Status Dashboard]
(https://status.firebase.google.com/incident/Crash%20Reporting%20%28Beta%29/16003)

[Latest Google Play Services 9.6.80 cause “FirebaseCrash: Failed to initialize crash reporting” (stackoverflow)]
(http://stackoverflow.com/questions/39483150/latest-google-play-services-9-6-80-cause-firebasecrash-failed-to-initialize-cr)
[Firebase Crash produces ANR during launch (stackoverflow)]
(http://stackoverflow.com/questions/39480257/firebase-crash-produces-anr-during-launch)

[Latest version of Google Play services (9.6.80) causing problems (Google Group)]
(https://groups.google.com/forum/#!topic/android-developers/7qS2CoPqxnw)

[Firebase Crash Report Library crashes on Google Play Services 9.6.80]
(https://medium.com/@elye.project/firebase-crash-report-library-crashes-on-google-play-services-9-6-80-ad630f3b7012#.908te1q5e)
Visual Studio CodeでReactのIntellisense(コード補完)を有効にする

## セットアップ

* プロジェクトルートに `jsconfig.json` ファイルを作成して、以下の内容で保存

```
{
  "compilerOptions": {
    "target": "es6",
    "allowSyntheticDefaultImports": true
  },
  "exclude": ["node_modules"]
}
```

* Typingsをインストールしていない場合に実行
`$ npm install typings -g`

* プロジェクトルートでreactの型定義をインストール
`$ typings install dt~react dt~react-dom --global`

* Visual Studio Codeを再起動

## 動作確認 
* 適当にファイルを作成して入力補完が効くか確認

![](https://monosnap.com/file/ijMmcDg7RMvzYdCgp9aJ4GkuFHuIzz.png)
PHP5.6(CentOS7x64)にphpMyAdminをインストールする

前提：LAMPが構築されていること。

PHPのバージョンを確認する。

    php -v

    PHP 5.6.25 (cli) (built: Aug 31 2016 19:17:57)
    Copyright (c) 1997-2016 The PHP Group
    Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
        with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
    with Xdebug v2.4.1, Copyright (c) 2002-2016, by Derick Rethans
  
この環境ではバージョンが5.6なので、下記のコマンドを実行する。

    yum install -y --enablerepo=remi,remi-php56 phpMyAdmin

Apacheのバージョンを確認する。

    httpd -v

    Server version: Apache/2.4.6 (CentOS)
    Server built:   Jul 18 2016 15:30:14

この環境ではバージョンが2.4である。

設定ファイルを編集する。

    vi /etc/httpd/conf.d/phpMyAdmin.conf

    <IfModule mod_authz_core.c>
      # Apache 2.4
      # Require local
      Require all granted
    </IfModule>


Apacheを再起動する。

    systemctl restart httpd

http://サーバのIPアドレス/phpMyAdmin
にアクセスする。ログイン画面が表示されたら成功。
AndroidのRealm javaでデータの永続化ができないトラブルシューティング

まず下記設定内容で、やった場合に何故かデータが永続化されない。。

```build.gradle(app)

〜省略〜
apply plugin: 'realm-android'
〜省略〜

```

```build.gradle(project)

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.3'
        classpath "io.realm:realm-gradle-plugin:1.1.0"
    }
}
〜省略〜
```

```java:MainActivity.java

public class MainActivity extends AppCompatActivity {


    private Realm realm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Configure Realm for the application
        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();
        Realm.deleteRealm(realmConfiguration); // Clean slate
        Realm.setDefaultConfiguration(realmConfiguration); // Make this Realm the default

```

このRealmの設定情報で、適宜データを追加。


アプリを起動中はデータが存在するが、アプリを戻るなどで停止や、
クラッシュして停止し、
再度起動するとデータが　**０件。。。**

Realのサンプルソースとにらめっこして、
Realm.closeのタイミングをずらしたりしたが、関係なく。

色々やっていると、なんと。。
初回起動する際に指定するActivityが

```java:MainActivity.java

public class MainActivity extends AppCompatActivity {

```

で

```xml:AndroidManifest.xml
<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
```

と application:nameの指定がなく、
application:nameで指定するjavaファイルを
extends Applicationじゃない点を。
改善してみると。

なんと無事**永続化**!!!できました。汗
なんじゃこれｗ

## 下記のようにしたら**改善**されました。（泣）

```xml:AndroidManifest.xml

<application
        android:name=".MyApplication"  <!-- ←★ちゃんと指定 -->
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"

```

```java:MyApplication.java

import android.app.Application;

import io.realm.Realm;
import io.realm.RealmConfiguration;

// ★extends Applicationに！！★
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        // Configure Realm for the application
        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();
        Realm.deleteRealm(realmConfiguration); // Clean slate
        Realm.setDefaultConfiguration(realmConfiguration); // Make this Realm the default
    }
}

```


で、あとで気づいた。。
ちゃんと書いてあった。汗

https://realm.io/jp/docs/java/latest/#section-51
[gusuku] 帳票：文字列の連結について

# 課題

gusukuのExcel帳票プラグインは、kintoneアプリケーションのデータを使って、手元のExcelで帳票をお手軽に作成できる点がメリットです。

ですが、意外に「あれ、これどうやるの？」と悩む点もありまして、そんなTIPSを少しずつご紹介しています。

**今回は「文字列の連結」です。**

（Excel帳票プラグインはgusukuのオプションサービスです。詳しい情報は以下の公式サイトよりご確認ください。）



[![gusuku_logo.jpg](https://qiita-image-store.s3.amazonaws.com/0/133500/3a0f4bec-1475-e349-43c0-cd88056ea91b.jpeg ""gusuku_logo.jpg"")](https://gusuku.io)

[kintoneアプリケーション開発をサポートするプラットフォーム gusuku（グスク）](https://gusuku.io)

# 解決方法

[リファレンスマニュアル](https://docs.gusuku.io/plugin/xlsxp-reference/)にもあるように、1つのセルに

```
$(year)年$(month)月$(day)日
```

などと記述することが可能です。

~~**ただし、「西暦$(year)」という表記は利用できません。**~~

~~「$」から始まっていないので、マクロとして認識されないためです。~~

~~このような表記にしたい場合には、カラムを2つに分けて、右寄せで「西暦」左寄せで「$(year)」と言う形で作成すると、上手く表記できると思います。~~

お客様のご要望により、2016年9月28日のアップデートで指定した文字列がそのまま出力できるマクロが追加され、```$("西暦")$(year)```という記述で実現できるようになりました！

例えば、「【商品名】」のような出力も、 ```$("【")$(prodName)$("】")``` というマクロで表現できるようになりました。
ぜひご活用ください。


# まとめ

文字列連結が出来ると、大抵の帳票はレイアウトできるようになると思います。
ぜひお試しください！
Codeceptionの形式 Cept･Cestの違いと覚え方

# Cept? Cest?
Codeceptionでテストをジェネレートするときに
`generate:cept` と `generate:cest`を選ぶことができる。

なんだか名前が似ていて、よくわからない･･･ということで、双方をジェネレートしてみる。

手元にないのでうろ覚えですが、codeceptionのバージョンは2系だったと思います。

# Cept
```
$ php codecept.phar generate:cept api ceptSample
```

生成されたソース

```php:ceptSample.php
<?php 
$I = new ApiTester($scenario);
$I->wantTo('perform actions and see result');
```

プレーンPHPが生成される

調べているとよく遭遇するwebguyというメソッドは、上記ソースのApiTesterにあたるよう。（codeception 1系だと、webguy?）

# Cest
```
$ php codecept.phar generate:cest api cestSample
```

対してCestは、

```php:cestSample.php
<?php
class cestSampleCest
{
    public function _before(ApiTester $I)
    {
    }

    public function _after(ApiTester $I)
    {
    }

    // tests
    public function tryToTest(ApiTester $I)
    {
    }
}
```

クラス化されている。

# さいごに
公式リファレンスみたら書いてあるが、たびたび忘れるしよく打ち損じるので、

Cept の P は plain の **P**
Cest の S は simple の **S**

ということだけでもおぼえておきます。