OmniAICreator/Qiita-1.07M huggingface dataset:
Google Maps API で始める地理情報システム (WIP)


Google Maps API を使った実装に触れるにつき、地理情報システム (GIS) という言葉を覚えたので、なんとなくまとめる。基本的に web フロントエンド用なので JavaScript で色々アクセスするために必要な情報になると思う。


# とりあえず読んだ方が良さそうなヤツ

* [Converting GIS Vector Data to KML - Keyhole Markup Language — Google Developers](https://developers.google.com/kml/articles/vector)


# 地理データを扱うソフトウェア

## GDAL: Geospatial Data Abstraction Library

* [GDAL: GDAL - Geospatial Data Abstraction Library](http://www.gdal.org/)
* [DownloadingGdalBinaries – GDAL](http://trac.osgeo.org/gdal/wiki/DownloadingGdalBinaries)
* [Unix Compatibility Frameworks [KyngChaos Wiki]](http://www.kyngchaos.com/software:frameworks)

# 地理データを扱うフォーマット

## Shapefile (シェープファイル)

Shapefile は GIS ソフトウェアで一般的に使われる地理情報を扱うファイルフォーマット。esri (Environmental Systems Research Institute) がオープンな仕様として作成した。

1998 年の仕様改訂から、地理情報を扱う事実上の標準ファイルフォーマットとして非常に枯れたフォーマットとなっている。

* [ESRI Shapefile Technical Description (PDF)](https://www.esri.com/library/whitepapers/pdfs/shapefile.pdf)
* [Shapefile - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/Shapefile)

## GML: Geography Markup Language

GML は地理情報を扱う XML 表記を用いたファイルフォーマット。国際的標準化団体 Open Geospatial Consortium (OGO) によって策定された。

最後の改訂が 2007 年なので、後述の KML より枯れたフォーマットとなっている。

* [Geography Markup Language | OGC](http://www.opengeospatial.org/standards/gml)
* [Geography Markup Language - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/Geography_Markup_Language)

## KML: Keyhole Markup Language

KML は地理情報を扱う XML 表記を用いたファイルフォーマット。KML は、2004年 に Google に買収された Keyhole, Inc が作成したフォーマットであり、Google Earth という名称で知られる Keyhole Earth Viewer というソフトウェアで用いられたフォーマット。

KML は 2008 年に Open Geospatial Consortium (OGO) で国際標準として採択された。

* [KML Tutorial - Keyhole Markup Language — Google Developers](https://developers.google.com/kml/documentation/kml_tut)
* [KML | OGC](http://www.opengeospatial.org/standards/kml)
* [Keyhole Markup Language - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/Keyhole_Markup_Language)


## GeoJSON

GeoJSON は地理情報を扱う JSON 表記を用いたファイルフォーマット。

オープンスタンダートとして標準化団体を通さないインターネット上のワーキンググループを通して 2008 年に策定された。

* [GeoJSON](http://geojson.org/)
* [geojson.io](http://geojson.io/#map=3/29.61/75.94)
* [GeoJSON フォーマット仕様](http://s.kitazaki.name/docs/geojson-spec-ja.html)
* [GeoJSON - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/GeoJSON)

# 日本の地理情報の一次ソース

* 国土交通省: [GSI HOME PAGE - 国土地理院](http://www.gsi.go.jp/)
* 国土交通省: [国土数値情報ダウンロードサービス](http://nlftp.mlit.go.jp/ksj/index.html)
* 総務省: [統計局ホームページ/市区町村別メッシュコード一覧](http://www.stat.go.jp/data/mesh/m_itiran.htm)

# メモ

* http://matome.naver.jp/odai/2135883023685089601
Rails アプリから Fluent 経由で Bugsnag に送信する

「とりあえず、やってみました」という記録です。

- Fluent(d) 、呼び方すらよく分かってません
- Bugsnag、最近トライアル始めた程度の知見です
- gem、誰かに使ってもらう事を考えたリリースになってません
- 開発・実行環境
    - OSX 10.10.3
    - Rails 4.2.1
    - td-agent-2.1.4-0.dmg


## TL;DR

1. [koshigoe/logging-bugsnag](https://github.com/koshigoe/logging-bugsnag) で [TwP/logging](https://github.com/TwP/logging) を拡張
    - error 以上のログを [bugsnag/bugsnag-ruby](https://github.com/bugsnag/bugsnag-ruby) の deliver に渡す
1. [koshigoe/bugsnag-delivery-fluent](https://github.com/koshigoe/bugsnag-delivery-fluent) で [bugsnag/bugsnag-ruby](https://github.com/bugsnag/bugsnag-ruby) を拡張
    - deliver を拡張し Fluent に URL とリクエストボディを渡す
1. [koshigoe/fluent-plugin-bugsnag](https://github.com/koshigoe/fluent-plugin-bugsnag) で Fluentd から Bugsnag に送信する


## Fluent

### fluent-plugin-bugsnag

Fluent から Bugsnag へ送信するプラグイン [koshigoe/fluent-plugin-bugsnag](https://github.com/koshigoe/fluent-plugin-bugsnag) をインストールする。

```
$ sudo td-agent-gem install fluent-plugin-bugsnag
```

### td-agent.conf

[koshigoe/bugsnag-delivery-fluent](https://github.com/koshigoe/bugsnag-delivery-fluent) の利用を想定しているので、タグ `bugsnag.deliver` を対象に bugsnag プラグインを適用する設定を追加。

```
<source>
  type forward
</source>

<match bugsnag.deliver>
  type bugsnag

  # bugsnag_proxy_host localhost
  # bugsnag_proxy_port 8888
  # bugsnag_proxy_user user
  # bugsnag_proxy_password password
  # bugsnag_timeout 10
</match>
```

設定が用意できたら `td-agent` を起動。

```
$ td-agent -c td-agent.conf
```


## アプリケーション

Rails アプリを想定。

### Gemfile

```ruby
gem 'logging-rails'
gem 'logging-bugsnag'
gem 'bugsnag-delivery-fluent'
```

```
$ bundle install
```

### config/logging.rb

[TwP/logging-rails](https://github.com/TwP/logging-rails) を使うので、ジェネレータで設定ファイルを作成する。

```
$ rails generate logging:install
```

作成した `config/logging.rb` に以下を追記して bugsnag appender を使える様にしておく。

```ruby
Logging.appenders.bugsnag('bugsnag', level: :error) if config.log_to.include? 'bugsnag'
```

### config.log_to

`config/environments/production.rb` などで `config.log_to` に `'bugsnag'` を追加すれば `logger` に組み込まれる。

```
config.log_to = %w[file bugsnag]
```

### config/initializers/bugsnag.rb

アプリケーションから直接 Bugsnag に送信せず Fluentd に送信を任せるために、 `delivery_method` を `:fluent` とする。

```ruby
Bugsnag.configure do |config|
  config.api_key = ENV['BUGSNAG_API_KEY']
  config.logger = ActiveSupport::Logger.new(Rails.root.join('log/bugsnag.log'), 10, 100.megabytes)
  config.delivery_method = :fluent
  # config.fluent_tag_prefix = 'bugsnag'
  # config.fluent_host = 'localhost'
  # config.fluent_port = 24224
end
```

### 利用開始

ここまでで、捕捉してない例外と error 以上のログ出力が Fluent に送られ、Fluent で適宜 Bugsnag に送信される様になる。

```
$ rails c
> Rails.logger.error('TEST TEST TEST')
> Bugsnag.notify(RuntimeError.new('TETETETE TEST'))
```
はじめてシェルを書いたときにつまずいた所

# 文字列に関して
【つまずいた点】
変数が文字列として認識されてしまう

【解決策】

```sh
×　'fuga=$hoge'
○　"fuga=$hoge"
```
''で囲うのではなく""($を評価してくれる)で囲う

# mongoに関して
【つまずいた点】
mongoにjsのスクリプトを流すとき

```sh
mongo collectionName hoge.js arg
```
という書き方だとjsファイルに引数argが渡せない（failed to load: arg）
　
【解決策】
mongoの--evalオプションを使う

```sh
mongo collectionName --eval "INPUT='$CODE'" hoge.js
```

こうすれば、INPUTという変数がhoge.jsの中で使える。
--eval: 引数をJSとして評価してくれるオプション

# nodeに関して
【つまずいた点】
シェル上でnodeを実行したいけど、nodeコマンドをだけだと対話モードになるので、例えば以下のような書き方はダメ

```sh
×　node JSON.stringify($data)
```

【解決策】
ヒアドキュメントを使う

```sh
node << EOS
     JSON.stringify($data);
EOS
```
<< EOS　が渡されると、次のEOSまでの間が標準入力として扱われる

# ヒアドキュメントに関して
【つまずいた点】
ヒアドキュメント内で出力された内容をファイルに出力したい
【解決策】

```sh
node << EOS > file.txt
     var json =JSON.stringify($data);
     console.log(json);
EOS
```
2個目のEOSの後だと次のコマンドとして扱われてしまうので気をつける
MacOSXでgo lang設定。

MacOSXでgoをインストールしためも。

IntelliJ IDEA Community Edition.
https://www.jetbrains.com/idea/
無料です。

~~~
brew install go
~~~

~~~ lang:.zshrc
export GOPATH=$HOME/Work/go
export GOROOT=/usr/local/opt/go/libexec
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin
~~~

IntelliJのgolangプラグイン。
![スクリーンショット 2015-04-23 21.35.51.png](https://qiita-image-store.s3.amazonaws.com/0/9907/0c507407-a8d4-b322-f07b-fe39330a5296.png)

設定。
![スクリーンショット 2015-04-23 21.32.59.png](https://qiita-image-store.s3.amazonaws.com/0/9907/6114b971-26de-aebb-d89b-c4d9cce3177d.png)
![スクリーンショット 2015-04-23 21.32.32.png](https://qiita-image-store.s3.amazonaws.com/0/9907/c9dd2869-1186-85c9-d76e-b5833680a5d7.png)
![スクリーンショット 2015-04-23 21.32.45.png](https://qiita-image-store.s3.amazonaws.com/0/9907/3ab16063-1d2a-12f0-9b92-8db1a2dfb08e.png)
Dockerfileの中での apt-get update / apt-get install の不整合

# こんなことありませんか

`Dockerfile` からのbuildを行っていて

```
E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/m/mysql-5.5/mysql-client-core-5.5_5.5.41-0ubuntu0.14.04.1_amd64.deb: 404  Not Found [IP: 91.189.91.24 80]
```

と表示され、「そんなはずはない！俺はちゃんとapt-get updateしてる！ほら見ろ！」

```:Dockerfile
FROM ubuntu:14.04

RUN apt-get update -q -y
RUN apt-get install -y build-essential curl nginx 
(略)
RUN apt-get install -y mysql-client
```

# 解決策
dockerのキャッシュを破棄するしかない気がします。

`docker build --no-cache .`

# 原因
`apt-get update` をした時点でのパッケージの情報が記録されたイメージを、月日が経ってからキャッシュとして利用したため。`RUN apt-get install -y mysql-client` を実行した時点でのレポジトリとの構成が不整合になっている。

# 追記

```
The following packages have unmet dependencies:
 build-essential : Depends: libc6-dev but it is not going to be installed or
                            libc-dev
                   Depends: g++ (>= 4:4.4.3) but it is not going to be installed
 libbz2-dev : Depends: libc6-dev but it is not going to be installed or
                       libc-dev
 libcurl4-gnutls-dev : Depends: libc6-dev but it is not going to be installed or
                                libc-dev
                       Depends: libgnutls-dev but it is not going to be installed
                       Depends: libkrb5-dev but it is not going to be installed
                       Depends: librtmp-dev but it is not going to be installed
                       Depends: zlib1g-dev but it is not going to be installed
 libfreetype6-dev : Depends: libc6-dev but it is not going to be installed or
                             libc-dev
                    Depends: zlib1g-dev but it is not going to be installed or
                             libz-dev
 libjpeg-dev : Depends: libjpeg8-dev but it is not going to be installed
 libmysqlclient-dev : Depends: zlib1g-dev but it is not going to be installed
 libpng12-dev : Depends: zlib1g-dev but it is not going to be installed
 libssl-dev : Depends: libssl1.0.0 (= 1.0.1f-1ubuntu2) but 1.0.1f-1ubuntu2.11 is to be installed
              Depends: zlib1g-dev but it is not going to be installed
              Recommends: libssl-doc but it is not going to be installed
```

こちらも同様の原因と対処となりますので、よろしくご査収お願いします。
Drupalでパンくずリスト調査メモ


## まとめ

あとで調べてから書く


## ガイド
- [Content Display Modules](https://www.drupal.org/node/206776 "Content Display Modules")
	- [Crumbs, the breadcrumbs suite](https://www.drupal.org/node/1004394 "Crumbs, the breadcrumbs suite")
	- [Custom Breadcrumbs: Customizing the breadcrumb trail](https://www.drupal.org/node/228955 "Custom Breadcrumbs: Customizing the breadcrumb trail")
	- [Path Breadcrumbs](https://www.drupal.org/node/2061939 "Path Breadcrumbs")

## 比較

- [Comparison of contributed modules](https://www.drupal.org/node/266179 "Comparison of contributed modules")
	- [Comparison of Breadcrumb Customizing modules](https://www.drupal.org/node/533448 "Comparison of Breadcrumb Customizing modules")


## モジュール(ユーザの多い順)

- [Menu Breadcrumb](https://www.drupal.org/project/menu_breadcrumb "Menu Breadcrumb")
- [Crumbs, the Breadcrumbs suite](https://www.drupal.org/project/crumbs "Crumbs, the Breadcrumbs suite | Drupal.org")
- [Path Breadcrumbs](https://www.drupal.org/project/path_breadcrumbs "Path Breadcrumbs | Drupal.org")
	- 良さそうだけど、[jQuery Update](https://www.drupal.org/project/jquery_update "jQuery Update")と相性悪い様子で悩み中
- [Easy Breadcrum](https://www.drupal.org/project/easy_breadcrumb "Easy Breadcrumb | Drupal.org")
AWSマネジメントコンソールをこれまで通り英語で使い続ける方法

# 【問題】AWSが急に日本語になった！
久しぶりにManagement Console開いたら日本語になっていて違和感たっぷり。

![スクリーンショット 2015-04-23 21.32.34.png](https://qiita-image-store.s3.amazonaws.com/0/38528/5979e7b3-822b-1067-c143-4e1f5f3fd7f8.png)

アドリブで英語に戻そうと思ったのですが、意外とぱっと見渡して切り替えれそうなところがなかった為グーグル先生の力を借りることとなりました。

# 【解決】言語切替方法
![スクリーンショット 2015-04-23 21.31.54.png](https://qiita-image-store.s3.amazonaws.com/0/38528/b635af91-3a0f-4115-be52-f10bbae59e80.png)
「灯台下暗し」とはこのことでしょうか。左下に言語切替メニューがありました。「上のメニューのどこかにあるだろう」という先入観にやられました。[こちら](http://aws.typepad.com/aws_japan/2015/04/mgmt-console-japanese.html)のブログでもちゃんと書かれています。
最近のRealmの動向 (from Realm meet up #2)

4月23日に開催された Realm meet up #2 に行ってきました。
主催の岸川さんによる Recent Updates の内容を共有します！

![IMG_6535.JPG](https://qiita-image-store.s3.amazonaws.com/0/6102/d3155c39-e6b6-a7b0-5b7b-307b34f0af77.jpeg)


# Realm meet up #2
日時: 2015年4月23日 19時〜
＠Sansan株式会社 (いつも会場提供ありがとうございます！）

## Recent Updates

* スピーカー: 岸川さん
  * @kishikawakatsumi さん
  * 3月からRealmのCocoaチームにJoin
    * 「WWDC行かれる方は現地でお会いしましょう」

## Javaのおはなし
* Realm Java 0.80.1 出た。
  * つい先週。
    * マイナーバージョンアップである。
    * 同梱されているRealmコアのバージョンアップがおこなわれた。
      * それにより、
        * ソートのパフォーマンスと文字列のインサート速度改善。
        * RealmQuery に isNull() と isNotNull() メソッドが追加。
          * リレーションに対してのみ有効。それ以外のデータ型はNULLサポート完了後。
        * Realm.deleteRealmFile(File)メソッドが追加。
          * トランザクションとかロックファイルとかよしなに。

   * バグフィックスもいくつか
     * Realm.createOrUpdateWithJson()のバグ
        * https://github.com/realm/realm-java/issues/933
     * ARM64用バイナリが正しく同梱されるように。


## uPhyca/stetho-realm のおはなし

* Stetho なかで動くRealm のモジュール
  * https://github.com/uPhyca/stetho-realm
  * Android向け開発ツール。Mac版のRealmブラウザみたいなやーつ。

## Realm Cocoa のおはなし
* Realm Cocoa 0.91.3 出た。
  * RLMCollection (RLMResultsとRLMArray) でKVCサポート
  * ソートのパフォーマンスが改善
  * 文字列またはNSDataを他のスレッドから書き込んだ際の、RLMRealmの更新速度が向上。
  * インデックスの追加。削除が既存のカラムについても行われるように。

* KVCについて
  * RLMCollection supports collection KVC operations
    * 検索結果をアップデートするときはループで回しながらオブジェクトを while ループし、オブジェクト一つ一つにプロパティをセットしていた。
![IMG_6537.JPG](https://qiita-image-store.s3.amazonaws.com/0/6102/7923f497-80ed-d4b5-0860-83df392cb229.jpeg)
    * KVCサポートにより下記の1行で全て結果に対しプロパティに値をセットできるに。
![IMG_6538.JPG](https://qiita-image-store.s3.amazonaws.com/0/6102/1c0c2cdb-7ce3-22de-e1c8-200e0b8a465e.jpeg)

* NULL Support BETA！
   * あくまでもベータ版。正式版には含まれていない。
   * Coreを入れ替えることによってNULL Support BETAが使用できる。
   * ※まだNULLが格納できるわけではない。準備段階。みんな協力を！
   * ベータテストに協力するにあたって
     * 実際のアプリケーションでテストすべし。
     * 問題があったりおかしな動作に気付いたら教えて。
     * 次のステップに進むためにベータへの協力お願い！


* Realm Swift (Soon!)
![IMG_6539.JPG](https://qiita-image-store.s3.amazonaws.com/0/6102/4b9ae546-06a4-7bad-73c0-fcb1b50bf43f.jpeg)

   * もうまもなくリリース！(来週くらいから使用できる！？)
   * Objective-C互換のメソッド名ではなくSwiftっぽい簡潔なメソッド名。
   * Typeセーフで一貫したAPIが使用できる！

```
let realm = Realm()
realm.write {
   realm.create(Personself, value: ["Jaho"…])
}

```

## Next Meetup
 * 5/21
 * 19:00〜
 * Sansan株式会社


オーストラリアからコア開発チームの Time Oliver さんが来てました。
自販機で後ろに並んでたら流暢な日本語とともに「すみません。。」って腰低く戻って行っちゃいましたｗ


次回もよろしくお願いします！
[Android][Java] Hello Worldを調べる

# MainActivity.java

## メモ

* ```ActionBarActivity```を継承。
* メソッドは3つ。
 * protected void onCreate(Bundle savedInstanceState)
 * public boolean onCreateOptionsMenu(Menu menu)
 * public boolean onOptionsItemSelected(MenuItem item)

## 処理の流れ

### 起動時

```Text:logcat
I/System.out﹕ [MainActivity#onCreate] enter : savedInstanceState=null
I/System.out﹕ [MainActivity#onCreate] exit
I/System.out﹕ [MainActivity#onCreateOptionsMenu] enter : menu=android.support.v7.internal.view.menu.MenuBuilder@422b3240
I/System.out﹕ [MainActivity#onCreateOptionsMenu] exit
```

### メニューから```Settings```を選択

```text:logcat
I/System.out﹕ [MainActivity#onOptionsItemSelected] enter : item=Settings
I/System.out﹕ [MainActivity#onOptionsItemSelected] exit(1)
```

# その他のオーバーライド

## onBackPressed
```java:MainActivity.java
    @Override
    public void onBackPressed() {
        System.out.println("[MainActivity#onBackPressed] enter");
        super.onBackPressed();
        System.out.println("[MainActivity#onBackPressed] exit");
    }
```

バックボタンを押すと、

```text:logcat
I/System.out﹕ [MainActivity#onBackPressed] enter
I/System.out﹕ [MainActivity#onBackPressed] exit
```

* superを呼び出さないようにすればバックボタンが無効化される。

# あとがき

ボチボチやっていきます。
Cocos2d-x3.5にしたらEclipseでビルドするのに必要な情報が増えた


cocos2d-xのバージョン3.5のプロジェクトを作成後、
Eclipseでビルドするのに必要な情報が変わりました

Eclipse > C++ > Build > Environmentにて設定するものが変わりました

以前では

<font color="red">
NDK_ROOT
</font>

だけでよかったのですが、次のバージョンからは

<font color="red">
NDK_ROOT
ANDROID_SDK_ROOT
PATHに$COCOS_CONSOLE_ROOTのパスを追加
ANT_ROOT
</font>

を設定しなければいけなくなりました。
PATHについてはselectより追加して編集してください。それ以外はAddしてください。


<h3>Why??</h3>

<h4>Answer : 従来のbuild_native.pyが非推奨になり、cocosコマンドが推奨されるようになったから</h4>

そのため、プロジェクトのBuildのコマンドが

```terminal:

python ${ProjDirPath}/build_native.py -b release

```

から


```terminal:

cocos compile -p android -m release

```

に変更しなければなりません。

#追記
後半のコマンドの変更はしなくても実行できるみたいなのでしなくてお大丈夫です！
vagrant destroyを誤って実行してVMが破棄されるのを防ぐ

Vagrantは仮想マシンをすぐ作ってすぐ廃棄してすぐ作り直す、なんてことがとてもやりやすいのが利点ではあるが、作った仮想マシンのうちいくつかはしばらく廃棄せず維持しなければならないことも当然良くあることである。

そんな状況で、破棄すべき仮想マシンのVagrantfileが置かれたディレクトリでvagrant destroyを打つのを何度も繰り返しているうちに、誤って廃棄してはならない仮想マシンのVagrantfileがあるディレクトリでvagrant destroyを実行したりしそうになったり、なんてこともあるかもしれない。

そこでvagrant destroyを誤って実行してVMが破棄されるのを防ぐには、Vagrantfileの最初の方にvagrant destroyを阻止するコードを追加してやれば良い。

```rb:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

if ARGV.include?('destroy')
  puts 'vagrant destroy is not allowed'
  exit 1
end

（以下省略）
```

これでもうこのVagrantfile下ではvagrant destroyは通らないので、恐怖に怯えることなく他でvagrant destroyを実行することができる。

もし本当にvagrant destroyを実行すべき時がやってきたら、このif-endを取り除いてからvagrant destroyをすることになる。

また、これを応用すればvagrant haltも禁止とか、Vagrantfileで複数VMを管理しているがそのうち1台だけdestroyされると困る場合とかの処理も書くことができるだろう。
GTMにおけるレイヤー変数の導入方法

GoogleTagManagerでGoogleAnalyticsのトラッキングをたたく場合、
特定の変数をクエリパラメータに埋め込みたいという要望があるかと思います。

そんなときに便利な**レイヤー変数**の導入方法について、簡単にまとめてみたのでメモしておきます。

#GTM側の設定

##コンテナを選択

[Google タグマネージャ公式サイト](http://tagmanager.google.com) からログインし、自分のアカウントにアクセスしてください。

ここでは、GTMのバージョン２の管理画面で説明していきます。

上部タブからコンテナを選択します。

![qiita_gtm_9.png](https://qiita-image-store.s3.amazonaws.com/0/71629/6d0b0661-93d2-b7ee-75dd-dba179eda67e.png)

##レイヤー変数の定義

レイヤー変数として扱う変数を定義します。
左側のペインから`変数`をクリック

![qiita_gtm_5.png](https://qiita-image-store.s3.amazonaws.com/0/71629/a73d9dd3-1db0-c273-8fa8-a7299457e34d.png)

下の方にあるユーザー定義変数から`新規`をクリック
![qiita_gtm_6.png](https://qiita-image-store.s3.amazonaws.com/0/71629/6659a17c-dc1d-7741-a44d-e6ae8e33f6d1.png)


ここで、変数名は自由につけられます。（今回は`dltest`としました）

続いて`種類を選択`から`データーレイヤーの変数`を選択
`データレイヤーの変数名`を設定（今回は`dltest`としました）

データレイヤーのバージョンですが、今回はシンプルなバージョン１を使います。

![qiita_gtm_8.png](https://qiita-image-store.s3.amazonaws.com/0/71629/c53f3d7a-25cf-56ca-8250-216abad4274c.png)

タグ名は自由に設定できます。（`dltest`としました）
最後に`変数を作成`をクリックしてください。

これで変数の定義はできました。あとは使うだけです。

##データレイヤー変数をタグから使用する

ゼロからタグを作成します。
左側のペインから`タグを選択。

![qiita_gtm_1.png](https://qiita-image-store.s3.amazonaws.com/0/71629/4a11ed3e-cb5d-fe8a-e3de-60a9834a50d6.png)

右側のペインから新規をクリック。
タグ名は自由につけられます。（今回はGA_TESTとしました）
今回はGoogle Analytics（ユニバーサルアナリティクス）を使うので、以下のように選択。

1.Google Analytics を選択
2.ユニバーサルアナリティクスを選択

続いて測定したいGAのトラッキングコードを貼付けます。
PV計測をしたいので、トラッキングタイプはページタイプにします。

こんな感じになるかと思います。

![qiita_gtm_2.png](https://qiita-image-store.s3.amazonaws.com/0/71629/0475663d-348a-bc0b-1a73-d48d496c5338.png)

その他の設定、設定するフィールドと順に開き、`+フィールド`と書かれているボタンをクリックします。すると以下のような画面になったかと思います。

![qiita_gtm_3.png](https://qiita-image-store.s3.amazonaws.com/0/71629/309d7114-747b-e112-ba45-4b8172631d12.png)

ここで、フィールド名には送信したいクエリパラメータのkeyを指定、値にはvalueを指定します。
フィールドパラメータの先頭には&を付加してください。でないとうまく計測されません。

さて、ここで送信するvalueに、先ほど定義したレイヤー変数を使いたいので、
値の右の +ボタンをクリックし、出てくるモーダルから先ほど定義した変数名を選択します。すると以下のようになります。

![Screen Shot 2015-03-30 at 0.28.44.png](https://qiita-image-store.s3.amazonaws.com/0/71629/6f3c0d64-1ecb-1567-6ad9-97e7f38e94c4.png)

今回はページロード時にトラッキングを送信するので、`すべてのページ`を選択します。
最後に`タグの作成`をクリック。これでGTM側の設定は終了です。
作成したタグは右上の`公開`ボタンから公開しましょう。

![Screen Shot 2015-03-30 at 0.30.43.png](https://qiita-image-store.s3.amazonaws.com/0/71629/f87cef3d-7256-8184-45f3-9818aea62d35.png)

注）SPA（Single Page Application）などの場合、`すべてのページ（ All Pages）`ではファーストランディング時しかトラッキングされません。この場合は自分でトリガーを設定して任意のイベント時にトラッキングするように設定が必要です。


##ソース側の設定

dataLayerにpushする時にパラメータを追加します。
トラッキングを行うページに以下のようなタグを設定します。
注）GTMワンタグよりも前に宣言してください。

```js
<script type="text/javascript">
  window.dataLayer = window.dataLayer || [];
  dataLayer.push({
    'dltest': 'hogehoge'
  });
</script>
```
これでdataLayerに値がpushされます。

## 確認
ページリロード時に、以下のようなリクエストが飛んでいれば成功です。
`http://www.google-analytics.com/collect?...&dltest=hogehoge...`

レイヤー変数の値さえ送ってしまえば、GTMの設定次第で、計測するパラメータを変更できるので、色々試してみると良いと思います。
cassandra でインクリメントしたい

# 一言まとめ

`counter` 型を使いましょう。

# 説明
## increment/decrement したい

よくある例だと、PVとかツイート数とかお気に入り数とか。
単純に数を保持しているだけのカラムがほしいことってよくありますよね。

例えば、以下のようなテーブル（ColumnFamily）を作ります。

```
CREATE TABLE page_view_counts(
  pv int,
  url_name varchar,
  page_name varchar,
  PRIMARY KEY (url_name, page_name)
);
```

はい、そこの MySQL に慣れてるあなた。
以下のようなクエリ書けばいいじゃんって思いましたか？

```
UPDATE page_view_counts
 SET pv = pv + 1
 WHERE url_name='www.datastax.com' AND page_name='home';
```

甘いです。CQLはそんなに優しくないです。

```
UPDATE page_view_counts SET pv = pv + 1 WHERE url_name='www.datastax.com' AND page_name='home';
-> Bad Request: Invalid operation (pv = pv + 1) for non counter column legion
```

怒られちゃうんですね。
これでは、 `pv` をインクリメントするためだけにわざわざ現在の `pv` を `select` してやる必要があります。
 

そこで、エラーメッセージにも出てるように `counter` というデータタイプを使いましょう。

```
CREATE TABLE counterks.page_view_counts(
  pv counter, // コレ
  url_name varchar,
  page_name varchar,
  PRIMARY KEY (url_name, page_name)
);
```

もう一度。

```
UPDATE page_view_counts SET pv = pv + 1 WHERE url_name='www.datastax.com' AND page_name='home';
-> OK
```

# 参考

http://docs.datastax.com/en/cql/3.0/cql/cql_using/use_counter_t.html
単一テーブル継承を使った Model の FactoryGirl 定義方法

[単一テーブル継承](http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class-ActiveRecord::Base-label-Single+table+inheritance) を利用している以下のような Model が存在しているとします。

```app/models/user.rb
class User < ActiveRecord::Base
end
```

```app/models/girl.rb
class Girl < User
end
```

```app/models/boy.rb
class Boy < User
end
```

この場合 FactoryGirl は以下のように定義します。

```spec/factories/users.rb
FactoryGirl.define do
  factory :user do
    name 'Anonymous'
    age  18
  end
end
```

```spec/factories/girls.rb
FactoryGirl.define do
  factory :girl, parent: :user, class: 'Girl'
end
```

```spec/factories/boys.rb
FactoryGirl.define do
  factory :boy, parent: :user, class: 'Boy'
end
```

これでサブクラスのオブジェクトを正しく生成できます！

```rb
FactoryGirl.build(:girl, name: '戦場ヶ原ひたぎ')
#=> #<Girl:0x00000000000000 name: "戦場ヶ原ひたぎ", age: 18, type: "Girl">
```

ポイントは以下の 2 つです。

1. サブクラスの factory の parent オプションでスーパークラスの factory を指定すること。
2. サブクラスの factory の class オプションで自身の class を指定すること。  
  * これがないと Factory.build(:girl) や Factory.create(:girl) の返り値がスーパークラスの型 (この例では User 型) になってしまいます。
Amazon Web Services(AWS) のEC2でインスタンスをコピーする方法

# AWS使い始めて
業務命令でAWSを使い始めて、3時間目ｗ。インスタンスのコピーどうやるんだろう？って調べてみた。

# インスタンスのコピー
日本語でAWSマネジメントコンソールが利用可能(2015/04/22から)になっていたので自分備忘録ですｗ。ほんと最近すぐに物忘れするのでこういうメモは、必要だよねｗ

kvm のようにちょっと面倒かと思ったらそうでもなく、インスタンス元をベースにして高パフォーマンスのインスタンスを生成するとか簡単にできるので、CPUによって処理コストがどれくらい違うとかとか色々遊べそう。
ちなみに、Elastic IP は当然引き継がれないので別途設定する必要があります。

## AMI作成
EC2ダッシュボードをまずは選択します。で、左のメニュー「インスタンス」を選択し、コピーしたいインスタンスを選択します（インスタンスは、停止しておいたほうがよい）。
アクションのプルダウンメニューから、「イメージ」-「イメージの作成」をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/44540/a57ba821-23ad-4030-71f9-a981d1e4717a.png)

AMIの情報を入力するポップアップが表示されるので、イメージ名・イメージの説明（漢字不可）を指定します。イメージ名は、適当でもいいけど「インスタンスID-backup」みたいな感じで付けておくと分かりやすいと思います。
あと「再起動しない」にチェックをつけること。

![image](https://qiita-image-store.s3.amazonaws.com/0/44540/d9de8871-0153-7cf9-9dbe-052b431141f6.png)

問題なければ、「イメージの作成」をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/44540/6b56b86b-f114-3663-8fcb-b440d10c4b3d.png)

## AMI確認

閉じるをクリックします。左のメニュー「AMI」を選択し、ステータスを確認します。pending 状態から available に状態が遷移するまで待ちます。

![image](https://qiita-image-store.s3.amazonaws.com/0/44540/3aa00bdd-7446-f9e0-d455-19f6840f8344.png)

## AMIからインスタンスを作成

![image](https://qiita-image-store.s3.amazonaws.com/0/44540/a66c66e2-cdf9-6d51-0162-813ea4c2cdff.png)

available に状態が遷移したらAMIイメージを選択し「作成」をクリックします。
AMIを元にしてインスタンスを新規に作成するので、ここは新規インスタンスを作るのと同じ作業感覚で進めます。
高スペックタイプにするとか、ここで指定することができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/44540/8ac9991d-5631-6a6c-ef29-78a8b24a1b55.png)

インスタンス名をここで指定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/44540/1028b922-563d-930e-e32f-8d4594812365.png)

セキュリティグループをインスタンス元のグループと同じにします。
問題が無ければ「確認と作成」をクリックします。あとは、インスタンスを作成するときと同じなので省略ｗ

![image](https://qiita-image-store.s3.amazonaws.com/0/44540/6f46c5aa-b47f-7eda-551e-7f2c9c187fc8.png)
CakePHP 3.x 基本ディレクトリ構成


 * 運用を他人にぶん投げる時のためのメモです。

```
├── bin               -- 実行コマンド群。
├── config            -- 設定ファイル（DB接続関連等）
├── logs              -- ログ出力場所
├── plugins           -- プラグインパッケージ保存先
├── src               -- 開発拠点
│   ├── Console       
│   ├── Controller    -- コントローラ
│   │   └── Component -- コンポーネント
│   ├── Model         -- モデル
│   │   ├── Behavior  -- ビヘイビア
│   │   ├── Entity    -- エンティティ
│   │   └── Table     -- テーブル
│   ├── Shell         -- HogeShellファイル群
│   ├── Template      -- ビューテンプレート
│   └── View
│       └── Helper
├── tests             -- テストケース設置場所
├── tmp               -- テンポラリ
├── vendor            -- 外部ライブラリ等設置場所
└── webroot           -- Web公開ディレクトリ
```

## 運用で必要なチェック箇所

 * config
 * logs

## 不具合調査で必要なチェック箇所

 * config
 * logs
 * src (UI上のエラー発生時。主にController/Model/Template)
  * Model以下がEntity/Tableに分離したことに注意 
  * ViewではなくTemplateに移ったことに注意 
 * webroot (HTML/JavaScriptの不具合の可能性が高い場合)
 * src/Console (crontab等、コンソールでのエラー発生時)
EBS上に論理ボリュームの作成・削除

# 論理ボリュームの作成

## 事前準備

```bash
$ sudo apt-get update
$ sudo apt-get install lvm2
```

## 論理ボリューム作成

```bash
$ sudo pvcreate /dev/xvdf
$ sudo pvcreate /dev/xvdg
$ sudo pvscan
$ sudo vgcreate vg1 /dev/xvdf /dev/xvdg
$ sudo pvscan
$ sudo vgs
$ sudo lvcreate -L 39.99G -n lv1 vg1
$ sudo lvscan
$ sudo mkfs -t ext4 /dev/vg1/lv1
$ mount
$ sudo mkdir /ebs
$ sudo mount /dev/vg1/lv1 /ebs
$ df -h
$ cat /etc/fstab
$ sudo vi /etc/fstab
```


## 論理ボリューム追加

```bash
$ sudo pvcreate /dev/xvdh
$ sudo pvscan
$ sudo vgextend vg1 /dev/xvdh
$ sudo vgs
$ sudo lvextend -l +100%FREE /dev/vg1/lv1
$ sudo lvscan
$ df -h
$ sudo resize2fs /dev/vg1/lv1
$ df -h
```

## 論理ボリューム削除

```bash
$ sudo vi /etc/fstab
$ sudo umount /ebs
$ sudo e2fsck -f /dev/mapper/vg1-lv1
$ sudo resize2fs /dev/mapper/vg1-lv1 40G # 整数値じゃないとNG？
$ sudo lvreduce -L -20G /dev/mapper/vg1-lv1
$ sudo vgdisplay -v #confirm
$ sudo vgreduce vg1 /dev/xvdh
$ sudo vgdisplay -v #confirm
$ sudo pvremove /dev/xvdh
$ sudo fdisk /dev/xvdh
```

##### 1. 自動マウントの解除

```
$ sudo vi /etc/fstab
```

##### 2. アンマウント

```
$ sudo umount /ebs
```

マウントが解除された事を確認。

```
$ df -h
```


##### 3. ファイルシステムのチェック

```
$ sudo e2fsck -f /dev/mapper/vg1-lv1
```

※ここ大事

##### 4. ファイルシステムのサイズ変更

```
$ sudo resize2fs /dev/mapper/vg1-lv1 40G # 整数値じゃないとNG？
```

##### 5. 論理ボリュームのサイズ変更

```
$ sudo lvreduce -L -20G /dev/mapper/vg1-lv1
```

##### 6. 論理ボリュームをボリュームグループから外す

```
$ sudo vgreduce vg1 /dev/xvdh
```

##### 7. 物理ボリュームの削除

```
$ sudo pvremove /dev/xvdh
```

## 参考

http://masa21kik.hateblo.jp/entry/2014/05/19/005724
http://www.akiyama.co/pc-blog/entry/entry34.php
http://l-w-i.net/t/fedora/lvm_002.txt
AsReader用ライブラリをCocoaPodsで公開するまで

## はじめに
株式会社アスタリスクでは、iPhone/iPod Touchで使える {barcode | RFID} スキャナー AsReaderをリリースしました。SDK自体は、自社ページで公開していますが、便利なラッパークラスを提供したかったのと、何よりPodFileを用意してターミナルから１行コマンドを実行するだけで準備できるのがうれしい。

[ASRManager の CocoaPods](https://cocoapods.org/pods/ASRManager)
[ASRManager の Github](https://github.com/asx-co-jp/ASRManager)
[AsReaderの紹介](http://asreader.jp/)
## テンプレートから作る
次のコマンドを入力します。
`pod lib create MyLibrary`
MyLibraryはライブラリ名を入力して下さい。

途中で色々と質問されるので回答していきます。
このコマンドを実行すると CocoaPodsが推奨するテンプレートが作成されて
自動でXcodeが起動してプロジェクトが開きます。

## デモプロジェクトを作る
テンプレートで作成されたプロジェクトに、CocoaPodsで公開予定のライブラリを使ったデモアプリを作成していきます。
Exampleディレクトリに作成されます。

## 公開予定ファイルの設置場所
ASRManagerの場合は、Example/Pods/Classesディレクトリを作成して公開予定のファイルを置きました。
デモアプリはここに設置したファイルを使用するようにしました。

## PodSpecを作成する
既に作成されている MyLibrary.podspec を修正します。
ASRManager の場合はこうなってます。

```lang:ASRManager.podspec
Pod::Spec.new do |s|
  s.name             = "ASRManager"
  s.version          = "0.1.10"
  s.summary          = "ASRManager make app easier to use AsReader."
  s.homepage         = "https://github.com/asx-co-jp/ASRManager"
  s.license          = 'MIT'
	s.author           = { "Asterisk.inc Technical Team" => "tech@asx.co.jp" }
  s.source           = { :git => "https://github.com/asx-co-jp/ASRManager.git", :tag => s.version.to_s }
  s.platform     = :ios, '7.0'
  s.requires_arc = true
  s.source_files = 'Example/Pods/RcpLib/*.{h,mm}'
  s.ios.vendored_library = 'Example/Pods/RcpLib/libAreteUart.a'

  s.resource_bundles = {
    'ASRManager' => ['Pod/Assets/*.png']
  }
  s.frameworks = 'ExternalAccessory'
end
```
特に難しいところはないと思いますが。。。
ここでハマってしまったのが、公開ライブラリ自体が .a のようなライブラリを含んでいる場合です。
その場合、次のように記述する必用がありましたが、なかなか気づけませんでした。

` s.ios.vendored_library = 'Example/Pods/RcpLib/libAreteUart.a'`

また、Github で管理されていない場合は、リポジトリを作成してURLを入力して下さい。

## Github で tag の作成
ここまで出来たら、Github に push しましょう。
このとき、podspec で入力した s.version と同じバージョン番号でタグを作成する必用があります。

## 確認
ターミナルから次のコマンドを実行すると、podspec のチェックをしてくれます。
エラーが出たら修正してください。

`pod lib lint`

## 最後に CocoaPods にアップロード
まずは、cocoapods に登録を依頼します。
`pod trunk register EMAIL [NAME]`
（これは初回だけです。）

メールが届くので確認します。

次のコマンドを実行すると正式にCocoaPodsで公開されることになります。
`pod trunk push ASRManager.podspec`

CocoaPodsのページで検索してみてください。
表示された時はちょっと感動してしまいます。
まだ作ったばかりなので、これから色々とバージョンアップさせていく予定です！
Swift + XCTestでAppDelegateのインスタンスを取得しようとしてクラッシュした場合の対処法


swiftでXCTestを使ってユニットテストをするときに、
Appdelegateのインスタンスを取得しようとしてなぜかクラッシュしたため、
解決方法をメモします。

### 原因
原因としては、AppDelegate.swiftの"Target Membership"にTestターゲットを含ませると
```UIApplication.sharedApplication().delegate```でインスタンスを取得するときに以下のようにテストモジュールとの差異ができてしまうらしいです。
Sample.AppDelegate
SampleTest.AppDelegate

※ Sampleはアプリ名とする。


### 解決方法

* AppDelegateクラスの"Target Membership"にTestターゲットを外し、
AppDelegateクラスと対象のメソッドのアクセス修飾子をpublicにする。

* 以下のようにアプリのモジュールをインポートするようにする

```swift:SampleTest
import UIKit
import XCTest
import Sample   // ここにアプリのモジュールをインポートするようにする

class ToDoDoTests: XCTestCase {
    func testinsertTodoItem() {
        var appDelegate : AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate) // ここでクラッシュ
        
        XCTAssert(・・・・・・)
    }		
	
}

```

以上で無事解決できました。

ここを参考にさせていただきました。
http://stackoverflow.com/questions/26946677/uiapplication-sharedapplication-delegate-as-appdelegate-causes-exc-bad-access?answertab=active#tab-top


もっとスマートなやり方があれば是非教えてください。
Reactを0.13系にあげたら"Cannot read property '__reactAutoBindMap' of undefined"でコケた

Reactのv0.13でいろいろ変更があったようで、バージョンを上げたら"Cannot read property '__reactAutoBindMap' of undefined"エラーが発生するようになってしまいました。　　
    
createElementでComponentを包んであげるとエラーが消えました。 

Server-side renderingをしています。  

```js:app.js

var APP = React.createClass({
  render: function() {
    return (
      <html>
        <head>
          <title>React Server-Side Rendering</title>
        </head>
        <body>
          <SampleComponent />
          <script src='public/bundle.js'></script>
        </body>
      </html>
    );
  }
});

module.exports = APP;

if(typeof window !== 'undefined') {
  window.onload = function() {
    
    //for previous versions
    //React.render(APP(), document);
  
    //for version "^0.13.0"
    React.render(React.createElement(APP, {}), document);
  }
};

```


```js:server.js
app.get('/', function(req, res) {
  
  //for previous versions
  //var markup = React.renderToString(APP());
  
  //for version "^0.13.0"
  var markup = React.renderToString(React.createElement(APP,{}));
  
  res.send(markup);
});
```  
参考: https://github.com/facebook/react/issues/2661
StashをEC2+RDS+SESでセットアップする

StashをAWSで動かします。
DBはRDSを使い、メール送信はSESを使います。
以下の続きです。
refs: http://qiita.com/yhiranoo/items/5db2f08a057f5859c4e9

# GitとJIRAをインストール

StashはGitを使いますので、Gitと合わせてインストールします。

```
yum -y install git
wget https://www.atlassian.com/software/stash/downloads/binary/atlassian-stash-3.8.0-x64.bin
chmod +x atlassian-stash-3.8.0-x64.bin
./atlassian-stash-3.8.0-x64.bin
```

HTTPSで利用するので、リバースプロキシの設定を行います。
JIRAのときと同様です。

```
service atlstash stop
```

```:/var/atlassian/application-data/stash/shared/server.xml:
<Connector port="7990"
     protocol="HTTP/1.1"
     connectionTimeout="20000"
     useBodyEncodingForURI="true"
     redirectPort="443"
     compression="on"
     compressableMimeType="text/html,text/xml,text/plain,text/css,application/js
on,application/javascript,application/x-javascript"
     secure="true"
     scheme="https"
     proxyName="アクセスするURL"
     proxyPort="443" />
```

```:/var/atlassian/application-data/stash/shared/server.xml:
                <Context docBase="${catalina.home}/atlassian-stash"
                         path="/stash"
```

```:/etc/nginx/nginx.conf:
        location /stash {
            proxy_pass   http://127.0.0.1:7990;
        }
```

```
service atlstash start
```

# RDSを設定する

RDSにDBを作成します。

```
CREATE DATABASE stash_db WITH ENCODING='UTF8' OWNER=DBユーザー名 CONNECTION LIMIT=-1;
```

StashのURLにアクセスします。
DB設定で、RDSの情報を設定します。
すべての設定が終わったあとに、管理画面からSESの設定を行います。
設定方法は、JIRAのときと同じです。

# JIRAと連携する

アプリケーションリンク・アプリケーションナビゲータ・ユーザーディレクトリの設定を行います。
https://confluence.atlassian.com/display/APPLINKS/Application+Links+User+Guide

おしまい。
Rails4 mongoidでdeviseを使う


http://qiita.com/tmurakam99/items/122f99258f4ddbc2eff0
を参考にしたがこれだけではだめだった。

DB(database.yml)を使用するように作られたアプリケーションでは下記を行う必要がある。



Gemfileに下記を追加

```rb:Gemfile
gem 'mongoid', github: "mongoid/mongoid"
gem 'bson_ext'
gem 'devise'
```

devise.rbを修正

```rb:config/initializers/devise.rb
#  require 'devise/orm/active_record'
  require 'devise/orm/mongoid'
```


application.rbを修正
active_recordを使用しないようにするため、```require 'rails/all'```を外す
※active_recordが有効になっていると、deviseはそちらを優先する

```rb:config/application.rb
#require 'rails/all'

# Pick the frameworks you want:
# require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "sprockets/railtie"
```

その他configの修正

active_recordを無効化したため、```config.active_record```系を全てOFFにする。
主に、config/envrionments/*.rb内で使用されていると思います。

```bash
grep active_record *
```
などで検索するといいと思います。


```rb:config/environments/*.rb
#  config.active_record.migration_error = :page_load
```

user.rbの修正

user.rbを下記に置き換える。

```rb:app/models/user.rb
class User
  include Mongoid::Document
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  ## Database authenticatable
  field :email,              type: String, default: ""
  field :encrypted_password, type: String, default: ""

  ## Recoverable
  field :reset_password_token,   type: String
  field :reset_password_sent_at, type: Time

  ## Rememberable
  field :remember_created_at, type: Time

  ## Trackable
  field :sign_in_count,      type: Integer, default: 0
  field :current_sign_in_at, type: Time
  field :last_sign_in_at,    type: Time
  field :current_sign_in_ip, type: String
  field :last_sign_in_ip,    type: String

  ## Confirmable
  # field :confirmation_token,   type: String
  # field :confirmed_at,         type: Time
  # field :confirmation_sent_at, type: Time
  # field :unconfirmed_email,    type: String # Only if using reconfirmable

  ## Lockable
  # field :failed_attempts, type: Integer, default: 0 # Only if lock strategy is :failed_attempts
  # field :unlock_token,    type: String # Only if unlock strategy is :email or :both
  # field :locked_at,       type: Time
end
```


devise自体の導入は下記を参照
http://qiita.com/azusanakano/items/a51aef1347865a452fcc

参考アプリケーション
https://github.com/suvankars/rails-apps/tree/master/mongoid-devise

clone URL:
https://github.com/suvankars/rails-apps.git
C# JS ( jQuery ) からの非同期処理に対し意図的に例外を走らせるサンプル

※ このポストには ApplicationException が含まれています！アレルギー症状の有る方はお気をつけて

ってことで、まずはjQuery。雑なコードでも良い子は怒らない。hogehoge.aspx は asmx とか svc でもいいよ

```js
jQuery.ajax({
    type: 'POST',
    url: hogehoge.aspx,
    success: function ()
    {
        console.log('success');
    },
    error: function()
    {
        console.log('error');
    }
});
```

受け側はこんなかんじで

```csharp

        //
        // 処理...
        //

        throw new ApplicationException();

    }catch (ApplicationException ae){
        Response.ContentType = "text/plain";
        Response.StatusCode = 500;
        Response.Write("error");
    }
```

きちんと ContentType を指定してあげること、StatusCode を 500 で返してあげること、そしてきちんと文字列を返してあげることが大事（じゃないと場合によっては IIS のエラー文画面のHTML が返ってくる）
Xcode6で地味に置換の指定が変わってた

#はじめに
Xcode6での正規表現をつかった置換作業をしていたら
（.*）:グループ化した文字列
で文字列がとれなかったので調べてみました。

#\1から$1への変更
Xcode5時代の置換の仕方記事をみていたらどうも結果がおかしいので
調べたらXcode6くらいからリテラルに変更があったみたいです。
あまり使ってなかったので気にしてませんでした。

GAのv2→v3対応を例にします。
##例）メソッドの書き換え

```objc:v2
id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
[tracker sendView:@"Home Screen"];
```

↓

```objc:v3
// v3
id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
// Set the screen name on the tracker so that it is used in all hits sent from this screen.
[tracker set:kGAIScreenName value:@"Home Screen"];

// Send a screenview.
[tracker send:[[GAIDictionaryBuilder createAppView]  build]];
```

##Find Navigatorを使う
![スクリーンショット 2015-04-23 15.58.59.png](https://qiita-image-store.s3.amazonaws.com/0/12362/8a9f6972-5781-81a0-31df-f7883690c77e.png)

入力時にはメモ帳などを開いて、下記の文字列をコピーして
設定するとわかりやすいです。
Xcode内の入力部で指定すると、改行をいれることが困難でした。

`Replace All`でなく`PreView`を使うと色々捗ります

```objc:対象
\[tracker sendView:@(.*)\];
```
```objc:置換結果
//\[[tracker sendView:@$1\];
\[tracker set:kGAIScreenName value:@$1\];
// Send a screenview.
\[tracker send:\[\[GAIDictionaryBuilder createAppView\]  build\]\];
```

##参考
https://developers.google.com/analytics/devguides/collection/ios/v3/migration?hl=ja

http://stackoverflow.com/questions/26636170/xcode-6-doesnt-recognize-1-2-patterns-anymore

#さいごに
地味に変わってて気づかないところは他にもありそうです。
Struts2とValidation（概要）

### 前置き
技術的な話や実装サンプルはありません。

# 入力値検証(Validation)とは

入力値検証(Validation)とは、アプリケーション利用者が入力した入力値が妥当であるかを検証すること。

## 入力値検証を実現・補助する方法

Webアプリケーション・Webシステムで実現している方法

* クライアント側
	* JavaScriptで静的チェック
	* ブラウザUIの標準を拡張したUIコンポーネント
		* オートコンプリート
		* プレースホルダー
		* 子画面やダイアログを使った検索→メイン画面に反映
		* HTML5のValidationやフォーマット指定
	* Ajaxを使ったValidation機構
	* JavaScriptフレームワーク各種
* サーバ側
	* Validationフレームワーク
		* Commons-Validator
		* BeansValidation
		* OVal framework
		* Spring Validation
        * 型変換（TypeConvertion）
	* Javaコードを作成、手組のクラス

## WebアプリケーションのValidation絶対条件

クライアント側で入力値検証をしたとしても、サーバ側でも入力値検証は必ず実施する。

Webシステムゆえ、HTTPリクエストで任意のURLやパラメータをサーバへ送信できてしまうため、不要なパラメータや不正な値をシステムに入れさせない。

## Struts2の標準Validation

Struts2で使う標準のValidationを、ここではStruts2-Validationと呼ぶ。
Struts2では、クライアント上で動くValidationはAjaxを使った方法を取る。これをAjaxValidationと定義している。

* AjaxValidationは、実際にサーバへ送信してValidationを実施する。
* サーバ側でチェックした結果をJSONで返し、それを受け取るJavaScriptをStruts2が提供している。

## Struts2-Validationの動作
次の図は、Struts2-Validationの標準動作の模式図である。

![validation.png](https://qiita-image-store.s3.amazonaws.com/0/13268/b36c2460-2cc6-c3db-c2db-5a0eef0b2e08.png)

* Action実行前の処理
* Validationエラーを検出→Actionの実装部分は無視する
* Validationエラー画面へ自動遷移

## Validationエラーの扱い

* Validationエラーは、全てActionクラスがもつFieldErrorsに格納
	* 項目名ごとに管理
	* 1つの項目に複数のエラーを格納できる
	* 自動型変換もValidationエラーの1つとして扱われる

## ActionクラスとValidationの関係

 * Actionクラスがもつ1つ以上の項目を指定できる。
 * Ationクラスの全体に実施可能

## Struts2-Validationができるチェック内容

たくさん提供されているが、似ている機能をグルーピングすると、以下のようになる

* 必須項目
* 文字列長
* 数値の範囲
* 正規表現
* 自動型変換（指定しなくても自動的にチェックする）
* カスタマイズ

カスタマイズ(CustomValidator)で込み入った条件の検証もできる。

## カスタムValidationの例
カスタムValidationの実装例

* 相関チェック
	* ２値の大小比較
	* 日付の前後比較
* マスター存在チェック
        * データベースなどデータストアとの問い合わせも可能
* 楽観排他チェック


## LumiでのCustomValidation

私が公開している [Struts2のフルスタックプロジェクト:Lumi](https://github.com/A-pZ/lumi) でのValidation拡張

Validation内部で任意のServiceクラスを実行できる

* DataAccessObjectも利用できるため、データベースを利用したチェックも特に気にせず実現できる
* 簡易な業務ロジック（ドメインチェック）をValidationに移行させるパターンも実現できる
Rails 4.2.1に移行した時のメモ

個人で開発しているWebサービスをRails 4.1から4.2.1の移行した時のメモ。本番環境への適用は近日中に。

まず設定がらみで以下の様なワーニングが出たので、`config.serve_static_assets`を`config.serve_static_files`に修正。アセットパイプラインと関係ないことを明確にするためとのこと。他にもいくつか出た気がするのですが、メモるのを忘れたのでこれだけ。

```
DEPRECATION WARNING: The configuration option `config.serve_static_assets` has been renamed to `config.serve_static_files` to clarify its role (it merely enables serving everything in the `public` folder and is unrelated to the asset pipeline). The `serve_static_assets` alias will be removed in Rails 5.0. Please migrate your configuration files accordingly. (called from block in <top (required)> at /Users/takehiko/git/imarket/config/environments/test.rb:16)
```

Request Specで`assert_select`を利用しているところで以下の様なエラー。`document_root_element`が実装されてないとエラーになる模様。該当箇所は[ここ](https://github.com/rails/rails-dom-testing/blob/v1.0.6/lib/rails/dom/testing/assertions/selector_assertions.rb#L167)と[ここ。](https://github.com/rails/rails-dom-testing/blob/v1.0.6/lib/rails/dom/testing/assertions/selector_assertions.rb#L267)

```
Failure/Error: assert_select  '#input-code'
NotImplementedError:
 Implementing document_root_element makes assert_select work without needing to specify an element to select from.
```

[こちら](http://blog.cynthiakiser.com/blog/2014/12/26/upgrading-from-rails-4-dot-1-8-to-4-dot-2-0/)を参考にテストでincludeするヘルパーに`document_root_element`を実装すると通るようになりました。

```rb
def document_root_element
  html_document.root
end
```

それからRequest Specで`get`に相対パスを渡しているところで`URI::InvalidURIError`が発生。絶対パスで渡す必要があります。[ここ。](https://github.com/rails/rails/blob/v4.2.1/actionpack/lib/action_dispatch/testing/integration.rb#L311)

あとRailsではないですが、pry-byebug 3.0から`s`や`n`といったエイリアスがデフォルトでは使えなくなっているので、`.pryrc`に自分で定義する必要があります。

```rb:.pryrc
if defined?(PryByebug)
  Pry.commands.alias_command 'c', 'continue'
  Pry.commands.alias_command 's', 'step'
  Pry.commands.alias_command 'n', 'next'
  Pry.commands.alias_command 'f', 'finish'
end
```
Javaエンジニア養成読本読んだ

Javaエンジニア養成読本読んだので各章の感想など

## 巻頭記事 〜今とこれからを知るためのJava界の歴史，環境，社会 誰も教えてくれないJavaの世界
Javaにまつわる歴史や小ネタについてまとめられた話です。軽い感じなのでサクサク読めました。ここを読んでもプログラミングの勉強にはならなそうですがコミュニティに参加する上での前提知識みたいなものが学べそうな感じです。

## 特集1 〜自信を持ってコーディングできるようになる！ Java入門
Javaを使ってプログラミングする際に心がけると良い、基本的な事柄が抑えられてあってとても勉強になるパートでした…けど基本的な事柄って読んでて眠くなるよね。とても良いことが書かれてるのですが…

## 特集2 〜コレクションフレームワーク，ラムダ式，Stream API活用術 ［マルチコアCPU対応］ Java SE 8時代のデータ処理入門
Java SE8のStream＋ちょこっとラムダについて書かれた章でした。Streamを使う際の具体例が結構わかりやすい具体例（ちょっと業務っぽい？感じの例）だったので終始テンションを維持して読むことが出来ました。Java SE8触らないと…

## 特集3 〜標準化されたJavaのWeb技術を最大限に使いこなす！ 現場で役立つJava EE
Java EEについて書かれた章でした。今回ここが読みたくてこの本を買ったと言っても過言ではないです。Java EEを本格的に触ったこと一度もないんですが、Java EEで使用できる機能、かつWebアプリケーションを作る際に必要そうな機能に絞って解説されていてとてもわかりやすかったです。チュートリアルのボリュームがちょっと少なかった感じですけど、専門の本じゃないのでこの辺が限界なのかなぁという感じですね。これからチュートリアルやります。

## 特集4 〜Git，Maven，JUnit，Jenkinsで実践 現場で役立つ チーム開発入門
この章はタイトルに記載されているツール郡の解説という感じですね。個人的にはどれも大体慣れ親しんだものなので結構斜め読みな感じで読み飛ばしてしまいましたが、ツールの解説はそれぞれ丁寧にされているのでタイトルのツールを知らない人には良いかもしれませんね。

## 一般記事 〜「フルスタックエンジニア」への道？！ イマドキのJava受託開発の現場で求められる知識
この章も一番初めの章と同様、Javaにまつわるギョームのお話という感じで軽い感じですね。これまたサクサク読めました。自分自身もこの章に記載されたような現場で働いたことがあるので、経験者的にはあるある話として、新人的にはこれからの仕事のススメ方として読めますね。
ランダムな日本語のデータを生成するGemまとめ

日本語の名前や住所を含んだテストデータを用意するためにGemを調べたのでまとめました。
ちなみにRuby ToolboxのRandom Data Generationタグでランキングを参照できます。

https://www.ruby-toolbox.com/categories/random_data_generation

## Faker

https://github.com/stympy/faker

Ruby Toolboxでダントツに人気があるGemです。名前(ふりがなは無い)、住所、電話番号を生成でき、多言語対応されており日本語も使えます。

## Ffaker

https://github.com/emmanueloga/ffaker

Fakerをリライトし高速化したものですが、少しAPIも変わっており、日本語は今のところ名前、職業のみのようです。

## ForgeryJa

https://github.com/namakesugi/forgery_ja

英語しか無いForgeryを日本向けにしたものです。名前(ふりがな有り)、住所、その他いくつか対応されています。

## Gimei

https://github.com/willnet/gimei

日本語の名前や住所を取得できます。Fakerと違い、ふりがなにも対応しています。
下記のようにインスタンスをつくって同一名の漢字、ふりがなを取得できるのも便利です。

```rb
gimei = Gimei.name
puts gimei.kanji # => 杉浦 司
puts gimei.katakana  # => スギウラ ツカサ
```

## Takarabako

https://github.com/willnet/takarabako

ゲームなどに登場するアイテム名を取得できます。


もし他にもありましたらコメントでお寄せください
画像をコピペでアップロードできるAtom packageをつくった

**2015/06/06 追記**
数日前からGyazoAPIがエラーを返すようになってしまったので、imgurのAPIを使うようにしたv0.3.0をリリースしました。こちらはaccess_tokenなしでアップロードできるので、**めんどうな設定は不要です！**

---

前に話題になってたけど、GithubやSlack, Qiitaはテキストフォームに画像をコピペできて便利（Safariだとできなくて不便なのだけど・・・）

- [Slackでカジュアルにスクリーンショットを投下する - たまめも(tech)](http://d.hatena.ne.jp/ar_tama/20150416/1429174494)
- [デザイン変更するときキャプチャ撮りまくると捗る - ✘╹◡╹✘](http://r7kamura.hatenablog.com/entry/2015/01/22/232639)


**Atomでmarkdown書いてる時にも同じことをやりたくて、[image-copipe](https://atom.io/packages/image-copipe) というpackageをつくってみました。**

# 設定
Gyazo APIを使っています。ただOAuthまでは対応してないので、各自でaccess_tokenを取得してください。

[ターミナルからgyazoに画像をアップロードする - Qiita](http://qiita.com/kazuph/items/b4590237a89a87b02ab7) にあるように、ユーザー登録して、アプリケーションを登録するだけなので、簡単にできます。

access_tokenを取得したら、Atomでimage-copipeの設定画面を開いて、入力してください。

これでGithubやSlack, Qiitaみたいに画像をコピペできます！

# Tipsやはまったところ
## packageの開発中に、変更を反映するには
上部のメニューからView → Reloadすれば、変更が反映されます。
Atom自体を再起動しなくて大丈夫です。

## 依存モジュールの追加
package.jsonのdependenciesに追加したら、`cmd + shift + P`でコマンドパレット開き、`Update Package Dependencies: Update`を実行します。

## pasteイベントが使えない
なぜかAtomではpasteイベントが使えませんでした。なので、今回はkeydownイベントを拾って、キーコードをチェックしています。

```coffeescript
# 雑に cmd + v を判定
if (e.metaKey && e.keyCode == 86)
```

## カーソルのある位置にテキストを挿入したり置換したりするには
Text周りのAtomのAPIがいまいち理解できずに困ったのですが、こんな感じでできました。

```coffeescript
# insert loading text
editor = atom.workspace.getActiveEditor()
range = editor.insertText('Uploading...');
@post img, (imgUrl) ->
  # replace loading text to markdown img format
  markdown = "![](#{imgUrl})"
  editor.setTextInBufferRange(range[0], markdown)
```

`editor.insertText()`が挿入したテキストのRangeを返すので、それを使ってAPIのレスポンスが返ってきたらmarkdownと置換しています。

## Atom起動したら即使えるようにするには
Atomは、packageを起動したらactivateというメソッドが呼ばれるようになっています。ただし、package.jsonに`activationCommands`が設定されている場合は、そのコマンドが呼ばれるまで、activateメソッドは呼ばれません。

起動したら即activateを呼ぶには、package.sonから`activationCommands`を削除すればOKです。

### 補足
Atomの起動を高速化するため、基本的には`activationCommands`を設定した方がよいです。ただ、わざわざショートカットキーかメニューをクリックして、packageをactivateする手間が増えます。

今回は、できる限りさくっと使えるようにしたかったので、`activationCommands`を削除しました。

## clipboardの扱い
[electron/clipboard.md at master · atom/electron](https://github.com/atom/electron/blob/master/docs/api/clipboard.md) を参考にしたら、すんなりできました。

ただ、safariで右クリックから画像をコピーしたときに、なぜかリンク先のURLもテキストとして一緒にコピーされてしまうので、無理やり空文字入れてクリアしました。

```coffeescript
clipboard.writeText('')
```

## configが反映されない
defaultも設定しないと、画面に反映されないっぽいです。

```coffeescript
module.exports =
  config:
    gyazoAccessToken:
      type: 'string'
      default: ''
```

# 所感
あんまりAtomのドキュメントを読み込まずにがっとつくったので、間違ってる箇所やもっと良いやり方あれば、教えてください。PR歓迎です。
c++ builder XE4 > 静的メンバ関数

[ロベールのC++教室](http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02030.html)

クラスのメンバ関数だが、インスタンスを作成せずに使いたい処理の場合、静的メンバ関数として実装すればよさそう。

```GenProc.h
class TGenProc : public TThread
{
...
public:
	// 静的メンバー関数
	static void __fastcall ProcAAA(void);
}
```
```GenProc.cpp
void __fastfcall TGenProc::ProcAAA(void)
{
...
}
```

使う時は以下のように使う。
```
TGenProc::ProcAAA();
```

引っかかったのは"static"を.cppにもつけるとコンパイルエラーとなること(E2092 ここには記憶クラス'static'は使用できない)。
.hの関数の宣言部分にだけstaticをつければいいようだ。
mrbgemsの雛形を作る超便利ツールmruby-mrbgem-templateを使う

# [mruby-mrbgem-template](https://github.com/matsumoto-r/mruby-mrbgem-template)を使うとテストまでの雛形を作ってもらえる

# 用意するもの

- 気合とか情熱
- モチベーション

## そこら辺がない場合

- センス
- Rubyの同様のモジュールのAPIや実装コード
- mrubyのGithubのページ(検索したり、過去の経緯がわかる)

## その他必要なもの

- 作業時間(時間は作るものだから。。。)
  
# 実作業

## mrubyを持ってくる

```
git clone https://github.com/mruby/mruby.git
cd mruby
```

## mruby-mrbgem-templateのインストール

build_config.rbのenable_debugの直下に以下を記述

```
conf.gem :github => 'matsumoto-r/mruby-mrbgem-template'
```

作るモジュールに必要な物も予言できる人はこのタイミングで記述。

```rb
# include the default GEMs
conf.gembox 'default'
```

これも

```rb
# include the default GEMs
conf.gembox 'full-core'
```

とした方が、いろいろ便利な気がする。
(例えば、正規表現とかが使えるようになる)

### mrubyをビルド

```
rake
```

## create.rbの作成

mrubyディレクトリ配下にcreate.rbというファイルを作って作業する。

これ、GithubのREADME.mdの説明をコピーして
エディタで編集するのが良さそう。

```rb
params = {
  :mrbgem_name    => 'mruby-sugoiyatsu',
  :license        => 'MIT',
  :github_user    => 'yourname',
  :mrbgem_prefix  => '..',
  :class_name     => 'Sample',
  :author         => 'ANATA NO ONAMAE',
}

c = MrbgemTemplate.new params
c.create
```

github_userは正直に入れないとGithubをDropbox代わりに使った開発が
面倒になると思われる。

## 雛形生成

```
./bin/mruby create.rb
```

前述のGithubをDropbox代わりに使う開発や、有益なモジュールを
多くの方々に使ってもらう様な向きは、おもむろにWebブラウザを立ち上げるなりして、
Githubにcreate.rbで入力したパラメータに従ったリポジトリを作成し、
その後のMrbgemTemplateのお告げをありがたく実行する。

## 動かし方

### mrubyのbuild_config.rbにモジュールのパスを追加

```
conf.gem '../mruby-sugoiyatsu'
```

をbuild_config.rbに追加するか、githubのリポジトリを指定する。

### 動かす

mrubyのディレクトリで

```
rake all test
```

初期状態で、テストも動く。

# Travis CIの設定

travis ciのバッチもREADME.mdに貼ってくれている便利仕様なので、
travis ciの管理画面でシンクして該当のリポジトリをONにすると良い。

# Link

- [人間とウェブの未来 - mrubyの拡張モジュールであるmrbgemのテンプレートを自動で生成するmrbgem作った](http://blog.matsumoto-r.jp/?p=3923)
- [ツナでもわかるmruby [2回目：文字列] - Qiita](http://qiita.com/hiroeorz@github/items/69de85b52f854542557f)
- [mruby - mrbgemsでC++のAPIを呼ぶgemを作るには - Qiita](http://qiita.com/kjunichi/items/c9c9b15d5c3f9d89bb05)

# 関連投稿

- [mrubyでmrbgemのテストで外部コマンドを使うには - Qiita](http://qiita.com/kjunichi/items/059423a39f82ef872703)
tmuxのペイン分割サイズを均等にする


## デフォルトのペイン分割サイズ

tmux のデフォルトのペインの分割設定では、3つ以上のペイン分割の際には下記のように均等でないサイズのペインになります。

![before.png](https://qiita-image-store.s3.amazonaws.com/0/6915/daa04a48-8d4f-e7f4-9c5b-cba195714395.png "before.png")


Vim の C-w s でウィンドウを分割した時のように、均等なサイズで分割したくなる場合もあるかと思います。

## select-layout の even-xxx

tmuxのデフォルトのキーバインドを[tmuxのリポジトリのkey-bindings.c](https://github.com/ThomasAdam/tmux/blob/d1337053b6119c4aab0c38b5fc082acf2fdfcbb1/key-bindings.c)から確認すると、

```key-bindings.c
static const char* defaults[] = {
	// 中略
	"bind M-1 select-layout even-horizontal",
	"bind M-2 select-layout even-vertical",
	// 中略
};
```

even-horizontal や even-vertical といった、期待している挙動を実現してくれそうなキーバインドが見つかります。
実際に even-vertical のキーバインドを試してみると下記のように期待している結果になりました。

![after.png](https://qiita-image-store.s3.amazonaws.com/0/6915/581a84eb-6140-9f10-2742-c4ca99a9ec61.png "after.png")


## ペイン分割と同時に分割サイズを均等にする

私の .tmux.conf の設定は[こちらの記事](http://qiita.com/succi0303/items/cb396704493476373edf)を参考にしているので、ペイン分割は「-」や「|」に割り当てています。
その .tmux.conf を下記のように修正します。

```.tumx.conf
bind | split-window -h \; select-layout even-horizontal
bind - split-window -v \; select-layout even-vertical

```

3つ以上にペインを分割した時も、自動で均等なサイズになりました :smile: