OmniAICreator/Qiita-1.07M huggingface dataset:
processing > 数値をグラフプロットしてみる / 折れ線グラフを描く

```txt:動作確認
Processing 3.1.1
Windows 8.1 pro (64bit)
```

## 数値をプロット

参考 http://yoppa.org/tau_bmaw13/4790.html

map()とellipse()を使って数値をプロットしてみる。

```java
void setup()
{
  size(800, 300);
  frameRate(2);
  background(255);
}

float vals[] = { 
3, 1, 4, 1, 5,
9, 2, 6, 5, 3, 
5, 8, 9, 7, 9, 
3, 2, 3, 8, 4, 
6, 2, 6 
};

int pos=0;

void draw()
{
   fill(0);
   if (pos < 23) {
     float tx = map(pos, 0, 23, 0, width);
     float ty = map(vals[pos], 0, 10, height, 0);
     ellipse(tx, ty, 4, 4);
     pos++;
   }
}
```

frameRate(2)としているため、0.5秒ごとにプロットが増える。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e1e26486-3dc8-6296-0840-a5e3b2ae9b3b.png)

上記はopenprocessingでも動く。
http://www.openprocessing.org/sketch/377113


### 折れ線グラフ

- line()を使う
- 前の値から今の値まで線を引く

```java
void setup()
{
  size(800, 300);
  frameRate(2);
  background(255);
}

float vals[] = { 
3, 1, 4, 1, 5,
9, 2, 6, 5, 3, 
5, 8, 9, 7, 9, 
3, 2, 3, 8, 4, 
6, 2, 6 
};

int pos=0;

void draw()
{
   if (pos == 0) { // skip 1st
     pos++;
   }
  
   fill(0);
   if (pos < 23) {
     float stx = map(pos-1, 0, 23, 0, width);
     float sty = map(vals[pos-1], 0, 10, height, 0);
     float etx = map(pos, 0, 23, 0, width);
     float ety = map(vals[pos], 0, 10, height, 0);
     line(stx, sty, etx, ety);
     pos++;
   }
}
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/888140eb-4419-f50c-acbe-289ab0c993e2.png)
表や図形入りエクセルドキュメントのきれいな作り方（超基本編）

エクセルを使って打合せ用のドキュメントを作成する場合に、基本的ではありますが、こういう点に
注意するときれいなドキュメントができるというポイントを以下にまとめました

　※初心者用です

#1.土台作り
　(1)エクセルシートのセル列幅を2～2.5程度に設定し、シート全体をマス目のようにする
　　→ 2.5というサイズは個人的な好みですが、こうすることによりシート上の自由な位置から簡単
　　 に書き始めることができます
![Qiita](https://qiita-image-store.s3.amazonaws.com/0/125857/e672b957-981e-7110-e827-f5ef4ce71a18.png)
　(2)セル書式の表示形式を文字列にする
　　→ 単に文章を書くだけならば余計な変換が入らないので表示形式は「文字列」を推奨します
   ![Qiita](https://qiita-image-store.s3.amazonaws.com/0/125857/47bbe4ef-6ea9-412b-928e-bfadc42a6cee.png)
#2.文章
　(1)ドキュメントの中での項番ルールを決める
　　→ 私がよく使うのは、この記事のような項番ルールです（項番ルールの途中に「・」(中点)や
　　 「→」(矢印)を含めることもあります）

　(2)項番ルールに対する字下げを行う
　　→ 字下げが適切ではない文章は読みにくいものです

　(3)2行以上の文章に対する改行位置を揃える
　(4)項番の変わり目などで1行空ける
　(5)語尾表現を統一する
　　→ 一定のルールなしに「です・ます」調と「である」調が混在していたりすると、とても気に
　　　なります
　
#3.図
　(1)同じ大きさの図形（四角形など）を縦や横に並べる場合
　　→ 位置合わせしたい図形(複数)をマウスで選択し、ツールバーの「図形の調整」／「配置/整列」
     の中から「上揃え」「左揃え」などを選択することで、簡単に位置合わせができます
    ![Qiita](https://qiita-image-store.s3.amazonaws.com/0/125857/e8853469-7b8d-29fa-3870-094958e8f499.png)

![Qiita](https://qiita-image-store.s3.amazonaws.com/0/125857/b73647af-8d6d-23e2-18d8-b548ec21cf41.png)

　(2)水平・垂直の罫線はまっすぐに引く
　　→ 罫線を選択しマウス右クリックで「配置とサイズ」を選択すると図形の書式設定画面が出て
　　　きます
　　　横罫線の場合は「高さ＝0」、縦罫線の場合は「幅＝0」に設定するとまっすぐな罫線になりま
　　　す
　![Qiita](https://qiita-image-store.s3.amazonaws.com/0/125857/41123fde-557c-2bfc-b8ac-1d37773e10ad.png)

　![Qiita](https://qiita-image-store.s3.amazonaws.com/0/125857/9b32991a-2a01-542f-2c00-a13b2ba6e476.png)

　(3)図形と線の結合部などの細かい調整が必要な個所は、倍率を150％や200％に上げて微調整する
#4.ヘッダー、フッター
　(1)ヘッダーの中心部にはシート名を設定し、右端部にはファイル名を設定する
　　→ シート名のデフォルトは、Sheet1、Sheet2・・・なので、適切なタイトルを記載してくださ
　　　い

　(2)フッターの中心部にページ（ページ番号/総ページ数）を設定する

#5.仕上げの確認
　(1)誤字・脱字をチェックする
　(2)印刷プレビュー表示で、テキストボックスの中の文字が切れていないか等をチェックする
　　→ エクセルでは実際に印刷してみるとテキストボックスの中の文字が切れていたり、改行位置
　　　がズレていることがよくあるので、印刷プレビューまたは実際の印刷物で十分にチェックをし
　　　てください

以上
processing > Serial受信してみる / echo server

```txt:動作環境
Processing 3.1.1
Windows 8.1 pro (64bit)
```

シリアル通信を受信する実装をしてみた。

## code

参考 http://yoppa.org/tau_bmaw13/4790.html
関連 https://processing.org/reference/libraries/serial/Serial.html

```java:sketch_160713serialComm
import processing.serial.*;

Serial myPort;

void setup()
{
  size(200,200);
  frameRate(60);
  
  println(Serial.list());
  myPort = new Serial(this, Serial.list()[0], 9600); // COM1
  myPort.bufferUntil('\n');
}

void draw()
{
    
}

void serialEvent(Serial myPort) { 
   String mystr = myPort.readStringUntil('\n');
   mystr = trim(mystr);
   println(mystr);
}
```

## 実行環境

- シリアル受信側: processingを動かすPC (Windows 8.1pro)
- シリアル送信側: TeraTermで送信する (Windows 7 pro)

上記の2つの端末をシリアルのケーブル(クロス)で接続する。
こちらではVMイメージ2つにてnamed pipeを使っての動作をした。

送信側のTeraTermでは「設定 > 端末」にて[CR]を[CR+LF]に変更する。LFを終端として認識するため。

## 実行

1. 上記のスケッチを動かす
2. 送信側のTeraTermで任意の文字(例:aaa)を入力して[Enter]を押す
 
processingのコンソールに以下のように表示される。

```
COM1 COM2 COM3 COM4
aaa
```

## echo server

echo serverとする場合は、write()を使う。
https://processing.org/reference/libraries/serial/Serial_write_.html
> Syntax    serial.write(src)
> src	String: data to write

```java
import processing.serial.*;

Serial myPort;

void setup()
{
  size(200,200);
  frameRate(60);
  
  println(Serial.list());
  myPort = new Serial(this, Serial.list()[0], 9600); // COM1
  myPort.bufferUntil('\n');
}

void draw()
{
    
}

