OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript関数を格納した変数と、コールバック関数覚書

#はじめに
JavaScriptを学習していく中で自分の為にメモを書き残しておきます。
今回は関数を格納した変数と、コールバック関数について。

#関数を格納した変数


```Javascript

"use strict";

function nameSpace(lastName, firstName) {  //スペースで結合の関数を作成
    return lastName + " " + firstName;  //lastNameとfirstNameの結合をreturn
}

function nameDot(lastName, firstName) {  //ドットで結合の関数を作成
    return lastName + "・" + firstName;  //lastNameとfirstNameの結合をreturn
}

let lName = "柳生";  //lNameに代入
let fName = "十兵衛";  //fNameに代入
let nameList = [nameSpace, nameDot];  //nameListにそれぞれの関数を配列として代入
for(let func of nameList) {  //forにてnameListをfuncに代入して処理
    let name = func(lName, fName);  //1回目、nameSpaceを処理、2回目nameDotを処理
    console.log("結果: " + name);  //1回目、2回目それぞれで結果を出力
}
```

出力結果`"結果: 柳生 十兵衛""結果: 柳生・十兵衛"`

#コールバック関数

```Javascript

"use strict";

function nameSpace(lastName, firstName) {  //スペースで結合の関数を作成
  return lastName + " " + firstName;　　//lastNameとfirstNameの結合をreturn
}

function useNameSpace(name, func){  //nameには後述のnameItem、funcには上記のnameSpaceが入る
  let fullName = func(...name); //funcに変数化された関数が入ることを想定。nameを可変長引数で記述し、それをfullNameに代入
  console.log("結果 " + fullName);　//結果を出力
}

let nameItem = ["柳生", "十兵衛"]; //nameItemに配列を代入
useNameSpace(nameItem, nameSpace);//useNameSpaceを呼び出し、nameItemを第1引数、nameSpace(関数)を第2引数として↑の処理を実行

```

出力結果`"結果 柳生 十兵衛"`


#forEach

```javascript

function printElement(currentValue, index, array) {
  console.log((index + 1) + "個目の値: " + currentValue);
}

let list = [ 4, 31, 48, 6, 19];
list.forEach(printElement);
```

出力結果
`"1個目の値: 4"`
`"2個目の値: 31"`
`"3個目の値: 48"`
`"4個目の値: 6"`
`"5個目の値: 19"`

となり`list`の配列を順番に処理してくれる。
()内のcurrentValue, index, arrayはそれぞれ

currentValue = 処理中の配列内要素の値
index = 処理中の配列内要素のインデックス
array = 配列そのもの

となる。
アニメ「ゆゆ式」の主要キャラクターをリアルタイム画像認識してみた

