OmniAICreator/Qiita-1.07M huggingface dataset:
Docker for Macをアンインストールしました

Docker for Macをアンインストールしたらコンテナが消えました＼(^o^)／

# Docker for Macをアンインストール
MacのナビゲーションにあるDockerアイコンをタップします。

<img width="266" alt="Docker for Mac Preferences" src="https://qiita-image-store.s3.amazonaws.com/0/1624/691e4b29-e826-1cf7-34fd-4b3c34ca9464.png">

**Preferences**から**Uninstall**を選択します。
<img width="376" alt="Docker for Mac Uninstall" src="https://qiita-image-store.s3.amazonaws.com/0/1624/b4540725-c063-77f9-d048-97c29e8b50fc.png">
Uninstallをクリックするとアンインストールができました。

# もう一度Docker for Macを入れてみた
この後もう一度Docker　for Macを入れてみました。すると。

```bash:コンテナがない
docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
```
**コンテナがありません＼(^o^)／**
Docker for Macのアンインストールはやめておこう😱 

追記:どうやらイメージも消えるらしいです😱
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/pugiemonn">@pugiemonn</a> 確かイメージも吹き飛ぶのでオススメしませんｗ</p>&mdash; I-METAL (@Issei_M) <a href="https://twitter.com/Issei_M/status/804191317374840832">2016年12月1日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
[MySQL] Transaction時のテーブルロック範囲を調べる

# 概要
Transaction時にUPDATEを投げたとき、どの範囲までロックされるのか調べる。

# 調査
## テスト用テーブルの作成

````mysql
mysql> show create table test \G;
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL DEFAULT '0',
  `index_value` int(10) unsigned DEFAULT NULL,
  `value` int(10) unsigned DEFAULT NULL,
  `multi_value` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_value` (`index_value`),
  KEY `multi_value` (`multi_value`,`index_value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR:
No query specified
 
mysql> select * from test;
+----+-------------+-------+-------------+
| id | index_value | value | multi_value |
+----+-------------+-------+-------------+
|  1 |           1 |     1 |           1 |
|  2 |           2 |     2 |           2 |
|  3 |           3 |     3 |           3 |
|  4 |           4 |     4 |           2 |
+----+-------------+-------+-------------+
4 rows in set (0.00 sec)
````

## [index, index]でUPDATE
同じ[index, index]への更新時のみロックがかかることを確認。

````mysql
# process A
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
 
mysql> update test set value=2 where multi_value=2 and index_value=2;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0
 
# process B
mysql> update test set value=4 where id=4;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0
 
mysql> update test set value=2 where id=2;
...
 
# process A
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
 
# process B
Query OK, 0 rows affected (3.21 sec)
Rows matched: 1  Changed: 0  Warnings: 0
````

## [index, 非index]でUPDATE
同じ[index]への更新時のみロックがかかることを確認。

````mysql
# process A
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
 
mysql> update test set value=2 where multi_value=2 and value=2;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0
 
# process B
mysql> update test set value=1 where id=1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0
 
mysql> update test set value=4 where id=4;
...
 
# process A
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
 
# process B
Query OK, 0 rows affected (3.59 sec)
Rows matched: 1  Changed: 0  Warnings: 0
````

# まとめ
indexで絞れる範囲まで絞ってから、indexで絞りきれなかったrows全てにロックをかけてるっぽい。