void serialEvent(Serial myPort) { 
   String mystr = myPort.readStringUntil('\n');
   mystr = trim(mystr);

   // echo back
   String ret = mystr + "\r\n";
   myPort.write(ret);

   println(mystr);
}
```
モノづくり系のイベントの話


![無題.png](https://qiita-image-store.s3.amazonaws.com/0/97208/a10d1c90-faaa-7b72-4e8a-dc5acc3c09a8.png)

---

##ものづくりイベントって？

ユニークなものを作り出す「Maker」が集い、展示とデモンストレーションをする。
![MakerFaireTokyo2015_00.jpg](https://qiita-image-store.s3.amazonaws.com/0/97208/c1201a00-ab8f-d51d-d4e4-7c196c6b54a5.jpeg)

---

##新しい発見がある

---

##それがモノづくりイベントのよさ

---

##具体的にどんなイベントがあるの？

---

#ニコニコ技術部

---

##NT京都
京都の神社で開催されるイベント。BBQがあったり、境内を戦車が走ったりと緩い。
#####参加費 ：　無料
#####日程 ：　3月中旬
[NT京都へのリンク](http://wiki.nicotech.jp/nico_tech/index.php?NT%E4%BA%AC%E9%83%BD2016 )　

---
![](http://wiki.nicotech.jp/nico_tech/index.php?plugin=attach&refer=NT%E4%BA%AC%E9%83%BD2016&openfile=NT%E4%BA%AC%E9%83%BD2016%E3%83%AD%E3%82%B3%E3%82%99mini.jpeg)

---

##NT金沢
金沢駅の地下で開催されるイベント。コスプレしているひともいる。
#####参加費 ：　無料
#####日程 ：　7月16日-7月18日
[NT金沢へのリンク](http://wiki.nicotech.jp/nico_tech/index.php?NT%E9%87%91%E6%B2%A22016 )　

---
![](http://wiki.nicotech.jp/nico_tech/index.php?plugin=ref&page=NT%E9%87%91%E6%B2%A22016&src=ntkanazawa2016_img.jpg)

---

##NT名古屋
大須で開催されるイベント。
#####参加費 ：　無料
#####日程 ：　10月9日
[NT名古屋へのリンク](http://wiki.nicotech.jp/nico_tech/index.php?NT%E4%BA%AC%E9%83%BD2016 )　

---

##NT系の特徴
わりと自由な展示ができ、
初心者でも気軽に出せる感じがいいと思います。
会場も様々で出展者も来る人もいろいろいるのがよいところ。

---

#MakerFaire

---
##MakerFaire Tokyo
日本で一番大きいmakerのイベント。東京ビックサイトで行われており、展示物も多種多様。
#####参加費 ：当日 大人 1,500円 18歳以下 700円
#####日程 ：　8月6日-8月7日
[MakerFaire Tokyoへのリンク](http://makezine.jp/event/mft2016/ )　

---
![](http://makezine.jp/wp-content/uploads/2015/01/D8A2425.jpg)

---

##Yamaguchi Mini Maker Faire
YCANがある山口県で開催されるMakerFaire。
#####参加費 ：　無料
#####日程 ：　2017年（おそらく）
[Yamaguchi Mini Maker Faireへのリンク](http://special.ycam.jp/ymmf/ )　

---
![](http://vordermagazine.com/wp-content/uploads/2015/09/makeryamaguchi-1024x475.png
)

---

##Ogaki Mini Maker Faire
IAMASがある岐阜県の大垣で開催されるMakerFaire。
#####参加費 ：　無料
#####日程 ：　12月3日-12月4日
[Ogaki Mini Maker Faireへのリンク](http://ommf.iamas.ac.jp/ )　

---
![](http://www.iamas.ac.jp/wordpress/wp-content/uploads/2014/05/MOM2012_2.jpg)

---

##MakerFaireの特徴
東京の場合、審査があったりと完成度の高い作品が多い。
子供が遊べるような展示もある。

---

#その他のイベント

---

##伊勢ギークフェア

三重県の伊勢市で開催されるMakerイベント。ヘボコンなど開催されている。
#####参加費 ：　無料
#####日程 ：　10月中旬
[伊勢ギークフェアへのリンク](https://sites.google.com/site/igfaire2016/home )　

---
##メイカーズバザール大阪
大阪の南港で開催されているMakerイベント。MakerFaireに次ぐ規模がある。
#####参加費 ：　無料
#####日程 ：　7月9日-7月10日
[メイカーズバザール大阪へのリンク](http://makersbazaar.jp/ )

---

##こんなにいろいろある

---
##IoTもいろいろある！
モノづくりイベントでアイデアを見て今のアイデアをよりよくするためにも！

---

##一度試しに見に行ってみませんか？
sqlalchemyを使ってテーブル検索して辞書を作成する

### DBのテーブルをストアド実行で検索して、辞書を作成する
　例えばSQLServerに任意のテーブルの複数レコードを横に展開した1レコードを返すストアドプロシージャを用意しておいて、それをSQLAlchemyでストアドを実行し、その実行結果(vle)をfetchone()で取得するとともに、そのデータの列名(clm)をkeys()で取得。それら２つをzip関数でlist化して、それをdict辞書にするなどしておけば、その後の工程でelementTreeを使ってXMLファイル作成などの処理が展開可能となる。

```py3:make_dict.py
    import sqlalchemy

    ym = 201603

    CONNECT_INFO = 'mssql+pyodbc://hogehoge' #hogehogeは任意のdns(odbc接続)
    engine = sqlalchemy.create_engine(CONNECT_INFO, encoding='utf-8')

    # セッション生成
    Session = sqlalchemy.orm.sessionmaker(bind=engine)
    session = Session()
    
    #ストアドプロシージャ実行 
    query = 'EXEC dbo.sp_rtrv4XML @prd = {0}'.format(ym)
    #vle = session.execute(query).fetchall() #実行結果取得:複数結果が返ってくる場合 
    #print( vle[0][0] )

    vle = session.execute(query).fetchone() #実行結果取得:１件返ってくる
    clm = session.execute(query).keys()  #列名取得

    dc = dict(zip(clm , vle)) #辞書作成
    print(dc)

    # セッション後始末
    #session.commit()
    session.close()

```
注）接続するDBはSQLServerを想定。SQLServerの場合、ストアドの実行はEXEC文で行う

###補足

```sql:apdx.sql
--テーブルの複数レコードを横に展開して1レコードにするSELECT文
;WITH apdx
AS(
    SELECT 1 AS n,'vle1-1' AS fld1 , 'vle1-2' AS fld2 UNION ALL
    SELECT 2 AS n,'vle2-1' AS fld1 , 'vle2-2' AS fld2 UNION ALL
    SELECT 3 AS n,'vle3-1' AS fld1 , 'vle3-2' AS fld2 UNION ALL
    SELECT 4 AS n,'vle4-1' AS fld1 , 'vle4-2' AS fld2 
)
--SELECT *FROM hoge
SELECT 
    MAX(CASE WHEN n= 1 THEN fld1 END )AS fl11
,   MAX(CASE WHEN n= 1 THEN fld2 END )AS fl12
,   MAX(CASE WHEN n= 2 THEN fld1 END )AS fl21
,   MAX(CASE WHEN n= 2 THEN fld2 END )AS fl22
,   MAX(CASE WHEN n= 3 THEN fld1 END )AS fl31
,   MAX(CASE WHEN n= 3 THEN fld2 END )AS fl32
,   MAX(CASE WHEN n= 4 THEN fld1 END )AS fl41
,   MAX(CASE WHEN n= 4 THEN fld2 END )AS fl42
FROM apdx

/* 
実行結果↓
fl11	fl12	fl21	fl22	fl31	fl32	fl41	fl42
vle1-1	vle1-2	vle2-1	vle2-2	vle3-1	vle3-2	vle4-1	vle4-2
*/
```


```py3:apdx.py
#ZIP関数を使って辞書を作成
   clm = ['fld1','fld2','fld3','fld4']
   vle = ['vle1','vle2','vle3','vle4']

   y = zip(clm,vle)
   print(dict(y))
   # {'fld3':'vle3','fld2':'vle2','fld1':'vle1','fld4':'vle4',}

```
さくらのクラウドのオブジェクトストレージにGo言語からアクセスしたい

## やりたいこと

参考1:[さくらのクラウド オブジェクトストレージをRubyから操作する](http://qiita.com/toshitanian/items/eab866b46bdec7283d4b)
参考2:[さくらのクラウド オブジェクトストレージをPythonから操作する](http://qiita.com/toshitanian/items/de45b827886af6370edd)

これをGo言語からやりたい。

## 結論

[mitchellh/goamz](https://github.com/mitchellh/goamz)を使えばできました。
以下は試した記録です。

## 試した1：AWS公式SDK / ダメでした

[aws/aws-sdk-go:S3 V2 signing(#400)](https://github.com/aws/aws-sdk-go/issues/400)

現状ではsignature v2には対応してない。
さくらのクラウドのオブジェクトストレージは[v2のみ対応](http://cloud-news.sakura.ad.jp/faq_top/faq_objectstorage/)。

## 試した2：goamz / できた!

https://github.com/mitchellh/goamz

安心のHashicorp社[mitchellh(Mitchell Hashimoto)](https://github.com/mitchellh)のリポジトリですね。
これならいける、、？

こちらの記事ではできてそうなので試してみました。
[参考:GolangでRiakCSにオブジェクトを書き出す](http://qiita.com/erukiti/items/93aefa83f71787d7ff91)

```go:main.go
package main

import (
	"os"
	"log"

	"github.com/mitchellh/goamz/aws"
	"github.com/mitchellh/goamz/s3"
)

func main() {
	//アップロードするファイル
	file, err := os.Open("./test.txt")
	if err != nil {
		log.Println(err.Error())
	}
	defer file.Close()

	//アップロードするファイルのサイズ取得用
	fi , err := file.Stat()
	if err != nil {
		log.Println(err.Error())
	}

	// s3クライアントを環境変数から作成
	// 事前に以下の値を環境変数に設定しておく
	// AWS_ACCESS_KEY_ID     : アクセスキーID
	// AWS_SECRET_ACCESS_KEY : シークレットアクセスキー
	auth, err := aws.EnvAuth()
	if err != nil {
		panic(err.Error())
	}
	cli := s3.New(auth , aws.Region{
		Name                 : "us-west-2",                  //なんでもいいらしい
		S3Endpoint           : "https://b.sakurastorage.jp", //さくらのオブジェクトストレージ用URL
	})

	// バケット
	bucket := cli.Bucket("wanwano")

	// バケットに対しアップロード
	err = bucket.PutReader("test.txt" , file , fi.Size(), "text/plain" , s3.PublicRead)
	if err != nil {
		panic(err.Error())
	}
}

