OmniAICreator/Qiita-1.07M huggingface dataset:
Unityですり抜けるブロックを作る時に嵌ったこと

ブロック崩しですり抜けるブロックを作る時にどこの記事を見ても、`collider.isTrigger = true`という記述があって、それをそのまま書けば動くのかと思ったらそんなプロパティはありませんというエラーになる

次のように対象のGameObjectにアタッチされているBoxコライダーのインスタンスを取得してtrueをセットすればうまくいった。

```csharp
BoxCollider col = GetComponent<BoxCollider> ();
col.isTrigger = true;
```
Rのコンソールからlzhファイルを解凍する方法

Rでlzhファイルを解凍する情報に中々たどりつけなかったので、メモ

# 前提
- lhaをインストールしておく（インストール方法は以下参照）
    - http://qiita.com/narikei/items/ec34f100bad29ca8b399

# 解凍

- 作業ディレクトリ内のhoge.lzhを解凍する例

```{r}
system2("lha",args="hoge.lzh")

```
- 作業ディレクトリに、解凍されたファイルができます
JavaからPostgreSQLのデータ型(jsonb)を使う

PostgreSQL特有のデータ側をPythonから利用する方法について調べたので記録しておきます。

ここで紹介するのはjsonb型についてです。

この内容は、[第51回 長岡IT開発者勉強会](http://nagaoka.techtalk.jp/no51)で発表した内容の抜粋です。スライドは[こちら](https://www.slideshare.net/civicpg/51nds-postgresql-nds51)です。

Python版は[こちら](http://qiita.com/civic/items/328876f856246ced5e48)です。

# PostgreSQLをJavaから利用する
![利用方法](https://qiita-image-store.s3.amazonaws.com/0/8221/a5b3af4d-d62d-c4ee-7971-5b39360af4ce.png)

アプリケーションからPostgreSQLを使用するときには、
JDBC API経由で使う。JDBC APIは仕様でインターフェースのみとなり実装としてJDBC Driver for PostgreSQLがある。これはPostgreSQL公式のJDBCドライバ。

JDBC経由で様々なDBアクセス用ライブラリが存在するが、今回はJava標準の永続化仕様としてJPAを使用する例を考える。JPAも仕様でありインターフェースが用意されてある。実装の一つとしてEclipseLinkがある。


# ソースコード

<https://github.com/civic/postgresql-java-json>

# jsonbを利用する

| id     | info                     |
|:-------|:-------------------------|
| 1      | {"a": 100, "b": "Hello"} |
| 2      | {"a": 200, "b": "World"} |

```sql
CREATE TABLE json_test(
  id integer,
  info jsonb
)
```

## 低レベルAPI(JDBC)からjsonbの利用

### SELECT

```java
resultSet.getString("info");
// {"a": 100, "b": "Hello"}
```
jsonの列を取得し、getStringすることでJSON文字列を取得可能。

### INSERT (1)

```java
import org.postgresql.util.PGobject;

PGobject pgobj =new PGobject();
pgobj.setValue(json_string); //json文字列
pgobj.setType("jsonb");

preparedStatement.setObject(1, pgobj);
```

JDBC APIにはJSON型はない。JDBCの提供するインターフェース経由で使うのが普通だが、PostgreSQL提供のドライバの機能を使うしかない。共通ライブラリなど限定された箇所で使うべき。


### INSERT (2)

```java
PreparedStatement ps =conn.prepareStatement(
 "INSERT INTO json_test(info) VALUES(jsonb(?))" );

ps.setString(1, json_string);  //json文字列
```
JSON文字列としてパラメータをセットし、SQL文でjsonbにキャストするパターン。
文字列としてsetStringするので、標準APIのみで可能。

## 高レベルAPI(JPA)からjsonbの利用

### SELECT / INSERT
```java
@Entity
@Table(name = "json_test")
public class JsonTest implements Serializable {
    // ... 中略 ...

    @Column(name = "info")
    @Convert(converter = JsonbConverter.class)
    private String info;
...
```

JPAというORマッパー的な永続化機能。JPAの仕様でConverterという仕組みが用意されている。
Converterを作成し、Java型 <=> SQL型の相互変換を定義すれば、アノテーションで列定義に使用できる。

#### JsonbConverterの実装

```java
/**
@Converter
public class JsonbConverter implements AttributeConverter<String, PGobject>{

    /**
     * String-Pgobjectへの変換
     * @param x
     * @return 
     */
    @Override
    public PGobject convertToDatabaseColumn(String x) {
        PGobject pgobject =new PGobject();
        pgobject.setType("jsonb");
        try {
            pgobject.setValue(x);
        } catch (SQLException ex) {
            Logger.getLogger(JsonbConverter.class.getName()).log(Level.SEVERE, null, ex);
            throw new RuntimeException(ex);
        }
        return pgobject;
    }

    @Override
    /**
     * Pgobject-Stringへの変換
     * @param y
     * @return 
     */
    public String convertToEntityAttribute(PGobject y) {
        return y.getValue();
    }
    
}

```
Selenium WebDriver 要素が削除されるまで待機する方法

#要素が出現するまで待機する
WebDriverで要素が出現するまで待機する場合、WebDriver::waitとWebDriver::Until::elementLocatedを組み合わせて以下のように記述することで対応できます。

```js:elementLocatedの使用例
//idがtestのdiv要素が取得できるまで最大10秒待機する
driver.wait(webdriver.until.elementLocated(webdriver.By.xpath("//div[@id='test']")), 10000).then(function(element){

    //取得できた
    //elementには対象の要素が格納されている

}, function(err){

    //timeoutした場合の処理
});
```

#要素が削除されるまで待機する
では、要素が削除(DOMツリーから削除、又は外れる)した際に処理を行いたい場合はどうすればいいでしょうか。残念ながらwebdriverjsのソースコードを拝見した限りでは専用のメソッドは用意されていないようです。そのため、以下のようにメソッドを自作する必要があります。

```js:elementRemovedの実装例
//要素が取得できた場合はfalse、取得できなかった場合はtrueを返す
function elementRemoved(locator){

  return new webdriver.Condition(
      //エラーメッセージ
      '要素が削除されませんでした',
      //判定メソッド
      function(driver) {
        //findElementsで要素を検索し、ヒット数が0ならtrueを返す
        return driver.findElements(locator).then(function(elements) {
          return elements.length === 0;
        });
    });
}
```

これをWebDriver::waitと組み合わせることで要素が削除されるまで待機することができます。

```js:elementRemovedの使用例
//idがtestのdiv要素が削除されるまで最大10秒待機する
driver.wait(elementRemoved(webdriver.By.xpath("//div[@id='dialog']")), 10000).then(function(){

    //削除された

}, function(err){

    //timeoutした場合の処理
});
```

#最後に
要素が削除されるまで待機するケースは、例えばダイアログを閉じるボタンをクリックし、その後、確実に閉じたことが確認された後に処理を流したい場合等が考えられます。尚、今回は一例として挙げましたが、より複雑な条件で待機処理を書く時にも同様の手法で応用可能ですのでご参考ください。
PowerShell で Project Euler 11

# 問題

* 本家：[Problem 11 - Project Euler](https://projecteuler.net/problem=11)
* 翻訳：[Problem 11 - PukiWiki](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2011)


# 実装

```.ps1
$arr = @"
08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
"@ -split "`n|`r" | %{,($_ -split "\s+" | ?{$_ -ne ""} | %{[Int]::Parse($_)})}

4 |
    % {$max = 0} {
        if ($_ -le 0 -or $_ -gt $array.Length)
            {return $max}

        if ($_ -ge 2)
        {
            foreach ($i in 0..($_ - 2))
            {
                ${-} = ${|} = 1
                foreach ($k in 0..($_ - 1))
                {
                    ${-} *= $arr[$i][$k]
                    ${|} *= $arr[$k][$i]
                }
                $max = [Math]::Max(${-}, [Math]::Max(${|}, $max))
            }
        }

        foreach ($i in 0..($array.Length - $_))
        {
            foreach ($j in 0..($array.Length - $_))
            {
                ${-} = ${|} = ${\} = ${/} = 1
                foreach ($k in 0..($_ - 1))
                {
                    ${|} *= $arr[$i + $_ - 1][$j + $k]
                    ${-} *= $arr[$i + $k][$j + $_ - 1]
                    ${\} *= $arr[$i + $k][$j + $k]
                    ${/} *= $arr[$i + $k][$j + $_ - 1 - $k]
                }
                $max = [Math]::Max(${-}, [Math]::Max(${|}, [Math]::Max(${\}, [Math]::Max(${/}, $max))))
            }
        }
    } {$max}
```

# 以上

ループの回し方はいくつかあるかと思うが、あまり工夫の余地がない。
PowerShell で Project Euler 9

# 問題

* 本家：[Problem 9 - Project Euler](https://projecteuler.net/problem=9)
* 翻訳：[Problem 9 - PukiWiki](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%209)

> ピタゴラス数(ピタゴラスの定理を満たす自然数)とは$a < b < c$で以下の式を満たす数の組である.
> 
> $$a^2 + b^2 = c^2$$
> 例えば, $3^2 + 4^2 = 9 + 16 = 25 = 5^2$ である.
> 
> $a + b + c = 1000$となるピタゴラスの三つ組が一つだけ存在する.
> これらの積$abc$を計算しなさい.


# 素直に

```.ps1
1000 |
    % {$_} -pv n |
    % { 1..$n} -pv a |
    % {$a..$n} -pv b |
    % {$n - $a - $b} -pv c |
    ? {$a * $a + $b * $b -eq $c * $c} |
    % {$a * $b * $c} |
    select -f 1
```

# 原始ピタゴラス数の性質を使って

```ps1
1000 |
    ? {$_ % 2 -eq 0} |
    % {
        # 入力値を2で割った値の約数を求める
        $x = $_ / 2
        $divisor = 1..[Math]::Floor([Math]::Sqrt($x)) | ? {$x % $_ -eq 0} | % {$_, ($x / $_)} | sort

        # 約数の一つを m と仮定
        foreach ($i in 0..($divisor.length - 1))
        {
            $m = $divisor[$i]

            # n < m を満たす m + n を約数の中から取り、 n の値を仮定
            for ($j = $i + 1; $divisor[$j] -lt 2 * $m -and $i -lt $divisor.length; $j++)
            {
                $n = $divisor[$j] - $m

                # m - n が奇数でない場合、条件に合わないので次の組を探索
                if (($m - $n) % 2 -eq 0)
                    {continue}

                # ユークリッドの互除法により m, n の最大公約数を求める
                $min, $max = $n, $m
                while ($min -gt 0) {$min, $max = ($max % $min), $min}

                # 互いに素であれば、ピタゴラス数を生成し解答を出力
                if ($max -eq 1)
                {
                    $k = $x / ($m * ($m + $n))
                    $a = $k * ($m * $m - $n * $n)
                    $b = $k * (2 * $m * $n)
                    $c = $k * ($m * $m + $n * $n)

                    return $a * $b * $c
                }
            }
        }
    }
```

[ピタゴラス数の性質 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%94%E3%82%BF%E3%82%B4%E3%83%A9%E3%82%B9%E3%81%AE%E5%AE%9A%E7%90%86#.E3.83.94.E3.82.BF.E3.82.B4.E3.83.A9.E3.82.B9.E6.95.B0.E3.81.AE.E6.80.A7.E8.B3.AA)を利用すると上記のプログラムになる。

* 問題では$a < b$と指定されているが、積$abc$を求めるのにこの大小関係は不要なので無視する。
* 求めるピタゴラス数の最大公約数を$k$とする。$k = \gcd(a, b, c) \ne 0$。
* $a = k a', b = k b', c = k c'$と置くと、 $a^2 + b^2 = c^2$より、$(k a')^2 + (k b')^2 = (k c')^2$なので、両辺$k^2 (\ne 0)$で割れば$a'^2 + b'^2 = c'^2$で、組$(a', b', c')$もやはりピタゴラス数となる。
* 定義より、$(a', b', c')$は互いに素なので、原始ピタゴラス数である。
* 原始ピタゴラス数の性質から、$(a', b', c') = (m^2 - n^2, 2 m n, m^2 + n^2)$となる、自然数$m, n$が存在し、$m, n$は下記条件を満たす。
    1. $m > n$
    2. $m - n$ は奇数
    3. $m, n$は互いに素
* ここで、$a + b + c = k(m^2 - n^2) + k (2 m n) + k (m^2 + n^2) = 2 k m (m + n)$であるから、$a + b + c = 1000$ より、$k m (m + n) = 500$である。
    4. $m, m + n$ は $500$の約数
    5. $k = \frac{500}{m (m + n)}$
* 以上の考察を踏まえて、条件を満たす$m, n$を探索すれば良い。
raspberry pi 監視カメラ（ただのメモ）

#raspberry pi で監視カメラを作成するための準備メモ（自分用）

##準備するもの
raspberrypi2 モデルB
今回は消費電力を抑える関係でraspberry pi2を使用したいと思います。
[raspberrypi 2/3比較参考ページ](http://xn--u9j0md1592aqmt715c.net/raspberrypi-2-3-diff/)

監視カメラモジュール
マイク内蔵のものを使用します。
[LOGICOOL ウェブカム](https://www.amazon.co.jp/dp/B003YUB660%3Ftag%3Dpinkfigaro-22)

wifiトングル
raspberrypi2 モデルBはwifiモジュールがないため必要となります。
[WN-G300UA](http://www.yodobashi.com/ec/product/100000001001620636/index.html?gad1=&gad2=g&gad3=&gad4=56278881131&gad5=9870722391418572020&gad6=1o1&xfr=pla&gclid=Cj0KEQjwwoLHBRDD0beVheu3lt0BEiQAvU4CKtf2p1GD7eL74Va7K_-IptFTk4Bmi_BrvwzlDFa0mI0aAuqr8P8HAQ)

##開発
(追記：2017/04/02)
以下の参考サイトよりstreamができました。

参考サイト
[MJPG-Streamer](http://make.bcde.jp/raspberry-pi/usb%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%A7%E7%9B%A3%E8%A6%96%E3%82%AB%E3%83%A1%E3%83%A9/)

その他の問題
raspberry pi自体が外部接続ができない状態になったので以下コマンドで対応

```
dhclient wlan0
```
参考サイト
http://www.1ft-seabass.jp/memo/2015/05/15/raspberry-pi-dhclient-refresh-wlan/

https://www.smartllc.jp/blog/20150222-how-to-stream-webcam-with-mjpgstreamer-on-raspberrypi/

これもやってみたい
[うしこぶろぐ](http://www.feijoa.jp/laboratory/raspberrypi/cameraPrequel/)

メモ終わり
PythonからPostgreSQLのデータ型(jsonb)を使う

PostgreSQL特有のデータ側をPythonから利用する方法について調べたので記録しておきます。

ここで紹介するのはjsonb型についてです。

この内容は、[第51回 長岡IT開発者勉強会](http://nagaoka.techtalk.jp/no51)で発表した内容の抜粋です。スライドは[こちら](https://www.slideshare.net/civicpg/51nds-postgresql-nds51)です。

Java版は[こちら](http://qiita.com/civic/items/3908e1242a468dae33f6)です。

# PostgreSQLをPythonから利用する
![利用方法](https://qiita-image-store.s3.amazonaws.com/0/8221/149f9296-5bde-d0f4-fbca-4448116e2b28.png)

アプリケーションからPostgreSQLを使用するときには、DB API経由で使う。
DB APIは仕様で実装の一つとしてpsycopg2がある。psycopg2はPostgreSQL公式Cクライアントライブラリのlibpqを内部で使用している。

# ソースコード
<https://github.com/civic/postgresql-python-json>

# jsonbを利用する

| id     | info                     |
|:-------|:-------------------------|
| 1      | {"a": 100, "b": "Hello"} |
| 2      | {"a": 200, "b": "World"} |

```sql
CREATE TABLE json_test(
  id integer,
  info jsonb
)
```

## 低レベルAPI(psycopg2)からjsonbの利用

### SELECT

```python
cur.execute(
"SELECT info FROM json_test WHERE id=1"
)
row = cur.fetchone()
print(row[0])
# {'b': 'Hello', 'a': 100}
```

jsonの列を取得すると、dict(Pythonの辞書型)で取得できる。

### INSERT (1)

```
from psycopg2.extras import Json

#json objectで更新
cur.execute(
  "INSERT INTO json_test(info) VALUES(%s)",
  [ 
    Json({"a":30, "b": "update"})
  ]
)
```
psycopg2が提供するJsonオブジェクトでパラメータをセットする。
psycopg2.extras.Jsonを使用する。dict→Json。

### INSERT (2)

```
import json

# dictを文字列化してSQLに渡す
cur.execute(
  "INSERT INTO json_test(info) VALUES(jsonb(%s))",
  [
    json.dumps({"a":30, "b": "update"}) //dict→str
  ]
)
```
JSON文字列としてパラメータをセットし、SQL文でjsonbにキャストするパターン。
この場合DB APIのインターフェースで使用できる。

## 高レベルAPI(SQLAlchemy)からjsonbの利用

### SELECT / INSERT
```python
from sqlalchemy.dialects.postgresql import JSONB

class JsonTest(Base):
    __tablename__ = 'json_test'
    id = Column(Integer, primary_key=True)
    info = Column(JSONB)  # JSONB型の列と宣言
    ...
```
ORマッパーの機能を提供するSQLAlchemyの場合、列定義にpostgresql方言(dialect)が使用できる。
React超入門 / HelloWorld, JSX, コンポーネントの基本

## はじめに
Facebook製JavaScriptライブラリReactについて、最低限の内容を簡単にまとめました。

## 読者対象者
* React未経験だけど興味がある人
* 他JavaScriptフレームワーク未経験者

## 開発環境
* [JSFiddle](https://jsfiddle.net/)
* [React 15.4.2](https://facebook.github.io/react/)(2017/03/26時点の最新版)
* ES5基準とする

## Reactとは何か

[公式サイト](https://facebook.github.io/react/)のトップページには

> A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES

と記載されており、Reactとは「ユーザーインターフェースを構築するJavaScriptライブラリ」と定義されています。

## Hello Worldを表示させよう

### サンプルコード
実行例：https://jsfiddle.net/hypermkt/fy1apndp/

```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react-dom.js"></script>
<div id="content"></div>
```

```js
ReactDOM.render(
  React.DOM.h2(null, 'Hello World'),
  getElementById('content')
);
```

### 処理の流れ
1. CDNからreact.js, react-dom.jsを読み込む
2. Reactで生成したHTMLを表示させる場所を宣言する
3. `ReactDOM.render` を利用して、content IDの場所に、h2タグで`Hello World`を表示させる

### ReactDOM.render とは

```js
ReactDOM.render(
  element,
  container,
  [callback]
)
```

指定されたコンテナーに対して、React DOMツリーを出力する関数です。第１引数にReactのDOMエレメントを渡します。第２引数には、DOMエレメントを出力したい要素を指定します。

## JSX

### JSXとは
JSXは、JavaScriptの拡張文法で、JavaScript内にHTMLタグを直接記述しているかのようにDOMエレメントを指定できます。

以下を見ると一目瞭然ですが、JSXで記述された方が可読性も高くなり、かつコーディングもシンプルになります。

```diff
ReactDOM.render(
-  React.DOM.h2(null, 'Hello World'),
+  <h2>Hello World</h2>,
  document.getElementById('content')
);
```

JSXのもう一つの特徴としては、JSX自体はJavaScriptコードではないのでブラウザ上では動作しません。そのため、Babelなどのトランスパイラを利用して変換する必要があります。

#### JSFiddleでJSXを利用するには

左下の窓内の :gear: アイコンをクリックし、Languageの中から「Babel」を選択することで、JSXをReactのJavaScriptコードに自動的にトランスパイルしてくれるようになります。

![JSFiddleでJSXを利用するには](https://qiita-image-store.s3.amazonaws.com/0/29755/bfe1f582-876c-8e52-331a-c6f47ac6b6e6.png)

## コンポーネント

### コンポーネントとは
UIを作るコードを独立した部品とすることができます。ES5では、`React.createClass`関数を利用することで、コンポーネントを生成します。

### React.createClassコンポーネントを作ろう
`React.createClass`を使用してコンポーネントを作成します。`render`関数でReact要素を返すようにします。これを `HelloWorldComponent`変数に格納すれば、コンポーネントは完成です。

```js
var HelloWorldComponent = React.createClass({
  render: function() {
    return <h2>Hello World From Component</h2>
  }
});
```

作成したコンポーネントを使うには、`React.createElement`の第１引数に渡すことで使用できます。

```js
ReactDOM.render(
  React.createElement(HelloWorldComponent),
  document.getElementById('content')
);
```
実行例：https://jsfiddle.net/hypermkt/s5cqr5uy/

## 終わりに
まだまだ内容として薄いので、今後とも継続して追記していきます。
HDDについて

■HDDとは
外部記憶装置(Hard Disk Drive)

■HDDメーカ別の世界シェア(2014(7～9月))
・ウェスタン・デジタル(Western Digital)		：44.0%
・シーゲート・テクノロジー(Seagate Technology)	：40.5%
・東芝(TOSHIBA)					：15.5%

■HDDメーカ別の故障率(2016年)
・東芝						：3.06%
・シーゲート・テクノロジー(Seagate Technology)	：3.48%
・ウェスタン・デジタル(Western Digital)		：6.55%

■インタフェース
現在は、Serial ATA（SATA）の2.6以降が主流。

IDE(パラレルATA)
・Ultra ATA/33	：(33MB/sの転送速度)
・Ultra ATA/66	：(66MB/sの転送速度)
・Ultra ATA/100	：(100MB/sの転送速度)
・Ultra ATA/133	：(133MB/sの転送速度)

SATA(Serial ATA)
・SATA1.0	：(150MB/sの転送速度)
・SATA2.6	：(300MB/sの転送速度)
・SATA3.0	：(600MB/sの転送速度)
・SATA Express	：(1GB/sの転送速度)

M.2		：(1GB/sの転送速度)
　→SATA Expressの小型版で、論理的には上位互換。

■パーティションスタイル
・MBR（マスターブート レコード）
2TBを超えないHDDには推奨。コマンド情報の32bit制約から2.2TBまでの認識となる。(2Tib(約2.2TB)の壁を参照)
・GPT（GUIDパーティションテーブル）
2.2TB以上も可。Windows 2000やXPが読み書きを行えない。

■容量の壁
・127GiB(約137GB)の壁
ATA/ATAPI-5のコマンドは、HDDのデータ位置を示すLBA(Logical Block Addressing)のアドレス長が28bitであった。
28bit(=0xFFFFFFF)×512byte(1セクタあたりのバイト数)=127GiB(約137GB)であり、
28bit長のコマンドでは最大で127GiB(約137GB)までのデータしかアクセスができなかった。

ATA/ATAPI-6から48bit LBAに拡張され、48bit LBAに対応しているデバイスをBig Driveと呼ぶ。
48bit(0xFFFFFFFFFFFF)×512byte=128Pib(約144PB)までアクセス可能となった。

※2017年現在、Big Driveが標準となっている。
　2002年より古く発売されたHDDやOSを使用する場合のみ注意が必要。

・2Tib(約2.2TB)の壁
上記のBig Driveにより128Pib(約144PB)までアクセスできるようになったが、
HDDのMBRパーティションを使用すると1パーティションで管理できる総セクタ数は32bitであり、総容量は
32bit(0xFFFFFFFF)×512byte=2TiB(2.2TB)までとなる。

GUIDパーティションを使用すれば総セクタ数を64bitで管理するため、
64bit(0xFFFFFFFFFFFFFFFF)×512byte=8ZiB(9.44ZB)までアクセス可能となる。

また、WindowsのようにSCSI CDB(Command Descriptor Blick)に抽象化してコマンドを発行しているシステムでも、
10byteCDB(32bit LBA)を使用しており、総容量が2Tib超のドライブ(パーティションではない)を扱えない。
こちらは16バイトCDB(64bit LBA)に対応したシステムであれば、8ZiB(9.44ZB)までアクセス可能となる。

※2010年以降、総容量2Tib超のHDDが発売されている。
　2017年現在、最新の64bitOSであれば、GPTや16バイトCDBに対応している(はず)

■BigSector
・HDDの物理ディスクセクタサイズを512バイトから4KiBに拡張
HDD上の物理セクタの長さを、従来の512バイト構成より長くすることによって、フォーマット効率を向上させる規格。
エラー検出と訂正のアルゴリズムが拡張され、記録データの信頼性が向上するとともに、フォーマット効率が改善するため、
記録容量を拡大することができる。
・AFT(Advanced Format Technology)
4096バイトのセクタサイズを規定し、従来の512バイト論理セクタ用のアプリケーションや機器構成との互換性を維持するために、
512バイトのエミュレーション機能を備えたHDD。
エミュレーション機能とは、磁気ディスクにデータを書く際に、ホストシステムから送られてきた512バイト単位のデータを、
4096バイトである磁気ディスクの物理セクタサイズに対して論理的には512バイトであるかのようにエミュレートし、
適切に4096バイト単位に変換して書き込むもの。

■音
・カリカリ・ゴリゴリ
　ヘッドのシーク音。異常ではない。Automatic Acoustic Management (AAM：自動騒音管理)で調整可能。
・カシャカシャ・コトコト
　ヘッドを退避/復帰するリトラクト音。異常ではないが、頻発するなら要調査。
　WD社製のHDDの場合、IntelliPark機能が8秒ごとにヘッド退避することがあるらしい。
・ジージー
　オフラインスキャン音。暇なときにスキャンテストしている。
・カコン、カコン
　ヘッドが損傷している可能性があり要注意。読めない何かをリトライしているっぽい。

■SMART
[こちらを参照](http://qiita.com/dornie/items/26b463c1ec4002d1c3da)

■IDENTIFY DEVICE
[こちらを参照](http://qiita.com/dornie/items/24f26d564b72a0720aae)
GitHubのOSSから見るbuild.gradleでライブラリのバージョンを管理する方法

Gradleのモジュールが複数ある場合に管理しないとbuild.gradleを編集する時に警告が出てめんどうですよね。(基本的に一番大きいバージョンになるとは思いますが)
本当にどれでもいいのですが、
どれかを選ぶとなると悩みがちなので、簡単にどういうパターンが有るか一応出しておきます。

# gradle.propertiesを使う
google/iosched, DroidKaigi/conference-app-2017で使われているみたいです
https://github.com/DroidKaigi/conference-app-2017/search?utf8=%E2%9C%93&q=support_lib_version&type=

簡易的に対応するのであれば一番シンプルな気がします。
どこに設定あるんだっけ？ってなるかもっていうのはありますが、検索でなんとかなるとは思います。

```groovy:gradle.properties
support_lib_version=25.1.1
```

```groovy:app/build.gradle
dependencies {
    // Support Library
    compile "com.android.support:support-v4:${support_lib_version}"
}
```

# ルートのbuild.gradleの中で、extを使う
googlesamples/android-architectureやJakeWharton/u2020で使われているみたいです。
https://github.com/googlesamples/android-architecture/blob/todo-mvp-rxjava/todoapp/app/build.gradle

無難な感じです。

```groovy:build.gradle
ext {
    // Sdk and tools
    minSdkVersion = 10
    targetSdkVersion = 24
    compileSdkVersion = 24
    buildToolsVersion = '24.0.2'

    // App dependencies
    supportLibraryVersion = '24.2.0'
```

```groovy:app/build.gradle
dependencies {
    // App's dependencies, including test
    compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
```

# dependencies.gradleなど別ファイルに分けて管理
twitter/twitter-kit-androidで使われているみたいです。
モジュールのbuild.gradleは見やすいですがSupport Libraryを一個追加する時に2ファイル編集しないといけないのはちょっとマイナスかもです

```groovy:dependencies.gradle
ext {
    compileSdkVersion = 23
    buildToolsVersion = '23.0.3'
    targetSdkVersion = 22

    minSdkVersion = [
            twitter        : 14
    ]

    sourceCompatibilityVersion = JavaVersion.VERSION_1_7
    targetCompatibilityVersion = JavaVersion.VERSION_1_7

    enableTestCodeCoverage = true
    buildNumber = 'dev'

    dependency = [
            // Gradle plugins
            spoonGradlePlugin          : 'com.stanfy.spoon:spoon-gradle-plugin:1.0.4',
            androidGradlePlugin        : 'com.android.tools.build:gradle:2.1.2',
```

```groovy:build.gradle
apply from: rootProject.file('dependencies.gradle')
```

```groovy:tweet-ui/build.gradle
dependencies {
...
    compile dependency.fabric
```


# べた書き
モジュールが1つしかない場合はこれで十分だと思います
kickstarterやGitHubのクライアントなど
https://github.com/kickstarter/android-oss/blob/master/app/build.gradle#L135
https://github.com/pockethub/PocketHub/blob/master/app/build.gradle#L112


```groovy:kickstarter/android-oss
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:25.1.0'
    compile 'com.android.support:cardview-v7:25.1.0'
```


# おわり
どれが好みだったでしょうか？
本当にどれでもいいのですが、複数のモジュールを使って開発をする場合は、どれかでバージョンを統一して管理しておきたいですね
他にいい方法を知っていたらぜひ教えてください！
Vue.jsでスクロールを検知する

# コード

```html:index.html
<div id="app">
  <div class="content">
    <span>{{ scrollY }}</span>
  </div>
</div>
```
```js:main.js
new Vue({
  el: '#app',
  data: {
  	scrollY: 0
  },
  mounted() {
  	window.addEventListener('scroll', this.handleScroll);
  },
  methods: {
    handleScroll() {
  		this.scrollY = window.scrollY;
    }
  }
})
```
サンプル:
https://jsfiddle.net/z11fe07p/1088/

# 解説

```js
window.addEventListener('scroll', this.handleScroll);
```
ここでイベントをリッスンさせて、

```js
handleScroll() {
  this.scrollY = window.scrollY;
}
```
この関数を呼び出すだけ。
[Ruby入門] 03.数値を扱う（リテラルと変数と演算。ついでに定数の話も）

&gt;&gt; 連載の目次は [こちら！](http://qiita.com/prgseek/items/237d02be844534063f1d)

##概要
+ Rubyでは、全てのデータはオブジェクト。いわゆる基本データ型(プリミティブ型)というのは存在しない。
+ なので、数値もオブジェクト。（整数はInteger  小数はFloat など）
+ Rubyは動的型付け言語。同じ変数に違う型の値をセットできる
+ Rubyでは、定数の扱いがやや(というかかなり)特殊

##1. 数値リテラルの話
Rubyでは数値リテラルもオブジェクト。（整数はInteger 小数はFloat など）

まあ、普通に 33 とか -22 とか 5.5 とか 0x2A とか書くわけだが...

いくつか特殊な表現がある。(あまり使わないかな...)

###アンダースコアで桁区切り

```
123_456_789   ← 普通に 123456789 のこと
```

###分数

```
1/3r           ← ３分の１のこと
y = 99 * 1/3r  ← 結果も分数になるので、y は 33/1（1分の33）になる
```

###その他
複素数 とかも表現があるらしいが、普通のWEBアプリとかでは使わないだろう。Python的に高度な計算を書きたいときに便利なのかな。


##2. 変数の話

###2-1. 普通に代入

```
myhen1 = 123
myhen2 = 999
myhen2 = 'aiueo'   # 動的型付けなので、違う型の値をセットできる
```

###2-2. まとめて代入

```
x, y, z = 1, 2, 3         *1
a, b, c = [77, 88, 99]    *2
```
*1 それぞれが左辺の対応する変数に代入される（この式の戻り値が 配列[1, 2, 3] ってところはユニーク）
*2 配列からまとめて代入もできる


##3. 演算

#### ● 概要

まあ、普通に 3 + 2 とか 7 - 4 とか 5 * 6 とか 9 / 3 とか書く。

+ もう少し高度な数学的な計算は、Mathモジュール(*)のメソッドで可能（sin とか cos とか sqrt とか）
+ インクリメント演算子「++」やデクリメント演算子「--」は、Rubyには無い！
+ べき乗は `**` 演算子を使う。2 ** 3 ==> 8

(*)モジュールについては、後の回で書く予定です。

#### ● 宇宙船演算子

左辺（レシーバー、つまり自分）が小さかったら -1
左辺（レシーバー、つまり自分）が大きかったら 1
左右が同じだったら 0
を返す

```ruby
1 <=> 3   # -1
3 <=> 1   # 1
3 <=> 3   # 0
```

#### ● 四捨五入
```ruby
# 小数部をまるめる
p 1.4.round  # 1
p 1.5.round  # 2
p -1.4.round # -1
p -1.5.round # -2

# 小数点以下n桁の四捨五入
p 1.23456.round(2) # 1.23
p 1.23456.round(3) # 1.235

# 整数部をまるめる
p 123456.round(-2) # 123500
p 123456.round(-3) # 123000
```


#### ● 切り捨て、切り上げ
```ruby
# 切り捨て
p 1.4.floor  # 1
p 1.5.floor  # 1
p -1.4.floor # -2
p -1.5.floor # -2

# 切り上げ
p 1.4.ceil  # 2
p 1.5.ceil  # 2
p -1.4.ceil # -1
p -1.5.ceil # -1
```


#### ● 小数点以下n桁の切り捨て、切り上げ
```ruby
require 'bigdecimal'

# 小数点以下n桁の切り捨て
p BigDecimal(1.23001.to_s).floor(2).to_f # 1.23
p BigDecimal(1.23999.to_s).floor(2).to_f # 1.23
p BigDecimal(1.23401.to_s).floor(3).to_f # 1.234
p BigDecimal(1.23499.to_s).floor(3).to_f # 1.234

# 小数点以下n桁の切り上げ
p BigDecimal(1.23001.to_s).ceil(2).to_f # 1.24
p BigDecimal(1.23999.to_s).ceil(2).to_f # 1.24
p BigDecimal(1.23499.to_s).ceil(3).to_f # 1.235
p BigDecimal(1.23401.to_s).ceil(3).to_f # 1.235
```


#### ● 絶対値
```ruby
p (-5).abs  # 5
```

##4. 定数の話

```
MYTEISU = 'aiueo'
```

まあ、普通にこう書くわけだが...

Rubyにおける定数は相当変わっている。ていうか、定数じゃないな、これ。やや特殊な扱いの変数か。
+ 大文字ではじまっていたら定数として扱われる
+ 再定義（別の値を代入）できる（！）。warningは出る。
+ freeze で値を固定できる。（が、前述の再定義はやっぱりできちゃう）
+ メソッド内では定数の定義ができない

```
MYTEISU = 123                        # 定数を定義
MYTEISU = 'aiueo'                    # 再定義（別の値を代入）できる。warningになるだけ。
MYFROZEN = 'this is fixed!'.freeze   # 凍結！
MYFROZEN.capitalize!                 # 中身を変更するメソッドがエラーになる
MYFROZEN = 999                       # ただし、再定義（別の値を代入）は、やっぱりできる。warningになるだけ。
```

```
class Wao
  def hello
    TEISU = 99 # メソッド内ではdynamic constant assignment っていう例外が出る
    puts y
  end
end
```

##5. nil について
nilは真偽判断では、偽として扱われる（falseとnilだけが偽である）

### ●オブジェクトが nil かどうか知りたい
```ruby
p str.nil?
```

### ●nil を判定して処理をする時
PHPでは isset とか色々判定が面倒だが(最近 NULL合体演算子 が使えるようになったけど)、Rubyでは、
・nilは偽として扱われる
・論理式の戻り値は、「最後に評価された式の値」
なので、以下のようにシンプルに書ける。

```ruby
# nilだったらデフォルト値を代入
name = str || "anonymous"

# nilじゃなかったらなんかする
name = arr && arr.first
```
JupyterでのFile Upload Dialog表示とアップロード

#1 fileuploadパッケージのインストールとJupyterのインストール
こっちを参考に。
https://pypi.python.org/pypi/fileupload/

```
$ pip3 install fileupload
$ jupyter nbextension install --py fileupload
$ jupyter nbextension enable --py fileupload
```

#2 jupyter起動

```
$ jupyter notebook
```

#3 ファイルアップロードスクリプト記述と実行

```
from IPython.display import display
import fileupload

uploader = fileupload.FileUploadWidget()

def _handle_upload(change):
    w = change['owner']
    with open(w.filename, 'wb') as f:
        f.write(w.data)
    print('Uploaded `{}` ({:.2f} kB)'.format(
        w.filename, len(w.data) / 2**10))

uploader.observe(_handle_upload, names='data')

display(uploader)
```
すると、[Browse]ボタン現れるので、ファイルを選択。
ファイルがアップロードされると、メッセージが表示される。
"Uploaded `test.csv` (0.13 kB)"

#4 読み込んだファイルへアクセス
次の入力ボックスで以下を記載するとファイル名が表示される。

```
print(uploader.filename)
```
test.csv

画面イメージはこちら。
<img width="988" alt="スクリーンショット 2017-03-26 19.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/108890/8bc3ab67-5b86-c2ff-02e4-2fa0d2dc21b5.png">

ほなほな。
APIサーバ時代のnginx設定決定版

かどうかは別として、こんな構成もできるよ。というネタと思っていただければ。（笑）

**ご注意: この構成は所属先の見解ではなく、また、実運用の実績があるものではありません。あくまでも情報の一つとしてお読みください。**

php-fpm(fastcgi)によるAPIサーバを建てるにあたって、LBをフロントエンドに置いて負荷分散。
というのは当たり前すぎる構成ですね。

図にするとこんな感じ。
![スクリーンショット 2017-03-26 14.31.39.png](https://qiita-image-store.s3.amazonaws.com/0/145575/1a5226b0-c4f8-3421-1a20-be111a91f1f1.png)

さて、ここからが本題。
APIサーバということは、全てのリクエストはフレームワークを経由することになります。
最近のフレームワークは`public/index.php`を単一のフロントコントローラとしているものがほとんどです。
LaravelやLumenなどがそうですね。

ということは、バックエンド側にはwebサーバは不要だと思いませんか？ phpの処理系である`php-fpm`デーモンだけが立っていれば良いと思いませんか？
図にするとこんな感じ。
![スクリーンショット 2017-03-26 14.31.19.png](https://qiita-image-store.s3.amazonaws.com/0/145575/47d5496f-995f-212d-7dab-35642743042d.png)

`php-fpm`はTCP/IPをlistenできるので、元々こういう使い方も想定されているわけですね。

この構成だとwebサーバが1つ減るのでオーバヘッドが減ります。CPU処理コスト、メモリ消費、アクセスログのディスクI/O、（webサーバ　→ php-fpmの）内部接続コストがなくなります。サーバ間の役割がはっきり分離できるのもポイントだと思いませんか？

静的ファイルについてはフロントエンド側で対応するか、静的専用のwebサーバを建てるか、S3のwebホスティングを使うか、CDNを使えば十分ですね。


# 具体的な設定方法
nginxをフロントエンド（LB）にした場合の設定例です。
httpsでリクエストを受けてSSL terminationをした上で、複数のバックエンドにラウンドロビンでロードバランスする構成です。

## php-fpm（バックエンド側）
こちらは極めて単純。
listenアドレスに`0.0.0.0`を指定してデーモンを再起動するだけ。

```ini:/etc/php/fpm-php7.1/fpm.d/www.conf
listen = 0.0.0.0:9000
```

## nginx（フロントエンド側）
```nginx:/etc/nginx/conf.d/frontend.conf
upstream backends {
    server [backend IP 1]:9000;
    server [backend IP 2]:9000;
}

server {
    listen 443 ssl http2;
    server_name site.localdomain;

    charset utf-8;
    root /var/www/html;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    # SSL terminationをする場合
    ssl on;
    ssl_certificate      /path/to/cert.pem;
    ssl_certificate_key  /path/to/key.pem;

    location / {
        try_files $uri /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass   backends;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  [php-fpm側のindex.phpがあるディレクトリのpath]$fastcgi_script_name;
        include        fastcgi_params;
    }
}
```

ポイントは3つ。

- バックエンド側の`php-fpm`サーバを、upstreamとして登録する。
- **nginx側のrootディレクトリ(`/var/www/html`)に、ダミーのindex.phpファイルを作成しておく。（重用）**
- `SCRIPT_FILENAME` は php-fpm側のindex.phpがあるディレクトリを指定する。

ダミーのindex.phpが必要なのは、`try_files`でリクエストURLが`/index.php`に変換されて存在チェックが入るからです。
このチェックが通らないと、`location ~ \.php$`に制御が渡らず`404 NotFound`となってしまいます。

`index.php`ファイルは存在している事自体が重要なので、中身は空でもかまいません。

```bash
touch /var/www/html/index.php
```

このあたりがもう少しエレガントに設定できれば良いのですが、他の方法が思いつきませんでした。

一応手元で環境構築してテストしたところ、ちゃんとラウンドロビンされてることと、バックエンドサーバを停止したらそこへの振り分けが停止され、バックエンドサーバを再開したら再度振り分け対象になったことは確認できました。
プログラミング言語Go読書会 目次

[ランサーズ株式会社](https://www.lancers.co.jp/)で行われている[プログラミング言語Go](https://www.amazon.co.jp/dp/4621300253/?&_encoding=UTF8&tag=amesho-22&linkCode=ur2&linkId=7e29043d833086d36f8b64c2ed3721b2&camp=247&creative=1211)ので進捗と技術的なメモ書きの目次です。

1. [プログラミング言語Go読書会 #1 (まえがき- 1.2)[2017/03/17] ](http://qiita.com/amesho/items/0d2ea220a1ee11019759)
2. [プログラミング言語Go読書会#2(1.3-1.6)[2017/03/24]](http://qiita.com/amesho/items/350937801d83c9f3045d)
3. [プログラミング言語Go読書会#3(1.7-2.3.1)[2017/03/29]](http://qiita.com/amesho/items/4d658dfca2f20fb2a141)
4. [プログラミング言語Go読書会#4(2.3.2-2.7)[2017/04/05]](http://qiita.com/amesho/items/7fdcfc20b1460aa99263)
5. [プログラミング言語Go読書会#5(3-3.5.4)[2017/04/12]](http://qiita.com/amesho/items/f11db633509995ef49cd)
6. [プログラミング言語Go読書会#6(3.5.5-4.3)[2017/04/19]](http://qiita.com/amesho/items/43ea6d2675b6c8784a0c)
7. [プログラミング言語Go読書会#7(4.4-5.3)[2017/04/26]](http://qiita.com/amesho/items/d7085e4bb8ea3073d1fc)
8. [プログラミング言語Go読書会#8(5.3-5.7)[2017/05/10]](http://qiita.com/amesho/items/5523bd726c4d4078076d)
9. [プログラミング言語Go読書会#9(5.8-6.2)[2017/05/17]](http://qiita.com/amesho/items/25ffb4cc2edb34e8336d)
10. [プログラミング言語Go読書会#10(6.3-7.2)[2017/05/24]](http://qiita.com/amesho/items/e3e2ddc3edbc5c230818)
11. [プログラミング言語Go読書会#11(7.3-7.5)[2017/05/31]](http://qiita.com/amesho/items/d945b1fb2534e63ba23b)
12. [プログラミング言語Go読書会#12(7.5.1-7.10)[2017/06/14]](http://qiita.com/amesho/items/76840e7b97267401c5ae)
13. [プログラミング言語Go読書会#13(7.11-8)[2017/06/21]](http://qiita.com/amesho/items/d42ba87c84fcdaa22bd7)
14. 総集編
15. [プログラミング言語Go読書会#15(8.1-8.4.3)[2017/07/05]](http://qiita.com/amesho/items/0c6936f3521338b15f94)
16. [プログラミング言語Go読書会#16(8.4.4-8.8)[2017/07/19]](http://qiita.com/amesho/items/1e5508591137c7476e87)
困ったときのMySQL コマンドまとめ



# 投稿目的
開発環境でとりあえずMySQL使いたい時、
入れないとか、パスワード変えたいなどで詰まりたくないので、設定の確認・変更などのコマンドまとめる。

## バージョン確認(ログイン前)

```
mysql --version
```

## rootでのログイン

```
mysql -u root -p
```

## データベースを作る

```
CREATE DATABASE データベース名;
```

## データベースへの接続

```
USE データベース名;
```

##データベースを見る

```
SHOW TABLES;
```

## テーブル定義をみる

```
DESC テーブル名;
```

## 存在するユーザー情報を見る 

```
SELECT user,host FROM mysql.user;
```

## ユーザーの権限を見る

```
SHOW GRANTS FOR root@'localhost';
```

## 管理者用ユーザ作成(adminuserというユーザー)

```
GRANT ALL ON *.* TO adminuser@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
```

## 全てのデータベースにアクセスできる一般ユーザ(testuserというユーザー)

```
GRANT ALL ON *.* TO testuser@'%' IDENTIFIED BY 'password';
```

## 特定のデータベースにアクセスできる一般ユーザ(testuserというユーザー)

```
GRANT ALL ON testdatabase.* TO testuser@'%' IDENTIFIED BY 'password';
```

## mysqlのパスワードの規定を見る

```
SHOW VARIABLES LIKE 'validate_password%';
```

## パスワードの長さを変更(文字数3)

```
SET GLOBAL validate_password_length=3;        
```

## パスワードの規定をゆるくする

```
SET GLOBAL validate_password_policy=LOW;
```

## パスワードを変更する。(rootユーザー)

```
set password for root@localhost=password('root');
```
webpack/sass-loaderでimport毎に共通ファイルを読み込ませる

Webpackを使ってReactなどのコンポーネントファイルから同じ粒度に分割したCSS/Sassを書いているとき、
Sassの変数やmixinなど、Globalにimportしておきたいファイルについて頭を悩ませることがあります。

`sass-loader` に `data` optionを設定するとうまいこと実現できます。
[sass-loader/environment-variables](https://github.com/webpack-contrib/sass-loader#environment-variables)

先に言っておくと、 `data` は `node-sass` を通して `Libsass` へオプションをそのまま通しているだけのようです。
[node-sass/data](https://github.com/sass/node-sass#data)

## サンプルコード

https://github.com/8845musign/sass-loader-global-variables-sample

##Webpack設定

```js
var path = require('path');

module.exports = {
  entry: './app/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    loaders: [
      {
        test: /.jsx?$/,
        loader: 'babel-loader',
        exclude: /node_modules/,
      },
      {
        test: /.scss?$/,
        use: [
          "style-loader",
          "css-loader",
          {
          loader: 'sass-loader',
          options: {
            data: "@import 'global-imports.scss';",
            includePaths: [path.resolve(__dirname, 'app/styles/')]
          },
        }],
        exclude: /node_modules/,
      }
    ]
  },
  devServer: {
    contentBase: path.resolve(__dirname, 'dist'),
    port: 8080
  }
};
```

Reactのビルドを含めているため、ごちゃごちゃしていますね。
関係のある部分だけを抽出します。

```js
      {
        test: /.scss?$/,
        use: [
          "style-loader",
          "css-loader",
          {
          loader: 'sass-loader',
          options: {
            data: "@import 'global-imports.scss';",
            includePaths: [path.resolve(__dirname, 'app/styles/')]
          },
        }],
        exclude: /node_modules/,
      }
```

`data` には `String` が設定可能で、これはsass/loaderによって読み込まれたファイルの先頭に自動的に差し込まれます。

この例では `app/styles/_global-imports.scss` にimportしたいファイルをまとめて記述することとし、`styles/_global-imports.scss` から変数設定用ファイルをimportして、各コンポーネントで変数の値を利用しています。

`includePaths` は絶対パスでimport時に読みに行くPathを追加しています。
`node_modules/` 以下をこちらに含めればnpmでインストールしたライブラリの一部分を利用することもできるかもしれませんね。

## まとめ

Sassというと、一つのCSSに全てを統合する使い方をイメージしますが、こういった柔軟なコンパイルをすることも可能なようです。
sass-loaderのドキュメントでは環境毎に異なった変数設定ファイルを読み込む使用例が紹介されています。

以上です。

## 追記（2020年４月５日）

[sass-resources-loader](https://github.com/shakacode/sass-resources-loader) を利用しても同じことができます。
droid君とお散歩サンプルを作ってみました

A-Frameとweb Speech Apiとriotを掛け合わせて作りました。
喋って動きます。

## 動作環境
web speech APIを利用しているので、現状以下のみです(2017/03)

* Google Chrome 最新版 (+webglが動くこと +マイクがあること)


## デモページ
http://runstant.com/am-akira/projects/a09b0b58/full

![droid2.gif](https://qiita-image-store.s3.amazonaws.com/0/85111/e4bf62d8-297a-c15a-4f6e-296285668125.gif)


太陽をクリック
↓
質問に答える
↓
### 終わり
ESP32の静電容量タッチインターフェースを使ってLチカ

# 使用した環境、開発ボードなど

* [ESP32-DevKitC ESP-WROOM-32 開発ボード](http://akizukidenshi.com/catalog/g/gM-11819/)
* macOS 10.12 Sierra
* Arduino IDE 1.6.12
* LED 1個
* 抵抗 1個
* ジャンパー線 1本
* ブレッドボード 1個

# やりたいこと
ESP32に搭載されている静電タッチインターフェイスを入力デバイスとして、タッチしたらLチカする仕組みを作ります。

# 準備
1. Arduino IDE をセットアップし、USBドライバをセットアップします。
    * USBドライバは[CP210x USB - UART ブリッジ VCP ドライバ](http://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers#mac)を使用しました。
    * ESP32用のArduino Coreは[espressifさんのArduino core for the ESP32](https://github.com/espressif/arduino-esp32)を使用しました。
    * ピン配置はCoreと同じページに載っています。
![ピン配置](https://github.com/espressif/arduino-esp32/raw/master/docs/esp32_pinmap.png)


2. ブレッドボードに ESP32-DevKitC、LED、抵抗、ジャンパー線を接続します。
ピンは片側だけ使うのでこんな感じで接続しました。
    * IO19: LED(+)
    * GND: LED(-)
    * IO2: ジャンパー線
![esp32.png](https://qiita-image-store.s3.amazonaws.com/0/125488/7433dfaf-7897-5aac-52c1-30435b767fae.png)

# Arduino IDE
    const int LED = 19;
    const int HOLD = 40;
    boolean touched = false;
    
    void gotTouch(){
      Serial.println("Got touch!");
      touched = true;
    }
    
    void setup() {
        Serial.begin(115200);
        delay(1000);
        pinMode(LED, OUTPUT);
        touchAttachInterrupt(T2, gotTouch, HOLD);
        Serial.println("End setup.");
        delay(1000);
    }

    void loop(){
        if(touched){
            touched = false;
            digitalWrite(LED, HIGH);
            delay(500);  
            digitalWrite(LED, LOW);
        }
    }

# 想定される結果
うまくいけば、IO2に接続したジャンパー線を手で触るとLチカされるはずです。

# はまったところ
gotTouch()の中で直接digitalWrite()したら動きませんでした。
参考にしたソースでも、loop()の中で処理しているので何かの理由があるのだと思われます。

# 参考資料
* http://qiita.com/naohiro2g/items/b8baa3f0e1a880ae9d0a
* http://qiita.com/rukihena/items/6a904368700eb1c7d2a3
* https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Touch/TouchInterrupt
Jupyter(IPython) KernelをMacのTerminalから操作する方法

表題のメモです。
JupyterのカーネルをMacのTerminalから実行する方法。

#1 実験用Kernelの作成
こちらの記事を参考に実験用Kernelを作成。
http://qiita.com/Tsutomu-KKE@github/items/3c996bde01ef2637aadc

#2 Kernelを立ち上げ
Terminalから実行
```
$ python3 keyvaluekernel.py
```

以下のメッセージが出るので、

```
NOTE: When using the `ipython kernel` entry point, Ctrl-C will not work.

To exit, you will have to explicitly quit this process, by either sending
"quit" from a client, or using Ctrl-\ in UNIX-like environments.

To read more about this, see https://github.com/ipython/ipython/issues/2049


To connect another client to this kernel, use:
    --existing kernel-18639.json
```
同じフォルダに"kernel-18639.json"という空ファイルを作成
プログラムを中断し、再起動。

#3 コンソール立ち上げ
別のTerminalを起動
Jupyterを起動

```
$ jupyter console --existing
```
正常に起動すれば、Kernelに接続して、入力可能なモードに移行。

```
/usr/local/lib/python3.5/site-packages/jupyter_console/ptshell.py:94: UserWarning: No lexer found for language 'keyvalue'. Treating as plain text.
  warn("No lexer found for language %r. Treating as plain text." % name)
Jupyter console 5.1.0

Dictionry of Key, Value


In [1]: key1 value1
value1
In [2]: ?
key1
```

いじょです。
DynamoDBの整合性モデル

DynamoDBに関する基本的な内容をまとめてみたものです。DynamoDBに関する、Web上にすでにある良識な解説コンテンツをまとめたサイトの抜粋です。
[DynamoDBの整合性モデル] (https://www.techcrowd.jp/dynamodb/consistency/)

# [DynamoDBの整合性モデルの特徴] (https://www.techcrowd.jp/dynamodb/consistency/)
Amazon DynamoDB からデータを読み込むとき、ユーザーはその読み込みに対して結果的に整合性のある読み込みを設定するか強い整合性を設定するかを指定できます。


結果的に整合性のある読み込み (デフォルト) – 結果整合性のあるオプションを選択すると、読み込みスループットが最大限に向上します。ただし、結果的に整合性のある読み込みには、最新の書き込み結果が反映されない可能性があります。データの全コピーの整合は通常 1 秒以内に行われます。短時間後に読み込みを繰り返すことによって、更新されたデータが返されます。
 

強い整合性の読み込み – Amazon DynamoDB には結果整合性のある読み込みに加えて、強い整合性のある読み込みをリクエストするための、柔軟性と制御が用意されています。強い整合性のある読み込みの結果には、読み込みの前に適切な応答を受け取ったすべての書き込みが反映されています。

# [高可用性-3xレプリケーション] (https://www.techcrowd.jp/dynamodb/consistency/)
DynamoDBは、高い可用性を備えた実績のある Amazon のデータセンターで実行されます。このサービスでは、データが同じ AWS リージョン内の 3 つの施設間でレプリケートされるので、サーバー障害の発生やアベイラビリティーゾーンの停止に対する耐障害性が高まります。


DynamoDB クロスリージョンレプリケーションを使用すると、DynamoDB テーブル（マスターテーブル）の同一コピー（レプリカ）を複数の AWS リージョンに保持できます。テーブルのクロスリージョンレプリケーションを有効にすると、そのテーブルの同一コピーが別の AWS リージョンに作成されます。そのテーブルに対する書き込みは、すべてのレプリカに自動的に反映されます。

効率的な災害対策手段となります。

# [DynamoDBの整合性モデル] (https://www.techcrowd.jp/dynamodb/consistency/)
DynamoDBは2箇所を書き込んだ時点で「書き込みOK」という返答をします。残り1箇所は「そのうち時間が経てば(DynamoDBの場合は1秒以内)結果的に書き込まれる」という考え方です。これを「結果整合性」と言います。読み取り時には3箇所に書き込まれているデータのどこから読み取るかはわからないので書き込まれていないデータからは読み取れないことになりますし、更新前のデータからは古いデータが読み取れてしまいます。
 
ConsistentReadオプション(読み取り一貫性)とはこのような読み取りによる差がないことを保証するもので、スキャン時にこのオプションをつけることでスキャン前に登録、変更された値は確実に読み取る事ができます。具体的には書き込まれている3箇所より2箇所の値を読み取り、一致すればその値を、一致しなければもう1箇所の値を読んで2箇所に書き込まれている値を返す、という仕組みになります。
THREE.ShaderMaterialを使ってみる方法

THREE.ShaderMaterialを使ってみる方法

shaderを独自で適用させるには、メリットもあるけどデメリットもある。
Three jsで描画に使われているshaderはライトから光を受けた設定なども含まれている

似たものを作る場合には、
光の情報を毎render毎に渡すなどの処理が必要になるみたいです。

逆に、照明からの光のデータに干渉しないものを作る場合には、割とカンタンに利用ができそう。

```html:qiita.html
<script id="test_vertexshader" type="x-shader/x-vertex">
    varying vec2 vUv;
    void main() {
        vUv = uv;
        gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
    }
</script>

<script id="test_fragmentshader" type="x-shader/x-fragment">
    uniform sampler2D map;
    varying vec2 vUv;
    void main() {
        gl_FragColor = texture2D( map, vUv );
    }
</script>
```

このデータを元に雲を生成してみると

```js:qiita.js
function makeTestShader(){
  var geometry = new THREE.PlaneGeometry(500, 500);
  var texture = THREE.ImageUtils.loadTexture('cloud10.png', null, function() {renderer.render(scene, camera);});
  var material = new THREE.ShaderMaterial({
     uniforms: {
            "map": {
                type: "t",
                value: texture
            }
      },
      vertexShader: document.getElementById('test_vertexshader').textContent,
      fragmentShader: document.getElementById('test_fragmentshader').textContent,
      blending:     THREE.AdditiveBlending,
      depthWrite:   true,
      transparent:  true,
      side: THREE.DoubleSide
  });
  mesh = new THREE.Mesh(geometry, material);
  mesh.position.y = -300;
  mesh.position.z = 1600;
  scene.add(mesh);
}
```

これで雲のデータが向こうに見えるものが出来た。
※cloud10.pngが雲のデータ
DynamoDBと他AWSサービス

noSQLに関する基本的な内容をまとめてみたものです。noSQLに関する、Web上にすでにある良識な解説コンテンツをまとめたサイトの抜粋です。
[DynamoDBと他AWSサービス] (https://www.techcrowd.jp/dynamodb/vsotherdbs/)

Amazon SimpleDB、DynamoDB は、Amazon S3 オブジェクトのロケーションやオブジェクト（メタデータ）の詳細情報へのポインタを格納するために使用できます。

そのため、データベースの豊富なクエリ機能で Amazon S3 を補完しています。Amazon S3 に莫大な数のオブジェクトを格納する開発者にとって、Amazon SimpleDB、DynamoDB は、オブジェクトメタデータを格納するための、柔軟で拡張性ある安価な手段となります。

# [DynamoDB: 性能見通しが可能なnoSQLデータベース] (https://www.techcrowd.jp/dynamodb/vsotherdbs/)
DynamoDBのテーブルを作成する際に、どれくらいの読み込みと書き込みが必要か設定することができます。AWSがミリ秒レベルの低遅延を維持しつつ、そのニーズに応えられるように全てを自動的に構成します。後からスループット設定を変更することも可能です。

# [SimpleDB:   データベース管理の負担を軽減するデータストア] (https://www.techcrowd.jp/dynamodb/vsotherdbs/)
可用性と柔軟性に優れ、データベース管理の負担を軽減する、NoSQL データストアです。開発者は、データ項目の格納と照会をウェブサービスリクエスト経由で行うだけで、残りの処理は Amazon SimpleDB によって自動的に実行されます。

SimpleDBの課題:

Domainと呼ばれるデータセットの管理領域の容量制限: 10GB

SimpleDBでは、データが大規模化するとインデックスがメモリに乗り切らなくなるケースがあり、急に性能が落ちる可能性があった。

SimpleDBはデータの一貫性にEventually Consistent（結果整合性）を当初採用しており、これは強い一貫性を持つリレーショナルデータベースに慣れたエンジニアにとって分かりにくかった（途中から強い一貫性も追加）。

SimpleDBはマシン時間ごとの課金体系だが、実際に料金がいくらになるのか分かりにくかった。

# [RDS: クラウドで簡単にRDBを運用可能に] (https://www.techcrowd.jp/dynamodb/vsotherdbs/)
RDSは、手間のかかるデータベースの管理タスクをユーザの代わりに行いながら、コスト効率がよく、サイズ変更が可能なキャパシティーを提供します。これによってユーザは自身のアプリケーション開発やビジネスに集中できます。Amazon RDS では、Amazon Aurora、Oracle、Microsoft SQL Server、PostgreSQL、MySQL、MariaDB という 6 つのよく知られたデータベースエンジンから選択できます。
How to set up apns remote notification


1. To enable apns remote notification, you must first have an apple developer account.
2. Create a project and under team in the build setting > General, select the team. 
 ![Screen Shot 2017-03-26 at 5.17.15 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/120872/8d35d4a7-a2db-5417-87f6-acfcd10af800.jpeg "Screen Shot 2017-03-26 at 5.17.15 PM.jpg")

3. In Capabilities, enable the push notification.![Screen Shot 2017-03-26 at 5.18.28 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/120872/1eedc836-7b9c-8565-041c-eed6b5c66bcb.jpeg "Screen Shot 2017-03-26 at 5.18.28 PM.jpg")

4. Before you login to developer account to create a apns certificate, you need to request a certificate locally from the keychain.![Screen Shot 2017-03-26 at 5.20.47 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/120872/05ea5a6b-bee9-0e0c-4258-ae565c824235.jpeg "Screen Shot 2017-03-26 at 5.20.47 PM.jpg")

5. Save the certificate in the disk.![Screen Shot 2017-03-26 at 5.22.02 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/120872/61d4de78-2b0f-ab6c-1069-d38b5da7ac50.jpeg "Screen Shot 2017-03-26 at 5.22.02 PM.jpg")

5. Login to the develope![Screen Shot 2017-03-26 at 5.22.39 PM.jpg]
r account, under Certificates> Development, create a new certificate.
6. Under development, select ***Apple Push Notification service SSL (Sandbox)***.
![Screen Shot 2017-03-26 at 5.24.06 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/120872/9700568a-c5ef-61a1-ee7b-5464acdae11e.jpeg "Screen Shot 2017-03-26 at 5.24.06 PM.jpg")

7. Click Continue and select the correct APP ID and click continue. ![Screen Shot 2017-03-26 at 5.24.52 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/120872/d1274d99-7650-2589-f577-1048c05418c1.jpeg "Screen Shot 2017-03-26 at 5.24.52 PM.jpg")

8. Upload the CSR file that the you create locally just now.
9. Download and install the certificate by double click on the file.
10. Once you successfully install the certificate, you will able to see it in the keychain. 
![Screen Shot 2017-03-26 at 5.28.01 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/120872/6390fb46-d2e5-f3df-bb21-bcd4e79e0598.jpeg "Screen Shot 2017-03-26 at 5.28.01 PM.jpg")
11. Export both the private key and the certificate.
![Screen Shot 2017-03-26 at 5.29.44 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/120872/347137fe-bceb-cd8c-aae9-f4056c78eca4.jpeg "Screen Shot 2017-03-26 at 5.29.44 PM.jpg")
12. You can choose to create a password to protect your certificate, else you can let it be empty.
![Screen Shot 2017-03-26 at 5.30.31 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/120872/76c30fbe-aa99-a67c-f4f3-fbad1eb31cd0.jpeg "Screen Shot 2017-03-26 at 5.30.31 PM.jpg")

13. you can create the .pem file by the following command.
`openssl pkcs12 -in pushcert.p12 -out pushcert.pem -nodes -clcerts` * you can replace the file name with your own file name.

14. Now you just need to upload the pem file for your server. 

source: http://stackoverflow.com/questions/21250510/generate-pem-file-used-to-setup-apple-push-notification
AWSでWebServer(PHP)を立ててみたので、メモ

#AWSでWebServerを立ててみたので、備忘録向けにメモ

### インスタンスの作成
詳細はAWSのページを参照
https://console.aws.amazon.com/console

### セキュリティグループの設定
HTTPポート(80)とHTTPS(443)ポートを開けておく。

![スクリーンショット 2017-03-26 16.52.31.png](https://qiita-image-store.s3.amazonaws.com/0/1553/f17b70cd-83b2-7b4e-2111-8388654feb4c.png)

### インスタンスへ接続する
キーファイルを作成し、それを使ってターミナルから接続する。

```ssh -i キーファイル名 ec2-user@ec2-XX-XX-XXX-XXX.compute-1.amazonaws.com(接続するIPアドレスによって変わる）
```
よくわからない場合は、以下を参照。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AccessingInstances.html?icmpid=docs_ec2_console

### セットアップ
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html

- アップデート

```
sudo yum update
```
- PHPのインストール

```
sudo yum -y install php
```
- Apacheのインストールおよびプロセスの開始
(インストールが終わったら、apacheの自動起動設定)
```
sudo yum install httpd -y
sudo service httpd start
sudo chkconfig httpd on
```
ウェブブラウザからアクセスできることを確認する
<img width="1178" alt="スクリーンショット 2017-03-26 17.15.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/1553/53ba4c9c-5204-902a-ac63-744cff81e674.png">

- php.iniの編集
- 
```
sudo vim /etc/php.ini
```

```php.ini

; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = 'Asia/Tokyo''
```

- mysqlのインストール

```
sudo yum install -y mysql-server
```
- mysqlの自動起動設定

```
sudo chkconfig mysqld on
```
- mysqlの開始

```
sudo service mysqld start
```

- MySQLのrootユーザでログイン

```
mysql -uroot

```
- rootにパスワードを設定

```
mysql> set password for root@localhost=password('設定するパスワード');
Query OK, 0 rows affected (0.00 sec)
```
- セキュリティ設定(終わったら再起動）

```
sudo /usr/bin/mysql_secure_installation
sudo service mysqld restart
```

- phpAdminの設定

```
sudo yum --enablerepo=epel install -y phpMyAdmin
```
- phpMyAdmin.confの編集

```
sudo vim /etc/httpd/conf.d/phpMyAdmin.conf
```

```phpMyAdmin.conf
 <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       #Require ip 127.0.0.1→削除
        Require all granted→追加
       Require ip ::1
     </RequireAny>
   </IfModule>
 →2.2系の時はこちら
  <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     #Deny from All
     #Allow from 127.0.0.1
     Allow from ::1
   </IfModule>
```
- Apacheの再起動

```
sudo service httpd restart
```

http://(グローバルIP)/phpMyAdminにブラウザでアクセスする

## SSL証明書設定はこちら
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/SSL-on-an-instance.html
simple is best（Composed Method パターン）

開発コードのフェーズにつれ、仕様の変更、ロジック制御変更、より複雑になる傾向があります。可読性ないコードは、工数を取り、悪循環に落ちることになります。
では、可読性がよいコードのパターンの一つとして、「Composed Method」を紹介します。

## Composed Method パターンは何？
直訳では、「合成されたメソッド」です。
[「文章のように読めるメソッドを作る」](http://qiita.com/tbpgr/items/06266a4161019b445756)の意味もあります。



ソースを見て、理解するのは、一番早いです。

```java:変更前
void someMethod(){ 
    //do some stuff
    line 1
    line 2
    line 3

    //calculate some other stuff
    line 4
    line 5
    line 6

    //do final stuff
    line 7
    line 8
    line 9
}
```

```java:変更後
void doSomeStuff(){ 
    line 1
    line 2
    line 3
}

void calculateSomeOtherStuff(){
    line 4
    line 5
    line 6  
}

void doFinalStuff(){
    line 7
    line 8
    line 9  
}
```

## その他のメリット
テストもメソッド毎になるので、改修時にわかりやすいです。

## まとめ
Composed Method パターンを取り入れることで、複雑な問題を可能な限りシンプルな作り、急な仕様変更など、臨機応変に柔軟性に対応できるはずです。
Cloud Pub/Sub


# Publsher

# Subscriber

## Subscriber's ID must be uniq!
Subscriber join to Topic.
I gess Subscriber's ID this like `Topic/Subscriber_id`.
Subscriber's ID must be project uniq.

## push & GAE
From sample...

Endpoint URL has query string.

> https://{ver}-dot-{pj}.appspot.com/_ah/push-handlers/receive_message?token=hogefuga

### push-ed message

## push & Functions

## message
  
```
logMessage: "Post body: {"message":{"data":"44Gv44GE44CA44Gj44Gj772M","attributes":"attributes":{"key":"imaoka","fuga":"hoge"},"message_id":"87814319259086","messageId":"87814319259086","publish_time":"2017-03-16T09:37:37.635Z","publishTime":"2017-03-16T09:37:37.635Z"},"subscription":"projects/articulate-sol-739/subscriptions/subscription-python-articulate-sol-739-imaoka"}"      
```