# 参考にしたページ
[ロック待ちでハマる前に知りたかったMySQL InnoDBの行ロックとテーブルロックの挙動](http://blog.katty.in/3082)
JavaBeanの内容を文字列に出力する

Apache commons-langのReflectionToStringBuilderを使ってJavaBeanの内容を文字列に出力する。

##検証対象JavaBean
![2016-12-01_132739.jpg](https://qiita-image-store.s3.amazonaws.com/0/123138/373cc34e-9a5c-b785-60b6-55bdd5856eb1.jpeg)

##サンプルコード
```java
import org.apache.commons.lang3.builder.RecursiveToStringStyle;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;

public class SampleClass {
	
	public String convert2String(Object object) {
		
		// JavaBeanの内容を文字列に出力する
		return new ReflectionToStringBuilder(object, new RecursiveToStringStyle()).toString();
	}
}
```

##出力結果
`ProductInfo@be858[productName=iPhone,pcs=100,productionDate=java.util.Date@1476842[],productDetailInfo=ProductDetailInfo@1c170f0[version=7.0,review=<null>,stock=true],storeList=java.util.ArrayList@ed5528{StoreInfo@26b418[storeInfo={StoreName=山田電気, tel=03012349876, adress=東京都新宿区}],StoreInfo@7e868[storeInfo={StoreName=ヨドバシ, tel=03043215678, adress=東京都中央区}]}]
`

##ライブラリ
commons-lang3-3.3.jar

```xml
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.3.2</version>
</dependency>
```
見せてあげますよ、本当のサーバーレスを。

# 見せてあげますよ、本当のサーバーレスを

どうもこんにちは。
初日ですね！張り切っていきましょう！

## はじめに

本当のサーバーレスというのは、あくまでBKS(ぼくの考えた最強の)シリーズで、
現時点での実現可能性を無視します！ごめんなさい！
また、もともとWebエンジニアなのでWebエンジニア視点のお話をします。


## ぼくのかんがえるサーバーレスのていぎ

ひとことにサーバーレスといっても人によって様々で、
色々な概念(FaaS, NoOps, Client <> Server, etc...)が混在してたり、
観点の違いから捉え方が大きく違ったりしてる印象が強いです。
なので、「ぼくはこうかんがえているよ！」「だからこうしてそれらを実現しているよ！」ってお話をします。

余談ですがぼくは `サーバー` のことを `サーバ` と表記・発音するので今日はいつもより頑張って１文字多くうっていきます！


## ぼくはこう考えているよ！

ざっとあげるとこんな感じです。

- FaaSを利用しない
- BaaSを利用しない
- アプリケーション・サーバーを利用しない
- クライアントの対義語のサーバーの概念ではない
- スケールという概念を意識しない
- DBサーバは持ってよい

サーバーレスっていうくらいなんだから、 「自前サーバーが存在しない」 という概念ではなく、
どこにもアプリケーション・サーバーが存在しない、そんなものとして定義しています。
この考えをもって何かを作っている、とかではなく、どうせならこうなってほしいという願い成分が多めです。


## じゃあどうするのさ？

Webエンジニア的に

- 守りたいものはデータ（およびデータベース）である
- SPA + APIでサーバーがHTMLを返却する時代は終わ[る|った]

みたいな感じなので、あとは突破すべきものが認証・認可のみなのでは！？と考えています。
認証・認可でさえ、フロントエンドから直接データストアを読みにいくことができれば可能！？（今回はAWSのCognitoに甘える）

つまり [こういう](https://aws.amazon.com/jp/sdk-for-browser/) こと

## 具体的にどう実現したか

WordPressのようなブログをAWSのみで完結させる想定

- S3
  - AWS SDK for JavaScript
- Cognito
  - ログインユーザにDynamoDBのWrite権限を付与
- DynamoDB
  - Read: 誰でも
  - Write: 認証済みユーザのみ


## やってみてどうだったのよ？

### コスト（学習）

☆☆☆
JavaScriptさえかければ、公式ドキュメントが整っていてすぐにはじめられる == 低い
だが、AWS限定になってるので、AWSはじめての人にはつらいかもしれないので☆３つ

### コスト（おかね）

☆☆☆☆☆
コンピューティングのナニガシを使わないのでやっすい。
これ以上いうことない。


### 運用面（メンテナンス性）

☆☆☆☆
金額コストと同じく、コンピュートレスなのでNoOpsっぽく扱えてとても楽
ただDynamoDB特有の何かとかに当たると一気にハードルがあがる気がする


### 性能

☆☆☆☆
ブラウザ <-認証基盤-> データストアなので、ボトルネックが少なくはやめ
ただフルマネージドな認証基盤を使うことで管理不能なパフォーマンスがボトルネックになるかもしれないなーって思った


## おわりに

AWSにかぎらずFaaSや認証基盤が整ってきていて、サーバーレスを手軽にはじめられる時代なんだなーと深く感じました。
ただ、Webの視点からだと通信のオーバヘッドが大きくなってしまったり、インターネットにロジック公開するのか？っていう疑問があったり
脳死状態でサーバーレスでやるんじゃあ！とまではいかなそうでした。
逆にバッチ系はFaaS一択だと思います。

なんか `言ってることおかしいぞ` とか `それは違う` みたいなことがあれば是非コメントにてご指摘ください。


## 余談
フロントではないけどすでに玉川さんが２年も前に書いてて悔しい。
http://qiita.com/KenTamagawa/items/36238d6264ee14c2b50f
乳児モニタリングシステムの開発について

## 背景
乳児（新生児を含む）は頻繁に泣き、時に原因が不明瞭で養育者の精神的体力的負担となりやすい。

乳児を注意深く観察することで、事前あるいは早期に問題を発見し対応することは可能なはずであるが、課題が多い。

産褥期の母親は分娩後にプロゲステロンやエストロゲンが急激に低下するなどホルモンバランスが崩れ、また出産での体力消耗があり、心身共に疲労困憊といった体である。

![妊娠中および産褥期の血中女性ホルモンの変動](http://www.smilenavigator.jp/utsu/about/abc/img/image_07_05.jpg) [^graph]

[^graph]: http://www.smilenavigator.jp/utsu/about/abc/abc07_02.html

加えて新生児期は昼夜問わず2~3時間おきの授乳が必要であり、睡眠不足となるのは不可避である。

ブラック企業が糾弾される昨今、パートナーが育児休暇を取得して育児を分担してもらうことが難しい家庭も多いだろう。

また、核家族化が進む現代において、養育者の親の近くに住んでおらずその援助を受けることが難しいことが多いと想像される。

これら多くの課題があっても第2子以降の場合、第1子の経験によって最小限の負担で適切に対処できる場合もあると思われるが、第1子の場合は上述の多くの課題に加えて知識不足、未経験による判断基準の未修、不手際、不安などがある。

## 対策
前述のような背景があるため乳児の観察が重要になってくるわけであるが、やはり前述の背景のため養育者にそのリソースがないケースが多いと推測される。

しかし科学技術が発達した現代では、センサーを用いて乳児の状態をモニタリングすることで、事前の察知、あるいは事後短時間での異常の検出が可能である。
センサーを用いた乳児モニタリングによる事前検出および早期異常発見の自動化は、養育者の負担軽減の助けとなることが期待される。

医療用や一般向けでセンサーを用いて乳児をモニタリングする商品はすでに存在しているが、残念ながら検知可能な条件や種類が限られており、また価格が高く商品の種類も極端に少ない。

そこで、IoT の台頭により安価なセンサーを小型軽量ボードコンピューターを用いて安価に利用できるようになったことやオープンソースの浸透によりソフトウェア開発が容易になったことに目を付け、モニタリングシステムを自前で構築する方法を検討することにした。

![Raspberry Pi 3 Model B](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Raspberry_Pi_3_Model_B.png/320px-Raspberry_Pi_3_Model_B.png) [^image]

[^image]: https://commons.wikimedia.org/wiki/File:Raspberry_Pi_3_Model_B.png?uselang=ja

## 今後の大まかな流れ

* 乳児が泣く不快要因の分解
* 既存のモニタリングシステムの確認
* Raspberry Pi の選定と購入
* センサーの選定と購入
* OS のインストール
* 温湿度センサーの取り付け
* 温湿度センサーのデータ取得と出力
* 温湿度モニタリングデータの解析

・
・
・


## 断り書き
尻切れトンボで終わる確率が非常に高い。
アプリ秋吉ふぁんと、秋吉ふぁんAPIと

-- この記事は書きかけです --

福井県民が愛してやまないのが、[「やきとりの名門 秋吉」](http://www.akiyoshi.co.jp/)。
![tyotin.gif](https://qiita-image-store.s3.amazonaws.com/0/69744/7979de52-3110-b1c7-ca41-b8ca9dfce719.gif)![rogo_2.gif](https://qiita-image-store.s3.amazonaws.com/0/69744/a6d80c72-c093-78bc-b7be-ca316373cb7d.gif)


その秋吉を愛してやまないイカれたナイスガイがかつて開発したのが、アプリ「秋吉ふぁん」である。
[iTunes App Store](https://itunes.apple.com/jp/app/qiu-jifan/id458548165?mt=8)
Android版は公開終了している様子。残念。
![screen568x568-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/69744/e42ef3a5-dfd7-e329-df10-f2d0b5dcb6a5.jpeg) ![screen568x568.jpeg](https://qiita-image-store.s3.amazonaws.com/0/69744/cc4a57a0-469c-9b96-ff2f-7b2d695af882.jpeg)


さてこの秋吉ふぁんが素晴らしい点はいくつもあるのだけれど、そのひとつとして、データをAPIとして公開していたことが挙げられる。

このオープンデータをつかって、[Xamarin Forms](https://developer.xamarin.com/guides/xamarin-forms/)のサンプルでも作ってみようというのが本エントリーの主旨だったのだが、さすがに3年以上まえに公開されていたAPIということもあって、どうやら公開終了してしまっていたようだ。

... ということなので、秋吉APIを[モダン](https://azure.microsoft.com/ja-jp/services/functions/)な[環境](https://aws.amazon.com/jp/api-gateway/)なんかを使って再構築するチャレンジに移行しようと思います。
次回作にご期待ください m(_ _)m
[Javaの小枝] lambda式とチェック例外の相性の悪さをなんとかする

# はじめに

lambda式を使おうとする誰もが一度ならずともはまる「チェック例外との相性の悪さ問題」。たぶん完全な解決法などないのだと思う。ただベストプラクティスとは言わないまでも「まだまし」な解決法を考案して個人的に使用している。それを以下で説明する。
# 準備

```ExceptionUtils.java
public class ExceptionUtils {

	public static class ExceptionWrapper extends RuntimeException {
		private static final long serialVersionUID = -2800277376770728948L;
		public ExceptionWrapper() {super();}
		public ExceptionWrapper(String msg) {super(msg);}
		public ExceptionWrapper(Throwable th) {super(th);}
	}
	
	public static interface ConsumerThrowsException<A> {public void accept(A a) throws Exception;}
	public static <A> Consumer<A> toUnchecked(ConsumerThrowsException<A> src) {
		return new Consumer<A>() {
			@Override public void accept(A a) {
				try {
					src.accept(a);
				} catch (Exception e) {
					throw new ExceptionWrapper(e);
				}
			}
		};
	}
	
	public static <T extends Exception> void unwrapException(ExceptionWrapper ex, Class<T> clazz) throws T {
		if (ex.getCause() == null) throw new InternalError(ex); // getCause 不能なはずないのでこちらで InternalError に変換
		if (ex.getCause() instanceof ExceptionWrapper) unwrapException((ExceptionWrapper) ex.getCause(), clazz); // 2重にくるんであるかも
		try {
			throw clazz.cast(ex.getCause());
		} catch (ClassCastException e) {/* do nothing */}
	}
}

```

例外を包むため専用のRuntimeExceptionのサブクラス ExceptionWrapper を定義。さらにそれを unwrap するメソッドの定義を行なう。また、ここでは Consumer のみ記述したが、それぞれの FunctionalInterface用の例外スロー版と元の FunctionalInterface への変換を定義する。

# チェック例外の発生するラムダ式を書く

以下では、[ここで](http://qiita.com/daylife/items/b977f4f29b1f8ced3a02)挙げられていたようなコードを例にする。

```sample.java
	private static class MyException extends Exception {}
	
	public static void main(String[] args) throws IOException, MyException {
		try {
			Files.list(FileSystems.getDefault().getPath("/"))
			.filter(p -> p.toString().endsWith(".txt") && p.toFile().isFile())
			.forEach(toUnchecked(
				f -> {
					try (Stream<String> lines = Files.lines(f)) { // sometimes throws IOException
						lines
						.forEach(
							line -> {
								Stream.of(line.split("\\s"))
								.forEach(toUnchecked(
										word -> {
											analyze(word); // this code somtimes throws MyException
										}
								));
							}
						);
					}
				}
			));
		} catch (ExceptionWrapper ex) {
			unwrapException(ex, MyException.class); // wrapされた例外が MyException だった場合、このコードで梱包が解かれてスローされる
			unwrapException(ex, IOException.class); // wrapされた例外が IOException だった場合、このコードで梱包が解かれてスローされる
			throw ex;
		}
	}
```

つまりは例外が発生するラムダ式は全て toUnchecked メソッドでくるんでしまい、外側のcatch節でまとめて処理しようという訳だ。小さな工夫だが、これだけでもコードの見掛けはずいぶんとマシになるのではないかと思う。若干問題なのはラムダ式内部で発生する例外のunwrapを全てcatch節であげていく作業に漏れが生じやすいということだ。何かもっと良い方法をご存知の方がいたら秘法を伝授していただきたい。
Excel で Markdown 用のテーブルを記述する、だらしない方法

Markdown でテーブルを書くのって地味に面倒です。

記法はそう凝ったものではありませんが、データを管理するのが少しつらい。

列の幅を整えるなどして整理しておかないと後からテーブルを読みづらく、編集もしづらい。列の内容が列の幅に影響を与えるので、たった 1 行の書き換えが全行の修正に発展することも珍しくありません。

しかし、つくりは単純。

```markdown:MarkdownTable
列名|列名|列名
---|---|---
内容|内容|内容
内容|内容|内容
```

これだったら Excel のような表計算ソフトを使えば簡単に書けるんじゃないか。

そうすればデータの管理もやりやすくなる。

はず。

…。

ということで、試してみました。

環境
----

### 制作

- Microsoft Excel 2007

### Markdown 変換

- Qiita
- [MarkdownPad 2](http://markdownpad.com/)

記述ルール
----

こういう感じのルールで書きます。

- 列の区切りは `|`
- 2 行目の各列には 3 つ以上のハイフン `---` を入れる
  - Excel 上で `-` 記号は特別な意味をもつので正確には `'---` と入力する
- 列の内容は自由
  - ただし `|` や改行の使用は避ける
  - セルに改行を含めたい場合は、セル内に直接 \<br\> タグを記述する

制作・変換
----

### Excel 上の記述

<table>
  <tr>
    <td>列名</td>
    <td>|</td>
    <td>列名</td>
    <td>|</td>
    <td>列名</td>
  </tr>
  <tr>
    <td>---</td>
    <td>|</td>
    <td>---</td>
    <td>|</td>
    <td>---</td>
  </tr>
  <tr>
    <td>内容</td>
    <td>|</td>
    <td>内容</td>
    <td>|</td>
    <td>内容</td>
  </tr>
  <tr>
    <td>内容</td>
    <td>|</td>
    <td>内容</td>
    <td>|</td>
    <td>内容</td>
  </tr>
</table>

だらしない。

Excel 上で見るともっとだらしない。

### Markdown ソース化

Excel から外部エディターやテキストボックスにコピペ。

```markdown:CopiedFromExcel
列名	|	列名	|	列名
---	|	---	|	---
内容	|	内容	|	内容
内容	|	内容	|	内容
```

`'---` は `---` でコピーされ、各セルの間にはタブスペースが入ります。

### 変換

上記のタブスペースだらけの文字列を、一切加工せずに Qiita や手元の Markdown 用エディタで変換します。

列名	|	列名	|	列名
---	|	---	|	---
内容	|	内容	|	内容
内容	|	内容	|	内容

成功。

余分なタブスペースも構造に影響を与えず、きちんとテーブルが生成されました。

これで少し、テーブルの制作・管理がラクになりそうです。
Laravel5でEloquentをフレームワークの外から使う方法

# ORMをフレームワークの外から？！
Laravelはいわゆるフルスタックなフレームワークでこういうのしたいなっていうのはだいたい揃っています。とても便利なのですが、大規模なアプリケーションとなると処理を共通化してフレームワークから離したくなってきます。

またバッチ書いていてこのORMだけを使いたいってシーンももしかしたらあろうかと思います。

# 分離したときのDB接続
* フレームワークがよしなにやってくれてるので実際はよくわからない。
 * コード読めという声が聞こえてきますが、そこに時間費やしたくないのが心情としてある。
* 公式ドキュメントには書いてなさそう。
* こねくり回して自前実装でもいいけど、やはりそんな時間使いたくない。

# 結論
* 公式githubのREADME.mdに書いてあった。
 * [illuminate/database](https://github.com/illuminate/database)

# PHPUnitだとこういうイメージ
下記のようにすればModel::find(1)のように普通に使えるようになります。

```php
<?php
use PHPUnit\Framework\TestCase;
use Illuminate\Database\Capsule\Manager as Capsule;

class HogeTest extends TestCase
{
    public static function setUpBeforeClass()
    {
        $capsule = new Capsule();
        $capsule->addConnection([
            'driver' => 'mysql',
            'host' => 'localhost',
            'username' => 'hoge',
            'password' => 'hoge',
            'database' => 'hoge',
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
        ]);
        $capsule->setAsGlobal();
        $capsule->bootEloquent();

   }

   // 以下略
   ......
   ......
}
```
JavaScript文字列処理　文字列からの検索

JavaScriptが生まれてかなり経ち、今では何らかのライブラリを使うことの方が多くなりました。
そんな中での文字列関数のうち、文字列内からの検索についての復習です。
黒歴史遺跡発掘のお供にどうぞ。（このエントリも鬼のように要補修で1年後には黒歴史というオチですが）

Mac OS X Google Chromeで確認。

### 引数、戻り値一覧

|関数名|引数1|引数2|戻り値|
|---|---|---|---|
|indexOf|検索文字列|開始位置|最初の出現位置、該当なしで-1|
|lastIndexOf|検索文字列|開始位置|最後の出現位置、該当なしで-1|
|match|検索正規表現||該当要素の配列|
|search|検索正規表現||最初の該当出現位置|

### 引数の数値変換と値による動作

#### indexOf

検索文字列

|引数|動作|
|---|---|
|引数なし|該当なしを返す|
|数値（負の数）|符号を含めた文字列とみなす|
|数値（小数）|文字列とみなす|
|数値（正の符号つき）|符号を含めない文字列とみなす|
|数値（8進数表記）|10進数で表記した文字列とみなす|
|数値（16進数表記）|10進数で表記した文字列とみなす|
|空文字列|0を返す|
|配列（空配列）|0を返す|
|配列（要素数1以上）|join()実行結果（カンマ区切り文字列）とみなす|
|オブジェクト|文字列「[object Object]」を指定とみなす|
|関数|文字列に変換したものを指定とみなす|

開始位置

|引数|動作|
|---|---|
|文字列（数字以外）|0を指定とみなす|
|文字列（数字）|整数値に変換した値を指定とみなす|
|数値（文字列長以上）|該当なしを返す|
|数値（小数）|整数値に変換した値を指定とみなす|
|数値（負の値）|該当なしを返す|
|配列（空配列）|0を指定とみなす|
|配列（要素数1）|先頭要素を文字列に変換した値とみなす|
|配列（要素数2以上）|0を指定とみなす|
|オブジェクト|0を指定とみなす|
|null|0を指定とみなす|
|NaN|0を指定とみなす|
|function|0を指定とみなす|

#### lastIndexOf

検索文字列

|引数|動作|
|---|---|
|引数なし|該当なしを返す|
|数値（負の数）|符号を含めた文字列とみなす|
|数値（小数）|文字列とみなす|
|数値（正の符号つき）|符号を含めない文字列とみなす|
|数値（8進数表記）|10進数で表記した文字列とみなす|
|数値（16進数表記）|10進数で表記した文字列とみなす|
|空文字列|文字列長を返す|
|配列（空配列）|文字列長を返す|
|配列（要素数1以上）|join()実行結果（カンマ区切り文字列）とみなす|
|オブジェクト|文字列「[object Object]」を指定とみなす|
|関数|文字列に変換したものを指定とみなす|

開始位置

|引数|動作|
|---|---|
|文字列（数字以外）|正の無限大を指定とみなす|
|文字列（数字）|整数値に変換した値を指定とみなす|
|数値（文字列長以上）|正の無限大を指定とみなす|
|数値（小数）|整数値に変換した値を指定とみなす|
|数値（負の値）|該当なしを返す|
|配列（空配列）|0を指定とみなす|
|配列（要素数1）|先頭要素を文字列に変換した値とみなす|
|配列（要素数2以上）|正の無限大を指定とみなす|
|オブジェクト|正の無限大を指定とみなす|
|null|0を指定とみなす|
|NaN|正の無限大を指定とみなす|
|function|正の無限大を指定とみなす|
※ToNumberでNaNとなる値は正の無限大となる

#### match

|引数|動作|
|---|---|
|引数なし|空文字列を指定とみなす|
|文字列|正規表現に変換される|
|空文字列|空文字列を要素とした長さ1の配列を返す|
|数値（負の値）|符号を含めた文字列とみなす|
|数値（0、正の値）|符号を含めない文字列とみなす|
|配列（空配列）|空文字列を指定とみなす|
|配列（要素数1以上）|join()実行結果（カンマ区切り文字列）とみなす|
|オブジェクト|文字列「[object Object]」を指定とみなす|
|null|文字列「null」を指定とみなす|
|NaN|文字列「NaN」を指定とみなす|

#### search

|引数|動作|
|---|---|
|引数なし|空文字列を指定とみなす|
|文字列|正規表現に変換される|
|空文字列|0を返す|
|数値（負の値）|符号を含めた文字列とみなす|
|数値（0、正の値）|符号を含めない文字列とみなす|
|配列（空配列）|0を返す|
|配列（要素数1以上）|join()実行結果（カンマ区切り文字列）とみなす|
|オブジェクト|文字列「[object Object]」を指定とみなす|
|null|文字列「null」を指定とみなす|
|NaN|文字列「NaN」を指定とみなす|
カレンダーの目的と概要、PHPとは

[一人PHP総復習 Advent Calendar2016](http://qiita.com/advent-calendar/2016/php_beginner) の1日目の記事です。

## 書いてる人
2015年4月〜 ウェブのサーバサイドエンジニアになった
〜2016年5月 PHP5.3でSlim2系
〜2016年9月 PHP5.6でLaravel5.2
2016年10月〜 PHP7でLaravel5.3

1年ちょっと前まで「変数と関数の違いがわからん」とか言ってた人。
インフラとフロントの知識はめっちゃ乏しい。
大学は文系で、基本的に知識がふわっとしている。

## 対象
* 自分: 曖昧なところをまとめておさらいする
* 超入門者: プログラミング始めようと思ってるんだけどくらいの人
* マサカリer: ツッコミお待ちしてます

## 目的
第一義は自分自身の復習！そして、身一つでプログラミングの世界に飛び込んで「こんな簡単なこと人には聞けない…」という人の助けになれたら泣いて喜びます。

## 概要
前半は基礎知識のまとめ、後半はユースケースを書いていけたらと。
タイトルは適当につけてあるので変更の可能性があります。

## PHPとは
あとで追記！！！

明日は「変数」について私が書きます！！
WP-CLI 備忘録


## インストール

```
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ chmod +x wp-cli.phar
$ sudo mv wp-cli.phar /usr/local/bin/wp
```
OR

```
$ brew install wp-cli
```

## ユーザー作成

```
$ wp user create {user_name} {user_email} --role=author --user_pass={user_pass} --first_name="テスト"
```

## usermeta追加

```
$ wp user meta add {user_email|id} {meta_key} {meta_value}
```

## SSH(Vagrant) 設定

```
$ cd /your/vagrant/project/path
$ vagrant ssh-config >> ~/.ssh/config
```
config の`Host`部分を使ってアクセスができるようになる。

### ユーザー作成

```
wp @{SSH_HOST} user create {user_name} {user_email} --role=author --user_pass={user_pass} --first_name="テスト"
```
Ubuntu > link > Ubuntu の日本語キーボード レイアウト @ 哲朗webさん

```txt:動作環境
Ubuntu 14.04 LTS Japanese Remix
```

日本語109キーボードを使おうとしたところ、日本語キーボード設定がいくつもある。
それらの説明は以下で整理されていた。

https://sites.google.com/site/tetsuroweb/home/software/ubuntu/tips/japanese-keyboard-layout

参考になります。
iOSで画像の一部をくり抜く(透明にする)

 iOSで画像の一部をくり抜く(透明にする)方法を探していたのですが、見つけることができませんでした。

そこで質問。
https://teratail.com/questions/57171

完璧な回答を付けていただきました。

それを参考にして自分で書いたコード

0. imageView.image：くり抜き対象の画像
1. rect(CGRect)：くり抜く場所

```swift
                UIGraphicsBeginImageContext(imageView.bounds.size)
                 defer {
                     UIGraphicsEndImageContext()
                 }
                 if let context = UIGraphicsGetCurrentContext() {
                     imageView.image?.drawInRect(imageView.bounds)
                     CGContextClearRect(context, rect)
                     if let cgImage = CGBitmapContextCreateImage(context) {
                         // くり抜かれた画像
                         let image = UIImage(CGImage: cgImage)
                     }
                 }
```
Can we customize webpack config with angular-cli? 

[angular-cli](https://github.com/angular/angular-cli) を使って `ng init` でプロジェクトを作ると、各種設定ファイルが作成されるが、`webpack.config.js` など webpack に関連した設定ファイルはぱっと見みあたらない。
([angular-cli](https://github.com/angular/angular-cli) 自体は beta.10-beta.14 でビルドシステムを [webpack に変更している](https://github.com/angular/angular-cli/wiki/Upgrading-from-Beta.10-to-Beta.14)ので、最近のものを使っていれば webpack を内部で使っていることになる。)

```console:
>ng i
installing ng2
  create .editorconfig
  create README.md
  create src\app\app.component.css
  create src\app\app.component.html
  create src\app\app.component.spec.ts
  create src\app\app.component.ts
  create src\app\app.module.ts
  create src\app\index.ts
  create src\assets\.gitkeep
  create src\environments\environment.prod.ts
  create src\environments\environment.ts
  create src\favicon.ico
  create src\index.html
  create src\main.ts
  create src\polyfills.ts
  create src\styles.css
  create src\test.ts
  create src\tsconfig.json
  create src\typings.d.ts
  create angular-cli.json
  create e2e\app.e2e-spec.ts
  create e2e\app.po.ts
  create e2e\tsconfig.json
  create .gitignore
  create karma.conf.js
  create package.json
  create protractor.conf.js
  create tslint.json
Installing packages for tooling via npm.
...
```

[Webpack](https://webpack.js.org/configuration/) 自体は柔軟な設定をサポートするのにな、あれれ?と思ったら [issue#1656 - [Enhancement] Overridable webpack config](https://github.com/angular/angular-cli/issues/1656) の議論を発見。

2016年9月時点での結論は(スレッドから理解する限り)以下の通り：

- 現時点では [angular-cli](https://github.com/angular/angular-cli) の webpack 構成はオープンになっていないので、「自分で書いた`webpack.config.js` をどこかにおいて angular-cli に読み込ませる」など簡単な方法での設定上書きはできない。 
  - 同じスレッドに「こうやったらできたよ」の[記述](https://github.com/angular/angular-cli/issues/1656#issuecomment-240983105)はあるが、自分自身は未検証。
- [collaborator のコメント](https://github.com/angular/angular-cli/issues/1656#issuecomment-248768862) では「final release をしたらロードマップやリストを公開する予定。ETAは早くて2017年のどこか(2016年内はないっぽい)。」とのことなので、2017年になったら対応されるかも?

最初にクイックに作り始めるには angular-cli はとても便利だけれども、ビルドでちょっと細工をしたい場合は考えないといけないのかもしれない。(そしてやり方に正解があれば知りたい。)
MobifyのWeb Push Notifications：プロジェクトの作成

>
Progressive Web Appsの特徴の一つにWebサイトからのプッシュ通知があります。
この記事はMobifyのProgressive Mobileの機能として提供される
Webプッシュ通知（Web Push Notifications）に関する情報です。



MobifyのWebPushを利用するために、ローカルにプロジェクトファイルを作成します。
公式ドキュメントの「Development」に沿って進めます。
http://docs.mobify.com/messaging/1.0/development/


# 環境のセットアップ
以下のツールがインストールされている必要があります。

### Grunt CLI

```
# Grunt: http://gruntjs.com
npm install -g grunt-cli
```
Macの場合は頭に「sudo 」をつけて実行。パスワードを訊ねられるのでMacのユーザーパスワードを入力する。

### Grunt init

```
# Install `grunt-init`: http://gruntjs.com/project-scaffolding
npm install -g grunt-init
```
Macの場合は頭に「sudo 」をつけて実行。



### grunt-init-webpush
プロジェクトの作成用の「grunt-init-webpush」をルートにGithubから一式をクローンします。

```ruby:terminal
git clone git@github.com:mobify/grunt-init-webpush.git ~/.grunt-init/webpush
```
既にインストール済みの場合は最新版か確認して次のプロジェクト作成に進みます。


# プロジェクトの作成
まずプロジェクトファイルを入れるディレクトリを作成します。
そして初期化コマンドを実行すると、ウィザード形式でプロジェクト名などの質問が出るので、これに答えながらプロジェクトを作成します。

```
cd /path/to/your/project-root
grunt-init webpush
```

| 質問 | 回答 | 備考 |
|:----:|:----:|:---|
| site_id  | サイトID  |  |
| mobify hosted | y/n  | ServiceWorkerの対象ドメイン。基本はMobifyドメインを利用するので「y」とする | iframe | top/bottom | バナーのiFrameが表示される位置 |
| font-family | フォント名 | CSSの「font-family」を入力 |
| container-width | サイトのコンテンツ幅 | PCの場合バナー幅は100％だが、バナー内のテキストやボタンを収める領域の幅を入力する。 |
| brand_color | #aaa | デフォルトアイコンなどに使用するメインカラー |
| differnt_desktop_copy | y/n | PC用のテキストを使用するかどうか |
| checkout_flow_path | /checkout | カートページのパス（バナーを表示させないページを指定する） |

以上を入力すると最後に変更するかどうか訊ねられるので、
問題がなければ「N」を入力してください。
Scaffoldからプロジェクトファイル一式が生成されます。

## ファイル構成
生成されるプロジェクトは以下のような構成になっています。

```
/custom
    /production                     # Root folder of what gets deployed
        /images
            icon-*.svg              # SVG icons used in the opt-in dialog
            notification-icon.png   # A square 192x192px logo used in notifications
            icon256x256.png         # A square 256x256px logo used by Safari
            logo.png                # The logo in its original shape
            logo@2x.png             # Same as logo.png, but double its dimensions
        /js
            webpush-shared.js       # A place to customize the opt-in dialog
        /styles
            stylesheet.css          # The generated CSS file
        *.html                      # Raw HTML files that dictate the opt-in and subscription page
        custom.js                   # Dictates when/where the opt-in appears
/src
    /sass                           # Raw SCSS files
/tests                              # A Nightwatch.js test suite for automated tests
<site-id>.yml                       # The configuration file used by the backend system
web.*.pem                           # A certificate to enable messaging for Safari
```

「custom」フォルダ内にsoftask.htmlなどサイトで表示されるバナー用のファイルがあります。
基本的にはこの「custom」フォルダ内をサイトに合わせてカスタマイズしていきます。

### stylesheet.css
バナーで使用するCSSは「/src/sass」フォルダ内のSCSSファイルから生成されます。
「grunt」コマンドを実行するとlintやSassのコンパイルが自動で行われます。


## npmモジュールのインストール
MobifyのWebPushではgruntコマンドで上記のコンパイルやサーバへのアップロードなどのタスク処理を行います。
必要なライブラリ一式を下記のコマンドでインストールします。

```
npm install
```

以上でプロジェクトの作成は終わりです。
sprockets-railsでつまずいた

### 背景

Railsを利用していた時のトラブルシュートです。

新しくrailsのプロジェクトを作成した時に、
いきなりrakeのタスクが使用できなくなり、
解決するのに時間がかかったので、メモで記述します。

### 内容

とある時にいつも通りにrails new して、
何気なくscaffold を実行すると、以下のエラーが発生した。

```bash

$ rails g scaffold item
/root/.rbenv/versions/2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- bundler/setup (LoadError)
	from /root/.rbenv/versions/2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
	from /usr/share/nginx/hoge/vendor/bundle/ruby/2.2.0/gems/spring-1.6.1/lib/spring/commands.rb:33:in `<module:Spring>'
	from /usr/share/nginx/hoge/vendor/bundle/ruby/2.2.0/gems/spring-1.6.1/lib/spring/commands.rb:4:in `<top (required)>'
	from /root/.rbenv/versions/2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
	from /root/.rbenv/versions/2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
	from /usr/share/nginx/hoge/vendor/bundle/ruby/2.2.0/gems/spring-1.6.1/lib/spring/application.rb:77:in `preload'
	from /usr/share/nginx/hoge/vendor/bundle/ruby/2.2.0/gems/spring-1.6.1/lib/spring/application.rb:143:in `serve'
	from /usr/share/nginx/hoge/vendor/bundle/ruby/2.2.0/gems/spring-1.6.1/lib/spring/application.rb:131:in `block in run'
	from /usr/share/nginx/hoge/vendor/bundle/ruby/2.2.0/gems/spring-1.6.1/lib/spring/application.rb:125:in `loop'
	from /usr/share/nginx/hoge/vendor/bundle/ruby/2.2.0/gems/spring-1.6.1/lib/spring/application.rb:125:in `run'
	from /usr/share/nginx/hoge/vendor/bundle/ruby/2.2.0/gems/spring-1.6.1/lib/spring/application/boot.rb:18:in `<top (required)>'
	from /root/.rbenv/versions/2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
	from /root/.rbenv/versions/2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
	from -e:1:in `<main>'
```


結論をいうと、sprockets-railsの3.0.0が原因らしい。

```bash
### 確認する。
$ bundle show |fgrep sprockets-rails
  * sprockets-rails (3.0.0)

### 削除する。
$ gem uninstall sprockets-rails

You have requested to uninstall the gem:
	sprockets-rails-3.0.0

rails-4.2.5 depends on sprockets-rails (>= 0)
sass-rails-5.0.4 depends on sprockets-rails (< 4.0, >= 2.0)
web-console-2.2.1 depends on sprockets-rails (< 4.0, >= 2.0)
If you remove this gem, these dependencies will not be met.
Continue with Uninstall? [yN]  y
Successfully uninstalled sprockets-rails-3.0.0

### Gemfileに追加する。
$ echo "gem 'sprockets-rails', '2.3.3'" >> Gemfile

### bundle update をする。
$ bundle update sprockets-rails

### 確認する。
$ bundle show |fgrep sprockets-rails
  * sprockets-rails (2.3.3)

### 再度scaffoldする
$ rails g scaffold item
```

という流れでうまく処理が通りました。
DB2LUWとDB2zのロックの違い

DB2LUWとDB2zでは同じDB2といっても実装が異なる点が多々ある。

導入・構築方法や運用面でも大きく異なるが、アプリケーションが取得するロックの単位もその1つ。

例えばDB2LUWでは行ロックを基本とするのに対して、DB2zでは表スペース作成時のLOCKSIZEオプションの指定に依存する。省略時値はANYとなり、この場合ページロックと表スペースロックを併用する。

ちなみにDB2LUWにはページロックは存在しない。

ページロックの場合で、1ページに複数行格納されている場合、仮にアクセスしたい行はその中の1行でもページ単位にロックを取得する事になるためページ内の他の行に対してもアクセス不可となりえる。（1ページに何行格納するかはMAXROWSで指定するがデフォルトだと255となる）

以前DB2LUW担当者と会話したとき、「プラットフォームをホストに移したら待ちが発生するようになった」と言われていた。DB2zとは取得するロック単位が異なる為、これが関係していた可能性も考えられる。

よってプラットフォーム変更の際はこの辺の差異も確認の上実装しよう。
AWSでEC2インスタンスを利用してNATを構築方法


### 背景

既存のAWSの[NAT Gateway](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html) がない時代にNATを利用したネットワーク環境が欲しいとのことなので、
構築した内容を記載します。

### 短くいうと

* [Amazon Virtual Private Cloud - NATインスタンス](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html)　とおりやれば出来る。


### 準備するもの

公式の図を参考にしつつ値を決めていく。

![nat-instance-diagram.png](https://qiita-image-store.s3.amazonaws.com/0/17349/36b868fa-2796-de40-5436-8a128ff8b7b8.png)
　
### 設定値を準備する

| 項目 | 値 | 備考 |
|:-----------|------------:|:------------:|
| VPCのアドレス |  10.0.0.0/16 | 10.0.0.1 ~ 10.0.255.255のVPC  |
| AZ用のサブネット(a)     |      10.0.0.0/24 | publicIPを付与するサブネ   |
| AZ用のサブネット(a)     |      10.0.1.0/24 | privateIPを付与するサブネ   |

※AZはavailabilityzoneの略称です。

### VPCを作る

とりあえず適当に設定する。

[vpcを作成する](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Subnets.html#Create-VPC)の内容を参考にポチポチポチっとVPCを作成する

### Subnetを作る

AZ用のサブネット(a)の値を参考にしてサブネットを作成します。
今回はpublicとprivateをそれぞれ作成します。

* publicは紐づけられたGlobalIPを使用した通信をします。
* privateはNAT経由で外部との通信をします。

[サブネットを作成する](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Internet_Gateway.html#Add_IGW_Create_Subnet)

### IGWを作る

新しくIGWを作成します。
特段気にする事が無いので、ただただ作ります。

[インターネットゲートウェイをアタッチする](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Internet_Gateway.html#Add_IGW_Attach_Gateway)


### カスタムテーブルを設定する。

作成したVPCのサブネット(public)と作成したIGWを紐付けます。
これにより、
private-subnetからの通信をpublic-subnet経由で外部と通信ができる一番外側の設定が完了します。
設定はまだまだ続きます。

[パブリックサブネットにする　カスタムテーブルを設定する。](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Internet_Gateway.html#Add_IGW_Routing)


### NATのセキュリティグループを作成する。

NATSGと表記されている部分です。
NATのセキュリティグループを作成します。
後から変更も可能なのでとりあえず作ってみましょう。

[NATSG セキュリティグループを作成する](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html#NATSG)

### NATインスタンスを作成する。

ドキュメントではNAT用のAMIを使用しています。
今回は標準のamazonOSから作成します。

* EC2からamazonOSを選択肢立ち上げます。
* ElasticIPを付与します。(GlobalIPを付与する。)
* SSHでログイン後以下のコマンドを実行します。

```bash
### [NAT Instance]

$ /sbin/iptables -t nat -A POSTROUTING -o eth0 -s 0.0.0.0/0 -j MASQUERADE
$ /sbin/iptables-save > /etc/sysconfig/iptables
$ echo 1 > /proc/sys/net/ipv4/ip_forward && echo 0 > % /proc/sys/net/ipv4/conf/eth0/send_redirects
mkdir -p /etc/sysctl.d
$ cat <<EOF > /etc/sysctl.d/nat.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.eth0.send_redirects = 0
EOF
```
ネイティブアプリのStore情報をAPIで取得する

[ディップ Advent Calendar](http://qiita.com/advent-calendar/2016/dip-dev) の1日目です。

スマートフォンアプリのDL数を増やして、より多くの方に使ってもらうためには、アプリそのものの改善と、アプリ広告やASOなどによるアプリ外の施策をバランス良くやっていく必要があります。

ユーザーの利用状況やレビュー、Storeの順位などは、[iTunes Connect](https://itunesconnect.apple.com/) や [Google Developers Console](https://console.developers.google.com/?hl=JA) の管理画面を見ればある程度わかりますが、定期的に推移を追っていくためにはデータ取得のスクリプトを作るなどして、なるべく自動化したいところです。

ということで本記事では、APIも使えるアプリ分析サービスを紹介していきますよ。

## 1. AppStore、GooglePlay から直接データ取得する
まずはApple、Googleそれぞれ本家のサービスから。
### ■ アプリ情報の取得
App Storeで公開されているアプリの情報は、iTunes Search API を使って取得することができます。

[iTunes Search API](https://affiliate.itunes.apple.com/resources/documentation/itunes-store-web-service-search-api/)

lookup を使うと、アプリIDをクエリパラメータに指定してアプリ情報を取得できます。
例） https://itunes.apple.com/lookup?id=(アプリID)

また Search を使うと、アプリ名等を指定してアプリを検索できます。
例） https://itunes.apple.com/search?term=chrome

日本のアプリストアの情報を優先的に取得したい場合は、`country=JP`をパラメータに追加してください。

Google はアプリ情報を取得する API を提供していません。そのため Google Play のアプリページをスクレイピングして取得する必要があります。アプリページのURLは以下の通りです。
https://play.google.com/store/apps/details?id=(アプリCD)&hl=ja

### ■ レビューの取得
iOS アプリのレビューは RSS で取得することができます。
http://itunes.apple.com/jp/rss/customerreviews/id=(アプリID)/json

Google Play アプリのレビューは、アプリごと・月ごとに Google Cloud Storage にCSVファイルが作成され、蓄積されています。このファイルを GSUtil 等でダウンロードし取得することができます。

詳細についてはこちらの記事が詳しいです。
[Google Play Storeの評価とレビューをgsutilで取得 - Qiita](http://qiita.com/punchdrunker/items/e97248428d19cfa7fb08)

CSVファイルの文字コードは UTF-16LE ですので、エンコードする場合は注意してください。

## 2. ASPサービスを使う
外部のストア分析ASPサービスについていくつか紹介します。

### [App Annie](https://www.appannie.com)
https://www.appannie.com
言わずと知れたアプリ分析サービス。日本、海外を問わず非常に多くのアプリ情報やトラッキングデータを持っています。Webの解析画面が充実していますが、アプリのランキングやレビュー、レーティング取得などのAPIも用意されています。

### [appfigures](https://appfigures.com)
https://appfigures.com
ストア分析のほか時間単位のレポートなどが提供されています。APIではアプリ情報やレビューに加えて、appfigures のアカウント管理の機能も用意されています。

### [apptweak](https://apptweak.io/)
https://apptweak.io/
APIをメインに提供しているサービスです。レビューやレーティング、ジャンル別、キーワード別ランキングが取得できます。アカウントに対して「クレジット」が設定されており、使用するAPIによってクレジットが変わります。

### [Search Man](https://searchman.com/ja/)
https://searchman.com/ja/
こちらも有名なアプリ分析サービス。カテゴリやセレクションごとの上位アプリ、特定アプリのカテゴリ順位のほか、入力キーワードに対する自動補完キーワードの一覧を取得するAPIが用意されています。

===

ASPサービスが提供しているAPIは、各サービス内で独自に取得・蓄積しているアプリ情報を返却することが多いため、実際のストアと比べて情報の反映が遅い場合があります。ただ、ストアの順位など1日の中で何度も変動が無いものについては、それほど問題にならないのではないでしょうか。

こういったサービスを活用して、今後もよりよいアプリを作っていきましょう！
OpenSSLの暗号強度をSHA256で作ってみるぽよ

2016年もあと僅か。
ここ2年ほどで騒がれていたSHA-1証明書が各ブラウザで利用ができなくなる２０１７年まであと僅かです。

![alt](https://www.cybertrust.ne.jp/sureserver/images/productinfo/00000696.jpg)

まだSHA-1運用をしている。。。
まあそんなことはないと思いますが、久々にSSLの作成手順を記載したいと思います。

## 秘密鍵作成

```bash
### 秘密鍵を作成します。
$ openssl genrsa -out priveteKey.key 2048 -sha256
### 作成された鍵を確認します。
$ openssl rsa -noout -text -in priveteKey.key  |fgrep Private-Key
Private-Key: (2048 bit)
```

コマンドの説明は以下の通りです。

| 項目 | 説明 | 
|:-----------|------------:|
| 2048       |        鍵長 |
| des3       |      パスプレーズ入力 |


### CSR作成

```
### CSR鍵を作成します。
$ sudo openssl req -new -key priveteKey.key -sha256 -out mofumofu-com.csr -subj "/C=JP/ST=Tokyo/L=Shinjyuku/O=Mofumofu Inc./OU=mofu division/CN=mofumofu.com/emailAddress=account@mofumofu.com"

＃＃＃ 作成した、CSRファイルをチェックします。
$ openssl req -text -noout -in mofumofu-com.csr |grep -A5 'Subject Public'

＃＃＃ 作成した、CRTファイルをチェックします。
$ openssl x509 -text -noout -in  mofumofu-com.crt |grep -A5 'Subject Public'
```

上記で鍵の作成は完了します。

nginxの設定の場合は以下のようにファイルをしてすると動くかと思います。

```
server {
  listen       443 ssl http2;
  server_name  mofumofu.com;

  ssl on;
  ssl_certificate /usr/local/nginx/conf/mofumofu-com.crt;
  ssl_certificate_key /usr/local/nginx/conf/priveteKey.key;

[snip]
}
```

```
$ nginx -v
nginx version: nginx/1.10.1

$ curl -I https://mofumofu.com
HTTP/1.1 200 OK
```

SSLの証明書購入はRapidSSLかな。。。
Javaのメモリ設定と、jstatの出力結果に関するメモ

# Java起動時のメモリ設定オプション

| オプション | 使用例 | 解説 |
|:--|:--|:--|
| -Xms | -Xms512m | 起動時のヒープメモリサイズ。サーバ用途なら、-Xmxと同じ値でよいと思われます。 |
| -Xmx | -Xmx1024m | ヒープメモリの最大サイズ。 |
| -Xss | -Xss128m | スタックメモリのサイズ |
| -XX:NewRatio | -XX:NewRatio=2 | OLD領域 ÷ NEW領域 の最大値。値が2なら、OLD領域:NEW領域は、最大2:1の割合になる |
| -XX:PermSize | -XX:PermSize=1024m | 起動時のパーマネント領域メモリサイズ。 |
| -XX:MaxPermSize | -XX:MaxPermSize=1024m | パーマネント領域の最大サイズ。OutOfMemoryが起きるようなら増やす。 |
| -XX:NewSize | -XX:NewSize=512m | NEW領域の最小サイズ。 |
| -XX:MaxNewSize | -XX:MaxNewSize=512m | NEW領域の最大サイズ |

# 一般的なメモリ設定

- NEW領域はヒープサイズの3分の1から4分の1にする
- OLD領域は、NEW領域より大きくする
- XmsとXmxを同じ値にすると、メモリ割当時の処理が不要になる

# jstatの出力結果

## gcutilオプション使用時

ガーベージコレクションのサマリです。

| 列 | 解説 | 単位 |
|:-:|:--|:-:|
| S0  | Survivor領域0(From/To)の使用率  | % |
| S1  | Survivor領域1(From/To）の使用率   | % |
| E  | EDEN領域の使用率  | % |
| O  | OLD領域の使用率  | % |
| M  | メタ領域の使用率  | % |
| CCS | 圧縮済クラス領域の使用率 | % |
| YGC | スカベンジガーベージコレクション（NEW領域のガーベージコレクション）回数 | 回 |
| YGCT | スカベンジガーベージコレクション（NEW領域のガーベージコレクション）にかかった時間 | ミリ秒 |
| FGC | フルガーベージコレクションの発生回数 | 回 |
| FGCT | フルガーベージコレクションにかかった時間 | ミリ秒 |
| GCT | ガーベージコレクションにかかった時間 | ミリ秒 |


# 参考

- [Javaのヒープ・メモリ管理の仕組み (1/2)](http://www.atmarkit.co.jp/ait/articles/0504/02/news005.html)
- [チューニングに使えるJava性能監視ツール](https://thinkit.co.jp/story/2011/03/25/2054)
- [jstatマニュアル](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html)
stackでのライブラリ(library)と実行(executable)ファイルの違い

##ライブラリと実行可能ファイルの違い

どちらも、.hsファイルで、しかもmainを書いてもライブラリはライブラリです。
最初ちょっと困惑したので、まとめておきます。
あまりにも当たり前のことかもしれないので、既知の方は気軽に飛ばしてください。
表題の通り、libraryとexecutableの違いと作り方です。

```haskell:foo.cabal
executable foo　--ここに実行名を入力
  main-is: foo.hs 
  Build-Depends:    base < 5, containers, mtl, parallel
  Exposed-Modules:  foo--階層がある場合(Data/foo.hs)は.で区切って表記（Data.foo）
  Ghc-Options:      -Wall
```

これでビルドすると、
$stack exec foo 
で実行できます。

ライブラリの場合は

```Haskell:foo.cabal
foo.cabalに

library
  Build-Depends:    base < 5, containers, mtl
  Exposed-Modules:  foo
  Ghc-Options:      -Wall
```

このときは、foo.hsの頭にmodule宣言を記述しておく必要があります。

```Haskell:foo.hs
{-もし関数の隠蔽などの関係で使える関数を決め打ちしたい場合は
module foo (zoo) where
のように()でくくれば、それ以外の関数は外から見えない
-}

module foo where

--以下ライブラリの中身
zoo :: Int -> Int
zoo x = x + 2
```

これはビルドしても実行はできません。mainファイルなどを作って引っ張ってくると利用できます。例えば、以下のような形です。

```haskell:main.hs
import foo

main :: IO ()
main = print (foo.zoo x)
```

#####まとめ

実行可能ファイルとライブラリはcabalの中身で変わる。
executable 実行名　もしくは、
library
ライブラリの場合は.hs本体にモジュール宣言を加える。
module モジュール名　where


~~こんな感じでしょうか。もしかしたらライブラリの時は頭文字は大文字（つまりFoo）でないとだめとかのルールがあるかもしれません。僕が扱っているものはたいてい大文字なので、動かなかったら大文字に直してみると良いかもしれません。~~
詳しい方コメントいただけたりするととてもうれしいです。

ライブラリの記名について、コメントより詳しい説明をいただきましたので、加筆、訂正させていただきます。ライブラリとして使いたい場合に関しては、以下のように、ファイル名＝モジュール名　かつ　モジュール名は大文字始まりとのことです。

```Haskell:Foo.hs
{-もし関数の隠蔽などの関係で使える関数を決め打ちしたい場合は
module Foo (zoo) where
のように()でくくれば、それ以外の関数は外から見えない
-}

module Foo where

--以下ライブラリの中身
zoo :: Int -> Int
zoo x = x + 2
```

そしてどうやら、Qiitaさんは赤字で懸命にそのことを伝えてくれていたようです。

hirataraさんコメントいただきまして本当にありがとうございました。
エンタープライズ向けオープンソースCMS「eZ Publish」の概要

## eZ Publish / eZ Platform Advent Calendar 2016
25日間にわたって eZ Publish / eZ Platform について解説していきます。
1日目はまずご紹介ということで eZ Publish の概要を解説します。

## <i class="fa fa-clone"></i> eZ Publish とは
![ez_logo.png](https://qiita-image-store.s3.amazonaws.com/0/15175/0f8b728c-42e8-233b-d36d-49ae6bba8ea8.png)

**eZ Publish** は PHP で開発されているオープンソースのエンタープライズ向け CMS です。
ノルウェー王国の eZ Systems 社によって1999年から開発されています。これは WordPress の4年前、Drupal の2年前になります。最初の10年は共同創業者の Bård によって設計、開発され、現在の開発は主にニューヨークで行われています。

**コンテンツタイプ**（または**クラス**）という概念により、コンテンツやユーザーなどほぼ全ての情報を汎用的かつ構造的に管理することが出来るのが特徴です。

また、前バージョンの eZ Publish 5 からフレームワークに **Symfony** を採用しています。

最新バージョンの eZ Publish 6 は製品名が変更されたため **eZ Platform 1.6.0** になります。
ただし、実際の運用では **eZ Publish 5** がまだ使われているのが現状です。

## eZ Publish が適しているサイト
eZ Publish には他の CMS と比べて以下のようなサイトに特に向いています。

* 部署やユーザー数が多い組織
* ユーザーやコンテンツの内容に応じて細かく**権限**を設定したいサイト
* コンテンツの**多言語**展開が必要なサイト
* **階層構造**の複雑なサイト
* コンテンツの種類や決まった入力項目が多いサイト
* 同一コンテンツを複数の出力（テンプレート）で配信するサイト

**WordPress** や **Drupal** と異なり、追加のプラグインやモジュール（eZ Publish ではエクステンションまたはバンドルと呼びます）を入れずともエンタープライズ向けの高度な機能が最初から実装されています。

## システム要件
 |eZ Publish 5.4 [^ezp54]|eZ Platform (eZ Publish 6) [^ezplatform]
---|---|---
OS|Linux, Solaris, OpenSolaris, <br>Windows Vista/7/2008, <br>Mac OS X (server & normal)|Linux
Web|Apache 2.2, 2.4<br>Nginx 1.4 以上|Apache 2.2, 2.4<br>Nginx 1.4, 1.6, 1.8. 1.10
DB|MySQL/MariaDB<br>PostgreSQL|MySQL 5.5, 5.6<br>MariaDB 5.5, 10.0
PHP|5.4.4 以上, 5.5, 5.6<br>7.0 はコミュニティサポート|5.5, 5.6, 7.0 [^note]

[^ezp54]: https://doc.ez.no/display/EZP/Requirements+5.4
[^ezplatform]: https://doc.ez.no/pages/viewpage.action?pageId=31429536#Step0:Requirements&SystemConfiguration-Supportedsetups
[^note]: Note: php modules like  memcached are not stable for PHP 7.x yet, so 7.x setup is limited to dev/single server; ETA for cluster support sometime after Ubuntu 16.04 is out.

## 有償版
eZ Systems 社とサブスクリプション契約を行うと、製品に関する様々なサポートが受けられます。
eZ Publish 5.4 は有償版の名称で、オープンソース版は eZ Publish Community Edition になります。
また eZ Platform の有償版は **eZ Enterprise** というサービス名で展開されており、より高機能な管理機能を持つ **eZ Studio** が提供されます。

## 管理画面

### eZ Publish 5
#### ダッシュボード
![ezp5_admin.png](https://qiita-image-store.s3.amazonaws.com/0/15175/e87da161-07d9-0951-b12a-1c80c5934c18.png)

#### 編集画面
![ezp5_admin_2.png](https://qiita-image-store.s3.amazonaws.com/0/15175/0109e00d-7ad0-5b54-a655-0ab53eb3e91a.png)

### eZ Platform (eZ Publish 6)
![Current-Platform-UI_ezno_default.png](https://qiita-image-store.s3.amazonaws.com/0/15175/e3aab737-539e-0c3a-42eb-41d06abf07ce.png)

#### eZ Studio
![ezstudio.png](https://qiita-image-store.s3.amazonaws.com/0/15175/1d3fc22b-8e7f-451a-996d-1333b67f0764.png)

![ezstudio2.png](https://qiita-image-store.s3.amazonaws.com/0/15175/2a2c362a-7cc2-f09f-c09d-5ab292a7d668.png)

アドベントカレンダー2日目は特徴についてもう少し詳しく解説します。
[Qiita改善案 AdventCalendar] 人気のあるタグを簡単に見つけられるようにしてほしい


Qiitaに記事を投稿する時に、どのタグを付けるべきか悩みますよね。
やっぱり、フォオワー数が多いタグをつけた方が良く多くの人に読んでもらえると思います。
なので、人気のあるタグを簡単に見つけられるようなページが欲しいです。

こんな機能があったらいいなと思った方は是非「いいね！」をお願いします！

# 一応あるけど・・・
「↓押しすぎるなよ！ 絶対に押しすぎるなよ！！！」

http://qiita.com/tags

ちなみに、タグの一覧を確認できるページはありますが、このページへの誘導がないので、存在を知らない方も多いと思います。

また、このページは非常に重いので、連続でリロードをすると、すぐに502になってしまいます。

![スクリーンショット 2016-12-01 11.44.11.png](https://qiita-image-store.s3.amazonaws.com/0/74551/bd7dd724-0d1f-0a0a-6e03-7cc018d87380.png "スクリーンショット 2016-12-01 11.44.11.png")
Chefを利用したときに気がついたこと

### はじめに

chefを使用する機会があり実施する場合に気をつけたことをメモする。

chefは冪等性を担保するツールではなく冪等性を実現できる手段です。
(最近のProvisioningToolはだいたいそうな気もするしBashだってそうな気がする。)

##  冪等性を実現するために気にしたこと。

### versionを指定する。

少し前に冪等性が、冪等性が。。。なんて話もあったかと思います。
確かに冪等性は大事です。
冪等性を守る一つとしてversion管理が大事だと思います。

chefはパッケージ管理ごとにversion指定ができます。
現状利用するバージョンまたはこれから利用するバージョンを確認した上で指定してあげることは優しさですね。

packageを利用した場合は以下のような形でversion管理が行えます。

``` bash
package "tar" do
  version "1.16.1-1"
  action :install
end
```

package以外にも以下のようなパッケージ管理ソフトが指定できます。

* apt_package
* bff_package
* chef_gem
* chocolatey_package
* dpkg_package
* easy_install_package
* freebsd_package
* gem_package
* homebrew_package
* ips_package
* macports_package
* openbsd_package
* pacman_package
* paludis_package
* portage_package
* rpm_package
* smartos_package
* solaris_package
* windows_package
* yum_package

cf: https://docs.getchef.com/resource_package.html

#### バージョン管理を、サーバとクライアントのいずれでやるか問題。

どのような管理方法にするか。で決められることが出来る。

* サーバ管理型
 * サーバ側で管理するためクライアント管理型より工数が少ない。
 * クライアントごとの設定差異がない場合にとても有効。
 * クライアント設定の一括変更時は同じコマンドで実施できる。

* クライアント管理型
 * クライアント側で管理するためサーバ管理型より工数が多い。
 * クライアントのロール別に設定変更することが可能


###  更新処理をする

#### actionを指定しない

``` bash
file "/tmp/something" do
end
```
#### 削除して作成する
こちらはファイルがある場合です。
明示的に記述するので処理がわかりやすいと思います。

``` bash
file "/tmp/something" do
  action [:delete, :create]
end
```

chefを利用する際に、時間が経過したときに同じ設定ができるか。
この点に注意しながら構築ができると
その後の設定管理に時間を(使わなく|少なく)することができます。
ので是非注意してみてください。
はじめに

Kashiwano-ha Open Innovation Lab 通称 KOILにて活動しています。

KOILにはいくつかのIT企業が入っております。
その企業でアドベントカレンダー書いちゃおうかな。
ということで、今回アドベントカレンダーに参加しています。

特に縛りもなく、技術系ではないこともあるかと思いますが、
とりあえずカレンダーができればいいかなーと考えておりまする。

人数が多くはないので大抵、私のまとまってない雑記事が載るでしょう。

という感じで二日目へ
PollyをAWS SDK for Pythonからコールする


## boto3の更新
boto3のVersion1.4.1以降でなければPollyに対応していません。
必ずアップデートしてから実行しましょう。

```
$ pip install boto3 --upgrade
```

古いバージョンだとこういうエラーが出ます。

```
known_service_names=', '.join(sorted(known_services)))
botocore.exceptions.UnknownServiceError: Unknown service: 'polly'. Valid service names are: acm, apigateway, application-autoscaling, autoscaling, budgets, cloudformation, cloudfront, cloudhsm, cloudsearch, cloudsearchdomain, cloudtrail, cloudwatch, codecommit, codedeploy, codepipeline, cognito-identity, cognito-idp, cognito-sync, config, datapipeline, devicefarm, directconnect, discovery, dms, ds, dynamodb, dynamodbstreams, ec2, ecr, ecs, efs, elasticache, elasticbeanstalk, elastictranscoder, elb, elbv2, emr, es, events, firehose, gamelift, glacier, iam, importexport, inspector, iot, iot-data, kinesis, kinesisanalytics, kms, lambda, logs, machinelearning, marketplacecommerceanalytics, meteringmarketplace, opsworks, rds, redshift, route53, route53domains, s3, sdb, servicecatalog, ses, sms, snowball, sns, sqs, ssm, storagegateway, sts, support, swf, waf, workspaces
```


###mp3ファイルを作成するスクリプト
参考：https://boto3.readthedocs.io/en/latest/reference/services/polly.html#Polly.Client.synthesize_speech

```
import boto3

client = boto3.client(
    'polly'
)
response = client.synthesize_speech(
    OutputFormat='mp3',
    Text='Hello World',
    TextType='text',
    VoiceId='Joanna'
)
print response
```

###実行結果
```
{u'ContentType': 'audio/mpeg', u'RequestCharacters': '11', 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': '7030dcae-b76c-11e6-8bdd-03f34d26ede6', 'HTTPHeaders': {'x-amzn-requestid': '7030dcae-b76c-11e6-8bdd-03f34d26ede6', 'transfer-encoding': 'chunked', 'x-amzn-requestcharacters': '11', 'content-type': 'audio/mpeg', 'date': 'Thu, 01 Dec 2016 02:18:24 GMT'}}, u'AudioStream': <botocore.response.StreamingBody object at 0x102b69ad0>}
```

`AudioStream`に音声データが入っている様子ですので、これを取り出して処理すれば良さそうです。
もしくはS3あたりに一旦突っ込んで、presigned_urlでDLできるようにするとかすればSaaSっぽいのが作れるかもです。

とりあえずひとまずここまで。
Nextcloud を使うべきか？


【2019年版】Nextcloudを使うべきか？ - Qiita
https://qiita.com/ynott/items/63cfd423f48e1d5044ea
を書きました。

-----
Advent Calendar 人がいなくて寂しいですが、去年もこんな感じだったので気にせず行きましょう！

ownCloud Japan Advent Calendar 2016 - Qiita
http://qiita.com/advent-calendar/2016/owncloudjp
の1日目です。

# 1. ownCloud と Nextcloud

# 2. 今年、ownCloud創設者が Nextcloud社設立
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/c01fcb6b-7b29-ef97-c3db-bdb14eb8030d.png)

# 3. 業界騒然
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/615066aa-8a88-6cec-3b8a-2f4fdc23277a.png)
当然ですよね～。

# 4. どうしてこうなった？
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/5248e719-3592-2f80-bd31-89b9852676e8.png)

# 5. Nextcloudでは
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/8fa25e58-416e-76ec-5e80-ec11d7acc56b.png)

# 6. ownCloudは？
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/297a6587-f729-15ed-f3ce-c412b4f9e2c9.png)

# 7. ownCloud社の状況
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/0de4e280-ebf8-1b40-2c1f-3a8b4f5fccc1.png)

# 8. Nextcloud社のスタンスと状況
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/c2b07450-5c83-3dd6-0ea3-f89b82a8fce9.png)

# 9. Nextcloud と ownCloud のバージョンの関係
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/4a35693b-ae63-f583-5fbe-0f248e917daf.png)

# 10. Nextcloud とownCloudは仲が悪いのか・・？
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/ba7437b7-dd23-5f5f-8560-f3aea3be470e.png)

# 11. でも、ownCloudにコミットしてもらってもいる。
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/73f882eb-4887-d82e-57cc-a0b0254c039c.png)

# 12. オープンソース活動の比較
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/de26f065-5c5b-0fe1-4c11-c78e4b5d1298.png)

# 13. ownCloudとNextcloudの機能の違い

# 14. Enterpriseの機能で Nextcloudに実装されたもの
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/17d60b94-9b4a-3a06-537a-99a9fea4238d.png)

# 15. Enterpriseの機能でNextcloudにないもの
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/cd190941-a4a9-e62c-a20e-b316f4e9fdf3.png)

# 16. ownCloud と Nextcloud のどちらを使うべきか
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/17dca4fa-65b9-57e9-54bd-b18cea301d56.png)
チューニング： インデックスに変更を加えずにルックアップ(キー参照)回数を減らす

クエリをチューニングする際、ボトルネックが大量のルックアップ（キー参照）にある場合、基本的なチューニングは「キー参照が発生しないようにカバリングインデックスを作成する」ことかと思いますが、カラム数が多いと容量の関係等でどうしてもインデックスをいじりたくないケースがあると思います。

ルックアップするときって、以下ABのいずれかのパターンかと思いますが、Bの場合はカバリングインデックスを作成しなくてもルックアップ回数を減らして高速化できることがあったので、その方法を紹介したいと思います。

A: 足りない述語を評価する

```sql
	SELECT
		Column1
	FROM
		SomeTable
	WHERE
		Column1 = 1
	AND Column2 = 2 -- ここを評価するためのルックアップをカットするためには、カバリングインデックスの作成が必要
```

B: SELECT句で指定された足りないカラムを取得する

```sql
	SELECT
		Column1
		,Column2 -- ここを取得するためのルックアップは、場合によってはルックアップ回数を劇的に減らせる
	FROM
		SomeTable
	WHERE
		Column1 = 1
```

以降は、Bパターンのルックアップに限定して考えてます。

# ルックアップの過剰発生を疑う

--サンプルテーブル
■ SomeTable1 (100万レコード)
　Column1が主キー
　Column1, Column2, Column3に複数列のインデックスが張ってある
　Column4-10はインデックスには含まれていないとする

■ SomeTable2 (100万レコード)
　Column1(SomeTable1との結合キー)
　ColumnA
 
```sql
	-- 問題のクエリ
	SELECT TOP (100) --上位100件取得
		 Column1
		,Column2
		,Column3
		,Column4
		,Column5
		,Column6
		,Column7
		,Column8
		,Column9
		,Column10
	FROM
		 SomeTable1
	LEFT OUTER JOIN SomeTable2 ON SomeTable1.Column1 = SomeTable2.Column1
	WHERE
		SomeTable1.Column1 = 1
	AND SomeTable1.Column2 = 2
	AND SomeTable3.Column3 = 3
	ORDER BY
		SomeTable2.ColumnA
```

2テーブルをJOINし、WHERE句でレコードを絞り込み、ソートをかけて上位100件のレコードを取得するクエリです。

実行プラン
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/148310/335d4523-7abf-15c0-5f2e-c3cdef465555.png)

実行プランをみると、プランの前半でルックアップ（キー参照）でSELECT句で指定したカラムを取得し、それも含めて全件ソートしてます。
最終的にレコードは最大100件とれればよいため、ルックアップも最大100件で済むはずなのにもったいないなぁと。。

# クエリを書き換えてルックアップを減らす
そこで、↓のようにクエリを書き換えます。

```sql
SELECT
	 B.Column1
	,B.Column2
	,B.Column3
	,B.Column4
	,B.Column5
	,B.Column6
	,B.Column7
	,B.Column8
	,B.Column9
	,B.Column10
FROM
(
	SELECT TOP (100) --上位100件取得
	-- 主キー(=ルックアップに必要な情報)と、ソートに必要な情報だけ取得
		 Column1
		,ColumnA
	FROM
		 SomeTable1
	LEFT OUTER JOIN SomeTable2 ON SomeTable1.Column1 = SomeTable2.Column1
	WHERE
		SomeTable1.Column1 = 1
	AND SomeTable1.Column2 = 2
	AND SomeTable3.Column3 = 3
	ORDER BY
		SomeTable2.ColumnA
) AS A
JOIN SomeTable1 AS B ON A.Column1 = B.Column1
ORDER BY
	ColumnA
```

サブクエリの中ではレコードの絞込みに必要なカラムだけを指定し、ルックアップをカットしています。絞り込んだあとのレコードに対して、同じテーブルをわざとJOINさせ、擬似的にルックアップを必要最小限の回数で実現しているところがポイントです。
実行プランが以下のように変化しました。
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/148310/69f91a77-3bc1-85a6-c5e4-f8df51c64b3b.png)


↓SQLServedrProfilerでクエリ変更前後の計測結果（上：変更前　下：変更後）
このケースだとそれなりに高速化でき、負荷も減っています。
![ｄｄｄ.jpg](https://qiita-image-store.s3.amazonaws.com/0/148310/66fe324a-3c1c-ef7c-0f57-f21b60e0b340.jpeg)


以上、わざとテーブルを追加でJOINさせることでルックアップ回数を減らし、クエリを高速化する方法でした。

このテクニックが有効なケースをまとめると
・キー参照が大量に発生していてボトルネックになってるが、容量等の問題でカバリングインデックスは作成したくない
・WHERE句の述語だけで絞り込んだ件数よりも、JOINして得られる最終的なレコード件数がかなり小さい
	
の2つを満たしているようなクエリであれば、試す価値があると思います！
※今回は分かりやすくするためにTOP(100)をつけて、最終的なレコード件数を無理やり100件に限定しています