```

クレデンシャルを環境変数から読めるようにしてくれてて楽。

以上です。

#### おまけ

オブジェクトストレージの操作について記事を書きました。
[さくらのクラウドのオブジェクトストレージを使う(docker + s3cmd)](http://qiita.com/yamamoto-febc/items/e9e00add2615daf9ef46)

実装中に作成されたゴミファイルなどの削除に便利です。
こちらもあわせてどうぞ:bangbang:
CodenvyでJava+MavenのプロジェクトをHello Worldしてみる


#Codenvyのアカウント作成
まずはCodeenvyのアカウントを作成します。
https://codenvy.com/

#workspaceの作成とHello World
今回はEclipse Cheのテンプレートを利用してプロジェクトを作成します。
https://www.eclipse.org/che/getting-started/cloud/

①「Create a workspace from a template」の下から作成したいWorkspaceを探します。
②「Java+Maven」を選択し「Launch　Workspace」を押下します。
③ Codenvyにログインするとワークスペースが自動で作成されます。
④ CodenvyのWorkspacesから作成されたworkspaceを選択し「OPEN IN IDE」を押下します。
IDEが開くまでは時間がかかります。しばらく待機してください。
⑤CMDと書かれている箇所の｢▼｣から「Edit Commands」を押下します。
⑥JAVAと書かれている箇所の「+」マークから構成を作成します。
Name：Hello World
Main class:src.main.java.org.eclipse.che.examples.HelloWorld.java
テンプレートにはデフォルトでHelloWorldのクラスが用意されています。
⑦CMDから「Hello World」を選択し、「▶」を押下します。
「Hello World Che!」と表示されます。
終わり
XcodeでInclude of non-modular header inside framework module "XXX" エラー

Include of non-modular header inside framework moduleエラーが出てビルドが通らない。
ネットを漁っているとこちらのissueを発見.


https://github.com/ReactiveX/RxSwift/issues/411
https://github.com/CocoaPods/CocoaPods/issues/4835

issueにも書かれているがrecursiveにするのはあんまり良くないようで（別の問題が発生するかも）。
ただ、とりあえずビルド通したかったのでrecursiveにしてみるかー、とBuild Settings -> Header Search Pathsを見てみたら、すでにrecursiveになっていた！
これのせいじゃないの?、ってことでnon-recursiveに戻したらエラー解消しました。

同じエラーの時はBuild Settings -> Header Search Pathsの設定を見直してみるといいかもしれません。
Eclipse Tomcatツールバーを表示させる方法

#概要
Tomcatを起動・停止・再起動するツールバーが表示されなくなるのでメモします。

表示したいのはボタン　![image](https://qiita-image-store.s3.amazonaws.com/0/108485/080b8f3d-5c13-1207-8c5b-9c8ba5d7693f.png)

使用しているのはこのEclipse です
Eclipse Java EE IDE for Web Developers.
Version: Mars.2 Release (4.5.2)


# やってみよう
1. ウインドウ＞パースペクティブ＞パースペクティブのカスタマイズ　を開きます

<img src="https://qiita-image-store.s3.amazonaws.com/0/108485/05ef8fdb-53fe-5988-d73b-07e7934efd35.png" width="500px">

２. 「Action set Availability」 タブを選択して 「Tomcat」 にチェックする　 

<img src="https://qiita-image-store.s3.amazonaws.com/0/108485/79110734-72a2-921b-a79f-f62b9c654f70.png" width="400px">




右下の[OK]ボタンを押下して閉じれば表示されました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/108485/fbe4a012-5145-a5a4-21f9-54381bb51caa.png" width="400px">
MySQLのrootパスワードを変更したい

# とりあえずmysqlを止める
```
service mysql stop
```
# safeモードで起動する
```
/usr/bin/mysqld_safe  --skip-grant-tables
```
# password無しでログインできるようになる
```
mysql -u root
```
# アップデートをかける
```
$ UPDATE mysql.user SET Password=PASSWORD('1234') WHERE User='root';
$ FLUSH PRIVILEGES;
```
# mysql起動
```
$ mysql.server restart
```

# 確認
```
$ mysql -uroot -p
Enter password: 1234
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.49-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

```
Macを移行後、Vagrantが起動出来なくなった

## Macを移行ユーティリティで移行したらvagrant upでエラーが出るようになった
```bash:
The VirtualBox VM was created with a user that doesn't match the
current user running Vagrant. VirtualBox requires that the same user
be used to manage the VM that was created. Please re-run Vagrant with
that user. This is not a Vagrant issue.

