OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10日本語版で英語配列キーボードを使用する

Windows10で英語キーボードを使用しようと思い、「設定」から色々探したがなかなか見つからず苦労したのでメモ。

（１）「設定」画面を開いて、「時刻と言語」をクリックする
![範囲を選択_004.jpg](https://qiita-image-store.s3.amazonaws.com/0/32593/78d1e380-6b33-8ec1-3a4a-0797848ff876.jpeg)

（２）「時刻と言語」画面で左側の「地域と言語」をクリックする
![範囲を選択_005.jpg](https://qiita-image-store.s3.amazonaws.com/0/32593/bf8684a5-6bd1-3b08-9171-ad0fe88c9433.jpeg)

（３）右側の「言語」の下に「日本語」が表示される
![範囲を選択_006.jpg](https://qiita-image-store.s3.amazonaws.com/0/32593/ea164016-d662-8e5c-66a8-a7d78bbcd2ce.jpeg)

（４）「日本語」の部分をクリックすると「オプション」ボタンが表示されるのでクリックする
　　　※この操作に気がつくまでに結構苦労しました
![範囲を選択_007.jpg](https://qiita-image-store.s3.amazonaws.com/0/32593/24c38543-302b-2cb3-7fcc-ddfdfb91f786.jpeg)

（５）「ハードウェア キーボード レイアウト」の「レイアウトを変更する」をクリックする
![範囲を選択_008.jpg](https://qiita-image-store.s3.amazonaws.com/0/32593/1d62fb48-f7a6-e539-fc46-854f11847851.jpeg)

（６）「ハードウェア キーボード レイアウトの変更」ポップアップで「日本語キーボード(106/109 キー）」をクリックして「英語キーボード(101/102キー)」を選択し、「サインアウト」をクリックする
![範囲を選択_009.jpg](https://qiita-image-store.s3.amazonaws.com/0/32593/68616a3e-a8c2-64b5-661a-a545ffad14c2.jpeg)
MacでVirtual Box をインストールできなかった時の対処

VirtualBox4.3 -> 5.0
にあげようと思って最新版をダウンロードしたら、パッケージを展開してインストーラーを起動した際に、インストールできませんというポップアップがでた。

# 原因

VirtualBoxは終了していたにも関わらず、プロセスは残っていたため。

```bash
$ps -A | grep VirtualBox
```

でVirtualBoxに関連するプロセスを検索して

```bash
$ kill -9 [PID]
```

で片っ端からプロセスを削除。
全てのプロセスを削除したら無事インストールできた。
c++ builder XE4, 10.2 Tokyo > TeeChart > 背景色を変更する > 内側だけ / 全体

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

TeeChartで背景色を変更したい。

##try1

参考
http://www.teechart.net/support/viewtopic.php?f=3&t=13232

以下の実装をした。

```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Chart1->Walls->Back->Gradient->Visible = false;
	Chart1->Walls->Back->Transparent = false;
	Chart1->Walls->Back->Color = clAqua;
}
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7f0f05c3-4ffe-bc1c-21ba-8b17ad887102.png)

グラフの内側だけが色が変わった。

##try2

```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Chart1->Color = clAqua;
}
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/652c46a3-7ca3-a7a4-3cf2-4bcd5d041609.png)

こちらが望んでいた振る舞い。
Google APIs Client Library for PHPでgd:etagを取得する

[Google SpreadSheetsをGoogle APIs Client Library for PHP 1.1.6で叩くための準備](http://qiita.com/sakadon/items/84593201b8801a8a3a8a)の続き。応用編？

普通に困ったのでメモ。以下はGoogle Spreadsheetを取ってくる動作。

````php
$sheet_id = '#########';
$request = new Google_Http_Request(
    "https://spreadsheets.google.com/feeds/worksheets/{$sheet_id}/private/full?alt=json",
    "GET",
    array(
        "Authorization" => "Bearer {$this->token}",
        "GData-Version" => "3.0"
    )
);
````

つまりリクエストヘッダに`GData-Version: 3.0`を足さないと、この場合`gd:etag`が省略されたJSONが帰ってきてしまう。

↑の結果を`json_decode`するとこうなる；

````php
stdClass Object
(
    [version] => 1.0
    [encoding] => UTF-8
    [feed] => stdClass Object
        (
            [xmlns] => http://www.w3.org/2005/Atom
            [xmlns$openSearch] => http://a9.com/-/spec/opensearch/1.1/
            [xmlns$gs] => http://schemas.google.com/spreadsheets/2006
            [xmlns$gd] => http://schemas.google.com/g/2005
            [gd$etag] => W/"AAAAAAAAAAAAAAAAAAAAAAA."
            [id] => stdClass Object
                (
                    [$t] => https://spreadsheets.google.com/feeds/worksheets/シートID/private/full
                )
...
````

これで、ターゲットの`<link rel="edit">`のhref宛に、以下のXMLを投げると、その行だけに上書きできる

````xml
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gs="http://schemas.google.com/spreadsheets/2006" xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended" gd:etag='"AAAAAAAAAAAAAAAAAAAAAAA."'>
    <category scheme="http://schemas.google.com/spreadsheets/2006" term="http://schemas.google.com/spreadsheets/2006#list"/>
    <id>{$lineid}</id>
    <link rel="self" type="application/atom+xml" href="{$selfhref}"/>
    <link rel="edit" type="application/atom+xml" href="{$edithref}"/>
    <gsx:headname>Update</gsx:use>
</entry>
````

````php
$request = new Google_Http_Request(
        $edithref,
        "PUT",
        array(
            "Authorization" => "Bearer {$accessToken}",
            "Content-Type" => "application/atom+xml",
            'GData-Version' => "3.0"
        ),
        $postBody // <= ↑のXML
    );
````
あとは[Googleの公式ドキュメント](https://developers.google.com/google-apps/spreadsheets/data#update_a_list_row)をよんでがんばって。。

ちなみに最初の問い合わせでシートの一覧をリクエストすると思うが、その時に結果から取得したい値として`<link rel="http://schemas.google.com/spreadsheets/2006#listfeed">`のhref属性値（つまり`$listfeed`）があると思うんだけど、
（このURL宛にPUTすると、そのシートのエントリーの中身が取得できる）
そのシート一覧取得時に`"GData-Version" => "3.0"`つけちゃうと、この要素がいなくなるので注意…。

思った以上に仕様がつまってて、大変すね
スクロールのあるDOMで表示中の要素を取得

```overflow: scroll;```している要素内で、現在表示しているDOMを取得したかった。
具体的には下の画像のケース（ElectronアプリなのでHTMLです）

![スクリーンショット 2015-11-07 17.12.38.png](https://qiita-image-store.s3.amazonaws.com/0/1349/36fdd945-ace4-8b42-9e6a-dbead3d161e4.png)

```js
var scrollElement = document.getElementById('scroll-element');
// スクロール要素の絶対座標を取得
var rect = scrollElement.getBoundingClientRect();
// ドキュメントの絶対座標からスクロール要素で表示している要素の一番上のやつを取得
var targetElement = document.elementFromPoint(rect.left, rect.top);
```

コメントにあるとおり、スクロール要素の絶対座標を取得して、ドキュメントの絶対座標から要素取ると取れた。
なんかもっといい方法あったら教えて下さい。


#### 参考
document.elementFromPoint - Web API インターフェイス | MDN https://developer.mozilla.org/ja/docs/Web/API/Document/elementFromPoint
element.getBoundingClientRect - Web API インターフェイス | MDN https://developer.mozilla.org/ja/docs/Web/API/Element/getBoundingClientRect
c++ builder XE4, 10.2 Tokyo > IDE > 入力中の関数の説明を再度表示する > 関数名にカーソルを戻してCtrl+Space

```txt:動作確認
C++ Builder XE
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

IDE内のエディタにおいて関数名の途中まで入力していると以下のような説明が表示される。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1870a76e-ead8-0693-e381-75d35875cb0c.png)

しかしながら、引数の途中まで入力をすると表示がされなくなる。結局、「どういう引数だったか」を別途調べないといけないと思っていた。

以下の手順で再表示できるようだ

- 関数名の部分までカーソルを戻す (例: `Copy(`のpとyの間)
- Ctrl+Spaceを押す

カーソル位置によって、表示されるリストの数が変わる。Cとoの間までカーソルを戻すとCopy()だけでなくCreate()などの関数も表示される。

これで入力すべき引数の参照が楽になる。 ヘルプのどこかに書かれている機能かもしれないが気づかなかった。
CakePHPでtest.phpにアクセスしたらNo tests found in classと言われた解決方法

CakePHP2系でPHPUnitを使用してControllerのテストを行ったところエラーが出ました。

# test.phpでエラー
test.phpでControllerを見たらエラーがでました。

```
No tests found in class "ApiPugiemonnControllerTest".
```

<img width="383" alt="スクリーンショット 2015-11-07 17.17.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/4e236ccc-6908-62e1-db73-2a452aab34a5.png">

# 名前をtextAction()にする
どうやらtestアクション名というアクションを作らないと行けないらしいです。

```php
public function testAction() {
}
```

# 再度確認
今度はテストが認識されたみたいです。

<img width="386" alt="スクリーンショット 2015-11-07 17.21.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/8df2b1a3-3637-debe-8187-aefdd86b7972.png">

やったね(☝ ՞ਊ ՞)
ClojureとAWS Lambda, API GatewayでREST APIを作る

## APIの作成
API GatewayでAPIを作る。

```
aws apigateway create-rest-api --name hello-lambda-clojure
```

## リソースの定義

リソースはツリー構造になっているので、新しくリソースを作るにはルートのリソースIDが必要。`get-resources`を使ってそのIDを確認する。

```
 aws apigateway get-resources --rest-api-id 0a5sxbe4gg
{
    "items": [
        {
            "path": "/",
            "id": "8s2bu30t65"
        }
    ]
}
```

今回は`/greetings/hello`にJSONをPOSTするとレスポンスを返すというAPIにしたいので、`greetings`, `hello`というリソースを作成する。

まず`/greetings`を作成。

```
aws apigateway create-resource --rest-api-id 0a5sxbe4gg --path-part greetings --parent-id 8s2bu30t65
{
    "path": "/greetings",
    "pathPart": "greetings",
    "id": "ckagp3",
    "parentId": "8s2bu30t65"
}
```

続いて`/greetings/hello`を作成。

```
aws apigateway create-resource --rest-api-id 0a5sxbe4gg --path-part hello --parent-id ckagp3
{
    "path": "/greetings/hello",
    "pathPart": "hello",
    "id": "is2t79",
    "parentId": "ckagp3"
}
```

## メソッドの定義
メソッドの定義をCLIを使ってやろうと頑張ったけど、ドキュメントが少なくそれっぽく出来てもよく分からないエラーになったので、諦めてAWSのWebコンソールで"Create Method"でメソッドを作り、"Integration Type"に"Lambda Function"を選択した。

Lambda Functionは[こちらの記事](http://qiita.com/csakatoku/items/27bfed3cc87901fa24c7)に書いたような感じで予め作成してあります。

- http://qiita.com/csakatoku/items/27bfed3cc87901fa24c7

以下は結局うまくいかなかった作業ログ。

メソッドを作成。

```
aws apigateway put-method --rest-api-id 0a5sxbe4gg --resource-id is2t79 --http-method POST --authorization-type NONE
{
    "apiKeyRequired": false,
    "httpMethod": "POST",
    "authorizationType": "NONE"
}
```

メソッドに対するIntegrationを作成。

```
aws apigateway put-integration --rest-api-id 0a5sxbe4gg --resource-id is2t79 --http-method POST--type AWS --integration-http-method POST --uri arn:aws:apigateway:ap-northeast-1:lambda:path/2015-03-31/functions/arn:aws:lambda:ap-northeast-1:YOUR_AWS_ACCOUNT_ID:function:hello-lambda/invocations
```

```
aws apigateway put-method-response --rest-api-id 0a5sxbe4gg --resource-id mdb71c --http-method POST --status-code 200 --response-models '{"application/json": "Empty"}'
```

```
aws apigateway put-integration-response --rest-api-id 0a5sxbe4gg --resource-id mdb71c --http-method POST --status-code 200 --response-templates '{"application/json": ""}'
```

## デプロイ＆テスト
ステージを作って、実際にAPIにアクセスしてみる。

```
aws apigateway create-deployment --profile development --rest-api-id 0a5sxbe4gg --stage-name sandbox
```

APIのURLは`https://REST-API-ID.execute-api.REGION.amazonaws.com/STAGE`というURLになるらしい。

```
curl -H 'Content-Type: application/json' -d '{"name": "Clojure"}' https://0a5sxbe4gg.execute-api.ap-northeast-1.amazonaws.com/sandbox/greetings/hello
{"message":"Hello Clojure"}
```

無事にAWS LambdaとAPI Gatewayを使った初めてのAPIを作れました。
jsdom+WebRxでサーバーサイドレンダリングする

# jsdom+WebRxでサーバーサイドレンダリングする

jsdom + React.js でサーバーサイドレンダリングして isomorphic っていうネタがあるらしく、それなら WebRx でもできればうれしいなと思って試してみました。

## インストールする

```sh
$ npm i jsdom rx webrx coffee-script --save
```

個人的な好みでCoffeeScriptです。普通に使うならES6/ES2015もしくはTypeScriptをおすすめします。

## 疑似ブラウザ環境を作る

```coffee
jsdom = require("jsdom").jsdom
global.document = jsdom("""<html><head></head><body><div data-bind="text: main"></div></body></html>""")
global.window = global.document.defaultView
global.navigator = global.window.navigator
```

まず`jsdom`をrequireしてきます。で、次に初期HTML文とともにjsdomのオブジェクトを作成して`global`の`document`に入れます。`global.document`というのはCoffeeScriptの書き方なのでES6とかだとvarをつけない`document = jsdom(...)`でいいです。同様にglobalの`window` `navigator`も初期化します。

## Rx, WebRx を読み込む

Rxは簡単にrequireできるんですが、webrxはdist下のjsを直接指定しないとrequireできません。

```coffee
global.Rx = require 'rx'
wx = require './node_modules/webrx/dist/web.rx.js'
```

## あとは普通にWebRxで書く

```coffee
class MainModel
  constructor: ->
    @main = wx.property 'hello world, WebRx'

mainModel = new MainModel()
wx.applyBindings mainModel
```

## 最後はinnerHTMLを取り出す

```coffee
console.log global.document.documentElement.innerHTML
```

もうちょっといろいろ試してみて遊んでみようと思います。
Bootstrap 3のnavのメニューをスマホでもハンバーガーに入れないようにする

# これきらい

![2015-11-07_16.58.11.png](https://qiita-image-store.s3.amazonaws.com/0/32924/4b8303ad-81f7-5b27-013c-2b2f0e3d5b0b.png)

1つメニュー押すのに毎回 `≡` を押してメニューを出すのはだるすぎる。

# こうしたい


![2015-11-07_17.00.15.png](https://qiita-image-store.s3.amazonaws.com/0/32924/850cb56e-67a9-25fc-9c5f-dde9d3378867.png)

良い。

# コード

## html

```html:元の
<nav class="navbar navbar-default navbar-fixed-top">
	<div class="container">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
				<span class="sr-only">Toggle navigation</span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
			</button>
			<a class="navbar-brand" href="#">(´・ᴗ・`)</a>
		</div>
		<div id="navbar" class="navbar-collapse collapse">
			<ul class="nav navbar-nav">
				<li><a href="#">キュート</a></li>
				<li><a href="#">クール</a></li>
				<li><a href="#">パッション</a></li>
			</ul>
		</div>
		<!--/.nav-collapse -->
	</div>
</nav>
```

```html:変更後
<nav class="navbar navbar-default navbar-fixed-top">
	<div class="container">
		<div class="navbar-header">
			<a class="navbar-brand" href="#">(´・ᴗ・`)</a>
			<ul class="nav navbar-nav">
				<li><a href="#" id="cute">キュート</a></li>
				<li><a href="#" id="cool">クール</a></li>
				<li><a href="#" id="passion">パッション</a></li>
			</ul>
		</div>
	</div>
</nav>
```

`≡` であるbuttonをまるまる消して、`navbar-nav`を`navbar-header`に入れてあげる。

## CSS

```css:変更後
.nav>li {
	float: left;
    display: inline-block;
}
.navbar-nav {
    margin: 0;
}
.navbar-nav>li>a {
    padding-top: 14.5px;
    padding-bottom: 14.5px;
}
```

おしまい

実際に使うときにはどんな幅で表示するかわからんから幅が狭い時にはアイコンだけにするとか対処をしたほうがいいと思う。

# おまけ

htmlそのままでこのCSSあてるとこうなる。

![2015-11-07_16.59.04.png](https://qiita-image-store.s3.amazonaws.com/0/32924/39ac2252-cecb-f475-74d6-ef12a3ab3c1f.png)

（メニューの長さにもよると思うけど）`≡` デフォよりこっちのほうがましだと思う。
MacのVimで引数なしのcdコマンドを打つと、ホームディレクトリに移動してしまう

**これはvimの仕様の違いではなく、OSのコマンドの仕様の違いです。**

仕事でWindows、プライベートでMacを使っていて少し悩ませられました。

Windowsにおけるcdコマンドは、引数を何も指定しないと現在のディレクトリを表示します。
が、Linuxでは引数なしcdコマンドを実行するとホームディレクトリに移動します。

```vim
:cd

" 実行結果： /Users/ユーザ名 など
```

MacやLinuxなどで現在のディレクトリパスを確認したい場合、`pwd`コマンドを使いましょう。

```vim
:pwd
```

これはもちろんvimだけでなく、ターミナルにおいても有効です。
Processingでシミュレーション～万有引力

# はじめに
Processingを使って万有引力をシミュレーションします。

# 万有引力
質量を持つ物体の間に働く力です。
物体1の位置ベクトルを$\vec{r_1}$、質量を$m_1$とします。物体2の位置ベクトルを$\vec{r_2}$、質量を$m_2$とします。
$G$は万有引力定数です。物体1が受ける力の方向は$\vec{r_2}-\vec{r_1}$です。物体2が受ける力の方向は$\vec{r_1}-\vec{r_2}$です。
$r = |\vec{r}_1 - \vec{r}_2|$です。2つの物体に働く万有引力は次の式で与えられます。

物体1が物体2から受ける万有引力

```math
\vec{F} = G \frac{m_1 m_2}{r^2} \vec{e}_{12} \\
\vec{e}_{12} = \frac{\vec{r}_2 - \vec{r}_1}{r}
```

物体2が物体1から受ける万有引力

```math
\vec{F} = G \frac{m_1 m_2}{r^2} \vec{e}_{21} \\
\vec{e}_{21} = \frac{\vec{r}_1 - \vec{r}_2}{r}
```

# 運動方程式
万有引力のみで外力のない運動方程式は以下の通りです。
質量$m_1$の物体1が$m_2$の物体2から万有引力を受けているとします。
物体1のみ記載します。物体2もほとんど同じため省略します。

```math
\frac{d^2 \vec{r_1}}{dt^2} = G \frac{m_2}{|\vec{r_1}-\vec{r_2}|^2} \vec{e}_{12} \\
```

# 差分化

差分化
$r_{1x}$は物体1のx座標です。その他の物体、座標も同様の記号とします。

```math
r_{1x}(t+2Δt)-2r_{1x}(t+Δt)+r_{1x}(t) = Gm_2 r^{-2} e_{x12} \\
r_{1y}(t+2Δt)-2r_{1y}(t+Δt)+r_{1y}(t) = Gm_2 r^{-2} e_{y12} \\
r_{2x}(t+2Δt)-2r_{2x}(t+Δt)+r_{2x}(t) = Gm_1 r^{-2} e_{x21} \\
r_{2y}(t+2Δt)-2r_{2y}(t+Δt)+r_{2y}(t) = Gm_1 r^{-2} e_{y21} \\
r = \sqrt{(r_{1x}(t+2Δt)-r_{2x}(t+2Δt))^2+(r_{1y}(t+2Δt)-r_{2y}(t+2Δt))^2}\\
e_{x12} = \frac{r_{2x}-r_{1x}}{r} \\
e_{y12} = \frac{r_{2y}-r_{1y}}{r} \\
e_{x21} = \frac{r_{1x}-r_{2x}}{r} \\
e_{y21} = \frac{r_{1y}-r_{2y}}{r} \\
```

# Processingで可視化

```java
float G = 100.0;
float m1 = 100.0;
float m2 = 100.0;
PVector[] r1; // r1[time]
PVector[] r2;

void setup() {
  size(800, 500);
  init();
  frameRate(30);  
  fill(255, 255, 255, 255);
  noStroke();
  background(0, 0, 0);
}

void draw() {
  fill(0, 20);
  rect(0, 0, width, height);
  fill(255);
  ellipse(r1[2].x, r1[2].y, 10, 10);
  ellipse(r2[2].x, r2[2].y, 10, 10);
  for (int i=0; i<4; i++) // speed up
    updateTime();
}

void init()
{
  r1 = new PVector[3];
  r2 = new PVector[3];
  float left_mgn = 100;
  float right_mgn = 100;
  float centor = height/2;

  r1[2] = new PVector(left_mgn, centor);
  r2[2] = new PVector(width-right_mgn, centor);  
  r1[1] = new PVector(r1[2].x, r1[2].y+1);
  r2[1] = new PVector(r2[2].x, r2[2].y-1);  
  r1[0] = new PVector(r1[1].x, r1[1].y+2);
  r2[0] = new PVector(r2[1].x, r2[1].y-2);
}

void updateTime()
{
  float r = r1[1].dist(r2[1]);
  float rr = pow(r,2);
  PVector e12 = PVector.mult(PVector.sub(r2[1], r1[1]), 1/r);
  PVector e21 = PVector.mult(PVector.sub(r1[1], r2[1]), 1/r);
  r1[2].x = 2*r1[1].x - r1[0].x + G*m2/rr * e12.x;
  r1[2].y = 2*r1[1].y - r1[0].y + G*m2/rr * e12.y;
  r2[2].x = 2*r2[1].x - r2[0].x + G*m1/rr * e21.x;
  r2[2].y = 2*r2[1].y - r2[0].y + G*m1/rr * e21.y;

  r1[0] = r1[1].copy();
  r2[0] = r2[1].copy();
  r1[1] = r1[2].copy();
  r2[1] = r2[2].copy();
}
```

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/74NOBC2bt6g/0.jpg)](http://www.youtube.com/watch?v=74NOBC2bt6g)
SparkSQLDataframe（v1.5.0/1.5.1）バグ回避策

# spark 1.5.1 のDataframe注意点

* DataframeをtoDF("entityId","entityType", "targetEntity", ...) で生成したあとfilter or where 関数で、=== がうまく動作しないバグを回避する方法
* https://issues.apache.org/jira/browse/SPARK-10859
* v1.5.2以降にはFixされる予定で、1.5.2-RC2 では修正済み。
* 2015/11/09 v1.5.2がリリースされました（http://spark.apache.org/news/spark-1-5-2-released.html）

## 間違った結果になるケース

```scala
val eventTableColumns = Seq[String](
    "entityType"
  , "entityId"
  , "targetEntityType"
  , "targetEntityId"
  , "properties"
  , "eventTime")

val eventDF = sc.textFile("/tmp/events_s.csv").map(_.split(",")).filter(_.size >= 6)
  .map { e =>
    (
      e(5), e(0), "item", e(1), s"""{"rating": ${e(3).trim.toDouble}}""", e(3)
    )
  }.toDF(eventTableColumns:_*)

eventDF.filter($"entityType" === "user").select("entityId").distinct.count
```

## 回避策①
* === の代わりに isin を使う

```scala
eventDF.filter($"entityType" isin lit("user")).select("entityId").distinct.count
```

## 回避策②
* case class を使う

```scala
case class Event(entityType: String, entityId: String,
                 targetEntityType: String, targetEntityId: String,
                 properties: String, eventTime: String)

val eventDF2 = sc.textFile("/tmp/events_s.csv").map(_.split(",")).filter(_.size >= 6)
  .map { e =>
    Event(
      e(5), e(0), "item", e(1), s"""{"rating": ${e(3).trim.toDouble}}""", e(3)
    )
  }.toDF()

eventDF2.filter($"entityType" === "user").select("entityId").distinct.count
```


## 回避策③
* spark.sql.inMemoryColumnarStorage.partitionPruning を false にする

```scala
    sqlContext.sql("SET spark.sql.inMemoryColumnarStorage.partitionPruning=false")
    eventDF.filter($"entityType" === "user").select("entityId").distinct.count
```

## 詳しいサンプルコードはこちら
https://gist.github.com/schon/b49a616eeb0b78fb5f47
SmartArrow

- Git
×　https://github.com/dibaplus/SmartArrow-Windows
○　https://github.com/ghqian/Windows2Android
Windows PCからAndroid画面の操作ができるプログラムを作ってみました。
(2019/6/12 URL修正)

- 11/15 SmartArrow-Android
[WIP]既存のMouseMoveの上でMouseDown/MouseUp実現


- 追加したいFeature
NDKでMouseDown/MouseUp実装
GCMで遠隔操作スタート昨日
無料cloud storageでmacro保存/再生


- 資料
https://heroiclabs.com/
http://www.gamedonia.com/
https://www.gamesparks.com/games-back-end/
http://gamua.com/flox/
https://cloud.google.com/solutions/mobile/developing-mobile-games-on-google-app-engine-compute-engine/
https://console.developers.google.com/apis/credentials?project=smartarrow-gcloud
http://getbraincloud.com/
DockerコンテナのGUIをMac側に飛ばして表示させよう。


xvfbで、[ヘッドレスのdockerコンテナ内でSeleniumを実行できる](http://qiita.com/akiko-pusu/items/6901443aff46609dc07d)ようにはなったのですが、ホントに実行されているのか、まだ信用できない....!

せっかくなので、dockerコンテナ内でSeleniumの実行画面を、Mac側のXに飛ばせないかと思ったところ。
いろいろ時間が解決してくれているようで、この手のノウハウがあちこちに落ちておりました。

- Docker Issue: [how to use -e DISPLAY flag on osx? #8710](https://github.com/docker/docker/issues/8710)
- [How to get a GUI to a Docker Container on OS X](http://learning-continuous-deployment.github.io/docker/images/dockerfile/2015/04/22/docker-gui-osx/)
- Qiita: [macでdockerからGUIアプリを立ち上げる](http://qiita.com/matsu911/items/453fbd26d2d4901ad922)

ちょっとハマったところはありましたが、前回使ったものと同じテストを、Mac側に表示させて実施できましたので、そのメモになります。

### 実際なにをやっているの？

実際なにをやっているか良くわかってなかったので、学習も兼ねて書いていきます。
流れとしては、以下の通り。

- socat というコマンドラインツールを追加
- Xquartzをインストール
 - デフォルトでは入っていない && brew installの標準には入ってないので、caskを利用してインストール
- X11の環境を整えたあとで、socat TCP-LISTEN.... で、ポート6000で待ち受け（X用のポート）
- docker runの時に環境変数 (DISPLAY) を渡して、GUIアプリを起動
 - コンテナ側で起動したアプリは、MacのXサーバに描画してもらう

Macのターミナル上での処理は、[『macでdockerからGUIアプリを立ち上げる』](http://qiita.com/matsu911/items/453fbd26d2d4901ad922) の記事の通り、このようになります。  

```
brew install socat
brew install caskroom/cask/brew-cask
brew cask install xquartz
open -a XQuartz
 
# socatを起動すると、そのまま待ち状態になるので、別ターミナルへ
socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
 
# 別ターミナルから、docker run実施。この時に、環境変数DISPLAYを指定。
docker run -e DISPLAY=192.168.99.1:0 <GUIの入ったイメージ> <実行したいコマンド>
```

上記の注意点としては、-e DISPLAY=xxx に指定するのは **docker用のネットワークから見たMac側のIPアドレス** です。

ifconfigで取得できますので、この例では、192.168.99.1　になります。

```
% ifconfig
.....
vboxnet3: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    ether 0a:00:27:00:00:03
    inet 192.168.99.1 netmask 0xffffff00 broadcast 192.168.99.255
```

### さっそく立ち上げてみよう！

では、早速実行を。
先日作った日本語フォント入のイメージがあるので、そこから適当にGUIアプリをチョイス。（今回は[xbsh](http://www.beanshell.org/home.html))

```
% docker run -it -e DISPLAY=192.168.99.1:0 --rm takano/protractor-webdriver-ja:1.0 xbsh
```

少しすると、Mac側のXQuartzが起動し、xbshのウィンドウが表示されました。

![xserve-and-client-on-docker.jpg](https://qiita-image-store.s3.amazonaws.com/0/27976/1a142396-7657-2fe1-da4a-3c28aab30575.jpeg "xserve-and-client-on-docker.jpg")

あらまあ！な感じです。

前回書いたヘッドレスでのprotractorのテストも、xvfbの部分を無くして直に protractor ..... とコマンドを打つと、Mac側にChromeが飛ばされてテスト実行になります。


## もうちょっと詳しく

以上、やりたいことはこれで完了です。
せっかくなので、もうちょっと何が行われているのか確認してみます。

まず、socatは、通常のサーバ間通信（ポートを利用）を、ソケットに振り替えできるツールです。（詳しくなくてすみません）

こちらを利用して、dockerコンテナからdockerホスト経由でMacのport: 6000に来たリクエストを、MacのX用のソケットに渡します。
(exp. DISPLAY=/private/tmp/com.apple.launchd.GLgekQSd9H/org.macosforge.xquartz:0)

Macからtcpdumpしてみると、上記の画面のように、GUIアプリが立ち上がった時点で、dockerホスト経由でdockerコンテナ上で起動したアプリを描画するための通信が、port 6000で発生しています。

## うまく起動してくれないときは？

この方法だと、Macのポート6000に対してのインバウンドの通信が発生します。

もし、dockerコンテナ内からGUIアプリを起動してもMac側で画面が描画されない場合は、ファイアウォールでブロックされてしまった可能性があります。
ウィルス対策ソフトやセキュリティソフトの設定も確認してみて下さいね。

＃実際わたしはそれで「あれれー？」な状況になりました。
PubNubというサービス

何ができる？
すべての接点からメッセージを送ることができる
すべての接点からメッセージを受けることができる
すべてというのはいろんなOS、いろんな言語、いろんなデバイスという意味

仕組みは？
指定したchannelにpublish/subscribe

詳細は？
https://www.pubnub.com/docs/c-sharp-net-c-sharp/pubnub-c-sharp-sdk

どこで使えそう？
通信基盤、IoTでの利用が広がるらしい
SourceTree > 古いタグに一時的に戻してビルドする

```txt:動作確認
SourceTree v1.6.22.0 on Windows 7pro
```

gitのリポジトリにバージョンごとのタグをつけていたとする。

ある古いバージョン(例 v1.3.0)の状態に一時的に戻して、ビルドを行いたい。

以下の手順でやってみた。

- 左メニューの「リモート > origin > master」の「master」をダブルクリック
- 「チェックアウト」ダイアログにて以下とする
  - 新規ブランチを作成してチェックアウトのタブ選択
  - 「チェックアウトするリモートブランチ」origin/master 
  - 「新ブランチ名」 "oldVer"（任意の文字) 
  - 「ローカルブランチでリモートブラン」 チェック
- oldVerブランチを選択した状態で、コミット一覧ウィンドウの右上の「ジャンプ先」をクリック
- v1.3.0を選択するとそのコミットまで移動する
- v1.3.0タグがついたコミット上にて、右クリック > 「現在のブランチをこのコミットまでリセット」を選択
- 「コミットにリセット...」ダイアログにて「使うモード」を選択。どれがいいかは未消化。
  - ブランチを後で消す予定なので、Hardとした

上記でoldVerブランチに関して、古いバージョン(v1.3.0)の状態に戻った。

これでコードをビルドするとv1.3.0でのビルドができる。

不要になった時点でoldVerブランチごと消したら、作業前の状態に戻る（と思われる)。
CentOS7の/homeのディスク領域を縮小してルートのディスク領域を拡張したお話

少し前に構築したCentOS7環境、ルートのディクス領域が少なくて/homeが容量の大部分を占めてたので、それを色々と調べて解決したお話です。

xfs形式では領域の拡張は可能ですが、縮小は不可能なので、
結論としては一度そのファイル領域(/home)をバックアップしたのち削除。その後リストアという流れになります。

参考にさせていただいたものは以下の通り
http://qiita.com/toshikiw/items/d4ddaaff8e1d2904c9cf
http://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=LVM
http://qiita.com/tukiyo3/items/bba1b939fcf150b2cb56
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Logical_Volume_Manager_Administration/lv_extend.html
http://blog.fenrir-inc.com/jp/2013/04/centos-6-lvm.html


実際に実施したものは以下になります。
環境によってパスは変わると思うので適時読みかえてください。

~~~bash
#ファイルサイズ確認
df -Th

#xfsdumpインストール
yum install xfsdump

#/homeを使用しているプロセス確認
fuser -m /home
#プロセス停止
systemctl stop XXX
kill YYY

#ダンプ保存ディレクトリ作成
mkdir /dump_wark

cd dump_wark/

#/homeのダンプ
xfsdump -J -L home -M drive -f home.dump /home

#/homeをアンマウント
umount /dev/mapper/centos-home

#確認
df -Th

#既存のhomeを利用停止
lvchange -an /dev/centos/home
#既存のhomeを削除
lvremove /dev/centos/home

#新home作成
lvcreate -L 10G -n home centos
mkfs.xfs /dev/centos/home
mount /dev/centos/home

#確認
df -Th

#homeダンプをリストア
xfsrestore -J -L home -f home.dump /home

#空いたサイズをrootに割当
lvextend -l +100%FREE /dev/centos/root

#rootを拡張
xfs_growfs /dev/mapper/centos-root

#確認
df -Th
~~~

事前検証のために作成したローカルの仮想環境では/homeに大部分の容量が割り当てられるという問題はなかったのですが。。
使用するイメージの問題なのでしょうか。ちなみに最小構成(minimal)インストールでした。
mix ecto.createが失敗するとき


こうなった時の対処方法。
結論としてはどこかしらのバージョン違いがあると発生するので、足並みを揃えてあげましょうってことになります。
今回はElixirの最新のdev版を入れたため発生。

```
Unchecked dependencies for environment dev:
* cowboy (Hex package)
  the dependency is not available, run "mix deps.get"
* phoenix_html (Hex package)
  the dependency is not available, run "mix deps.get"
* phoenix (Hex package)
  the dependency is not available, run "mix deps.get"
* phoenix_live_reload (Hex package)
  the dependency is not available, run "mix deps.get"
* postgrex (Hex package)
  the dependency is not available, run "mix deps.get"
* phoenix_ecto (Hex package)
  the dependency is not available, run "mix deps.get"
** (Mix) Can't continue due to errors on dependencies
```

言うとおりにmix deps.get を叩いてみる

```
$ mix deps.get
Running dependency resolution
** (UndefinedFunctionError) undefined function: Access.Map.get_and_update!/3 (module Access.Map is not available)
```

モジュールがないらしい。
mixの公式を見てみた。
https://hex.pm/docs/usage

```
Mix will automatically prompt you whenever there is a need to use Hex. In case you want to manually install or update hex, simply run $ mix local.hex.
```
こんなことが書いてあったのでmixからHexのアップデートをしてみる

```
$ mix local.hex
Found existing archive(s): hex.ez.
Are you sure you want to replace them? [Yn] y
* creating /home/user/.mix/archives/hex-0.9.0.ez
```

これでHexのバージョンが上がったので、もう一回実行してみる

```
$ mix deps.get
Running dependency resolution
Dependency resolution completed successfully
```

これで mix ecto.create が通るようになった。
そもそも何かしらのバージョン上げる時は依存性を確認してからやるべきですが、備忘録として残しておきます。
Docker Swarmチュートリアルやってみた(overlayネットワーク)

## 参考

* [Get started with multi-host networking](http://docs.docker.com/engine/userguide/networking/get-started-overlay/)

## 構成図

![docker-swarm.png](https://qiita-image-store.s3.amazonaws.com/0/25728/05cb8556-e9af-fc11-1e01-19d1b6929b00.png)

# 手順

## Consulサーバ作成

### 仮想ホスト「mh-keystore」作成

```bash:仮想ホスト「mh-keystore」作成
docker-machine create -d virtualbox mh-keystore
```

```bash:「mh-keystore」上にconsulサーバコンテナ作成
docker $(docker-machine config mh-keystore) run -d \
    -p "8500:8500" \
    -h "consul" \
    progrium/consul -server -bootstrap
```

* 8500portで待ち受け


### 仮想ホスト「mhs-demo0」作成

```bash:
docker-machine create \
  -d virtualbox \
  --swarm --swarm-image="swarm" --swarm-master \
  --swarm-discovery="consul://$(docker-machine ip mh-keystore):8500" \
  --engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
  --engine-opt="cluster-advertise=eth1:2376" \
  mhs-demo0
```

### 仮想ホスト「mhs-demo1」作成

```bash:
docker-machine create -d virtualbox \
    --swarm --swarm-image="swarm:1.0.0-rc2" \
    --swarm-discovery="consul://$(docker-machine ip mh-keystore):8500" \
    --engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
    --engine-opt="cluster-advertise=eth1:2376" \
  mhs-demo1
```


この時点でVirutalboxの状態は以下


![virtualbox.png](https://qiita-image-store.s3.amazonaws.com/0/25728/db8a85cd-ad2e-1b9f-2160-870cb0fd4f60.png)


# docker network

## swarm上にoverlay network「my-net」作成

```bash:
eval $(docker-machine env --swarm mhs-demo0)
docker network create --driver overlay my-net
```

## mhs-demo0上でnginxコンテナ作成、「my-net」に参加

```bash:
eval $(docker-machine env mhs-demo0)
docker run -itd --name=web --net=my-net --env="constraint:node==mhs-demo0" nginx
```


## 別ホストで、「my-net」経由でnginxコンテナにアクセス

```bash:
eval $(docker-machine env mhs-demo1)
docker run -it --rm --net=my-net --env="constraint:node==mhs-demo1" busybox wget -O- http://web
```

* アクセスできたことを確認。

---------------

# 全ホストシャットダウンしてから再度起動の手順

* my-netが存在しないため mhs-demo0 -> webを起動できない。
    * mh-keystore上の cunsulサーバを起動
* mhs-demo0 -> webを起動

```bash:
eval "$(docker-machine env mh-keystore)"
docker ps -a
docker start `コンテナID`

eval $(docker-machine env --swarm mhs-demo0)
docker start web

eval $(docker-machine env --swarm mhs-demo1)
docker run -it --rm --net=my-net --env="constraint:node==mhs-demo1" busybox wget web -O-
```
iTunesConnectへxcodeでアプリをビルドしてアップロードする

#xcodeからのアップロード方法
端末選んでいるプロダウンを選択し「Edit Scheme」を選択。
<img width="287" alt="Screen Shot 2015-11-07 at 15.20.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/0f718ad9-4cd0-4ce8-415f-4e9fffca8c07.png">

Archive -> Build Configurationが「Release」になっているか確認。
![279acc00-5438-3169-8e6e-8b9a5c75f3ca.png](https://qiita-image-store.s3.amazonaws.com/0/59560/02a3888e-754b-7ac6-092d-3faf7c36b7b1.png)

端末選んでいるプルダウンを選択し「iOS Device」を選択。このとき、実機をつないでいたら外す。
Product -> Archive が選択できるようになるのでここクリック。
<img width="172" alt="Screen Shot 2015-11-07 at 15.24.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/03b3c774-1cfc-05ae-29de-ac15e2202436.png">

あとは流れるようにsubmitボタンを押していくとiTunesにソースがのります。
<img width="1235" alt="e45fa168-6c6e-776c-8498-0133ea0bb15f.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/183e20a5-c5ff-70dc-80f8-868a7e8a9d95.png">


#エラー時の見るべきポイント
そもそもビルド時にエラーたくさんはいたのでチェックポイントだけメモっておきます。

- Utilities -> keychain access -> certificates
- xcode -> preferences -> accounts -> apple ids
- xcode -> targets(main/test) -> code signing
- xcode -> targets(main/test) -> user-defined
python で InsecurePlatformWarning が出たので requests[security] をインストールしました

python で下記のワーニングがでるようになりました

```
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
```

[こちらに](https://pypi.python.org/pypi/sail/)同じような症状の話しがあって、パッケージ requests[security] を下記のようにインストールすると治ると思うよ、との事

```bash:
sudo apt-get install python-dev libffi-dev build-essential
sudo pip install requests[security]
```

その後、このワーニングは出なくなりました。よかった。
Windows10 に msys2 + pandoc をセットアップ


# インストーラ

- msys2: https://msys2.github.io/
- pandoc: https://github.com/jgm/pandoc/releases

msys2 から `pacman -S pandoc` できればいいんですけど、どうやらパッケージが提供されていないみたい。
とりあえず、使えればいいので、pancoc の github/release からインストールすることにしました :)

# msys2

## pacman で生活に必要なものをインストール

私には zsh, vim, git, ssh(openssh) が必要なのでインストール 

```shell-session
$ pacman -S vim git zsh openssh
```

pacmanについては[こちら](http://dev.classmethod.jp/cloud/aws/package-management-use-pacman/)がわかりやすくて助かった。(yum 使ったことないケド...

## zsh をログインシェルに

msys2 には `chsh` などというものはないので、`/msys2_shell.bat` を編集

```shell-session
$ vim /msys2_shell.bat
```

```diff:/msys2_shell.bat
- start %WD%mintty -i /msys2.ico /usr/bin/bash --login %*
+ start %WD%mintty -i /msys2.ico /usr/bin/zsh --login %*
```

## msys2 のディレクトリ構成はどうなってる?

エクスプローラーで ` C:\msys64\ ` が msys2 の shell のルートディレクトリになります。

msys2 のからデスクトップのディレクトリに行くにはこんな感じ

```shell-session
$ cd /c/Users/hoge/Desktop/
```

![msys.png](https://qiita-image-store.s3.amazonaws.com/0/97187/27270d1d-c031-4da5-9606-8eb9424ed42f.png)

## 日本語が...??

msys2 上で右クリック → Options → Text でよしなに

![msys.png](https://qiita-image-store.s3.amazonaws.com/0/97187/fb8fc32d-85a7-eefb-95c7-32cae983f005.png)

# pandoc

普通にインストーラーでインストール完了しちゃいます。

なにもせずとも、msys2 から pandoc が使えるようになります。 

![pandoc.png](https://qiita-image-store.s3.amazonaws.com/0/97187/90311888-6b17-ee86-0f45-b5d626f2324b.png)
ClojureとAWS LambdaでHello World

AWSのブログを参考に、Clojureを使って初めてのAWS Lambda functionを作ってみる。

- https://aws.amazon.com/blogs/compute/clojure/

## 下準備
まずIAM roleを作る。`sandbox-lambda-exec-role`という新しいロールを作り、権限の問題でハマりたくないのでとりあえず`AWSLambdaFullAccess`というポリシーを割り当てた。

IAM userが`sandbox-lambda-exec-role`ロールでLambda functionを実行できるように、IAM userのインラインポリシーを編集して`iam:PassRole`を許可する。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1446873599000",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/*"
            ]
        }
    ]
}
```

## Jarを作成
新しいプロジェクト`hello`を作る。

```
lein new hello
```

`project.clj`に`com.amazonaws/aws-lambda-java-core`などを追加。

```
(defproject hello "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.7.0"]
                 [org.clojure/data.json "0.2.6"]
                 [com.amazonaws/aws-lambda-java-core "1.0.0"]]
  :aot :all)
```

`src/hello/core.clj`を編集してハンドラを追加。

```
(ns hello.core
  (:gen-class
   :methods [^:static [handler [String] String]]))

(defn -handler [s]
  (str "Hello " s "!"))
```

jarを作成。

```
$ lein uberjar
```

## Lambda functionを作成＆実行
AWS-CLIを使ってLambda function `hello`を作成する。

```
aws lambda create-function --function-name hello --handler hello.core::handler --runtime java8 --memory 512 --timeout 10 --role arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/sandbox-lambda-exec-role --zip-file fileb://./target/hello-0.1.0-SNAPSHOT-standalone.jar
```

実行。

```
aws lambda invoke --invocation-type RequestResponse --function-name hello --log-type Tail --payload '"Clojure"' output.txt
```

正常に実行されると`output.txt`に、

```
"Hello Clojure!"
```

と出力される。

## RequestStreamHandlerを実装

このあとAPI Gatewayを使ってREST API化にしようとしたのだが、パスに入れた`name`パラメータをLambda Functionに渡す方法がぱっと分からないので、冒頭に上げたAWSブログを参考にして、`RequestStreamHandler`を実装し、POSTボディからJSONを読んでパラメータを取得するように変更してみた。

```
(ns hello_lambda.core
  (:gen-class
   :implements [com.amazonaws.services.lambda.runtime.RequestStreamHandler])
  (:require [clojure.data.json :as json]
            [clojure.string :as s]
            [clojure.java.io :as io]))

(defn hello [params]
  {:message (str "Hello " (:name params))})

(defn -handleRequest [this is os context]
  (let [w (io/writer os)]
    (-> (json/read (io/reader is) :key-fn keyword)
        (hello)
        (json/write w))
    (.flush w)))
```

API Gatewayを使ってこのLambda FunctionをREST APIで呼び出せるようにした記録は[こちらの記事](http://qiita.com/csakatoku/items/ffe195dc871ab059e535)にあります。

- http://qiita.com/csakatoku/items/ffe195dc871ab059e535
Cloud9で"npm install"した時にECONNREFUSEDが出たら

タイトル通りなんだけど、Cloud9で開発してて`npm install`すると時々エラーになることがあって、**"connect ECONNREFUSED"**と表示されることがある。
何回かリトライすればインストールされるので気にしなくてもいいかと思っていたんだけど、やっぱりなんか気持ち悪いので調べてみた。

どうやらconfigの設定値に原因があったらしく、設定値を変更したらエラーが出なくなった。
設定値の確認と修正の方法は以下。

```bash
npm config get registry
```

上記のコマンドを実行して`https://registry.npmjs.org/`と表示されたら修正をした方がいいかもしれない。
以下のコマンドを実行して設定値を変更する。

```bash
npm config set registry http://registry.npmjs.org/
```

修正前はSSL接続していたものを、普通のHTTP接続に変更したというだけ。
これでエラーが出なくなった。

ただ、これはCloud9特有の事象かもしれないし、今回の対応をしたからといって必ず事象が解消されるという保証もないので、参考情報ということで。
ASO対応として、GooglePlayストアの掲載情報をAＢテストする

ASOを極めるために一番簡単なのがgoogleplay。今回はこのGooglePlayConsoleにあるストア掲載情報のABテスト機能あるので使ってみます。今回は試しに使ってみるだけなので「簡単な説明」項目をABしてみますね。


まず、ストアの掲載情報 -> A/Bテスト -> ローカライズ -> 日本語選択し作成

<img width="1176" alt="b47742d8-b613-fa61-c3d8-237ffd903e6f.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/b2aefa32-4a4c-2c70-19c8-e66e8137f084.png">


テスト名に「簡単な説明テスト」を入力。ここで気をつけるのはオリジナル（現在のパターン）は50%以上でなくてはいけません。
<img width="941" alt="a4d4098a-149c-0d79-37e9-3fbf297852b1.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/3f823168-db46-1852-afcf-824ef063e6ae.png">


属性に「簡単な説明」を選択。他にも下記項目がABできます。
<img width="932" alt="443a5890-ea47-9c56-2ec9-3719f6cae459.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/cb56f0e8-6549-0289-82a5-8d195d4cd175.png">


バリエーションはとりあえず試しなので２パターンを追加。テスト名なども決めれるので後から見てもわかるような名前にしましょう。
![6def4bfc-9217-f270-e041-95475affb8c6.png](https://qiita-image-store.s3.amazonaws.com/0/59560/42adac4b-5963-4000-c99e-9ff85dc80622.png)


そして、テスト実行！！！


データはある程度たまらないと判断できないので有意差でるまで放置してみます。結果としては、インストール数やアンインストール数からパフォーマンスを自動で判定してくれます。
<img width="938" alt="9aea4bca-f9de-5d4a-1ce4-76a25d3872a3.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/77fa3a1c-f1fd-b5f5-a7c4-fd18798f247f.png">
![5640fb41-8e59-9c8e-8003-1092b38ec0dc.png](https://qiita-image-store.s3.amazonaws.com/0/59560/71981585-1869-1cfc-6bfc-157cd32d9068.png)
ReactJS + Redux + ES6 のカウンターのサンプル


## 目的

Redux がどのようなものかかざっと把握するために１つのjsxファイルで動かしてみる。


## ファイル構成

```
.
├── dest
│   └── app.js
├── index.html
├── package.json
└── src
    └── app.jsx
```

## package


```pacage.json
{
  "devDependencies": {
    "babelify": "^6.1.3",
    "browserify": "^10.2.6",
    "watchify": "^3.6.0"
  },
  "scripts": {
    "watch": "watchify -t babelify src/app.jsx -o dest/app.js -v"
  },
  "dependencies": {
    "react": "^0.14.2",
    "react-dom": "^0.14.2",
    "react-redux": "^3.1.0",
    "redux": "^3.0.4"
  }
}
```

## 実行

```
$ npm install
$ npm run watch
```

## code

```src/app.jsx
import React, { PropTypes } from 'react';
import ReactDOM from 'react-dom';
import { createStore } from 'redux';
import { Provider, connect } from 'react-redux';


// Action
const ACTION_INCREMENT_COUNTER = {
  type: 'ACTION_INCREMENT_COUNTER',
  count: 1
};

const ACTION_DECREMENT_COUNTER = {
  type: 'ACTION_DECREMENT_COUNTER',
  count: -1
};


// Reducer
function counterReducer (state = {count: 0}, action) {
  let count = state.count;
  switch (action.type) {
    case 'ACTION_INCREMENT_COUNTER':
      return {count: count + action.count};
    case 'ACTION_DECREMENT_COUNTER':
      return {count: count + action.count};
    default:
      return state;
  }
}


// Component
class CounterComponent extends React.Component {
  render () {
    const { count, onClickPlus, onClickMinus } = this.props;
    return (
      <div>
        <p><span>Count: {count}</span></p>
        <div>
          <button onClick={onClickPlus}>+1</button>
          <button onClick={onClickMinus}>-1</button>
        </div>
      </div>
    );
  }
}

CounterComponent.propTypes = {
  count: PropTypes.number.isRequired,
  onClickPlus: PropTypes.func.isRequired
};


// Containers
function mapStateToPropsContainer (state) {
  return {
    count: state.count
  };
}

function mapDispatchToPropsContainer (dispatch) {
  return {
    onClickPlus: () => dispatch(ACTION_INCREMENT_COUNTER),
    onClickMinus: () => dispatch(ACTION_DECREMENT_COUNTER)
  };
}

let App = connect(
  mapStateToPropsContainer,
  mapDispatchToPropsContainer
)(CounterComponent);


// main
let store = createStore(counterReducer);

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('app-container')
);
```

## 表示

```
$ python -m SimpleHTTPServer 8000
```

- http://localhost:8000

![スクリーンショット 2015-11-07 14.48.21.png](https://qiita-image-store.s3.amazonaws.com/0/41656/b7055cbf-05b3-2817-c15f-20cbbea0c1e9.png "スクリーンショット 2015-11-07 14.48.21.png")



## 感想

- 以前ちょっと触った時の redux の examples では connect がデコレータ使われていたと思ったけど `export default connect(hoge..）` の記述に変わってた。こっちの方がなんとなくやりやすい気がする。
- webpack 使わないと動かないかと思ってたけど、babelify でも動かせた。
- ちょっと触っただけだけど思ってたより Redux いい感じかもしれない。


## 参考

- https://github.com/rackt/redux
- https://github.com/rackt/redux/tree/master/examples/counter
- https://github.com/jackielii/simplest-redux-example
Archlinuxの修飾キー設定変更

# 結論
GUIの設定で変更可能ならそちらを使う(GNOMEなど)。
それができない場合は `localectl` を使う。
以下日本語配列のMacBookで右commandキーをcontrolに置き換える例。

```
localectl set-x11-keymap "jp,us" "applealu_jis" "," "ctrl:swap_rwin_rctl"
```

# 参考
[Xorg でのキーボード設定 - ArchWiki](https://wiki.archlinuxjp.org/index.php/Xorg_%E3%81%A7%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A)
variant の設定に関する警告は一読しておくこと。上記の例は `jp,us` に対していずれもデフォルトの variant を設定している。

# 詳細
Linuxのデスクトップ環境を使っていると、いろいろなところでキーボードレイアウトやキーマップが設定される。
そのため、設定を変えても別のところで上書きされたりして反映されないことがある。

基本的には利用しているデスクトップ環境が用意しているキーボード設定画面から変更できればそれが一番いい方法だが、たとえばxfceではキーボード設定が貧弱なので修飾キーの入れ替えなどはできない。

そこで [Xorg でのキーボード設定 - ArchWiki](https://wiki.archlinuxjp.org/index.php/Xorg_%E3%81%A7%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A) に記載されている `localectl` 経由で設定する方法を利用する。

以前は `setxkbmap` を `.xinitrc` で実行したり、Xorgの設定を直接書き換えたりして設定していたが、今は `systemd` 経由で設定を反映する `localectl` がいい方法だろう。

`localectl` の操作方法は概ね他の `systemd` の制御コマンドと同様で、大してオプションもないので簡単に扱える。(詳細は [`man localectl`](http://www.freedesktop.org/software/systemd/man/localectl.html) を参照)

設定可能な keymaps, layouts, models, variants, options は各種list系コマンドで確認できるが、 options については `/usr/share/X11/xkb/rules/base.lst` を見たほうが説明付きでわかりやすい。

# 余談
修飾キー以外の設定として `_` をShiftなしで入力できるようにしているが、その設定は `.Xmodmap` で行っている。

それに合わせて最初 `.Xmodmap` に修飾キーの置き換え設定も記述したが、うまく反映されなかった。(明示的に `xmodmap .Xmodmap` で読みこめば反映された)
iOSアプリのリリース直前に動作確認ができるPromotion Cord

#Promotion Cordとは
初回リリースや大きなバージョンアップのときなどに最終アプリ動作チェックできるものです。Promotion Cordを利用すると一般ユーザと全く同じ状態でまだリリースしていないアプリをApp Storeからダウンロードできます。

#手順
##発行
iOSアプリの審査が通り、デベロッパーリリースの状態になったらpromotion cordを発行します。参考：[発行手順](http://rikei-webmemo.hateblo.jp/entry/2014/06/15/060000)

##App Storeからダウンロード
iPhone端末にあるAppStoreのおすすめ画面を一番下までスクロールすると「コードを使う」ボタンが表示されているのでこちらをタップする。

<img width="660" alt="13c81586-188f-b4db-eab0-593166123115.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/c1089f9a-9f0e-e48d-4753-41f6b6b0d498.png">


そして、「コードはキーボードでも入力できます。」をタップし、発行したPromotion Cordを入力する。

<img width="669" alt="b16a8071-ed57-c16d-38e0-677e154b8bfa.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/e433cfcf-cc00-0d2e-8214-4ac3253834ad.png">


アプリがインストールされる。

![2dbcc31e-d682-c021-6f7b-2d6e8267b90c.png](https://qiita-image-store.s3.amazonaws.com/0/59560/18b8d345-b574-c840-ee45-311197c87d69.png)


あとは、実機で開発環境に向いてないかチェックしたり昔のバージョンのままではないか最終チェックする。

#補足
Promotion Cordは１回使用したらもう使えません。しかし、デベロッパーガイドにもあるように、すべてのバージョンについて100個のプロモーションコードを要求できます。詳しくは[こちら](https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide_Jpn/Chapters/ProvidingPromoCodes.html)
NAS4Free の Active Directory 認証で _ （アンダースコア）を含んだユーザ名の認証を有効にする方法

あっかるいあっかるいラララランララン♪ 岩舘電気♪ の中の人です。

ちょっとした小技の投稿です。

　NAS4Free を使って Active Directory の認証をする際、標準状態では _ （アンダースコア）を含んだユーザ名が正しく認証されません。実は以前これで大ハマリしたことがあったので、小ネタとして投稿します。

　たとえば、ユーザ名に Iwadate_Denki というユーザ名を使うと、NAS4Free からは AD サーバに対して Iwadate Denki という名前で問い合わせに行ってしまうので当然認証に失敗してしまいます。まさかそんなアホなと思ったのですが、ログを詳細に探していったところこの現象を発見、試しにアンダースコアを含まないユーザ名を作って AD 認証が正しくなされたのを確認しました。たまたま AD サーバの新規導入のときだったので、原因の切り分けがなかなか進まず苦労した記憶が・・・ぶちぶち。

さて、解決方法ですが、設定を1行追加すればＯＫです。
Services > CIFS/SMB と設定をたどると、下に Auxiliary parameters という項目があります。そこに以下の一文を記入して、Save and Restart ボタンをクリックして設定終了です。

```
winbind normalize names = no
```

中身としては samba ですので、NAS4Free に限らず使える技かと思います。
というわけで、みなさんの参考になれば幸いです。・・・ていうか、デフォルトで設定しておいてくれよ・・・

![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/61220/212952a7-9137-930e-434e-28198bbc6324.png)
ローカルポートのmysqlに対してTCPで接続する

mysqlにlocalhostで接続する場合、(おそらく)自動的にunix domain socket経由で接続しようとする。
dockerで起動した場合やローカルポートからproxyしてmysqlに接続しているような場合は、unix domain socketのファイルは存在しないため以下のようなエラーが発生してしまう。

```
$ mysql -h localhost --port 3306 -u root -ppass
Warning: Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```

#### 解決方法

接続するプロトコルを--protocolで指定できる。socketやtcpの他、pipeやmemoryなどがあるらしい。

```
$ mysql -h localhost --port 3306 --protocol tcp -u root -ppass
```

これでdockerを使って即座にDBを用意することができる。
publishするportを変えれば複数のportを使って複数のmysqlインスタンスも起動可能。

```
$ docker run -d -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 mysql:5.6
$ mysql -h localhost --port 3306 --protocol tcp -u root -ppass
```

#### 別の方法

接続先がlocalhostでなければunix domain socket経由で接続しようとしないのでローカルマシンのIPを指定すればもちろん接続できる。
自分のIPアドレスを知るのは結構面倒なことが多いしそもそもpublicにしていないことが多いのでプロトコル指定した方が便利。

```
$ IPADDR=`ip -f inet -o addr show eth0 |cut -d\  -f 7 | cut -d/ -f 1`
$ mysql -h $IPADDR --port 3306 -u root -ppass 
```
iOS9の広告計測用URLのリダイレクトをスムーズにする方法

iOS9から広告URLをタップすると、safari遷移時に下記ダイアログが聞かれます。

<img width="375" alt="b364f044-9358-6fec-d589-b09f5672d606.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/16a9d362-1026-b0ae-b5a7-4ad6363eb48b.png">


iTUnesConnectにあるアナリティクスのキャンペーンリンク利用するとこれ聞かれなくなります。

て、ことで下記試してみました。

![29943bf3-02bc-25b3-1d9e-9983c4171623.png](https://qiita-image-store.s3.amazonaws.com/0/59560/e3cf0ec1-7cb7-bffe-1b71-295149ea49ee.png)


赤枠の項目にURLが生成されるので、それをiPhoneでクリックすると。。。ダイアログが表示されずスムーズにDL導線が見れましたー！
AWS LambdaのSchedule Taskを使ってOpsWorksのデプロイ状況をslackに通知する

Lambdaでスケジュール機能（cron）が使えるようになったことで、一段とサーバレスでbotを実現できるようになってきました。
http://aws.typepad.com/aws_japan/2015/10/aws-lambda-update-python-vpc-increased-function-duration-scheduling-and-more.html

前に作った物はこちら
[LambdaでAppStoreのレビューを拾ってSlackに流し込む](http://qiita.com/sparkgene/items/346c05ad6badacc837ba)
[AWS LambdaのSchedule Taskを使ってエゴサーチをslackに流し込む](http://qiita.com/sparkgene/items/ff04c493dea3bbd162a7)

今回は、OpsWorksでデプロイを実行した時の状況をSlackに通知してくれる物を作りました。

https://github.com/sparkgene/lambda_opsworks_deploy_listener

仕組みはもう使いまわしで、こんな感じでOpsWorksのデプロイ情報を見て、デプロイが始まったらSlackに通知し、デプロイが終わったもしくは失敗したら、Slackに通知してくれます。

<img width="576" alt="lambda_opsworks_deploy_listener.png" src="https://qiita-image-store.s3.amazonaws.com/0/36184/cc3b9b05-7b93-efd2-5714-892b5da820f7.png">

Slackにはこんな感じで通知してくれます。

<img width="373" alt="slack_post_image.png" src="https://qiita-image-store.s3.amazonaws.com/0/36184/a4e95ff8-da17-4c0d-0e28-7d8dfced214a.png">

この仕組で問題点としてあるのが、AWS Lambdaは5分以下のスケジュールが指定できないということ。
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/getting-started-scheduled-events.html
毎分みたいなcronを書いてもエラーになってしまいます。
５分毎にチェックした場合に、５分の間にデプロイが開始して終わってしまうと、、このスクリプトの仕組み上、通知が来ない。

過去のデプロイIDをずっと保持すれば、完了した事を通知できるけど、どれぐらい保存するかというのと、いつ消すのかが課題として残る。

Lambdaのスケジュールタスクが1分にも対応してくれると嬉しいな。
CocoaPodsで使用しているライブラリのライセンス情報をHTMLに書き出す

CocoaPodsで使用しているライブラリのライセンス情報をHTMLに書き出す方法を記載します。

pod install時にライセンス一覧をMarkdownで出力するのでそれをredcarpetでHTMLに変換しファイルに書き出しています。

# gemのインストール

```
$ gem install cocoapod
$ gem install redcarpet
```

# Podfile

Podfileにライセンス情報をHTMLで出力させるために下記をPodfileの下に追記します。

```rb
post_install do | installer |
  require 'redcarpet'

  acknowledgements = File.read('Pods/Target Support Files/Pods/Pods-acknowledgements.markdown', :encoding => Encoding::UTF_8)
  markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML)
  html = markdown.render(acknowledgements)
  File.write('App/lisence_info.html', html)
end
```

Podfile全体としては下記のようになります。

```rb
platform :ios, "8.0"
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!

pod 'Alamofire', '~> 3.0.1'
# and some pods...

post_install do | installer |
  require 'redcarpet'

  acknowledgements = File.read('Pods/Target Support Files/Pods/Pods-acknowledgements.markdown', :encoding => Encoding::UTF_8)
  markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML)
  html = markdown.render(acknowledgements)
  File.write('App/lisence_info.html', html)
end
```

# その他

もっと簡単にやりたいならこのライブラリがいいかもしれません。
[vtourraine/VTAcknowledgementsViewController](https://github.com/vtourraine/VTAcknowledgementsViewController)

CocoaPodsでインストールしているライブラリの一覧をのライセンス情報を、UITableViewControllerで表示するライブラリです。

# 参考

* [Acknowledgements · CocoaPods/CocoaPods Wiki](https://github.com/CocoaPods/CocoaPods/wiki/Acknowledgements)
* [vmg/redcarpet](https://github.com/vmg/redcarpet)
レスポンシブなサイトを作り始める前に考慮すべきこと

# 三行でまとめると

- Media Queriesは便利だけど、全然銀の弾丸じゃない
- かといって使い物にならないかというとそうでもない
- 下記各手段のメリットデメリットをふまえ、モジュールごとに最適な手段を採用する必要がある


# Media Queries

## 固定幅のサイト制作と違ってくること

- Bodyの幅を常に画面幅に追随させないといけない
    - 言い換えると__すべての要素は320px程度まで横幅が縮まっても、正常に表示される手段を提供しなければならない__
    - 古いブラウザのことも考慮すると、それだけでも大変


## この手段自体「モバイル」とは根本的に無関係

- Media Queriesはあくまで__幅に対してどう表示するか__の選択
- つまりモバイルでも横長のものがあれば"デスクトップ版"が表示されることになる
- 逆も然り


## 要素自体が変わるものはMedia Queriesの得意分野ではない

- とはいえ致し方なく変わる場合は下記いずれかの対応が必要になる:
    - サーバーサイドでモバイル出し分け
    - モジュールごとMedia Queriesでわける


# サーバーサイドでモバイル出し分け

- 静的サイトとして配信できなくなる
- モバイル出し分けをしても、依然として"デスクトップ版"のモジュールは320px程度まで縮んでも正常に表示される必要がある
    - デスクトップで開いてブラウザ幅を縮められる可能性があるので
- ^の要件を満たす必要があるので「サーバーサイドでモバイル出し分け」は__位置付けとしてEnhanment__


# モジュールごとMedia Queriesでわける

- 余計な要素をブラウザ側に配信することになり、処理に時間がかかる
- ただ「サーバーサイドでモバイル出し分け」を行うのと違い、__"デスクトップ版"のモジュールが縮んだ時の考慮をしなくて良くなる__
- 静的サイトとして配信できるし、工数としても「サーバーサイドでモバイル出し分け」を行うのより少なく済む
HomebrewでOS XにMosquittoをインストールする

# 環境
* OS X 10.11.1

# インストール

```
brew install mosquitto
```

設定ファイルは以下に置かれます。

/usr/local/etc/mosquitto/mosquitto.conf

# メッセージブローカーの起動

OS起動時にMosquittoを起動したい場合：

```
ln -sfv /usr/local/opt/mosquitto/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mosquitto.plist
```

毎回、手動で起動する場合は launchctl の設定を行わず、以下のコマンドで起動する。

```
/usr/local/opt/mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf
```

# 動作確認

Mosquittoをインストールすると、一緒に購読用と配信用の簡易クライアントもインストールされます。簡易クライアントで動作を確認しましょう。

以下でトピックを購読します。

```
/usr/local/bin/mosquitto_sub -t test
```

別のターミナルを開いて、トピックにメッセージを配信します。

```
/usr/local/bin/mosquitto_pub -t test -m hello
```

mosquitto_subでメッセージを受信できたら問題なく動作しています。