OmniAICreator/Qiita-1.07M huggingface dataset:
AnimatedVectorDrawableがアニメーションしない時に確認するポイント

AnimatedVectorDrawableに必要なanimatorやdrawableを用意したのにうまく動かない時の確認ポイントをまとめます。

# 1. Animatableのstart()を呼んでいるか
AnimatedVectorDrawableは明示的にstart()を呼ばないと動きません。
こんな感じでstartメソッドを呼ぶようにしましょう。

```java
private void startAnimation() {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // ImageViewがselect状態かどうかで判定してセットするAnimatedDrawableを決める
    int drawableResId = imgPlayToPause.isSelected()
          ? R.drawable.ic_pause_to_play
          : R.drawable.ic_play_to_pause;

    // Drawableをセットする。setImageResource()だと動かないので注意
    Drawable drawable = getDrawable(drawableResId);
    imgPlayToPause.setImageDrawable(drawable);

    if (drawable instanceof Animatable) {
      Animatable animatable = (Animatable) drawable;
      // アニメーション中だったらいったん止める
      if (animatable.isRunning()) {
        animatable.stop();
      }
      // アニメーションを開始
      animatable.start();
    }

    // 次にタップしたら逆方向のアニメーションを実行するためにselect状態を切り替える
    imgPlayToPause.setSelected(!imgPlayToPause.isSelected());
  }
}
```

# 2. AnimatedVectorDrawableのxmlのtarget nameとVectorDrawableのxmlのpath nameが一致しているか

例えばこんな感じのVectorDrawableの時、pathの `android:name`が重要です。

```xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="48dp"
    android:height="48dp"
    android:viewportHeight="48.0"
    android:viewportWidth="48.0">
    <path
        android:name="play"
        android:fillColor="@color/grey600"
        android:pathData="@string/path_play" />
</vector>
```

上記のnameと、AnimatedVectorDrawableの `android:name` が一致しているかを確認しましょう。このケースでは `play` を一致させておかないと動きません。

```xml
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_play_arrow_grey_600_24dp">
    <target
        android:name="play"
        android:animation="@animator/anim_play_to_pause" />
</animated-vector>
```

以上です。何か他にあれば追記します。
AWS Cognito 概要・用語 編



# 概要

Amazon CognitoはAWSのフルマネージメンドサービスの1つです。
アプリ開発者に取って、重要項目の1つである「ユーザー管理」「データ同期」の部分を担当してくれます。

Cognitoを利用すれば、TwitterやFacebook等のユーザーIDを利用して、ユーザーに対して一意のIdnetityを発行したり、ユーザーが複数所有するモバイル端末のデータを同期する機能が利用できます。

Identityを発行されたユーザーは、IAMロールで定義されたAWSの各種リソースにアクセス可能になります。

# 用語

## Idnetity

各ユーザーに割り振られる識別ID(CognitoID)

## Identity Pool

* CognitoがIdentityを管理する事。
* 1つのIdentity Poolを複数のアプリケーションに紐付ける事も可能。
	* アプリケーション毎に異なるIdentity Poolを使用している場合は、同じユーザーがアプリケーション毎に異なるIdentityを持つ事になる。

## External Identity Providers

* Cognitoで認証ユーザーとしてIdentityを発行する為に使われる認証サービスの意味。
	* パブリックログインプロバイダ
	* アイデンティティプロバイダ
* Amazon, Facebook, Twitter, Google, OpinID Connect

## Developer Authenticated Identities

* 開発者が運用または利用できる独自の認証サービス。
* External Identity Providersは一般公開されている認証サービスだが、独自の認証サービスもCognitoで利用できる。

## 同期ストア

* 発行されたIdentityに紐付けられた **キー/値** のペアのストア。
* Identity毎に独自のユーザー情報ストアがある。

# Identityによるユーザー認証

## Identityを発行されたユーザーは認可ユーザーとなる。

* IAMロールで定義されて許可されたAWSリソースへのアクセスが可能になる。
* Cognitoの同期ストアが利用可能になる。

## Identityの発行の種類

* 未認証ユーザーとして発行。
* パブリックログインプロバイダ等のユーザーIDと紐付けて発行。
* 独自の認証サービスを構築してユーザーIDと紐付けて発行。(User Pool)

## External Identity Providersを利用した認証ユーザーの場合

* 認証サービス(Facebook, Twitter etc...)のユーザーIDを元に、CognitoがIdentityを発行する方法。
	* Enhanced Authflow
	* Basic Authflow

### Enhanced Authflow

1. OpenID Tokenの取得
	* Facebook等の認証サービスから **OpenID Token** を取得する。
2. Get ID
	* OpenID Tokenから **Identity** を発行する。
3. GetCredentialsForIdentity
	* 2.で取得したIdentityから、AWSリソースへアクセスする為の **Credential** を取得する。
		* **Credential**
			* 一時的セキュリティ認証情報
			* AWSリソースに一時的にアクセスする為に利用。
4. AWSリソースにアクセスする。
	* 3.で発行されたCredentialを利用して、AWSリソースにアクセスする。

### 未認証ユーザーの場合

ゲストユーザーの管理も行える。
未認証ユーザーから認証ユーザーに更新する事も可能。
未認証ユーザーとして利用していたアプリケーションがパプリックログインプロバイダでログインした場合に、自動的に認証ユーザーとなる仕組みもある。

# Amazon Cognito Syncによる同期ストアの利用

Identityを発行されたユーザーは、Cognitoが提供する同期ストアを利用できる。
1人のユーザーが複数の端末を持っている場合に、設定値等を全ての端末で同期させる時に利用する。
ユーザーの設定値をDBで管理する必要がなくなるので便利。

## 同期オペレーション(データ同期)

* AWS Mobile SDKを使用してsynchronizeメソッドを呼び出すとき。
* CognitoのAPIを直接呼び出して書き込み成功またはタイムアウトになったとき。

## Push Sync(プッシュ同期)

* Amazon SNSとSilent Pushという仕組みを利用して、アプリのデータを同期させる事ができる。

## Cognito Streams

Amazon Kinesisを利用してデータをストリームする事ができる。

## Cognito Events

Cognitoの各種イベントを検知して、Lambdaを実行できる。

# 料金

| 項目 | 容量/回数 |
|-----|----------|
|同期ストア容量|1GBにつき|
|同期オペレーション|1万回につき|

Cognitoのイベントを使用して、Lambdaの関数を実行する場合、Cognitoの追加料金は発生しない。
(Lambda実行の料金は発生する。)

## 終わり

とりあえず、概要と用語に関してはこんな感じです。(User Poolに関しては未調査)
次回は、実践編で実際にCognitoを使ってみたいと思います。
VectorDrawable をサクッと導入する


# 対象読者

- 4系をサポートしたアプリを開発している人
- いつか導入しようと思っているけど、関連記事を見てなんか面倒そうと思っている人
- dpi 別の画像がわんさかあるのを解決したいと思っている人

android-developers ブログ記事
https://android-developers.blogspot.jp/2016/02/android-support-library-232.html


# やること

画像を VectorDrawable に差し替える。以上！


# 4系でなんで動くの？

https://android-developers.blogspot.jp/2016/02/android-support-library-232.html

上記記事内に書かれています。

> Android Studio 1.4 introduced limited support for vector drawables by generating pngs at build time.

そのあとで、以下のような記載があります。

> To disable this functionality (and gain the true advantage and space savings of this Support Library), you need to add vectorDrawables.useSupportLibrary = true to your build.gradle file:

ですので、png を自動生成する対応で十分（dpi 別の画像がわんさかあるのを解決したい）であれば、gradle やレイアウトファイルの修正までは不要です。

ちなみに自動生成された png は下記フォルダから見れます。drawable-anydpi-v21 というフォルダなどが作られています。

> path-to-project/app/build/generated/res/pngs