The UID used to create the VM was: 504
Your UID is: 505
```

## 解決策
```bash:
vi .vagrant/machines/default/virtualbox/creator_uid
```
* 上記ファイルの中にUIDが記述されている(自分の場合は504)
* エラーで記述されているUIDに書き換える
Bash on Ubuntu on Windowsの導入

#概要
Windows10から実装されたBash on Ubuntu on Windowsの導入の説明を行う．
説明[ここのサイト](http://rcmdnk.github.io/blog/2016/06/05/computer-windows-ubuntu-bash/)をもとに以下の手順で行う．

1. Window Insider Programへの参加
2. Insider Previewのインストール
3. Windowsのバージョン確認
4. 開発者向けモードへの設定
5. Bashの有効化

##Window Insider Programへの参加
**設定**の**更新とセキュリティー**→**WindowsUpdate**から詳細オプションへ行き，**Insider Previewビルドの入手**というところで開始するを押すと，以下のダイアログがでるので**登録**を押す．

![20160605_insiderpreviewstart.jpg](https://qiita-image-store.s3.amazonaws.com/0/49447/2a0273f3-a96e-5266-5fca-88b5502104bb.jpeg)

![20160605_insiderpreviewjoin.jpg](https://qiita-image-store.s3.amazonaws.com/0/49447/2cc7c0fe-361f-c61d-33b6-af775ea303a1.jpeg)

ここでMicrosoftアカウントを持っていれば，Webページでログインし，Insider Programに参加する．(アカウントを持っていなければ登録する)

##Insider Previewのインストール
以下の図のように**設定**の**更新とセキュリティー**→**Windows Insider Program**のInsiderのレベルを**ファースト**にしておく．これは新しいビルドをどれだけ頻繁に入手するかというオプションです．

![b.png](https://qiita-image-store.s3.amazonaws.com/0/49447/755b7702-5aa7-b03a-6f91-990247e5e5b3.png)

この設定を行いしばらく待つと自動的にチェックして入手してくれるらしいので，待つしかないです．

早ければ1時間以内、ヘタすると1日位かかるみたいですが、僕は 設定して3時間位したら入手できる様になりました．

しばらくして**Windows Update**を見て、更新プログラムのチェックを行います．すると**Windows 10 Insider Preview XXXXX**が出てきていたらOK．そのままインストール．

![20160605_insiderpreviewinstall.jpg](https://qiita-image-store.s3.amazonaws.com/0/49447/83d078ba-a7a0-3fcb-41be-2e8b167c5088.jpeg)

##Windowsのバージョン確認
Insider Previewをインストールしましたが，それを確認するためにWindowsのバージョンの確認をします．
Cortana(左下にある「何でも聞いてください」って書いてあるところ)にwinverと入力して実行すると以下のような画面が出てきます．

![20160605_winver.jpg](https://qiita-image-store.s3.amazonaws.com/0/49447/f3265e80-a27f-f650-243f-8ea114463288.jpeg)

Insider Previewをインストールしていれば**OSビルド**が**14000**より大きな数字になっているはず．(なっていなかったらどこかで間違っているはず，，，)

##開発者向けモードへの設定
Bashを有効化する前に，Bash機能を使うために開発者向けモードに設定する必要があります．

そのために，**設定**→**更新とセキュリティ**→**開発者向け**に行くと**開発者向けモード**を選べる項目があるのでそれを選ぶ．

##Bashの有効化
最後にBashの有効化を行います．
**コントロールパネル**を開き，**プログラム**→**Windowsの機能の有効化また無効化**を開く．

![20160605_winfunctions.jpg](https://qiita-image-store.s3.amazonaws.com/0/49447/5818ef10-c9de-a930-6f9f-74724fac9fa6.jpeg)

今までの設定ができていれば，**Windows Subsystem for Linux(Beta)**という項目があるので，チェックを入れてOKを押す．

再起動をするように言われるので，従います．

再起動後，コマンドプロンプトを起動し，**bash**とコマンドプロンプトに打ちます．そうするとBashをインストールするかを聞かれるので**"y"**と入力．

その後，ユーザ名やパスワードを設定するように言われるので，設定する．

これで完了．
起動するときはコマンドプロンプトに**bash**と打つか，Cortana(左下にある「何でも聞いてください」って書いてあるところ)にbashと打つと出てくるやつを起動するかでOK.

##参考サイト
>[Windowsに採用されたBash (Ubuntu)を試してみる](http://rcmdnk.github.io/blog/2016/06/05/computer-windows-ubuntu-bash/)
screen使いたくて震えたので入れた

昔はtmux使ってたんだけど、いろんな意味で(てか前に戻れたりするので)screenが好きなのでscreen使ってみる。

# 導入

```
yum install screen
```

簡単。

# 設定
`~/.screenrc`を作る。
下みたいな感じで。


```vim
defencoding utf-8
escape ^Zz
autodetach on
defscrollback 2000
startup_message off
# zombie kr # 死んだ時：k / 復活したとき：r
# verbose on
defkanji on
hardstatus alwayslastline "%{= wg} %-w%{=bu dr}%n %t%{-}%+w %= %{=b kw} %Y/%m/%d %0c"
sorendition "+rb .G"
termcapinfo xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'
```

|設定|説明| 
|:-----------------|:------------------|
|defencoding|表示する文字コードを設定|
|escape|prefixのキーを設定|
|autodetach|突然死んでもプロセスを生かしてくれる|
|defscrollback|ウィンドウで遡れる量|
|startup_message|スタートアップしたときのメッセージをオフにする|
|zombie|死んだ状態のキーと復活させるキーを設定|
|verbose|ウィンドウ生成／破棄時のメッセージ表示|
|defkanji|日本語対応|
|hardstatus|タブ表示にする|

`zombie`は入れて試したけどめちゃくちゃうざい。
`exit`した後かならずキー入力が欲しい。うざったい。

`termcapinfo`はscreen起動時にウィンドウサイズが変わるのを抑止。コピペしました。
→http://blog.goo.ne.jp/sohgoh/e/362865b122f5151f78ea7c7f16267659

# コマンド
※設定でprefixをctrl+zにしてある。

|コマンド|説明
|:-----------------|:------------------|
|screen|起動|
|ctrl+z c|新しい仮想端末を開く|
|ctrl+z w|動いている仮想端末の一覧を表示|
|ctrl+z k|現在の仮想端末を閉じる|
|ctrl+z d|デタッチ|
|screen -ls|デタッチで動いている仮想端末の一覧表示|
|screen -r [PID]|アタッチ|
|ctrl+z \|デタッチせずにscreenを終了|
|ctrl+z [|バックスクロールモードにする|
|ctrl+z S|画面を上下2分割|
|ctrl+z [tab]|フォーカス画面の移動|
|ctrl+z Q|画面分割をやめる|
|screen -S [セッション名]|セッション名を付けて起動|
|ctrl+z A|現在のウィンドウに名前をつける|
|ctrl+z [0-9]|指定したウィンドウ番号へ飛ぶ|


縦画面できるのはtmux結構強いけど、IDE依存しちゃうとscreenの方がいろいろわかりやすくて良い気がした。
ずっとターミナルとかコンソールとか使うならtmuxの方がいいかも。
ログとサーバ起動ぐらいしか使わないから、これでいいのだ多分。

ちなみにscreenの縦分割はインストールとかいろいろ必要でめんどくさいから割愛(必要になったらやるかも)

追記
文字化けするときは`screen -U [セッション名]`で起動すると直る。
マイクロサービスアーキテクチャにおけるオーケストレーションとコレオグラフィ

[マイクロサービスアーキテクチャ](https://www.oreilly.co.jp/books/9784873117607/)の4章にオーケストレーションとコレオグラフィという話があります。

![book](https://www.oreilly.co.jp/books/images/picture978-4-87311-760-7.gif)

マイクロサービスを使ってアプリケーションを組み立てる側の、サービスの呼び出し方の違いです。

「マイクロサービス的に作ってるよー」というシステムでも、ここに特に疑問を持たず、ふつうにWeb APIたちを呼び、受け取ったデータでHTMLをレンダリングするという**オーケストレーション**方式で作られているのが多いのではないでしょうか?

Sam Newmanは、それだと呼び出されるサービス側が[ドメインモデル貧血症](http://bliki-ja.github.io/AnemicDomainModel/)になりがちで、呼び出す側にロジックが集まっていくことになると、書籍の中で述べています。

いったいどういうことでしょうか? 書籍中の例をちょっと変えて考えてみます。

## マイクロサービスアーキテクチャでECサイトを作る(オーケストレーション編)

ECサイトをマイクロサービスアーキテクチャで作ることを考えてみます。購入するときに会員登録するとポイント付与したり、サンキューメール送信したりします。

したがって、その会員登録時の処理としては、以下のようになるでしょう。

1. 顧客管理サービスを呼び出し、会員として登録する。
2. ポイントサービスを呼び出し、新規会員登録時のポイントを付与する。
3. メール送信サービスを呼び出し、会員登録サンキューメールを送信する。

![オーケストレーション](https://qiita-image-store.s3.amazonaws.com/0/8475/28c03eff-81d7-0bc6-c223-8093ee53f385.png)

### アプリケーションを新たに作る

ECサイトがそこそこヒットし、高齢者の利用者も増えてきましたが、サイトが使いにくいとか、こういう商品も扱って欲しいとかいう声を聴くようになりました。しかし、それ以外の利用者層には概ね好評です。

そこで、既存のECサイトとは別にシニア向けサイトを別に作ることにします。ここでも、会員登録する必要があるので、同じようにサービスを呼び出す必要があります。

![orche2.png](https://qiita-image-store.s3.amazonaws.com/0/8475/3221870c-233f-8a7d-4b28-600608c1e408.png)

ここでの問題は、新しく作ったサイト(アプリケーション)で、会員登録機能があれば、顧客管理サービス、ポイントサービス、メールサービスを呼び出すというきまりを忘れないようにしなきゃいけないことです。
これは事業が拡大していって、新しい開発者がどんどん増えていくときには結構難しい問題であることは、みなさんも経験あるかと思います。

### 会員登録時のルールが変わる

また、会員登録時にメールアドレスを登録しなきゃいけないことに障壁があって、会員登録数が伸び悩んでいることが分かったので、メールアドレスを任意にして、メールアドレスがない人にはダイレクトメールを発送することにします。

この場合、各サイト(アプリケーション)にそのロジックを追加し、DM発送サービスの呼び出しを**忘れないように**追加していかなくてはなりません。

![orche3.png](https://qiita-image-store.s3.amazonaws.com/0/8475/b9a2fa3f-1371-bbce-c619-d94bd1e262a5.png)

### オーケストレーションの問題のまとめ

というように、ロジックが呼び出し側に寄ると修正に範囲が多くなってしまうことが分かります。これが、モノリシックなアーキテクチャであれば同じチーム内で解決することなので、あまり大きな問題にならないかもしてませんが、マイクロサービスアーキテクチャでは、コンウェイの法則によりサービス・アプリケーションが異なれば、異なるチームが担当していることが多くなるので、多くのチームに影響を及ぼす修正は、より避けたくなるでしょう。

## マイクロサービスアーキテクチャでECサイトを作る(コレオグラフィ編)

これを解決するために、イベントのpubsubによってサービス間の結合を疎にする方式が、コレオグラフィとして紹介されています。

各マイクロサービスが、イベントをサブスクライブしていて、新規会員登録イベントが発生したら、それを受け取り、それぞれ処理を行うというものです。

![bus1.png](https://qiita-image-store.s3.amazonaws.com/0/8475/5912cafa-4872-b7f4-df5b-27d440eb3003.png)

したがって、ECアプリケーション側の処理は、以下のようになります。

1. 新規会員登録イベントをパブリッシュする。
2. 新規会員登録イベントがサブスクライブしている各マイクロサービスで適切に処理されたら、その旨の通知を受け取る。

イベントの受け渡しの具体的なプロダクトとしては、書籍の中ではRabbitMQが挙げられていますが、上記のようなリアルタイム性が高く、リプライのメッセージも受け取れるようなメッセージングの仕組みであれば、他でも構築できると思います。

さて、オーケストレーションのときの課題は、コレオグラフィではどうなるのでしょうか?

### アプリケーションを新たに作る

どのサービスを呼び出すかを、アプリケーション側は知らなくてよいので、同じように新規会員登録のイベントを作成しパブリッシュするだけです。

![bus2.png](https://qiita-image-store.s3.amazonaws.com/0/8475/a4a79588-5860-0f9a-4de5-7f702ea46311.png)

これならサービスの呼び忘れは発生しなさそうです。

### 会員登録時のルールが変わる

会員登録時にDMを送る変更はどうなるでしょうか?

![bus3.png](https://qiita-image-store.s3.amazonaws.com/0/8475/6e846f47-cb1f-6b6d-9bea-313dc5e59b8e.png)

これもシンプルです。DM発送サービスが新たに、新規会員登録イベントをサブスクライブするだけです。新規会員登録をもつサイト(アプリケーション)が何個あっても同じです。それらには影響を与えません。DM発送サービスが、新規会員登録イベントで、Eメールが設定されてないものを受け取り処理するだけです。

## まとめ

というように、徐々に全体のシステム規模が大きくなっていくことが予想されるマイクロサービスアーキテクチャにおいては、その影響をできるだけ少ないサービス(チーム)に留めることが重要になってきて、コレオグラフィはその解決策のひとつになるかもしれません。
c++ builder / fileIO > TFile::Copy() > 大きいファイルのコピー時 > 「5秒以上の応答なし」の確認

```txt:動作確認
C++ Builder XE4
Windows 7pro (3GB メモリ割当)
```

TFile::Copy()関連の情報を見ている中で以下を見つけた。

http://owlsperspective.blogspot.jp/2013/08/CopyFileEx.html
> DelphiでファイルをコピーするときはWin32APIのCopyFile関数 (en)か、これをラッピングした(System.)IOUtilsのTFile.Copyなどを使うのが普通ですが、大きめのファイルだったり遅いデバイスだったり、あるいはその両方で、ファイルコピーに5秒以上かかるとWindowsに"応答なし"と判断されてしまうことになります。

上記の情報は（おそらく)DelphiXE3で動かしたのだと思われる。

こちらの環境(C++ Builder XE4)で応答なしになるか確認した。

コピーするファイルは現在セットアップ作業に使っている以下のファイル(3.6GB)を用いた。
http://ftp.riken.jp/Linux/centos/6/isos/x86_64/
のCentOS-6.8-x86_64-bin-DVD1.iso

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TButton *Button1;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <IOUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String from = L"D:\\TestData\\160713_FROM\\CentOS-6.8-x86_64-bin-DVD1.iso";
	String to = L"D:\\TestData\\160713_TO\\CentOS-6.8-x86_64-bin-DVD1.iso";

	try {
      	TFile::Copy(from, to, /* overwrite=*/true);
	} catch (...) {
		int nop1 = 1;
	}
	int nop2 = 1;
}
//---------------------------------------------------------------------------
```