#はじめに
リアルタイム画像認識[Yolo](https://pjreddie.com/darknet/yolo/)を扱う機会があったので、
一度自分で学習データの用意から学習、テストまで一連の流れを実践しようと決意し、
アニメキャラのリアルタイム認識システムを構築しました。

自分でも画像認識システムを構築してみたい、
現状の画像認識の実力を確認したいという方に参考になれば幸いです。
特にYoloは大雑把な画像認識の知識とある程度のソフトウェア知識があれば
誰でも簡単に画像認識システムを構築できるので本当におすすめです。

#識別対象の紹介
今回は、[アニメゆゆ式](http://www.yuyushiki.net/)に登場する主要キャラクター７人を識別します。
それ以外のキャラはすべてモブとして識別します。
~~最初はごちうさのキャラでやろうと思っていたのですが、偉大な先駆者が何人もいたので題材を変えてみました。~~
![chara_list_base.jpg](https://qiita-image-store.s3.amazonaws.com/0/283800/3a6bf66e-1192-dcb7-8a59-8c80cc2393f7.jpeg)

#環境構築
###動作環境
 - OS: Windows 10 Home
 - CPU: Intel Core i7-8700K @ 3.70GHz
 - GPU: NDIVIA Geforce GTX1080Ti

###環境構築の手順
Windows上で動作するYolo最新版であるYolov3の使用環境を整えていきます。
[ここ](https://github.com/AlexeyAB/darknet)からYolov3を入手できます。
環境構築の手順の詳細はこのリンクに詳細に書かれているので参考にしてください。
また、学習やテストの手順や使用するコマンドもこのリンクに記されています。

#動画データの用意
学習データの基となる動画はニコニコ動画の[ゆゆ式公式チャンネル](http://ch.nicovideo.jp/yuyushiki)のアップロード動画を使用しました。
（当たり前ですが、違法アップロードされた動画をダウンロードすると違法になるため注意しましょう。）

今回使用する動画は8話と9話の2話分としました。
理由として、8話と9話は主要７キャラ全員が登場すること、
使用するデータ量が多いと後の学習データを作成する作業が大変になるためです。

#動画データを画像データに変換
はじめにmp4の動画データからjpgの画像データを取得します。
この作業には[Yolo_mark](https://github.com/AlexeyAB/Yolo_mark)を使用します。
Yolo_markを使用して今回は60フレームごとにjpgの画像を取得します。
こうして2話合計で1392枚の画像データが手に入りました。

#画像データからOP, ED部分を削除
画像データからOPおよびED部分を削除します。
OPに関しては、構築した画像認識システムをOP映像でテストしたかったためです。
OP部分を学習に使用すると、OP映像に強い画像認識システムが生まれてしまい、不当に高い精度が出てしまうので避けました。
EDについては、絵のタッチがOPや本編と異なるためです。
1392枚の画像データからOP, ED部分を削除した1218枚を学習データとして使用します。

#学習データのラベル付け
画像認識プログラムを構築する上で一番ネックとなる部分です。
先ほどのYolo_markを使用して、ひたすらラベル付けしていきます。
ラベルは以下の8種類とします。
1. yuzuko（野々原ゆずこ）
2. yui（櫟井唯）
3. yukari（日向縁）
4. aikawa（相川千穂）
5. kei（岡野佳）
6. fumi（長谷川ふみ）
7. mother（松本頼子）
8. mob（その他）

![yuyu.jpg](https://qiita-image-store.s3.amazonaws.com/0/283800/e11f718c-bf00-d699-b916-5e0ce58d753b.jpeg)

計1218枚のラベル付けに6～7時間かかりました。

#学習
学習データを使用して、Yolov3で学習します。
（今回は時間の都合でバリデーションデータ＝学習データとしています。）
学習の反復回数は12,000回とし、約半日かかりました。

#結果
今回の結果をニコニコ動画及びYoutubeにアップしました。
<script type="text/javascript" src="http://ext.nicovideo.jp/thumb_watch/sm33748745"></script><noscript><a href="http://www.nicovideo.jp/watch/sm33748745">【ニコニコ動画】【情報処理部】ゆゆ式で画像認識してみた【YOLOv3】</a></noscript>

[【YouTube】 Image Recognition for Anime Characters (Yuyushiki) with YOLOv3](https://www.youtube.com/watch?v=_aemdKyQaEw)

気になる結果をいくつかピックアップします。
![yuyu2.jpg](https://qiita-image-store.s3.amazonaws.com/0/283800/9cb45d5d-4a52-0f49-3880-32176ee8243d.jpeg)
夕焼けで６人が映っているシーン。縁ちゃんだけモブと認識されてしまいました。
夕焼けだと紫の色が茶色に近い色になるせいでしょうか。
また、別の夕焼けシーンでは佳と間違えていました。

![yuyu4.png](https://qiita-image-store.s3.amazonaws.com/0/283800/57171fb0-4810-dcb8-90ff-7f6f441db302.png)
唯ちゃんがゆずこと間違えています。
唯ちゃんが目をつぶるシーンが無かったから？

![yuyu07.jpg](https://qiita-image-store.s3.amazonaws.com/0/283800/fcfa4b2a-8f2b-6d7b-d699-084b4b59348f.jpeg)
唯ちゃん以外の２人が認識されていません。
顔が横を向いたり、上下逆になるシーンはあまりないので学習不足に陥りやすいですが
画像を上下左右に反転したものを学習に取り込めば解決できそうです。


#おわりに
画像を回転させたりなどする学習データの水増しや、閾値の変更など
改良する余地は多いです。
特にキャラが遠くにいるときの再現率は上げたいなと思っています。
後は、髪の色が同じで違うキャラはどれくらいの精度で識別できるのか気になりました。

#参考
[ご注文はYOLOv3ですか！？～WindowsでYOLOv3を動かす～](https://qiita.com/chimamedia/items/c261a858e1c7b8160af1)
ごちうさでの先駆者です。ニコニコでの動画で感銘を受けました。
Gitのよく利用するコマンド備忘録

## リモートリポジトリをローカルにコピー
```
git clone [URL]
```
## ローカルブランチをリモートリポジトリに送信
```
git push -u origin branch_name
```
`origin`という名前のリモートリポジトリの`branch_name`ブランチに現在のブランチの内容を送信する。
## リモートリポジトリからブランチを持ってくる
```
git checkout -b feature-D origin/feature-D
```
`git checkout -b ローカルブランチの名前 元となるブランチ`でリモートにあるブランチを新しい名前でローカルに持ってくる。

## ローカルリポジトリの状態を確認
```
git status
```
## ローカルの特定ファイル（test.txt)の変更をステージング
```
git add test.txt
```
## ローカルの変更を全てステージング
```
git add .
```
## ステージングしたものをコミット
```
git commit -m "コミットメッセージ"
```
## ローカルに存在するブランチを確認する
```
git branch
```
## ローカルとリモート両方に存在するブランチを全て確認する
```
git branch -a
```
## 現在のブランチから新しいブランチを作成しつつ、そのブランチに移動
```
git checkout -b 新しいブランチ名
```
## リモートブランチをローカルに持ってくる
```
git branch ブランチ名 origin/ブランチ名
```
## addしてないローカルの変更を取り消す
```
git checkout .
```
変更は取り消せるが、新規追加したファイルは削除されないことに注意。

## addしたものを取り消し
```
git reset HEAD .
```
## 変更を一時的に退避
```
git stash
```
## 退避したものの一覧を見る
```
git stash list

//出力
stash@{0}: WIP on ブランチ名: ハッシュ値 コミットメッセージ
stash@{1}: WIP on ブランチ名: ハッシュ値 コミットメッセージ
```
## 退避した作業を元に戻す
```
//stash@{0}の作業を元に戻す
git stash apply stash@{0}
```
## 退避した作業を削除する
```
//stash@{0}を削除する
git stash drop stash@{0}
```
## 退避した作業を元に戻し、なおかつstashから削除する
```
git stash pop stash@{0}
```
## 最後にそのファイルを触った人がわかる
```
git blame ファイルパス
```
## gitのログを一行ごとで見る
```
git log --oneline
```
## gitのコミット履歴をグラフで見る
```
git log --graph
```
## 現在の変更の差分を見る
```
git diff
```
## `git reset` - 変更を取り消し
### --hard
|  削除     |  残す |
|:---------:|:----:|
|コミット      |      |
|インデックス  |      |
|ファイルの変更|      |

#### とりあえず今のコミットを取り消したい時
```
git reset --hard HEAD~
```

### --soft
|  削除  |  残す      |
|:------:|:--------:|
|コミット   | インデックス |
|        |ファイルの変更|

### --mixed
オプション指定しない時のデフォルト。

|  削除  |  残す      |
|:------:|:--------:|
|コミット   |ファイルの変更|
|インデックス|          |
【JavaScript】条件判定 true と false について学ぶ

今まであいまいだった「比較演算子を使わない条件式」での、 `true` / `false` の判定パターンについて学んだことをまとめる。

__「ノンプログラマのためのJavaScript はじめの一歩」 第2章 JavaScriptの文法 より__

## 比較演算子を使わない条件式とは

条件式には文字列や数値を指定することもできる。
例えば、次の2つの条件式はどちらも `true` になる。
1つめのような条件式は2つめの書き方に置き換えられる。

```javascript
var name = 'Doc';

// 比較演算子を使った条件式
if (name !== '') { ... }

// 比較演算子を使わない条件式
if (name) { ... }
```

どうしてこのような記述ができるのか。
それは条件式に比較演算子がなかった（文字列や数値が入っている）場合、それを `true` / `false` のどちらかに判定する仕様になっているから。

## 比較演算子を使わない場合の true / false 判定

「データがない」とみなされる値は `false` 、それ以外が `true` となる。

### false とみなされる 「データがない」 値とは

次の変数 `a` 〜 `e` を条件式に入れると `false` になる。

```javascript
var a = 0;    // 「数値」の0
var b = 0/0;  // 数値として扱うことができない(NaN)
var c = '';   // 「文字列」の空
var d = null; // 値が存在しない(null)
var e;        // 値が定義されていない(undefined)
```

__空の「配列」や「オブジェクト」は `true` になる。__
（個人的にひっかかりそうだったので書いておく）

## 試してみたこと

`true` / `false` の判定基準や `null` と `undefined` の違いをわかっているようで若干ぼんやりしていたので、いくつかのパターンでどのような結果になるか試してみた。

### 空の配列を使った条件式

```javascript
var dog = [];

if (dog) { ... }    //-> true
// 条件式に入っているのが 「空の配列」 なので true

if (dog[0]) { ... } //-> false
// 条件式に入っているのが 「配列0番目の値 （定義されていない）」 なので false
```

### falseになる値とデータ型

```javascript
var dog = {
  name: '',
  age: null
};

console.log(dog.name); //-> 空
typeof dog.name;       //-> string
// データ型が string と定義されている
// 値は空 (空の文字列)

console.log(dog.age) //-> null
typeof dog.age;      //-> object
// データ型は object と定義されている
// 値が入っていない (null)

console.log(dog.breed); //-> undefined
typeof dog.breed;       //-> undefined
// 値が定義されていない (undefined)
```

## まとめ

どんな値がどちらに判定されるのかは、 `false` とみなされる値のパターンを覚えておけばよさそう。
値が `false` に含まれるかどうかは、 `console.log` と `typeof` で値とデータ型を確認することで判断できそう。
LambdaからECSでタスクを走らせようとした時にハマった

LambdaからrunTask関数を使ってECS上で新しいタスクを走らせたかったので簡単にメモ
今回はFargateは使いません。


```javascript:index.js
const AWS = require('aws-sdk');
const s3 = new AWS.S3({region:'ap-northeast-1'});
const ecs = new AWS.ECS({apiVersion:'2014-11-13',region:'ap-northeast-1'});
//~~省略~~
const params = {    
    taskDefinition: 'YOURTASKDEFINITION',
    cluster: 'YOURCLUSTER',
    launchType: 'EC2',
    overrides: {
        containerOverrides: [
            {
                command: ['echo HelloWorld!'],
                name: 'YOURCONTAINERNAME'
            },
        ],
    }
};
ecs.runTask(params, function (err, data) {
    if (err) console.log(err);
    else console.log(data);
};
//~~省略~~
```

これでタスクを投げても動かなかった、Lambda側でもエラーは吐かれていないのでハマった。
ECSのコンソール画面から今回使用したいクラスターの画面に向かって、タスクメニューから直接手作業で新しいタスクを実行させてみたところ
`RESOURCE:MEMORY`
とのエラーが画面に表示された。

どうやらクラスターに含まれるインスタンスのメモリ容量を超えたサイズでタスク定義をするとこのようなエラーがでるらしい。
新しいインスタンスをスケールするか、タスク定義で使用するメモリを少なくするかして対応したところ、Lambdaから上手くタスクが投げられた。
VS Code 1.26 の新機能 - 相対パスのコピー

https://code.visualstudio.com/updates/v1_26#_copy-relative-path

フォルダ/ワークスペースのルートからのファイルの相対パスをコピーする機能が追加された(絶対パスのコピー機能は以前から存在した)。

コマンド`ファイル: アクティブファイルの相対パスをコピー`でアクティブファイルの相対パスをコピーできる。
![relative_path.gif](https://qiita-image-store.s3.amazonaws.com/0/181011/f8748c77-f235-8a84-c742-e0e1bdcf6195.gif)
また、ファイルエクスプローラでファイルを右クリックして`パスのコピー`を選択すると絶対パスがコピーされるが、この時`Shift`キー(macOSの場合は`Alt`)を押しながら右クリックすると`相対パスをコピー`を選択することができる。
![relative_path_exp.gif](https://qiita-image-store.s3.amazonaws.com/0/181011/14d9b543-dff0-4de1-66a9-f8fbcab90c49.gif)
今までは拡張機能で同じようなことができていたが、これからはデフォルトの機能で行えるようになる。
laralandに参加してphp+laravel+vue.jsの環境を構築してみたよ


## $ whoami
境川　章一郎
（さかいがわ　しょういちろう）

twitter: [l_s_s_l](http://twitter.com/l_s_s_l)
Qiita: @ssakaigawa 

時々インフラ屋。時々開発。

2018 IBM Cloud Champion
(MS MVPとか、AWS Blackbeltみたいなのの、IBM版です）

---
## 著書
Docker+Kubernetesの本
コンテナ・オーケストレーション（黄色いコンテナ本）の７章でIBM Cloud Kubernetes Serviceの章を担当しました。

コンテナに興味のある方はぜひ。

---
## Laravel と私
* 時々開発で利用します。
* （ほしいと思ったら自分で作ってみるタイプ

## Vue.js
* さわったことないので初心者です
* なにこれめっちゃ便利そう
*　

---
## 今日やったこと
* macbook上にコンテナのlaravel開発環境 "laradock"を初めて使う
* vue.jｓをまず入門してみる
* IBM cloud のPaaS Service Cloud Foundry PHPへプロジェクトを公開してみる

---
## 参考にしたところ(　ありがとうございます。)

* Qiita @akokubu さん [Laradockを使ったlaravel開発環境](https://qiita.com/akokubu/items/c79bb7128d7b16a20a22#mysql_version%E3%82%92latest%E3%81%AE%E3%81%BE%E3%81%BE%E3%82%84%E3%81%A3%E3%81%9F%E3%82%89)

* Qiita @rock619 さん [Laradockを使ってLaravel 5.5環境を構築する](https://qiita.com/rock619/items/62c2ab2252c405e26479)

* Qiita @fruitriin さん [LaravelからVue.jsを使う最短レシピ](https://qiita.com/fruitriin/items/e0f2c9aa035c3ff2c874)

* Qiita @motuo さん [IBM CloudにLaravelをデプロイする方法](https://qiita.com/motuo/items/b7d1fdf297349daca9fd)

---

## 結果

laradockでプロジェクト作って
$ npm install がまだ終わらぬ・・・ orz

---
## できなかったけど・・・

---
## このあとの流れ(妄想)
* laradock でlaravelアプリケーションを書く
* vue.jsを入門する
* IBM CloudのPaaSにLaravelを乗せる
* DevOps Tool Chainに乗せてアプリデプロイ時の手間をなくしたい

---
## ちょっとだけお知らせさせてください

9/5 19:00- コワーキングスペース茅場町 Co-Edo®

[bmxug.tokyo PaaS相談会#3 : IBM Cloud What's New!] (https://bmxug.connpass.com/event/97556/)

IBM Cloud + CloudFoundryなPaaS環境の勉強会です。
PHP + Laravel　#1,2,3 は Laravel中心です。

---
#ありがとうございました
Git・GitHub Desktopで文字化けエラーによりFetch/Push/Pullができないときの対策法

# 現象
以下のエラーメッセージにより、Git Hub DesktopでレポジトリのFetch/Push/Pullができなくなる。

>fatal: unable to access 'https://github.com/AvocadoWasabi/****.git/': schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - �����̊֐��͏ؖ����̎�����m�F�ł��܂���ł����B

また、エラーメッセージは文字化けしている。

![エラーメッセージ](https://qiita-image-store.s3.amazonaws.com/0/230272/3803327b-4102-1133-83ea-f3f58d963f85.png)


##正確なエラーメッセージ
エラーコード0x80092012について調べると、文字化け前のエラーメッセージは以下の通りとなる

>schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - 
The revocation function was unable to check revocation for the certificate.

# 再現環境
Windows 10 Home
GitHub Desktop 1.3.4
カスペルスキー インターネットセキュリティ 17.0.0.611(m)
Git 2.18.0 **インストール時に 「Use the native Windows Secure Channel libraryを選択」**

# 原因
インストールされているセキュリティソフト(カスペルスキー)で
暗号化されたネットワーク接続(SSL,TLS)をスキャンする機能を有効にしていると、
起こる。

これは、GitはWindows Secure Channel libraryを使っているにもかかわらず、
セキュリティソフトが独自の証明書を使って接続しようと介入するので、
トラブルが起こるためと考えられる。

## OpenSSlをインストールして実行してみた場合
GitHubへの接続に、確かにカスペルスキーの証明書が使用されていることがわかる。

```
openssl s_client  -connect www.github.com:443
```

```
CONNECTED(00000178)
depth=1 O = AO Kaspersky Lab, CN = Kaspersky Anti-Virus Personal Root Certificate
verify error:num=19:self signed certificate in certificate chain
---
Certificate chain
 0 s:/businessCategory=Private Organization/jurisdictionC=US/jurisdictionST=Delaware/serialNumber=5157550/C=US/ST=California/L=San Francisco/O=GitHub, Inc./CN=github.com
   i:/O=AO Kaspersky Lab/CN=Kaspersky Anti-Virus Personal Root Certificate
 1 s:/O=AO Kaspersky Lab/CN=Kaspersky Anti-Virus Personal Root Certificate
   i:/O=AO Kaspersky Lab/CN=Kaspersky Anti-Virus Personal Root Certificate
---
(略)
```

# 回避策
暗号化されたネットワーク接続のスキャン機能、あるいはセキュリティソフトを一時的に無効化してから、
GitHub Desktopの操作を行う。

##カスペルスキーの例
![設定例.png](https://qiita-image-store.s3.amazonaws.com/0/230272/92d07d4a-b2f9-aafb-b01a-61c08b1a2316.png)


## その他の回避法
以下のコマンドをコマンドラインで入力することでも回避することはできるが、
SSL証明検証を常にOFFにするということのため、
セキュリティレベルが落ちるかもしれない。
[急にGitにCloneもPushもできなくなった話(Qiita)](https://qiita.com/SYABU555/items/7b2df60488d4bbc992d7)

```
git config --global http.sslVerify false
```
# 参考
[The revocation function is unable to check revocation for the certificate](https://github.com/desktop/desktop/issues/2471)
僕がメインOSをWindows10からUbuntuに移行するときにやったこと（前編）Ubuntu導入編

僕がUbuntuに移行したときにやったことをまとめます。メインをUbuntuにするだけで、Windowsもたまにつかいます。

やること
---
1. Dropboxなどのオンラインストレージに大事なデータを移す。
2. パソコンのHDDやSSDをクローンしてバックアップする。
2. Ubuntuとwindowsをデュアルブートする。　　　　　　（ここまで前編）
3. ctrlとcapslookを入れ替える。
4. 必要なソフトをインストールする。
5. コマンドで遊ぶ。

1〜2はWindowsで作業します。3でUbuntuをインストールしたらそのあとはUbuntuで作業します。

環境
--
・ASUS Zenbook 3 UK390UA
・Ubuntu 18.04 LTS
・Windows 10

今回はあまり環境は関係ないと思います。

Dropboxなどのオンラインストレージに大事なデータを移す。
--

オンラインストレージとはファイルをネット上に保存やバックアップできるサービスです。オンラインストレージに大事なデータを保存すると、USBメモリに入れるよりは便利で安心です。Dropboxは無料版で２GBです。なので僕は作ったプログラムなど、本当に大事なデータだけ入れています。2GBのUSBメモリという感覚でつかえばいいと思います。重い画像や動画のデータは使い勝手は悪くなりますが、Googleフォトにいれています。
Ubuntuをインストールしたあとに、Ubuntuのブラウザでログインすればwindowsとファイル共有できるのでつかいました。スマホやタブレットにもインストールできます。
Dropboxのリンク↓
https://www.dropbox.com

**Dropboxのインストール方法**　
**1.上記のリンクにアクセスしてログインする。**
![dropbo.com.png](https://qiita-image-store.s3.amazonaws.com/0/278637/65508cf4-5892-2a97-27d2-35ba78fe5477.png)
ログイン画面
![Screenshot from 2018-08-25 16-57-18.png](https://qiita-image-store.s3.amazonaws.com/0/278637/85af71fd-6b7c-f6f5-511e-daceb563e732.png)
**2.Dropboxをインストール**
アカウントのアイコンをクリック
![dropbox_home.png](https://qiita-image-store.s3.amazonaws.com/0/278637/3231df2f-4763-b26d-24b0-8946e91be55e.png)
インストールをクリック
![dropbox_menu.png](https://qiita-image-store.s3.amazonaws.com/0/278637/4c129f25-27c5-3bf0-9e95-26e4e3bcf4d9.png)
ダウンロード
![dropbox_install_windows.PNG](https://qiita-image-store.s3.amazonaws.com/0/278637/8072452d-589e-601d-bb38-e3b0043504e0.png)
ダウンロードをしたらインストーラーを起動してインストールしてください。
パソコンのHDDやSSDをクローンしてバックアップする。
--
大事なデータは以外な場所に保存していることがあります。なので時間はかかりますが、HDDまたはSSD全てバックアップを取りましょう。万が一デュアルブートを失敗してWindowsが起動しなくなっても大丈夫なようにするためです。僕はEaseUs Todo Backupというソフトをつかいました。これがリンクです↓
https://jp.easeus.com/backup-software/free.html
スクショして説明しようとしたのですが、うまく行かなかったので以下のサイトを参考にしてください↓
https://jp.easeus.com/tutorial/win-backup-free.html
windowsとubuntuをデュアルブートする。
--
僕はFusion 360 やIllustratorを使っているのでWindowsが必要です。Ubuntuじゃ動きません。
デュアルブートは下記のサイトに詳しく乗っています。僕が書くと間違ったこと書きそうで怖いので下記のサイトを参照してください。あとデュアルブートはミスるとWindowsも起動しなくなることがあるらしいので気をつけてください。
https://qiita.com/MTwitteJ/items/e6131a351f664df002b9
前編のまとめ・感想
--
・Dropboxは便利でデータがなくなる心配がない。
・Dropboxは他のOSや端末とファイル共有ができる。
・バックアップをしっかり取るべき。
・デュアルブートは慎重に。

今回は初めての投稿で少してこずりました。特に慣れないMarkdownやGIMPは大変でした。でもMarkdownはなれたら結構使いやすくて好きです。もっと高度なことを書けるようになりたいです。

次回はUbuntuでアプリのインストール等を行います。後編は[こちら](https://qiita.com/asapy0307/items/edb209d7208260b1d5fc#_reference-edbf1664c83831e62aa5)。
ARKitの処理はglobalキュー(default)で行われているらしい

# ARKitの処理はglobalキュー(default)で行われているらしい
API叩くのとかを安易にDispatchQueue.global().asyncで実行すると一瞬固まる
# global(qos: .default)以外で実行するべき
<img width="398" alt="スクリーンショット 2018-08-25 20.55.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/102145/5050133d-0405-8c3f-8856-ad7431679135.png">
.backgroundとかにすれば問題なし
【Xcode】xcodeprojとxcworkspaceの違いについて本気出して考えてみた

# これは？
タイトルの通りです。

*xcworkspace = 複数のxcodeprojを取りまとめられるもの*

と自分は考えていたのですが、 xcodeproj自身がxcodeprojを持つことも実はできるし、いまいち違いがわからなくなってきたので備忘録として。

## Target
XcodeのProjectには少なくともひとつ **Target** がありますね。
Targetとは、ビルドの結果得られる生成物のことで、iOS, watchOS, OSXなどがあります。

そして、どのTargetも `build settings` があり、ビルドするときは必ずいずれかのTargetを選択する必要があります。

![SampleProject_xcodeproj01.png](https://qiita-image-store.s3.amazonaws.com/0/153095/b91c70ae-1130-a750-4775-0ebfcc2acb20.png)

## Project (.xcodeproj)
iOSやwatchOSなど複数Targetsをグループ化するのが **Project** です。
Targetのベースとなる設定はProjectの `build settings` で行い、Target固有の設定はそれぞれのTarget内の `build settings` でやる感じです。

XcodeはProjectを開き、Targetをビルドする、ということですね。

![SampleProject_xcodeproj02.png](https://qiita-image-store.s3.amazonaws.com/0/153095/98723a8e-f9f9-c3a9-e225-f1908f37bee4.png)

## Subproject
Projectの中に他のProjectを **Subproject** として組み込むことができます。
Subprojectはそれ単体で開くことも、親プロジェクト内で開くこともできます。

親ProjectをビルドすればSubprojectもビルドが走ります(ビルドキャッシュ機構が動作するので、次に差分が生じるまでリビルドも生じません)。

同じXcodeのウィンドウからどちらのProjectも編集でき、Targetも選択可能です。

![SampleSubproject_xcodeproj03.png](https://qiita-image-store.s3.amazonaws.com/0/153095/e18116f9-103c-848e-6d23-48cc7fe9d6a1.png)

## Workspace (.xcworkspace)
複数のProjectを同じレベルで束ねることができるのが **Workspace** です。
PackegeMangerにCocoapodsを使用している場合はよく見ると思います。

![AnotherSampleProject_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/153095/bd376bb0-891b-f7e6-ffa9-22f99dd0ece9.png)

# xcodeproj vs xcworkspace
以上のことから、使い分けとしては以下のようになります。

- 1つのメインプロジェクトがあり、そこからの参照しかない場合は **Subproject** として組み込む
- 複数のプロジェクトからの依存がある場合、 **Workspace** として束ねる

# 参考
https://developer.apple.com/jp/documentation/ToolsLanguages/Conceptual/Xcode_Overview/CreatingApps/WorkingwithTargets.html
https://stackoverflow.com/questions/21631313/xcode-project-vs-xcode-workspace-differences
意外と簡単だったLaravelで画像アップロードテスト

Laravelで画像アップロード処理を実装したいのですが、
フロント側まだ作ってないので、テストを作って裏側だけで画像アップロードの挙動を確認したのでその流れを残しておきます。

## テスト作成

```console
$ php artisan make:test ImageUploadTest
```

## テストコード

```php
class ImageUploadTest extends TestCase
{
    public function testUploadImage()
    {
        //フェイクディスクの作成
        //storage/framework/testing/disks/designに保存用ディスクが作成される
        //(指定しなければdesignではなくlocalフォルダが保存用に使用される)
        Storage::fake('design'); // テスト後ファイルは削除される
        // Storage::persistentFake('design'); テスト後も画像ファイルが残る

        // 画像アップロード用サービスクラス作成(僕はS3にアップロード)
        $imageService = new ImageService(new S3ImageUploader);
  
        // UploadedFileクラス用意
        $uploadedFile = UploadedFile::fake()->image('design.jpg');

        // 作成した画像を移動
　　　　　　　　　　　　　　　　// 移動しない場合は /private/var/folders/sf/hfbkqhw17xz_cgzwd5xhp7nm0000gn/T/phprqilrq みたいなパスに保存されてた 
        $uploadedFile->move('storage/framework/testing/disks/design');

        // S3にアップロードする処理
        $imageService->upload($uploadedFile);

        // storage/framework/testing/disks/design内に該当ファイルが存在するか
        // S3にアップロードされたかはS3のバケットを確認しました。
        Storage::disk('design')->assertExists($uploadedFile->getFilename());

    }
}
```

個人的にはこれで仮画像作成してくれんのが便利だなーと思いました。

```php
$uploadedFile = UploadedFile::fake()->image('design.jpg');
```

S3へのアップロードはこちらを参考
[PHPでAWSのS3に画像アップロード&画像を画面表示(設定〜実装まで)](https://qiita.com/Yorinton/items/bdf5f9bc05629c9a0df7)
「HeadFirstデザインパターン」と「Rubyによるデザインパターン」を読んで Adapter パターン

何番煎じか判りませんがお勉強メモを残します

「[HeadFirstデザインパターン](https://www.amazon.co.jp/dp/4873112494)」第7章
「[Rubyによるデザインパターン](https://www.amazon.co.jp/dp/4894712857)」第9章

# Adapter パターン

オブジェクトアダプタとクラスアダプタ

- アダプタパターンには実は２種類あるんです
- アダプタパターンと言えばオブジェクトアダプタパターンを指しているものと考えて良い
- クラスアダプタパターンを実装するには多重継承を使うので考えたくない(RubyもJavaも多重継承をサポートしていない)

#### 「HeadFirstデザインパターン」でのJavaコードは（だいたい）こんな感じ

- 鴨のように鳴き、鴨のように飛ぶものが居たら、それは鴨アダプタでラップされた七面鳥オブジェクトかもしれない
- 鴨クラスを使用している旧システムのコードを変更せずに、七面鳥クラスを使用したい

鴨インタフェース => 鳴き、飛ぶ

```java
public interface Duck {
  public void quack(); // 鳴く
  public void fly();
}
```

マガモクラス => ガーガー鳴き、飛ぶ

```java
public class MallardDuck implements Duck {
  public void quack() {
    System.out.println("ガーガー");
  }

  public void fly() {
    System.out.println("飛ぶ");
  }
}
```

鴨クラスを使用している旧システムはこんな感じ　これは変更できない

```java
static void testDuck(Duck duck) {
  duck.quack();
  duck.fly();
}

Duck duck = new Duck();
testDuck(duck);
```

ここで上司が「今度、七面鳥オブジェクトも増えるんで対応ヨロ」と言い出したとしたら

七面鳥インタフェース => 鳴く

```java
public interface Turkey {
  public void gobble(); // ゴロゴロ鳴くらしい(外国語)
  public void fly();
}
```

七面鳥クラス => ゴロゴロ鳴き、短い距離を飛ぶ

```java
public class WildTurkey implements Turkey {
  public void gobble() {
    System.out.println("ゴロゴロ");
  }

  public void fly() {
    System.out.println("短い距離を飛ぶ");
  }
}
```

当然、旧システムには渡せない

```java
WildTurkey turkey = new WildTurkey();
testDuck(turkey); // Duckインタフェースじゃないのでエラー
```

そこでアダプタです

```java
public class TurkeyAdapter implements Duck {
  Turkey turkey;

  public TurkeyAdapter(Turkey turkey) {
    this.turkey = turkey;
  }

  public void quack() {
    turkey.gobble();
  }

  public void fly() {
    // 七面鳥は短い距離しか飛べないので5回くらい飛ばせてみる
    for(int i = 0; i < 5; i++) {
      turkey.fly();
    }
  }
}
```

旧システムに七面鳥を渡してみる

```java
WildTurkey turkey = new WildTurkey();
Duck turkeyAdapter = new TurkeyAdapter(turkey)

testDuck(turkeyAdapter);
```

- クラスのインタフェースをクライアントが期待する別のインタフェースに変換
- 互換性がなく、そのままでは連携できないクラスを連携させる


#### 「Rubyによるデザインパターン」でのRubyコードは（だいたい）こんな感じ

アダプタの説明は上記のJavaの例と(言いたい事は)同じ

だが代替手段が提示される。つまり

- 七面鳥クラスをオープンして、メソッドを追加するだけでいいんじゃね？
- アダプタ要らねんじゃね？

```ruby
class WildTurkey
  def quack
    gobble
  end

  alias_method :original_fly, :fly

  def fly
    5.times { original_fly }
  end
end
```

- 七面鳥クラスのインスタンス全ての振る舞いを変更するのはやりすぎじゃね？
- そのインスタンスに特異メソッドを定義するだけでいいんじゃね？

```ruby
turkey = WildTurkey.new

class << turkey
  def quack
    gobble
  end

  alias_method :original_fly, :fly

  def fly
    5.times { original_fly }
  end
end
```

#### RubyだとAdapterパターンを使うなって事？

- インターフェースのサポートの為にクラスやインスタンスを変更するのは、Adapterパターンに比べてシンプルなコードになる
- クラス内に潜り込んで変更するというこのテクニックは深刻なカプセル化違反を伴う
- 変更するクラスの事を十分に熟知していない、インターフェースの不整合が広範囲に及んでいる、ような場合にはトラブルの原因となりえる
- トレードオフ。Adapterパターンではいくらかの複雑化と引き換えにカプセル化を守ることができる
- クラスの変更ではいくらかの単純化と引き換えに内部をいじるコストがかかる
Node Js Elastic Search Tutorial

Node js Elastic Search Tutorial Example is the today’s main topic.  Elasticsearch is an open source search engine, which becomes hugely popular due to its high performance and distributed architecture. Elasticsearch is built on top of the Apache Lucene, which is a high-performance text search engine library. Although Elasticsearch can perform the storage and retrieval of data, its primary purpose is not to serve as a database. Instead, it is a search engine (server) with the primary goal of indexing, searching, and providing real-time statistics on the data.
[Show More](https://appdividend.com/2018/06/29/node-js-elastic-search-tutorial-example/)
RANSACの確率論

# Ransacの基礎と確率論


## 概要
Ransac(Random sample consensus)とは， 外れ値（アウトライア）を含む観測データから数理モデルを推定する反復法であり，外れ値の影響を除いた推定を行うことができる([wikipediaより](https://en.wikipedia.org/wiki/Random_sample_consensus))．

## 手順
あらかじめ決めておく数量
　　・モデルの判定に用いる閾値$T$
　　・数理モデルの推定に使うデータ数$s$（例えば線形回帰なら最低2）
　　・反復回数$N$

1.観測データから$s$個のデータをランダムサンプルする
2.そのサンプルから数理モデル$M_i$を推定する
3.その数理モデル対し，閾値$T$を満たすインライアの数をカウントする
4.インライア数が過去のものより大きければベストモデル$M_b$を$M_i$に更新する
5.1~4をN回繰り返す
6.ベストモデル$M_b$が得られる

## パラメータの決定方法
・**閾値$T$**
　　　アウトライアの性質と想定される数理モデルで決める
・**数理モデルに用いるデータ数$s$**
　　　モデルの推定に必要なデータ数以上にする．インライアに乗ったノイズとデータ中に含まれるインライア率$\omega$によって決まる？（要検証）
・**反復回数$N$**
　　　インライア率$\omega$と有意なモデルを計算する確率$p$よって以下の式で決まる．$p=0.95$など．
　　　この回数以上の反復を行うことで$p$以上の確率でアウトライアの影響のない数理モデルが得られる．

````math
N = \frac{ln(1-p)}{ln(1-\omega^s)}
````


## 数学的背景

**反復回数の由来**

得られた観測データ中にインライアが確率$\omega$で存在し，$s$個のデータを観測データからランダムサンプルし数理モデルを推定するとき，そのデータにアウトライアが含まれない確率は$\omega^s$である．
ランダムサンプルを$N$回繰り返した時に少なくとも1度はアウトライアの無いサンプルを取り出す確率は
$$1-(1 - \omega^s)^{N}$$
である．

所望の確率$p$以上でアウトライアの無いモデルを計算するのに最低限必要な反復回数$N_{min}$は，

````math
p = 1-(1 - \omega^s)^{N_{min}} < 1-(1 - \omega^s)^{N}\\
1- p = (1 - \omega^s)^{N_{min}}\\
log(1- p) = N_{min}log(1 - \omega^s)\\
N_{min} = \frac{log(1- p)}{log(1 - \omega^s)}\\
````

によって求められている．

**必要反復回数の平均・分散**

ランダムサンプルを繰り返すとき，$k$回目に初めてサンプルにアウトライアが無かったとする．
この回数$k$の期待値と分散を計算する．
$$P[K = n] = \omega^s(1-\omega^s)^{n-1}$$
のため，$k$の期待値$E[k]$は以下となる．

````math
E[k] = \sum_{n=1}^\infty n\omega^s(1-\omega^s)^{n-1}
= \frac{\omega^s}{1-\omega^s} \sum_{n = 1}^\infty n(1-\omega^s)^n
````

$\sum_{n = 1}^\infty nk^n = \frac{k}{(1-k)^2}$より，

````math
E[k] = \frac{\omega^s}{1-\omega^s} \frac{1-\omega^s}{\omega^{2s}}
= \frac{1}{\omega^s}
````

また，$k$の分散$Var[k]$や標準偏差SD[k]は，

````math
Var[k] = \sum_{n=1}^\infty n^2\omega^s(1-\omega^s)^{n-1} - E[k]^2\\
= \frac{\omega^s}{1-\omega^s} \sum_{n = 1}^\infty n^2(1-\omega^s)^n - \frac{1}{\omega^{2s}}
````

ここで，$\sum_{n = 1}^\infty n^2k^n = \frac{k(1+k)}{(1-k)^3}$より，

````math
Var[k] = \frac{\omega^s}{1-\omega^s} \frac{(1-\omega^s)(2-\omega^s)}{\omega^{3s}} - \frac{1}{\omega^{2s}}\\
= \frac{2-\omega^s}{\omega^{2s}} - \frac{1}{\omega^{2s}}\\
= \frac{1-\omega^s}{\omega^{2s}}\\
SD[k] = \sqrt{Var[k]} = \frac{\sqrt{1-\omega^s}}{\omega^s}
````

## 参考文献
https://en.wikipedia.org/wiki/Random_sample_consensus
https://www.sri.com/sites/default/files/publications/ransac-publication.pdf
今日の進捗

###初めまして
今日から自身のprogrammingの日記をつけようと思います。

###今日学んだこと
####今日はprogateのRuby On Rails学習コースをしました。
- 変数session...
- getとpost
- applicationコントローラー
- to_iメソッド

######変数session
ページを移動してもユーザー情報を保持し続けるために、sessionという特殊な変数を用います。sessionに代入された値は、ブラウザ(InternetExplorer, GoogleChrome等)に保存されます。sessionに値を代入すると、ブラウザはそれ以降のアクセスでsessionの値をRailsに送信します。

######getとpost
get : データベースを変更しない場合
post : データベースを変更する場合、sessionの値を変更する場合

######applicationコントローラー
applicationコントローラーで定義したメソッドは各コントローラにbefore_action:に指定すると全てのアクションの前に実行することができます。また、onlyを使うことでアクションを限定できます。

######to_iメソッド
文字列を数値に帰るメソッド。
psコマンドでソート（BSDスタイル）



psコマンドはデフォルトではPIDの昇順で表示される。
しかし、トラブルシューティングのときなどは、CPU使用率やメモリ使用量など特定のカラムでソートして表示したい。

`--sort`オプションがあるのでそれを使う。

```
# CPU使用率の降順で表示
$ ps aux --sort -%cpu

# CPU使用率の昇順の表示("+"はなくても可)
$ ps aux --sort +%cpu 


# RSSの降順で表示
ps aux --sort -rss

# RSSの昇順で表示
ps aux --sort +rss
```

ソートのキーとして指定できる名前は、`man ps`の`STANDARD FORMAT SPECIFIERS`を参照する。
NETGEAR Readynas 102 のディスクをPCでデータ吸出し 

Readynasのrootが使用率100%になって再起動後接続不可になった。
とりあえず、いろいろやるにしてもデータのサルベージをしてからの作業としようと思い、重要データ(子どもたちの写真/動画)を退避することに。
自分のための備忘録。

1. 適当なPCを準備。
2. Ubuntu Desktop 日本語 Remix をdownload。
3. UbuntuをPCにインストール。DVD起動だと地獄の遅さなので適当なHDDにインストール。
4. PCにReadynasのHDDを接続
5. Ubuntu起動
6. 接続できているReadynasのHDDを確認
```
fdisk -l
```
7. データが入っているパーティションを起動
```
mdadm --run /dev/md127
```
8. 該当パーティションをマウント
```
mount /dev/md127 /tmp/test
```
9. データを吸い出し

※パッケージが足りないかも＆SSHしたいので 

```
apt-get install mdadm
apt-get install lvm2
apt-get install fuseext2
apt-get install openssh-server
```
あたりもやりました
Linuxの基礎知識まとめ

無料でカスタマイズ可能なOSであるLinuxさんに関する超基礎知識のまとめ

## リストを作る

　　複数の要素をわかりやすくまとめるためにディレクトリの内容をリスト化しよう

リスト化するときは"ls"とタイプするだけ

例えば、lionsとtigersが登録されているcatsというディレクトリが選択されているとする。lsとタイプすると…
lions  tigers  とアウトプットされる。

一つ一つの情報をもっと詳しく見たい時は"more"を使おう

例　　more lions

## ディレクトリを作る
ディレクトリを作るコマンドはシンプル。"mkdir"だ。
make directory　の略。
　
##ファイルに移動
　wolvesというファイルをdogsというディレクトリの中に移動させると仮定する。その場合、
mv wolves dogsというコードを書く。
ファイルが先、ディレクトリが後
※ファイル名を変えたい時は、同じ順番で、ファイル名を変えて打つ
例）ファイル名をwolvesからcoyotesに変える
mv wolves coyotes

##今いるディレクトリはどこ？？
今、どのディレクトリで作業しているのかわかんない。そんなときはpwd(print working directory)を使おう

##他のディレクトリをいじりたい…
　ふと突然、別のディレクトリでの作業を思い出した。dogsというディレクトリで作業していたが、catsディレクトリにあるtigersファイルをsiberiansファイルに改名したいとする。
ここまでの知識を使えば、

cd..
cd cats
mv tigers Siberians
cd..
cd dogs
とする必要がある。でもめちゃくちゃめんどくさい。
しかし、これをたった1つのコマンドで済ませることができる。
mv/animals/cats/tigers/animals/cats/Siberians

他の例
他のディレクトリからreptileディレクトリのcobrasをsnakesディレクトリにコピーする。
cp reptiles/cobras snakes
論文まとめ：TernausNet: U-Net with VGG11 Encoder Pre-Trained on ImageNet for Image Segmentation

#はじめに
KaggleのCarvana Image Masking Challengeで１位を取ったモデル：TernausNet の論文をまとめてみた。

[1] V. Iglovikov, et. al. "TernausNet: U-Net with VGG11 Encoder Pre-Trained on ImageNet for Image Segmentation"

arXiv：https://arxiv.org/abs/1801.05746

著者らのGithubコードは公開されている。
https://github.com/ternaus/TernausNet

# 概要  
1. U-Net に転移学習を適用させ、有効性を実証した

# アーキテクチャ
アーキテクチャの全体像は以下の図。
<img width="934" alt="ternausNet_img01.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/449e891e-7a2f-8134-c7ab-71dfec502407.png">

[1]のFigure 1より

見た通り、通常のU-Net構造だが、encoderだけVGGNetを転移学習させる。

転移学習させるVGG-11のネットワークはこれ。

<img width="457" alt="ternausNet_img02.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/7ce5c72a-edca-2310-df20-f71a1d8fc7c5.png">

[1] Figure 2 より

よく見かけるVGG-11。このオレンジの部分（fully-connected)を取り払って、１つのconv層を追加し、encorderとする。

# メトリクス  
以下のIoU（Jaccard index）。

```math
J(A,B) = \frac{| A \cap B |}{| A \cup B |} = \frac{| A \cap B |}{| A | + | B | - |A \cap B |}
```

# 目的関数
２つの要素から構成される。１つ目はメトリクスのIoUを直接求める。

```math
J = \frac{1}{n} \sum^n_{i=1} \left( \frac{y_i \hat{y_i}}{y_i + \hat{y_i} - y_i \hat{y_i}} \right)
```

ここで $y_i$ はi pixelのtarget、$\hat{y_i}$ は同推論値。

もう１つは通常のcross entropy。

```math
H = - \frac{1}{n} \sum^n_{i=1} \left( y_i \log \hat{y_i} + (1-y_i)\log (1-\hat{y_i}) \right)
```

トータルのlossはこれら２つを足す。具体的には H に J の negative-logを足す。

```math
L = H -\log J
```
# 実験と結果  
転移学習の有効性を証明するため、転移学習したものとしないもので比較実験を行なった。

実験の設定は以下
1. データセット：Inria Aerial Image Labeling Dataset
2. 最適化：Adam learning rate=0.001
3. data augmentation：crop

転移学習しないモデルは以下の LeCun uniform initializerでパラメータを初期化した。

-  $L = \sqrt{\frac{1}{f_{in}}}$ として $[-L, L]$ の一様分布から得る

###結果
1. LeCun uniform initializer：IoU=0.593
2. ImageNetで学習したVGG11の転移学習：IoU=0.686
3. Carvanaデータセットで事前学習したモデルの再学習：IoU=0.687

学習曲線は以下。

<img width="759" alt="ternausNet_img03.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/cf760b6f-bc60-74ca-2a7d-41feb442f628.png">

[1] Figure 3より

# 結論  
1. 転移学習はU-Netモデルでも有効

# 今後の展望  
今回はVGG11の転移学習だったが、これをVGG16やResNetにすると、さらに精度が上がるのではないか。

# 個人的感想  
この論文が出る前からコンペとかでsemantic segmentationモデルに転移学習を適応させていた方は多いと思うが、改めて論文にまとめてくれた点は有難い。
Mac に jenv を利用して Java の開発環境を作る

Mac に [jenv](https://github.com/gcuisinier/jenv) を利用して Java の開発環境を作る手順。

## JAVA のインストール
8 と 10 をインストールする

```shell-session
$ brew tap caskroom/versions

# java 8
$ brew cask install java8

# java 10 ( 最新バージョン )
$ brew cask install java
```

## jenv のインストール

```shell-session
$ git clone https://github.com/gcuisinier/jenv.git ~/.jenv
```

`.bash_profile` に下記を追記する。

```sh
# jenv
export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"
```

`.bash_profile` を読み込む。

```shell-session
$ source .bash_profile
```

## jenv の使い方

インストールされている Java のバージョンを確認する。

```shell-session
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    10.0.2, x86_64:	"Java SE 10.0.2"	/Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
    1.8.0_181, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
```

jenv にインストールされている Java の PATH を追加する。 Java をバージョン UP したりしたら add し直す。

```shell-session
$ jenv add /Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
$ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
```

指定のバージョンをグローバルで利用する。

```shell-session
$ jenv global 10.0.2
```

指定のバージョンをローカル（そのディレクトリ）で利用する。

```shell-session
$ jenv local 10.0.2
```

## jenv を更新する方法

```shell-session
$ cd $(jenv root)
$ git pull
```
AutoML Visionをためしてみた

やってみた系の日本語の記事が少なかった(まだベータ版だから?)のと、Qiitaにもあまりなかったので、記事にまとめておきます。
AutoML Visionの開始から学習、予測を行うまでの内容になります。実際にpythonからAPIを叩く編はまた次の記事で書きます。


## 最初の準備
- 適当なプロジェクト作成
- AutoML側からプロジェクトにアクセスできるように権限周りを設定
    - [Quick Start](https://cloud.google.com/vision/automl/docs/quickstart?hl=ja#add_permissions_for_the_automl_vision_service_account)によると次のロールが必要
        - Cloud ML Engine 管理者(roles/ml.admin)
        - ストレージ管理者(roles/storage.admin)
- Cloud Platform → 人工知能 →　Vison　を選択
- プロジェクトを選択

詳しくは、[公式のQuick Start](https://cloud.google.com/vision/automl/docs/quickstart?hl=ja)

## DataSetsの作成
DataSetsの作成方法は以下の2つがあります。

- ローカルから画像、zipを直接アップロード
- gcsからimport

今回は、gcsからimportする方法のみを試してみました。

1. GCSにバケットを作り画像をアップロード
    - AutoMLを開始したプロジェクトと同じプロジェクトにバケットを作成
    - アップロードは、コマンドラインから Cloud Storage にアクセスできる[gsutil](https://cloud.google.com/storage/docs/gsutil?hl=ja)を使うと楽
3. アップロードしたイメージのURLとラベルを対応づけたcsvファイルを作成
    - 以下のようなフォーマットのCSVファイルを作る
    
    ```   
    gs://プロジェクトID/ディレクトリ/画像ファイル,ラベル
    gs://プロジェクトID/ディレクトリ/画像ファイル,ラベル
    .
    .
    ```
    - ラベルを複数つけると、マルチラベルでのクラスタリングが可能
    - このときcsvのheaderとidは不要
    
    詳しくは以下 https://cloud.google.com/vision/automl/docs/prepare#csv
3. 作成したcsvファイルを、画像をアップロードしたバケットにアップロード
4. AutoML側から、CSV使ったデータセットの作成をすると、画像が読み込まれる

読み込まれた画像とラベルは、AutoMLの画面のImageタブから確認できます。


<img src="https://qiita-image-store.s3.amazonaws.com/0/204896/cf760930-aa6f-f2ba-bc4d-06c1082e379e.jpeg" width=80%>


zipを使った場合は、こちらの方がやっておられました。
[Cloud AutoML Visionを使ってみた(使ってみただけ)](https://qiita.com/furu8ma/items/1fdbf942a68e45762374)
ファイルの構造がそのままラベルになるのは楽で良いですね。

### メモ
 - 1ラベルあたり1,000枚の画像を使うことが推奨
 - データセットは、トレーニング用に80％、検証用に10％、テスト用に10％を使用される
 - ラベルあたり、10枚の画像が最小(高度なモデルの場合は50枚？)
 - モデルをトレーニングするときは、次の画像形式がサポート
     - JPEG
     - PNG
     - WEBP
     - GIF
     - BMP
     - TIFF
     - ICO
 - 画像の最大ファイルサイズは30MB


## 学習
AutoMLの画面のTrainタブ→TRAIN NEW MODELをクリック
モデル名や学習にかける時間などを設定する。
1 compute hourを選択すると1時間の学習が無料で行える。

<img src="https://qiita-image-store.s3.amazonaws.com/0/204896/7be1a4a0-1ac1-4310-2336-c26ff603880e.png" width=50%>

START TRAININGで学習開始
あとは、待機

価格は、

- 1時間のトレーニングならば、毎月最大10個のモデルまで無料
- その後の訓練時間は1時間あたり20ドル
- 既存のモデルのトレーニングを再開すると、トレーニング費用は1時間あたり20ドル

https://cloud.google.com/vision/automl/pricing#training_costs


## 学習結果
学習結果は、AutoMLの画面のEVALUATEタブから確認できる。
precision(精度)やrecall(再現度)などが確認できる。

<img src="https://qiita-image-store.s3.amazonaws.com/0/204896/2baa0c45-2879-a725-2020-1fa3862125b3.png" width=70%>

## 予測
AutoMLの画面のPREDICTタブから確認できる。

画像をアップロードすると予測のテストが行える。
curlとpython用のコードも用意してくれてるのでコピペで動く。

### メモ
- 予測には、次の画像形式がサポート
    - JPEG
    - PNG
    - GIF
- 最大ファイルサイズは1.5MB
- 学習済みのモデルはエクスポートはできない模様
- インポートも無理っぽい


価格は、
- 1000枚まで無料/1月
- それ以降は1000枚の画像につき3ドル/1月



## 価格まとめ
学習時
- 1時間のトレーニングならば、毎月最大10個のモデルまで無料
- その後の訓練時間は1時間あたり20ドル

予測時
- 1000枚まで無料/1月
- それ以降は1000枚の画像につき3ドル/1月

あと、GCS代

## まとめ
- 教師データさえ集めてくれば簡単にできる
- こうすれば精度を上がるよ的なことも教えてくれるので、それに沿っていけば精度向上も簡単なのでは？
- モデルの更新で料金が発生するので、予測するラベルやDataSetは慎重に選ばないと何度も学習しなおすことになって死にそう
- 予測用のサーバー、コードを用意、維持する必要がないので、予測にかかる技術や価格のコストは低いと思った
EC2にデスクトップ環境を構築する手順

# はじめに
RDPでリモートのデスクトップ環境が複数ほしいなーと思ったので、AWSの無料枠に収まる範囲の軽量な？デスクトップ環境の構築方法をメモします。


# EC2
今回使うEC2インスタンスは下記の通りです。

### AMI
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266454/5885d2cc-7f77-ff9c-44b2-b301961a62cc.png)



### インスタンスタイプ
t2.micro

### EBS
10GB （汎用SSD）

### セキュリティグループ
|Protocol|TCP/UDP|Port|
|---|---|---| 
|SSH|TCP|22|
|RDP|TCP|3389|

### 容量確認
```bash
ubuntu@ip:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            488M     0  488M   0% /dev
tmpfs           100M  3.3M   96M   4% /run
/dev/xvda1      9.7G  961M  8.7G  10% /
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           496M     0  496M   0% /sys/fs/cgroup
/dev/loop0       87M   87M     0 100% /snap/core/5145
/dev/loop1       13M   13M     0 100% /snap/amazon-ssm-agent/295
tmpfs           100M     0  100M   0% /run/user/1000
```



# 環境構築
デスクトップ環境の構築手順に入ります。

### リポジトリ最新化
パッケージをインストールするために、リポジトリを最新化します。

```bash
ubuntu@ip :~$ sudo apt update
Hit:1 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu xenial InRelease
Get:2 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]
# 省略
Get:37 http://security.ubuntu.com/ubuntu xenial-security/multiverse amd64 Packages [3,456 B]
Get:38 http://security.ubuntu.com/ubuntu xenial-security/multiverse Translation-en [1,744 B]
Fetched 25.5 MB in 4s (5,288 kB/s)
Reading package lists... Done
Building dependency tree       
Reading state information... Done
5 packages can be upgraded. Run 'apt list --upgradable' to see them.
```

### LXDE
デスクトップ環境は、LXDEを選びました。

```bash
sudo apt install -y lxde
```


### XRDP
リモートのデスクトップ環境へ接続するために、xrdpをインストールしておきます。

```bash
sudo apt install -y xrdp
```

### ユーザ設定
RDPでログインするために、ユーザにパスワードを設定しておきます。

```bash
$ sudo passwd ubuntu
Enter new UNIX password:ログイン時のパスワードを設定 
Retype new UNIX password: 同じものをもう一度
passwd: password updated successfully
```





# 確認
RDPでEC2へログインしてみました。
LXDEをインストールすると、デフォルトでfirefoxが入っているみたいですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266454/a03a6604-f8e6-6f11-879d-5417436e51ba.png)

容量は7GB近く空いていました。

```bash
ubuntu@:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            488M     0  488M   0% /dev
tmpfs           100M  3.4M   96M   4% /run
/dev/xvda1      9.7G  2.6G  7.1G  27% /
tmpfs           496M   19M  478M   4% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           496M     0  496M   0% /sys/fs/cgroup
/dev/loop0       87M   87M     0 100% /snap/core/5145
/dev/loop1       13M   13M     0 100% /snap/amazon-ssm-agent/295
tmpfs           100M  8.0K  100M   1% /run/user/1000
```


# おわりに
日本語化パッケージなどは今回設定していません。
とりあえずGUIでブラウジングするための環境構築手順に留まっています。


以上！
Atcoder ABC 104 C by Python3 (組み合わせの単位を大きくすることで組み合わせ数を圧縮する)

[Atcoder Beginner Contest 104 C](https://beta.atcoder.jp/contests/abc104/tasks/abc104_c)　のPython3による解答例。

##学んだこと
- 組み合わせの単位を大きく考えることで、組み合わせ数を圧縮して計算量が減らせる。この問題の例でいうと、「1つ1つの問題を解いたか」ではなく「それぞれのランクの問題をコンプしたか」を考えるとよい。
- 実行時エラーの主な原因は 1.ゼロ除算, 2.リストの範囲外アクセス。

##コード
```
# coding: utf-8
ranknum,goal = list(map(int,input().split()))
probnum = [0]*ranknum
bonus = [0]*ranknum
compscore = [0]*ranknum

for i in range(ranknum):
    probnum[i], bonus[i] = list(map(int,input().split()))
    #（↓）各ランクをコンプした場合に得られる得点をcompscoreに格納しておく。
    compscore[i] = 100*(i+1)*probnum[i] + bonus[i]

from itertools import product
from math import ceil

#（↓）得点Gを達成する最小の問題正解数minprobを初期化。前提により必ず1000以下になるので、1001で初期化しておく。
minprob = 1001

#（↓）各ランクの問題をコンプするか否かについて、2^ranknum通りの組み合わせをループ処理する。
for c in product(range(2),repeat=ranknum):
    score = 0
    solvedprob = 0
    notcompedindex = -1

    #（↓）コンプした問題について、得点をscoreに、正解数をsolvedprobnumに格納する。
    for i in range(ranknum):
        if c[i] == 1:
            score +=  compscore[i]
            solvedprob +=  probnum[i]
        #（↓）コンプされていないランクのインデックスのうち最大のものをnotcompedindexに格納しておく。
        else:
            notcompedindex = i

    #（↓）コンプした問題だけでgoalに達さず、かつ、コンプしていない最高ランクの問題をコンプ寸前まで解けば
    #（↓）ゴールに達する場合、ゴールをぎりぎり達成するところまで正解した状態へと、
    #（↓）scoreとsolvedprobを更新する。
    if score < goal and score+100*(notcompedindex+1)*(probnum[notcompedindex]-1) >= goal:
        solvedprob += ceil((goal - score)/(100*(notcompedindex+1)))
        score += ceil((goal - score)/(100*(notcompedindex+1)))*100*(notcompedindex+1)
    
    #（↓）最終的にゴールを達成している場合、正解数が暫定最小ならば、それをminprobに格納しておく。
    if score >= goal:
        minprob = min(minprob, solvedprob)  

print(minprob)
```
Windows10 + bitnami環境でRedmineのプラグイン開発→git log の日本語表示をするには（未解決）

GitもRailsもRedmineのプラグイン開発も勉強中です。

#環境
Windows10 64bit
Bitnami Redmine Stack -3.4.3-1
git version 2.14.1.windows.1

#現象
Redmineのプラグイン開発をしようと思い、bitnamiでRedmineをローカルにインストールしました。
この場合にRailsのコマンドを使うためには、use Bitnami Redmine Stack でコマンドプロンプトを起動すると必要な設定が行われます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281116/44450cf3-5b16-b8b2-13a3-4c0eaa525648.png)

バージョン管理はRails Tutorial に倣ってgitを使用することにしました。Git For Windows は下記リンク先を参考に設定しています。
OPC Diary - 私家版 Git For Windowsのインストール手順
https://opcdiary.net/?page_id=27065

本題ですが、Bitnamiが用意してくれるコマンドプロンプトの環境でも add, commit などは問題なく使用できます。コメントの日本語も問題ありませんでした。しかし、logを呼び出そうとすると・・・
`This problem is probably due to using incompatible versions of the cygwin DLL.`
とかなんとか言ってくる。これでは使えない。

そこで今度はGit For Windows をインストールしたときに同梱されていたGit Bashを使ってみると、無事表示されたが、ログを表示した後[Ctrl]+[c]で別コマンドを入力しても入力内容が画面に表示されなくなってしまう。
画面に表示されないだけで実際には入力されているのだが、非常に分かりにくい。

仕方ないのでしばらくこの状態で使っていました。

# 原因判明
ふと通常のコマンドプロンプトでgit log すると問題なく日本語で表示され、ログ表示を抜けた後も問題なくコマンド入力できることがわかりました。

ただ通常のコマンドプロンプトではRailsのコマンドが使えない。
もう一度Bitnamiの環境でのエラーを確認すると、
`      0 [main] less (9956) C:\Bitnami\redmine-3.4.3-1\git\usr\bin\less.exe: *** fatal error - cygheap base mismatch detected`
見逃していたけど、Git For Windows ではなくBitnamiのGitを使っているようだ。

# ~~解決~~　未解決
Bitnami のGitフォルダの名称を変更し、BitnamiではなくGit For Windows のGitが呼ばれるようにする。

```
cd C:\Bitnami\redmine-3.4.3-1
ren git git_
```

2018/09/02 追記
これでうまく動作したように思えたが、何回か使うとやはり表示がおかしくなる。
コマンドプロンプトの代わりに「:」が表示され、そのあと1、2回のキー入力が無効になる。そのあとに入力したコマンドは使えるのだが・・・

もう少しちゃんと環境作ればいいんだろうけど、このままでも使えなくはないので、気が向いたときに再挑戦しようと思います。
Kindle Paperwhiteでスリープをオフにする

Kindle Paperwhiteは一定時間放置していると以下のようなスクリーンセーバーが表示されます。
スリープを無効化する設定はありませんが、このスクリーンセーバーを表示させなくして、結果的にスリープしなくなる方法があります。

![IMG_20180825_170454.jpg](https://qiita-image-store.s3.amazonaws.com/0/187768/e32ea738-ff7b-ea94-8899-85a34c0d90e5.jpeg)

## スクリーンセーバー無効化の設定
この方法は隠しコマンドを入力するやり方で、ホーム画面で普段使っている検索ボックスに`~ds`と入力します。

![IMG_20180825_171948.jpg](https://qiita-image-store.s3.amazonaws.com/0/187768/72e13372-60e0-6249-0762-ff4e04462efc.jpeg)
![IMG_20180825_172012.jpg](https://qiita-image-store.s3.amazonaws.com/0/187768/723a10c7-37d1-0d28-06cb-6d968f4d1e85.jpeg)

これでこのまま検索を実行すると何も変化はありませんが、電源ボタンを押してもスクリーンセーバーに切り替わらなくなったと思います。
この設定はスクリーンセーバーの表示を無効化するもので、結果的にスリープされない状態になります。

これによって今度は使い終わった時に画面をOFFにしたくてもできなくなるので、電源ボタン長押しで表示されるメニューで画面オフを選択するようにしてください。

![IMG_20180825_172040.jpg](https://qiita-image-store.s3.amazonaws.com/0/187768/d6d69848-ea92-ae8d-44d6-671d5b64d8fd.jpeg)

このスクリーンセーバーの無効化設定は再起動するとリセットされるので、元に戻したい場合はリセットしてください。

他にも隠しコマンドがあるようで、興味があるかたは参考URLをご参照ください。

## 参考
https://ebooks.stackexchange.com/questions/152/what-commands-can-be-given-in-the-kindles-search-box
IoT クラウド開発において IBM Cloud を選んだ理由

IoT システム開発の機会が訪れたので、有名どころクラウドを比較して選定しました。

# 選定における要件

以下のような制約を設けました。

- Platform as a Service （いわゆるマネージド）や Function as a Service （いわゆるサーバーレス）が望ましい
- MQTT Broker
    - 対向システムよりデータが publish されるため
    - 対向システムとして Arduino 等 OS を使用しない低レベルなデバイスも対象
    - ペイロードは任意のバイナリデータ（JSONでラッピングは可能）
    - MQTT over TLS (MQTTS)
    - クライアント認証も利用
    - MQTTクライアントIDはクライアントが生成
- HTTP API Gateway
    - スマートフォンアプリによるアクセスするため
- DB
    - Function as a Service と組み合わせるため、スケーラブルな DB が望ましい
- Storage
    - ログの保存等に使用
- 高速な開発と、高品質な開発の双方が可能であること
    - プロトタイピングからプロダクションユースまでカバーしたいため

# 選定

## AWS → 無難な選択肢。経験者多し
かくいう私自身も AWS が最も経験長いです。

| 項目 | サービス | 備考 |
|:-:|:-:|:--
| MQTT Broker | Amazon MQ or AWS IoT Message Broker | * [Client ID 任意](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/protocols.html)<br>* [AWS IoT 認証](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-authentication.html) (X.509含む), カスタム認証が可能<br>* [MQ より Lambda を invoke 可能](https://aws.amazon.com/jp/blogs/compute/invoking-aws-lambda-from-amazon-mq/) |
| Function as a Service | AWS Lambda | * スケジュールされたイベントは最短1分間隔 |
| Database | Amazon DynamoDB |   |
| Storage | Amazon S3 |   |
| API | Amazon API Gateway | |

## GCP → MQTT Bridge の柔軟性が低いため除外

| 項目 | サービス | 備考 |
|:-:|:-:|:--
| MQTT Broker | [Cloud IoT Core MQTT Bridge](https://cloud.google.com/iot/docs/how-tos/mqtt-bridge) | * Does not support all publish/subscribe operation.<br>* [Arduino向け認証ライブラリ](https://github.com/GoogleCloudPlatform/google-cloud-iot-arduino)は正式サポート外<br>* [Client ID に制約あり](https://cloud.google.com/iot/docs/how-tos/mqtt-bridge#device_authentication)

## Azure → JSONペイロードしかサポートされない？

| 項目 | サービス | 備考 |
|:-:|:-:|:--
| MQTT Broker | Azure IoT Hub | * JSONペイロードしかサポートされない？（未確認）<br>* [Client ID (=deviceId) 任意](https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-mqtt-support#using-the-mqtt-protocol-directly)<br>* Username 必要<br>* X.509 認証可

## IBM Cloud → Function に加えて Node-RED も選択肢に
高速なプロトタイピングに、 Node-RED を短時間で立ち上げできるのは助かります！

| 項目 | サービス | 備考 |
|:-:|:-:|:--
| MQTT Broker | Watson IoT Platform | * [Client ID に制約あり](https://console.bluemix.net/docs/services/IoT/reference/security/connect_devices_apps_gw.html#mqtt-id)
| Function as a Service | IBM Cloud Functions (OpenWhisk) | * [トリガーは最短1秒(?)間隔](https://github.com/apache/incubator-openwhisk-package-alarms#firing-a-trigger-on-a-time-based-schedule-using-cron)
| Prototyping | IBM Cloud Node-RED Starter |
| Database | Compose for ScyllaDB<br>or<br>IBM Cloudant |   |
| Storage | IBM Cloud Object Storage |   |
| API | IBM Cloud Functions API Gateway | |

# 結論

- 対向システムの仕様が未確定のため汎用的な MQTT broker を選ぶ
    - → AWS または IBM Cloud
- 高速プロトタイピングも必要なため Node-RED も利用する
    - → IBM Cloud
- MQTT publisher が X.509 認証、クライアントIDは任意、 username 不使用
    - → AWS IoT Core
- リリースに向けて仕様が定まってきたら、費用なども考慮して再度選定を行いたい
    - → 除外した GCP, Azure も候補となる

MQTT の仕様に未確定な部分があることと、高速なプロトタイピングも行いたいことから、今回は IBM Cloud を選ぶ結果となりました。
まずは IBM Cloud で色々試してみたいと思います。
React Redux 基本構築

**自分が忘れないように記録しておきます。**
(yarnメインに使っているため基本的にyarnで進んでいきます。)

#React

1. グローバルインストール
`npm install -g create-react-app`

2. create-react-app使用
`create-react-app ファイル名`

3. 実行
`cd ファイル名` 
`npm run start` or `yarn start`

#Redux

1.　Reduxインストール
`yarn add redux react-redux`
(この時package.json に redux と　react-reduxが追加される)

```json:package.josn
    "react-dom": "^16.4.2", << 追加される
    "react-redux": "^5.0.7", << 追加される
```


2.　Reduxを項目中に入れる
ファイル追加

```javascript:/src/reducers/index.js
import { combineReducers } from 'redux'

import 関連項目名 from './関連項目名'

export default combineReducers({
    関連項目名
})  ;
```

```javascript:/src/reducers/項目名.js
const 項目名 = (state = [] , action) => {
    switch (action.type) {
            
        default:
            return state;
    }
};

export default 項目名 ;
```



管理・開発時ツールを入れる
`yarn add redux-logger redux-devtools-extension`


```javascript:/src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './Components/App';
import { Provider } from 'react-redux';
import registerServiceWorker from './registerServiceWorker';

import { createStore , applyMiddleware } from 'redux'; 
import roodReducer from './reducers'; 
import { composeWithDevTools } from 'redux-devtools-extension';
import logger from 'redux-logger';

const store = createStore(
    roodReducer,
    composeWithDevTools(
        applyMiddleware(logger)
    )
);

ReactDOM.render(
<Provider store={ store } >
    <App />
</Provider>
, document.getElementById('root'));
registerServiceWorker();

```
量子コンピュータ IBM Q のシュミレーションと実行の確率分布


量子コンピューターでは、x,yに加え、
zとして位相が追加されます。

シュミレーションの結果では、
q(0) が Hであるため、一番下の桁の0 1 が両立し、
P(00111)=0.550　
P(00110)=0.450
の確率で出力となりました。

<img width="732" alt="q00.png" src="https://qiita-image-store.s3.amazonaws.com/0/94200/013377ce-5f0d-c6c2-249c-440e7a5cb83a.png">

これを実際に実行すると、
以下のように確率分布が大きく変わり、出力となりました。
P(00000)>0、P(11111)>0、で出現していることから多くの状態をとり得ることが分かります。

<img width="746" alt="q022.png" src="https://qiita-image-store.s3.amazonaws.com/0/94200/6f569390-41b9-6a0a-19d0-c6a22a53db68.png">

5個の量子ビットの計算状態は以下となります。

<img width="105" alt="q03.png" src="https://qiita-image-store.s3.amazonaws.com/0/94200/9cdd4133-5a7c-f3d1-da4d-da114e2abed7.png">

<img width="167" alt="q04.png" src="https://qiita-image-store.s3.amazonaws.com/0/94200/64011ddf-d903-8821-a54a-a6d359c665fe.png">
いろんな言語の特徴を調べてみた

AdventCalendar第14回はじまります。今回はどんな言語にどのような特徴があるのかについて調べたので書きます。そもそもなぜ今更こんなことを調べたのかというと、大学がJavaって言ったからJavaやってるけど自分のやりたいことにJavaはあってるの？という疑問ができたためです。ということで今回はJava,C,Python,JavaScript,Ruby,PHPについて書いていきます。
#Java
Javaの特徴としてコンパイルして置き換えられた中間言語（ソースプログラムを機械語に直したもの）を各マシンにインストールされているJava仮想マシンと呼ばれる実行環境で動作させることができる。そのため、アンドロイドアプリではJavaで作られたものが多い。
#C
C言語は機械語に近い言語であるため処理性能が良い。そのため、システムソフトウェアやアプリケーションソフトウェアを中心として、幅広い用途で用いられている。オペレーティングシステム（OS）に関しては、UNIX系OSやWindows系OSといった主要なOSの多くがC言語によって記述されている。また、デスクトップアプリケーションや組み込みシステムにおいても、C言語が広く採用されている。
#Python
Pythonはファイルサイズが小さいこと、文法が平易で習得が容易なことなどが特徴である。人工知能の分野でよく使われる。また、Youtube,Instagramなどに使われている言語としても有名である。
#JavaScript
JavaScriptはHTMLの中に記述することでWebブラウザによって実行され、Webページに動きや対話性を付加することができる。多くのWebページで使用されている。
#Ruby
Rubyはシンプルな文法や、可読性の高い構文、優れたテキスト処理などを特徴としている。RubyのフレームワークであるRuby on RailsによりWebアプリケーションを作成するときによく使われるようになった。
#PHP
PHPとはサーバーサイドで動作し、HTMLの文書内に統合される形で記述されることを特徴とするプログラミング言語のことである。動的なWebページを生成するために用いられる。Webページ開発によく使われる。
#最後に
今回は[IT用語辞典](http://www.sophia-it.com/)を参考にしました。様々な言語の特徴をうまく使っていきたいです。