OmniAICreator/Qiita-1.07M huggingface dataset:
Python > fileIO > ディレクトリの削除 > [run6123_sphere_g16_m1.5] や [run6124_sphere_g16_m1.5]

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

ファイルを含むフォルダの削除を行う。

### 参考

- [[Python]ファイル/ディレクトリ操作](https://qiita.com/supersaiakujin/items/12451cd2b8315fe7d054#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%89%8A%E9%99%A4)
- [How do I remove/delete a folder that is not empty with Python?](https://stackoverflow.com/questions/303200/how-do-i-remove-delete-a-folder-that-is-not-empty-with-python)


### 削除対象ディレクトリ

- コード(ADDA)実行のたびにインデックスやパラメータなど異なる名前を持つディレクトリが生成される
    - 例: run6123_sphere_g16_m1.5
    - 例: run6124_sphere_g16_m1.5
- 削除対象ディレクトリには複数のファイルが含まれる
    - 例: CrossSec-Y
    - 例: log
    - 例: mueller

### code

```test_rmdir_171216.py
import glob
import shutil


def delete_directories():
	res = glob.glob("run*")
	for elem in res:
		shutil.rmtree(elem)
		print(elem)


delete_directories()

```

```txt:run
$ python3 CODE_171216_Euler/test_rmdir_171216.py 
run6123_sphere_g16_m1.5
run6122_sphere_g16_m1.5
```

上記２つのディレクトリが削除されていることを確認した。
[VBA]クラスを定義する（ちょっと応用）


VBAでのクラス定義の基礎はこちらhttps://qiita.com/Kamo123/items/a4c7749fa30d8f68df28

##デフォルトプロパティを設定する
デフォルトプロパティとは、``Range``オブジェクトの``Value``プロパティなど、プロパティを省略すると取得されるやつです。

自作クラスに設定してみます。

元のクラスとして、以下の``Person``クラスを考えます。

```vbnet:Person(クラスモジュール)
Option Explicit

' プロパティ
Private Name As String

' メソッド
Public Sub SayHello()
    MsgBox "Hello, I'm " & Name & "!"
End Sub

' プロパティプロシージャ
Property Get MyName() As String
    MyName = Name
End Property

Property Let MyName(namae As String)
    If namae = "" Then
        ' 氏名がブランクならエラー
        Err.Raise 10000, , "名前がブランクです"
    End If

    Name = namae
End Property
```

まず、この``Person``クラスをエクスポートします。（プロジェクト エクスプローラからドラッグ&ドロップでできます。）

次に、エクスポートした.clsファイルをテキストエディタで開いて、デフォルトにしたいプロパティの先頭行に```Attribute Value.VB_UserMemId = 0```と入れます。


```vbnet:clsファイル
Property Get MyName() As String
    Attribute Value.VB_UserMemId = 0
    MyName = Name
End Property
```

これでインポートしなおしますと、見た目は変化はありませんが、たしかにデフォルトプロパティに設定されています。

```vbnet:標準モジュール
Sub test1()
    Dim p As Person
    Set p = New Person
    p = "taro"
    Debug.Print p   ' => "taro"
End Sub
```

##For Eachで回せるようにする

セルをたくさん入れて管理できるクラスを考えます。

```vbnet:CellManager(クラスモジュール)
Option Explicit

Public Cells As Collection

Private Sub Class_Initialize()
    Set Cells = New Collection
End Sub

Public Sub Add(newCell As Range)
    Cells.Add newCell
End Sub

Public Function Item(Index As Long) As Range
    Set Item = Cells(Index)
End Function

Public Function NewEnum() As stdole.IUnknown
    Set NewEnum = Cells.[_NewEnum]
End Function
```

``NewEnum``というのを定義するのが肝です。
このように、``For Each``で回したいものを``Collection``に入れておき、自作クラスの``NewEnum``の中で``Collection``の``_NewEnum``を呼び出します。

このクラスモジュールをエクスポートしてテキストエディタで開きます。

```vbnet:clsファイル
Public Function NewEnum() As stdole.IUnknown
Attribute NewEnum.VB_UserMemId = -4   ' この行を追加した
    Set NewEnum = CellCollection.[_NewEnum]
End Function
```

こんな感じで```Attribute NewEnum.VB_UserMemId = -4```を追加します。
保存後、インポートすると``For Each``で使えるようになります。

```vbnet:標準モジュール
Sub test1()
    Dim cm As New CellManager
    Dim c As Range
        
    Range("A1").Value = "A"
    Range("A2").Value = "B"
    cm.Add Range("A1")
    cm.Add Range("A2")
        
    For Each c In cm
        Debug.Print c.Value
    Next
End Sub
```

```text:出力
A
B
```

なぜか変数cがVariant型でなくてもコンパイルエラーになりませんが、チェックできていないだけのようです。（追記：この部分、誤解していました。コメント欄を参照ください）

Intellisenseで``NewEnum``が見えてしまうのが気持ち悪いですが、VBAではどうしようもないです。

##参考サイト
日本語情報でVBAの深いところまで解説しているサイトが少ない中、大変貴重な情報源です。
http://thom.hateblo.jp/entry/2015/02/16/003000
http://d.hatena.ne.jp/miau/20110203/1296706824
Fargate の監視についての考察

この記事は [AWS Fargate Advent Calendar 2017](https://qiita.com/advent-calendar/2017/aws-fargate) の16日目の記事です。

# 概要
AWS Fargate の登場により、EC2インスタンスやそのクラスタを意識せずともコンテナが実行できるようになりました。AWSさん曰く、”コンテナをデプロイする最も簡単な方法”ということです。すごいですね。一方で、コンテナを本番環境に導入すると"9ヶ月でコンテナ数が5倍に増加する"や"仮想マシンより9倍早く縮退するようなライフサイクルで利用される"といったレポート[^1] もありますので、より流動的になるインフラに対して運用時の可視性を確保するためにFargateのモニタリングについて考えてみました。

# AWS Fargate で利用可能なモニタリング
AWS FargateはこれまでのAmazon ECSと同様にCloudWatch Logs と CloudWatch Eventsをサポートしているので、awslogsを通じてアプリケーションやミドルウェアのログはCloudWatch Logsに転送することが可能で、Fargate タスクの状態変化はCloudWatch EventsのトリガとしてSNSトピックやLambda関数を実行できます。
CloudWatch メトリクスは非常にシンプルで、ECSではクラスタ単位のメトリクスをモニタしていましたが、それがサービス単位のCPUとメモリのメトリクスのみになります。

# Fargate 運用の可視性を確保するための要素
システム上で起こりうるあらゆる事象に対して可視性を確保するうえで、必要なデータを 5W1H的な分類で整理してみると以下のようになります。WHATはグラフ化できるような数値データ、WHYはログや状態を示すイベント、HOWはアプリケーションのトランザクショントレース(APM, Application Performance Monitoring)として、WHENとWHEREについては基本的にモニタリングのデータは時系列データでありタグ等のメタデータが付属するため共通するものなので割愛してます。( 例えば、この分類で車の運転のモニタリングを考えると、WHATは速度などの計器類のデータ、WHYはドライバーの操作ログ、HOWはドライブレコーダー、という感じです。どれが欠けても事故の調査は難しくなるし、全部無い=モニタリングしない、を想像すると恐ろしいですねw )

|Fargateの <br> モニタリング|WHAT|WHY|HOW|
|:---|:---|:---|:---|
|データのタイプ|メトリクス|ログ|トレース|
|対応サービス|CloudWatch <br> (メトリクス)|CloudWatch <br> Logs, Events|<font color="Red">(なし)</font>|
|データの種類|<font color="Red">CPU, mem</font>|アプリ, ミドル|(なし)|
|データの粒度|<font color="Red">サービス単位</font>|サービス単位, <br> タスク単位|(なし)|

さてこうしてみると、Fargateがコンテナ環境のモニタリングにおいてトレースをサポートできていないのは痛いなぁと思うのと同時に、AWSのことだから割とすぐにX-RayがFargateをサポートするんだろなー...とか想像できます。[^2]
また、ログのサポートが整っている一方で、メトリクスはCPUとメモリだけでディスクI/OやネットワークI/Oが無い、サービス単位だけでタスク単位では見られない、などまだ手薄感がありますが、こちらは今時点はECSのモニタリングの仕組みを流用してるからかなー、Docker Stats API のFargate版みたいなのすぐ出ますよねぇ？とか思うわけです。[^3]

# まとめ：Fargateはどうモニタリングするか
モニタリングのプロセスを分けて考えると、データ収集と保存-->可視化-->アラート-->分析-->ナレッジの蓄積、という感じになると思いますが、各プロセスについて以下のように対応を進めるのが良いかと思っています。

|Fargateの <br> モニタリングプロセス|対応サービス|メモ|
|:---|:---|:---|
|データ収集と保存|CloudWatch, <br> Events, Logs|ログも忘れず収集する|
|可視化|CloudWatch <br> Dashboard|意外と使われていない気がするけど <br> 便利なので使ったほうがいいと思う|
|アラート|CloudWatch|Eventsも併用する|
|分析|CloudWatch <br> Dashboard|作り込めば問題分析に使えるので <br> やはり使ったほうがいいと思う|
|ノウハウの蓄積|(なし)|ポストモーテム用にDashboardの時間が <br> 固定できればいいのになぁ|

BIツールやELKスタックを利用することがかなり普及していて重要なデータを可視化することが良いとは良く知られていると思いきや、モニタリングデータの可視化はそれほど重要視されていない気がしてやった人のみぞ知る、、、となっている気がするので、手近なところでCloudWatch Dashboardは取り組んで見る価値が十分あるんじゃないかなと思います。[^4]



<hr>
[^1]: [「Docker採用の驚くべき8つの事実」](https://www.datadoghq.com/docker-adoption/) Datadogが毎年実施しているユーザー調査レポートです。コンテナのライフサイクルの短縮は毎年進んでいます。
[^2]: これについては、本当に何も知らず想像で言っていますが、、多分そうなるでしょう。
[^3]: Datadogは Fargateのローンチパートナーで3rdパーティのモニタリングツールとして[Fargateのリリース](https://aws.amazon.com/jp/blogs/news/aws-fargate-a-product-overview/)時に紹介されていますが、実際このAPIが無いとdocker-dd-agentがうまく仕事出来ないので困るのです。このAPIが出た際は記事を更新します。
[^4]: 可視化含めてモニタリングプロセスの劇的な改善をするのがDatadogの強みなのでご興味ある方は["無償トライアル"](https://www.datadoghq.com/)へGo！！,,,ご清聴ありがとうございました。
OpenCVのcv::MatをHello, world的に使ってみる

画像処理ライブラリOpenCVを使いこなせるようになりたいので、簡単に使ってみました。
OpenCVのc++ライブラリでは、根幹をなすcv::Matという行列クラスがあるので、Hello, World的にそのインスタンスを生成するコードを書いてみました。

今回は手元のMac (バージョン10.11.6、El Capitan) で動かしました。

## OpenCVのインストール

```
brew install opencv
```

以下のディレクトリにOpenCVがインストールされました。

```
/usr/local/Cellar/opencv/3.3.1_1
```

## 行列を定義し、単位行列と掛け算するコード

以下のようなコードを書き、`hellocv.cpp`として保存します。

```c++
#include <iostream>
#include <opencv2/core/core.hpp>

int main(int argc, char* argv[])
{
    cv::Mat m1 = (cv::Mat_<double>(3, 3) << 0, 1, 2, 3, 4, 5, 6, 7, 8);
    cv::Mat e = cv::Mat::eye(3, 3, CV_64F);
    cv::Mat res = m1 * e;
    std::cout << res << std::endl;

    return 0;
}
```

このコードで、`m1`は3 x 3 の正方行列で、各要素はdouble型であり、以下のような値が格納されます。

```math
\left(
\begin{matrix}
0 & 1 & 2 \\
3 & 4 & 5 \\
6 & 7 & 8 
\end{matrix}
\right)
```

また、`e`は3 x 3の単位行列です。これも`CV_64F`の指定によりdouble型としています。

```math
\left(
\begin{matrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right)
```

`res`は`m1`と`e`の掛け算なので、`m1`と同じ結果が返ってきます。  
それをコンソールに出力します。

## 動作確認

ビルドして、動作確認してみます。  

以下のように、`-I`、`-L`、`-l`に適切なパスやファイル名を与えて、必要なインクルードファイルやライブラリファイルが読み込まれるようにしてビルドします。

```sh
gcc -I/usr/local/Cellar/opencv/3.3.1_1/include -L/usr/local/Cellar/opencv/3.3.1_1/lib -ohellocv -lopencv_core -lstdc++ hellocv.cpp 
```

実行してみます。

```sh
$ ./hellocv 
[0, 1, 2;
 3, 4, 5;
 6, 7, 8]

```

期待通り、`m1`と同じ行列が出力されました。
Amazon Product Advertising API を使って kakaku.com の価格一覧表示をしてみたい

# 環境/前提

OS レベルで環境依存はしていないと思いますが、Cygwin や Mac OS X でも動くと思いますが、自分は VMWare 上の Ubuntu を使っています。言語は Ruby。gem などが動いていることが前提となります。

# 事前準備

## Access Key ID と Secret Access Key
AWS Identity and Access Management（IAM）の Access Key ID と Secret Access Key が必要です。以下を参考に、まずアクセスキーを作成してください。

- http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html

Access Key ID と Secret Access Key はファイルで落とせるので保存しておいてくといいと思います。

## アソシエイトID を作成

次に、アソシエイトIDを作ります。アフィリエイトなどいらないのですが、作っておいたほうがいいようです。詳しくは以下に。

- https://affiliate-program.amazon.com/

## ruby gem をインストール

Amazon Product Advertising API は別に難しい API ではないので Ruby の追加パッケージ無しでも使えますが、せっかくあるので amazon-ecs を使います。Linux 系ならインストールは以下のとおり。ほかの sudo がいるかいらないか程度の差だと思います。

```sh
$ sudo gem install amazon-ecs
```

# 商品を検索してみる

上記準備がすべて成功したっぽかったら以下のようにコードを書いてみる。Amazon::Ecs.options は上記で準備したもの。Amazon::Ecs.item_search では検索したい商品名やジャンルなどを入れます。自分はアメリカにいるので :country => 'us' になっていますが、日本の amazon 商品を見たければ jp とか入れればいいとおもいます。

```rb
require 'amazon/ecs'
 
Amazon::Ecs.options = {
    :associate_tag     => 'philosong-20', 
    :AWS_access_key_id => 'XXXXXXXXXXXXXXX', 
    :AWS_secret_key    => 'XXXXXXXXXXXXXXX'
}

res = Amazon::Ecs.item_search(
    'EOS 5Ds R',
    :browse_node    => '3017941',
    :response_group => 'ItemAttributes, Images',
    :search_index   => 'Electronics',
    :country        => 'us')
 
res.items.first(5).each do |item|
    puts item.get('ASIN') + ':' + item.get('ItemAttributes') #+ ':' + item.get('ItemAttributes/Price')
end
```

## browser_node って？

商品カテゴリーの番号です。amazon のトップページからカテゴリーに飛ぶと、URL は...

```uri
http://www.amazon.com/Digital-SLRs-Cameras-Photo/b/ref=dp_bc_5?ie=UTF8&node=3017941
```

などとなっていると思います。この node の値が browser node となります。検索したい商品を絞り込みたいときに有効です。node の一覧は日本の方は https://affiliate.amazon.co.jp/gp/associates/help/t100 辺りを見るとわかると思います。
Visual Code TypeScript task.json

```
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "0.1.0",
    "command": "tsc",
    "isShellCommand": true,
    "tasks": [
        {
            "taskName": "build",
            "isBuildCommand": true,
            "suppressTaskName": true,
            "problemMatcher": "$tsc",
            "args": [
                "--outFile",
                "js/app/app.js",
                "-w"
            ]
        }
    ]
}
```
windows store の Ubutnu メモ

# windowsにおける home

[%localappdata%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\username]

# windows における `ubuntu.exe`の場所

[C:\Program Files\WindowsApps\CanonicalGroupLimited.UbuntuonWindows_1604.2017.922.0_x64__79rhkp1fndgsc]

# ネットワークドライブのマウント
- windows 側でネットワークドライブ割当
- [https://kledgeb.blogspot.jp/2017/04/wsl-84.html](https://kledgeb.blogspot.jp/2017/04/wsl-84.html)

```bash
cd /mnt
sudo mkdir d
sudo mount -t drvfs D: /mnt/d
```
よく使うExcelの条件付き書式

#(1)
よくあるこういう表

![image.png](https://qiita-image-store.s3.amazonaws.com/0/156225/ad3d4d9f-0093-7317-5d18-3c030b72d5b6.png)

セルの結合をしたり、手作業で罫線を引いていると手間ですし、オートフィルターを使用する際に不便です。
セルには同じ値を入力し、条件付き書式にて、直前のセルと内容が違う場合には罫線を引き、同じ場合ならフォントを背景色と同じにして見せないようにするのが扱いやすいです。


```:条件付き書式1
=INDIRECT(ADDRESS(ROW(),COLUMN()))<>INDIRECT(ADDRESS(ROW()-1,COLUMN()))
```
条件付き書式1の書式：セルの上部に罫線を引く

```:条件付き書式2
=INDIRECT(ADDRESS(ROW(),COLUMN()))=INDIRECT(ADDRESS(ROW()-1,COLUMN()))
```
条件付き書式2の書式：セルのフォントの色を背景色と同じ色にする

行や列を追加する場合、コピーすると条件付き書式が増殖しますので、挿入するようにしてください。
>Tip
条件付き書式を呼び出す際のアクセスキー:
<kbd>Alt</kbd>, <kbd>O</kbd>, <kbd>D</kbd>
行の選択のショートカットキー:
(IMEがOFFの状態で) <kbd><kbd>Shift</kbd> + <kbd>Space</kbd></kbd>
列の選択のショートカットキー:
<kbd><kbd>Ctrl</kbd> + <kbd>Space</kbd></kbd>
挿入のショートカットキー:
<kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>+</kbd></kbd>

他、今後追加予定...
Python > UI > 実装:消去作業の前に確認する > Continue: [y/N]

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

Linux上の処理にてよくある下記の確認処理を実装する。

```
<何かのメッセージ>
[y/N]?
```

### code

```test_confirm_171216.py
def confirm_delete():
    print("All the result directories are deleted before the batch run.")
    res = input("Continue: [y/N]?")
    if len(res) > 0 and res in "Yy":
        return True
    return False


if confirm_delete():
    print("Deleted")

```

### run

Enterのみ、yY以外の文字の場合

```
$ python3 test_confirm_171216.py 
All the result directories are deleted before the batch run.
Continue: [y/N]?
```

yの場合

```
$ python3 test_confirm_171216.py 
All the result directories are deleted before the batch run.
Continue: [y/N]?y
Deleted
```

Yの場合

```
$ python3 test_confirm_171216.py 
All the result directories are deleted before the batch run.
Continue: [y/N]?Y
Deleted
```

引数にstringを渡して汎用的な確認処理にするのもよい。

### 備考

Nをデフォルトにしているのは「非破壊的」にするため。

関連

- [アラートのOK、Cancelボタンは右と左、どちらにおくべきか？](https://qiita.com/eKushida/items/90c8cd861b65427e466b)
- [Sourcetree > リリースノートへのリンク / コミットとキャンセルボタンの左右入替](https://qiita.com/7of9/items/94603d1035f9897abfd1)
三項演算子を「a or b」という形式に書き直す

この記事は [Pythonのコードを短く簡潔に書くテクニック Advent Calendar 2017](https://qiita.com/advent-calendar/2017/python-short-code) の16日目です。

# はじめに

条件によって値を変えたいときは三項演算子[^1]が便利です。
しかし、特定の条件のときは三項演算子を`a or b`という書き方に置き換えることで簡潔に書き直すことができます。

[^1]: Pythonドキュメントでは `条件式 (しばしば "三項演算子" と呼ばれます) `と書かれており、「条件式」が正式名称のようですが、ここでは他言語でも一般的に使われている「三項演算子」という表現を使います。

# if文で書いた場合
```py3
if a:
    return a
else:
    return b
```

# 三項演算子で書いた場合

```py3
return a if a else b
```

# `a or b`で書いた場合

```py3
return a or b
```

三項演算子で`a if a else b`のように`if`の条件と結果で返す値が同じ場合には`a or b`という書き方に置き換えることができます。

`a or b`と書いた場合、`a`が真になる場合は`a`を、そうでなければ`b`になります。

# 真になる条件

先ほど「真になる」という表現を使いましたが、これは`a == True`ということではなく、`bool(a) == True`という意味です。

`bool(a) == True`になる条件は型によって違います。
組み込み型で代表的なものを挙げると以下のようになっています。

|型|真となる条件|
|---|---|
|int,floatなどの数値型|`a != 0`|
|str,list,dictなど長さを持つ型|`len(a) != 0`|

詳細は[`object.__bool__()`]を参照してください。

# 参考

- Pythonドキュメント
    - 言語リファレンス
        - [条件式 (Conditional Expressions)]
        - [`object.__bool__()`](https://docs.python.jp/3/reference/datamodel.html#object.__bool__)

[条件式 (Conditional Expressions)]:https://docs.python.jp/3/reference/expressions.html#conditional-expressions
[`object.__bool__()`]:https://docs.python.jp/3/reference/datamodel.html#object.__bool__)
メソッド定義と同時に公開レベルを設定するトリビア


## はじめに

この記事は書籍「[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7)」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの16日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。

今回はメソッド定義と同時に公開レベルを設定するトリビアをいくつか紹介していきます。

### 必要な前提知識

「プロを目指す人のためのRuby入門」の第7章まで読み終わっていること。

## メソッド定義と同時に公開レベルを設定するトリビア

7.7.2項でも説明したとおり、privateメソッドを定義する場合、Rubyではprivateキーワード（実際はメソッド）の下にメソッドを定義することが多いです。

```ruby
class User
  # ここから下で定義されたメソッドはprivate
  private

  def hello
    'Hello!'
  end
end
```

一方、Javaのような他の言語ではメソッド定義ごとにpublicやprivateを指定するものもあります。

```java
public class User {
    // publicメソッド
    public String getHi() {
        return "Hi!";
    }

    // privateメソッド
    private String getHello() {
        return "Hello!";
    }
}
```

実はRubyでも次のようにしてpublicやprivateをメソッドごとに指定することができます。

```ruby
class User
  # hiはpublicメソッド
  public def hi
    'Hi!'
  end

  # helloはprivateメソッド
  private def hello
    'Hello!'
  end
end

user = User.new

user.hi
#=> "Hi!"

user.hello
#=> NoMethodError: private method `hello' called for #<User:0x00007fd8f59ca880>
```

### 上のようなメソッド定義が可能になる理由

「えー、Rubyにもそんな構文があったの！？」とビックリした人がいるかもしれませんが、これは別にメソッド定義用の特別な構文がRubyに用意されているわけではありません。

上のコードは実際は次のような処理を1つにまとめているだけです。

```ruby
class User
  # メソッド定義の戻り値を受け取る
  m1 = def hi
    'Hi!'
  end
  # シンボルの:hiが変数に入る
  p m1 #=> :hi
  # publicキーワード（実際はメソッド）にメソッド名を渡す
  public m1

  # メソッド定義の戻り値を受け取る
  m2 = def hello
    'Hello!'
  end
  # シンボルの:helloが変数に入る
  p m2 #=> :hello
  # privateキーワード（実際はメソッド）にメソッド名を渡す
  private m2
end
```

メソッド定義が戻り値を持つことは「2.12.3 式（Expression）と文（Statement）」を、privateキーワードやpublicキーワードに引数を渡せることは「7.7.6 あとからメソッドの公開レベルを変更する場合」をそれぞれ参照してください。

このように、「メソッド定義が戻り値を持つ」という特徴と、「privateキーワードやpublicキーワードに引数を渡せる」という特徴を組み合わせると、あたかもRubyに専用の構文が用意されているように見せることができます。しかし、実際はこのような書き方をするケースは少ないので、無理に使おうとする必要はありません。

### クラスメソッドの場合

クラスメソッドで上のようにメソッド定義と公開レベルの設定を同時に行いたい場合は、`class << self`の構文（7.3.4項を参照）でクラスメソッドを定義してください。

```ruby
class User
  class << self
    # byeはprivateなクラスメソッド
    private def bye
      'Bye!'
    end
  end
end

User.bye
#=> NoMethodError: private method `bye' called for User:Class
```

## 次回予告

次回はprivateメソッドをレシーバ付きで呼び出せるケースを説明します。
ADDA > runtime argument > -orient <alpha> <beta> <gamma>

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

This articles shows the runtime arguement of ADDA in terms of the Euler angle for the particle orientation.

### adda command

```bash
$ ./adda -h orient
  -orient {<alpha> <beta> <gamma>|avg [<filename>]}
Either sets an orientation of the particle by three Euler angles
'alpha','beta','gamma' (in degrees) or specifies that orientation averaging
should be performed. <filename> sets a file with parameters for orientation
averaging. Here zyz-notation (or y-convention) is used for Euler angles.
Default orientation: 0 0 0
Default <filename>: avg_params.dat
```

### run

```bash
$ ./adda -orient 30 45 60
all data is saved in 'run6119_sphere_g16_m1.5'
box dimensions: 16x16x16
lambda: 6.283185307   Dipoles/lambda: 15
Required relative residual norm: 1e-05
Total number of occupied dipoles: 2176
Memory usage for MatVec matrices: 1.3 MB
Calculating Green's function (Dmatrix)
Fourier transform of Dmatrix......
Initializing FFTW3
Total memory usage: 2.2 MB

here we go, calc Y

CoupleConstant:0.005305699626+1.876720049e-05i
x_0 = 0
RE_000 = 1.0000000000E+00
RE_001 = 8.3832261701E-01  + 
...
RE_023 = 1.5592395049E-05  + 
RE_024 = 4.4244426960E-06  + 
Cext    = 135.1408442
Qext    = 3.793842946
Cabs    = -4.157502341e-16
Qabs    = -1.1671461e-17

here we go, calc X

CoupleConstant:0.005371256686+1.923384555e-05i
x_0 = 0
RE_000 = 1.0000000000E+00
RE_001 = 8.3836740461E-01  + 
...
RE_023 = 3.1605763674E-05  + 
RE_024 = 4.4500469813E-06  + 
Cext    = 135.2082992
Qext    = 3.795736626
Cabs    = -0
Qabs    = -0
```

```bash
$ grep orient run6119_sphere_g16_m1.5/log 
command: './adda -orient 30 45 60 '
Particle orientation (deg): alpha=30, beta=45, gamma=60
```
無料で始めるRPA

# RPAとは

RPAとは、ロボティック プロセス オートメーション(Robotic Process Automation)の略で、主に定型的な事務処理を自動化することです。
今まで人間がやっていた、単純だけど件数が多いため膨大な時間がかかるような作業を、
キーボード操作・マウス操作レベルで作業手順（シナリオ）を作っておき、それを自動実行させてしまおうというものです。
自動化の仕組み自体は昔からありましたが、プログラミングスキルの無い人でも扱えるように（それはちょっと厳しい気も）したのが今までとの違いです。

# ソフトロボ

ソフトウェア ロボットの略です。要するにただのプログラムです。
定義した作業手順（シナリオ）を実行するのはシナリオ実行ロボットです。
Microsoft Excelに例えると、シナリオがExcelマクロ、シナリオ実行ロボがExcelに該当します。
しかし、シナリオのことをロボットと呼んでいるRPAツールもありますし、RPAツールそのものをロボットと呼ぶこともあります。

# 向く作業

定型的で件数が多い繰り返し作業をRPAツールに任せるのがよいでしょう。
例えばExcelの顧客名簿を開いて上から順番に情報を拾ってメール本文を作り、メール送信する等の作業です。
シナリオ作成・保守のコスト、その作業を人がやり続けた場合のコストも考えて自動化の対象を決めましょう。

# シナリオ作成のコツ

:smiley: 効果が高そうなポイントに絞ってまずは小さなシナリオを作る
:dizzy_face: 全自動を目指して巨大なシナリオを作る

シナリオは一度作って完成ではなく、適宜微調整をすることを想定しておきます。
利用しているソフトウェアのバージョンアップやその他諸々の理由で、シナリオ作成時と環境が変わってしまい、ある日突然、シナリオがうまく動かなくなったりすることがあります。
巨大なシナリオだと原因を特定するのも大変です。

# ツール紹介

## UWSC

![uwsc.png](https://qiita-image-store.s3.amazonaws.com/0/211602/60024715-1734-ee5a-47f8-9412179a0c08.png)

20年近い歴史のある国産のPC作業自動化ツール。
無料の**UWSC**と、有料（シェアウエア）の**UWSC Pro**がある。
無料版でもキー操作・マウス操作の記録/再生や画像認識などができ、
Excelマクロを書ける程度のスキルがあれば十分使いこなせる。
スクリプトの構文もVisual Basic風。
数十万、数百万円のRPAを導入せずとも、これで事足りるケースも。

:globe_with_meridians: [UWSC](http://www.uwsc.info/)

## UiPath

RPAツールの一つ。条件を満たせば無料で使えるCommunity Editionがある。

:globe_with_meridians: [UiPath Community Edition](https://www.uipath.com/community)

## その他のRPAツール

無料じゃないので製品名だけ紹介

* WinActor
* BizRobo!
* Blue Prism
* Automation Anywhere
JUCEのメモ書き

# はじめに
gyaboと申します。
まあ恥ずかしいことにJUCEはCEDEC2016の時に初めて知って、それ以来ウォッチし続けてたんですが、書き捨てまくってるせいでプライベートでちゃんとした開発環境がまだ無いなってことで整理整頓する意味でまとめます。

# 目標
VSTプラグインのひな型を作ります。
<b>※推敲してたら実は前日のアドベントカレンダーが極めて優秀で(PCMシンセ)重複しまくってるのでぜひご覧ください。</b>

@COx2
JUCEのAPIでPCMシンセサイザーを作る
https://qiita.com/COx2/items/e50e8f29bea633c6e5b0


# 前提環境
Windows 10 64bit, 適当なマシンです。
VSTホストは何かしらあればいいので、Reasonでもいいし、FL Studioでもいいかな。

# 初学者向けの設定は優秀な記事にゆずるとして

もろもろ登録終わらせると、以下のように出てきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/34428/c92df075-f00b-e1ad-347c-fa5a390b6dc6.png)

音作れるVSTプラグインを作りたいので「Audio Plugin」を押します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/34428/636a19c2-2877-99da-36c8-834724e74a64.png)

適当に入力してCreateします。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/34428/10bcbb36-da9c-bb03-8588-6df850a0e939.png)

うまい感じでプロジェクトが作成されると上記の通り表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/34428/ee382d8f-27ca-6bba-46fe-500930faeef9.png)
こんな感じ。次は、VStudioのアイコンがあるのでクリックするといつものが立ち上がったので、おもむろにビルドします。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/34428/6ac85875-0ca0-1836-d6a5-15d54d4b5ba8.png)

ペンネームみたいな本名見えてるけど関係なし。淡々とビルドします。VS2017です。

※
ここで環境変数周りでコンパイルエラーになったんですが、Windows SDK最新周りが入っていないからとのこと。
JUCEプロジェクトは作ってくれるけどWindows SDK周りは見てくれていないので、淡々と本家からinstallする必要あります。

# 出来上がったVSTを確認する
うまくビルドできると、こんな感じでdllが作られています。こいつがVSTプラグインのようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34428/e964ada7-0a03-0709-a295-135a72eb8c10.png)


# VSTを入れる
こんな感じでコピペしてフォルダにいれます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/34428/96d7de2b-ecce-141b-f532-462efd61023d.png)


# ホストアプリから起動する
FL Studioのライセンスを持ってるので、FLから起動します。
FL Studioは以下。
https://www.image-line.com/flstudio/

plugin databaseから新しく追加されてますね！ってVSTを選んでトラックに入れたりすると、
以下の通り出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34428/4ba25035-7e70-713e-e2ec-ce201ec8cfad.png)

やったね。あとはやりたい放題だ！
すごいな。こんなあっさりとVST作れるなんて。

# JUCEを使うメリットを考える
あとはMIDIのコントロール受け取ったりするだけのこまごまとした処理ばかりのはずなので、軽く感想。
生のVSTSDKを使った記事は過去に自分のサイトに書いています。

VSTプラグインを自作する
http://gyabo.sakura.ne.jp/tips/vst0.html

GHP - PROG-RAHAM - SOUND
http://gyabo.sakura.ne.jp/progsnd.html

で、VSTのSDKは割とちょくちょく変わる印象あって(?いつ頃の話だろう)めんどくさいなと思っていたんですが
JUCE frameworkでGUIのひな型を含めてすべてお世話してくれる環境を一撃でもらえる恩恵は非常にでかいです。

もちろんVSTSDK側のサンプルもそれなりにできてて良いのですが、本質的なところじゃないところで脳のリソース使うのは浪費だな～と思うくらいJUCE側よくできている印象があります。


# JUCEのサンプルについて
2017/12現在、以下のフォルダにあります。
juce-huckleberry-windows\JUCE\examples\OpenGLAppExample\

私は本来はグラフィック屋さんなので特に目をひいたのがOpenGLのサンプルです。
juce-huckleberry-windows\JUCE\examples\OpenGLAppExample\Source

MainComponent.cpp側にゴリゴリシェーダーとか書いてあって、そのままいろいろ改造して使えそうな雰囲気もあります。
サウンド周りとグラフィック周りが同時にいろいろサポートしてくれるフレームワーク、サウンド周りがたいていおざなりだったりするのですが、
JUCEはよくできています。ここまでお世話してくれれば何か一つ作れそうな気がします。


# 終わりに
JUCE、サンプルを淡々と紹介するサイトとかあったら需要あるんですかね。
とにかく幅広がってて楽しいフレームワークなので触ってみてください。

<b>レッツエンジョイJUCE!</b>

# おまけ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34428/c81fa4e9-df27-4a5e-ad2b-94175e7f5687.png)

JUCEのロゴっぽいのをねらってたんですが、失敗しました。
以上です。
[Monaca] Fileプラグインを使って外部サーバーのファイルを保存してみる

[Fileプラグインについて](https://qiita.com/keeey/items/cf7222b8d9dddebb3443) で、Fileプラグインの使用方法を説明しましたが、Fileプラグインを使って外部サーバーのファイルを保存してみたいと思います。
Fileプラグインで保存できる場所は、アプリケーション専用のサンドボックス内になります。

Fileプラグインは、Monacaの基本Cordovaプラグインに含まれており、Freeプランから利用することができます。


# ステップ1: ファイルのダウンロード

```js
document.addEventListener("deviceready", function() {
  window.requestFileSystem(LocalFileSystem.TEMPORARY, 0,
    function(fileSystem) {

      // サンプルファイルを取得
      var xhr = new XMLHttpRequest();
      xhr.open('GET', 'http://ドメイン名/sample.wav', true);
      xhr.responseType = 'blob';
      xhr.onload = function() {
        if (this.status == 200) {
          console.log("200:" + this.response);
          
          // Blobデータに変換
          var blob = new Blob([this.response], { type: 'audio/wav' });
          
          // ファイルを作成
          createFile(fileSystem.root, blob, "sample.wav");
        }
      };
      xhr.send();
    },
    function(e) {
      console.log("error: " + e.code);
    }
  );
}, false);
```

今回は、`LocalFileSystem.TEMPORARY` 内にファイル保存します。
保存するファイルは、wav音声ファイルです。

ファイルのダウンローには、`XMLHttpRequest()` を利用しています。
ファイルのダウンロードが成功した場合は、ファイルに書き込むために、ダウンロードしたデータを `Blob` データに変換しています。

次に、作成した `Blob` データをファイルに保存します。


# ステップ2: ファイルを作成する

```js
function createFile(dirEntry, fileData, fileName) {
  dirEntry.getFile(fileName, { create: true, exclusive: false }, 
    function (fileEntry) {
       // ファイルの保存先
      console.log(fileEntry.toURL());
      
      // ファイルへの書き込み
      writeFile(fileEntry, fileData);
    }, function(e) {
      console.log("error: " + e.code);
    }
  );
}
```

はじめに、`LocalFileSystem.TEMPORARY` に、ファイル名「sample.wav」でファイルを作成します。
ファイルの保存先は、`fileEntry.toURL()` で、確認することができます。

ファイルが作成されたら、ステップ1で作成した `Blob` データをファイルに書き込みます。


# ステップ3: ファイルへの書き込み

```js
function writeFile(fileEntry, dataObj) {
  fileEntry.createWriter(function (fileWriter) {

    fileWriter.onwriteend = function() {
      console.log("Success write()");

      if (dataObj.type == "audio/wav") {
        // ファイルの読み込み
        readFile(fileEntry);
      }
    };
    fileWriter.onerror = function(e) {
      console.log("Failed file write: " + e.toString());
    };

    fileWriter.write(dataObj);
  });
}
```

ファイルへの書き込みには、`createWriter()` メソッドを使います。
ファイルへの書き込みが完了したら、実際に作成されたファイルを読み込んで、音声を再生してみたいと思います。

# ステップ4: ファイルの読み込み

```js
function readFile(fileEntry) {
  fileEntry.file(function (file) {

    var reader = new FileReader();
    reader.onloadend = function() {
      console.log("Success readAsDataURL()");
      
      // 音声再生
      // <audio id="audio1" controls></audio>
      var element = document.getElementById('audio1');
      element.src = this.result;
      element.play();
    };
    reader.readAsDataURL(file)

  }, function(e) {
    console.log("Failed file read: " + e.toString());
  });
}
```

今回、ファイルの読み込みには `readAsDataURL()` メソッドを使用しています。
`readAsDataURL()` メソッドでは、base64 エンコードされたデータを取得することができます。
そのため、`<audio>` タグの `src` に、取得した値を直接設定することができます。


#おわりに

アプリ内に音声や画像、動画ファイルなどを直接組み込んでいる場合は、アプリの容量が大きくなってしまいます。
外部サーバーにあるファイルをAjaxでダウンロードし、アプリ内にファイル保存することで、あらかじめ容量の大きいファイルを用意する必要がなくなります。

状況に応じて、試してみてはいかがでしょうか。
聞き取れない英語のセリフを何回も聞きまくる方法

前回の記事はアニメで英語のリスニングをする方法を書きました。
[[ネタバレ注意]アニメで始める英語リスニング](https://qiita.com/akiraak/items/04e678bfffd851b31c8f)

リスニングをしていると難しくて聞き取れないセリフって必ず出てきますよね。セリフが長かったり、話すスピードが早かったり。

そんなセリフを何回も何回も聞きたい。それも手軽に。

というわけで、そんなコードを書いてみました。

# シチュエーション

まず英語の音源ですが、英語の音声ファイル（mp3とか）とか動画ファイル(mp4とか)が Mac に入っている状態を想定します。そして、コマンドラインからコマンドを叩くと、ファイルの特定の箇所のセリフが再生されるようにします。Mac じゃなくて Windows でも同じように動くと思うんで、そこは適当に読み替えてください。

# とりあえず説明に使える音源を用意してみる

ネットでダウンロードできる英語音源をググっていたら、こんなサイトを見つけました。

[LoadMp4.Com](http://loadmp4.com/video/%E8%8B%B1%E4%BC%9A%E8%A9%B1.html)

<img width="946" alt="英会話_Mp4_HD_Video_Download_-_LoadMp4_Com.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/33704/4be41790-0813-a949-17ea-1124ab79deea.jpeg">

なんか怪しいですね。権利とかの問題はちゃんとしてるんでしょうか？

わからないけど、とりあえず一番上の[実用英会話フレーズ1000 聞き流し（日・英語音声付き）](http://loadmp4.com/i/r4LHC89foSY.html)から mp4 ファイルをダウンロードします。

# mplayer

次にコマンドラインで音や動画を再生してくれる mplayer を Mac にインストールします。

```sh
$ brew install mplayer
```

mplayer はオプションに開始時間と再生秒数を指定することで、特定の箇所の音を再生できます。

```sh
$ mplayer -novideo -ss 00:00:10 -endpos 5 english.mp4
```

`-ss` が開始時間で、 `-endpos` が再生秒数です。 `-novideo` はファイルが動画だった場合に音だけ再生してくれるオプションです。

# 好きな箇所を再生するようにコードを書く

いちいち長いオプションを書いて実行するのは面倒くさいので、簡単に再生するようなコードを書きます。

```py3:play.py
# -*- coding: utf-8 -*-
import os
import sys


soundFile = "english.mp4"
soundList = [
    ["00:00:04", "8"],      # 私もそう思った
    ["00:00:14", "10"],     # あなたはどのように休みを過ごしましたか？
    ["00:00:25.5", "9.5"],  # 彼女はますます美しくなりました。
]


def playMplayer(file, seekTile, playTime):
    # -ss 開始時間を HH:MM:SS で指定
    # -endpos 再生時間を秒で指定
    os.execvp("mplayer", ["mplayer", "-novideo", "-ss", seekTile, "-endpos", playTime, file])

    # Ctrl+C でターミナルの表示が崩れるので os.execvp に変更した
    #cmd = "mplayer -novideo -ss {} -endpos {} {}".format(
    #    seekTile, playTime, file)
    #subprocess.call(cmd, shell=True)

def play(no):
    sound = soundList[no]
    playMplayer(soundFile, sound[0], sound[1])


def main():
    no = int(sys.argv[1])
    play(no)


if __name__ == "__main__":
    main()
```

ダウンロードしたファイルを `english.mp4` に変えて、同じディクレクトリにこのコードを置いて実行すると、こんな感じで音がなります。

```
$ python3 play.py 0

↓音が鳴る
私もそう思った。
That's the way I look at it, too.
```

```
$ python3 play.py 2

↓音が鳴る
彼女はますます美しくなりました。
She became more and more beautiful.
```

# おわりに

わりと面倒くさいですね:stuck_out_tongue_closed_eyes:
ランダムディザ量子化器とPCゲームの車両操作

## 概要
こんにちは。私はPCゲームが大好きなのですが、どうにも『WASDで運転する車』で事故が多発するためオープンワールドでも徒歩とFTだけで移動しております。
この問題は代表的な量子化制御問題ですので、ランダムディザ量子化器を簡単に実装してみた結果をAdvent Calender 2017の16日目に寄稿します。

## 問題設定
WASDでの車両操作が困難な理由は、下図のようにフィードバックループ内にキーボードが存在することにより、車両へのステアリング入力が左いっぱい、中立、右いっぱいの3通りからしか選択できないことによります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211913/57bb7ea2-7069-2e1b-26e7-385e42f62779.png)
プレイヤーの指示したステアリングを$d\in[-1,1]$で表すと、キーボードを介した実際のステアリング入力は

``` math
\delta = \lfloor d\rceil_{Q}
```
となります。ここに、$\lfloor\cdot\rceil_{Q}$は量子化された入力空間

```math
Q=\left\{-1,0,1\right\}
```
への最近傍丸め[^1]を表す写像であり、このような量子化手法を**単純量子化**と呼びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211913/99269288-eff4-64f5-868c-7d393664117a.png)
今回はこの単純量子化器に代わり、よりよい量子化手法にトライしてみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211913/d7705311-2485-4617-c543-364070feaaa7.png)

## ランダムディザ量子化器
｢よりよい｣量子化器の一例として、**ランダムディザ量子化器**を導入します。ランダムディザ量子化器は単純量子化器の入力に｢ディザ｣と呼ばれる雑音を意図的に加算するものです。すなわち、

```math
\delta = \lceil d + w\rfloor_Q
```
なる量子化手法です。上式において$w$がディザであり、$w\in \[-\Delta/2,\Delta/2\)$なる一様乱数です。ただし$\Delta=2/3$は量子化間隔を表します。

外乱を印加したにも関わらずよりよい結果が得られる理由については各種文献をご参照頂きたいのですが、よく行われる定性的な説明は下図の歯車のようなものでしょう。上段がランダムディザ量子化器、下段が単純量子化器による動力伝達の様子です。歯車の回転周期よりも十分に速い速度で緑の歯車を振動させることで、歯車の"あそび"、すなわち量子化の影響が低減されていることがわかります。
![output.gif](https://qiita-image-store.s3.amazonaws.com/0/211913/53370a2a-e561-bed5-42f3-2eadafeb13ad.gif)

## 実装
本来であれば私が苦心しているあれやこれやのゲームで試してみるのがよいのでしょうが、ゲームアプリへキーボードイベントを中継するアプリを作るには時間がない(現在16日3:46)ので、UnityのStandard Assetsパッケージから車体運動モデルを拝借しました。あとはステアリング処理の部分に量子化を施すだけです。

``` csharp:
public void Move(...
{
  // ...(略)...

  // 量子化なしならば[-1,1]へのクランプのみ
  if (isWoQuantize) {
    steering = Mathf.Clamp (steering, -1, 1);
  // 単純量子化処理
  } else if (isSimpleQuantize) {
    steering = SimpleQuantization (steering);
  // ランダムディザ量子化処理
  } else if (isRandomQuantize) {
    steering = RandomDitherQuantization (steering);
  }

  // ...(略)...
}

private float SimpleQuantization(float str){
  float outvar;
  if (str < -1/3.0f) {
    outvar = -1;
  } else if (str > 1/3.0f) {
    outvar = 1;
  }
  else {
    outvar = 0;
  }

  return outvar;
}
private float RandomDitherQuantization(float str){
  // Random.valueが[0,1]なのを忘れていたことに今気づいた
  float outvar = str + 2.0f * (UnityEngine.Random.value - 0.5f) / 3.0f;
  if (outvar < -1/3.0f) {
    outvar = -1;
  } else if (outvar > 1/3.0f) {
    outvar = 1;
  }
  else {
    outvar = 0;
  }

  return outvar;
}
```
完成品はこちらにおいておきます。
https://unityroom.com/games/rdq

画面中のマウスカーソルの位置に応じて左端から右端まで$d\in[-1,1]$の入力が得られます。Wキーで量子化なし、Qキーで単純量子化、Rキーでランダムディザ量子化をテストできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211913/f0da4149-65d4-129e-e0b6-b232eec9909f.png)

## おわりに
いかがでしょうか？私はランダムディザ量子化器により多少運転しやすくなったと感じましたが、定量評価を行う十分な時間がないのと、ランダムディザ量子化器を使用したときの挙動が露骨すぎるため[^2]結論は出さずにおきます。

おやすみなさい。

[^1]: ゲームにより最近傍でない(不均一な)量子化間隔を持つ可能性はある
[^2]: 熱燗と冷酒の違いを盲検することは困難である
DockerでDBが起動中かを確認する。


## `wait.sh` を作成

`mysqladmin` コマンドを使うために、`mysql-client` を使っています。

```wait.sh
until mysqladmin ping -h db -P 3306 --silent;
do
  echo "Waiting for database connection..."
  sleep 1
done
```
## command: bash -c './wait.sh' で実行する

```docker-compose.yml
version: "3"

services:
  db:
    image: mysql:5.7
    env_file: ./src/config/.env
    ports:
      - 3306:3306

  web:
    build: .
    command: bash -c './wait.sh'
    ports:
      - 8080:8080
    depends_on:
      - db

```
【Rails】メモリ上の画像をそのままcarrierwaveに渡す

carrierwaveは、Railsアプリケーションで、画像ファイルをアップロードなどを助けてくれるツールとしてとてもポピュラーです。

https://github.com/carrierwaveuploader/carrierwave
[CarrierWave + Rails 5.1で画像アップローダー](http://morizyun.github.io/blog/carrierwave-image-uploader-rails/)
[Rails 超お手軽な画像アップローダー CarrierWave の使い方](http://www.workabroad.jp/tech/1118)

コード上で作成した画像をそのまま、carrierwaveに渡す方法をメモとして残しておきます。
１年ほど前に書いたものなので、今のバージョンではできるようになっているかもしれませんね。


## 実装方法
まず、StringIOクラスを継承したCarrierStringIOクラスを作ります。

```.rb
class CarrierStringIO < StringIO
  def initialize(*args)
    super(*args[2..-1])
    @filepath = args[0]
    @content_type = args[1]
  end 

  def original_filename
    @filepath
  end

  def content_type
    @content_type
  end
end
```
そして、お決まりで`mount_uploader` を設定しますが、モデルのimage_dataに代入されたら`CarrierStringIO`クラスを自身のimageに代入するようにします。
これ、もっといい方法があるかもしれませんが、私の脳みそじゃこれぐらいしかできません。

```.rb
class Hoge < ActiveRecord::Base
  mount_uploader :image, ImageUploader

  def image_data=(data)
    content_type = "image/png"
    io = CarrierStringIO.new("title.png", content_type, data)
    self.image = io
  end
end
```

## 結果
- これでできるようになります
- もっといい方法あれば教えてください
RubyでSiv3Dアプリが作れるSketchWaltz

[Siv3D Advent Calendar 2017](https://qiita.com/advent-calendar/2017/siv3d)の16日目の記事です。

現在作成中の[SketchWaltz](https://github.com/ongaeshi/sketchwaltz)という開発環境について紹介します。

![opensiv3druby2.gif](https://qiita-image-store.s3.amazonaws.com/0/3885/202fbd2a-8913-00fd-3242-fbb9236f39f7.gif)
(画像を拡大するとコードも見えます、OpenSiv3DRubyは昔の名前です・・)

## 概要
Siv3D, OpenSiv3DはC++で簡単にゲームやメディアアートが作れるライブラリです。使いやすいAPIや組み込みの当たり判定などがすぐに使えるのが魅力です。

RubyでOpenSiv3Dのアプリが作れるようにしたのがSketchWaltzです。現在はWindows版しか用意されていませんがOpenSiv3Dが動く環境であれば簡単に移植することができます。

とにかくインストールやプログラムの修正が簡単なのが特徴です。VisualStudioやXCodeのインストールは不要ですしコンパイルの待ち時間もありません。RubyなのでC++のような不正アクセスも起きません。

もっと気軽にSiv3Dを試してみたい、C++でがっつり書く前にプロトタイプを作りたい、普段はRubyでWebアプリを作っているけどゲームやメディアアートにも興味がある、といった人はぜひお試しください。

## インストール
1. [Releases](https://github.com/ongaeshi/sketchwaltz/releases)から最新のzipを展開します
2. `sketchwaltz.exe`を実行します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3885/3c5634b9-49e1-fdd4-f2ec-9178c07494c6.png)

## コードの編集
1. `sketchwaltz.exe`の横にある`main.rb`を開きます(エディタなら何でもいいです、メモ帳でも)
2. コード内の`"Hello, SketchWaltz!"`を好きな文字に変更して保存します
3. **保存すると同時に画面が自動で書き換わります**
4. `main.rb`を書き換えて画面が色々変化することを確認しましょう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3885/a7447ced-07cf-05aa-130c-c07bb9e2463c.png)

## 絵文字を動かす
`main.rb`を以下のように書き換えると絵文字をマウスで動かすことができます。(絵文字は[Emoji unicode characters for use on the web](https://apps.timwhitlock.info/emoji/tables/unicode)から取ってくるとよいです)

```ruby
font = Font.new(30)

e = Emoji.new("😁")
t = Texture.new(e, TextureDesc::Mipped)

while System.update do
  t.draw_at(Cursor.pos.x, Cursor.pos.y)
  font["🐣こんにちは！SketchWaltz!💃"].draw_at(Window.center.x, Window.center.y, Palette::White)
end
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3885/1f517e36-8a4c-cfa8-0b23-2d242fabdf73.png)

## 他のファイルを編集する
`main.rb`の横にある`shape.rb`や`texture.rb`をアプリ上にドラッグ＆ドロップしてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3885/1bfc838f-6544-dbf2-0b2c-548d8a344ec0.png)

もちろんドラッグ＆ドロップしたファイルをそのままメモ帳などで編集すればその場で書き換えることができます。

## 今後の予定
まだまだ開発中ですが

- 基本図形の描画
- テクスチャの描画
- 絵文字の描画
- マウス入力
- RubyのFiber

などはできるようになっています。SketchWaltzはOpenSiv3D+mrubyで作られているためOSXやLinuxに簡単に移植することができます。興味がある人がいましたら是非教えてください。

[2日目で紹介](https://qiita.com/hamukun8686/items/dffc3fbf27fe9b26b340)されていた3D表示機能が入ったら是非使えるようにしたいです。かなり簡単に3Dアプリが作れるものになるのでは、と期待しています。

要望やバグなどありましたら是非お知らせください。
Slackで（通知設定がされているのに）通知が来ない時

こんにちは。shobjです。

会社でSlackを使っているのですが、
元々は会社のメールアドレスでSlackのアカウントを申請、使用していました。
しばらくしてから社内にG-Suiteが導入され、会社が用意したGoogleアカウントに元のアカウントをバインディングして使うようになったのですが…

<b>アプリを入れているiPhoneに通知が来ない</b>

という状態に陥りました。

#通知設定は…？
どこを見てもすべて有効になっている。
iPhone事態の設定も、Slackのアプリ側の設定も、PCで使用しているデスクトップアプリの設定も…
全部有効になっているのに、なぜ通知が来ないんだろう…

<img width="375" alt="IMG_0003.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/132994/617724cd-431c-a487-ab6d-01ff820289fe.png">

アプリ側も

<img width="375" alt="IMG_0004.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/132994/4e6405bd-d827-e021-ad3a-3465d7984b58.png">

iPhone側も通知設定がなされている…


#結局
すごく単純なことで解決しました。

<b>SlackのキャッシュをクリアしてやればOKっぽいです</b>
なんでこんな初歩的なことに気づかなかったんだ…

とはいえ、iPhoneのアプリ毎のキャッシュクリアはアプリ側で実装されていなければなりません。
Slackはちゃんとされているみたいなので、心配なしでした。

<img width="375" alt="iOS からアップロードされた画像.png" src="https://qiita-image-store.s3.amazonaws.com/0/132994/af2dbe74-a9d2-c9a3-7c89-ac7242380308.png">

iPhoneの設定を下にずーっとスクロールすると、アプリ毎の設定が並んでいると思いますが、そこからSlackを探してタップすると上記のような画面になります。
で、下の方にある`Reset Cache on Next launch`をオンにして、Slackを再起動すればOK。

これで私は無事に通知が来るようになりました。

今回はG-Suiteの導入が契機になりましたが、急に通知がこなくなった場合には使える解決方法かもしれませんので、参考にしていただければと思います。

※ちなみに、同条件の同じチームの人は現象が発生しなかった（通知がちゃんと来ていた）ので必ず起こる現象というわけでもなさそうです。
AngularJS4 コンポーネント・サービスの生成

# コンポーネント生成コマンド

```shell
ng g component [コンポーネント名]
例：ng g component videoList

#上記コマンドを押下したら、以下の変化が起きる
* 生成した分のコンポーネントディレクトリができる
* 生成した分のコンポーネントに関する記述がapp.modlue.tsにて増える
```


# サービス生成コマンド
```shell
ng generate service [サービス名]
```


##おまけ
####angularjsをhtml5モードで動かす場合のnginxの設定
https://qiita.com/nusa/items/a247e7754051f9c772d2
AngularJS4でのリリース手順

## AngularJS4でのリリース手順


```shell
#対象ディレクトリまでいく
cd [ディレクトリ名]
例：cd /work/angular/my-app

#ビルドする
ng build --prod

#リリース
scp -r dist/* ユーザ名@IPアドレス:/var/www/html/
```
【iOS】画面領域外からアニメーションさせた要素が表示されない


## 現象
画面外からスライドインさせるアニメーションをつくったら、要素が入ってこない

## 発生端末
iPad Pro / Safari iOS11 
しかしiPhoneでは発生しないという謎現象

## 解決策

結論はこちら
[iOS 9 Safariメモリ表示領域外のコンテンツが消える!?](http://senta.me/blog/2015-11-08/ios-9-safari-drops-memory-bug/)

親要素をfixedで囲むとメモリから消えない


3時間くらい悩んだ
AngularJS4のインストール

## AngularJS4のインストール


```shell

#nmpが入ってることとバージョンの確認
npm -v 

#AngularJSのインストール
npm install -g @angular/cli #グローバルで設定したい場合は「-g」が要るが、ローカルで設定したい場合は不要

#ディレクトリを作りたい場所で移動
cd [ディレクトリ名]

#ディレクトリを作成
mkdir angular

#ディレクトリに入る
cd angular/

#作りたいアプリケーションのテンプレート作成
ng new [作りたいアプリケーションの名前]
例：ng new my-app

#上記のディレクトリに入る
cd [作りたいアプリケーションの名前]
例：cd my-app

#サーバの起動
ng serve --open

#サーバ停止
control + C


#AngularJS　チュートリアル
https://angular.io/tutorial
```
GitHub Pagesで普通の静的ホスティングをしたいときは .nojekyll ファイルを置く

GitHub Pagesを静的サイトホスティングのために使用している方は多いと思います。

参考: [GitHub Pagesの公式サイト（英語）](https://pages.github.com/)

特に静的サイトジェネレータ（Sphinx, MkDocs, Hexo, Hugoなど）からGitHub Pagesへデプロイする用途は、多くの方が活用されているでしょう。

## 問題

しかし、GitHub Pagesには落とし穴があります。**GitHub Pagesでホスティングされたファイルは、デフォルトではJekyllによって処理される**という原則があります。

これにより、デプロイしたサイトが正しく表示されなかったり、エラーが起こったりするケースがあります。（筆者が何度か経験しました）

## 解決法

- GitHub Pagesに（Jekyll以外の）任意のファイルをホスティングしたい
- GitHub Pagesが持っているJekyllの処理エンジンは使わない

このような場合は、**`.nojekyll`という名前の空ファイルを作る**と、Jekyllの変換機能を使わずに純粋な静的ホスティングを利用できます。

Bashなどでは次のコマンドで空ファイルを作れます。

```bash
$ touch .nojekyll
```

もし何かGitHub Pagesでトラブルがあった場合、まず`.nojekyll`ファイルを置き忘れていないかどうかをチェックしましょう。

参考: [Bypassing Jekyll on GitHub Pages](https://github.com/blog/572-bypassing-jekyll-on-github-pages)

以上です。
Qiita Markdown で折りたたみを表現する方法

# サンプル

<details><summary>すごく長い文章とかプログラムとか</summary>

```python
print('Hello world!')
```
</details>

# Markdown

```markdown
<details><summary>すごく長い文章とかプログラムとか</summary>

```python
print('Hello world!')
```　
</details>
```

:::note warn
上の例には ````` ``` ````` の後に不要な全角スペースが 1 つ入っているので削除してください
:::

# ハマりどころ

:::note alert
必ず `</summary>` のあとに 1 行の空行を入れないとレンダリングが崩れる。
:::


## 失敗例
<img width="358" alt="Screen Shot 2017-12-16 at 1.58.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/214716/20f94980-b0a2-87df-218a-089dd03d0cde.png">

## 成功例
<img width="318" alt="Screen Shot 2017-12-16 at 1.58.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/214716/7d4a9c15-71ea-64ae-b687-2c41102b45e5.png">
AWS EC2にLet's Encryptを導入【ログ】

## AWS EC2にLet's Encryptを導入

3ヶ月だけ無料で使える証明書です。
下記のサイトをみてやってみたのですが、ハマったところがあったので
そちらのメモ。
そして作業ログを掲載しておきます。
参考サイト：https://qiita.com/MashMorgan/items/56498f276c54406b1928

#### ハマったところ

```shell
3.証明書の発行
# certbot-auto certonly --webroot -w /var/www/html -d ドメイン名 --email hoge@example.com --debug
```

### 作業ログ

```shell
    1  cd /var/log/letsencrypt/
    2  ll
    3  cat letsencrypt.log
    4  cd /var/www/html/
    5  ls -la
    6  cd .well-known/
    7  ls
    8  ls -la
    9  cd ./
   10  cd
   11  cd /etc/httpd/conf.d/
   12  ls
   13  ll
   14  mv EC.conf EC.conf.b
   15  /etc/init.d/httpd restart
   16  cd /etc/letsencrypt/live/
   17  ls
   18  cd ec.neko-server.com/
   19  ls
   20  ll
   21  cat README 
   22  cd /etc/httpd/conf.d/
   23  ls
   24  ll
   25  cat ssl.conf
   26  ll
   27  cat ssl.conf.bk_20170730|grep -v "#"
   28  vi EC.conf.b 
   29  mv EC.conf.b EC.conf
   30  vi EC.conf 
   31  /etc/init.d/httpd restart
   32  cat EC.conf 
   33  sudo vim  EC.conf 
   34  sudo vim ec.include
   35  ls
   36  sudo vim  EC.conf 
   37  vim EC.conf.bk_20170731
   38  ls
   39  cp EC.conf EC.conf.bk_20170731 
   40  sudo cp EC.conf EC.conf.bk_20170731
   41  ls
   42  cat ec.include
   43  sudo vim  EC.conf
   44  /etc/init.d/httpd restart
```
BigqueryとColaboratoryで売上を統計分析する基盤を試作した話

## Excelの限界

弊社の某プロダクトでは個々の契約の利用料金は自動的に算出しているのですが、
それ以上の粒度、例えば四半期や通期の売上総額や、各メニュー毎の売上等の集計には（多くの企業でそうであるように）Excelが用いられています。

Excelは誰でも直感的な操作が可能な素晴らしいものですが、その反面いろいろな制約があります。

1. 扱えるデータが小さい
1. データの再利用性が低い

10万行くらいで操作性的にかなりしんどく、100万行を超えると物理的に扱うことができません。また、データの参照と加工が一体化しており直感的な反面、長期的な再利用が難しく、長期間にわたる集計を行うのは重労働になりがちです。いきおい長期的なデータを様々な角度から自由に分析する、というのはなかなか難しくなります。

今回は、私が担当している某プロダクトの売上等のデータを長期的に集積し、統計処理や可視化を行うための基盤を試作してみました。

*(なお、この記事に出てくる数字やグラフの値は全部ダミーデータです！)*

## 目的

今回の目的はこの2点です。

* 某プロダクトの短期的/長期的な売上情報を分析しやすい状態にすること
* 様々なロールの社内関係者から分析結果を参照しやすい状態で提供すること。
* 他方で、閲覧権限の無い人には見えないようにすること

集計のリアルタイム性とかは気にしない方向。

## 構成

<img width="612" alt="kousei.png" src="https://qiita-image-store.s3.amazonaws.com/0/217205/40a5eba1-e74b-817b-5abc-6c92af16921a.png">

最近社内でGCPを使えるようになったので、基盤にはBigqueryを使います。
BigqueryはGCPの目玉機能の一つで、莫大なデータを投げ込んでも
速度をほとんど落とさずにクエリ結果を返してくれるというものです。

何百万行もあるデータでも2, 3秒でselect結果が返ってきます。
ホワイトペーパーでは350億行のフルスキャンを数十秒(!)で完了する、と[報告](https://cloud.google.com/files/BigQueryTechnicalWP.pdf)されています。
（今回扱うデータは多く見積もってもN千万行のオーダーなので若干オーバースペックな感じもありますが... 物は試し、です。）

Cloud Storageに処理済みのCSVを投げ込むと、Cloud Functionでイベントを受け取って自動的にBigQueryに格納するようにしました。

可視化は迷ったのですがとりあえずG SuiteのColaboratoryを使っています。
Colaboratoryは平たく言えばGoogleが改造したJupyter Notebookで、Pythonでデータの加工や可視化をインタラクティブに行える優れものです。
（Chrome Extensionとしても[配布されている](https://chrome.google.com/webstore/detail/colaboratory-notebook/pianggobfjcgeihlmfhfgkfalopndooo)ようなので、ぜひ触って見てください。）

Jupyterのサーバを立てたり、同じJupyter派生のGCP DataLabを使うという選択肢もあったのですが、G Suiteの認証情報でアクセス権を管理できるのでシンプルにできそう、という理由でColaboratoryを選びました。

今後、エンタープライズ向けのBIツール等が導入されたら置き換えても良いと思います。

## 各処理の詳細

**非正規化**

元データは、顧客への請求に用いられる階層状の明細データです。

<img width="803" alt="awsbill.png" src="https://qiita-image-store.s3.amazonaws.com/0/217205/9e3b04f1-e223-215e-7d02-14e3843dc752.png">


これはAWSの明細書ですが、こんな感じのでもう少し階層の深いデータを想像していただければ。これをBigQueryへの格納に適した形に加工します。

普通の業務用DBを相手にしていると「エンティティ毎にテーブルを分割して、正規化して..」と考えがちですし、一般的なDWHでもスタースキーマなどディメンジョンテーブルは最低限用意することが多いのですが、BigQueryでは処理の並列化と相性のよい"非"正規化されたデータの投入が推奨されているようです。

今回は階層状のXMLをElement毎に分解し、各行に重複を厭わず属性情報をつけていくことにしました。

**匿名化**

この種の統計処理には顧客やリソースを特定するための各種のIDは全く必要ないため、セキュリティの観点からも全て削ぎ落とし、値や品目、販売種別など分析に必要なデータのみを残します。

**テーブルの分割**

Bigqueryは莫大なデータを溜め込んでも保存は安いのですが、クエリでスキャンした容量に応じて課金されるという（ちょっと怖い）課金体系になっています。

where句やlimit句をつけても、指定したカラムのデータは全てスキャンされてしまうため、対策としてテーブルの（特に日単位時系列での）分割が推奨されています。

今回のデータは月毎のデータなので、各月の1日の日付をつけたテーブルを月ごとに作っていくことにします。

**可視化**

データの投入が終わったらデータの可視化です。
Colaboratoryの中で、bigqueryから必要な範囲のテーブル/カラムを読み出して、
pandasに格納して諸々の集計処理を行います。
（多量の処理であれば、bigquery側で集計させても良いと思います）

集計結果はこんな感じの画面になります。

<img width="1273" alt="graph1.png" src="https://qiita-image-store.s3.amazonaws.com/0/217205/aa728ed5-0cd4-eb3b-dd04-2b8f5d80b02d.png">
![graph2.png](https://qiita-image-store.s3.amazonaws.com/0/217205/820bad7a-fe83-6c46-4e4c-521f170f116f.png)

（※データや分布は全てダミーデータです。）

グラフ描画は何でも良いのですが、自分の使い慣れているseabornを使っています。

これで、各種データを自由に切ったり貼ったり統計取ったり推定したりできる環境が整いました。

Colaboratoryのノート（とBigqueryへの）アクセス権をG Suiteで管理すれば、閲覧できる人を任意に制御できます。

## 今後について

一通りデータ分析を実行できる環境が整ったので、周囲の人から使いやすくしていきたい。

* Colaboratoryでコードは非表示にできるオプションができると嬉しい
* 定点観測的な統計値の観測は自分が解析コードを書いて閲覧権限で配布すれば行けそうだけど、
コード書かないメンバがアドホックな解析をしたいときにデータを部分的に取得する方法を整備する
Sass導入（Mac版）

## Sass導入（Mac版）

Sass使いたくてインストールしました。
macでのコマンドなのでwinの方参考にならなかったらごめんなさい。


```shell
ruby -v #Rubyがインストールされているか確認する（バージョン確認）

sudo gem install -n /usr/local/bin sass #Sassのインストール

sudo gem update --system -n /usr/local/bin #gemをアップデートする

sudo gem install -n /usr/local/bin sass #Sassをアップデートする

cd [対象cssのあるディレクトリまでのパス]
```


####圧縮タイプ別のコンパイルコマンド(▼おこのみでお選びください)


```shell
# css圧縮なし
sudo sass --style expanded [ファイル名].scss:[コンパイル後のファイル名].css
# cssちょっと圧縮
sudo sass --style compact [ファイル名].scss:[コンパイル後のファイル名].min.css
# cssガチ圧縮
sudo sass --style compressed [ファイル名].scss:[コンパイル後のファイル名].min.css

```
[systemd-nspawn]ホスト自身をコンテナとして、即座に起動する

[systemd-nspawn Advent Calendar 2017](https://qiita.com/advent-calendar/2017/systemd-nspawn) 11日目の記事です。

systemd-nspawnコマンドで-Dオプションでコンテナディレクトリを指定すると思いますが、実はホスト自身も以下のように指定できてしまいます。


```bash
systemd-nspawn -D / -xb
```

これはどういう事かというと、btrfsのスナップショットを取って、そちらで一時(ephemeral)コンテナを起動するということをやっています。

ホスト起動中にホストのコンテナを動かすという一見するとトリッキーな事ができてしまうのです。
ただし、rootのファイルシステムがbtrfsの人限定ですので、ext4等を使ってる人はエラーとなってしまいます。
rawファイルをsystemd-nspawnで動かす場合

[systemd-nspawn Advent Calendar 2017](https://qiita.com/advent-calendar/2017/systemd-nspawn) 10日目の記事です。

実はsystemd-nspawnはdiskイメージも起動できます

例えばFedora27もこんな感じで起動できます

```bash
machinectl pull-raw --verify=no http://ftp.halifax.rwth-aachen.de/fedora/linux/releases/27/CloudImages/x86_64/images/Fedora-Cloud-Base-27-1.6.x86_64.raw.xz
systemd-nspawn -M Fedora-Cloud-Base-27-1.6.x86_64 -b
```

ディスクイメージをそのまま起動できます

なのでKVM等で動いていたrawイメージファイルもそのままコピーして起動できます

```
cp /var/lib/libvirt/images/debian.img /var/lib/machines/debian.raw
systemd-nspawn -b -M debian
```

注意点としてMBR、GPTの付いた普通に起動できるディスクイメージを用意しないと駄目です
ext4でフォーマットしただけのrawファイルは起動できませんのでVMで動いていたものを持ってくると良いとおもいます。
Windows イベントエラー

新卒エンジニアのWindows イベントエラーの原因と対処方法のメモ書き
だがしかし、解決策がいまだよくわからないものあり

サーバOS:Windows server 2012 R2
バックアップ:Arcserve Backup r17.5

・12292
>このイベントは、64ビットバージョンのWindowsで32ビットのボリュームシャドウコピーサービス（VSS）リクエスタを含むバックアップソフトウェアを実行することによって発生する可能性があります。 この場合、バックアップソフトウェアのベンダーに問い合わせる必要があります。 
[Event ID 12292 — VSS Shadow Copy Provider Operations](https://technet.microsoft.com/en-us/library/ee264208(v=ws.10).aspx)

→32ビットのバックアップソフトウェアを動かしたつもりないんだが・・・

・13

>この問題を解決するには、COM +イベントシステムサービスが開始され、ボリュームシャドウコピーサービス（VSSサービス）とMicrosoftソフトウェアシャドウコピープロバイダサービスの両方が有効になっていることを確認します。 また、サードパーティのインストール済みのVSSプロバイダーが正常に動作していることを確認する必要があります。 VSSプロバイダが正常に動作していない場合は、再インストールする必要があります。 それでも問題が解決しない場合は、プロバイダの製造元に問い合わせる必要があります。
[Event ID 13 — Volume Shadow Copy Service Operations](https://technet.microsoft.com/ja-jp/library/cc734254(v=ws.10).aspx)

→COM+サービスとVSSサービスが無効だったから？
COM+サービスは構築途中まで無効だったが、VSSはエラーがでてた間有効だったんだよなぁ・・・
ArcserveのほうでVSS系のエラーがでてて、そのサービス無効化したらArcserveもイベントログのエラーもでなくなって・・・？状態

・8193
>このイベントは、予期しないボリュームシャドウコピーサービス（VSS）エラーが発生したことを示します。
このエラー状態をトラブルシューティングするには、イベントビューアを使用して何が原因で発生したのかを判断し、VSSを使用するVdata保護アプリケーションを作成したベンダーに問い合わせる必要があります。 また、VSSサービスが有効になっていることを確認する必要があります。
これらの手順を実行するには、管理者のメンバーシップが必要です。または、適切な権限が委任されている必要があります。
[Event ID 8193 — Volume Shadow Copy Service Operations](https://technet.microsoft.com/en-us/library/ee264196(WS.10).aspx)

→イベントビューアで見たけどよくわからず・・・

・7000,7023,7001
Service Control Managerのエラー
サービスが普通に立ち上がればok
7001は依存サービスの関係なので依存サービス要確認

・219
ドライバー周り
何らかで「Windows Driver Foundation - User-mode Driver Framework」サービスが自動から手動に置き換わるとでてしまうらしい
デバイスマネージャーでエラーがでていなければ無視してok

・1102
あまりヒットせず