上記の動作で確認したかったことは「5秒以上の応答なし」の時にtry, catchでエラーとなるか、ということだった。

実際に動かしたところ、try, catchでのエラーは発生しなかった。
一方で、メインウィンドウの表示がコピー中は更新されなかったため、こちらが「5秒以上の応答なし」に対応するのかもしれない。

ファイルコピー自体は90秒程度かかった。
GHCでプロファイルが取れない - Could not find module ...

**普通のコンパイルは通る**けど、
**`-prof`をつけたら通らない**時に解決できるかもしれません


## 遭遇したエラー ##

```sh
$ ghc -prof -auto-all boid.hs
```
して、

```
boid.hs:2:18:
    Could not find module ‘System.Random’
    Perhaps you haven't installed the profiling libraries for package ‘random-1.1@rando_9Kgekc9yEaLHLNUuw6paWL’?
    Use -v to see a list of the files searched for.
```

`random`パッケージインストールしてるのに、`Could not find module ...`とかと言われる


## 解決策 ##

これでパッケージを再インストールすると行けました
（`random`になっているところを「Could not find」のモジュールに変えてください）

```sh
cabal install -p random --reinstall --force-reinstalls
```


ちなみに、`-p`っていうのが`--enable-library-profiling`略ぽいです（多分）

## 参考 ##

