OmniAICreator/Qiita-1.07M huggingface dataset:
JINS MEME Swift Sampleを書きました。

# J!NS MEME Swift Sample
Jins MemeのサンプルコードをSwiftで書き、公開しました。
https://github.com/manchan/JinsMeme-Swift-Sample


![s_スクリーンショット 2015-11-26 午後4.56.49.png](https://qiita-image-store.s3.amazonaws.com/0/8972/e5a8de58-c1d8-57ed-b878-121b0a02cc94.png "s_スクリーンショット 2015-11-26 午後4.56.49.png")
（https://jins-meme.com/ja/）



J!NS MEMEから取得できるリアルタイムデータを確認できるサンプルのアプリです。 
既存のサンプル（Objective-C）をSwiftに書き換え、それぞれのデータの詳細情報を閲覧できるようにしています。

ソースコードはGithubに置いてありますので、ご自由にお使い下さい。
JINS MEMEのSDKのバージョンは1.0.5です（2015/11/25現在）



## 動作環境

- iOS 9.0+
- Bluetooth 4.0（BLE）
- J!NS MEMEが必要です。

## そのままXcodeで実行できますが一から作成するための手順を記述しておきます。
①SDKからMEMELib.frameworkを導入 
②Bluetooth権限設定
Capabilities > Background ModesをONにし、 Use Bluetooth LE accessory にチェック
③Bridginging Headerファイル作成
`#import <MEMELib/MEMELib.h>`を記述
Build Settings > Swift Compiler - Code Generationに、Bridging Headerを指定

④下記より認証コードを設定
⑤あとはお好きにどうぞ

##実行方法

**Xcode 7**でビルドしてください。
こちらよりアプリを作成して https://developers.jins.com/ja/apps/create/  
取得したアプリID / アプリSecretをMEMELibのsetAppClientIdの引数にセットする必要があります。`AppDelegate.swift` at line 20  を書き換えてください。




##内容

![](https://raw.githubusercontent.com/manchan/JinsMeme-Swift-Sample/master/ResourcesForREADME/meme2.gif)



###eyeMoveUp

視線が上に動いたかどうかを示す整数値  

###eyeMoveDown

視線が下に動いたかどうかを示す整数値  

###eyeMoveLeft

視線が左に動いたかどうかを示す整数値  

###eyeMoveRight

視線が右に動いたかどうかを示す整数値  

###blinkSpeed

まばたきのスピード（Millisecond）  

###blinkStrength

まばたきの強さ (一般的に、50～200の間におさまります。)  

###walking

かかとを地面についたかどうか。それを検出するとtrueになる  

###roll
姿勢を表す角度のうちのロール要素を示す度  
###pitch
姿勢を表す角度のうちのピッチ要素を示す度  
###yaw
姿勢を表す角度のうちのヨー要素を示す度  

###accX
加速度のX軸の値。-128 ~ 127 の1byteの整数値  

###accY
加速度のY軸の値。-128 ~ 127 の1byteの整数値  

###accZ
加速度のZ軸の値。-128 ~ 127 の1byteの整数値  

###fitError
JINS MEMEがきちんと装着されているかどうかを示す整数値。  

###powerLeft
電池残量を表す整数値  

### 詳細情報はこちらより [JINS MEME（ミーム） DEVELOPERS](https://developers.jins.com/ja/resource/docs/startup_guide/ios/)!!


##おわりに
3点式の眼電位センサーが眼の動き（視線）やまばたきを検出してくれるので、
それを利用して、何かアクションを起こすというポインティングデバイスとしての利用がおもしろいなと思います。

眼電位センサーにより疲れ度合い、眠気、集中度などもデータ解析の仕方によっては推定することが可能になるのかなと思います。実際にJinsサイドはJINS　MEME　DRIVEという眠気を推定するドライバー向けiOSアプリを公開していますし。

様々なハードウェアと連携させてなにかできそうです。
Jupyterで複数選択

Jupyter(IPython Notebook)が手放せない人も多いかと思いますが、偶然、便利な方法に気づきました。
Jupyterでは、コントロールキーを押しながらだと、選択範囲を追加していけます。
例えば、変数名を変えたくなった時に、古い変数名を選択してペーストを繰り返すことがあるかと思います。この場合、ペースとしたい場所を複数同時に選択して、一気に置換することができます。
TeXのセクションの大きさを変更する

titlesecパッケージを使ってセクションの大きさを自在に変更することができます。
プリアンブルに

``\usepackage{titlesec}``

を追加し、その下に

```tex

\titleformat*{\section}{\large\bfseries}
```

と記入するだけです。
`\newcommand` を使ってサイズを再定義する方法もありますが、こちらの方がよりシンプルに記述できます。


記述例
-----

```section.tex
\documentclass{jarticle}
\usepackage{titlesec}

\titleformat*{\section}{\Large\bfseries}
\titleformat*{\subsection}{\normalsize\bfseries}

\begin{document}
\section{セクション}
\subsection{サブセクション}
\end{document}
```

参考サイト
---------
[Change size of section, subsection, subsubsection, paragraph and subparagraph title](http://tex.stackexchange.com/questions/59726/change-size-of-section-subsection-subsubsection-paragraph-and-subparagraph-ti)
技術英語 > I'm a little disoriented. / I have no sense of direction. / across the street

@ Star Trek Voyager > PROJECTIONS

意識を回復したばかりのJaneway. 体調についてドクターから聞かれ、答えた言葉

> Janeway: I'm a little disoriented.　「ふらつくわ」

<hr>
関連して思い出したのは

I have no sense of direction.「方向音痴です」

<hr>
関連して思い出したのは

The shop is located across the street.
http://eow.alc.co.jp/search?q=across+the+street&ref=sa

何かの目印があり、その道向かいに目標のものがある時などに使われる。
GsonでJSONからHashMapを作る

# GsonでHashMapも使って高速開発を更に爆速に
今やAPI連携のAndroidアプリの高速開発に欠かせないGson。WebAPIから持ってきたJSONを一瞬でModelクラスに入れて……の手順にもう1テクニック。GsonはHashMapにも変換することができる。

AndroidTestCaseのテストコードをそのまま。

```java:XxxTest.java
 public void test_JSON2HashMapByGson () throws Exception{
        String json = "{\"apple\":3, \"orange\":2}";
        Gson gson = new Gson();
        Type listType = new TypeToken<HashMap<String, Integer>>() { }. getType();
        HashMap<String, Integer> fruitMap = gson.fromJson(json, listType);

        assertEquals((int) fruitMap.get("apple"), 3);
        assertEquals((int) fruitMap.get("orange"), 2);

        json = "{\"fruit\":{\"apple\":3, \"orange\":2}}";
        listType = new TypeToken<Fruit>() { }. getType();
        Fruit fruitObject = gson.fromJson(json, listType);

        fruitObject.fruitMap.get("apple");
        assertEquals((int) fruitObject.fruitMap.get("apple"), 3);
        assertEquals((int) fruitObject.fruitMap.get("orange"), 2);

    }
```

```java:Fruit.java
    class Fruit {
        @SerializedName("fruit")
        private HashMap<String, Integer> fruitMap;
    }
```
bashだけで簡単ec2 ssh接続（踏み台対応）

元々はプログラマでしたが、3年くらい前にインフラ（サーバー）エンジニアに転向。
そして半年前くらいからAWSデビューしました。

10月にAWS利用したサービスが無事リリースできたので、
そのときに作った、あったら便利かなツールを晒してみようと思います。
*NGワード：車輪の再発明*

## ダウンロード
[ssh-ec2.sh](https://gist.github.com/guja/454e2eb7986245b3b0bb)

## 特徴
![img1.png](https://qiita-image-store.s3.amazonaws.com/0/25298/3c547104-ea2b-3452-86c4-2668a0a976b9.png)

- ec2サーバーへのssh接続を、一覧から選んで接続ができる
    - ec2サーバー一覧を hostsや~/.ssh/configファイルに記載する必要なし
- 踏み台サーバーを経由したssh接続にも対応
- シェルスクリプト1ファイルのみで、他に必要なものはbashとsshとAWS CLI(python)のみ（ruby不要）
- pecoにも対応
- ついでに稼働状態やインスタンスタイプなども見れて便利

※EC2のHost名はTagのName項目で定義してある前提です

## 利用準備
1. aws cliコマンドを利用できるようにしておく
2. ssh-ec2.shを任意のディレクトリに配置
3. shファイルの SSH_COMMAND と DESCRIBE_COMMAND（のfilter条件）を適宜変更

## 実行
実行すると、describe-instancesで取得したEC2一覧を番号をつけて整形して出力します。その後入力待ちになるので、ssh接続する番号を入力すると、そこにssh接続ができます。
pecoがインストールされてる場合、pecoを利用してカーソルキーで選択することでssh接続ができます。

## FAQ
- sshの接続portを22以外にしてるんだけど…
    - ~/.ssh/configに設定を書くことで対応可能です


```bash:~/.ssh/config
Host 52.1.1.1
  Port 2222
```


## 踏み台対応
踏み台サーバーを経由してsshするとき、通常であれば ~/.ssh/configファイルに EC2のサーバーの数だけ設定を書いていかないといけませんが、[最強のSSH踏み台設定](http://qiita.com/kawaz/items/a0151d3aa2b6f9c4b3b8) を参考にすれば、個別設定を書かなくても接続できるようになります。

```bash:~/.ssh/config
Host */*
  ProxyCommand ssh -W "$(H="%h"; echo ${H##*/})":%p "$(H="%h"; echo ${H%%%%/*})"

Host 踏み台サーバーhost名
  HostName 52.1.1.1
  Port 2222
```
そして、ssh-ec2.shの設定ファイルで

```bash:
SSH_COMMAND="ssh "
を
SSH_COMMAND="ssh 踏み台サーバーhost名"
```
```bash:
'sort_by(Reservations[].Instances[].{InstanceId:InstanceId,Tags:Tags[?Key==\`Name\`].Value|[0],InstanceType:InstanceType,State:State.Name,Ip:PublicIpAddress},&Tags)'
の
PublicIpAddress
を
PrivateIpAddress
```
と変更することで、PrivateIPしか持ってない 踏み台経由でログインするEC2へも、選択式で接続することができます。

## スクリプト解説
- 20行目
    - describe-instancesでEC2一覧をtext形式で取得して変数に代入
- 22-28行目
    - そのままだと列項目の順番がばらばらで見にくいので、一旦取得して整形しています
- 22行目
    - 18行目でシェルのデリミタを改行コードだけにしてあるので、行単位でforループがまわる
- 23行目
    - 列の区切りはTABなので、デリミタにTABを指定
- 24行目
    - `set --` をすることで、TABで区切られた値が\$1, \$2, .. という変数に代入
- 25行目
    - IPアドレスは後でsshするときに使用するので、配列に代入
- 26行目
    - 表示用に整形
- 29行目
    - 整形後のデータをそのまま出力すると、テキスト文字数がバラバラなため 列がきれいに並ばないため、`column`コマンドを利用してきれいにしている
- 31-40行目
    - pecoがある場合、pecoを利用して選択する
    - pecoがなければ、番号をキー入力する
- 41-42行目
    - 選択項目が数値で、サーバーリストに含まれてるかチェック
- 45行目
    - 選択した番号に該当するIPアドレスを配列から取得してSSH接続

簡単にssh接続できるように ~/.ssh/config を動的に書き換えたり、接続先をpecoで指定する、といったやり方は見かけましたが、その辺のやり方を参考にしつつ、EC2での接続しやすさに特化したマッシュアップ的なスクリプトになりました。
AWS始めて半年なので、もしかしたらこれとほぼ同じようなものもすでにあるかもしれませんが、そのときは勉強になったということで・・
EdisonからArduinoに書き込む

#Edison Arduino 書き込み

SparkfunからEdison用Arduino Blockが出ているのですが，書き込みはなぜかArduino Pro Mini同様に有線で行います．
https://www.sparkfun.com/products/13036

公式のHookup Guideを見ても，

```
Depending on your application, though, it’s recommended that you load code on the Arduino while it’s disconnected from your Edison stack, before adding it to the rest of the system.
```

とあって，いっそEdison外して書き込むことまで推奨しています．

なんだかスマートではないので，Edisonから書き込めるようにしたいと思います．

## 書き込み用ソフト ino
EdisonにはGUIがないので（なくはないですがめんどうなので）Arduino公式で出しているapt-get install arduinoで入るツールはX windowがないと喚いて動いてくれません．

cuiだけで動くソフトに[ino](https://github.com/amperka/ino)があります．これをインストールします．使い方は[ここあたりを参考](http://blog.yagi2.com/?p=856)に．
私の場合は，

```
sudo easy_install ino
```
ですんなり入ってくれました．

あとは使い方に従って書き込みまで試してみます．

```
mkdir ~/blink
cd ~/blink
ino init -t blink
ino build -m pro328 
```
これでArduinoへ書き込むバイナリができます．
このあと書き込むのですが，そのままだとうまく動きません．

```
$sudo ino upload -m pro328 -p /dev/ttyMFD1
avrdude: stk500_getsync(): not in sync: resp=0x00

avrdude done.  Thank you.
```

こんななります．なんかSYNCできてないっぽいです．


## DTRを自力で動かす．
SYNCできていない原因を探ってみると，どうもDTR（Arduinoのリセットをする端子）が動いていなさそうです．
調べてみると，/dev/ttyMFD1を使用して書き込みますが，このデバイスファイルはそもそもRX，TXのみしかサポートしていません．
inoはシリアルポートにDTRがいることを前提に作られているので，ino/commands/upload.pyの中のDTRを操作する部分が機能していなさそうです．

DTRをシリアル通信に頼る代わりに，自分で操作してリセットをかけたいと思います．

とりあえず，ino/commands/upload.pyを編集します．
普通に入れるとこの辺りにいると思います． /usr/local/lib/python2.7/dist-packages/ino-0.3.6-py2.7.egg/ino/commands/upload.py

```py:upload.py
 from __future__ import absolute_import

 import mraa
 import os.path
 import subprocess
 import platform

#いろんな処理

        # pulse on DTR
        # try:
        #     s = Serial(port, 115200)
        # except SerialException as e:
        #     raise Abort(str(e))
        # s.setDTR(False)
        # sleep(0.1)
        # s.setDTR(True)
        # s.close()
        x = mraa.Gpio(25) #DTRはMRAAでは25番
        x.dir(mraa.DIR_OUT)
        x.write(0)
        sleep(0.1)
        x.write(1)
         
```
これで保存してあげます．あと，同じディレクトリにupload.pycというコンパイル済みっぽいのがいるので間違って使われないようにとりあえず消しておきました．

## inoでアップロード確認

これでアップロードができるようになったはずです．確認してみます．

```
$ sudo ino upload -m pro328 -p /dev/ttyMFD1

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f
avrdude: reading input file ".build/pro328/firmware.hex"
avrdude: writing flash (1034 bytes):

Writing | ################################################## | 100% 0.31s

avrdude: 1034 bytes of flash written
avrdude: verifying flash memory against .build/pro328/firmware.hex:
avrdude: load data flash data from input file .build/pro328/firmware.hex:
avrdude: input file .build/pro328/firmware.hex contains 1034 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.24s

avrdude: verifying ...
avrdude: 1034 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

```

できた！
optional を C++で試す

swiftのオプショナル型非常に便利なんだけど
C++でもできるっぽい。

```
#include <experimental/optional>
#include <iostream>
#include <string>
using namespace std;
using namespace std::experimental;

int main()
{

    optional<string> dummy1 = string("hello");
    optional<string> dummy2; // empty nullptr
    
    if(dummy1){ // string
        cout << *dummy1 << endl;
    }
    
    if(dummy2){ // empty
        cout << *dummy2 << endl;
    }
    
    dummy2 = dummy1; // copy
    
    if(dummy2){ // ask length
        cout << *dummy2 << endl;
    }
    

    return 0;
}
```

まぁswift !にあたるのが * だね。
普通にifでヌル除外とかができる。
値を取り出すには*でswiftのように明示的にunwrapしなきゃいけないので、まぁヌルチェックは忘れなくはなりそう。

ただ、ネックはexperimentalのフォルダに入っててしかもC++11じゃこのコードコンパイルできないのね。
Puppetの文法チェック

Puppetの文法チェックまとめ。
マニフェスト(pp)とテンプレート(erb)とHiera(yaml)。
puppet実行時エラーだと、シンタックスエラーが原因なのが分かりにくい場合があるのでメモ。

#マニフェスト(pp)

```bash:*.pp
puppet parser validate example.pp
```

エラー例

```text:
[root@web01 manifests]# puppet parser validate site.pp
Error: Could not parse for environment production: Syntax error at '}' at /etc/puppet/manifests/site.pp:9
```


#テンプレート(erb)

```bash:*.erb
erb -P -x -T '-' example.erb | ruby -c
```

エラー例
<% %>を閉じ忘れた例ですが、どの行がエラーか分からない。。。壊れていないかのチェックぐらい？

```text:
[root@web01 web01]# erb -P -x -T '-' httpd.conf.erb | ruby -c
-:59: syntax error, unexpected *
Include conf.modules.d/*.conf
                        ^
-:105: syntax error, unexpected '<', expecting end-of-input
<Directory />
 ^
```

#Hiera(yaml)

```bash:*.yaml
ruby -e "require 'yaml'; YAML.load_file('example.yaml')"
```

エラー例

```text:
[root@web01 hieradata]# ruby -e "require 'yaml'; YAML.load_file('example.yaml')"
/usr/share/ruby/psych.rb:205:in `parse': (example.yaml): could not find expected ':' while scanning a simple key at line 8 column 1 (Psych::SyntaxError)
	from /usr/share/ruby/psych.rb:205:in `parse_stream'
	from /usr/share/ruby/psych.rb:153:in `parse'
	from /usr/share/ruby/psych.rb:129:in `load'
	from /usr/share/ruby/psych.rb:299:in `block in load_file'
	from /usr/share/ruby/psych.rb:299:in `open'
	from /usr/share/ruby/psych.rb:299:in `load_file'
	from -e:1:in `<main>'
```

# 一括チェック
findコマンド結果で、上記コマンドをループ実行して一括チェック。

```bash:*.pp
find /etc/puppet/ -name "*.pp" | while read file; do echo "--- file=$file"; puppet parser validate "$file"; done
```

```bash:*.erb
find /etc/puppet/modules/ -name "*.erb" | while read file; do echo "--- file=$file"; erb -P -x -T '-' "$file" | ruby -c ; done
```

```bash:*.yaml
find /etc/puppet/hieradata/ -name "*.yaml" | while read file; do echo "--- file=$file"; ruby -e "require 'yaml'; YAML.load_file('$file')"; done
```

# 参考

- https://puppetlabs.com/blog/verifying-puppet-checking-syntax-and-writing-automated-tests
- https://docs.puppetlabs.com/puppet/latest/reference/lang_template.html
- https://ask.puppetlabs.com/question/11000/does-puppet-provide-a-validationsyntax-checker-for-hiera/
Android Framework Code Reading #2 参加記


@operandoOS氏主催のソースを読む会に参加してきた。(@メルカリ) 素敵な雰囲気のオフィスだった。
よい機会だったのでLauncher3を少し読んでみた。

↓ イベントのページ
https://mandroidfcr.doorkeeper.jp/events/33925

↓ しおり
[Android Framework Code Readingのしおり](http://www.slideshare.net/shinobuokano7/android-framework-code-reading)

## 背景

以前Qiitaで [RecyclerViewをFragmentPagerAdapter風にする](http://qiita.com/hotpepsi/items/1167e5263f048a005e05) という記事を書いたのだが、

- できるだけ簡単に
- 水平方向で1ページずつ表示する
- スワイプで左右に移動する
- ページの境界線にスナップする

ということがしたかったのだった。
これはAndroidのホーム画面で実現されていることなので、もしかしてライブラリとして提供されていて簡単に使えたりするのではと何となく思っていた。
ぐぐった結果 [このへん](http://juggly.cn/archives/98991.html) などから、ホーム画面のアプリはLauncherという名前らしいことがわかった。
[OpenGrok](https://sites.google.com/site/devcollaboration/codesearch)
で調べてみたところ、Launcher2とLauncher3というアプリが存在していたので、今回はLauncher3を読むことにした。

$ git clone https://android.googlesource.com/platform/packages/apps/Launcher3
でローカルに落としてきてSublime Text3で読んだ。

## Pagerをさがす

まずページをホストしている部分を探した。手がかりとしてresからホームボタンのアイコン (:::) を探して
drawable-xhdpi/ic_allapps.png
を発見。
これをres以下でgrepして、launcher.xmlの中で
com.android.launcher3.Workspace
AllApps (※ コメント)
page_indicator
のような感じに並んでいるのを発見。
WorkspaceがPagerの部分だとあたりをつける。

res/xml/default_workspace_4x4.xml
res/xml/default_workspace_5x5.xml
res/xml/default_workspace_5x6.xml
というファイルがあり、解像度ごとにグリッドレイアウトをXMLで切り替えているような気がする。意外とローテク。
src/com/android/launcher3/Workspace.javaにて、PagedViewを継承していたのでPagedViewを読むことに。

## PagedView

お目当てのソースはこれだった。CellLayoutを複数持つpagerらしい。
2400行くらいあって、割と場当たり的に書かれている印象。読みやすいといえば読みやすい。
手を離したらスナップする部分は MotionEvent.ACTION_UP の部分で、このcase文だけで100行あるのでちょっと長い。個人的には真面目すぎるコードの方が苦手なので、こういうadhocっぽいソースをリリースするのは好感が持てる。たぶんさほどcriticalな部分ではないのでそんなにシビアに管理していないのだろう。
よくわからないのでついでに~/Library/Android/sdk/sources/android-22/android/support/v7/widget/LinearLayoutManager.javaも少し読んだ。(こちらはAndroid Studioと一緒にインストールされているもの。とてもソースがきれい。)
小ネタ的にわかったこととして、ゆっくり中途半端な位置で手を離したとき、次の画面に行くかどうかの閾値は0.4だった。すなわち40%以上動かしていれば次の画面に行くということ。(速く動かしたときは勢いで次の画面に行く)
定数でぐぐったら、どうやら同じ部分を読んでる人がいた。読めないけど。
http://www.yuanhh.com/2015/09/20/android-launcher-1/

## 感想

Launcherをそのまま再利用するのは難しそう、ということはわかったが、色々コメントは書かれているし、あとでもう少し読んでみて参考にしたいと思う。
@operandoOS氏から紹介された方法として、
$ adb shell dumpsys activity top
でアプリやViewの要素を列挙すれば、上の部分(Workspaceとか)は一発でわかる。5.0のシミュレータで実行したところ、Launcher2と出てきたので、使っているのはLauncher2のほうなのかもしれない。ツールを使って調べるのと、ソースを読むのを行き来するのが良さそうだ。
adbを使いこなしていないので、今後の開発に生かしていきたい。
少しだけ深い部分を読むというのはとても良い試みだと思った。思い出したときにどんどん読んでいきたい。
Android版NendAdViewのNendApiKeyとNendSpotIdをdebug用release用に分けて定義した時にハマった話

今回の記事は前置きが少し長いです。ご了承くださいm(_ _)m

# はじめに
AndroidアプリにNendを使った広告を表示するためにNendAdViewを使います。広告を表示するために必要な文字列型のNendApiKeyと整数型のNendSpotIdを設定する必要があります。

この手の広告を表示するアプリの開発をしている途中にはデバッグ用のNendApiKeyとNendSpotIdを用います。（リリース用と併用すると意図しないログが送られます。Google先生のアドシステムだったらアカウント停止ものですよ）
このときのアプリ改修の流れは、
1. NendApiKey, NendSpotIdをデバッグ用に切り替える。
2. アプリの改修と動作確認を行う。
3. NendApiKey, NendSpotIdをリリース用に切り替える。
4. アプリリリース。
となりますが・・・ぶっちゃけ切り替えが面倒くさいです。面倒くさいのでAndroidStudioの機能を使ってデバッグ時とリリース時の値を切り替えるようにしました。

前置きが長くなりましたが・・・
**今回はそのときにハマったポイントと解決策を提示していきます。**

# debugフォルダにNendApiKeyとNendSpotIdを定義したvalue.xmlを別に定義してみた
一番最初に思いつく方法がこれでしょう。。。私は以下のような構成にしてうまくいくか試してみました。

以下のキャプチャではdebugとmain(release用)にNendApiKey,NendSpotIdを定義したapi_key_and_spot_id.xmlを設置しました。
![スクリーンショット 2015-11-27 1.01.36.png](https://qiita-image-store.s3.amazonaws.com/0/14989/0b2b6db9-e4d0-3859-00fa-1b941dc79932.png)

NendAdViewを表示するlayout.xmlは以下のようにします。

```xml:layout.xml

・・・

<net.nend.android.NendAdView 
    android:id="@+id/nend"
    NendApiKey="@string/nend_api_key"
    NendSpotId="@integer/nend_spot_id"
    android:layout_width="wrap_content"
    android:layout_height="50dp"
    android:layout_gravity="center_horizontal" />
</LinearLayout>
```

## 問題点
ところがいざ動作確認してみると画面初期化時に落ちてしまいました。layout.xmlをパースしているところでExceptionが出ています。NendAdViewインスタンス生成の段階でエラーが出ているのが原因でした。

このエラーの原因はNendSpotIdに設定するべき値が「まともな数値」でないことでした。上記のようなlayout.xmlだと、**NendAdViewのNendSpotIdとして設定される値は@integer/nend_spot_idが差している整数値ではなく、@integer/nend_spot_idによって定義されたR.id.nend_spot_idの値そのものになるからです。**
R.id.***という値は膨大に絶対値がでかい値だったりするので、普通のプログラムで使う値としてはありえない値なんです。

# debug,mainフォルダに対応するApiKeyとSpotIdをベタ打ちしたNendAdViewのlayout.xmlを定義してみた
全項目に記載した問題に対応するべく、今度は値でなく**ApiKeyとSpotIdを設定したNendAdViewを記載したlayout.xmlをdebug用、release用と用意しました。**

以下のキャプチャではdebugとmain(release用)にNendAdViewを定義したnend_banner.xmlを設置しました。
![スクリーンショット 2015-11-27 1.24.28.png](https://qiita-image-store.s3.amazonaws.com/0/14989/d50ea75c-27f5-baff-69c6-db298fa01185.png)

```xml:nend_banner.xml
<?xml version="1.0" encoding="utf-8"?>
<net.nend.android.NendAdView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/nend"
    NendApiKey="[NendApiKeyをベタ打ち]"
    NendSpotId="[NendSpotIdをベタ打ち]"
    android:layout_width="wrap_content"
    android:layout_height="50dp"
    android:layout_gravity="center_horizontal" />
```
(ApiKeyとSpotIdをさらすわけにはいかないのでここはぼかしました)

NendAdViewを表示するlayout.xmlは以下のようにします。

```xml:layout.xml

・・・

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"></ListView>

    <include layout="@layout/nend_banner"/>

</LinearLayout>
```

こうすることで起動する時にExceptionが出ることなく正常に起動できました。
もちろんdebugビルドとreleaseビルドでApiKeyとSpotIdを切り替えることにも成功しています。


# まとめ
整数値を指定するタイプのAPIキーを扱う場合は、値そのものをdebug,releaseと分けるのでなく、値を設置したViewそのものをdebug,releaseと分けるとうまくいきます。

NendAdViewに限らず同じような問題でハマった時はこの方法は使えるかもしれません。
thrustのdevice_vectorとdevice_ptrと"raw"デバイスポインタ

cudaを使ってnvidiaのGPUで演算するときに、慣れるまでdevice_ptrや"raw"デバイスポインタの必要性をなかなか理解できなかったので、まとめてみました。

# メモリ管理方法が違う
- クラス自身が管理
 - device_vector
- 自分でnew/delete, malloc/freeを管理
 - device_ptr (device_newやdevice_mallocで作る。)
 - "raw"デバイスポインタ (cudaMallocで作る)

# 利用できる位置が違う
- ホスト関数でのみ利用可能
 - device_vector
- ホスト関数でもデバイス関数でも利用可能
 - device_ptr
- デバイス関数でのみ値を参照可能
 - "raw"デバイスポインタ

# 例

```cpp:h_arrays.cu

__host__
void h_func(thrust::device_vector<int>& ioVec,
            thrust::device_ptr<float>& ioPtr,
            double* ioRawPtr,
            const int inSize)
{
  // (1) device_vector
  ioVec.resize(inSize); // device_vectorの恩恵は、__host__ならでは。
  ioVec[inSize-1] = 3; // こんなに簡単にdeviceの値を書き換えることができる
  thrust::transform(ioVec.begin(), ioVec.end(),
            ioVec.begin(),
            [] __device__ (int v) -> int {
              return v*v;
            }); // transformやfor_eachでdevice_vectorが大活躍するのも__host__ならでは。

  // (2) device_ptr
  ioPtr[inSize-1] = .0f; // __host__でこそ、device_ptrの利便性が高い
  const float sum = thrust::reduce(ioPtr, ioPtr + inSize); // "raw"デバイスポインタだと無理。

  // (3) rawデバイスポインタ
  device_ptr<double> d_ptr = thrust::device_pointer_cast(ioRawPtr);
  d_ptr[inSize-1] = 3.14; // __host__でrawデバイスポインタの値を参照する唯一の方法
}
```
```cpp:d_arrays.cu
__device__
void d_func(thrust::device_ptr<float>& ioPtr,
            double* ioRawPtr, const int inSize) // device_vectorは使えない
{
  // (1) device_vector
  // device_vectorは使えない

  // (2) device_ptr
  ioPtr[inSize-1] = .0f; // __device__だと何となく普通。
  const float sum = thrust::reduce(thrust::device, ioPtr, ioPtr + inSize); // execution policy

  // (3) rawデバイスポインタ
  d_ptr[inSize-1] = 3.14; // __device__なのでアクセスできる。
}

```

言い忘れましたが、device_ptrと"raw"デバイスポインタは、```device_pointer_cast()```と```raw_pointer_cast()```を使って、相互変換することができます。

#余談
もう"raw"デバイスポインタは必要性がないんじゃないかな。cudaMallocを捨てて、device_mallocを利用することでホスト側からもデバイス側からもアクセスできてバグが減りそう。
[Swift]途中で停止可能なforEachを暇つぶしに書いてみたメモ


## はじめに

ArrayのforEachなどで、ループの途中でやめたいときがあるかもしれない。
個人的にはそんなことはないのだが、なんとなく思いついて、それっぽいことが出来るようにしてみた。

## 実装

```swift:
extension Array {
    func forEachWithBreak(operation: (Element, () -> ()) -> ()){
        var loop = true
        func fail(){
            loop = false
        }
        label: for item in self {
            operation(item, fail)
            if loop == false {
                break label
            }
        }
    }
}

```

Elementが肝。
Elementは配列の要素の型を表している（ようだ）。

>Elementを使うことにより、Arrayのextensionなどで作るのが難しそうに思われていた（？）ジェネリクスなメソッドを作れる。

## 使い方

```swift:整数のArray
let ints = [1, 2, 0, 3]

ints.forEachWithBreak { (it, fail) in
    if it == 0 {
        fail() // fail()を呼び出すことによりループから脱出する。関数名は別にfailでなくともよい。
        return
    }
    print("it: \(it)")
}

```

```swift:文字列のArray
let strs = ["hello", "world", "", "last"]

strs.forEachWithBreak { (it, fail) in
    if it == "" {
        fail()
    }else{
        print("string: \(it)")
    }
}
```

## 言い訳

暇つぶしなので、深く考えてません。

Array以外でもできそうだが(Listとか）、眠いのでやらない。

## 追記：SequenceType

SequenceType向けに修正してみた。
Array版とほぼ一緒ではある。

```swift:
extension SequenceType {
    public func forEach(condition: Generator.Element -> Bool, operation: Generator.Element -> Void){
        for item in self {
            if !condition(item) {
                break
            }
            operation(item)
        }
    }
}

let ary = [1, 2, 3, 4, 5]

ary.forEach({$0 < 3}) {
    print("number: \($0)")
}

let str = "abcDEFgh"

str.characters.forEach({"a" <= $0 && $0 <= "z"}) {
    print("lower case: \($0)") // forEachというメソッド名に違和感を感じる気がする（？）
}

let dic = [1: "one", 2: "two", 3: "three"]

dic.forEach({$0.0 < 3}){
    print("value: \($0.1)") // 順序が保証されないので結果は不確定
}
```
Swift2.0 文字列を正規表現で置換するコード

Swift2.0で、文字列を正規表現で数字のみに置換するコード

```RegExp.swift
var str:String = "1s2Hd34G"
str = str.stringByReplacingOccurrencesOfString("\\D", withString: "$1", options: NSStringCompareOptions.RegularExpressionSearch, range: nil)

// 1234
print(str)
```
[CocoaPods] 初めてPodfileを使った時に起きたエラー

初めてPodfileを作成してライブラリーを追加、pod installした後、Buildしたら以下のエラーが出た

>linker command failed with exit code 1 (use -v to see invocation)

調べてみると、Podを使う時はXcodeを開く時は「プロジェクト名.xcworkspace」からじゃないとダメらしい。Xcodeを閉じてプロジェクトフォルダから「プロジェクト名.xcworkspace」をダブルクリックしてXcodeを開いてBuileをしたら無事Buildできた
Raspberry Pi で DNS サーバを指定する

```shell-session
% ping google.com
ping: unknown host google.com
```

再起動するたびに↑のように言われないように、`/etc/network/interfaces` 内の `dns-nameserver` を設定します。インターフェイスごとに設定します。

私の Raspberry は wlan0 でインターネットに出て行っているので、wlan0 で指定しています↓

```setting:/etc/network/interfaces
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.11.30
netmask 255.255.255.0
gateway 192.168.11.1
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
dns-nameservers 192.168.11.1
```

dns-nameservers の最後の **s** を忘れると上手く設定されません。
IP アドレスを半角スペースで区切って複数指定することもできます。

`/etc/resolv.conf` を書き換えても反映されますが、起動時に NetworkManager によって `/etc/network/interfaces` での設定をもとに書き換えられてしまうので、こちらを変えましょう。


# 参考
[Debian Wiki - The resolvconf program](https://wiki.debian.org/NetworkConfiguration#The_resolvconf_program)

Raspberry OS はほぼ Debian と一緒なので、知りたいことと "Debian" を添えて検索すると大体解決できます。
複数の Channelからデータを受け取る

追記: `earlist`構文は 2015年 12月 5日付で削除されました. 代わりに react + wheneverを使う必要があるようです.

この機能は 2015年 11月 26日現在バグだらけです. CPUを喰いまくる, lexical scopeがおかしくなるといった問題があります. ご利用の際はご注意ください.


Goで言うところの `select`です.
Perl6では `earliest`を使います. 以下に例を示します.

```perl6
use v6;

my $c = Channel.new;
my $e = Channel.new;

start {
    for 1..10 {
        $c.send($_);
        sleep 0.5;

        $e.send("Error!!!!!") if $_ == 7;
    }
    $c.close;
}

loop {
    # 待ち受けるチャネルを指定. *(ワイルドカードも可能)
    earliest $c, $e {
        # moreで sendされたメッセージを受け取る. ここも *が指定可能
        more $c -> $v { say "$v from channel" } 
        more $e -> $v { say $v; last; }
        # closeした場合に呼ばれるブロックは done. 1度しか呼ばれないわけではない.
        done $c -> { last; }
    }
}

say "Done";
```

結果は以下のようになります.


```
% perl6 test.pl6
1 from channel
2 from channel
3 from channel
4 from channel
5 from channel
6 from channel
7 from channel
Error!!!!!
Done
```

使用した Perl6

```
% perl6 --version
This is perl6 version 2015.11-68-gd3c278d built on MoarVM version 2015.11-5-g308b9b7
```
JSON Server - 簡単にAPIのモックを作成


Apiの実装がまだ終わっていないので、フロントの作業が進まない、、
そんな時にJSON Serverを使って、ローカル環境にAPIのモックアップを作ることができました。

# インストール
```
npm install -g json-server
```
以上です。

# JSONデータを用意
保存場所はデスクトップでもどこでも大丈夫です。
`db.json`といった名前でJSONファイルを保存してください。


```
{
　　　// ルーティングのためのキーが必要
	"list": [
		{
			"id": 1
			"name": "yamada"
			"gender": "M"
		},
		{
			"id": 2
			"name": "satou"
			"gender": "W"
		},
		{
			"id": 3
			"name": "tanaka"
			"gender": "M"
		}
	]
}
```

# Json-serverを起動
`db.json`を使って、Json-serverを起動します。

```
$ json-server --watch db.json

  \{^_^}/ hi!

  Loading db.json
  Done

  Resources
  http://localhost:3000/list

  Home
  http://localhost:3000

  Type s + enter at any time to create a snapshot of the database
  
  Watching...

```
あとは`http://localhost:3000/list`にアクセスするだけで良いようです。

```
curl http://localhost:3000/list

[
  {
	"id": 1
	"name": "yamada"
	"gender": "M"
  },
  {
	"id": 2
	"name": "satou"
	"gender": "W"
  },
  ~ 
]
```

# POST形式でリクエストする
POST形式でリクエストすると、db.jsonに送信したデータが保存できます。

```
curl -X POST http://localhost:3000/list -d name=fugafuga

{
  "name": "fugafuga",
  "id": 4
}
```
これで、"name": "fugafuga" なレコードが追加されます。

GruntやGulpを使わずとも簡単にAPIのモックを作ることができました。routesを設定すれば、もう少し色々できそう。気軽にモックを作成したい時に使っていきたいと思います。


## 参考
- [json-serverがすごく便利だった](http://sssaburo.hatenablog.com/entry/2015/06/23/002919)
- [【個人メモ】JSON Serverを使って手っ取り早くWebAPIのモックアップを作る](http://qiita.com/futoase/items/2859a60c8b240da70572)
XCodeでUIをテストする


XCode7からUIのテストを録画（？）して記述できるようになったので試してみます。

##UIテストしてみよう
プロジェクト作成時に「Include UI Tests」にチェックを入れておきましょう。

![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/77573/7b736418-f5d3-b1cc-e48e-2fe316ac396d.png "screen1.png")

テスト用に簡単なサンプルを用意します。
テキストフィールドに名前を書き込んでボタンをタップすると
「Hello, 名前」とラベルに表示するだけの簡単なものです。

自動生成されているTestコードにカーソルが当たった状態になると画面下部の赤い丸ボタンが有効になるのでクリックします。

![スクリーンショット 2015-11-26 22.05.45.png](https://qiita-image-store.s3.amazonaws.com/0/77573/61f4e80f-3b04-0c61-289b-b1f0ca784a73.png "スクリーンショット 2015-11-26 22.05.45.png")

そうするとシミュレータが立ち上がってくるのでテキトーに操作してみましょう。
操作に応じてコードが生成されていくのが分かります。


![スクリーンショット 2015-11-26 22.08.31.png](https://qiita-image-store.s3.amazonaws.com/0/77573/37310501-9c08-6d0c-5365-7d2bab84a7cd.png "スクリーンショット 2015-11-26 22.08.31.png")

ここはテキストフィールドに「taro」と入力してボタンをタップしたところで録画を停止しました。
操作部分は自動でコードが生成されているので検証用のコードを追記します。

```
let app = XCUIApplication()
let textField = app.otherElements.containingType(.StaticText,identifier:"Label").childrenMatchingType(.TextField).element
textField.tap()
textField.typeText("taro")
app.buttons["Button"].tap()
     
//ここだけ手動で追加   
XCTAssert(app.staticTexts["Hello, taro"].exists)
```

「"Hello, taro"という静的テキストがあるよね」という検証を追加しました。
あとはCommand+Uでテストが走ります。

iOS開発のUIテストフレームワークとしては[KIF](https://github.com/kif-framework/KIF)が有名ですが、私は使ったことがないので比較できません。
ただ、操作部分を記述する必要がないのは便利だなーと思います。
Excel で別ブックを開くとマクロが止まる件

Excel で簡単な集計マクロを組んでたのですが、
WorkBooks.Open で他のブックを開いたところでマクロが止まってしまいました。

Call MsgBox("開くよ")
Set book = WorkBooks.Open("hoge.xls")
Call MsgBox("開いたよ")

hoge.xls は問題なく開くのですが、「開いたよ」が表示されません。特にエラーも出ません。

#原因

マクロの実行を Ctrl+Shift+A に割り当てていたのですが、この Shift が悪さをしていたようです。
マクロを Ctrl+A にしたら無事表示されました。

#考察

Shift を押しながらブックを開くとマクロを自動実行しない…という機能に引っかかったみたいですね。

できれば他の機能と被らないよう Shift を入れたいのですが、
セキュリティオプションをぐりぐりする以外に方法はないものでしょうか…？
pigzを試す


# インストール

* epelリポジトリを登録しておく

```bash
# yum install pigz
```

# 実験

* 2コアのさくらVPSサーバーで試したところ確かに早くなっている

```bash
$ cat /proc/cpuinfo | grep pro
processor       : 0
processor       : 1

$ fallocate -l 1GB 1GB.dat
$ ll
-rw-r--r-- 1 ymko users 1000000000 11月 26 23:12 1GB.dat
$ time tar cvfz a.tar.gz 1GB.dat
1GB.dat

real    0m18.533s
user    0m17.350s
sys     0m4.352s
$ rm a.tar.gz

# sync
# echo 3 > /proc/sys/vm/drop_caches

$ time tar cvf a.tar.gz --use-compress-prog=pigz 1GB.dat
1GB.dat

real    0m8.894s
user    0m15.435s
sys     0m1.825s
```


# 参考

Linux - マルチコアでgzファイルの圧縮解凍ができるpigzの使い方 - Qiita
http://qiita.com/itukizora/items/10a9e7fffff857de374b

Utilizing multi core for tar+gzip/bzip compression/decompression
http://www.linuxquestions.org/questions/linux-software-2/utilizing-multi-core-for-tar-gzip-bzip-compression-decompression-4175426075/

マルチコアCPUで 圧縮・解凍をする方法 | さぶみっと！JAPAN
http://www.submit.ne.jp/1500

yumでインストール出来るpigzコマンドでマルチコア性能を生かした高速並列圧縮をする - Y-Ken Studio
http://y-ken.hatenablog.com/entry/parallel-compress-with-pigz
lambdaR「俺もいるぜ」

うさぎさんのこの記事で、`purrr` と `rlist` を比較しているわけですが、

- [{purrr} でリストデータを操作する <1>](http://sinhrks.hatenablog.com/entry/2015/11/26/220956)

この程度のリスト操作なら **lambdaR** でもできます。

- [R にラムダ式を導入するパッケージ lambdaR を作った](http://d.hatena.ne.jp/hoxo_m/20141204/p1)

```r:R
packages <- list(
  list(name = 'dplyr', star = 979L, maintainer = 'hadley' , authors = c('hadley', 'romain')),
  list(name = 'ggplot2', star = 1546L, maintainer = 'hadley' , authors = c('hadley')),
  list(name = 'knitr', star = 1047L, maintainer = 'yihui' , authors = c('yihui', 'hadley', '...and all'))
)

# パッケージのロード
library(lambdaR)
library(magrittr)
library(pipeR)

# 属性の選択
packages %>% Map_(x: x$name)
packages %>% Map_(x: list(maintainer=x$maintainer, star=x$star))

# ラムダ式
nums <- c(a = 3, b = 2, c = 1)
nums %>% Map_(x: x + 1)
nums %>% Map_(._ + 1)

nums %>% list(seq_along(.)) %>% Map2_(x, i: i)
nums %>% list(names(.)) %>% Map2_(x, name: paste0("Name: ", name))

# 属性の追加、変更
packages %>% Map_(x: list(star=x$star, had="hadley" %in% x$authors))

# 結果の型の変更
packages %>% Mapv_(x: x$star)
packages %>% Map_(x: data.frame(name=x$name, star=x$star)) %>% Reduce_(rbind)

# 関数の適用
packages %>>% (~ Map_(., x: cat(x$name, ":", x$star, "\n")))

# レコードの選択
packages %>% Filter_(x: x$star >= 1500)
packages %>% Filter_(x: "yihui" %in% x$authors)
```

Enjoy!
tmuxでウィンドウ名が勝手に変わらないようにする

`tmux.conf`に

```
set-option -g allow-rename off
```

を追加．

シェル自体の設定を変える方法もあるようだがTmuxの問題なのでTmuxの設定だけで解決する方法をとりたかった．

## References

- [bash - Tmux window title keeps renaming - Stack Overflow](http://stackoverflow.com/questions/17289439/tmux-window-title-keeps-renaming)
- [tmux で automatic-rename off が効かない場合の対処 - Qiita](http://qiita.com/takus/items/c166700393481cb15e0c)
Tableauの基礎の基礎（地理情報を使ったビジュアライズ）


最近、AWSとセットで導入されるBIツール「Tableau」について、基本的な使い方をまとめてみました。「Tableau」は非常に簡単なツールなので、エクセルを使える人なら簡単にデータを可視化することができます。

2019年8月3日追加 情報を一部アップデートし、再編集したものを自身のブログに公開しました。こちらをご覧ください。
https://tadaken3.hatenablog.jp/entry/tableau-map


「Tableau」については以下のサイトもご覧ください。

- [Tableau公式サイト](http://get.tableau.com/ja-jp/trial/tableau-software.html?cid=70160000000YmmJ&ls=Paid%20Search&lsd=Google%20AdWords%20-%20Tableau%20-%20APAC%20-%20JP%20-%20Free%20Trial&adgroup=Tableau%20-%20Brand%20-%20All&kw=tableau&adused=54853941890&distribution=search&gclid=Cj0KEQiA-NqyBRC905irsrLr-LUBEiQAWJFYTuwQDatzZ5HFGcDSfglVQMjJ3xof3s5c1ru8qXMIZJ0aAi8G8P8HAQ)
- [Tableau Desktopで出来る事のまとめ](http://dev.classmethod.jp/cloud/aws/tableau-desktop-features-matome/)
- [Tableau Publicのご紹介 ~Web上で使える可視化に優れたBIツール~｜分析環境を考える](http://www.graffe.jp/blog/835/)

今回は無料で使えるtableau Publicを使用しています。製品版のtableau Desktopと機能的にはほとんど、変わりません。DLサイトはこちら↓
https://public.tableau.com/s/


##データの準備
PythonのPandasモジュールを使用して、
Wikipediaの「都道府県別の人口一覧」ページからデータを取得しています。
~~（tableau publicだと、テキストファイルしか扱えないため、CSVファイルを出力しています。
　製品版だと、DBから直接データを取得することができます）~~

tableau10.0からtableau publicがGoogleスプレッドシートとWebデータコネクタに対応しました。
しかも、Googleスプレッドシートが更新されると日時処理で自動更新されます。tableau public始まりすぎ。(追記:2016-10−05)


```py
import pandas as pd

url = 'https://ja.wikipedia.org/wiki/%E9%83%BD%E9%81%93%E5%BA%9C%E7%9C%8C%E3%81%AE%E4%BA%BA%E5%8F%A3%E4%B8%80%E8%A6%A7'
fetched_dataframes = pd.read_html(url, header = 0)
df = fetched_dataframes[0]
df.to_csv("population.csv", index = False,encoding='utf-8')	 
```

##データの読み込み
tableau publicを立ち上げて、さきほどのCSVファイルを読み込みます。とくに設定などは必要ありません。（population.csvというファイルです）

![スクリーンショット 2015-11-26 22.49.48.png](https://qiita-image-store.s3.amazonaws.com/0/100312/8848362c-5019-d80e-c905-a92233f8a8f1.png)


##データの可視化
今回は、都道府県ごとの人口増減率を算出し、それを地図上に可視化したいと思います。まず、人口増減率の計算をしていきます。エクセルのような感じで、計算式を入れていきます。今回は使用していませんが、ひととおり関数も用意されており、ほんとうにエクセルみたいに簡単に計算できます。
###
![スクリーンショット 2015-11-26 22.22.45.png](https://qiita-image-store.s3.amazonaws.com/0/100312/9a95568e-b32b-af0b-fa5a-8c9c05fda3f3.png)

今回は地図を使用したいため、ディメンジョン「都道府県」に「地理的役割」を指定します。米国のツールなので、「州」になっていますが、こちらを指定すると日本の都道府県をきちんと認識してくれます。
![スクリーンショット 2015-11-26 22.21.35.png](https://qiita-image-store.s3.amazonaws.com/0/100312/d2ea2b0f-d6c4-19a0-faca-2f947c2d36cd.png)

都道府県をダブルクリックすると、「Tableau」が自動で認識して、最適なビジュアル表現を選んでくれます。今回の場合、地理的情報を設定しているので、地図が表示されます。（もちろん、自分で設定することもできます。）今回は人口増減率で色で表現したいと思うので、マークの箇所に先ほど作成した「人口増減率」のメジャーを入れます。
![スクリーンショット 2015-11-26 22.23.42.png](https://qiita-image-store.s3.amazonaws.com/0/100312/dde87f02-4981-9a96-2e60-d38d74ab9345.png)


「人口増減率」を選択して「色」を指定します。
![スクリーンショット 2015-11-26 22.23.51.png](https://qiita-image-store.s3.amazonaws.com/0/100312/84302ca5-fba1-9569-d12c-95f2fb4a8fe6.png)
すると、人口増減率で各都道府県が色分けされます。
関東以外、ほとんど真っ赤ですね。
![スクリーンショット 2015-11-26 23.09.00.png](https://qiita-image-store.s3.amazonaws.com/0/100312/af94f77a-89f5-a1a3-6cc4-2de7f6b65dbb.png)

あとは、書式やコメントなどで補足してあげると完成です。完成したファイルは、tableau publlicの公式サイトにアップロードし公開することができます。[こんな感じです。](https://public.tableau.com/profile/publish/_4181/sheet0_1#!/publish-confirm)

![都道府県別の人口増減率.png](https://qiita-image-store.s3.amazonaws.com/0/100312/b5ae412c-135b-8122-abf9-a6cff244b6f5.png)
has_oneに 代入したら INSERT

RailsのActiveRecordは、リレーションまでまとめて扱えて便利です。ただ、うっかりしていると思わぬ動作が走ってしまうことがあります。

# たまに必要な`has_one`
`has_many`はともかく、`has_one`はあまり使う機会が多くないかもしれません。ただ、親に対して子が「発生するかわからない」場合には常に余計な列を用意せずに済むので、便利かもしれません。

`has_many`同様、モデルで宣言することで関連付けらますし、`accept_nested_attributes_for`で親モデルからまとめて保存もできるようになります。

# データを編集する準備…のはずが、エラーに
そして、フォーム作成に`simple_form`を使っていたので、事前に空の子モデルを用意する必要が出て来ました（そうしないと子モデル向けのフォームが出ない）。そこで、

```rb:失敗例

class Parent < ActiveRecord::Base
  has_one :child
  accept_nested_attributes_for :child
end

class Child < ActiveRecord::Base
  belongs_to :parent
end

class ParentsController < ApplicationController
  def edit
    @parent = Parent.find(params[:id])
    @parent.child ||= Child.new
  end
end

```

このようにしたところ、`Child.new`の行でデータベースエラーを食らってしまいました。調べてみると、既存のモデルに`has_one`の子モデルを代入すると、それだけで**`save!`が発動して**、そしてDBのほうでNOT NULLをかけた列も`nil`のまま走ろうとしたために例外が飛んでいました（もちろん、新規作成の場合には、親の都合で`save`しないので問題はありませんでした）。

# 正しい対応
結局、こういう場合に「保存せずに子モデルを追加する」正しい方法は、`@parent.build_child unless @parent.child`というような、`build_xxx`メソッドを使う方法でした。
Arch Linuxをインストールする

Arch Linuxをインストールしました。インストール手順の備忘録です。

## 手順
1. 準備
  1. LiveUSBを作成して起動する
  2. Keyboard Layoutを設定する
  3. Internetに接続する
  4. System Clockを設定する
  5. ディスクドライブのパーティションを設定する
  6. パーティションをフォーマットする
  7. パーティションをマウントする
2. インストール
  1. pacmanのミラーを設定する
  2. ベースパッケージをインストールする
  3. ブートローダをインストールする

## 参考
https://wiki.archlinux.org/index.php/Installation_guide
CentOS > 101 us keyboard > JPキーボードとなっていた > デスクトップ環境の設定を変更

```txt:動作環境
CentOS 6.5 on vmware fusion on MacOS X 10.8.5
```

## 症状
東プレ REALFORCE (101keyboard)をCentOSで使用して少しはまった。

/etc/sysconfig/keyboardは以下であった。

```
KEYTABLE="us"
MODEL="pc105+inet"
LAYOUT="us"
KEYBOARDTYPE="pc"
```

しかしながら、101キーボードでなくJP106で認識しているようだった。

## 対応
CentOS6.5のデフォルトのデスクトップ環境の設定がJapaneseになっていた。

1. System > Preferences > Keyboardを選択
2. Layoutsタブを選択
3. LayoutにてEnglish (US)をDefaultに選択

以上で101キーとして認識した。
Rails + Devise のテストを、Cucumber + Poltergeist で行っていたらハマった（解決済み）

2015年11月現在、Rails のプロダクトでユーザ認証機能（いわゆるログイン、ログアウト）を作るとしたらデファクトスタンダードとなっている Devise という Gem ですが、

https://github.com/plataformatec/devise

歴史の長いフレームワークなだけあって、ちょっと記述が古い点があります。例えば
```rails g devise:controller hoge```
で追加される controller が before_action ではなく before_filter を使っていたり。

まぁそこらへんは適時 Rubocop あたりに修正してもらうとして、とはいえデフォルトの設定のまま使うこともないので、記述の古さや遷移先等を修正したり、Userモデルにカラムを追加したりしたら、テストを書きたくなるわけです。

というわけでとりあえず、
[rails3-devise-rspec-cucumber](https://github.com/RailsApps/rails3-devise-rspec-cucumber)
の記述を参考にしつつ、可能な限りモダンな RSpec, Cucumber を書いていったわけなのですが、問題が。

実際に手で動かしたら再現しない、テストの失敗がでました。


# 構成

 * Ruby : 2.2.3（rbenv でインストールされる最新）
 * Rails : 4.2.4
 * devise : 3.5.2
 * cucumber : 1.3.20
 * poltergeist : 1.8.0

Rails.root/support/env.rb に ```Capybara.default_driver = :poltergeist``` と記入し、全ての Cucumber の受け入れテストに poltergeist の driver を使う設定としました。

また、 Devise ではメール認証を行うため、「confirmable」のコメントアウトを外し、有効にする設定にしました。


# エラーの箇所

[sign_in.feature](https://github.com/RailsApps/rails3-devise-rspec-cucumber/blob/master/features/users/sign_in.feature) の最初のテスト、9行目「```Then I see an invalid login message```」が失敗しました。本来なら [user_steps.rb](https://github.com/RailsApps/rails3-devise-rspec-cucumber/blob/master/features/step_definitions/user_steps.rb) の 109行目に記述のある「Email is invalid」に類する、カラムの値がおかしい旨のメッセージが表示されたいのですが、実際には、

```You have to confirm your email address before continuing.```

という、「ユーザ登録は行っているが、メール認証は行っていない」ときのエラーがでました。
ちなみに、 rack_test だと、このエラーは出ませんし、もちろん、手動で動かした場合は、「Email is invalid」が表示されます。


# 試行錯誤

user_steps では「一度ユーザを作って削除している」という動作を行っているため、その前後でsession, cookie を削除する処理を入れましたが、それでもどうしようもなく。


# 解決策

devise の github の wiki に、解決策が載っていました。

[How To: Test with Capybara#Capybara and Poltergeist](https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara#capybara-and-poltergeist)

Cucumber の問題だと思って見逃してしまっていました。

[指定されたファイル](https://raw.githubusercontent.com/railscasts/391-testing-javascript-with-phantomjs/master/checkout-after/spec/support/share_db_connection.rb)を Rails.root/features/support/ 下に置けば、とりあえず動きました。
とりあえず、動いたのでOK。

# オチ

ちなみにこのファイルが入った状態で Rubocop で構文チェックを行ったところ、怒られました。クラス変数をインスタンス変数に変更しても動いたので、よし。
そして動いたのはいいけれど、JavaScript を使っていないテストは、時間短縮のため rack_test で行うことに。


# ちなみに（これは未解決）

capybara-webkit でも出たので、phantomJS との相性なのかなぁ、と思っています。
YAML : リストとディクショナリ

Ansible の playbook は YAML で書く。

```yaml
- name: NAME
  action: ACTION
```

"`- `" で始めるのはリストで、*name*`:` *parameters* の繰り返しはディクショナリなので、うっかり

```yaml:
 - name: NAME
   action: ACTION
   when: WHEN 1
   when: WHEN 2
```

なんてことを書くと、ディクショナリのところは後から宣言されたものが残って `when: WHEN 1` はなかったことになる。

```
% python
Python 2.7.6 (default, Sep  9 2014, 15:04:36) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import yaml
>>> y = yaml.load("""
... - name: NAME
...   action: ACTION
...   when: WHEN 1
...   when: WHEN 2
... """
... )
>>> print y
[{'action': 'ACTION', 'when': 'WHEN 2', 'name': 'NAME'}]
```

when で複数条件は `and` で結ぶ。

```yaml:
 - name: NAME
   action: ACTION
   when: WHEN 1 and WHEN 2
```


```
>>> y = yaml.load("""
... - name: NAME
...   action: ACTION
...   when: WHEN 1 and WHEN 2
... """
... )
>>> print y
[{'action': 'ACTION', 'when': 'WHEN 1 and WHEN 2', 'name': 'NAME'}]
```

まあ、考えてみれはあたりまえなのだけれど、うっかり `when:` を複数書いてしまったことは秘密だ。
docker build中にディスク容量ないぞ！って怒られる場合の対処法


Macでboot2dockerからdocker-machineに乗り換え後の話。

`docker build`中、一発目のapt installで死ぬ。
`You don't have enough free space` とか `no space left on device` とか言われる。


下記はapt中に怒られた時のログ。

```
(前略)
  libxcb-present0 libxcb-randr0 libxcb-render-util0 libxcb-render0
  libxcb-shape0 libxcb-shm0 libxcb-sync1 libxcb-util0 libxcb-xfixes0
  libxcb-xkb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxdmcp6
  libxext6 libxfixes3 libxfont1 libxi6 libxinerama1 libxkbcommon-x11-0
  libxkbcommon0 libxkbfile1 libxml2 libxmu6 libxmuu1 libxpm4 libxrandr2
  libxrender1 libxshmfence1 libxslt1.1 libxt6 libxxf86vm1 perl perl-modules
  qttranslations5-l10n rename sgml-base shared-mime-info ucf wkhtmltopdf
  x11-common x11-xkb-utils xauth xdg-user-dirs xfonts-base xfonts-encodings
  xfonts-utils xkb-data xml-core xnest xserver-common
0 upgraded, 187 newly installed, 0 to remove and 0 not upgraded.
Need to get 95.8 MB of archives.
After this operation, 348 MB of additional disk space will be used.
E: You don't have enough free space in /var/cache/apt/archives/.
The command '/bin/sh -c apt-get -y install wkhtmltopdf' returned a non-zero code: 100
```


原因は簡単。docker-machineで作ったVMの容量が足りない。
まだ一つ目のコンテナを作り始めた程度だったので、VMごと作り直しで対処。

```bash
$ docker-machine rm local
$ docker-machine create --virtualbox-disk-size 10000 --driver virtualbox local
```
Fabricでの接続時にssh_configを参照させる

Fabric では ssh の接続に Paramiko をつかう。
というわけで、ssh_config に ProxyCommand を指定してあったとしてもそのままでは読んでくれない。

参照させるには、頭のほうに

    from fabric.state import env
    env.use_ssh_config = True 

を入れる。

IdentityFile、ForwardAgent についても設定できる。

デフォルトでは

    env.key_filename = None
    env.forward_agent = False

マニュアルには

> `dentityFile` は `env.key_filename` を(置き換えるのではなく)拡張します。

とあるので、

    if not env.key_filename:
        env.key_filename = []
    env.key_filename.append('/path/to/file')

のようにするのが正しいのだろうか。

詳細は [実行モデル — Fabric  ドキュメント> ネイティブのSSH configファイルの活用]
(http://fabric-ja.readthedocs.org/ja/latest/usage/execution.html#leveraging-native-ssh-config-files) を参照する。
うっかり Ctrl+z でジョブをバックグラウンドに送ってしまった時にするべきこと

# 基本形

vi とか実行中に間違って Ctrl+z を押してバックグラウンドに送ってしまったら・・・。

```shell-session
[1]+  停止                  vi
$
```

慌てず騒がず `fg` を実行する。

```shell-session
[1]+  停止                  vi
$ fg
```

戻れる。
swiftで絵文字や半角文字が正しくカウントされない場合

# NSString.lengthを使おう
CoreText内部ではNSStringが使われている(と思う)ので、CoreTextと文字数を一致させるには、
NSString.lengthを使うとよさそうです。
逆に、表示されてる文字数ベースであれば、String.characters.countで良さそうです。
[hiragramさん](http://qiita.com/hiragram)ご指摘ありがとうございました。

# 試してみよう
## 以下のコードをplaygroundで実行してみる

```swift
func lengthPrint(str: String) {
    print("------: 1234567890123456789012345678901234567890")
    print("String: \(str)")
    print("Length: String(\(str.characters.count)) NSString(\(NSString(string: str).length))")
}

lengthPrint("​･゜ﾟ･​:.｡..｡.:​･'(*ﾟ▽ﾟ​)'･:.｡. .｡.:​･゜ﾟ･*​")
lengthPrint("😊")
lengthPrint("あ")
```

出力結果はこんな感じです。

```log
------: 1234567890123456789012345678901234567890
String: ​･゜ﾟ･​:.｡..｡.:​･'(*ﾟ▽ﾟ​)'･:.｡. .｡.:​･゜ﾟ･*​
Length: String(38) NSString(42)
------: 1234567890123456789012345678901234567890
String: 😊
Length: String(1) NSString(2)
------: 1234567890123456789012345678901234567890
String: あ
Length: String(1) NSString(1)

```


一見String.CharacterView.countの方が正しそうです。 
しかし、playgroundのコードを修正するために、Backwordで消そうとすると、NSString.lengthの文字列としてカウントされます。iOS上でも同様。絵文字はサロゲートペアでNSString.length=2と解釈されそうですが、キタワァーの顔文字は。。うーむ。。

顔文字の方は不可視の文字が入っていたためカウントが違っていたようです。[wakufactoryさん](http://qiita.com/wakufactory)ご指摘ありがとうございました。

# 不可視文字
見えない文字にまったく考えが至らずトンチンカンな記事を書いてしまいましたので、さらに掘り下げたいと思います。

```
･゜ﾟ･​:.｡..｡.:​･'(*ﾟ▽ﾟ​)'･:.｡. .｡.:​･゜ﾟ･*
```

について、ASCII範囲外はcodePointで出してみました。

```
\u{200B}\u{FF65}\u{309C}\u{FF9F}\u{FF65}\u{200B}:.\u{FF61}..\u{FF61}.:\u{200B}\u{FF65}\'(*\u{FF9F}\u{25BD}\u{FF9F}\u{200B})\'\u{FF65}:.\u{FF61}. .\u{FF61}.:\u{200B}\u{FF65}\u{309C}\u{FF9F}\u{FF65}*\u{200B}
```

この`U+200B`がZERO WIDTH SPACEで不可視文字です。

そして、こうしてみると、NSStringはUTF-16については、codePointをカウントしてそうです。



エンコーディングの闇が深い。。。
Slackに書いた分報をjqでまとめる雑なワンライナー

![image](https://qiita-image-store.s3.amazonaws.com/0/17353/13ca7b62-acc1-14a6-b4e8-8de4e343d10b.png)

こんな感じにします。

## 内容

```zsh
curl https://slack.com/api/channels.history\?token\=XXXXX\&channel\=YYYYY | jq -r '.messages | reverse | map((.ts | tonumber | .+32400 | todate) + " "  + .text) | .[]'
```

（2015/12/07 追記）別解。あんまりスマートにならなかった。tacを使う手もあったけど手元の環境に入ってなかったので、インストールしてまで…という感じ。

```zsh
curl https://slack.com/api/channels.history\?token\=XXXXX\&channel\=YYYYY | jq -r '.messages | reverse | .[] | [(.ts | tonumber | .+32400 | todate), .text] | join(" ")'
```

（2015/12/17 追記）markdownでtableになるバージョン。subとかgsub使いたかったけどよくわからないエラーが出ておっかけるのに時間かかりそうだったのでsplit→joinでお茶を濁す。ついでに日付は削った。

```zsh
curl https://slack.com/api/channels.history\?token\=XXXXX\&channel\=YYYYY | jq -r '.messages | reverse | .[] | [(.ts | tonumber | .+32400 | strftime("%H:%M:%S")), (.text | split("|") | join("\\|") | split("\n") | join("<br>"))] | join("|")'
```

（2016/2/16 追記）分報のチャンネルにbotの通知を流し始めたら、その投稿のtextがnullだったのでその対策を行ったバージョン。

```zsh
curl https://slack.com/api/channels.history\?token\=XXXXX\&channel\=YYYYY | jq -r '.messages | reverse | .[] | select(.text) | [(.ts | tonumber | .+32400 | strftime("%H:%M:%S")), (.text | split("|") | join("\\|") | split("\n") | join("<br>"))] | join("|")'
```

## slackのチャンネルの履歴の取得

https://api.slack.com/methods/channels.history
ここを読んだらだいたいできます。テストフォームがあるのでそこから試すと良いでしょう。テストフォームからトークン取るページに行ってトークンも取れます。

チャンネルIDは https://api.slack.com/methods/channels.list こっちのチャンネル一覧の結果に入ってます。

## jqで加工

帰ってくるjsonのmessages項目に配列で発言が入ってて、tsがタイムスタンプ（小数）、textが本文なので、1行に時間と本文が1つ出るように加工してます。

新しい物が上にくるのでreverseしてます。
32400は時差の解消です。
.[]は配列を1要素1行に分解するものです。
python > CentOS上でRPi用コード実行 > dummyGPIO > RPi.GPIOのダミー

```txt:動作確認
CentOS 6.5
```

CentOS6.5上において、RaspberryPi2用コードを書く時のダミー。
`import RPi.GPIO as GPIO`を実行しようとするとCentOS上ではエラーがでる。
また、GPIO.関数でもエラーがでる。それらエラーの回避用。

```dummyGPIO.py
'''
v0.1 2015/11/26
  - add setmode()
  - add setup()
'''

class CDummyGPIO:
	def __init__(self):
		self.BOARD = 0;
		self.OUT = 1;
		# do nothing
		return

	def setmode(self, board):
		# do nothing
		return

	def setup(self, pinnum, inout):
		# do nothing
		return

	def output(self, pinnum, onoff):
		# do nothing
		return

# Usage

'''
from dummyGPIO import CDummyGPIO
GPIO = CDummyGPIO()

GPIO.setmode(GPIO.BOARD)
GPIO.setup(10, GPIO.OUT)
'''
```

## 使用方法

1. `import RPi.GPIO as GPIO`をコメントアウトする
2. 上記のUsageの最初の二行を記載する

以上でGPIO.setmode(), GPIO.setup(), GPIO.output()の部分でエラーがでなくなる。

GPIO以外の部分のコーディングをCentOSで試す時に使っている。
SeleniumでPhantomJSを使う時に画像を読み込まない方法

スクレイピングする際、JSで動的につくられるDOMだけが欲しくて、画像はいらないよって時に。

元ネタは、[こちら](http://stackoverflow.com/questions/15371495/phantomjs-1-8-with-selenium-on-python-how-to-block-images)。

```py
from selenium.webdriver import PhantomJS
driver = PhantomJS(service_args=['--load-images=no'])
driver.get('http://xxxxxx.xxxxx')
```

コンスラクタで、PhantomJSのコマンドラインパラメーターを渡す。
オープンデータ俺的まとめ

どこを見ればオープンデータがあるか探すのが
めんどくさく
大変だったので、見つけ次第貼り付けていく俺的まとめです。
リクエストもらえれば追加します。
「オープンデータについてのオープンデータ」はよ。

##データ
|都道府県|City|URL|ひとこと|
|:--|:--|:--|:--|
|兵庫県|神戸市|http://www.city.kobe.lg.jp/information/opendata/catalogue.html|RDFあるならSPARQLエンドポイント欲しいやつ|
|北海道|札幌|https://ckan-sapporo.odcity.org/|タイトルタグがCKANまんま|
|企業|NHK|http://www.nhk.or.jp/strl/lod/index.html|本当にオープンデータなのかはともかく|
|?|LOD4ALL|http://lod4all.net/index.html|実はどういうものかよくわかってない|
|?|RDF Portal for NBDC|http://integbio.jp/rdf/|
|奈良県|宇陀市| https://www.city.uda.nara.jp/kouhoujouhou/databank/od.html|
|千葉県|---|http://www.pref.chiba.lg.jp/seisaku/toukeidata/opendata/|
|愛知県|岡崎市|http://www.city.okazaki.aichi.jp/1550/1552/1583/p015630.html|

掲載データ紹介は気が向いたら

##アプリ・サービス
|Name|URL|
|:--|:--|
|年収300万未満都市マップ、作ってみた。#GUNMAGISGEEK | http://shimz.me/blog/d3-js/4629|

##使えそうな技術

|Name|URL|こう使う？|
|:--|:--|:--|
|人型グラフ|http://shimz.me/blog/d3-js/4592|人口統計的なデータのビジュアライズに?|
JAVA Listインターフェース ArrayList/LinkedList

##ざっくり捉えればどちらもリスト
Listとざっくり添えれば、Listインターフェースを
実装している全てのクラス(ArrayListやLinkedListなど)
を引数に指定することができる

<FONT color="#ff0000">引数・戻り値・ローカル変数には、極力あいまいな型(インターフェース型を利用出来ないかを検討し、積極的に利用する</font>

```java
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Test08 {
	public static void main(String[] args) {
		List<String> a = new ArrayList<String>();
		a.add("Hello");
		a.add("Hello1");
		a.add("Hello2");

		List<String> b = new LinkedList<String>();
		b.add("Java");
		b.add("Java1");
		b.add("Java2");

		pl(a);
		pl(b);

	}
　　//Listでざっくり捉える
	public static void pl(List<String> a) {
		for (String s : a) {
			System.out.println(s);
		}
	}

}
```

■実行結果
Hello
Hello1
Hello2
Java
Java1
Java2