OmniAICreator/Qiita-1.07M huggingface dataset:
Sierraアップデートに失敗し、macが起動できない問題

#状況
## 環境
mac OS: `El Capitan` 
で他のmacからXcode8.3.2のxipファイルをダウンロード。
しかしEl Capitanのため、Xcode.app(version8.3.2)を開けず、Sierraにアップデートしようとした。
この時点で残り容量6GB。Sierraのアップデートに必要な容量は4.9GB。

## アクション
いけるだと、と思ってアップデートのために再起動。
、、起動、、
、、カーネルパニック!?（黒背景にAppleロゴが表示されてる画面で白い文字がバーっと表示される状態）
ちーん。

# 対処
原因は容量のパンクと推定。
どうにかして不要なファイルを消して起動に必要な容量を確保したい。
起動方法は[Apple公式: Mac の起動時のキーコンビネーション](https://support.apple.com/ja-jp/HT201255)を参照した。

## やったことその１: セーフブート（セーフモードで起動)
電源を落とした状態で、**shift**キーを押しながら起動。
結果: 起動せず。

## やったことその２: NVRAMリセット起動
電源を落とした状態で、**⌘ option P R**キーの４つを押しながら起動。
カーネルパニックが起きたときの対処法らしい。
結果： 起動せず。

## やったことその３: mac OS復元から起動
電源を落とした状態で、**⌘ R**キーの２つを同時に押しながら起動。
結果: 起動成功。

###ディスクユーティリティからTerminalを起動
画面上部のツールバーから起動できる。
Terminalの基本操作はこの記事([Macでターミナルで使える基本のコマンド８選](http://qiita.com/kenju/items/77a2dc1b6a60697b1133))を参照してください。

### ディレクトリ移動
起動時のディレクトリを確認(`$ pwd`)すると`"/private/var/root"`という謎の場所にいる。
普段使っている`"/Users/[user-name]/Library"`らへんにアクセスしたい。
でも普段使っている`"/Users/[user-name]"`の実際のpathは`"Volumes/Macintosh HD/Users/[user-name]"`らしいので
一旦`"/"`まで一つずつ戻って(`$ cd ..`)、
それぞれのディレクトリに内包されているディレクトリを確認(`$ ls -al`)して`"Volumes"`を探す。
すると`"/"`の中に`"Volumes"`があるはずなので、そこに移動(`$ cd Volumes`)する。
`"/Volumes"`にてまた内包されているディレクトリを確認すると、`"Macintosh HD"`があるはずなので移動するが、ここで注意が必要。
Terminalではファイルやディレクトリにスペースなどの特殊文字が含まれる場合は`"\"`(バックスラッシュ)を使ってエスケープする必要があるので、`"Macintosh HD"`に移動する場合は、`$ cd Macintosh\ HD`と入力する。

### 不要なファイルを消す
あとは容量を食っているであろうファイル、ディレクトリを消しまくる。(`$ rm -rf [ディレクトリ名]`)
消す際は常にTerminalがどのディレクトリにいるのか確かめ(`$ pwd`)、細心の注意を払うこと。

今回は思い切ってXcode.appを消しました。推定容量10GB。
今回は時間がなかったため、確実にデカいのを１つ消した。
普通は溜まったキャッシュなどを消すのがおすすめ。

#### 容量の確認
`$ diskutil cs list`を実行すると、Macintosh HDのstatusが見れる
消す前の`Free Space`は94KBでした。（笑） そりゃ起動できないわ。。

### バックアップをとる
USBにファイルのバックアップをとることもできる。
USBのディレクトリpathは、`"Volumes/[USB名]"`になる。

### システム起動
ファイル操作が終わったTerminalを終了して、システム終了。
今度は普通に電源を入れて起動を待つ。
起動すれば成功。
しなければまたファイルを消しに行くか、諦めてApple storeに投げます。

以上です。
スクリーンショットがなくて申し訳ないです。焦っていて、それどころではありませんでいした。
再現できなくはないけどしたくはないです。（笑）

# まとめ
macの空き容量が少ない時の再起動は危険。
特に再起動を伴うOSアップデートなどを行うときは少なくとも10GBくらいの余裕をもたせておくこと。
日報強制Botを作った話

###はじめに
こんにちはT2です

最近は開発ディレクターという職種をやっています。
開発ディレクターとはざっと言うとプランナー、デザイナー、エンジニアなど
様々な職種を取りまとめて円滑に開発を進めていく役割になります。

他職種間でのコミニュケーションは自然のままにしておくとなかなか進まないどころか、
『あいつ何もしてない』とか『こちらのことを何も考えてくれない』だとか、憶測による対立を生みがちです。

そこで、Slackのチャンネルを用意して全職種を混ぜ込んだSlack日報
*Slackはpostに対するReaction
が非常に取りやすく、最近導入されたThreadや、絵文字のおかげでコミニュケーションツールとしてはかなりよろしいのではないかと思います。

を施工しようとしたのですが、その中で一点メンバーから要求がありました。
それは
”全員が必ず出すようにしてほしい”
というもの。

確かに日報というものは書く人は書くけど書かない人はとことん書かないもの。
あまりやりたくはなかったのですが、不公平感を減らすためにツールを使って一工夫してみました

*ちなみにnode.jsをやってみたかったのでnode製です。
*公開許可を取っていないので概念だけの説明になります。

##メイン部分

```js

//休みの日ならばスルー
if (isHoriday() == true)
{
  console.log("isHoriday end");
  process.exit(1);
}

//メイン処理
async.series([

//チャンネルに参加しているユーザを取得
(next) => {
  getUsers(()=>{

    next();
  });
},
//ヒストリから12時間以内に発言した人を取得
(next) => {
  getHistory(()=>{

    next();
  });
},

//発言しない人をとってslackにPost
(next) => {

　var unpubMembers = _.difference(channelMembers, publishedMembers);

  postSlack(unpubMembers);

  next();
}
], (err) =>{
});
```
基本の流れはこちらです
チャンネル参加者を取って
12時間以内の発言者を取って
差し引きして発言していない人を特定してSlackにPost

なお、非同期処理を同期的に扱うためにオススメされた
neo-asyncを使っています
https://github.com/suguru03/neo-async

###ヒストリの取得

発言ヒストリですが、
https://api.slack.com/methods/channels.history
にあるように

```js

  //ヒストリーの取得
  var date = new Date() ;
  var unixTimeNow = date.getTime() / 1000 ;
  //12時間前
  var oldest = unixTimeNow - 60 * 60 * 12;

  const URL = `https://slack.com/api/channels.history?token=${token}&channel=${channel}&oldest=${oldest}`;
```
こんな感じでアクセスするとjsonが帰ってくるので

```js
  var memberList = [];
  var messages = json['messages']

  messages.forEach(function(member) {
    memberList.push(member['user']);
  });

  //重複削除
  memberList = memberList.filter(function(x, i, self) {
            return self.indexOf(x) === i;
        });
  publishedMembers = memberList;
```
jsonをparseすれば取得できます

###Slackポスト

```
  var post = pattern[patternIndex]["text"];
  unPostMemberNameList.forEach(function(name) {
    post += `<@${name}> `
  });

  post += " (お休みの人は非対応ですm(_ _)m)"
  var encodedpost = encodeURI(post);
  var post_name = encodeURI(pattern[patternIndex]["name"]);
  var icon_url = pattern[patternIndex]["icon"];
  
  var url = `https://slack.com/api/chat.postMessage?token=${token}&channel=${channel}&text=${encodedpost}&icon_url=${icon_url}&link_names=true&username=${post_name}&pretty=1`;
  https.get(url, (res) => {
  }).on('error', (e) => {
    console.log(e.message); 
  });
```
SlackへのPostは上記のように、chat.postMessageAPIに
日報を出していない人の名前を練りこんでgetアクセスすればOKです

###できたもの
こちらをjenkinsに上げて時限実行すれば(cronサーバを持っていないのです...

パターン１
<img width="501" alt="dnogare.png" src="https://qiita-image-store.s3.amazonaws.com/0/8904/c3601ce6-e665-605d-0ee7-1d3f0e694f48.png">

パターン２
<img width="473" alt="hsuzu.png" src="https://qiita-image-store.s3.amazonaws.com/0/8904/ded3f5a2-0b3f-0b4b-fb3a-e8f4e2ffcb4f.png">

誰からのメッセージだと日報提出率が上がるか検証していきたいですね！
HTML5(.html)、Ruby(.rb)、html.erbファイルでのコメントの方法

##**html.erbファイル上でコメントを入力する方法**

###htmlでのコメント
htmlファイルでは
`<!-- 内容(複数行可能) -->`
・・・と入力することでコメントを残すことができます。

###Rubyでのコメント
Rubyのファイル(.rb)では
`# 内容（1行のみ）`

```
=begin
内容(複数行可能)
=end
```

```
__END__
以下、何行でもコメント。
※ただし、この方法だと他と違って文の色が変わらないため、コメントに見えなくて焦ることがある。注意。
```
・・・というような手法があります。

###本題 : html.erbでは？
では、Railsを使用してアプリを作る際によく作成することとなるhtml.erbにおいてのコメントの入力方法はどうなのかというと、どちらとも微妙に異なります。

```
<%#
内容(複数行可能)
%>
```
と、上記のようになります。
コメント一つとってもこれだけ打ち方が変わるので、「普段こう打ってたけどうまくいかないなぁ...」なんて時は、どこかで別の形式を使ってしまっている可能性があるので、改めて調べ直すようにしましょう。
Djangoのformからテキストのみを取得する．

階層は以下の通りになっています．

```
mysite(startproject)
  |__setting.py
  |__urls.py
  |__model.py
manage.py
db.sqlite3
blog(app)
  |__views.py
  |__urls.py 
  |__wsgi.py
```

ソースコードはviews.pyに書きます．
**form.cleaned_data**で**form内のテキストを取得**できます．この段階では**辞書型**になっており，キーがtextなので**form.cleaned_data['text']**で取得することができます．

```python:blog/views.py
def article_edit(request, pk):
    post = get_object_or_404(Article, pk=pk)
    if request.method == "POST": 
        form = ArticleForm(request.POST, instance=post)
        if form.is_valid():
                # loggingを用いてコンソールにデバッグメッセージを表示する．
                logging.debug(form.cleaned_data['text'])
                post = form.save(commit=False)
                post.author = request.user
                post.published_date = timezone.now()
                post.save()
                return redirect('article_detail', pk = post.pk)
     else:
        form = ArticleForm(instance=post)
    return render(request, 'blog/article_edit.html', {'form' : form})
```

デバッグメッセージが表示できない場合は以下を参照してください．

>Djangoのコンソールにデバッグのメッセージを出力する方法
>http://qiita.com/NoriakiOshita/items/7716c6e46338768467eb
実装例：PHPのnull合体演算子で「無かったら」の処理が簡単

## はじめに

配列を扱う際に、存在しないものを指定するとNoticeを吐いてしまう

そこでPHP7から追加されたNull合体演算子「??」が便利だった [PHP公式](http://php.net/manual/ja/migration70.new-features.php#migration70.new-features.null-coalesce-op)

利用できる場面が多そうなので自分のためにもまとめ

## 実装例1

__第一候補に無かったら第二候補をあたってみる__ みたいな使い方

下の例では__第一候補→第二候補→第三候補__であたっていく

```php

$a = [0=>'red',1=>'blue',4=>'green'];
$b = [2=>'yellow', 5=>'white'];
$c = [3=>'black'];

$all = [];
for ($i=0; $i<=5; $i++) {
    $all[$i] = $a[$i] ?? $b[$i] ?? $c[$i];
}

var_dump($all);
```

##### 出力結果

```php

array(6) {
  [0]=>
  string(3) "red"
  [1]=>
  string(4) "blue"
  [2]=>
  string(6) "yellow"
  [3]=>
  string(6) "black"
  [4]=>
  string(5) "green"
  [5]=>
  string(5) "white"
}
```

## 実装例2

__無かったらデフォルト値__みたいな使い方

今回はデフォルト値を0として、テストの点数の集計みたいな使い方
(例が悪いので精進します)

```php

$hanako = ['english'=>80, 'social'=>67];
$taro   = ['english'=>71, 'science'=>97];
$jiro   = ['social'=>55, 'english'=>60, 'mathematics'=>32, 'japanese'=>29];

$subjects = ['english', 'social', 'science', 'mathematics', 'japanese'];

$sums = [];
foreach ($subjects as $subject) {
    $sums[$subject] = ($hanako[$subject] ?? 0) + ($taro[$subject] ?? 0) + ($jiro[$subject] ?? 0);
}
var_dump($sums);
```

##### 出力結果

```php

array(5) {
  ["english"]=>
  int(211)
  ["social"]=>
  int(122)
  ["science"]=>
  int(97)
  ["mathematics"]=>
  int(32)
  ["japanese"]=>
  int(29)
}
```

## まとめ

* 今まで三項演算子を使って実現していたのがすごく簡潔にかけるようになった
* nullかどうか調べるのもissetを使わずにすぐやりたいことを書ける
* *いくつも繋げられるので楽(__可読性との天秤__)
カスタムメトリクス即時取得

# 目的
`mon-put-instance-data.pl`を使用しているインスタンスからAMIを作成すると、そのAMIから起動したインスタンスはキャッシュTTL(default:6h、AutoScalingGroup:24h) の間、AMIを作成したインスタンスIDをキャッシュしているため、新しく起動したインスタンスからデータ取得ができないので、即時取得できるようにする。

# 方法
`cloud-init`などuserdataで処理する

```bash
rm /var/tmp/aws-mon/instance-id
```
Javaの勉強 - 1

参考にするテキストに「i-モード」「J-フォン」とかあって
スマホ主流の2017年に大丈夫か？と、いきなり不安が。。。

そのあたりは気にしないことにする。

#準備
【エディタ】
CPad for Java2 SDK
※そのうちEclipseに変える。

#基本形
しばらくは↓を丸覚えでいいみたい。
進めながら徐々に内容を理解していく感じで。

```Yomogi.java
public class Yomogi{
    public static void main(String[] args){
        /* ココに何か書く */
    }
}
```

・ファイルの拡張子は「.java」。
・ファイル名とクラス名を一致させる。
　※今回だとYomogi
・大文字、小文字は区別される。
・行の終わりには「;」をつける。

くらいを気を付けていればとりあえずOK？

#文字列の表示
鉄板ネタの「Hello, world.」ってやつ。

```Yomogi.java
public class Yomogi{
    public static void main(String[] args){
        System.out.println("Hello, world.");
    }
}
```

文字列の表示は
・System.out.println("文字列")
他にprintもあるみたいだけど、また今度。

これを実行すると。

![pic002.JPG](https://qiita-image-store.s3.amazonaws.com/0/179949/8d5c79ec-580b-dd1c-9d00-42dd6731f406.jpeg)

表示されたのでOK。

今回はQiitaの練習も兼ねてるのでこれくらいで終了。
png画像とjpg画像の取り扱いの注意点


画像処理をするときに次元が合わないでエラーが解決できないことが何度かあった。
png画像とjpg画像はただ拡張子を変えればいい訳ではない。
基本的にjpgはRGBのカラー画像でpngは透過を加えたRGBAに勝手に変換されるイメージを持っていたがそうではない。


```py:
# -*- coding: utf-8 -*-                                                                                                                                       
import os
import cv2
import sys
import numpy as np
from PIL import Image

path_jpg = "CMP_facade_DB_base/base/cmp_b0116.jpg"
path_png = "CMP_facade_DB_base/base/cmp_b0116.png"

image = np.asarray(Image.open(path_jpg))
print(Image.open(path_jpg))
print(image.shape)
image = np.asarray(Image.open(path_png))
print(Image.open(path_png))
print(image.shape)

```


```:結果
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=804x1024 at 0x7F5933E60F90>
(1024, 804, 3)
<PIL.PngImagePlugin.PngImageFile image mode=P size=804x1024 at 0x7F5933E60FD0>
(1024, 804)
```


##pillowライブラリのmode一覧

```:mode
1 (1-bit pixels, black and white, stored with one pixel per byte)
L (8-bit pixels, black and white)
P (8-bit pixels, mapped to any other mode using a color palette)
RGB (3x8-bit pixels, true color)
RGBA (4x8-bit pixels, true color with transparency mask)
CMYK (4x8-bit pixels, color separation)
YCbCr (3x8-bit pixels, color video format)
Note that this refers to the JPEG, and not the ITU-R BT.2020, standard
LAB (3x8-bit pixels, the L*a*b color space)
HSV (3x8-bit pixels, Hue, Saturation, Value color space)
I (32-bit signed integer pixels)
F (32-bit floating point pixels)
```


で自分の画像で試してみるとpngもjpgも同じrgba modeになってる。


```:結果
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=826x1169 at 0x7F0DF1873F50>
(1169, 826, 4)
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=494x699 at 0x7F0DF1873ED0>
(699, 494, 4)
```

ということで変換を初めからする。


pngをP modeに変換

```py:
path_png = "0003.png"
path_jpg = "0003.jpg"
image = Image.open(path_png).convert('P')
image.save(path_png)
```

pngからjpgに変換する

```py:
rgb_im = Image.open(path_png).convert('RGB')
rgb_im.save(path_jpg)
```

似た感じの次元になった。

```:結果
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=826x1169 at 0x111215190>
(1169, 826, 3)
<PIL.PngImagePlugin.PngImageFile image mode=P size=826x1169 at 0x111215210>
(1169, 826)
```

```:やりたい次元
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=804x1024 at 0x7FA58C2E0F90>
(1024, 804, 3)
<PIL.PngImagePlugin.PngImageFile image mode=P size=804x1024 at 0x7FA58C2E0FD0>
(1024, 804)
```




#ソース

```py:
# -*- coding: utf-8 -*-
import os
import cv2
import sys
import numpy as np
from PIL import Image

path_png = "0002.png"
path_jpg = "0002.jpg"

image = Image.open(path_png).convert('P')
image.save(path_png)
rgb_im = Image.open(path_png).convert('RGB')
rgb_im.save(path_jpg)

print(image)
print(rgb_im)
print(np.asarray(image).shape)
print(np.asarray(rgb_im).shape)

```
PycharmのインタプリタとしてDockerコンテナのpythonを使用する


こんにちはsekitakaです。

本番だけでなく、ローカル開発環境のPycharmのRunコマンドでもプログラムをDockerコンテナ上で実行できるといいですよね。
本番と同じ環境のDockerコンテナが使用できればハマりも減ることでしょう。

今回はPycharmのインタプリタをDockerコンテナ上のpythonにする方法の紹介です。

# 設定方法
## python実行環境のイメージを取得する
コンテナに使用するイメージを取得してます。今回は例なのでDocker Hubのpython3環境を使っているだけです。
実際は使用するイメージをそれぞれの開発に最適化されたイメージにするのがベストです。

```bash
docker pull python:3
```

## 設定確認
Preferences > Pluginsで`Docker integration`が有効になっていることを確認してください。

## Pycharmのインタプリタ設定をDockerのものにする
Preferences > Project > Project Interpreter で Project Interpreterの右側のボタンを押し、`Add Remote`を選択します。
![pycharm_docker1.jpg](https://qiita-image-store.s3.amazonaws.com/0/18273/a018fc94-932d-cd77-9f99-57ffa17c268d.jpeg "pycharm_docker1.jpg")

表示されるダイアログでリモートインタープリターのタイプをDockerを選択し、`Image name` を 先程pullした`python:3`を選択します。
![pycharm_docker2.jpg](https://qiita-image-store.s3.amazonaws.com/0/18273/284a75f7-5063-a903-0aae-6802fd12a614.jpeg "pycharm_docker2.jpg")

するとProject Interpreterの選択肢に、いま作成したDockerがインタープリターとして選択できるようになるので、選択します。
![pycharm_docker3.jpg](https://qiita-image-store.s3.amazonaws.com/0/18273/1594ed8f-56fe-b93b-3080-cac3a6219487.jpeg "pycharm_docker3.jpg")

これで設定は完了です。
試しにバージョンを表示するプログラムを実行すると以下のように、Docker上のpythonが動いている事がわかります。


![pycharm_docker4.jpg](https://qiita-image-store.s3.amazonaws.com/0/18273/b303ff1d-b2d7-106f-71b6-aad1c335470d.jpeg "pycharm_docker4.jpg")

# まとめ
DockerもIDEと統合される事でより開発の効率化ができますね。
Docker自体の使い方にそれほど詳しくなくても開発を開始できる環境になるので、複数人で開発するプロジェクトでは重宝しそうです。
5分でデスクトップ版のSlackにDark Themeを適用する

# 追記
2019年1月現在でも問題なく適用できることを確認しています。

# はじめに
Slackのデフォルトのテーマ設定で嬉々としてDarkに変えてもバックグラウンドは真っ白・・・
DarkTheme好きにとってはさぞがっかりでした。
そこで手荒くDarkThemeを適用するためのハックです。自己責任で楽しんでください。

## 動作環境

MacOS 10.12.4
MacBook Pro 13-inch, 2016
Slack App 2.6.0
## 適用手順
まずはFinderから右クリックでSlackのパッケージの内容を表示させます。
![スクリーンショット 2017-05-08 13.01.02.png](https://qiita-image-store.s3.amazonaws.com/0/12096/4388f465-14d6-eea2-ac35-e7816d5fb3a5.png)

あとはこの下記のパスにある`ssb-interop.js`を適当なエディタでひらき
`Contents/Resources/app.asar.unpacked/src/static/ssb-interop.js`

下記のコードを貼り付ける

```ssb-interop.js
document.addEventListener('DOMContentLoaded', function() {
 $.ajax({
   url: 'https://cdn.rawgit.com/laCour/slack-night-mode/master/css/raw/black.css',
   success: function(css) {
     $("<style></style>").appendTo('head').html(css);
   }
 });
});
```

これで完了です。
あとはSlackを再度立ち上げ直せば終わりです。

至って簡単に導入することができました。

すてきなDarkThemeライフを！
Android Studio上でライブラリの新しいバージョンがリリースされていないかチェックする

当然出来るんだろうな〜と思いつつ、やり方をずっと調べていなくて知らなかったのでメモ
ライブラリを全部いっぺんに最新にすることも可能です

# やり方
メニュー -> 「Analyze」 -> 「Run Inspection by Name...」からInspectionダイアログを表示させます

![スクリーンショット 2017-04-11 11.33.15（2）.png](https://qiita-image-store.s3.amazonaws.com/0/129872/6d42eee8-e7ea-be4c-b13c-9823a0ea7c0d.png)

「Newer Library Versions Available」と入力します（補完が効くので途中まででおｋです）

![スクリーンショット 2017-04-11 11.33.45（2）.png](https://qiita-image-store.s3.amazonaws.com/0/129872/1987b5de-e00a-e58d-c3e5-bb420a0f9eb5.png)


「Run 'Newer Library Versions Available'」 ダイアログ上で「Whole project」選択します

![スクリーンショット 2017-04-11 11.34.18（2）.png](https://qiita-image-store.s3.amazonaws.com/0/129872/84589f00-8b3c-5ee1-b7c3-51148837b966.png)

OKで実行です！Android Lintが走るので正座して待ちます
走査が完了するとInspection Resultに結果が表示されるのでライブラリバージョンの差分を眺めながらふむふむなるほど、、とつぶやきます

![スクリーンショット 2017-04-11 11.39.14（2）.png](https://qiita-image-store.s3.amazonaws.com/0/129872/9a990ff1-61b3-338a-47d8-c7c4b031483e.png)

全てアップデートしてよいならInspection Resultの「Android Lint Quick Fixes」ボタンをクリックすると全ライブラリがアップデートされます。
個別のライブラリを選択すれば「Fix it」ボタンが出るので個別にアップデートも可能です

# 注意点
TOPレベルのbuild.gradleに記述しているdependenciesは検査対象ではない（？）ようで、Realmプラグインなんかはチェックから漏れていたのでご注意下さい。
Cognos リストの合計行を先頭に配置する

##概要
Cognos BIやAnalyticsで、合計などの集計機能を使用すると、以下のように集計行は下部に表示されます。
下記の例だと、アメリカの集計行は、アメリカの各製品ライン行の下に表示されています。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/75da0328-2f29-394f-4a31-0ae82cc4756d.png)

とあるプロジェクトで、こんな感じに集計行はどうしても先頭に表示したいのだ、という要件があり、ちょっと無理やり実装したやりかたです。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c252dcca-0f4e-f3ea-2e69-1d7822ff6243.png)


##実装方法
まず、クエリーエクスプローラーでクエリーは以下の構造です。
リスト自体は、「Union結果」クエリーを使用していて、各クエリーには、「国」「製品ライン」「数量」のデータアイテムが配置されています。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a594fc95-7c80-2798-8037-bd055fb5649a.png)

ポイントとしては「国レベルファクト」のクエリーで、「製品ライン」のデータアイテムをこんな感じに、' ' で書き換えてます。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8b8fc324-4c18-7d09-03a1-c30dbfc67a59.png)

国でグループ化して、製品ラインでソートして、「製品ライン」「数量」列の本体に、条件付きスタイルで、「製品ライン」=' ' の場合に、背景色・前景色を変更しています。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2860f869-991a-9138-b3c4-c8b874991d3c.png)

という感じで実行すると、こんな表示になります。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/545779e9-5e2f-a81b-a0a3-cb224db428fb.png)

苦肉の策感満載ですが、ご参考まで。
もっと素敵なやり方あるかも知れないので、Tips持ってる方は是非教えて下さい。

#参考
こちらに別の手順を投稿しました。こっちの方がかっこいいです。
**Cognos Analytics リストでL字型段落表示**
https://qiita.com/shinyama/items/40d56177ea03f1d9917c
perlでHTMLを超簡易暗号化してみる

#超簡易HTML暗号化
とりあえず、読む気をなくすようなHTMLを出力するのをperlで作成しました。

入出力はUTF-8で動作しますが、use utf8; はしないで下さい。

ブラウザーの標準機能で復号化をしますので、復号に時間はかかりません。
英語サイト等ASCIIだけで構成されるサイトには全く意味をなしません。
しかし、マルチバイトの文字を使用するサイトには、とても有用です。

```perl:htmlencrypt.pl
sub htmlencrypt {
	my ($s)=@_;
	utf8::decode($s);
	$s =~ s/([^\s\!-\~])/'&#'.ord($1).';'/eg;
	$s=~s/\&\#65279;//g;
	$s=~s/&#199#19979;/&#19979;/g;
	$s=~s/[\t\r\n]//g; #おまけでタブ改行削除
	$s;
}
```

##どんなHTMLができるの？

http://sennoka.s500.xrea.com/

うちの個人サイトですが、こんなHTMLが出るとお考え下さい。

一部抜粋してみました。

```HTML:index.html
<meta property="og:site_name" content="&#25126;&#12398;&#28023;&#36042;&#32207;&#21512;&#12487;&#12540;&#12479;&#12505;&#12540;&#12473;">
<meta property="og:title" content="&#25126;&#12398;&#28023;&#36042;&#32207;&#21512;&#12487;&#12540;&#12479;&#12505;&#12540;&#12473;">
<title>&#25126;&#12398;&#28023;&#36042;&#32207;&#21512;&#12487;&#12540;&#12479;&#12505;&#12540;&#12473;</title>
<meta name="keywords" content="&#12475;&#12531;&#12494;&#12459;,&#25126;&#12398;&#28023;&#36042;,&#25126;&#12398;&#28023;&#36042;&#32207;&#21512;&#12487;&#12540;&#12479;&#12505;&#12540;&#12473;">
<meta name="description" content="&#25126;&#12398;&#28023;&#36042;&#12398;&#12487;&#12540;&#12479;&#12505;&#12540;&#12473;&#12391;&#12377;&#12290;wiki&#12391;&#12399;&#12391;&#12365;&#12394;&#12356;&#23554;&#38272;&#12469;&#12452;&#12488;&#12394;&#12425;&#12391;&#12399;&#12398;&#26368;&#26032;&#12289;&#35443;&#32048;&#24773;&#22577;&#12434;&#25552;&#20379;&#12375;&#12390;&#12356;&#12414;&#12377;&#12290;">
<meta property="og:description" content="&#25126;&#12398;&#28023;&#36042;&#12398;&#12487;&#12540;&#12479;&#12505;&#12540;&#12473;&#12391;&#12377;&#12290;wiki&#12391;&#12399;&#12391;&#12365;&#12394;&#12356;&#23554;&#38272;&#12469;&#12452;&#12488;&#12394;&#12425;&#12391;&#12399;&#12398;&#26368;&#26032;&#12289;&#35443;&#32048;&#24773;&#22577;&#12434;&#25552;&#20379;&#12375;&#12390;&#12356;&#12414;&#12377;&#12290;">
```

##注意事項
-各種デバッガーを通すと、読めるようになってしまうことがあります。例）Facebookデバッガー
-明らかにファイルサイズが増えます。gzip後も増えます。
CentOS7にNVidiaのドライバーを入れたいが、nouveauドライバーがどうしても居座る時

#参照
CentOS7におけるNVIDIAドライバのインストール方法
http://blog.livedoor.jp/rootan2007/archives/52090548.html

CentOS 7にNVIDIA GeForce GTX TITAN Xを導入
http://qiita.com/mpkato/items/3a9428f408e7e15d0a1b

#blacklistに登録してもnouveauがロードされてしまう٩( 'ω' )و

上記参照サイトを元に、blacklist登録やnouveauをカーネルイメージから削除等、色々やってみたけどダメダァァ
という方は以下も試してみてください

##Grub2の設定変更

```vim:/etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet rdblacklist=noveau
```

最後に
rdblacklist=nouveau

を追加するだけです。
追加した後はgrub2-mkconfigコマンドで設定をアップデートしてください

`grub2-mkconfig -o /boot/grub2/grub.cfg`


UEFIブートの場合は多分、UEFIブート環境の場合は /boot/efi/EFI/<OSの名称>/grub.cfg 辺りにファイルがあると思います。
AndroidでJava 8を使う (2017年版)

これまでAndroidでJava 8の言語機能を使うには[Retrolambda](https://github.com/orfjackal/retrolambda)かJackを用いる必要がありました。
今年の3月にGoogleは[Jackを廃止するアナウンス](https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html)をし、従来のjavac + dxツールチェーン上でJava 8をサポートする方針に切り替えました。
Android Studio 2.4 Preview 4以降ではJackが廃止され、新しい方法でJava 8の言語機能がサポートされています。

以下はまだプレビュー版での情報ですが、正式版に組込まれればJava 8への移行がよりしやすくなるはずです。

## ツールチェーンの変更

2.4 Preview 4以降では、標準のjavacツールチェーンにdesugarというツールを挟むことでJava 8の言語機能を利用可能にしています。

- 標準の javac  + dxツールチェーン:  
  **javac**（`.java` → `.class`）→ **dx**（`.class` → `.dex`）
- Jack ツールチェーン:  
  **Jack**（`.java` → `.jack` → `.dex`）
- 2.4 Preview 4で導入されたdesugar ツールチェーン:  
  **javac**（`.java` → `.class`）→ **desugar**（`.class` → `.class`）→ **dx**（`.class` → `.dex`）


Gradleでビルド(assembleDebug)してみると以下のタスクが実行されるのがわかります。

    :app:extractJava8LangSupportJar
    :app:transformClassesWithDesugarForDebug

desugarを使ったツールチェーンでは、Java Bytecode(classファイル)が生成されるためJacocoやTransform APIを使ったInstant Runなどが使えます。
またData Bindingとも併用できます。


## ビルトインのJava 8を使う手順

### Android Studio 2.4 Preview 4以降をインストールする

Android Studio 2.4 Preview 4以降でGradleのAndroid Plugin 2.4.0-alpha4以降(2017-05-08時点では2.4.0-alpha7)を使います。
安定版のAndroid Studio 2.3以前に作成したプロジェクトを開くと、プロジェクトの`build.gradle`をアップデートするように促されます

```groovy:build.gradle
buildscript {
  ...
  dependencies {
    classpath 'com.android.tools.build:gradle:2.4.0-alpha7'
  }
  ...
}
```

なお、Gradleのバージョンが古いままJava 8を使おうとすると以下のようなエラーが出力されます。

    Error:Jack is required to support java 8 language features. Either enable Jack or remove sourceCompatibility JavaVersion.VERSION_1_8.

### Javaソースコードの互換性をJava 8に設定する

アプリモジュール側の`build.gradle`を更新します。
ここはJackやRetrolambdaを使っている場合と同じです。

```groovy:build.gradle
android {
  ...
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
  ...
}
```


## サポートされるJava 8の言語機能

Android Studio 2.4 Preview 7時点で以下の言語機能がサポートされています。

- ラムダ式
- メソッド参照
- タイプアノテーション
- デフォルトおよび静的インターフェースのメソッド (minSdkVersion 24以上)
- 反復アノテーション

Jackと同じ感じですね。

その他、API Level 24以降で`java.util.stream`などいくつかのJava 8のAPIがサポートされます。
(minSdkVersion 24未満でStream APIを使うには[Lightweight-Stream-API](https://github.com/aNNiMON/Lightweight-Stream-API)や[streamsupport](https://github.com/streamsupport/streamsupport)を使いましょう)
同意にチェックしたら送信できるようにするjQuery

こんな感じです。

![agree.gif](https://qiita-image-store.s3.amazonaws.com/0/42231/2783496a-c2a0-f2ab-11cd-11d48d04e95e.gif)

```html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>sample</title>
<style type="text/css">
input[type="submit"][disabled] {
    background: #ccc;
    cursor: default;
}
input[type="submit"] {
	cursor:pointer;
    text-align:center;
    padding:10px 20px;
    color:#fff;
    border:none;
    background:#59bb0c;
	border-radius:5px;
}
</style>
</head>
<body>
<input type="checkbox" id="agree"> <label for="agree">同意する</label>
<input type="submit" id="send" value="送信">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript">
$(function() {

	if(!$("#agree").prop('checked')) {
		$('#send').prop('disabled', true);
	}

	$('#agree').on('click', function() {
		if ($(this).prop('checked') == false) {
			$('#send').prop('disabled', true);
		} else {
			$('#send').prop('disabled', false);
		}
	});

});
</script>
</body>
</html>
```
Vagrant 1.9.4でVMが起動しない場合の対処方法（Windowsのみ？）

#はじめに

Mastodonを動かしてみようとVagrantで環境を立ち上げようとしたら、はまったので情報共有です。
なお、タイトルにあるようにWindowsだけの問題かもしれません（MacやLinuxはないので未確認）

#起こってたエラー

VMが起動して、SSH接続しようとしているところで「Warning: Connection reset. Retrying...」→「Forcing shutdown of VM...となります。

Warningなのに強制終了はおかしいだろと調べたところ、

[Vagrant up forces shutdown of VM · Issue #8520 · mitchellh/vagrant](https://github.com/mitchellh/vagrant/issues/8520)

というIssueがありました。

要約すると、「捕まえるべき例外を捕まえていないから終了フローに行く。例外捕まえるようにしたら直った」ということだそうです。

#対処方法

1.9.5では直ったの入れるとのことですが、まだ出ないようです。
すぐにどうにかしたいという人は[joelhandwellさんのコメント](https://github.com/mitchellh/vagrant/issues/8520#issuecomment-297792410)を参考に、en.yml, errors.rb, communicator.rbをダウンロードして

- C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/templates/locales/en.yml
- C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/lib/vagrant/errors.rb
- C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/plugins/communicators/ssh/communicator.rb

を置き換えます。これでvagrant upできます。

#余談

これでVMは起動するのですが、MastodonのVagrantfileは失敗します。理由はboxに入ってるGuest Additionsのバージョンが古くて共有フォルダのマウントができないため。

共有フォルダをマウントできるようにしてもWindowsだとシンボリックリンクが張れなくてうまくいかないそうです。私は、

[Windowsホストのvagrantでmastodonを動かす - 王様の耳は驢馬の耳(別館)](https://argrath.ub32.org/annex/2017/04/24-01.html)

を参考に、gistをいただきMastodonを動かしました。
Windows の Chrome 59 で Web Speech API に Microsoft Haruka がやってくる

Chrome で [Web Speech API](https://developer.mozilla.org/ja/docs/Web/API/Web_Speech_API) を使って日本語を読み上げさせるとき、 [`speechSynthesis.getVoices()`](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesis/getVoices) の戻り値から `lang` が `ja-JP` のものを選ぶという方法があります。

Windows で Chrome 58 では ja-JP が「Google 日本語」一択だったのですが、まだベータ版の Chrome 59 にしたところ「Microsoft Haruka Desktop - Japanese」が現れ、それが配列中で「Google 日本語」よりも前にありました。

Haruka さんは、Google 日本語さんよりも声に落ち着きがあり、音量がやや控えめです。

mac で開発してると Haruka さんは入ってこないので全くこの現象に気づかないのですが、Windows ユーザーから突然「声が変わった」「声が小さくなった」などと言われた場合には、これが原因の可能性があります。
Java Servlet(サーブレット)がよくわからないので

# Java Servlet(サーブレット)って？
サーバ上でウェブページなどを動的に生成したりデータ処理を行うために、Javaで作成されたプログラム及びその仕様である。単にサーブレットと呼ばれることが多い。
・・・だそう。

勝手な自分の解釈だけど、
・jqueryのajaxでphpを呼ぶようなもの？
・aspxファイルとcsファイルのような関係？
と思ったので
「jspファイルとサーブレットっていう関係」
かな？
PRのdiff/patchがブラウザで簡単に見れた

こんな感じに👇PRの下の方に「ProTip！」ってでてくるじゃないですか。

<img width="524" alt="スクリーンショット 2017-05-08 10.50.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/61073/0b097054-3e58-6587-9599-3ae3b6d8c25b.png">

PRのアドレス👇に
`https://github.com/org_name/repo_name/pull/1`

`.diff`ってつけると、
`https://patch-diff.githubusercontent.com/raw/org_name/repo_name/pull/1.diff?token=TOKEN`

`.patch`ってつけると、
`https://patch-diff.githubusercontent.com/raw/org_name/repo_name/pull/1.patch?token=TOKEN`

にリダイレクトして、diffの内容が見れることに気づいた。
PRが大きくなり過ぎて、表示に時間がかかる時にサクッと表示できて便利みたい。

## 追記
@tadsan さんから
> 本領は[`git am`](https://git-scm.com/docs/git-am)で適用できるパッチを簡単に作れることですね ヾ(〃＞＜)ﾉﾞ

とご指摘いただきました。ありがとうございます。
`git am`使ったことなかったので[5.3 Git での分散作業 - プロジェクトの運営](https://git-scm.com/book/ja/v1/Git-%E3%81%A7%E3%81%AE%E5%88%86%E6%95%A3%E4%BD%9C%E6%A5%AD-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E9%81%8B%E5%96%B6)を読んでみた。
パッチの運用もっと使っていけば幸せになれそう。
WRF / NetCDF > Tool > ncview: 画像を確認できる

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

WRFの処理結果(NetCDF形式の)ファイルを可視化しようとしたが、ツールの名前を度忘れした。

`ncview`
だった。

```
$ which ncview
/usr/bin/ncview
```

http://meteora.ucsd.edu/~pierce/ncview_home_page.html
Chromium Embedded Framework (CEF) の利用方法

Chromium Embedded Framework (CEF) とは、Google Chrome の表示部分だけを抜き出したフレームワーク。他のアプリに埋め込んで使う。Chromium Project では HTML 表示エンジン Blink をそのまま使うよりも CEF を使う事を推奨している。Chromium が更新されると CEF もバージョンに追従して更新される。CEF は Chromium 本体から作られるので、まともにやるとビルドに何時間もかかる。そこで、Spotify 社が提供するビルド済ライブラリを使うのがお薦めの利用法だ。

https://bitbucket.org/chromiumembedded/cef-project を参考にサンプルプロジェクトのビルド手順をやってみた。16.04.1 LTS 利用。

準備

    sudo apt-get install -y build-essential gtk2.0 libgtk2.0-dev libgtkglext1-dev

ダウンロード

    git clone https://bitbucket.org/chromiumembedded/cef-project.git
    cd cef-project/
    mkdir build
    cd build
    cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ..

この手順で http://opensource.spotify.com/cefbuilds/index.html からビルド済 CEF バイナリをダウンロードする。バイナリのバージョンは CMakeLists.txt に記載。

ビルド

    make -j4 cefclient cefsimple

実行

    ./third_party/cef/cef_binary_3.2924.1570.g558741c_linux64/tests/cefsimple/Release/cefsimple

Spotify が提供していない環境以外で CEF を使うにはライブラリのビルドが必要。 https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding#markdown-header-automated-method の手順でやってみたが今のところ

    ../../chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_controller.cc:84: error: undefined reference to 'safe_browsing::SettingsResetPromptController::ShowSettingsResetPrompt(Browser*, safe_browsing::SettingsResetPromptController*)'
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

というエラーが出て失敗してしまった。
Eclipse作業時の備忘録

# 「モジュール名が無効です」
## 現象
warファイルをエクスポートしようとしたところ「モジュール名が無効です」と出て次に進めない
## 解決方法
プロジェクトを右クリック→[プロパティ]→[プロジェクト・ファセット]→[動的 Web モジュール]にチェック
## 理由
warファイル出力は、[Webプロジェクト]に与えられた機能のため、上記設定の[動的 Web モジュール]にチェックすると、該当プロジェクトを[Webプロジェクト]として認識する

## 参考
■ Eclipseのエクスポートから、warファイルを出力できない
http://diaryruru.blog.fc2.com/blog-entry-43.html
gopher-lua で簡易 AWS Lambda っぽいものを作ってみる

net/http で起動しているウェブサーバーに Lua で記述された関数を登録し、URL経由で登録した関数を呼び出せるようにしてみます。

登録するLuaの関数には、実装の都合上、以下の制約を設けます
1. 関数名は `lambda` とする
2. 関数は返り値を1つ返す

## 実装
Lua の関数を動的に登録するので goroutine を使い、その中でLua関数を呼び出します。
関数の呼び出しは channel で行います。

```go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"strconv"

	"github.com/yuin/gopher-lua"
)

type httpRequest struct {
	W http.ResponseWriter
	R *http.Request
}

var (
	count      = 1 // 登録されたプロセス数
	processMap = make(map[string]chan httpRequest)
)

const (
	retNum   = 1        // 登録されるLuaスクリプトの返り値の数
	funcName = "lambda" // Luaスクリプトに登録される関数名
)

func execLuaProcess(w http.ResponseWriter, r *http.Request) {
	processNum := r.URL.Path[len("/lua/exec/"):]
	ch, ok := processMap[processNum]
	if !ok {
		fmt.Fprintf(w, "不明なプロセス番号です: %s", processNum)
		return
	}

	ch <- httpRequest{w, r}
	<-ch // Luaプロセスの完了を待つ
}

func registerLuaProcess(w http.ResponseWriter, r *http.Request) {
	L := lua.NewState()
	// defer L.Close() // TODO: どこで Close するのが適切か調べる

	luaScript, err := ioutil.ReadAll(r.Body)
	defer r.Body.Close()
	if err != nil {
		w.WriteHeader(http.StatusInternalServerError)
		fmt.Fprintf(w, "%v", err)
		return
	}

	if err := L.DoString(string(luaScript)); err != nil {
		w.WriteHeader(http.StatusBadRequest)
		fmt.Fprintf(w, "%v", err)
		return
	}

	fn := L.GetGlobal(funcName)
	ch := make(chan httpRequest)

	go func() {
		for {
			httpReq := <-ch

			if err := L.CallByParam(lua.P{
				Fn:      fn,
				NRet:    retNum,
				Protect: true,
			}); err != nil {
				httpReq.W.WriteHeader(http.StatusInternalServerError)
				fmt.Fprintf(httpReq.W, "%v", err)
				ch <- httpReq
				continue
			}

			// 関数の返り値を取得する
			ret := L.Get(-1)
			L.Pop(1)

			fmt.Fprintf(httpReq.W, "Luaプロセスが %v を返しました", ret)
			ch <- httpReq
		}
	}()

	processMap[strconv.Itoa(count)] = ch
	fmt.Fprintf(w, "luaプロセスを %d 番に登録しました", count)

	count++
}

func main() {
	http.HandleFunc("/lua/register/", registerLuaProcess)
	http.HandleFunc("/lua/exec/", execLuaProcess)

	http.ListenAndServe(":8080", nil)
}
```

### 実行結果

- Lua 関数を登録する

```
$ curl -X POST localhost:8080/lua/register/ -d 'lambda = function() return "hoge" end'
luaプロセスを 1 番に登録しました

$ curl -X POST localhost:8080/lua/register/ -d 'lambda = function() return math.random(1, 100) end'
luaプロセスを 2 番に登録しました
```

- 登録した関数を呼び出してみる

```
$ curl localhost:8080/lua/exec/1                                                                  
Luaプロセスが hoge を返しました

$ curl localhost:8080/lua/exec/2
Luaプロセスが 82 を返しました
```

URL ごとに異なる関数が呼ばれていることが確認できました。

### その他
実装の都合上、関数名と返り値を固定しましたが gopher-lua では ast が触れるみたいなので、関数名や返り値の数などは動的に取得できるかもしれません(未確認)
Windowsのコマンドプロンプトでtouchコマンド

# Windowsのコマンドプロンプトでtouch

結論から言うと、なんか日本語で検索したときに出てくるtouchでは不十分なので、とりあえず新しいものを作ったというのが今回の内容です。
ソースコードは下。

## touchがほしい

Linuxとかにあるtouchコマンドは、主に以下の挙動で使われているかと思います。

* `touch FILE` でFILEが存在しない場合は空ファイルの作成。
* 存在する場合は更新日時を変更。

これ何に使うの？っとかあるかもしれませんが、プログラマーにはちょっとした作業とかビルドイベント周りであると便利なコマンドです。

で、これはWindowsのコマンドプロンプトにはなく、上の作業を行ってくれる仮コマンドを作るということを、Microsoftが公式で記事にしています（サポート対象外になってますが、恐らくこれが発信源であるらしいことが書いてある）。

https://support.microsoft.com/ja-jp/help/69581/updating-the-date-and-time-stamps-on-files

これによると、copyコマンドをバイナリで追加にして、読み込むファイルに対し空データを追加で書き込めば、ファイルの更新時間が書き換わるよね！っという理屈らしいです。

では、これを利用して、ファイルが存在しないときにはファイルを作る処理を入れて作り、実際に挙動を見てみます。

```
@echo off
if %1. ==. goto end
if not exist %1 (
	type nul > %1
) else (
	copy /b %1 +,, > nul
)
```

# 挙動の確認

フォルダの構造です。

* A/
    * B/
    * touch.bat

Bフォルダにcdし、実際に挙動を確認しましょう。

次の手順です。

* touchでb.txtを作成
* touchで..\a.txtを作成
* touchで..\a.txtを更新

```
>touch b.txt
>dir
A\B のディレクトリ
2017/05/08  09:26    <DIR>          .
2017/05/08  09:26    <DIR>          ..
2017/05/08  09:26                 0 b.txt
2017/05/08  09:26               101 touch.bat
>touch ..\a.txt
>dir
\A\B のディレクトリ
2017/05/08  09:26    <DIR>          .
2017/05/08  09:26    <DIR>          ..
2017/05/08  09:26                 0 b.txt
2017/05/08  09:26               101 touch.bat
>dir ..
\A のディレクトリ
2017/05/08  09:28    <DIR>          .
2017/05/08  09:28    <DIR>          ..
2017/05/08  09:28                 0 a.txt
2017/05/08  09:26    <DIR>          B
A\B>touch ..\a.txt
A\B>dir
\A\B のディレクトリ
2017/05/08  09:30    <DIR>          .
2017/05/08  09:30    <DIR>          ..
2017/05/08  09:28                 0 a.txt
2017/05/08  09:26                 0 b.txt
2017/05/08  09:26               101 touch.bat
```

なんと！上の階層に作ったa.txtが、b.txtと同じ階層にありますね！！！ふざけんなこら！！！！

## なにこれ

どうやら、コマンドプロンプトのcopyでは書き込み先がない場合は同じ階層にあると仮定して動作（コピー）するということらしいです。

つまり同じ階層なら

* b.txtが存在している。
* b.txtを読み込んで空データを追加して、今の階層のb.txtに書き込もう。

で同じ階層じゃないなら

* ..\a.txtは存在している。
* * ..\a.txtを読み込んで空データを追加して、今の階層のa.txtに書き込もう。

っという挙動となります。

これではちゃんとtouchできないので、改良します。

# 新touch

以下が新touch.batです。

```
@echo off
if %1. ==. goto end
if not exist %1 (
	type nul > %1
) else (
	copy /b %1+,, %1 > nul
)
```

今回のcopyは「ファイルに対して空データを追加したものをファイルに書き込む」みたいな内容です。
とりあえずこれで一つ上の階層でもちゃんとtouchができます。

# その他

コマンドプロンプトはちゃんと勉強してない上にする気もないので、上の内容だと大きいファイルとかだとあんまりよくない気もしてるんですが、そこらへんは特に実験してません（とりあえず自分で使う範囲ではこれで十分なので）。

もしコマンドプロンプトに詳しい方がいたら、さらに改良してもらえるととてもうれしいです。

# 最後に

ふぁっきゅーコマンドプロンプト

# 参考

* https://support.microsoft.com/ja-jp/help/69581/updating-the-date-and-time-stamps-on-files
* http://gabekore.org/windows-touch-command
自分がやってるjQueryのソースを少しでも読みやすくする書き方

# みんな！ jQuery書いてるかな！

* 2017年にもなってお前まだjQueryの話するのかよっていう話もあるかと思いますが、まぁ広いインターネットの世界、いろんな人がいます。
* へーきへーき！フレンズによってとくいなことちがうから！

## level 0 出発点

```javascript
$('#id').on('click', function(){
  //何か処理
});
```

* どこにでもある誰にでも書ける書き方。
* ちょうわかりやすい。
* このコードはもう保守したくない。

## level 1 分離

```javascript
/**
 * 何かの処理
 */
function someMethod(event){
  //何か処理
}

/**
 * 何かの処理2
 */
function someMethod2(event){
  //何か処理2
}


$('#id').on('click', someMethod);
$('#id2').on('click', someMethod2);
```

* 関数定義とイベントバインディングを分離
* 関数に名前がつくことで「何の処理をバインドしているのか」が明確になる（someMethodでは台無しだが
* また、イベントバインディングを一カ所にまとめることで、どこに何のイベントがセットされているかも明確になる。
* イベントバインディングを一時的にコメントアウトしたいときにも便利
* デバッグのトレースに関数名が表示されるのが便利

```javascript
//level 0:
$('#button').on('click', function(){
  var a = 1;
  var b = a + c;//cが未定義なのでエラーを起こす
});
```
![2017-04-28_12h14_24.png](https://qiita-image-store.s3.amazonaws.com/0/37007/6e214e2d-030e-3c62-31ad-468065225524.png)

```javascript
----------------------------------------------
//level 1:
function someMethod(){
  var a = 1;
  var b = a + c;//cが未定義なのでエラーを起こす
}

$(function(){
  $('#button').on('click', someMethod);
});
```
![2017-04-28_12h13_09.png](https://qiita-image-store.s3.amazonaws.com/0/37007/7432922c-2fc2-9445-ed5d-f1d98181d4da.png)

* 再利用できるのが便利
* 少しめんどくさいのが不便。だけどちゃんと考えて名前を付けて！　最悪`clickButton`でも無いよりマシ。

## level 2 処理単位でさらに分離

```javascript
function SomeMethodGroup(){
    var self = this;
    self.someMethod = function(){
      //何か処理
    }
}
function AnotherMethodGroup(){
    var self = this;
    self.someMethod = function(){
      //何か処理
    }
}
var someMethodGroup = new SomeMethodGroup();
var anotherMethodGroup = new AnotherMethodGroup();

$('#id').on('click', someMethodGroup.someMethod);
$('#another_id').on('click', anotherMethodGroup.someMethod);
```

* 多分この例では分かりづらいと思う。 
* そもそもモジュール化しろよとかマサカリ飛んできそう（jQuery利用者だぞ
* jQueryの場合はイベントハンドラ内のthisがトリガー要素となるので、それを使わないのであれば、ES2015でclass化した方がすっきりすると思う。
* この分離の単位の感覚を覚えると、コンポーネント化する時にも移行しやすい。と思う。
* まるっと処理を置き換えるときとかに楽。
* 例えばONボタンとOFFボタンがあってーみたいな2つのイベントでワンセット、みたいなときに、そのセットがコードに落とされているというか。

```javascript
function ButtonGroup(){
    var self = this;
    self.on = function(){
      //何か処理
    }
    self.off = function(){
      //何か処理
    }
}
function AnotherMethodGroup(){
    var self = this;
    self.someMethod = function(){
      //何か処理
    }
}
var buttonGroup= new ButtonGroup();
var anotherMethodGroup = new AnotherMethodGroup();

$('.on').on('click', buttonGroup.on);
$('.off').on('click', buttonGroup.off);//この2つはひとまとまりなんだな、みたいな。

```

* みたいな。
* ButtonGroupとAnotherMethodGroupにまたがる処理はどうするかというと、またがる用の処理を作ります。

## まとめ

これ以上のレベル上げは危険。というのも、jQueryでもできることはある、ただし、jQueryに出来ないことは無い！という思想になると多分悪い方向に向かう。物事にはそれに適したやり方、というものがある。
level2まで上げても破綻するようであればそろそろjQuery以外の選択肢を考慮する時。

ライブラリ等をインストールするわけではなく、ファイル単位での「書き方」を変えるだけなので、いますぐに、どこにでも導入できます。jQueryのソースがとっ散らかっててよく分からねぇ、という人は試してみてください。
Flaskでファイル名をflask.pyにするとImportError: cannot import name 'Flask'が出る

Pythonで簡単にWEBアプリケーションが作れるフレームワークFlaskを使うとき、ファイル名を「flask.py」にするとライブラリが読み込めないというエラーが出たので、珍しそうなエラーだったので、メモ。


```python:flask.py
from flask import Flask
```

``ImportError: cannot import name 'Flask'``になってFlaskが読み込めない。ファイル名を変えると直る。
grepコマンド使い方

grepコマンドを使うときいつもググってしまうのでメモ。随時追加
###grepコマンドを使う

```
$ grep (オプション) (検索ワード) (対象ファイル、ディレクトリ)
```
####オプション

| オプション | 概要 |
|----|----|
| ``-r`` | 特定ディレクトリ以下を再帰的に検索する<br>指定したディレクトリより下の階層を全て<br>検索してくれます |
| ``-n`` | パターンに一致した行のファイル内での行番号を<br>表示す検索ワードがファイルのどの行かわかる<br>のでより詳細に知ることができます |
| ``-i`` | 大文字と小文字を区別しない<br>検索範囲に入らないなどの取りこぼしを防げます |
Vultr 調べてみた(VPSを選ぶなら一番?お得)

* http://www.vultr.com/?ref=7167342 から登録してくれると私に $10 入ります。

* 読み方: ヴァルチャー
* クーポン: https://www.vultr.com/coupons/
* 東京リージョンあり。
* ここ1ヶ月くらいで価格帯と性能が改善された。
* サポートの質も良いとの噂。(ただし英語での問い合わせになる。)
* 中くらい?の信頼性
* クレジット先払い?

`$2.5`で この性能はお得！！

![spec.png](https://qiita-image-store.s3.amazonaws.com/0/25728/92e9853d-04aa-1fc0-f4e3-d8547c237de4.png)

1時間単位

![spec-hours.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d53f0027-5b27-856b-fa48-05720300f5ae.png)

クレジットを買ったら今なら倍 ($100ドルまで)

![cupon.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3d7c9fba-76b5-c92a-95b4-e853a6bc8e28.png)
Gitのオプションことはじめ

#Gitのオプションことはじめ
自分の備忘録を兼ねて、Gitのコマンドオプションについて概要を記述します。

###git config --global alias.(alias-name) (git-command)
新規でエイリアスを作成する。

###git add -p
対話モードでステージングセッションを開始する。
より細かい単位でステージングを実現させる。
![スクリーンショット 2017-05-08 7.27.59.png](https://qiita-image-store.s3.amazonaws.com/0/158622/cf867c34-25a3-8f27-b204-43b574360843.png)

###git commit -a
変更があったファイルをステージングせずに、直接コミットする。
ただし、変更対象にあるファイルに限定されるため、新規追加ファイルはコミットされない。

###git commit -m "(comment)"
エディタを起動させずに、コミットを行う。

###git commit --amend
直前のコミットに、ステージされた変更を結合する。
何もステージされていなければ、コミットログの編集のみを行う。

###git log --oneline
ログの内容を一行で表示させる。

###git checkout -b (branch)
ブランチを新規作成後、そのブランチにチェックアウトする。
git branch (branch-name) + git checkout (branch-name)

###git reset --soft
コミット：直前の内容に一致させる
ステージ：変更なし
ワーキングディレクトリ：変更なし

###git reset
コミット：直前の内容に一致させる
ステージ：リセットされる
ワーキングディレクトリ：変更なし

###git reset --hard
コミット：直前の内容に一致させる
ステージ：リセットされる
ワーキングディレクトリ：リセットされる

###git clean -f
追跡対象外のファイルを削除する。

###git clean -df
追跡対象外のファイル/フォルダを削除する。

###git branch -d (branch)
ブランチを削除する。

###git push (remote) :(branch)
リモートブランチを削除する。

###git merge --no-ff (branch)
常にfast-fowardを行わず、マージコミットを作成する。

###git rebase -i (base-commit)
対話モードで、現在のブランチを(base-commit)にリベースする。
rebase + コミット順番の変更

###git remote -v
接続させているリモートブランチの一覧のURLを表示する。

###git pull --rebase (remote)
ローカルブランチをリモートブランチにリベースする。

##参考
https://www.atlassian.com/ja/git
http://qiita.com/fnobi/items/ec036c1b5d7ee5a8517c
Go から Microsoft Azure を利用する


# 概要
[Microsoft Azure](https://azure.microsoft.com/) をプログラムから利用する場合 .Net が一般的な選択肢だと思われるが，
あえて Go から利用する方法について調べた．

# Microsoft Azure SDK for Go
"go azure" で検索すると見つかる公式の SDK が [Microsoft Azure SDK for Go](https://github.com/Azure/azure-sdk-for-go) と [Azure Storage SDK for Go](https://github.com/Azure/azure-storage-go/) である．後者は前者のうち storage に関する API だけを切り離したもので，今後は別リポジトリとして開発されるそうだ．

公式 SDK のため，基本的にはこれらを使えれば良いのだが，まだ preview 版であり未実装の API が多い．個人的には，Azure Storage SDK for Go は必要な機能は揃っていたが，それ以外は別の方法を探した方が良いと感じた．

余談だが，Microsoft Azure SDK for Go は一つの操作 Foo に対して Foo, FooPreparer, FooResponder, FooSender と４つの関数がセットで定義されているのだが，後ろの３つはパブリックにする必要はあるのだろうか？補完やドキュメント検索がごちゃごちゃするのだが・・・．

# Azure REST API Specifications
[Azure REST API Specifications](https://github.com/Azure/azure-rest-api-specs) は REST API 定義書を管理している公式のリポジトリである．
こちらの方は，ほぼ全ての API を網羅していると思われる．
REST API 定義書さえあれば，[Swagger](http://swagger.io/) を使って Go 用のパッケージを自動生成できる．

試してみたところ，現状は Microsoft Azure SDK for Go を使うよりもこちらの方が良いと思われる．

REST API 定義書から Go 用のパッケージを生成するには，[go-swagger](https://github.com/go-swagger/go-swagger) を用いる．

```
$ go get -u github.com/go-swagger/go-swagger/cmd/swagger
```

例えば，compute API に関するパッケージを生成する場合，

```
$ swagger generate client \
	-f https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-compute/2016-04-30-preview/swagger/compute.json \
	-t compute
```

のようにする．

ただし，Azure REST API Specifications のバグか Swagger 実装のバグか分からないが，
swagger コマンドがエラーを出す場合がある．その時は，他のバージョン（日付）でうまく行くものがないか調べて対応する．
Visual Studio / WPF > object > 03 sender是什么 > senderに基づく処理

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

03 sender是什么
https://www.youtube.com/watch?v=VnaZpOif8DU&t=182s&list=PLaYqF7AnyNPfTfZiGqTwedIKW_FkZv4Xj&index=3

button2_Click()のsenderを使った例。
2:00ころから。

試してみた。

```MainWindow.xaml
<Window x:Class="_170508_t0715_sender.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170508_t0715_sender"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Button1" Click="Button_Click"/>

    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _170508_t0715_sender
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Button btn = (Button)sender;
            btn.Content = "Clicked";
        }
    }
}
```

ボタンクリック前。
![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/be788366-f37e-8fd1-7263-e7c687d6dab6.png)

ボタンクリック後。
![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5f56ca7c-8269-58e5-d89f-71a9c673b051.png)

### 補足事項

「senderが何か」に基づいて処理を分岐するというのはC++ Builderでもよく使った。

senderに基づく共通処理を実装して、複数のコントロールでのClickイベントにその共通処理を割り当てる、というような使い方。

### 中国語

sender是什么
http://cjjc.weblio.jp/content/%E4%BB%80%E4%B9%88

是什么 (shi・shén・me)
意訳「sender。これ何ですか?」
Visual Studio / WPF > link | YouTube > LearningEnter Yu > 电脑教程 NET系列 WPF基础(第三季) 主讲老师：杨中科

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

Visual Studio / WPF関連の動画を探して以下を見つけた。
https://www.youtube.com/playlist?list=PLaYqF7AnyNPfTfZiGqTwedIKW_FkZv4Xj

- 利点
  - 1つ15分程度なので、気軽に見ることが出来る
  - コードの部分が拡大表示されていて見やすい
- 難点
  - 中国語が分からない

英語や日本語での上記利点を持ち合わせる動画は今のところ見つかっていない。
Uruduの動画はときどき見ているが、１つの動画が長いため気軽に見るということができない。
windowsでTensorFlow その15

#概要
windowsのTensorFlowの環境で、OpenAiやってみた。
OpenAi の'CartPole-v0'のプログラムを比べてみた。
300ゲームのグラフ。

#'pd'の場合

![pd.png](https://qiita-image-store.s3.amazonaws.com/0/18104/c0157677-9f14-dc10-7cbf-894b45bd38ab.png)

tensorflowは無し、PD制御。
魔法の数字を掛けるだけ。

#'openai1'の場合

![op1.png](https://qiita-image-store.s3.amazonaws.com/0/18104/f2f36e13-5567-ab08-3106-70ad775f91d9.png)
学習してないよね。
プレイスホルダ3つ

#'openai4'の場合
![op4.png](https://qiita-image-store.s3.amazonaws.com/0/18104/d2f05886-6f5d-5d65-3b25-a250e084b163.png)
学習してないよね。
プレイスホルダ4つ

#'openai7'の場合

![op7.png](https://qiita-image-store.s3.amazonaws.com/0/18104/cac9b335-e60c-6b9f-1a24-14ccc213c836.png)
優秀。
プレイスホルダ3つ

#'openai12'の場合
![op12.png](https://qiita-image-store.s3.amazonaws.com/0/18104/e2626f6f-3fd0-309c-fa20-471937d28652.png)
速い。
プレイスホルダ5つ


#'openai13'の場合
![op13.png](https://qiita-image-store.s3.amazonaws.com/0/18104/e1a3ea68-fa32-6a20-ad70-49e1dab7fb97.png)
学習してないよね。
プレイスホルダ3つ

#'openai16'の場合
![op16.png](https://qiita-image-store.s3.amazonaws.com/0/18104/b979957c-1864-ae13-954c-5ac596ef71fe.png)
遅い。
プレイスホルダ4つ
Visual Studio / WPF > IDE > regionによるXAMLの折り畳み領域の指定

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

Windows Presentation Foundation (WPF) Application Development
https://www.youtube.com/watch?v=XuNTq-1Lu50&t=715s
5:20ころからXAMLにおいて`<!--#region MyRegion-->`と`<!--#endregion-->`を追加している例がある。
これにより、記載した範囲を折り畳み可能にするようだ。
コードの可読性を高めることが可能になる。

試してみた。

`#region`を指定すると左側に折り畳み可能マークが表示されるようになった。
![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/15487006-54fe-e205-1a3e-06b65e9228b6.png)

以下は折り畳んだ状態。
![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/61a3ffa4-23c3-1af2-de5b-749aa45eaab2.png)

### 補足事項

`<!-- #region MyRegion -->`のようにコメントマークの前後に空白があると、折り畳み可能にはならない。
`<!--#region MyRegion-->`のようにすること。
技術英語 > Each emitter and receiver features [a 5 mm recessed window]

EZ-SCREEN LS Safety Light Screen
Simple, Rugged Safety Light Curtains: LS Series
https://www.bannerengineering.com/us/en/products/machine-safety/safety-light-curtains/simple-rugged-safety-light-curtains-ls-series.html

> Each emitter and receiver features **a 5 mm recessed window** and is protected against impact by a 3 mm thick aluminum housing and metal end caps

https://www.merriam-webster.com/dictionary/recess
> 3 :  a hollow cut or built into a surface (as a wall) 

上記の意訳 「各々のemitterとreceiverは5mm厚さの埋込み式ウィンドウを持つ。emitterとreceiverは3mm厚さのアルミニウムのハウジングと金属のend capsにより、耐衝撃用保護がされている。」

<hr>
recessは景気後退のrecessionで目にしたことはある。
物理的な「後退」として「埋込み式」というのは初めて見た。
実行計画？？統計情報？？って人へ

# はじめに
新人研修でSQLがカリキュラムに組み込まれている場合、ほとんどがSQLの構文のみをスコープとしていて、RDBMSのアーキテクチャまで踏み込むことは少ないと思います。
本記事では、SELECT、INSERT、UPDATE、DELETEしか教わってないけど、現場に配属されてたら「実行計画を取ってゴニョゴニョ」「あ～統計情報が古いから取り直してゴニョゴニョ」みたいな依頼をされた人へ向けて、超簡単に説明します。
※RDBMSの世界は奥が深いのでここでは概要のみに留めます。

# RDBMSの基本的なアーキテクチャ
RDBを使った開発では、ほとんどの現場でOracle、SQL Server、MySQL、DB2、PostgreSQLあたりが利用されています。これらのDBのアーキテクチャは、細かな違いこそあれど基本的なところは同じだったりします。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/23101/c54ee156-4195-317a-3755-a76127526f68.png)

今回は、「実行計画？？統計情報？？って人へ」ということで、そのあたりに関係のあるクエリ評価エンジンについて軽く触れてみようと思います。

# クエリ評価エンジン
まずクエリ評価エンジンとは、実行されたSQL(クエリ)を最初に受け取る機能で、実行されたSQLを解釈してどのような手順で記憶装置のデータ(上記図で言うところのデータベース)にアクセスしにいくかを決定します。

# SQLの実行の流れ
SQLの実行の流れは大まかに以下のようになります。

![１無題.png](https://qiita-image-store.s3.amazonaws.com/0/23101/ad3970c0-2b67-f4fd-4831-4a65c4019a68.png)

### パーサー
実行されたSQLの構文解析(パース)を行い、RDBMSが処理しやすい定型的な形式に変換します。これには以下2つの理由があります。

1.　SQL文の整合性チェック
実行されたSQLが常に正しいとは限りません。例えば、SQLを書いた人がカンマを付け忘れていたり、Fromを書き忘れていたり、、、等があったりします。こういったSQLをまずはこの段階で実行エラーとする必要があります。

```sql:カンマの付け忘れ.sql
SELECT
		USER_ID
		USER_NAME
FROM
	USER
```


```sql:Fromの書き忘れ.sql
SELECT
		USER_ID
	,	USER_NAME
USER
```

2.　後続処理の効率化
実行されたSQL文を定型的な形式に変換することで、RDBMS内部の後続の処理が効率化されます。

### オプティマイザ
無事パーサーを通過したSQL文はオプティマイザに送られます。ここで、最適なデータアクセス方法(実行計画)が決定します。この処理がRDBMSにおけるコアとなる部分です(頭脳なんて表現のされた方をします)。オプティマイザは、複数のアクセス経路、インデックスの有無、データの分散や偏りの度合い、RDBMSの内部パラメータなどの条件を考慮して、コストを評価し選択可能な多くの実行計画を作成します。

##### 実行計画とは
どのようにテーブルに対して検索を行なうかが書かれた、SQLの実行手順書のようなものです。そのため、SQLのパフォーマンスは実行計画によって大きく左右されます。

### カタログマネージャ
オプティマイザが実行計画を作成するうえでオプティマイザに重要な情報を提供するのがカタログマネージャです。カタログとはRDBMSの内部情報を集めたテーブル群で、テーブルやインデックスの統計情報が格納されています。そのため、このカタログの情報を単に「統計情報」とも呼びます。

##### 統計情報とは
表やインデックス、使用している領域、データの種類、データの分布等のデータ特性を表す情報のことです。RDBによって若干異なりますが、統計情報には主に以下の情報が含まれます。

* 各テーブルのレコード数
* 各テーブルの列数と列のサイズ
* 列値のカーディナリティ(値の個数)
* 列値のデータ分布(どの値がいくつあるかのヒストグラム)
* 列内のNULLの数
* インデックス情報

##### 実行計画と統計情報の関係
実行計画と統計情報の大まかな関係は以下のようになります。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/23101/e3ccbd22-0b19-def9-d738-e8efe6e3d5a3.png)

オプティマイザは統計情報をもとに実行計画を作成します。注意したいのは、実際のデータベースの情報をもとに実行計画を作成するのではなく、統計情報をもとに実行計画を作成する、という点です。つまり、テーブルに対してデータの登録・更新・削除が行われたのに、統計情報が最新化されていないと、オプティマイザは古い情報をもとに実行計画を作ろうとします。そのため、ある時点では最適な実行計画が選ばれSQLのパフォーマンスも問題なかったが、データの登録・更新・削除が頻繁に行われるにつれてSQLのパフォーマンスが劣化していく、といったケースがよくあります。これを回避するには、テーブルのデータに大きな更新が入ったら併せて統計情報も最新化する必要があります。

### プラン評価
オプティマイザが複数の実行計画を立てたら、それらを受け取って最適な実行計画を選択するのがプラン評価の処理です。

こうして1つの実行計画に絞り込まれたあとに、それをもとにRDBMSはデータアクセスを実行します。

# 参考
[SQL実践入門 高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus) ](
https://www.amazon.co.jp/SQL%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80%E2%94%80%E2%94%80%E9%AB%98%E9%80%9F%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-WEB-DB-PRESS-plus/dp/4774173010)