![スクリーンショット 2016-07-20 18.30.50.png](https://qiita-image-store.s3.amazonaws.com/0/39324/c30369fc-2487-f78e-e0f4-222a1ac40628.png "スクリーンショット 2016-07-20 18.30.50.png")


# 注意事項

png を自動生成する対応には制約があります。
上記記事内のリンクにありますが、下記動画で解説してくれています。

https://www.youtube.com/watch?v=8e3I-PYJNHg&t=221&utm_campaign=android_launch_supportlibrary23.2_022216&utm_source=anddev&utm_medium=blog

制約の一例ですが、下記の fillColor のように dynamic attributes は反映されません。
実際に下記の指定をしてビルドしてみたところ、生成された png は黒になっていました。

```
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="@color/accent"
        android:pathData="..."/>
</vector>
```

ベストプラクティスとしては、「インポートしたデータには触れるな（そのまま使え）」ということのようです。

# おまけ
Pre-scaling 機能があるから、そもそも高解像度向けの画像一枚しか用意してないよ！という方に。
パフォーマンス、画質向上が期待できる※ようなので、ファイル数は変わらなくても導入する価値はあるのかなと思います。

※参考リンク
Android Design Fundamentals > Density for Asset Crispness
https://www.udacity.com/course/material-design-for-android-developers--ud862


# その他参考リンク
https://developer.android.com/studio/write/vector-asset-studio.html


https://developer.android.com/guide/practices/screens_support.html?hl=ja#DensityConsiderations
【Android】権限削除では自動更新はされるのかどうかちょっとだけ試してみた

**※2015年に調べたものです**
##準備

```xml:AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```

今回はそのうちの

```xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```

の２つの権限を削除してみる。
また、自動更新をオフにする設定もできるのだが今回その設定をしてしまうと検証にならないので勿論自動更新をするように設定しておく（この設定はGooglePlayストアで可能）。

##結果
| 端末 | OS | 結果 |
|:-----------|------------:|:------------:|
| Nexus5       |        4.4.4 |     ○     |
| SC03E     |      4.3 |    ○    |
PHPのcatch句による代入が参照を無視するバグ

# 概要

ほとんど気にならないレベルだけど一応バグです…

[#72629 Caught exception assignment to variables ignores references](https://bugs.php.net/bug.php?id=72629)

```php
<?php

$var = null;
$e = &$var;

try {
    throw new Exception;
} catch (Exception $e) { }

var_dump($var === $e); // bool(false)
```

報告から**10分**で修正されました！laruence氏仕事速すぎワロタ

[Fixed bug #72629 (Caught exception assignment to variables ignores references)](https://github.com/php/php-src/commit/97c0b133c560e81bafbedaa321216b8862e1bdfc)

# 困りそうなとき

cURLによるリクエストが内在するコルーチンをジェネレータで処理する[mpyw/co](https://github.com/mpyw/co)というライブラリがあるんですが，それを利用して**「ある処理が終わった時に止めたいタイマー」**のような物を作りたくて，こういうコードを書いたんです．

```php
use mpyw\Co\Co;
use mpyw\Co\CURLException;

class TerminatedException extends \RuntimeException {}

Co::wait(function () {
    try {
        yield [timer($e), main()];
    } catch (TerminatedException $e) {
        var_dump('Terminated.');
    }
});

function curl_init_with($url, array $options = [CURLOPT_RETURNTRANSFER => true])
{
    $ch = curl_init($url);
    curl_setopt_array($ch, $options);
    return $ch;
}

function timer(&$e)
{
    $ms = 0;
    while (true) {
        yield CO::DELAY => 0.2;
        if ($e) return;
        $ms += 200;
        echo "[Timer]: $ms miliseconds passed\n";
    }
}

function main()
{
    var_dump(array_map('strlen', yield [
        'Content-Length of github.com' => curl_init_with('https://github.com/mpyw'),
        'Content-Length of twitter.com' => curl_init_with('https://twitter.com/mpyw'),
    ]));
    throw new TerminatedException;
}
```

これでちゃんとタイマーが止まってくれるかと思ったんですが，スローされた後も止まらないんですね．ここでバグ気づいて

```diff
     try {
         yield [timer($e), main()];
-    } catch (TerminatedException $e) {
+    } catch (TerminatedException $_) {
+        $e = $_;
         var_dump('Terminated.');
     }
```

としたところ直りました…

**「そもそもスローされた段階ですべての`yield`中の処理を止めるべきじゃないの？」**と思われる方もいるかもしれませんが，JavaScriptにおける[tj/co](https://github.com/tj/co)でも同じような挙動だったので，そこまでする必要はないとしてこれに関する修正はやめました．

ただし，ルートレベル，すなわち`Co::wait()`のコールスタックまで這い上がってきた例外に関しては，オプションで`throw`が無効にされていない場合には，即座にスローするように変更しました．これを行っておかないと，**使われない返り値のためにすべての処理が遅延させられることになる**ので．なお，ルートレベルでないものに関しては元から特に問題はありません．

[Generator does not stop in spite of RuntimeException thrown into parent scope #11](https://github.com/mpyw/co/issues/11)

## 余談

そもそも例外使う必要なかったですねｗ

```diff
-   function main()
+   function main(&$e)
    {
        var_dump(array_map('strlen', yield [
            'Content-Length of github.com' => curl_init_with('https://github.com/mpyw'),
            'Content-Length of twitter.com' => curl_init_with('https://twitter.com/mpyw'),
        ]));
-       throw new TerminatedException;
+       $e = true;
    }
```

こういうふうにして，呼び出し側で

```php
yield [timer($e), main($e)];
```

として変数`$e`を共有するだけで良さそうです．
Androidアプリ：jackコンパイラでjava8を使う

深くは調査してないけど、jackOptionsとcompileSdkVersionを24して、minSdkVersionを15とかにすれば、iceでもjava8のコードが動作するね。

でもlombokのコードがビルドできなかったので、ちょっとつらいな。何か方法があるのかしら。

#### java8のパスを設定
```
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
```

#### build.gradleの設定
```
android {
    compileSdkVersion 24
    buildToolsVersion '24.0.1'

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        jackOptions {
            enabled true
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    ...
}
```
シェイクするアニメーション

```swift
private func radian(degree: CGFloat) -> CGFloat {
    return CGFloat(Double(degree / 180) * M_PI)
}

func shake() {
    view.layer.setAnchorPoint(CGPointMake(0.5, 0.8), forView: view)

    let anim = CAKeyframeAnimation(keyPath: "transform.rotation.z")
    anim.duration = 0.8;
    anim.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
    // ここは割と適当
    anim.values = [radian(-12), radian(12), radian(-8), radian(8), radian(-4), radian(4), radian(-1.8), radian(1.8), 0.0]
    view.layer.addAnimation(anim, forKey: "shaking")
}
```

アンカーポイントの調整に http://qiita.com/usagimaru/items/b085d13ac47707ce5c69 を使っている。
node.jsとProcessingをOSCでやりとり

前回(http://qiita.com/tkyko13/items/869652e956e0cd463b60)
はwebsocketでやりとりしましたが、今回はOSCでやってみます。

OSCとは
https://ja.wikipedia.org/wiki/OpenSound_Control

#環境
mac osx 10.10 yosemite
node.js v6.2.0
node-osc v2.1(node.jsのモジュール)
processing3.1.1
oscP5(processingライブラリ)

##環境設定
### node.js
インストール方法は色々なサイトで紹介されています
nvmやnpmも入れると便利です

### node-osc

```
npm install node-osc
```

>
2017-06-22
[コマンドの変更]
~~npm install ws~~
↓
npm install node-osc
長い間単純なミスを記載してしまっていました．．．
すみません．．．

npmを使ってインストールしました
参考公式ページ
https://github.com/termie/node-osc
https://www.npmjs.com/package/node-osc

### oscP5
Processing内の[Add Library]から検索したらありました
Github https://github.com/sojamo/oscp5
リファレンス等 http://www.sojamo.de/libraries/oscp5/

#サンプルコード
前回のwebsocketでのサンプルコードとだいたい同じにしています。
サーバ側のnode.js

```js:oscServer.js
var osc = require('node-osc');

var sendCount = 0;
var oscClient = new osc.Client('127.0.0.1', 6000);
var oscServer = new osc.Server(5000);
oscServer.on("message", function (msg, rinfo) {

    console.log(msg);
    for(var i=0; i<msg.length; i++) {
        console.log(msg[i]);
    }
    var sendMsg =  new osc.Message('/address');
    sendMsg.append("test");
    sendMsg.append(sendCount);
    oscClient.send(sendMsg);
    sendCount++;
});
```

公式のサンプルではクライアントへ一回だけ送信のコードがあって、そこでは送信後、oscClient.killer();を実行しています
本当はプログラム終了時killerを実行したほうがいいかもしれませんが、とりあえずで。。。

クライアント側

```java:oscClient.pde
import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;
String message = "";
int sendCount = 0;

void setup() {
  size(400, 400);

  oscP5 = new OscP5(this, 6000);
  myRemoteLocation = new NetAddress("127.0.0.1", 5000);
}

void draw() {
  background(255);
  fill(0);
  text(message, 20, 20);

  if (frameCount % 120 == 0) {
    OscMessage myMessage = new OscMessage("Hello from P5");
    myMessage.add(sendCount);
    oscP5.send(myMessage, myRemoteLocation);
    sendCount++;
  }
}

void keyPressed() {
  OscMessage myMessage = new OscMessage("Press key");
  myMessage.add(""+key);//char型をString型に
  oscP5.send(myMessage, myRemoteLocation);
}

void oscEvent(OscMessage msg) {
  msg.print();
  
  message += msg.addrPattern();
  for(int i=0; i<msg.arguments().length; i++) {
    message += ", "+msg.arguments()[i];
  }
  message += "\n";
}
```

こっちは受け取り方がちょっと違う
nodeの方は全部配列で入っているが、配列0番目をaddrPatternで受け取るようです。（タグ的な意味があると思います）

#実行
だいたい前回と同じですが、
まず、ターミナルからoscServer.jsがあるところまで移動し、nodeで実行

```
$node oscServer.js
```

5000番ポートで待ち受け、6000番ポートに向けて返信しています
（ちなみに同じポート番号ではだめでした）
次に、Processingのクライアント側サンプルを実行します
Processingは6000番で受け取り、5000番へ送っています
今回はどちらから起動しても大丈夫です（今回のnodeの方はサーバとは言えないのかな？）
無事Processingのスケッチもしくわコンソールとターミナルから各ログが出力されていれば成功です
Processing側でキーボードを押すとターミナルでその文字が出るかと思います

#発展
ほぼほぼ前回と同じでしょうか
oscなのでPureDataなんかと簡単にできそうなのかな
他クリエイティブコーディングをやる人はoscのほうが馴染みやすいのかも
扱いやすいし…

#WebSocketとの違い
ソースコードから気づくまず大きな違いはoscはポートを2つ使用することでしょうか
oscの場合は1ポートにつき一方通行な仕様なのかも
データ形式はwsはjsonなど独自で実装するのに対し、oscは階層構造も対応していたはず（/で区切るパスみたいな形式）
速度はサンプル程度じゃわからないですね
aws sshポートフォワード使用してインスタンスをlocalのように扱いwebページを閲覧

#初めに
webサーバを閲覧する方法としてsshポートフォワーディングを使用してlocalhostとしてアクセスできます。
ブラウザを開きURLの欄に`http://localhost:[ポート番号]`と入力すれば見れます。
ssh接続は踏み台からのwebサーバーとします。

#やり方
インスタンスへの接続はteratermを使用しているのでこれでsshポートフォワードのやり方
teratermで踏み台へ接続します。teratermの設定を開きssh転送を開く。追加を開く。以下の画像の画面が出てくるので1,2,3のところに適切なものを入力
![teraterm.PNG](https://qiita-image-store.s3.amazonaws.com/0/134267/599f267d-315a-7c3a-d1a9-e4921950d44a.png)

１：端末側で空いているポートを指定。例：8080
２：閲覧したいwebサーバのIPを指定。例：172.31.0.100
３：webサーバーに接続する際のポート番号を指定。　例：80

OKを押して。ブラウザを開きURLに
例：`http://localhost:8080`
と入力して閲覧できます。


#どんな時に使ったか
webサーバーが以下条件だった場合。
・インスタンスにグローバルIP(EIP)が割り振られていない
・ELBも使用していない
・dommainとっていない場合(route53からのアクセスができない)
この条件だとブラウザ開いてURLにグローバルIP(EIP,ELBのIP)の指定やドメイン指定などで閲覧ができないから、sshポートフォワードを使用して閲覧します。

僕はkibana専用のログサーバーがこの構成だったのでポートフォワード使用して閲覧しています。
kibanaの閲覧の際には上の画像の３番はデフォルト使用しているので5601でした。
WebMatrix で PHP7 を使用する

**サイト → 設定 → PHP 設定** には、PHP5.5 までしか表示されません。
WebMatrix で PHP5.6以降や、 PHP7 を使用したい場合は、以下のようにする必要があります。

## PHP7 のインストール

[Web Platform Installer](https://www.microsoft.com/web/downloads/platform.aspx) を使用して PHP7 をインストールします。
ここでは **PHP7.0.x(x86) for IIS Express** をインストールします。 


## applicationhost.config の編集

`C:\Users\<username>\Documents\IISExpress\config\applicationhost.config` を編集します。

### fastCgi スキーマ

PHP5.3 など、既存の設定があると思いますので、PHP7 の設定を追記します。

```xml

<fastCgi>
    <application fullPath="C:\Program Files (x86)\iis express\PHP\v5.3\php-cgi.exe" activityTimeout="600" requestTimeout="600" instanceMaxRequests="10000">
        <environmentVariables>
            <environmentVariable name="PHP_FCGI_MAX_REQUESTS" value="10000" />
            <environmentVariable name="PHPRC" value="C:\Program Files (x86)\iis express\PHP\v5.3" />
        </environmentVariables>
    </application>
<!-- 追加 -->
    <application fullPath="C:\Program Files (x86)\iis express\PHP\v7.0\php-cgi.exe" activityTimeout="600" requestTimeout="600" instanceMaxRequests="10000">
        <environmentVariables>
            <environmentVariable name="PHP_FCGI_MAX_REQUESTS" value="10000" />
            <environmentVariable name="PHPRC" value="C:\Program Files (x86)\iis express\PHP\v7.0" />
        </environmentVariables>
    </application>
<!-- /追加 -->
</fastCgi>
```

### location スキーマ

WebMatrix の個人用サイトが設定されていると思います。
**scriptProcessor** のパスを PHP7 のパスに変更します。

```xml
    <location path="MyWebSite">
        <system.webServer>
            <handlers>
                <add name="PHP via FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\iis express\PHP\v7.0\php-cgi.exe" resourceType="Either" />
            </handlers>
        </system.webServer>
    </location>
```

## IIS Express の再起動

`applicationhost.config` を修正すると、 IIS Express が自動的に停止することがあります。
サイトを再起動することで、設定が反映されます。
【CentOS7.2】Ansible2.1のインストール

# 概要
- CentOS7.2へAnsible2.1を`pip`でインストールする手順の覚書

# 環境
- CentOS Linux release 7.2.1511 (Core)

# 手順の流れ
- `yum`リポジトリにEPELを追加
- `pip`のインストールと更新
- Ansibleのコンパイルに必要なパッケージをインストール
- Ansibleのインストール
- Ansibleの更新

# 手順詳細
## `yum`リポジトリにEPELを追加
```shell-session
[root@centos7 ~]# yum install -y epel-release libffi-devel
```

## `pip`のインストールと更新
```shell-session
[root@centos7 ~]# yum install -y --enablerepo=epel python-pip
[root@centos7 ~]# pip install --upgrade pip
```

## Ansibleのコンパイルに必要なパッケージをインストール
```shell-session
[root@centos7 ~]# yum install -y gcc libffi-devel openssl openssl-devel python-devel libcurl-devel
```

## Ansibleのインストール
```shell-session
[root@centos7 ~]# pip install ansible
```

## Ansibleの更新
```shell-session
[root@centos7 ~]# pip install --upgrade ansible
```

## インストール確認
```shell-session
[root@centos7 ~]# ansible --version
ansible 2.1.0.0
```

**おしまい**
【プログラマーのための数学】ベクトルの外積

## 目次
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)

## ベクトルの外積とは
下記3つの視点で説明します。

- 成分表示
- 公式
- 図形的意味

## 成分表示
2つのベクトル`a = (a1,a2,a3)` と`b = (b1,b2,b3)` があるとき、下記が成分(外積)となります。

外積とはベクトル量なので、成分で表すことができます。
ちなみに内積はスカラー量です。

```
(a2b3-a3b2, a3b1-a1b3, a1b2-a2b1)
```

なんかややこしいですが、下記のようにたすき掛けをするイメージです。

![vector_007.png](https://qiita-image-store.s3.amazonaws.com/0/105936/74ba2bff-6af9-878f-fc1a-e5953a5963b9.png)
出典：[受験の月](http://examist.jp/mathematics/space-vector/gaiseki/)


## 公式
外積の大きさは下記の公式で求められます。

```math
|a→×b→| = |a→||b→|sinθ
```

[内積](http://qiita.com/Esfahan/items/ae8d6f88feeffe0f9952)は、`a→・b→`このように「・」を使って表しますが、
外積は、`a→×b→`このように「×」を使って表します。

## 図で解説
![vector_006.png](https://qiita-image-store.s3.amazonaws.com/0/105936/5be3e3af-7838-9422-72de-cea6d31906ab.png)
出典：[受験の月](http://examist.jp/mathematics/space-vector/gaiseki/)

a→、b→両方と垂直で、a→からb→方向へ右ねじを回したときに、ねじが進む方向が外積、
上図でいうと、`a→×b→`の外積は上方向のベクトルS、`b→×a→`の外積は下方向のベクトルSとなります。

また、図と公式を見るとわかりますが、外積の大きさは、a→とb→を辺とする平行四辺形の面積と同じになります。
`|b→|sinθ`は、a→に対して直角に引いた線の高さと同じになるので、[(参考)](http://qiita.com/Esfahan/items/3404a967a03da5768654)
平行四辺形の面積を求める公式と、ベクトルの外積を求める公式の内容が等しくなります。

```math
平行四辺形の面積 = 底辺 × 高さ = |a→||b→|sinθ = |a→×b→|
```

[参考]
[受験の月](http://examist.jp/mathematics/space-vector/gaiseki/)
[塾講師STATION](http://www.juku.st/info/entry/244)

[関連記事]
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)
OS X用TensorFlow導入

自分のMacにTensorFlowの環境構築をした。
（基本的に公式Tutorialそのまま）
継続して、TensorFlowを使い続けるか微妙だったのでvirtualenvで環境構築をした。
環境は以下。

* OS X El Capitan (10.11.5)
* python 2.7 (2.7.11)
* zsh

```zsh
$ pip install --upgrade virtualenv
$ virtualenv --system-site-packages ~/tensorflow
$ source ~/tensorflow/bin/activate
# Mac OS X, CPU only, Python 2.7:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.2.1-py2-none-any.whl
(tensorflow)$ pip install --upgrade $TF_BINARY_URL
```

インストールチェック

```zsh
$ python
...
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>>
```

TensorFlow環境の切り替え

```zsh
$ source ~/tensorflow/bin/activate # activate the tensorflow environment.
(tensorflow)$ deactivate # deactivate the environment.
```

次は個人的な設定
activateのコマンドが面倒なのでエイリアスをはる。

```zsh
$ echo "alias activateTF='source ~/tensorflow/bin/activate'" >> ~/.zshrc
$ source ~/.zshrc
```

コマンド確認

```zsh
$ activateTF
(tensorflow)$  # Your prompt should change.
```

以上。
kubernetesのpodがRunning状態のままReadyがFalseになって、一切の新規外部接続を受け付けなくなった

# 現象
Ruby on RailsとpostgresそれぞれをDockerコンテナ上で動かしているシステムについて、それまで問題なかったのに、ある日突然リモートからpostgresにSSH接続できなくなった。
それどころか、アプリを動かしているコンテナからの接続も

```
psql: server closed the connection unexpectedly 
This probably means the server terminated abnormally
before or while processing the request.
```

このありさま。
ただ、アプリは生きていて、postgresのローカルホストからは特に問題が見受けられない。

さらに
・postgresの接続情報は適切か？
・ファイアウォールルールは適切か？
これらは問題ないことを確認した。

現象は、どうも新規の接続を受けなくなっている状態らしい。
しかもpostgresよりももっと低レイヤの部分で。
つまり、OS（GCPのDebian7.0系）より低レイヤな部分に問題があるようだ。

ここで、正常に動作しているステージング環境とのpodの状態比較を行ってみることにした。

```bash:ステージング環境
$ kubectl describe pod "ステージング環境"
Name:		ステージング環境のpostgresのpod
~中略~
Status:		Running
~中略~
Conditions:
  Type		Status
  Ready 	True 
```

```bash:問題環境
$ kubectl describe pod "問題環境"
Name:		問題環境のpostgresのpod
~中略~
Status:		Running
~中略~
Conditions:
  Type		Status
  Ready 	False 
```

StatusはRunning（正常に起動している状態）で、ConditionsがFalseになっている問題環境。
とりあえず、何が原因かは不明だが（本当はクライアントログとサーバーログ辿るべきなんだけど）、緊急なのでこの壊れているpodを物理環境のバックアップから復旧することにした。

# やったこと
物理環境自体は何の問題もないので、この状態でスナップショットを取得して、そこから再度ディスクを作成して、rcを作り直した。
元通り正常動作するようになった。

# まとめ
kubernetesでDBのpodがRunning状態のままReadyがFalseになった。
するとDBへの新規リモート接続はできなくなったのに、アプリはDB接続できて正常動作したままという状態に陥った。
気持ち悪いのでその状態の物理環境だけバックアップとって復旧したら元通りに戻った。

復旧は大した手間じゃないけど、ずっとまともに動いていたものがある日突然自分の管理下にない環境（IaaS）下で壊れるのって気持ち悪い。
この問題の原因知ってる人いたら教えて頂けると嬉しいです。
3回目の マインクラフトPE マルチプレイサーバー セットアップ時のメモ

#前回のメモ
http://qiita.com/haya2_/items/e59bfb00e9293d5fe672

#3回目にむけて
しばらく間があいたので、今の状況でどこまで手順が変わるか、確認する。

#環境
- さくらのクラウド
- CentOS 7
- マインクラフトPE 0.15.2

#はじめに
マインクラフトPEのマルチプレイサーバー（PocketMine-MP）のセットアップ（３回目）時のメモです。

#メモ
- マインクラフトPEのPEとは、Pocket Editionの略。簡単に言うとスマホ（iPhone, Android）版のこと。
- PEと、PC版と、コンシューマーゲーム機版（プレステ版など）は、基本的に互換性がない。
- PEのマルチプレイサーバーのソフトは、PocketMine-MPというソフト。（公式が提供するものではない？他にもあるかも？）
- pharファイルというファイル(jarのPHP版？)を最新のものをダウンロードして置き換えることが必要。（プレイしているクライアントのバージョンよりも低いバージョン用のサーバでは動かない）




#コマンドメモ
```
#root ユーザー以外のユーザーを作ってセットアップするのが原則
useradd hoge
passwd hoge

#とりあえず yum update しておく
yum -y update

#前提パッケージのインストール（すでに入っているかも？）
yum install perl gcc make automake libtool autoconf m4

#wget インストールする
yum -y install wget

#PocketMine-MP をダウンロードする
wget -q -O - http://get.pocketmine.net/ | bash

#現在公開されているものは最新バージョン用にまとまっておらず、いくつか追加の手順が必要
#PHPのバージョンが古いので、ベットダウンロードしてきて、bin ディレクトリ毎入れ替える
#上記手順なので、PHP を yum でインストールしたりはしなくても大丈夫
wget -O PHP_7.0.3_x86-64_Linux.tar.gz https://bintray.com/pocketmine/PocketMine/download_file?file_path=PHP_7.0.3_x86-64_Linux.tar.gz

#展開する
tar -xvf PHP_7.0.3_x86-64_Linux.tar.gz

#phar ファイル（プラグインパック？）の新しいのをダウンロードして、ファイルを入れ替えることが必要
#最新バージョンは、
#https://bintray.com/pocketmine/PocketMine/PocketMine-MP-phar#files
#の、一番下のリンクを使う、ということでよさそう。(が、公式では無いようなので、そういう意味では注意が必要ぽい。公式、情報更新されてないぽい…)
#0.15用
wget https://bintray.com/pocketmine/PocketMine/download_file?file_path=PocketMine-MP_1.6dev-27_ef8227a0_API-2.0.0.phar

#firewalld で ポートを開ける。この辺りは、まだまだ勉強しないといけない。
firewall-cmd --add-port=19132/udp --zone=public --permanent
firewall-cmd --reload

#スタート用のシェルスクリプトを起動する
./start.sh

```

#今回参考にさせていただいた主なページ。感謝 :pray: 
- [PocketMine-MP公式サイト](https://www.pocketmine.net/?lang=ja)
- [pocketmine / PocketMine / PocketMine-MP-phar](https://bintray.com/pocketmine/PocketMine/PocketMine-MP-phar#files)
npm shrinkwrapを運用で使うためのコツ

# npm shrinkwrap とは?
`npm shrinkwrap`は、Node.jsプロジェクトの依存モジュールのバージョンを固定するコマンドです。
使い方については[こちらの記事](http://qiita.com/oohira/items/d4736268fc0f1c0e91db)が参考になります。

今回は、`npm shrinkwrap`を**より安定して使うためのコツ**を記載しました。


# 1. CIを活用し、テストしたバージョンで固定しリリース
`npm shrinkwrap`コマンドでは`npm-shrinkwrap.json`というファイルが生成されます。
継続的インテグレーションのサービスを活用し、そこで**テストしたバージョンで固定**するとよいでしょう。
CIでのフローとすれば以下になると思います。

1. `npm update`で、可能な限り新しいバージョンを利用
2. テスト (`npm test`)
3. `npm shrinkwrap`
4. `npm-shrinkwrap.json`を追加しコミット、別tagや別branchとしてpushする (リリース)

**テストされた依存モジュールのバージョンを配布できる**ので、安定度が上がります。
またリリースtag, branchだけに`npm-shrinkwrap.json`を作ることで、
開発ブランチでの`package.json`と`npm-shrinkwrap.json`の**二重管理の問題もなくなります**。


# 2. devDependencies周りのバグを理解し、克服する
`devDependencies`は、開発のみに必要でproductionには必要ない依存モジュール群です。
これらを`npm-shrinkwrap.json`から省くことで、インストール速度が向上します。
[公式ドキュメント](https://docs.npmjs.com/cli/shrinkwrap)には、devDependenciesは入らないと書いていますが、
**npm v3はバグがあり、devDependenciesがいくつか混じってしまいます**。
さらに興味深いことに、**npm v2では別のバグがあり、必要なdependenciesが入らない状況があります**。

(see https://github.com/npm/npm/issues/11189)

## npm v3の場合
**`npm shrinkwrap`は不必要なdevDependenciesを含んでしまいます。**
[gist](https://gist.github.com/shinout/db19b045087307d9901008721c91a35f)に再現コードを載せました。
ソースは追っていませんが、devDependenciesのdependenciesが含まれるような結果になっています。


## npm v2の場合
一方npm v2ではdevDependenciesをしっかり除去してくれます！
しかし、逆に**必要なモジュールが入らない状況があります**。
[gist](https://gist.github.com/shinout/e3340d8b958823d6c7e741307c9bca99)に再現コードを載せました。
devDependenciesを除去するときに、それがdependenciesのdependenciesであっても取り除くようになっています。


## じゃあどうするか?
このままではproductionで安定して使う気になれません。
そこで、運用では下記のような操作を行うことでこのバグを克服することにしました。

```bash
rm -rf node_modules
npm install --production
npm shrinkwrap
```

こうすることで、npm v2およびv3において、必要十分なモジュールのみが書き込まれます。
しかし残念なことに、これだとテストしたバージョンでshrinkwrapできない問題があります...

そこでnpm v3限定であれば以下のコマンドも利用可能です。

```bash
npm prune --production
npm shrinkwrap
```

`npm prune`によってproductionに必要ないモジュールが取り除かれるため、うまくいきます。


# まとめ
- `npm-shrinkwrap.json`をCIで作って自動リリースがよい
- `devDependencies`関連にバグがあることを理解し、それを乗り越える

## 結局どうするの

CIなどで下記のような順番でコマンドを実行するといいでしょう。
(npm v3を利用)

1. `npm update`
2. `npm test`
3. `npm prune --production` 
4. `npm shrinkwrap`
5. `git add npm-shrinkwrap.json`
6. `git commit -m "vX.Y.Z"`
7. `git tag vX.Y.Z`
8. `git push origin vX.Y.Z`

(5-8はgitでtagをリリースする一例です)


# ↑を楽にやるライブラリ
CircleCIで、これを楽にやる[node-circleci-autorelease](https://github.com/CureApp/node-circleci-autorelease)を作成しました。ぜひ利用してみてください。

[CureApp/node-circleci-autorelease](https://github.com/CureApp/node-circleci-autorelease)

`shrinkwrap`だけでなく、`gh-pages`や`npm publish`など、リリース自動化周辺の操作を設定ファイル1つで管理できます。
次回、日本語で使い方の解説記事を書きます。
gzipを速く！pigz

# これはなに

gzipのmulti thread版

# 使い方

基本的にgzipと一緒。tarの出力に渡すと複数のcoreで頑張ってくれるので速い。

```sh
$ sudo apt-get install pigz
```

```sh
$ tar cvpf - hoge | pigz > hoge.tgz
```

`-p`とかでcore数指定したり、出来てうれしい。オプションはgzipを拡張。展開はunpigz。こっちもgunzipと使い方はほぼ一緒。
MiniTool Partition Wizard 最新バージョン9.1　新機能評測！

MiniTool partition wizardの最新バージョン9.1に搭載される便利なクリーナーツールを皆さんに紹介します。

GUIでパーティションを編集できるソフト。家庭内での私的かつ非商用でのみ無償で利用可能で、64bit環境もサポート。パーティションのフォーマット・削除・移動・リサイズ・コピーといった基本的な機能を網羅している 以下は使用方法です。

![main-interface-9.0[1].jpg](https://qiita-image-store.s3.amazonaws.com/0/134328/4d9b2483-7366-ff5d-5754-358394148c9e.jpeg)

下記が起動画面です。

簡単に目を通してもらえれば、なんとなく理解できると思います。
![screenshot_20160128_122845-1[1].png](https://qiita-image-store.s3.amazonaws.com/0/134328/8febe040-dd47-b580-76c8-91f2778cb5c2.png)

（１）Wizards（ソフトウェアの機能）

Copy partition Wizard・・・選択したパーティション（例えばDドライブ）を他のHDD/SSDにコピーしたい場合に使用します。

Copy Disk Wizard・・・HDD/SSDをまるごとコピーします。
HDDからSSDへ換装する場合はココです（クローンディスク作製）

Partition Recovery Wizard・・・誤って削除してしまったディスクやパーティションを復元したい時に使用します。
2）Operations
主に使用するのはこれくらいです。

Create New Partition・・・新しくパーティションを作る
format Partition・・・パーティションのフォーマット
Delete Partition・・・パーティションの削除
Move Resize Partition・・・パーティションのサイズ変更
Extend Partition・・・パーティションの拡張（他を小さくする必要あり）
Merge Partition・・・パーティションの結合
Copy Partition・・・パーティションのコピー
Set Label・・・ラベル名の設定
Hide Partition・・・ドライブを隠蔽する
Change Drive Letter・・・ドライブの名前（C,Dなど）

（3）認識されたディスクが表示されます

（4）認識されたディスクの詳細です
1:「Move/Resize」をクリックしドライブのボリュームを縮小します。
![resize-partition-3[1].png](https://qiita-image-store.s3.amazonaws.com/0/134328/c10256b3-6204-c9a5-263d-a0a2077d54e9.png)

2.コンテキストメニューで「Create」かサイドバーの「Create Partition」を選択すると下記の画面になるので「Partition Label」を記入し「Drive Letter」を選びOK（今回はEドライブを作成）
![create-partition-2[1].jpg](https://qiita-image-store.s3.amazonaws.com/0/134328/3a2e8c7e-54ce-f022-a785-21664b82f053.jpeg)

3：「Apply」を選択
![create-partition-3[1].jpg](https://qiita-image-store.s3.amazonaws.com/0/134328/72b64c67-4d79-867e-e4e8-74fab580d118.jpeg)

さらに、パーティション・ディスクのバックアップや、誤って削除してしまったパーティションの復元といった作業もウィザード形式で行なえる。これらのパーティション操作は、すべて一度“Pending（保留）”状態となり、サイドバーにある［Apply］ボタンを押すと実際に実行される仕組み。なお、システムドライブを含むパーティションを操作する場合は、再起動が必要になる。HPはこちらへ：https://www.partitionwizard.com/free-partition-manager.html
Scala+Sparkメモ1

状態：とあるDB(mysql)のとあるカラムはTEXT型であり、その中にJson文字列が詰まっている。キーは不定。

■キー不定のjsonパース
(jasksonそのものの使用準備とかは割愛)
キーがわかってればcase class作ってjackson.readValueにclassOf[hoge]で渡せばよいことは分かったが、不定の場合どうすれば良いのかわからなかった。
javaだとMap.classでいけるっぽいので、とりあえず

jackson.readValue(json_string, Map.getClass)

とかやってみたけど戻ってきた値がなんかtypeとかになっててアカンかった。

import java.util.HashMap

jackson.readValue(content_json, classOf[HashMap[String,String]])

これでいけた。
scala的に良いかどうかはわからないがとりあえずよしとしよう。
なお、readValueで戻ってきたHashMapは

import scala.collection.JavaConverters._

をした上でasScalaをしてます。


■sparkさんご機嫌斜め
とりあえず↑で得られたmutable.MapをSparkContextのparallelizeに放り込もうとしたらいんてりJさんに「いやそれ型ちげえよバーカ」って言われる。
Seqじゃないと駄目なのか…？
とりあえずtoSeqすれば叱られなくなったのでtoSeq。

```
    val testSeq = parsedJson.toSeq
    val spConf = new SparkConf().setMaster("local[*]").setAppName("testApp")
    val spContext = new SparkContext(spConf)
    var spCollection = spContext.parallelize(testSeq)
    spCollection.foreach { oops =>
      println(oops)
    }

```

```
[error] (run-main-0) com.fasterxml.jackson.databind.JsonMappingException: Could not find creator property with name 'id' (in class org.apache.spark.rdd.RDDOperationScope)
[error]  at [Source: {"id":"0","name":"parallelize"}; line: 1, column: 1]
com.fasterxml.jackson.databind.JsonMappingException: Could not find creator property with name 'id' (in class org.apache.spark.rdd.RDDOperationScope)
 at [Source: {"id":"0","name":"parallelize"}; line: 1, column: 1]
```

グワー。

調べたら、とりあえずbuild.sbtに

```
dependencyOverrides ++= Set(
  "com.fasterxml.jackson.core" % "jackson-databind" % "2.4.4"
)
```

足せばいけるらしい。
実際足したらいけた。

```
ERROR - Error in cleaning thread
java.lang.InterruptedException
```

は出たけどな。

dependencyOverridesで何やってんのかは別途追おう…

■追記
spContext.stop()
を最後の行に付け足したら
ERROR - Error in cleaning thread
はでなくなりました。
rails コマンド

■Chap01
●Rubyのバージョン確認
> ruby -v

●SQLiteのバージョン確認
> sqlite3 -version

●Devkitインストール
> ruby dk.rb init
> ruby dk.rb install

●Node.jsのバージョン確認
> node -v

●Railsインストール
> gem install rails

●Railsバージョン確認
> rails -v

■Chap02
●新規のアプリケーションを作成
> rails new railbook

●HTTP サーバを起動
> rails server

●コントローラクラスの作成
> rails generate controller hello

●コントローラクラスの削除
> rails destroy controller hello

●モデルクラスの作成
> rails generate model book isbn:string title:string price:integer publish:string published:date cd:boolean

●マイグレーションファイルによるテーブルの作成
> rake db:migrate

●フィクスチャによるテストデータの準備
> rake db:fixtures:load FIXTURES=books

●データベースクライアントの起動
> rails dbconsole

■Chap03
●前章で作成したデータベースとモデル、その関連ファイルを削除
> rails destroy model book

●Scaffolding機能によるアプリケーション開発
> rails generate scaffold book isbn:string title:string price:integer publish:string published:date cd:boolean

●マイグレーションファイルを実行
> rake db:migrate

●自動生成されたルートを確認する
> rake routes

●作成済みのファイルを削除する
> rake db:drop:all

●モデルクラスを作成
> rails generate migration CreateJoinTableAuthorBook author book
> rails generate scaffold user username:string password:string salt:string email:string dm:boolean roles:string reviews_count:integer
> rails generate scaffold author user:references name:string birth:date address:text ctype:string photo:binary 
> rails generate scaffold review book:references user:references body:text
> rails generate scaffold fan_comment author_no:integer name:string body:text deleted:boolean
> rails generate model memo memoable_type:string memoable_id:integer body:string

●マイグレーションファイルを実行
> rake db:migrate

●フィクスチャでテストデータを生成
> rake db:fixtures:load

●現在のテーブルレイアウト（schema.rb）でデータベースを再作成
> rake db:reset


■Chap05
●マイグレーションファイルの実行
> rake db:migrate

●マイグレーションの実行履歴
> rake db:migrate:status

●RAILS_ENVオプション
> rake db:migrate RAILS_ENV=test

●VERBOSEオプション
> rake db:migrate VERBOSE=false

● スキーマファイルによるデータベースの再構築
> rake db:schema:load

●データベースを破棄して、最新のスキーマ情報で再構築
> rake db:reset

●既存のデータベースからスキーマファイルを生成
> rake db:schema:dump

●.sqlファイルを作成
> rake db:structure:dump

●シードファイルの実行
> rake db:seed

●データベースの作成からスキーマの構築、初期データの投入
> rake db:setup

●フィクスチャファイルの実行
> rake db:fixtures:load FIXTURES=users,reviews

■Chap08
●Unitテストの実行
> rake test:models TEST="test/models/book_test.rb"

●ビューヘルパーのUnitテスト
> rake test:helpers TEST="test/helpers/view_helper_test.rb"

●Functionalテストの実行
> rake test:controllers TEST="test/controllers/hello_controller_test.rb"

●Integration テストスクリプトを作成する
> rails generate integration_test admin_login

●Integrationテストの実行
> rake test:integration TEST="test/integration/admin_login_test.rb"

■Chap09
●CoffeeScriptのコンパイル環境を準備
> npm install -g coffee-script

■Chap10
●メーラーの生成
> rails generate mailer NoticeMailer sendmail_confirm

●メーラーの Unit テスト
> rake test:mailers TEST="test/mailers/notice_mailer_test.rb"
【Android】Webから9-patch画像を取得すると端末が9-patchとして認識してくれない件

##やりたいこと
1. WebにおいてあるZipファイルをダウンロードする（この中にはアプリで使用する画像群やカラーの値が入っている）
2. ダウンロードしてきたZipを展開する
3. Fileで保存する
4. 保存されたファイルから画像や値を引いて使用する

この順序を実装してく中で（４）のタイミングで「9-patchが効いてねえ。。」「え！てっきり拡張子で判断しているのかと。。」 
という壁にぶつかって解消するまでの流れを記載して行きます。

##9-patchってAndroidはどうやって認識してるんだ？
https://github.com/android/platform_frameworks_base/blob/master/graphics/java/android/graphics/drawable/Drawable.java
まず調べる必要があったのはこの部分。AOSPのDrawable.javaから該当部を見つけました。
Drawableを取得する際にはその画像の9patch情報（chunk）を見てNinePatchDrawableなのかBitmapDrawableなのかを返している。
その「chunk」が厄介で、結果を見ると一度コンパイラを通さないと生成されない。

##さてどうしよう。。
「コンパイラを通さないと9-patchとして認識してくれない。。」
結論から言うと、一度コンパイルしてbinから取得してきた9patch画像をZipに入れることにしました。（運用としてちょっと面倒だけど。。）
これで正しく表示させることができました。

###別案（未検証）
/frameworks/base/tools/aapt/Images.cpp
を持ってきて、
read_png→do_9patchてやれば、9patch化できるだろうけど、、
https://github.com/cozybit/aosp-frameworks-base/blob/master/tools/aapt/Images.cpp
HTTPの基本の理解

Ajaxを実装しようと思った時にHTTPの知識が必要になった．Ajaxと言えば，ページの更新をしなくても動的にページ上のデータが更新されていくtwitterのTLやgoogle Mapの地図を一部表示する際に用いられている技術である．非同期通信の一つである．非同期通信ではリクエストを送ったあと、いったん放置して別の作業を進めておき、レスポンスが返ってきたタイミングで、そのあとの処理を再開する．そのため，ユーザーはレスポンスを待機する必要がなく，ほかの作業を進めることができる．

これを学ぶためにはHTTPを理解する必要がある．

## HTTP通信の仕組み
クライアント (ブラウザなど)がサーバーにリクエスト(要求)を送り，レスポンス(結果)を受け取る


## リクエストとレスポンスの構造

### リクエストの構造

以下がリクエストの例である

```
POST /www.yoheim.net/ HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: text/plain
Content-Length: 23

key1=value1&key2=value2
```
1行目(リクエストライン)：メソッド、リクエストURI、プロトコルバージョンで構成される．この例では「HTTPのバージョン1.1で通信を行い、/www.yoheim.net/ というURIに対して、POSTメソッドでリクエストします。」という意味になる．
2行目から14行目(ヘッダー)：User-AgentとかCookieとかAcceptとか色々な情報を指定する．最後の空行の1行目はヘッダーの終わりを示す．
15行目(メッセージ)：POST通信で用いられる，クライアントがサーバーにデータを送る際に付与される．

### レスポンスの構造
以下がレスポンスの例である

```
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Date: Thu, 27 Nov 2014 11:36:47 GMT
 
<!DOCTYPE html>
<html lang="ja" data-env="prod" data-runapp>
...
</html>
```

1行目(ステータスライン)：サーバーでの処理結果を伝える情報．プロトコルバージョン，ステータスコード，テキストフレーズで構成される．成功時は200 OKと表示されるが，失敗した時に，404 Not Foundや500 Internal Server Errorと表示される．
2行目と3行目(ヘッダー)：メッセージボディのタイプや文字コード、サイズ、メッセージを生成した日付といったレスポンスするデータの情報や、サーバーのソフトウェア情報が含まれる．

ChromeのDevToolsのNetworkタブからリクエストとレスポンスを確認できる．長くなったので今回は以上


続く

##参考
https://app.codegrid.net/entry/ajax-1
http://www.yoheim.net/blog.php?q=20120611
Laravel 5.2 では認証周りのアクション名が変わってます

# はじめに

Laravel 5.1 のドキュメントを見ながら Laravel 5.2 で開発をしていたら、ログアウトができなくてハマったので、何が原因でハマったかをメモしておきます。

# 現象

ルータには以下のようにログアウトのためのルートを登録していて

```app/Http/routes.php
Route::get('auth/logout', 'Auth\AuthController@getLogout');
```

ブラウザから `/auth/logout` にはアクセスできていたのですが、アクセスしてもログアウト処理はされず、`app/Http/Controller/Auth/AuthController.php` の `getLogout()` メソッドも呼ばれていませんでした。


# 原因

## 概要

Laravel 5.2 からログアウトに使うアクションが変わったのに、ルータに古いアクションを指定していたのが原因でした。


## Laravel 5.2 でログアウトに使うアクションが変更された

Laravel 5.1 の[公式ドキュメント](https://laravel.com/docs/5.1/authentication#authentication-quickstart)を見ると、ログイン周りのルートを登録するには、以下のように書くよう指示されています。

```app/Http/routes.php
// Authentication routes...
Route::get('auth/login', 'Auth\AuthController@getLogin');
Route::post('auth/login', 'Auth\AuthController@postLogin');
Route::get('auth/logout', 'Auth\AuthController@getLogout');
```

これが Laravel 5.2 の[ドキュメント](https://laravel.com/docs/5.2/authentication#authentication-quickstart)では以下のように Artisan コマンドを使って登録するように指示されていて

```bash
$ php artisan make:auth
```

この通り実行すると、ルートには

```app/Http/routes.php
Route::auth();
```

が登録されます。

`Route::auth()` の中を見てみると

```vendor/laravel/framework/src/Illuminate/Routing/Router.php
/**
 * Register the typical authentication routes for an application.
 *
 * @return void
 */
public function auth()
{
    // Authentication Routes...
    $this->get('login', 'Auth\AuthController@showLoginForm');
    $this->post('login', 'Auth\AuthController@login');
    $this->get('logout', 'Auth\AuthController@logout');

    // Registration Routes...
    $this->get('register', 'Auth\AuthController@showRegistrationForm');
    $this->post('register', 'Auth\AuthController@register');

    // Password Reset Routes...
    $this->get('password/reset/{token?}', 'Auth\PasswordController@showResetForm');
    $this->post('password/email', 'Auth\PasswordController@sendResetLinkEmail');
    $this->post('password/reset', 'Auth\PasswordController@reset');
}
```

このようになっていて、ログイン周りのアクション名が変わっていることがわかります。


## アクション名を指定してミドルウェアを適用していた

一方で、`AuthController` の中を見てみると

```app/Http/Controllers/Auth/AuthController.php
/**
 * Create a new authentication controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware($this->guestMiddleware(), ['except' => 'logout']);
}
```

このように書かれており、`logout` 以外のアクションに対してミドルウェア `guest` を適用しています。
つまり、アクション `getLogout` には、ミドルウェア `guest` が適用されてしまっていたのです。


# 対応

ミドルウェアの設定で `logout` ではなく `getLogout` を except するという方法でも解決できますが、Laravel 5.2 のやり方にならって、ルートに登録するアクションを `getLogout` から `logout` に変更するのがよいと思います。


# おわりに

わかってしまえば単純なことなのですが、私の場合、コントローラからミドルウェアを指定する方法に慣れていなかったため、そういうものだと思って見逃してしまっていました。
Docker初心者による、初心者のためのDocker入門 #1


> El Capitan + Docker 1.12.0-rc4-beta20 で試しています。
とはいえpublic betaな Mac Dockerは今ガンガンバージョンがあがっているのですぐ変わります。


Mac版Dockerのpublic betaも出たことだし、いい加減重い腰をあげてちょっと触ってみるか。。と思ったらVagrantみたいに起動している間に腹筋でもするか〜...とか待つ必要もなく、あっという間にapache + PHP のコンテナが立ち上がって捨てるのも複製するのも簡単...って**レボリューション！**、むしろこれは知らないとやばいレベルだ...と衝撃を受けたので本格的に入門してみようと思い立った記録です。続きます。たぶん。


QiitaやWEBの知識のみで始めてもいいんですが、完全に初心者なのである程度は体系だった知識を得た方がいいだろうということで、教科書はこれ。

> WEB+DB PRESS Vol.86

<img width="150" alt="Screen Shot 2016-07-20 at 16.30.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/e39c778f-0611-ad74-62a2-6e635e862e99.png">

ここでも買えます。
http://gihyo.jp/magazine/wdpress/archive/2015/vol86

ちょいと古いですがめっちゃ役にたちました。
とくに勉強になるなー、と**初心者ゴコロにぐっときたポイント**を抜粋

# Dockerを活かすための原則

## 1コンテナ1プロセスを保つ

たとえばRailsとnginxを同一コンテナで動かしちゃうと、ngixだけリスタートしたい場合にコンテナごと再起動することができなくなってしまう。= 手順が複雑化してしまう。コンテナも複雑化しちゃう、とのこと。複雑なことは排除してなるべくシンプルに保つ。なるほど〜。


## できる限り全てをコンテナで行う
逆にいえばホストOSには極力インストールしない。インストールしなければアップデートも必要なくなる。コンテナならば、新しいバージョンのものを用意してすぐ既存のコンテナとすぐ交換、ダメならすぐ戻せるけど、ホストOSとなればそうもいかない。だからそもそもインストールしない。なるほど〜


## Dockerfileをそのまま使う

docker commit等で専用イメージを作っちゃうと、コンテナの作成手順が明示的ではなくなる。
そしてChefやPuppetよりDockerfileの記述の方がシンプル。本当かな？でも教科書が言うのだからきっとそうなのだろう。
よし当面方針としてDockerfileいっぽんに絞ろう。なによりインストールするものも、学習するものも、少なくて済むのは良いことだ。



# ためしに nginxを起動してみる

本家を参考にしてみる。

> Getting Started with Docker for Mac
https://docs.docker.com/docker-for-mac/

そのまんま試してみる。

- まずDocker for Macをダウンロードする
- インストールする
- ターミナルを起動してコマンド実行

```sh
docker run -d -p 80:80 --name webserver nginx
```

- localhostにアクセスする

<img width="300" alt="Screen Shot 2016-07-20 at 17.01.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/bfcc5e90-76e6-485a-6139-253b27b5db21.png">







- コンテナを終了させる

```sh
docker ps       # CONTAINER IDを確認する
docker kill CONTAINER ID    # 実際はCONTAINER IDの先頭3文字くらいでOK
```

**なんて簡単なんだーーーーー！**


以上

次回は、Dockerで apache + PHPを起動する の予定
【Android】IconFontで特定の文字が特定の端末で色が変更できない

## IconFont

### メリット
- アプリ容量を軽量化することができる。 
- 解像度別に画像を用意しなくても済む。
- ベクターデータなので１個用意すれば全解像度デバイスにも対応できる。

### デメリット
- 単一カラーのみに限る。

## 何が起きたか
特定の文字のみでサムスンのドコモ端末だけでなぜかsetTextColor()が効かず、想定していない色になった。
他の文字だと自由自在に色を変えられるIconFontなのにある文字達だけ青やらオレンジやらの固定の文字色から変更ができなかった。白にしたいのに。

## ちょっと調べた
IconFontは各々の画像（フォント）にUnicodeが振られる。
ドコモのサムスン機のみドコモの絵文字とUnicodeが同一のものの色だけ絵文字の方に奪われる。
https://www.nttdocomo.co.jp/service/developer/make/content/pictograph/extention/index.html
他のドコモ機では起きなかったのでサムスン機だけ内部でごにょごにょやっている。というより頑張って対応したんだろうか、はたまた単なるバグなのか。
つまり、auでもSoftbankでもサムスン機では絵文字の色からUnicodeがかぶると変えられないというハプニングがハプンする可能性が高そう（検証できてない）

## 解決策
どうしようもないので、デザイナーさんにUnicodeを振り直してもらい、絵文字のUnicode一覧のどの絵文字ともかぶらないUnicodeに全てをしてもらった。
【PHP】php.ini設定項目

気になったところから随時更新

#display_errors

エラーをHTML出力の一部として画面に出力するかどうかを定義します。
画面への出力は標準出力と同じなので、CLIでの実行でも同様。

|設定項目|意味|
|---|---|
|1/ON|出力する|
|0/OFF|出力しない|

※初期設定：OFF


ONにすると脆弱性なので、本番ではOFFにすること。

参考：[PHPのdisplay_errorsが有効だとカジュアルにXSS脆弱性が入り込む](http://blog.tokumaru.org/2013/04/php-displayerrors-xss.html)
Amazon Inspectorの実行結果


cloudpack大阪の佐々木です。

Amazon Inspectorの実行結果(Findings)の見方についてまとめておきます。

# 確認方法

マネージメントコンソールで「結果」を選ぶと、見つかった問題点がリスト表示されます。
展開すると下記のような画面になります。

![Kobito.fAexx4.png](https://qiita-image-store.s3.amazonaws.com/0/3246/dd324f0d-fed4-a7d6-37bf-b173d7110daf.png "Kobito.fAexx4.png")


主に確認が必要なのは下記の項目です。

- **重要度**
	- 重要度に応じた対応が必要になると思います。
	- 下記の5つに分けられています。
		- High
		- Medium
		- Low
		- Informational
		- Undefined
		
- **AWSエージェントID**
	- EC2インスタンスIDを表します。
		- リンクをクリックすると、EC2の画面に飛びます。
- **説明**
	- 問題点の説明
- **推奨事項**
	- 推奨される対応方法

説明や推奨事項の内容をもとに対応する必要がありますが、ここに記載されている内容は少ないので、詳細を確認する必要があります。重要度の付け方や、詳細の確認方法については、ルールパッケージごとに異なります。

## ルールパッケージ

#### Common Vulnerabilities and Exposures

http://docs.aws.amazon.com/inspector/latest/userguide/inspector_cves.html

CVEで公開されている脆弱性の監査を行います。
対象のCVEリストは下記に公開されています。
https://s3-us-west-2.amazonaws.com/rules-engine/CVEList.txt

更新のタイミングは明記されていないみたいですが、割りと頻繁に更新されているようです。これを書いている時点では最新のものがリストに含まれていました。


脆弱性の詳細は、結果の推奨事項にあるcve.mitre.orgへのリンクから確認することができます。

![Kobito.EjdVJK.png](https://qiita-image-store.s3.amazonaws.com/0/3246/8cf2cc56-2190-848a-54d3-ce9081a4d9a8.png "Kobito.EjdVJK.png")

CVEのサイトから上手の矢印部分のリンクから、NVD(National Vulnerabillity Database)の情報も確認できます。

![Kobito.CDVT2V.png](https://qiita-image-store.s3.amazonaws.com/0/3246/6d6ca0e8-6c7a-d3ff-147c-8c35e7041de3.png "Kobito.CDVT2V.png")

NVDのサイトでは脆弱性のスコアやSeverityが確認できます。

Inspectorで表示されている重要度もここの値を参照にしている(と思ったけど微妙に違う・・・)

#### CIS Operating System Security Configuration Benchmarks-1.0

http://docs.aws.amazon.com/inspector/latest/userguide/inspector_cis.html

CISという組織が発行しているセキュリティベンチマークを実行します。

結果は下記のように実行結果が列挙されます。
重要度はInformationalになります。

![Kobito.BNEbGp.png](https://qiita-image-store.s3.amazonaws.com/0/3246/9f02ad4d-6e88-18eb-981d-df7a1dc9b0ab.png "Kobito.BNEbGp.png")

FAILが問題あり、PASSが問題なしだと思います。

それぞれの項目の詳細はこの画面からは分からず、
この[フォーム](https://benchmarks.cisecurity.org/downloads/multiform/index.cfm)から、
CIS_Amazon_Linux_2014.09-2015.03_Benchmark_v1.1.0.pdfというファイルをダウンロードし、確認する必要があります。

現在は、対応しているOSはAmazon Linux AMI release 2015.03のみになり、対応外のOSに実行すると、下記のような結果になり、テストは行われません。

![Kobito.tcyPiq.png](https://qiita-image-store.s3.amazonaws.com/0/3246/6e801be7-2595-cb74-f529-3e11b99f7fea.png "Kobito.tcyPiq.png")


Amazon Linux AMI release 2015.03を使ってても、yum updateしてバージョンが上がると対象から外れるため、実質使えないのではないかと思います。
内容的にもここまでやらない・・・といった感じなので、参考程度という感じかと思います。

### Security Best Practices

http://docs.aws.amazon.com/ja_jp/inspector/latest/userguide/inspector_security-best-practices.html

上記リンク先に、各項目の重大度や詳細が日本語で記載されています。

### Runtime Behavior Analysis

http://docs.aws.amazon.com/ja_jp/inspector/latest/userguide/inspector_runtime-behavior-analysis.html

上記リンク先に、各項目の重大度や詳細が日本語で記載されています。
scikit-learnの学習データセットをchainerで（学習・予測に）使う

Scikit-learnで使っていたnp.arrayデータセットをChainer (1.11)ですぐに使えなかったのでメモ．

用意するのは

- 学習データセット：train_X, train_y
- テストデータセット：test_X, test_y

ここで

- train_X, test_Xは(サンプル数, 次元)のnp.array．通常float32．
- train_y, test_yは(サンプル数, )のnp.array．おそらくデフォルトでint64．



# sklearnの場合

```python:sklearnでSVMの例
from sklearn import svm
clf = svm.SVC()
clf.fit(train_X, train_y) # 学習
clf.score(test_X, test_y) # 予測・スコア計算
prob_X = clf.predict_proba(test_X) # 確率予測
```

# Chainerの場合

```python:chainerのtrainerを使う

# まずクラスを作る．
class sk_dataset(chainer.dataset.DatasetMixin):
    def __init__(self, X, y):
        self.X = X.astype('float32') # float32を要求されるのでここで変換
        self.y = y.astype('int32')   # int32を要求されるのでここで変換
    def __len__(self):
        return self.X.shape[0]
    def get_example(self, i):
        return self.X[i], self.y[i]

# np.arrayをsk_dataset型に変換
train = sk_dataset(train_X, train_y)
test  = sk_dataset(test_X, test_y)

# あとはtutorial通り
model = L.Classifier(MLP())
optimizer = chainer.optimizers.SGD()
optimizer.setup(model)

train_iter = iterators.SerialIterator(train, batch_size=100)
test_iter  = iterators.SerialIterator(test,  batch_size=100, repeat=False, shuffle=False)

updater = training.StandardUpdater(train_iter, optimizer)
trainer = training.Trainer(updater, (20, 'epoch'), out='result')

trainer.run() # 学習


### 予測
i = 10 # i番目のデータ
dim = 4096 # データの次元

print("predict:", model.predictor(Variable(test[i][0].reshape((1,dim)))).data) # 生の出力

print("probability:", F.softmax(model.predictor(Variable(test[i][0].reshape((1,dim)))).data).data) # 確率予測

print("label:", F.softmax(model.predictor(Variable(test[i][0].reshape((1,dim)))).data).data.argmax()) # ラベル予測


```