* [第5章 プロファイルを取る](http://www.kotha.net/ghcguide_ja/7.6.2/profiling.html)
* [GHCでプロファイルを取って高速化を計る（標準乱数は遅いから使うな編）](http://d.hatena.ne.jp/mokehehe/20090215/profiling_in_ghc)
eb init したらERRORがでてSignature not yet currentと言われました。

EB CLIを利用しています。Macで `eb init` したらエラーがでました。

# eb init でエラー

```
eb init

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-southeast-1 : Asia Pacific (Singapore)
7) ap-southeast-2 : Asia Pacific (Sydney)
8) ap-northeast-1 : Asia Pacific (Tokyo)
9) sa-east-1 : South America (Sao Paulo)
(default is 3): 8

ERROR: The current user does not have the correct permissions. Reason: Operation Denied. Signature not yet current: 20160711T100306Z is still later than 20160711T100141Z (20160711T095641Z + 5 min.)

ERROR: Operation Denied. Signature not yet current: 20160711T101003Z is still later than 20160711T100839Z (20160712T100339Z + 5 min.)
```
５分ずれているとあります。


# Macの時間を修正
Macの時間が５分ずれていたので修正しました。

# 再び実行

```
eb init
```

今度はうまくいきました(☝ ՞ਊ ՞)
etcdctlで"-"で始まる値を設定できない


etcdctlで"-"から始まる値をセットする事ができなかった。

```
$ etcdctl --version
etcdctl version 2.1.1
$ etcdctl set /test/key -2
Incorrect Usage.

NAME:
   set - set the value of a key

USAGE:
   command set [command options] [arguments...]

OPTIONS:
   --ttl '0'			key time-to-live
   --swap-with-value 		previous value
   --swap-with-index '0'	previous index
```

githubのissueに上がっていた。
https://github.com/coreos/etcd/issues/2020

keyの前に`--`をつけると書き込みできる。

```
$ etcdctl set -- /test/key -2
-2
```
【VMware ESXi 5.5】カスタム構成でのホスト作成時に出てくるよくわからない設定項目

# **概要**
カスタム構成でのホスト作成時によくわからない設定項目があったのですが、いつも適当にやっていたのでちゃんとしたいと思います＼(^o^)／

# **よくわからない項目一覧**
- SCSIコントローラ
- ディスクの選択
- ディスクの作成
- 詳細オプション

# **説明**
## **SCSIコントローラ**
![WS000412.png](https://qiita-image-store.s3.amazonaws.com/0/79134/6e6cdd41-6f4f-aa8d-7d5e-12650938e5da.png)

| 項目 | 説明 |
|:--|:--|
| BusLogicパラレル | OSが古い場合などに選択 |
| LSI Logicパラレル | 基本的に選択する項目 |
| LSI Logic SAS | OSがSASをサポートしている場合に選択する |
| VMware準仮想化 | **よくわかりません・・・＼(^o^)／** |

## **ディスクの選択**
![WS000413.png](https://qiita-image-store.s3.amazonaws.com/0/79134/c379cbe5-e39d-1d2d-53f1-6acab4670417.png)


| 項目 | 説明 |
|:--|:--|
| 新規仮想ディスクを作成 | 通常はこれを選択すれば問題ない |
| 既存の仮想ディスクを使用<br>以前に構成した仮想ディスクを再使用します。 | 以前作成した仮想マシンで使用していた仮想ディスクを使用する場合に選択 |
| Rawデバイスマッピング | SAN上に仮想ディスクを作成する場合に選択 |
| ディスクを作成しない | ネットワークブートなどでディスクが必要ない場合に選択 |

## **ディスクの作成**
![WS000414.png](https://qiita-image-store.s3.amazonaws.com/0/79134/e40d89b7-168e-4405-6cd8-cdba1c9eb78f.png)

### ディスクプロビジョニング
| 種類 | 説明 |
|:--|:--|
| シックプロビジョニング（Lazy Zeroed） | 仮想ディスク作成時に指定したサイズ分の領域を確保 |
| シックプロビジョニング（Eager Zeroed） | 仮想ディスク作成時に指定したサイズ分の領域を確保し、ゼロで初期化 |
| Thin Provision | 仮想ディスク作成時には最低限の領域のみ確保し、必要に応じて増加 |

### 場所
| 項目 | 説明 |
|:--|:--|
| 仮想マシンで保存 | 基本的に選択する項目 |
| データストアまたはデータストアクラスタの指定 | データストが複数あって他のデータストアを指定したい場合は「データストアまたはデータストアクラスターの指定」をチェックしてデータストアを指定 |


# **参考**
- [シンプロビジョニング と シックプロビジョニング の違い](http://www.projectgroup.info/tips/VMware/comm_0009.html)
- [VMWare ESXi 5.0 – 仮想マシンの作成。](http://blog.pdns.jp/vmware-esxi-5-0-%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90%E3%80%82/)

# **おわりに**
SCSIコントローラ設定の**VMware準仮想化**ってなんだろう・・・？
cloudinitでホスト名・FQDNを設定する方法

UserDataへこんなふうに書く

```yaml
#cloud-config
hostname: cloud-init-test-instance
fqdn: cloud-init-test-instance.aws-in.example.com
users:
  - default
  - name: user1
    groups: wheel
```

どう書くべきか、モジュール一覧はあっても各モジュールへどのように値を渡せばいいか書かれていないので http://cloudinit.readthedocs.io/en/latest/topics/examples.html を参考にダメならコードを見る。
Debian WheezyではRStudioの0.99は使えない件

2016-07-11時点でのRStudioの最新版は0.99.902ですが、これはDebian Wheezyでは動作しない。
インストール自体は何ごともなく終了するが、実行すると、

```shell

rstudio: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by rstudio)

```

のメッセージが表示されて終了してしまう。

結局のところRStudioの前バージョン(0.98):[http://download1.rstudio.org/rstudio-0.98.1103-amd64.deb](http://download1.rstudio.org/rstudio-0.98.1103-amd64.deb)を使うか、WheezyをアップグレードしてJessieにするかの二択とのこと。

というわけで、おとなしく0.98を使ってます。

* [参考:can't open rstudio in linux debian wheezy error 'GLIBC_2.14' not found (StackExchange)](http://unix.stackexchange.com/questions/206518/cant-open-rstudio-in-linux-debian-wheezy-error-glibc-2-14-not-found)
AI,機械学習,Deep Learning わかりにくい流行り言葉をまとめる

#はじめに
去年はいろんな企業で、「IoTください！」がブームでしたが、
今年は「AIください！」がブームとなっているように思います。
「AI」や「人工知能」という言葉が、ニュースやCMで面白がって使われるので、
みんなよくわからないけど「すごい。」とか「こわい。」とか言っている。
AIっていうのは、ITエンジニアにとっても理解しにくい概念なので、
データ分析系に関わっている人であったとしてても、
よく理解できない人がほとんどなんじゃないかなって思う。

BIなどのデータ分析系の開発歴7年くらいの僕も
「AI」って何？「機械学習」？「Deep Learning」？
って感じで全然理解できなくてで必死でAIと名のつく本をほとんど読みあさり、
なんとなくですが、形がわかってきた気がするので、まとめてみます。

#AIという言葉
定義的に説明すると人工知能学会が出されている「人工知能とは」
という書籍が最も理解しやすいかと思います。
この書籍では冒頭から、人工知能とは１つの定義があるわけではなく研究者ごとに
定義の違う学問だと書かれています。
そもそも正確な定義がないようです。
ちょっと幅広な定義でいうと
「人工的にコンピュータ上などで人間と同様の知能を実現させようという試み」のようですが、
知能っていろんな種類があるよね？
記憶力って知能？演算能力も知能？言語理解や対話能力も？学習能力？　全部知能っぽいですが。
それにコンピュータで考えると、どれも実現方法が違うように感じます。

ので正しい定義はあきらめて、いままでの知識から中央値をとると
AIという言葉はほぼほぼ「学習能力」のことを出していると僕は考えています。
会議でも「AIは学習能力をもつ機械、技術名称でいうと機械学習を使った機械という意味で進めます」と
いつも言ってますが、反論を受けたことはないので、たぶん違和感ある人は少ないのではないかと思います。

のでまとめると、こうかなと思います。
・AIという言葉ははあいまいなで人によって認識が違う
・ほぼ「学習能力」のある機械ことを指している
・「AI」と「機械学習」はほぼ同義として話しても違和感をもたれない

#「機械学習」「Deep Learning」という言葉
AIという言葉に対して、「機械学習」「Deep Learning」は、理解しやすいです。
「データ分析」を根とした概念階層図でいうところの赤枠のところが、該当します。

![image](https://qiita-image-store.s3.amazonaws.com/0/74428/9287ce76-f1c2-50f3-41eb-480e27d7ed54.png)



・「機械学習」とは、データ分析の手法の１つ
・「Deep Learning」とは、機械学習アルゴリズムの１つであり、ニューラルネットワーク手法の中の１つ
・アルゴリズムっていうのは、研究者の方が研究の末、見つけ出した予測やパターン認識などの高度なロジック

個々のアルゴリズムの種類についての説明はここでは割愛しますが、
Deep Learningも含めて、アルゴリズムは各々できることが違います。
実装する人はその特徴を考えたり、総当たりで試したりして、利用していきます。

#終わりに

女性の声のAIが、人と会話する有名なCMがありますが、
このCMは絶大な誤解を生みだしているように思います。
あの会社は「超天才な1人の知能」を作り出して、
彼女は常にたくさんのことを学び続け、難しい問題も解決してくれる。
って勘違いしているんじゃないかと思う節が、IT系ではない人と話していると感じます。

その誤解の結果、いろんな企業が「彼女のようなAIを作りたい」とか、
「早く彼女と仲良くなっとかないとまずいんじゃないか」とか
そういう思考で話している人もわりといるように感じています。

あのCMの会社が先陣を切って、ほぼ騙しのイメージ戦略で成功したので、
僕からしたら「ほぼ嘘じゃん」って思うの広告が、大手IT企業やメディアから連発していて、
どんどん誤解を増幅させていってるような気がします。

ただ僕はこの流れは、良いことだと思ってます。
AIに求められる期待値は高すぎるので現実を知ると、最初少しガッカリするとは思いますが、
機械学習などのAI関連技術でできるようになったことは、それでも素晴らしい技術で、
この勘違いがキッカケになって関わっていくことは良いことだなと。
AI関連技術によって、企業が提供するサービスはいままでになかったような
「ぱっと見でもすごい」と思わせるものが増えてくるでしょう。
これって１消費者としても、すごく楽しみです。
それに、もっともっとAIを煽って僕の仕事が増えればうれしいな～って思ってたりしたいします('ω')ノ
古いログを削除する（雑メモ）


## ローテートされた古いファイル名のログを列挙
大体で、↓こんなパターンのやつを消す。

- *.[1234]
- *.{gz,bz2}
- *-20160712, *-2016-07-12
- *.20160712, *.2016-07-12
- *.old

```bash:list_old_logs.sh
find /var/log/ -type f |
grep -E ".*[\.-]([0-9]|old|20[0-9][0-9]-?[0-9][0-9]-?[0-9][0-9].*)(\.(gz|bz2))?$"
```

## 起動前のタイムスタンプのファイルを列挙
Snapshotイメージから起動した時とかに別インスタンスだった時代のログを消すとかそういうのに使える。

```bash:list_until_boot.sh
boottime=$(($(date +%s) - $(grep -oE ^[0-9]+ /proc/uptime)))
find /var/log/ -type f ! -newermt "@$boottime"
```

## awslogs の監視先＆ステートファイルを列挙

```bash:list_awslogs_files.sh
find /etc/awslogs/{awslogs.conf,config} /var/awslogs/etc/{awslogs.conf,config} -type f 2>/dev/null |
while read -r f; do
  grep -E '^\s*(state_)?file\s*=\s*/.*' "$f" | perl -pe's/.*file\s*=\s*//'
done
```
WordPress のテーマ情報の取得

# wp_get_theme()

https://developer.wordpress.org/reference/classes/wp_theme/

テーマ情報取得の関数。テーマの `style.css` に書かれているメタ情報を取得できる。
戻り値は [WP_Theme](https://developer.wordpress.org/reference/classes/wp_theme/) オブジェクト。

# 例
```php:wp_get_theme.php
<?php
$my_theme = wp_get_theme();

// Echo the name of the current active theme.
echo $my_theme; // wp_get_theme()

// Display the Current Theme's Version
echo $my_theme->Name . " is version " . $my_theme->Version;

// Display the Current Theme Author URI
echo $my_theme->{ 'Author URI' };
// Or,
echo $my_theme->get( 'AuthorURI' );

// Get Other Data: Text Domain & Theme URI
echo $my_theme->get( 'TextDomain' );
echo $my_theme->get( 'ThemeURI' );
```

# で何が便利なの

テーマにスタイルシートや JavaScript ファイルを埋め込むには `wp_enqueue_style()` あるいは `wp_enqueue_script()` を使います。

- https://developer.wordpress.org/reference/functions/wp_enqueue_style/
- https://developer.wordpress.org/reference/functions/wp_enqueue_script/

どちらもバージョンの引数を指定できますが、指定しないと WordPress のバージョンが使われます。
まぁ、スタイルシートのテーマバージョンを更新した時にPHPも直すのが面倒って時に便利。
（なにゆえバージョンをちゃんと指定するかは公式テーマだったり、キャシュ関係とか）

という実装を [Iemoto](https://github.com/megumiteam/iemoto) でしています。

https://github.com/megumiteam/iemoto/blob/master/root/functions.php#L110
（grunt-init テンプレートなのでよしなに置き換えてください）

git のバージョン番号とかにしたいってときは以下を参考に
https://memo.dogmap.jp/2015/02/27/wordpress-git-commit-id-to-theme-version/
2016-07-13 ぽえむ > 検索についてのもろもろ

2015年8月25日記載。

<hr>

Qiitaの検索をしながら考えていること。
この記事は~~まとまっていない~~ まとめる気がない。
他の記事と違い、この記事では色々なことを書く。
追記は時々するかもしれない。
記載は上から順次書くので、読みやすくはない。整合性も崩れるかもしれない。
記事を書きながら自分の考えを整理する。ぬいぐるみに話すのと一緒。

##思考を中断しないように

探しているものの手がかりが5秒で見つかる場合と５分の違い。

-「ドライバを貸して」と言われた時、机の引き出しから瞬時にドライバを出して渡せるか
- ドライバを5分くらいかけて見つけてから渡すか

前者の場合、前の作業に瞬時に戻れる。
後者の場合、5分間ドライバを探すことに頭を使うので、5分前の思考状態に戻るのに少し手間取る。「何やっていたっけ」状態。

英文を読み進めるときの以下の違いと似ている。

- 一つ一つの単語を調べながら読む
- 記憶している単語の意味を頭の中で使いながら読む

前者であれば、全体の文脈をとらえるのに最後に再度読みなおす必要がある。
後者であれば、そのまま文脈をとらえることができる。横道にそれない。

誰かが「ある物事を進めていくには"調べ物をしない"のが一番」と言っていた。

##整理の理想

- 検索時に人に操作してもらえるようにもする

マウスのホイールを使わなくてもたどりつけるようにする。つまり、見出しをたどったり、「記事のどこかにある」は除外。
基本は キーワード入力 + クリック数回 で済むこと。

机の中から道具を取ってもらう時
- 「３段目の引き出しの奥から３つ目の右側」といえるか
- 「上側の引き出しのどれかで中頃にある」というのか


##あそこには書いている問題

マニュアルのあそこには書いている。
それはつまり、マニュアルの構造を記憶しているのと一緒。
構造の記憶が薄れると、再度構造を覚え直すために色々な箇所を読み直すことになる。

また、少数のマニュアルを何度も読む環境であれば、それでもいいかもしれないが、100以上の資料(各資料が30ページから時には数百ページ)に対しては、構造を覚える負担は大きい。

ノーム・チョムスキーは「熱狂的であれば人は非常にたくさんのことを覚えることができる」と言っていたが、忘れていくことは事実。

ゲーテが「自分を制限することだ」と言っていたが、制限をしてある特定分野だけ憶えればいいという状況には自分はいない。


##関数の再利用と一緒ではないか

自分が書くQiitaの記事は一つ一つが関数と同等ととらえることができるのではないか、と思う。
（この記事のように）一つの記事の中にたくさんのことを記載していると、その記事を最後に扱ってから2ヶ月くらいは中身を覚えているかもしれないが、いずれその記憶は薄れる。そして死蔵となる。

main関数で色々処理をしていて、ある期間までは、「AというプロジェクトのBというパッケージのCという関数内の4つ目のブロックに使っているコードが今回使えそうだ」と思って使うことはできるかもしれない。でも、その期間を超えると「あの処理、昔実装したけどどこっだたっけ」になる。

実際、今日、昔の処理を見つけだそうとして断念した。

##これまで試したツール

- 2002年ころ : linux上でテキストにメモ. フォルダ分けしていたが、途中から探すのが億劫になった。
- 2005年以降 : gmail (メールに関してはそれなりに検索できるが、場合によっては検索に時間がかかる)
- 2008年以降 : はてなダイアリー"プライベートモード" (１つの記事にたくさん書いていた。この頃に書いていた内容は検索性が悪い。)
- 2010年以降 : はてなダイアリー"プライベートモード" (１つの記事に最小単位の内容を記載するようにした。結果、検索性が高まり、よく使うようになった)
- 2012年頃以降 : evernoteも使用 (件名の表示幅がせまく長い文章が表示できないので、はてなダイアリーと同等の使い方はできない)
- 2014年 : confluence (記載はしやすいが、検索時の閲覧性が重たい気がするので時々使う程度)
- 2014年中頃 : はてなブログを試用 (タイトル検索できない、記事以外に色々表示があり読みにくいことにより使用はやめた。また、はてなブログが始まったため、はてなダイアリーの将来のメンテナンス性に不安が生じた。新しいツールを探すきっかけとなる。)
- 2014年以降 : Qiita (最初から１つの記事の内容を少なくしているため、検索が有効に働いている。必要な時に必要な記事をブックマークでまとめる[タグ名は"00今"]ので、作業が効率的。"00今"タグのブックマークは使い終わったらクリアする)


##Qiitaがいいと思うこと

- 安定している。使用時に固まる症状に出くわしたことがない
- 無関係の情報の表示が少ない
- コードが書ける。それも「きれい」
- 数式が書ける。それも「きれい」
- 検索しやすい気がする
- 画像を貼るのが簡単
- 投稿に対して、より知っている人から良い情報が来る
- コードに関連することが多い
- プレビューを確認しながら編集できる
- markdownという標準的な方法で記載ができる
- webブラウザで動くのでlinux, MacOS X, Windowsから投稿できる


##忘れてしまってもいい

どういうことを投稿したか詳細を忘れてしまってもいいと思う。ただし、それが、あるキーワードで検索結果に表示されることが望ましい。

詳細含めて記憶しているのは無駄だと思う。Qiitaという拡張記憶領域に詳細は憶えておいてもらい、それ以外の部分で自分の頭を使えばいいかと思う。

## A > B > C > D
ナビゲーション。

昔webサイトを作ることになった時に、色々な本を読んでいて「ナビゲーション」(だったと思う)という上記の表示に出くわした。

上記の書き方をする方が「AのBのCのD」という書き方より理解しやすい気がする。

タグにAとつけて、ナビゲーションでもAを付けるのは重複かもしれないが、タグの検索がおかしくなった時の対応。昔、あるシステムでタグ情報が飛んだのが理由の一つ。

（追記 2016/11/28) **[パンくずリスト（breadcrumb list）](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%B3%E3%81%8F%E3%81%9A%E3%83%AA%E3%82%B9%E3%83%88)**というのが本当の名前のようだ。
http://qiita.com/shiraishiwataru/items/7728ffbc4dc390c92b06#-パンくずリスト


## google検索で出るものは投稿しない

google検索で一発で出るものは投稿しない。google検索した方が速いのと、他の内容での検索時に余計なものになる可能性があるため。

自分の考えや付加情報を残したい時は投稿する。


##Qiitaに今後望むこと

- 検索性は現状を維持、もしくはより良い検索性 (検索時に余分な情報が出てこない）のが望ましいです
- 10年はサービス提供していただきたい (もしくは違うサービスになる場合は移行がスムーズになりますように)
Pandas: groupby()してグループ単位で値補完

Pandasのお勉強メモ。

http://pandas.pydata.org/pandas-docs/stable/groupby.html
ここ読んでいて、group byの値補完の例が分かりにくかったので簡単な例を書いてみる。

下準備。

```
In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: key = list('ABCABCABC')

In [4]: value = [1,2,3,np.nan,np.nan,np.nan,4,4,4]

In [5]: df = pd.DataFrame({'key': key, 'value': value})

In [6]: df
Out[6]: 
  key  value
0   A    1.0
1   B    2.0
2   C    3.0
3   A    NaN
4   B    NaN
5   C    NaN
6   A    4.0
7   B    4.0
8   C    4.0
```

# グループ単位でffill()

グループ化せずに`ffill()`すると、`index`が2の `value` 3.0で3つのNaNすべてが補完される。

```
In [7]: df.ffill()
Out[7]: 
  key  value
0   A    1.0
1   B    2.0
2   C    3.0
3   A    3.0
4   B    3.0
5   C    3.0
6   A    4.0
7   B    4.0
8   C    4.0
```

keyでグループ化してからffill()すると、グループ単位にNaNの直前の値でNaNを補完することになる。従って`index`が0, 1, 2（`key`がそれぞれA, B, C）の`value` 1.0, 2.0, 3.0で `index` 3, 4, 5（`key`がそれぞれA, B, C）の`value`が補完される。

```
In [8]: df.groupby('key').ffill()
Out[8]: 
  key  value
0   A    1.0
1   B    2.0
2   C    3.0
3   A    1.0
4   B    2.0
5   C    3.0
6   A    4.0
7   B    4.0
8   C    4.0
```

# グループ単位で平均を取って埋める

`value`が`NaN`になっているところに、グループ単位の平均値をとって埋める。

```
In [9]: f = lambda x: x.fillna(x.mean())

In [10]: transformed = df.groupby('key').transform(f)

In [11]: transformed
Out[11]: 
   value
0    1.0
1    2.0
2    3.0
3    2.5
4    3.0
5    3.5
6    4.0
7    4.0
8    4.0
```

埋める前と埋めた後でそれぞれグループ毎の平均を取ると、同じ値が得られる（`GroupBy.mean()`は`NaN`を[計算対象から除外する](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.groupby.GroupBy.mean.html#pandas.core.groupby.GroupBy.mean)）。

```
In [12]: df.groupby('key').mean()
Out[12]: 
     value
key       
A      2.5
B      3.0
C      3.5

In [13]: transformed.groupby(key).mean()
Out[13]: 
   value
A    2.5
B    3.0
C    3.5
```
Android Studio のちょっと便利なショートカット (for Mac)

デフォルトだと Android Studio を立ち上げる度に表示される Tip of the Day 。
非表示にしているかたも多くいらっしゃると思いますが、便利なショートカットを毎回教えてくれるありがたい機能です。
そんな Tip of the Day に載っているショートカットの中で便利だったものをまとめてみました。

## command + option + F7 呼び出し箇所の表示
メソッドや変数にカーソルを合わせて command + option + F7 で選択したメソッド、変数が使用されている場所を一覧できます。表示されるリストから選択することでそこまで移動することができます。
command キーを押しながらクリックでも同じことができます。

## command + shift + V コピー履歴からペースト
最近クリップボードにコピーした要素から選択してペーストできます

## F2 / shift + F2 エラー箇所にジャンプ
ファイル内のシンタックスエラーにジャンプできます。

## option + Space メソッド・変数定義の参照
メソッドや変数の定義や中身を参照することができます。
入力がかなになっているとスペースが入ります。

## command + E 最近使用したファイル一覧
最近使用したファイルを一覧で確認することができます。リストからファイルを選択することでそのファイルを表示させることができます。

## command + shift + ↑ / ↓ 選択範囲の移動
コードを選択し、command + shift + ↑ / ↓ を押すことで選択範囲を丸ごと上下に動かすことができます。複数行選択していても可能です。

## ctrl + option + R Run / Debug
ctrl + option + R で表示されるリストからファイルを選択することで Run / Debug が実行できます。ファイルを選ぶ際に shift + enter でデバッグを実行できます。

## command + option + O シンボル検索
メソッドや変数を検索することができます。

他にも多くの Tips が紹介されているので、興味があれば確認してみてください。
非表示にされた方も Help > Tip of the Day から見ることができます。
ASP.NET MVC 5 で HTTP Error 403.14 - Forbidden

# ASP.NET MVC 5 で HTTP Error 403.14 - Forbidden

開発中の ASP.NET MVC プロジェクトに、新たに NewsController を追加して、お試しアクセスすると、次のエラーが表示された。
阿呆のような原因だったが、またやりそうなので記録しておく。

### エラーページのメッセージ

>HTTP Error 403.14 - Forbidden
Web サーバーは、このディレクトリの内容の一覧を表示しないように構成されています。


### アクセスした URL (ポートは適当)

```
http://localhost:55555/News/
```

次の URL にアクセスすると期待どおりのページが表示される。

```
http://localhost:55555/News/Index
```

### 原因

プロジェクトのファイルシステムに `News` フォルダが作成されていた。

ルーティングによる解決よりも、先に物理フォルダを探しに行くようだ。
そういえば、どこかに書いてあったような。。

上記のフォルダは、プロジェクトに追加していなかったので発見に手間どった。先入観恐。


### 確認した環境

- Visual Studio 2015 Community
- Visual Studio のデバッグ環境の IIS
- ASP.NET MVC 5
JSONでInfinityを扱うには

今[JSONの仕様書](https://tools.ietf.org/html/rfc7159)を読んでるのですが、
[IEEE 754](https://ja.wikipedia.org/wiki/IEEE_754)で定義されている ``Infinity`` や ``NaN`` はJSONでは表現できず、
例えば

```js
JSON.stringify(Infinity) // => "null"
```

```js
JSON.parse("Infinity") // => エラー
```

となるのですが、仕様をよく読むと数値の表現範囲は実装に依るということで、
``1E400`` などの大きい数値は正確に表現できない代わりに適宜丸めたりされるようです。

実際Chromeで動かして ``Infinity`` になることが確認されました。

```js
JSON.parse("1E400") // => Infinity
```

なので、JSONでどうしても ``Infinity`` を表したいときは、JSONを扱う処理系に合わせて
馬鹿でかい数を入れることによって一応は表現できることになります。

ただ、このような手法で ``NaN`` を表現する方法は思いつきませんでした。

なお、もう1つIEEE 754で定義されている ``-0`` は表現できるみたいです。

```js
JSON.parse("-0") // => -0
```
Vagrantでtexの環境を作ってみた

# はじめに

今回、ちょっとしたことがあって `Vagrant` でtexを使えるようにしました。
VagrantもCentosもそんなに得意ではないので変な箇所があると思いますが、フィードバックいただければ幸いです。

# やったこと

* centos 6.7にtexlive2016をインストール (日本語コンパイル化)
* [Github](https://github.com/RINDO/centos-texlive2016-box) にソースをアップロード
* Atlasでbox公開

# Vagrantfile

やっていることは以下です。

* 必要なyum packageのinstall
* texliveのinstall
* パスの設定 (全ユーザー)
* tlmgrの設定, アップデート

```
#
# Texlive guide
# http://www.fugenji.org/~thomas/texlive-guide/
#

echo "Installing yum packages"

echo "Installing perl"
yum -y install perl

echo "Installing expect"
yum -y install expect

echo "Installing ImageMagick"
yum -y install ImageMagick

# 
# install Texlive for Linux
# https://texwiki.texjp.org/?TeX%20Live#v9c33c6a
#

echo "Dowinloading Texlive for linux. Maybe take about 30 minutes."
wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
tar xvzf install-tl-unx.tar.gz
cd install-tl-*

#
# install-tl : TeX Live cross-platform installer
# https://www.tug.org/texlive/doc/install-tl.html
#

echo "Installing Texlive. Take about 30 minutes."
expect -c "
  set timeout -1
  spawn ./install-tl
  
  expect \"Enter command:\"
  send  \"I\r\"

  expect \"Time used for installing the packages:\"
  send \"exit 1\"
"

echo "export PATH=/usr/local/texlive/2016/bin/x86_64-linux/:$PATH" >> /etc/profile
source /etc/profile

#
# tlmgr: package repository ftp://ftp.u-aizu.ac.jp/pub/tex/CTAN/systems/texlive/tlnet (verified)
# tlmgr: backupdir as set in tlpdb
#   /usr/local/texlive/2016/tlpkg/backups
# is not a directory.
# 

mkdir /usr/local/texlive/2016/tlpkg/backups

echo "Setting tlmgr repository"
tlmgr option repository http://mirror.ctan.org/systems/texlive/tlnet

echo "Updating tlmgr"
tlmgr update --self

echo "Updating tlmgr packages"
tlmgr update --all

echo "Finished!"
```

# 備考

### texliveのinstall

texliveのinstallは[Tex Wiki](https://texwiki.texjp.org/?TeX%20Live#v9c33c6a)を参考にしました。

### tlmgr

```
mkdir /usr/local/texlive/2016/tlpkg/backups
```

フォルダを作っている行がありますが、以下のエラーのためです。

```
tlmgr: package repository ftp://ftp.u-aizu.ac.jp/pub/tex/CTAN/systems/texlive/tlnet (verified)
tlmgr: backupdir as set in tlpdb
   /usr/local/texlive/2016/tlpkg/backups
is not a directory.

```
Tree図でnode.ancestors()を使い、祖先要素までのpathをハイライト

#version
d3.jsのversionは**4.1.0**です。

#Code
[今回使用した全コード](https://github.com/naoyashiga/dataViz-playground/tree/b91fab998177495bd66fdb9e5b4204e6048aff15/sketch/tutorial/hierarchies/tree/src/js)

#mouseイベントを追加
```js
addHover() {
    this.element.on("mouseover", this.mouseovered(true))
    .on("mouseout", this.mouseovered(false));
}
```
mouse hoverさせてハイライトさせます。起点となる要素にmouseイベントを追加します。

[該当コード](https://github.com/naoyashiga/dataViz-playground/blob/b91fab998177495bd66fdb9e5b4204e6048aff15/sketch/tutorial/hierarchies/tree/src/js/components/MyNode.js)


##祖先要素をハイライト :sparkles: 
![Kobito.ilsqTi.png](https://qiita-image-store.s3.amazonaws.com/0/26043/4055e887-f656-f46d-6a64-377287e2105e.png "Kobito.ilsqTi.png")


###Code
```js
mouseovered(active) {

    return function(d) {

      var paths = d3.selectAll("path");

      if(active) {
        let ancestors = d.ancestors();
        
        //ハイライト
        paths.filter((d) => ancestors.includes(d))
        .style("stroke", "#f00");
        
      } else {
      	//ハイライトやめて、デフォルトの色に変更
        paths.style("stroke", "#555");
      }
    };
  }
```

###node.ancestors()
祖先要素を配列で返します。

[d3-hierarchy/README.md at master · d3/d3-hierarchy](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_ancestors)

###includes
indexOfではなくて、ES6のincludesを使って配列の要素を検索します。filterを使って祖先要素に該当するものだけを選別します。

[String.prototype.includes() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/includes)
技術英語 > to the point where your fingertips [meet] / when two trains of waves [meet] / point of contact

@ Star Trek Voyager > INNOCENCE

はしゃぐ子どもたちに瞑想の仕方を教えるTuvok。子供の人差し指をくっつけさせて

> and imagine all the energy in your body is flowing to the point where your fingertips <font color=red>meet</font>.

<hr>
時々読んでいる物理学者の物語にもmeetが出ていた。

@ Great Physicists: The Life and Times of Leading Phy... 
No.831 / 13169

> We now understand Newton's rings as an interference phenomenon, arising when two trains of waves <font color=red>meet</font> each other.

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=point+of+contact
JSForceでリストビューのメタ情報操作してみた

[JSforce](https://jsforce.github.io/)を使ってみたのでメモ。φ(￣ー￣ )ﾒﾓﾒﾓ


## リストビューのメタ情報を取得を取得したい
JSForceでは、フルネームでの参照になります。
メタデータなので当然ですが、**ID での参照はできません**。
また、リストビューの **ID の取得もできません**でした。
どうしても ID が必要な場合は本記事下部を参照。

```html:リストビューのメタ情報を取得
<apex:page controller="CustomController">
    <script src="//cdnjs.cloudflare.com/ajax/libs/jsforce/1.7.0/jsforce.min.js"></script>
    <button onclick="readListView();"> ビュー表示 </button>
    <script>   
        function readListView(){
            var conn = new jsforce.Connection({ accessToken: '{!$Api.Session_Id}' });
            var fullNames = [ 'Contact.All' ]; // オブジェクト名.対象ビューのAPI名
            conn.metadata.read('ListView', fullNames, function(err, metadata) {
                if (err) { 
                    console.error(err); 
                } else {
                    console.log(metadata);
                }
            });
        }
    </script>
</apex:page>
```


## リストビューのメタ情報を更新したい

リストビューの作成・更新は、メタ情報を設定する必要があります。
更新の場合、必須項目以外は設定しなければ前の情報が引き継がれるようです。



```html:リストビューのメタ情報を更新
<apex:page controller="CustomController">
    <script src="//cdnjs.cloudflare.com/ajax/libs/jsforce/1.7.0/jsforce.min.js"></script>
    <button onclick="createListView();"> ビュー更新 </button>
    <script>   
    function createListView(){
        var conn = new jsforce.Connection({ accessToken: '{!$Api.Session_Id}' });
        var metadata = [{
            booleanFilter: '1 AND 2',
            columns:       ['FULL_NAME', 'CONTACT.EMAIL', 'CONTACT.BIRTHDATE', 'CustomField__c'],
            filterScope:   'Everything',
            filters:       [{ field : 'FULL_NAME', operation: 'contains', value: 'WEA' },
                            { field : 'CONTACT.EMAIL', operation: 'contains', value: '@gmail.com' }],
            sharedTo :     {}, // 自分だけに表示
            fullName:      'Contact.CustomView', // オブジェクト名.対象ビューのAPI名
            label:         'カスタムビュー',
            language:      'ja'
        }];        
        conn.metadata.update('ListView', metadata, function(err, metadata) {
            if (err) { 
                console.error(err);
            } else {
                console.log(metadata);
            }
        });
    }
  </script>
</apex:page>
```
ListView Meta情報の定義はこちらを参照
[Metadata API Developer Guide - ListView](https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_listview.htm)


## リストビューのIDを取得したい
絶対欲しくなるので、JS Remotingで実装しました(Visualforce上で実装に限る)
幸いリストビューのAPI名がわかるので、`ListView.obj`の`DeveloperName`に当ててIDを引っ張り出します。

```js:IDを取得するjs
function getListViewId(listViewName){
    Visualforce.remoting.timeout = 120000;
    Visualforce.remoting.Manager.invokeAction(
        '{!$RemoteAction.DemCustomViewController.getListView}',
        listViewName, // 
        function(result, event){
            if (event.status) {
                console.log(result.Id);
            } 
        },
        {escape: true}
    );
}
```

```java:上記jsで呼び出されるApexコード
@RemoteAction
global static ListView getListView(String listViewName) {
    return [SELECT Id, DeveloperName FROM ListView WHERE SobjectType = 'Contact' and DeveloperName = :listViewName][0];
}
```