OmniAICreator/Qiita-1.07M huggingface dataset:
RubyのOptionParser#onはかなり多機能！

RubyでCLIツールを作ろうと思った時に便利な`optparse`ライブラリですが、意外とまだ知らないことがありました。

## `OptionParser#on`の引数
### 基本編
```ruby
require 'optparse'

opt = OptionParser.new
opt.on('-n', '--name=NAME', 'Your name') do |name|
  puts "Your name is #{name}"
end
```

引数にはショートオプション、ロングオプション、helpメッセージ用の説明文を渡せます。

### 応用編1
```ruby
opt.on('--repeat=N', Integer, 'Repeat hello world N times') do |n|
  n.times { puts "Hello, world!" }
end
```

`Integer`のようなクラスを渡すと、オプションの引数が適切に変換されて渡ってきます。
上の例で言うと、`n.to_i.times`とする必要がありません。
また`Integer`を指定したオプションに数字以外を渡すと、ちゃんとエラーを投げてくれます。

他に利用可能なクラスは[リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/method/OptionParser/i/on.html)を参照してください。
さらに、[`OptionParser.accept`](https://docs.ruby-lang.org/ja/latest/method/OptionParser/s/accept.html)を使うと自作クラスを引数に渡すこともできます。

### 応用編2
```ruby
opt.on('--greeting=GREETING',
       /\A(Hello|Good(Morning|Night))\z/, 'Select greeting') do |greeting|
  puts "#{greeting}, world!"
end
```

引数に正規表現を渡すと、それにマッチするオプション引数のみを受け入れます。
上の例で`--greeting=Hi`などとするとエラーとなります。

### 応用編3
```ruby
opt.on('--greeting=GREETING',
       ["Hello", "GoodMorning", "GoodNight"], 'Select greeting') do |greeting|
  puts "#{greeting}, world!"
end
```

配列を渡すと、その配列に含まれるもののみをオプションの引数に指定できます。
このコードは正規表現の例と全く同じことを実現しています。
この例だと正規表現はオーバーキルですね。

### 応用編4
引数にHashを渡すこともできます。
Hashのキーに含まれるもののみをオプションの引数にできるのは配列と同じですが、ブロック引数にHashのvalueを渡してくれます。

以下はシンプルな応用例です。
標準入力からCSV、JSON、YAMLのいずれかを受け取ってRubyのオブジェクトに変換します。

```ruby
require 'optparse'
require 'csv'
require 'json'
require 'yaml'

AVAILABLE_FORMATS = {
  "csv" => CSV.method(:parse),
  "json" => JSON.method(:load),
  "yaml" => YAML.method(:load)
}

opt = OptionParser.new
opt.on('--format f', AVAILABLE_FORMATS, 'Input format') do |method|
  p method.call($stdin.read)
end
```

参考：https://docs.ruby-lang.org/en/2.6.0/OptionParser.html
ロジックIC日記 一覧

#はじめに
この日記は、ロジックICについて学習していく日記です。

#日記一覧
 - [ブレッドボードに5.0V供給する その1 [ロジックIC日記]](https://qiita.com/C_Assembly/items/036d4ed834c96318c530)
 - [ブレッドボードに5.0V供給する その2 [ロジックIC日記]](https://qiita.com/C_Assembly/items/56e28a23ccfe2941095a)
 - [プルダウン抵抗](https://qiita.com/C_Assembly/items/dddb45d415c15f019da8)
ファイルの存在判定（+ readlink）

こんにちは。
regular ファイルの存在を判定したい場合、```test``` コマンドで、```[ -f $file ]``` と判定するとリンクファイルの場合には非存在と判定されます。その場合にも対応するために ```readlink``` の助けを借りました（オリジナルファイルを追跡して判定）。

```test_f.sh
#!/bin/sh
[ "$(uname)" = "Darwin" ] && READLINK="greadlink" || READLINK="readlink"
test -f $($READLINK -e $1)
```

なお上記のように GNU readlink を使うのではなく、どうしても BSD readlink で実現したい場合には、「[Macで readlink -f を作る（シェルスクリプト）](https://qiita.com/kkdd/items/6738630ded653dc2c23e)」などの方法があります。
ChefでINIファイルを扱うレシピの例


ChefでINIファイルを扱う例を示す



#INIファイルを扱うレシピの例


```ruby:recipes/default.rb
gem_package 'inifile' do
  action :nothing
end.run_action(:install)

require 'inifile'

file '/etc/conf.ini' do
  content lazy {
            inifile = if File.file?(path)
                        IniFile.load(path)
                      else
                        IniFile.new
                      end

            # iniファイルを自由に編集
            inifile['foo']['bar'] = 'baz'   # [foo]にbar=bazを追加

            # 他の編集例
            # inifile.delete_section('foo') # [foo]セクションを削除
            # inifile['foo'] = inifile['foo'].delete_if { |key,val| key == 'bar' }  # [foo]からbar=を削除
            # inifile['foo'] = { 'bar2' => 'baz2' } # [foo]下をbar2=baz2に置き換え
 
            inifile.to_s                    # テキストに戻す
          }
end
```

- iniファイルがなければ以下の内容で作成する。

```
[foo]
bar = baz
```

- iniファイルがある場合、[foo] セクションにおける bar の値を baz に設定する。
- Chef ClientのRubyへのinifile gem導入は、require 'inifile'をエラーなく通す為、Ruby実行フェーズで行なっている。

- 「iniファイルを自由に編集」の箇所は、多重loopを使うなどご自由に。
- 編集に使用可能なメソッドは以下のClass: IniFileを参照
- if文は3項演算子に置き換え可。

#参考



- [Class: IniFile](https://www.rubydoc.info/gems/inifile/IniFile)
- [inifile rubygems.org](https://rubygems.org/gems/inifile)
- [PythonやRubyでのINIファイルの参照](https://qiita.com/satio_koibuti/items/767ec763f4711c66c89e)


# Ansibleの場合
ini_fileモジュールがあるが、こういった階層的なデータをloopで扱うとAnsibleでは醜くなりそう。

[ini_file – Tweak settings in INI files](https://docs.ansible.com/ansible/latest/modules/ini_file_module.html)
Realm+Codableを使って軽くDBを操作してみる



##Realmとは
呼び方は「レルム」と呼びます。
Realmはオープンソースで開発されているモバイルアプリ向けのデータベースです。
データなどを保存するときに使います。
直感的に利用することができ、動作も速いことが特徴です。


[Realm公式サイト](https://realm.io/docs/swift/latest)


##使い方

###モデルの作成

```Model.swift
import Foundation
import RealmSwift

class Human: Object {
    dynamic var id : Int = 0;
    dynamic var name = "";
    dynamic var age: Int = 0;
}
```

###処理の使い方

```Viewconroller.swift
import UIKit
import RealmSwift
class ViewController: UIViewController {
  let realmData = Human() // Humanというモデルをインスタンス化
  override func viewDidLoad() {
    super.viewDidLoad()
    realmData.id = 1;
    realmData.age = 18;
    realmData.name = "test太郎";
    self.save();
  }

  // データを保存するための処理
  func save() {
      let realm = try Realm()  // Realmのインスタンスを
      try realm.write {
        realm.add(self.realmData)  // realmDataを書き込みます
      }
  }

  // データを更新するための処理
  func update() {
      let realm = try! Realm()
      let data = realm.objects(Human).last!
      try realm.write {
        data.name = "test　花子" // test　花子に更新します。
      }
  }

  // データを削除するための処理
  func delete() {
      let realm = try! Realm()
      let data = realm.objects(Human).last!
      try realm.write {
        realm.delete(data)  //Humanモデルの中のデータを削除します。
      }
  }
}
```

##次回
ざっくりと使い方を書いてみたので、今度はtodoアプリなどを作ってみます。
iPad Pro (3rd generation)で全画面対応ができない場合の対処

みなさんはiPhone XS Max、第3世代iPad Proの全画面対応終わりましたか？
2019年3月以降は対応必須になっています。

[App StoreにiOS Appを提出する](https://developer.apple.com/jp/ios/submit/)

> iOS 12.1 SDKを含むXcode 10.1にアップデートして、Appをビルドしましょう。2019年3月以降、 App Storeに提出されるすべてのiOS Appは、iOS 12.1以降のSDKでビルドされ、iPhone XS Maxまたは12.9インチiPad Pro（第3世代）のオールスクリーンのデザインをサポートする必要があります。

iPhone XS Maxの対応はiPhone Xで適切にSafe Areaに対応できていれば特に大きな問題となる箇所はないかと思います。
別チームで作成しているiPad対応アプリで第3世代iPad Proのみ全画面にならないと相談を受け
対応できたので覚書として残しておきます。

## 状況
- iPhone XS Maxは全画面になっている
- 第3世代iPad Proは上下に黒い帯が付いている（全画面対応できていない）
- Xcode 10.1でビルドしている
- StoryboardではSafe Area有効化されている
- Deployment TargetはiOS 9以降になっている

## 解決策
1. Project設定を開く
2. TARGETSで作成しているアプリを選択する
3. Generalタブを開く
4. `App Icons and Launch Images`の `Launch Screen File`にStoryboardもしくはxibを設定する  
<img width="518" alt="スクリーンショット 2019-03-11 20.19.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/187223/86f87f29-8571-c97a-b8cb-721bc359ee5e.png">

上記手順で第3世代iPad Proでも全画面表示になりました。
現象が起きていたプロジェクトでは `Launch Images Source`でスプラッシュを設定していたので
`Launch Screen File`も設定が必要で、
iPhone XS MaxではSafe Area対応できていたこともあり、余計に気づきにくいですね。
Xcode10でビルドするとクラッシュする

プログラミング初心者が記事を書いておりますので、話半分でお願いいたします。
また、誤り等あればご指摘いただければ幸いです。

#久々にiOSアプリのバージョンを試みると signal SIGABRT でクラッシュする

プログラミングの勉強がてら作成した、AlexaスキルとiOSアプリ（https://itunes.apple.com/us/app/simple-zen-timer/id1275995234 ）を同期させようと、iOSアプリをバージョンを試みたところ、一度目のbuildは通るが、一度シュミレーターを終了させ再度シュミレーターを起動すると、


```
Thread 1: signal SIGABRT
```
で、クラッシュする。まともなクラッシュログは出ない状態。

このアプリを作成した際は、

* xcode9
* swift3.0 途中から　swift4.0
* 
cocoapodsにて下記を使用

```
  pod 'RealmSwift'
  pod 'FontAwesome.swift'
  pod 'Charts'
  pod 'Firebase/Core'
  pod 'Firebase/AdMob'
  pod 'Crashlytics', '~> 3.9.3'
  pod 'Eureka'
  pod 'ViewRow'
```
また、瞑想中の心拍数を取得するために　HealthKit も使用。

という状態で作成しておりました。


# 解決法

Xcode10からビルドシステムが変更されているようなので、Xcode9のビルドシステムに戻すことで、2回目以降のシュミレーターの起動問題なくなりました。

# 変更方法
File　> Workspace Setting
![スクリーンショット 2019-03-11 20.16.05.png](https://qiita-image-store.s3.amazonaws.com/0/47244/16fe1f90-f931-ece8-2afe-e30238cdb9ff.png)

New Build System から　Legacy　Build System　へ変更する
![スクリーンショット 2019-03-11 20.15.43.png](https://qiita-image-store.s3.amazonaws.com/0/47244/321b1e60-5511-c49e-4426-4fa95eb09e79.png)


対処療法として、上記で開発が続けられるようにはなったのですが、根本的な原因（原理？）は全く理解できていないので、今後分かり次第また追加で更新しようと思います。
絶対値、配列の何番目、文字（数字）を１つだけ削除、同じ文字連続



###絶対値を取得する。

```ruby:−８の絶対値を取得する時
-8.abs => 8
```

###配列内(m)の特定の文字(3)が何番目にあるか？
```ruby:3は何番目にあるか？
m = [1,2,3,4,5]
m.find_index(3) => 2
```

０から数えているので１足して、３番目になる。
###配列内(m)の特定の文字(3）を一つだけ削除する。
```ruby:3を１つ削除する
m = [1,2,3,3,3]
m.delete_at(m.find_index(3)) => 3
m = [1,2,3,3]
m.delete_at(m.find_index(3)) => 3
m = [1,2,3]
```
m.find_index(3)で３番目に３があることを出して、３番目を削除する。


###連続（４回）して同じ文字（nil）を入れる


```ruby:nilを４つ入れたい時

m = Array.new(4){nil} => [nil, nil, nil, nil]
```



```ruby:座標を使いたい時など
m = []
6.times{|i| m << Array.new(2){i} } => 6
m => [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5]]
```
AVX-512でやむなくmin/max演算の代替実装を作る

非常にニッチな実装の話題ですが先日必要になったのでメモ書き程度に。

ベクトルの各要素に対して8bit要素のmin/maxを計算したい場合、専用のmin/max命令（ `vpminub` / `vpmaxub` など）を使うのが普通だと思います。

```cpp
void f(__m512i x, __m512i y, __m512i &result) {
    result = _mm512_min_epu8(x, y);
}
```

ほとんどの場合はこれで十分なはずです。

## 素直な解法で発生した問題点
上記の専用命令は非常に高速ですが、強いて言うなら命令レベルの並列性がないという問題があります。[Agner fog](https://www.agner.org/optimize/)のInstruction tablesによると、vpmin/max系の命令はレイテンシ1、スループット1、実行portは0のみのようだと伺えます。

つまり、min/maxを大量に行う場合は、ここが性能上のボトルネックになりかねません。

## port0の圧迫を改善する
しょうがないのでvpminub/vpmaxubを別の命令で代替できないかを考えます。
もちろん、代替実装にport0を使うのは本末転倒です。また、代替実装自体が重すぎるのも問題があるため、できるだけ高速な実装にする必要があります。

今回は次のような実装をひねり出しました。

```nasm
vpcmpub k1, zmm0, zmm1, 1          ; a, b を比較
vpsubb  zmm30 {k1} {z}, zmm0, zmm1 ; a - b （比較結果がfalseなら0）
vpaddb  zmm0, zmm30, zmm1          ; (a - b) + b = a （比較結果がfalseなら0 + b = b）
```

ゼロ化マスクを使うことで比較結果に応じて演算結果を0にしてから「足し戻す」ことで、比較結果に応じた最終的な値の分岐を実現しました。ここの実装は悩ましいものがあり、

- blendが直接的だがport0, 5しか使えなくなる上に遅いらしい（レイテンシ3もある）
    - マスクレジスタによる分岐も暗黙のblendが入るらしいので同様に回避したい
- 同様のアルゴリズムならxorが自然かなと思いきやepi8のものが存在しない
    - 要素が32bitの場合は可能かもしれません

などなど、限られた命令でやりくりする必要があり、かなり違和感のある実装です……。この命令列は全体としてはレイテンシ5になるため専用命令よりずっと遅いですが、（比較以外は）実行ポートとして1, 5も使えます。

min/maxのうちこれで一部を置き換えてやることで、現行CPU（Skylake-SP）においては若干のスループット向上が見られました。
プログラミング便利ツールとサイト

プログラミング初心者です。
C#を勉強中です。
このたび教わったプログラミング便利ツールについて共有いたします。

#ツール

・Clibor(クリップボード履歴管理)
　https://www.amunsnet.com/

・VisualStudio Code
 　https://code.visualstudio.com/download

・バージョン管理ツール　Tortoise Git
　https://backlog.com/ja/git-tutorial/intro/intro2_1.html

・サクラエディタ
　https://sakura-editor.github.io/download.html


#サイト

変数などのネーミングを決めるときに便利。
・codic
　　https://codic.jp/

シーケンス図、フローチャートをVSCodeで記載する方法。
・テキストで書くUML
http://plantuml.com/ja/
TypeScript でも Nominal Typing がしたい

RawPassword と HashedPassword
=====

例えば Web アプリを作っているなかで、一言「パスワード」と言っても生のパスワードもあればハッシュ化されたものもある。
名前とかに気をつけて実装していれば、そこを取り違える危険はほとんど無いとはいえど、安易に `password` とか命名しちゃって「あれ？どっちだっけ？」って迷う事は良くあると思う。

そういった間違いをなくすために type alias 機能を使って `RawPassword` と `HashedPassword` を作ってみようと思う。

```ts
type RawPassword = string;
type HashedPassword = string;
type Password = RawPassword | HashedPassword;
```

`RawPassword` も `HashedPassword` もどちらも string 型で、`Password` は `RawPassword` と `HashedPassword` のどちらにもなれる。

これで生かハッシュ化されているかで迷うことはない！

けれども全ては string
-----

結果、次のコンパイルが成功する。

```ts
const passwordX: RawPassword = '1qaz2wsx';
const passwordZ: HashedPassword = passwordX;
```

.....これはまずい。すこぶるまずい。
型が付いて混乱しなくなると思ったら、型が付いてなおさら混乱した。
関数とかで紛れ込まれたらパスワードを平文で保存するサービスができかねない。。。

Structural Typing な TypeScript
-----

なぜこんな事が起きるかというと、TypeScript は Structural Typing という型システムを採用しているから。
他には Go とかも同じ型システムを採用している。

これは「構造を元に型が決まる」というもので、たとえ違う型として定義されていても、**構造が同じであれば同じ型として認める**という面白い仕組み。逆に「型を元に構造が決まる」方式を Nominal Typing と言うらしい。こちらの場合は構造が同じでも型が違えば同じ型としては_認めない_。

今回の場合、どちらも構造としては同じ string がベースになっているので、同じ型として扱われていた。

TypeScript で Nominal Typing
=====

皆同じ事を考えるみたいで、TypeScript で Nominal Typing を実現するテクニックはあるらしい。

TypeScript Deep Dive の [Nominal Typing] という記事を参考に、自分で型を定義してみた。
それがこちら

```ts
type NominalTyping<T extends string> = { type: T };

export type RawPassword = NominalTyping<'RawPassword'> & string;
export type HashedPassword = NominalTyping<'HashedPassword'> & string;
export type Password = RawPassword | HashedPassword;
```

元の記事では `& string` という交差型を使うテクニックは利用していなかったために、文字列への/からの変換で一手間かかっていたけど、交差型を使うことで簡単にキャストできるようになった。

```ts
const raw: RawPassword = 'rawpassword' as RawPassword;
const hashed: HashedPassword = 'hashedpassword' as HashedPassword;

const rawToString: string = raw;
const hashedToString: string = hashed;

const tryHashed: RawPassword = hashed; // Compile Error
const tryRaw: HashedPassword = raw; // Compile Error
```



そして記事を書いている途中でまたしても更に優れた記事にぶち当たってしまった。。。
[Nominal typing techniques in TypeScript] の4番目の内容が一番スッキリしてる。

Nominal Typing って言葉、前にも見かけた気がするけど今回始めてちゃんと覚えた。

[Nominal Typing]: https://basarat.gitbooks.io/typescript/docs/tips/nominalTyping.html
[Nominal typing techniques in TypeScript]:https://michalzalecki.com/nominal-typing-in-typescript/
DjangoでOSError: [Errno 22] Invalid argumentが発生したときの対処内容

# 事象
Djangoをローカルの開発環境（Windows7）で開発中、特にソースコードを変更していないのに、トップページで検索ボタンを押下したときに以下のエラーが発生しました。

> OSError: [Errno 22] Invalid argument

# 解決方法
ネットで探っていたところ、どうやらボタンを押下した後の遷移先の**ファイルが読み込めていない（読み取り専用状態になっている）**とこのエラーが出るみたいです。

たしかに，この直前に比較ツールでこの遷移先のHTMLファイルを開いていました。
何かの理由でファイルが開かれた状態になっているのかと思い、アプリケーションをすべて閉じて開発端末を再起動したら解決しました。
publicなFTPサーバーのリスト

PCが先週吹っ飛んでしまいまして、数年ぶりにノートパソコンを買ってセットアップしたのですが、そのときにずっと放置していたブックマークを久しぶりに見てみた。色々昔の悩みが思い出されてたのしかったのですが、その中にここに書くべき話題としてANONYMOUS ftpのリストというか、publicなftpのリストがあった。今は、aptとかyumとかpipとかいろいろソフトの入手手段はあるから使うことはないけど、昔ちょっとインターネットがアンダーグラウンドだったころ夜中にダイヤルアップして何時間もかけてダウンロードしていたのを思いだした。ちょっとなつかしい。
そこで私のPCにあったftp serverのリストです。
今もFTPを公開してる企業、団体って結構あった。apple,MSとかなくなっているのも多かったけど。
2019/3/11時点でアクセスできるpublic ftp server のLIST
ftp://archive.ubuntu.com/ 
ftp://ftp.adobe.com/ 
ftp://ftp.aist-nara.ac.jp/
ftp://ftp.dnsbalance.ring.gr.jp/ 
ftp://ftp.fujixerox.co.jp/
ftp://ftp.gnu.org/ 
ftp://ftp.hp.com/ 
ftp://ftp.ibiblio.org/ 
ftp://ftp.ics.es.osaka-u.ac.jp/ 
ftp://ftp.iij.ad.jp/
ftp://ftp.jaist.ac.jp/
ftp://ftp.kddilabs.jp/ 
ftp://ftp.math.s.chiba-u.ac.jp/ 
ftp://ftp.nara.wide.ad.jp/ 
ftp://ftp.ne.jp/
ftp://ftp.nic.ad.jp/
ftp://ftp.novell.co.jp/ 
ftp://ftp.nuie.nagoya-u.ac.jp/
ftp://ftp.riken.go.jp/
ftp://ftp.riken.jp/ 
ftp://ftp.ring.gr.jp/
ftp://ftp.software.ibm.com/ 
ftp://ftp.sra.co.jp/
ftp://ftp.u-aizu.ac.jp
ftp://ftp.yz.yamagata-u.ac.jp/ 
ftp://mirror.fairway.ne.jp/ 
ftp://ring.ix.oita-u.ac.jp/
ftp://ring.ksc.gr.jp/
ftp://ring.shibaura-it.ac.jp/
ftp://ring.u-toyama.ac.jp/
ftp://sh.wide.ad.jp/ 
どこの団体のサーバかは名前から類推してください。
IBMとかadobeとか結構大手もまだやってた。
昔そのディレクトリをさがすのを楽しんでいた。思えば暇な時代だった。
プログラミング学習記録23〜久しぶりにProgate〜

##今日やったこと
- Progate Ruby on rails 1

最近ずっとパソコンの画面に向かいすぎて、目が疲れてしまったので、今日はこれだけです。

昨日までUdemyでrailsの講義を受けていたのですが、実はまだProgateのrailsはほとんど手をつけていません。

いきなりUdemyでも大丈夫だと思ってやっていたら、ほとんど理解できないままコースを修了してしまったので、Progateで基礎固めしたいと思います。

ほとんど理解できていなかったとはいえ、一度アプリを完成させるまでの流れを経験したのは無駄ではないです。

実際、今日Progateのrailsをやったみた感じ、以前にやった時よりも深い理解ができています。

要は「どのフォルダのどのファイルを変えたら、どこが変わるのか？」を頭に入れることが大事なんだと思います。

ということで、一回Progateで基礎を固めてからもう一度Udemyのrailsの講座に挑みます。

明日からも引き続きプログラミング学習頑張ります。

おわり
Unity + Visual Studio CommunityでC#をデバッグ実行する

記事で間違いなどありましたら、コメントや編集リクエストで教えていただけると幸いです。

# 動作確認環境

- Windows 10
- Unity 2018.3.1f1
- Visual Studio Community 2017

# 1. ブレイクポイントを設定する
※ 「2. Unity デバッガーのアタッチ」と順番が前後しても問題ありません。

Unityから、任意のC#スクリプトを選択し、Visual Studio Community(以下、VSと表記)を起動します。

VSにブレイクポイントを設定するため、行数表示の左部をクリックまたはF9ボタンを押下します。
そうすると、下の画像のように、赤い点？丸？が表示されます。

![vs02.png](https://qiita-image-store.s3.amazonaws.com/0/233011/84c09ed2-d0e7-d696-413a-b945cfa5cf4d.png)

# 2. Unity デバッガーのアタッチ
※ 「1. ブレイクポイントを設定する」と順番が前後しても問題ありません。

![vs03.png](https://qiita-image-store.s3.amazonaws.com/0/233011/ae681231-d036-9a06-64e9-add2aa12760e.png)

「デバッグ」→「Unity デバッガーのアタッチ」をクリックします。
そうすると、下の画像のようなポップアップが表示されます。

デバッグしたい任意のプロジェクトを選択し、OKボタンを押下します。

画像では、1つのプロジェクトしか起動していなかったため、1つのプロジェクトしか表示されていません。
もし、複数のUnityプロジェクトを同時起動していれば、複数のプロジェクトから選択することになります。

![vs04.png](https://qiita-image-store.s3.amazonaws.com/0/233011/2ad8f562-ce37-217b-7a7a-9617a4cde389.png)

OKボタンを押すと、下の画像のようになります。

![vs05.png](https://qiita-image-store.s3.amazonaws.com/0/233011/89e236f9-6e97-5a2c-3ec0-877376c3d2d0.png)

# 3. Unity側でPlayボタンを押下する

Unity側でPlayボタン（再生ボタン？）を押下して、ブレークポイントで実行が止まればOKでず。

![vs06.png](https://qiita-image-store.s3.amazonaws.com/0/233011/3bf6f962-143a-ac77-387d-b1df23859507.png)

# 終わりに（雑記）

この記事書きながら、VSではなくVisual Studio Code（以下、VSCodeと表記）を使ってもよいのでは？と思い始めました。
調べた限り、VSCodeでもデバッグできるようです。

VSとVSCodeの機能の違いを調査して、移行しても問題なさそうだったら、使い慣れているVSCodeに移行しようと思います。
[ParaView]ライン上のデータの取得

# ライン上の値を取得する
ParaViewの結果から任意の線分上のデータをcsvで出力したい時は以下で実行できる

## 環境
ParaView 5.6.0
windows10

0.データを読み込み表示させる

１．Filterから「Plot Over line」を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/25f54392-5105-4e0f-bb9e-fc389d4edb30.png)

２．Pipeline BrowserからPlotOverLine1を選択する

３．Show Lineをチェックする

４．Point1, Point2にラインの先端と終点の座標を入れるか、グラフィック上からドラッグする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/bc667404-d632-3e45-5603-61a520afe5dc.png)

５．Series Parameters内から取得したい変数名をチェックする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/88b0f540-11e6-3f8c-e304-51a8ee8abf87.png)

６．Applyをクリックすると新しくウィンドウが表示され、ライン上の数値がプロットされている

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/bcf303f5-2f31-121d-fcef-0a975d4dbffb.png)

７．プロットウィンドウの右上にあるSplit Horizontalを選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/f3d711be-3f3c-fab3-5ae4-96e3d54bfe10.png)

８．SpreadSheet Viewを選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/9a0d28f0-b6d6-3d31-412a-f8e3c85894d7.png)

９．右上のExport SpreadSheetを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/727eb47c-a214-0b17-e2f0-34c428a2eccb.png)

１０．出力先を指定し、拡張子を記述しOKをクリックする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/79c19784-4937-9604-1f4a-6bf67d99157d.png)
機械学習 〜 テキスト特徴量（CountVectorizer, TfidfVectorizer） 〜

今回は、scikit-learn を使ったテキスト特徴量のベクトル化の手法を簡単に記載します。

## テキストデータのベクトル化

テキストデータはそのまま特徴量としては使えないため、
テキストに出現する単語情報を数値に変換するプロセスを行います。

## CountVectorizer

出現する単語のカウントを特徴量にする手法になります。
出現した単語を純粋にカウントします。

### 実装コード
sample の文字列をベクトル化します。

```python
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer

# ベクトル化する文字列
sample = np.array(['Apple computer of the apple mark', 'linux computer', 'windows computer'])

# CountVectorizer
vec_count = CountVectorizer()

# ベクトル化
vec_count.fit(sample)
X = vec_count.transform(sample)

print('Vocabulary size: {}'.format(len(vec_count.vocabulary_)))
print('Vocabulary content: {}'.format(vec_count.vocabulary_))
```
```
Vocabulary size: 7
Vocabulary content: {'apple': 0, 'computer': 1, 'of': 4, 'the': 5, 'mark': 3, 'linux': 2, 'windows': 6}
```

ベクトル化した内容を見てみます。

```python
pd.DataFrame(X.toarray(), columns=vec_count.get_feature_names())
```

出現した単語数が単純にカウントしたベクトル化が行われました。

![2019_03_text_vector_s1.png](https://qiita-image-store.s3.amazonaws.com/0/134550/d596e39c-e9fe-4879-8987-753ebf5bc4f3.png)

ただ、この手法は出現数の多い単語のベクトルが異常に強くなってしまう欠点があります。
このような欠点を補う手法として以下のような手法があります。

## TfidfVectorizer

TF-IDF(索引語頻度逆文書頻度)という手法になります。
これは、TF（単語の出現頻度）とIDF（単語のレア度）とを掛け合わせたものになります。

```math
TF: 文書における指定単語の出現頻度:  \frac{文書内の指定単語の出現回数}{文書内の全単語の出現回数}\\
IDF: 逆文書頻度(指定単語のレア度): log\frac{総文書数}{指定単語を含む文書数}
```

TFとIDFを掛け合わせます

```math
TFIDF(索引語頻度逆文書頻度) = TF * IDF
```


>・tf-idf(Wikipedia)
https://ja.wikipedia.org/wiki/Tf-idf

# 実装コード

### インポート

各種ライブラリをインポートします。

```python
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

# ベクトル化する文字列
sample = np.array(['Apple computer of the apple mark', 'linux computer', 'windows computer'])

# TfidfVectorizer
vec_tfidf = TfidfVectorizer()

# ベクトル化
X = vec_tfidf.fit_transform(sample)

print('Vocabulary size: {}'.format(len(vec_tfidf.vocabulary_)))
print('Vocabulary content: {}'.format(vec_tfidf.vocabulary_))
```

```
Vocabulary size: 7
Vocabulary content: {'apple': 0, 'computer': 1, 'of': 4, 'the': 5, 'mark': 3, 'linux': 2, 'windows': 6}
```

ベクトル化した内容を見てみます。

```python
pd.DataFrame(X.toarray(), columns=vec_tfidf.get_feature_names())
```

![2019_03_text_vector_s2.png](https://qiita-image-store.s3.amazonaws.com/0/134550/68bc8fd9-25c3-b6f3-f512-d9bd43fe0544.png)

テキスト[0]では 'computer' が弱いベクトルとなり ```0.217``` という数値になっています。
テキスト[3]では 'windows' が強いベクトルとなり ```0.861``` という数値になっています。

以上、今回は scikit-learn を使ったテキスト特徴量のベクトル化の手法を簡単に実行してみました。!
[OpenFOAM]綺麗な円柱メッシュの作り方

# 綺麗な円柱メッシュの作成
円柱を立方体メッシュで切るには領域を分割するなど気を配らないといけない。
ただ、公開されているマクロを使えば簡単に切る事が出来る。

確認バージョン
OpenFOAM v1812

１．以下のURLからblockMeshDict.m4をダウンロードする
https://www.ehsanmadadi.com/cylinder-mesh/

２．blockMeshDict.m4をcaseディレクトリ内のsystem内に置く

３．m4がなければインストールする
`sudo apt install m4`

４．blockMeshDict.m4の設定を変更する

以下のように円柱メッシュは円形断面において曲率を持った四角形で分割されている。
そのため四角形についても形状を定義する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/6cadb557-05ef-eb71-855c-15d079e2ac26.png)

４．１　幾何学的形状

```blockMeshDict.m4

// Inner square side half　内部の四角形の1辺の長さ
define(s, 0.35)

// Inner square side curvature　内部の四角形の膨らみ具合を表す。「内部の四角形の1辺の長さ」より若干大きいぐらいが良い。
define(sc, 0.4)

// cylinder radius　半径
define(r, 0.7)

// Height of cylinder　軸方向の長さ
define(z, 20.0)
```

４．２　メッシュサイズ

```blockMeshDict.m4

// Number of cells at inner square 内部の四角形の一片の分割数
define(Ns, 20)

// Number of cells between inner square and circle　内部の四角形と円柱外面の間の分割数
define(Ni, 10)

// Number of cells in the cylinder height　円柱の軸方向の分割数
define(Nz, 100)
```

単位系をmmにするためconvertToMetersを使用する

```
convertToMeters 0.001
```

４．以下を実行
`m4 blockMeshDict.m4 > blockMeshDict`
`cd ../`
`blockMesh`

５．paraFoamかParaViewにてメッシュを確認する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/487b398f-c4ee-d26e-fd50-d2b18355dc28.png)

## mshメッシュの出力
caseファイル直下で以下を実行
`foamMeshToFluent`
caseファイル内にfluentInterfaceディレクトリが出来ているので、そのディレクトリの直下にmshファイルがあることを確認する
しかし、このmshファイルは以下のソフトでは読み込めなかった
GMesh
ElmerGUI, ElmerGrid
FreeCAD
Salome-Meca Win版
障害に対する考え方

## 概要

- 最近、障害が頻発した
- 障害について独自の理論やベストプラクティスを考えた

体系化された理論とかすでにありそう。

## ゴールの定義

ゴールを「障害に絡んだビジネスへのダメージを最小化」することにします。

障害にまつわる話題、
監視、冗長化、メトリクス、ログ、ヘルスチェック・・・

こういう話題がなぜ語られるかというと、最終的に障害に絡んだビジネスへのダメージを最小化したいから。

## ゴールと様々な要素の関係

障害に至るかていを考えた。

外乱が発生(アンコントローラブル)
-> 外乱によってシステムがダメージを受ける (冗長化などで影響の受け方をコントロール可能)
-> ダメージが観測される (アラートなど)
-> ダメージを調べる (ログ、メトリクスなど)
-> ダメージが軽減される (対応など)
-> ダメージがスレッショルドを超える
-> 障害発生

関係を書いてみた。

<img width="530" alt="screenshot 2019-03-11 17.23.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/115870/799c4f26-cf5b-62b7-bef3-570727ed51cc.png">

観測システムより上を監視システムとくくって大きく見ると
以下のようになる。

<img width="529" alt="screenshot 2019-03-11 17.25.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/115870/ce5205f2-8509-c945-7731-249b8fede2f9.png">

つまり、監視システムはフィードバックループを入れていることになる。

このモデルで例えば、
良いシステムは適当に仮定した外乱とかけられるコストのもとで、障害発生率を最小化するものである。
と定義できるかもしれない。

## どこに投資するべきか？

どのような外乱を想定するかによって、どこに投資するのが最適かが変わる。

### 想定される外乱

- ハードウェアの故障
- インフラのバグ
- アプリケーションのバグ
- リソース
- アクセス過多

### ミクロかマクロか

例えば、httpのヘルスチェックは、メモリ不足ではない、ハードウェアが故障していない、ネットワークの設定が間違えていないなど、複数のことを同時に確認できる。
反面、前兆を捉えることはできない。(メモリがじわじわ増えていっているなど)
チェック方法ごとにいろいろな性質が変わる。

- 前兆を補足できるか？
- 同時にチェック可能な範囲

### 自動か監視か

ハードウェアの故障は自動で対応可能だが、
プログラムのバグは自動では対応できない。
自動でやるのがコストがかかるなと思ったら、監視で対応すれば良いのでは？

## ぼくの考えた最強のベストプラクティス

### 0. ユーザーの反応

デフォルトでユーザーの反応という監視が入っていることを認識する。

### 1. なるべく範囲の広い監視を入れる

例えば、自動販売機なら、お金を入れてものを買って、おいしいジュースが飲めるか？を定期的に監視する。
これで、2以降の監視の不備を補足できる。

他にも、ポピュラーな監視(リソース監視、httpステータス監視など)は入れても良い(ポピュラーな監視は、ポピュラーな外乱分布を反映して作られているはずなので)。

### 2. 0または1で障害が補足された場合、再発防止をする

過去に発生したものは、将来も発生する可能性が高いとして、再発防止をする。
再発防止方法は3以下。

### 3. 前兆を補足できるような監視を入れる

修正した上で、
万が一修正に不備があっても、監視で補足できるようにする。
メモリ不足で障害が発生したなら、メモリ不足の原因を修正した上で、メモリ不足になりそうかどうかを監視する。

なぜ2重に入れたほうが良いと思うのかはロジカルに説明できないが、なんとなくそんな気がする。
2倍のコストで、修正に不備がある確率を^2にできる。

### 4. 前兆が無いものは、前兆が出るようにする

例えば、
ハードウェアの故障は前兆を捉えるのが難しいので、
冗長化によって、一部の故障が障害ではなく障害の前兆になるようにする。
プログラムのロジックとかならエラーになる前に警告を入れたり、エラーになってもぎりぎり大丈夫なようにする。

## 具体論

自分で調べたもののメモ。

### ELK

メトリクス計測、可視化、アラートができるセット。
elastic searchとかkibanaとかのセット。

流通しているdocker-composeがうまく動かなかったので試していない。

### Grafana + prometheus + cadvisor + node exporter

メトリクス計測、可視化、アラートができるセット。
良かった。
railsのこれも良い。
https://github.com/discourse/prometheus_exporter

- Grafana: いろいろなdata sourceのデータ(prometheusのデータなど)を見やすく可視化するツール。アラートも飛ばせる
- prometheus: メトリクスを読み書き保存できるサーバー。
- cadvisor: prometheusにdockerのメトリクスを送るやつ
- node exporter: prometheusにマシンのメトリクスを送るやつ
- prometheus_exporter: prometheusにrailsのメトリクスを送るやつ

### https://app.bugsnag.com

無料でrailsのエラーログを集めて見やすく可視化できた。
アラートも飛ぶ。
railsから直接APIで送る方式。
fluentdとかそういうのが登場しないから、インテグレーションが楽だった。

### https://uptimerobot.com/

無料でヘルスチェックできた。アラートも飛ばせる。

## 雑感

このやり方自体がアルゴリズムな気がする。
外乱の分布が未知な状態で、外乱に強いシステムをオンラインアルゴリズムで低コストに作るにはどうすれば良いか？という問題。

そもそも手作り感満載の運用フローでやってるから、障害が発生するんだと思ってkubernetesとか少し調べたが、覚えることがかなり多くて断念。
運用フロー全体を変えないで最小コストで障害発生率を下げるにはどうするんだ？と考えて、この記事のことを考えた。
監視によってフィードバックループが作られることと、ベストプラクティスは自分にとって新しい発見だった。
begin rescueのエラー処理でrescue中で発生したエラーをrescueできるか検証

## 前提条件
検証バージョン: Ruby2.6.1

# 結論
できる


検証用のメソッド
raiseでエラーを発生させ、rescueでエラーキャッチしたその中でまたエラーを発生してrescueでキャッチしている

```rb
def method
  p 'init'
  begin
    raise "first error"
  rescue
    p "first rescue"
    begin
      raise 'second error'
    rescue
      p 'second rescue'
    end
  end
end
```

実行結果

```rb
> method
"init"
"first rescue"
"second rescue"
```

このようにbeginを書かないでブロックを1段階外にrescueを書く方法もある

````rb
def method2
  p 'init'
  raise "first error"
rescue
  p "first rescue"
  begin
    raise 'second error'
  rescue
    p 'second rescue'
  end
end
```

実行結果

```rb
> method2
"init"
"first rescue"
"second rescue"
```
Ruby の OpenSSL ライブラリでサポートされている暗号アルゴリズムをリストアップする

Ruby の OpenSSL ライブラリでサポートされている暗号アルゴリズムをリストアップする方法です。

## コード

```ruby
puts RUBY_VERSION
puts OpenSSL::Cipher.ciphers
```

## 出力例

```
2.5.0
AES-128-CBC
AES-128-CBC-HMAC-SHA1
AES-128-CFB
AES-128-CFB1
AES-128-CFB8
AES-128-CTR
AES-128-ECB
AES-128-OFB
AES-128-XTS
AES-192-CBC
AES-192-CFB
AES-192-CFB1
AES-192-CFB8
AES-192-CTR
AES-192-ECB
AES-192-OFB
AES-256-CBC
AES-256-CBC-HMAC-SHA1
AES-256-CFB
AES-256-CFB1
AES-256-CFB8
AES-256-CTR
AES-256-ECB
AES-256-OFB
AES-256-XTS
AES128
AES192
AES256
BF
BF-CBC
BF-CFB
BF-ECB
BF-OFB
CAMELLIA-128-CBC
CAMELLIA-128-CFB
CAMELLIA-128-CFB1
CAMELLIA-128-CFB8
CAMELLIA-128-ECB
CAMELLIA-128-OFB
CAMELLIA-192-CBC
CAMELLIA-192-CFB
CAMELLIA-192-CFB1
CAMELLIA-192-CFB8
CAMELLIA-192-ECB
CAMELLIA-192-OFB
CAMELLIA-256-CBC
CAMELLIA-256-CFB
CAMELLIA-256-CFB1
CAMELLIA-256-CFB8
CAMELLIA-256-ECB
CAMELLIA-256-OFB
CAMELLIA128
CAMELLIA192
CAMELLIA256
CAST
CAST-cbc
CAST5-CBC
CAST5-CFB
CAST5-ECB
CAST5-OFB
DES
DES-CBC
DES-CFB
DES-CFB1
DES-CFB8
DES-ECB
DES-EDE
DES-EDE-CBC
DES-EDE-CFB
DES-EDE-OFB
DES-EDE3
DES-EDE3-CBC
DES-EDE3-CFB
DES-EDE3-CFB1
DES-EDE3-CFB8
DES-EDE3-OFB
DES-OFB
DES3
DESX
DESX-CBC
IDEA
IDEA-CBC
IDEA-CFB
IDEA-ECB
IDEA-OFB
RC2
RC2-40-CBC
RC2-64-CBC
RC2-CBC
RC2-CFB
RC2-ECB
RC2-OFB
RC4
RC4-40
RC4-HMAC-MD5
SEED
SEED-CBC
SEED-CFB
SEED-ECB
SEED-OFB
aes-128-cbc
aes-128-cbc-hmac-sha1
aes-128-ccm
aes-128-cfb
aes-128-cfb1
aes-128-cfb8
aes-128-ctr
aes-128-ecb
aes-128-gcm
aes-128-ofb
aes-128-xts
aes-192-cbc
aes-192-ccm
aes-192-cfb
aes-192-cfb1
aes-192-cfb8
aes-192-ctr
aes-192-ecb
aes-192-gcm
aes-192-ofb
aes-256-cbc
aes-256-cbc-hmac-sha1
aes-256-ccm
aes-256-cfb
aes-256-cfb1
aes-256-cfb8
aes-256-ctr
aes-256-ecb
aes-256-gcm
aes-256-ofb
aes-256-xts
aes128
aes192
aes256
bf
bf-cbc
bf-cfb
bf-ecb
bf-ofb
blowfish
camellia-128-cbc
camellia-128-cfb
camellia-128-cfb1
camellia-128-cfb8
camellia-128-ecb
camellia-128-ofb
camellia-192-cbc
camellia-192-cfb
camellia-192-cfb1
camellia-192-cfb8
camellia-192-ecb
camellia-192-ofb
camellia-256-cbc
camellia-256-cfb
camellia-256-cfb1
camellia-256-cfb8
camellia-256-ecb
camellia-256-ofb
camellia128
camellia192
camellia256
cast
cast-cbc
cast5-cbc
cast5-cfb
cast5-ecb
cast5-ofb
des
des-cbc
des-cfb
des-cfb1
des-cfb8
des-ecb
des-ede
des-ede-cbc
des-ede-cfb
des-ede-ofb
des-ede3
des-ede3-cbc
des-ede3-cfb
des-ede3-cfb1
des-ede3-cfb8
des-ede3-ofb
des-ofb
des3
desx
desx-cbc
id-aes128-CCM
id-aes128-GCM
id-aes128-wrap
id-aes192-CCM
id-aes192-GCM
id-aes192-wrap
id-aes256-CCM
id-aes256-GCM
id-aes256-wrap
id-smime-alg-CMS3DESwrap
idea
idea-cbc
idea-cfb
idea-ecb
idea-ofb
rc2
rc2-40-cbc
rc2-64-cbc
rc2-cbc
rc2-cfb
rc2-ecb
rc2-ofb
rc4
rc4-40
rc4-hmac-md5
seed
seed-cbc
seed-cfb
seed-ecb
seed-ofb
```
[macOS][Swift4.2] MacアプリでMojaveの外観モード切り替えに対応する

macOS 10.14 Mojaveでは外観モード（＝システム全体のUIの見栄え）を従来通りの明るい **ライト** 、新しく追加された暗めの **ダーク** に切り替えることができるようになった。
ダークモードによって、眼精疲労がかなり軽減されたので非常に重宝している。
WebViewの内容も切り替わったら嬉しいのに。

この外観モードを切り替えた時、Macアプリでどのように対応したら良いのか記載したい。
標準のUIコンポーネントのみで構成されたアプリであれば、Xcode10以降でビルドすれば特に対応の必要がなく自動的に再描画してくれる。(＊)
しかし、自前のビューを配置していたり直接描画していたりする場合、標準コントロールだけが別のモードになって、自前ビューの部分が切り替わらず描画バグっぽく見えてしまうことがあるので対応の必要が出てくる。

＊ Xcode9以前でビルドされたバイナリでは従来通り強制的にライトのみのサポートになる模様。

---
* Xcode10.1
* Swift4.2
* macOS Mojave 10.14.2

# 外観モードを変更するには？
システム環境設定 > 一般に「外観モード」があり、ライトかダークが選択できるようになっている。
![system_settings.png](https://qiita-image-store.s3.amazonaws.com/0/156085/0be21f94-a7f5-d13f-c07e-0962dc707ed9.png)

# 外観モードの取得
システムで設定されている外観モードは以下で取得することができる。

```Swift:
let appearance = NSApplication.shared.effectiveAppearance
```

判定は `NSAppearance.name` でできそうだ。
ライトなら `.aqua` 、ダークなら `.darkAqua` となっている。（まだアクアだったのか。。）

```Swift:
switch NSApplication.shared.effectiveAppearance.name {
case .aqua:
    print("外観モードはライト")
case .darkAqua:
    print("外観モードはダーク")
default:
    assertionFailure()
}
```

# 外観モードの指定
`NSApplication.shared.appearance` に `NSAppearance` をセットすることでシステムでの設定に代わり、指定した外観モードが採用されるためシステムでの外観モード変更に左右されない。
両方対応すると開発・デザインともにコストがかかるのでどちらかしか対応したくない場合はこの方法を使って固定値としておけば良い。

```Swift:
// 外観モードをライトのみサポートする
NSApplication.shared.appearance = NSAppearance(named: .aqua)
```

# 外観モードが変更された時のハンドリング
`NSView.viewDidChangeEffectiveAppearance()` が使える。
オーバーライドしておけば外観モードが変更された時に呼ばれるので `effectiveAppearance` に応じて描画内容を変更して再描画すればOK。

```Swift:HogeView.swift
override func viewDidChangeEffectiveAppearance() {
    print(NSApplication.shared.effectiveAppearance.name)
}
```


# macOS 10.13以前

外観モードはmacOS 10.14以降しか使えないので両方対応する場合、if分岐しておき10.13以前は `NSAppearance.Name.aqua` の場合と同様の処理に流れるようにしておくと良い。 

```Swift:HogeView.swift
func setupAppearance() {
    func setupForLight() {
        textColor = .black
        backgroundColor = .white
    }
    func setupForDark() {
        textColor = .white
        backgroundColor = .black
    }

    if #available(macOS 10.14, *) {
        switch NSApplication.shared.effectiveAppearance.name {
        case .aqua:
            setupForLight()
        case .darkAqua:
            setupForDark()
        default:
            assertionFailure()
        }
    } else {
        setupForLight()
    }
}
```

---
[Supporting Dark Mode in Your Interface](https://developer.apple.com/documentation/appkit/supporting_dark_mode_in_your_interface)
Ubuntu18.04仮想環境でRubyonRailsを導入し、rails new近辺までする、のまとめ

#使用環境
ホストOS: Windows10 Home
仮想環境OS: Ubuntu Bento/Bionic
Ruby：バージョン指定しない
Rails:バージョン指定しない
データベース：MySQL：バージョン指定しない

#はじめに
aptコマンドを使用します。
aptコマとapt-getコマの違いについては、[こちらの記事が私的には読みやすかったです](https://itsfoss.com/apt-vs-apt-get-difference/)
#流れ
1. 仮想環境にPCからログイン
2. リポジトリ一覧を更新
3. RubyとRuby開発用のツールをインストール
4. ソフトウェアのインストに使う基本的なツールをインストール
5. Railsをインストール
6. MySQL関連インストールし、設定
7. Rails new

#実際の流れ
##仮想環境、ログイン
```:terminal
vagrant up
vagrant ssh
```
##リポジトリ一覧更新

```:terminal
sudo apt update
```
##RubyとRuby開発用ツール、ソフトウェアインストに必要な基本ツールを、ダウンロード
```:terminal
sudo apt install -y ruby ruby-dev build-essential
```
-『-y』オプションは、すべて『Yes』
- build-essential　[参照リンク](https://packages.debian.org/ja/sid/build-essential)
    - Debianパッケージの構築に必要とされるパッケージの一覧情報が含まれる
    - Debianパッケージを構築しないなら不要
   
##Railsインスト
```:terminal
sudo gem install rails
```
##MySQLとそのクライアントツールをインスト
```:terminal
sudo apt -y install mysql-server libmysqlclient-dev
```
##MySQLのパスワードを設定
```:terminal
sudo mysql_secure_installation
```
**このコマンドを実行し忘れると、パスワード設定要求されずに、MySQL設定が終了するため注意**
##MySQLにログイし、パスワード更新、権限変更
```sql
:mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'TegetegePassword';
flush privileges;
```
#rails newから、設定
##webアプリ雛形作成
```:terminal
# RubyonRailsのデフォルトDBがSqLiteなため、オプション『-d』で使用DBを指定
rails new hoge_app -d mysql
```
##Gemfileで、使用するJSをコメントイン（JSを使わないなら、しなくてよし）
```/hoge_app/Gemfile.rb
gem 'mini_racer', platforms: :ruby
```
##編集したGemfileに沿って、インスト
```
bundle install
```
## DBのパスワード変更
```yml:/hoge_app/config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: TegetegePassword  #最初はここが空欄になっている
  socket: /var/run/mysqld/mysqld.sock
```
##Railsプロジェクトのdatabase.ymlを読み込み，これに基づいてDB作成
```
# rake db:createなど、『rake』はすべて『rails』で実行。
rails db:create
```
##サーバー立ち上げ
```:termianl
rails server
```
##Vagrantファイルで指定した、ipアドレスに接続。
デフォルトでは、『192.168.33.10:3000』にアクセス。
毎回打つのは面倒なので、私はブックマーク。
THE SEED ONLINE でVRMをアップロードしたらVRMタイトルの設定漏れで怒られた

# はじめに
THE SEED ONLINE というサービスが始まりました。VRM等のデータをオンラインで管理できるシステムです。
https://seed.online/


アカウント作成して、VRMをアップロードしてみたところ、こんなエラーメッセージが出ました。


```
メタデータ json.extensions.VRM.meta.title は必須項目です。VRMファイルのエクスポート設定を見直してください。
ファイルを確認してください。
```

その時の、キャプチャはこちらです。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/221845/d7a3f0b3-4dd1-7235-81ee-4ad30601f776.png)




# タイトルの設定漏れだった

`json.extensions.VRM.meta.title` というのはVRMのタイトルのことのようです。

用意したVRMファイルは、VRoid Studioから直接VRoid Hubへアップロードし、それをVRoid Hubのアバターページからダウンロードしたものです。たしかタイトルを設定していません。（記憶があいまい）



# タイトルを設定しなおす

改めて VRoid StudioからVRMをエクスポートすることにしました。

念のため、VRoid Studioの最新版（2019/03/11時点で0.5.4-p2）をダウンロードして実施します。
https://studio.vroid.com/

エクスポート時に以下のようなフォームが表示されるので、タイトルの欄にアバターの名前を入力しました。日本語でも大丈夫みたいです。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/221845/a20d0d6d-e5db-242b-4cda-61330588f5d0.png)

この設定でエクスポートしたVRMを THE SEED ONLINE にアップロードしたところ、今度はうまくいきました。



# さいごに

タイトルはちゃんと付けるようにします。
Linux mint 19.1(Tessa)にPython3.7環境を構築

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<@kento_o>です。
今回のアウトプットでは、Linux mint 19.1(Tessa)にPython3.7とDjango開発環境構築を行ったログを残します。

#OS・CPU

・Linux mint 19.1 LTS(Tessa)
・x86_64

##下ごしらえ
```
$ sudo apt-get update
$ sudo apt-get upgrade
```
Linuxに新しい環境を構築する上では定石となるコマンドを入力します。

##Python3.7を導入
まずはインストール可能なパッケージをsearchします。

```
$ sudo apt search python3.7-
```
自分の環境では

```
p   libpython3.7-dbg                - Debug Build of the Python Interpreter (ver
p   libpython3.7-dbg:i386           - Debug Build of the Python Interpreter (ver
p   libpython3.7-dev                - Header files and a static library for Pyth
p   libpython3.7-dev:i386           - Header files and a static library for Pyth
p   libpython3.7-minimal            - Minimal subset of the Python language (ver
p   libpython3.7-minimal:i386       - Minimal subset of the Python language (ver
p   libpython3.7-stdlib             - Interactive high-level object-oriented lan
p   libpython3.7-stdlib:i386        - Interactive high-level object-oriented lan
p   libpython3.7-testsuite          - Testsuite for the Python standard library 
p   python3.7-dbg                   - Debug Build of the Python Interpreter (ver
p   python3.7-dbg:i386              - Debug Build of the Python Interpreter (ver
v   python3.7-dbg:any               -                                           
p   python3.7-dev                   - Header files and a static library for Pyth
p   python3.7-dev:i386              - Header files and a static library for Pyth
v   python3.7-dev:any               -                                           
v   python3.7-distutils             -                                           
p   python3.7-doc                   - Documentation for the high-level object-or
v   python3.7-doc:i386              -                                           
p   python3.7-examples              - Examples for the Python language (v3.7)   
v   python3.7-gdbm                  -                                           
v   python3.7-gdbm:i386             -                                           
v   python3.7-lib2to3               -                                           
p   python3.7-minimal               - Minimal subset of the Python language (ver
p   python3.7-minimal:i386          - Minimal subset of the Python language (ver
v   python3.7-minimal:any           -                                           
v   python3.7-tk                    -                                           
v   python3.7-tk:i386               -                                           
p   python3.7-venv                  - Interactive high-level object-oriented lan
p   python3.7-venv:i386             - Interactive high-level object-oriented lan
v   python3.7-venv:any           
```

このようなログが残りました。
この中から必要なパッケージである「Python3.7」及び「Python3.7 dev」のインストールを行います。

##インストール
以下のコマンドを入力します。

```
$ sudo apt-get install python3.7 python3.7-dev
```
成功しました。


```
$ python3.7 --version  
Python 3.7.1

```


#まとめ
Python3.7環境が構築完了しました。
これからpipやdjangoの環境を構築し、学習を進めていきます。
Cognos Analyticsのポータル画面のクイック・リファレンスやサブメッセージを非表示にする

#Cognos Analyticsのポータルの一部文字の非表示化
Cognos Analyticsポータルの、この辺りの文字を非表示にする方法を投稿しておきます。
※製品内のJavaScriptのソースコードを書き換えてしまう手順なので、もちろん正式にサポートされる手順ではないので、プロジェクトリスクと認識した上で採用を検討下さい。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/aff1bcc5-313f-8dc4-f620-d0e26b438788.jpeg)

#ダッシュボード、レポート、またはストーリーを開いて開始してください。の非表示化
何事も、このJSファイルを編集する事で行います。
/opt/ibm/cognos/analytics/webcontent/bi/js/cahome/bundle.js

secondaryWelcomeMsg で検索して、以下のハイライトされている箇所を削除します。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/d38a710a-b0dc-adca-bb83-2f1c0b197768.jpeg)

さくっと消えました。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/e27e7839-08cd-bd89-3f28-cd43b0b300ea.jpeg)

#クイック・リファレンス の非表示化
同様に、bundle.jsファイルで homeReferenceContainer で検索して、以下のハイライトされている箇所を削除します。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/33ff57b3-bf56-c756-8d17-a7ac6373f746.jpeg)

さくっと消えました。
![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/4b8596ab-2184-c864-7c84-b631c694a1ca.jpeg)

短いですが以上です。
どうしても消さないといけないという要件がある時、ご検討下さい。

もちろん、「カスタマイズ」の機能を利用すれば、がっつりポータル画面の置き換えはできますので、今回はそこまで大掛かりにやらずとも、さらっと消してしまうというプチ技です。

**Cognos Analytics 新機能紹介 - 管理**
https://qiita.com/shinyama/items/daa62e50cb50337d9f39
SPSS Modelerグラフ加工：棒グラフの縦軸と横軸を入れ替えたい

SPSS Modelerで棒グラフを作成すると、以下のように表示されます。
![棒グラフ縦変換1.JPG](https://qiita-image-store.s3.amazonaws.com/0/305774/9260b400-dce3-331f-3423-a433a9c6616d.jpeg)

人に教えてもらうまで気が付かなかったのですが、「グラフ」タブというものがあり、こちらで見るといかにもグラフっぽく表示されます。
![棒グラフ縦変換2.JPG](https://qiita-image-store.s3.amazonaws.com/0/305774/4ad01697-9768-ae68-2c52-ba68d61f6107.jpeg)

が、軸を入れ替えたい（縦軸に度数を表示したい)こともあると思います。そんなときには、「編集モード」に変更して「プロパティ」にチェックを入れます。
![棒グラフ縦変換3.JPG](https://qiita-image-store.s3.amazonaws.com/0/305774/710c4da1-d63b-65e4-1ab8-230223fa05c4.jpeg)

グラフの外の何もないあたりをクリックすると、下のほうにプロパティ編集画面が表示されるので、「座標」タブで「入れ替え」のチェックをはずします。
![棒グラフ縦変換4_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/305774/8767dcde-5507-e0f1-3f70-8f42e42f5985.jpeg)

そうすると、X軸とY軸が入れ替わり、縦と横が入れ替わったグラフに変更されます。
![棒グラフ縦変換5.JPG](https://qiita-image-store.s3.amazonaws.com/0/305774/18b8241f-1a08-6534-22e4-f5523dd3f3b1.jpeg)


# 試した環境

Modeler 18.1.1
Windows 7
SPSS Modelerグラフ加工：ヒストグラムのピン数やピン幅を変えたい

グラフを作成するときに「グラフボード」ノードは便利でよく使いますが、ヒストグラムのピン数やピン幅を明示的に指定したい場合は、「グラフボード」ノードの「ヒストグラム」では細かい設定ができません。
「ヒストグラム」ノードを使うと、ピン数やピン幅を指定することができます。

1.グラフの種類は「ヒストグラム」を選択します。
![ヒストグラム1.JPG](https://qiita-image-store.s3.amazonaws.com/0/305774/8efe634e-a384-b5f2-1bd4-d7c292eefd7d.jpeg)

2.ノードの編集画面の「オプション」タブで、ピン数やピン幅を指定することができます。
![ヒストグラム2.JPG](https://qiita-image-store.s3.amazonaws.com/0/305774/f4b81143-a549-5987-d0fd-3cfa3e54814a.jpeg)


## 試した環境
Modeler 18.1.1
Windows 7
もそ、プログラミングを学ぶ【Ruby on Rails】~MVC総まとめ〜

使い慣れないツールや難しい用語に苦戦しつつ、ぬるぬると修得に励む もそ。
今日はカリキュラムまとめテストで不合格を出しまくった反省と、絵に描くと楽しくわかりやすく覚えられることを活かして、RailsにおけるMVCについてまとめてみました。


##MVCとは？
MVCはずばり、

・Model/モデル
・View/ビュー
・Controller/コントローラー

それぞれの頭文字を取ったもの。
用語の説明の前に、まずは下の図をご覧ください。

![無題1136.jpeg](https://qiita-image-store.s3.amazonaws.com/0/372174/5880761b-db33-8237-91d8-397a2b883288.jpeg)

このなんか良くわからないシュールな図全体が、今日お話するMVCを表しています。
Railsでは、プログラミング処理が**ルーティング→コントローラー→ビュー**の順で行われます。

どういうことかというと、例えばまずパソコンから「こういうページを表示したいな〜」と命令が来ます。
このパソコンからに命令を**レスポンス**というのですが、送られてきたリクエストに対してどのコントローラのどのアクションを動かすのかを指示するのが**ルーティング**の役割。
図で示すと、指をさしている人が建物の前にいる絵がそれに当たります。

次にルーティングの指示の元で動くのが**コントローラー**。これが処理を行うことを**アクション**と呼びます。
絵でいうところの、ムキムキしたリモコンたちです。

ですがこれだけでは、コントローラーは情報を得られません。

そこで登場するのが**モデル**。これがデータベースと結びつくことで、アクション内に情報を呼びます。

そして最後に**ビュー**でウェブページでの見た目を処理します。
一番右端のように表示をさせるためのプログラム、といったイメージです。


---
それぞれに細かなコマンドがあるのですが、今日は一旦ここまで。
カリキュラム終わりのテストで不合格を連発しまくってしまったので、よく復習しなければ...
果たしてRailsを修得できるのか？
...続く
Nuxt.jsにQuillエディター（WYSIWYGエディタ）いれてみた

# Nuxt.jsでQuillベースのエディタープラグインを導入

記事投稿機能を作るためワードプレスのようなエディタを探していたところQuillに行き着いたので導入してみた。

[DEMO](https://sauzar18.github.io/nuxt-quill-demo/)
[ソース](https://github.com/sauzar18/nuxt-quill)
## 環境

- [Nuxt.js v2.4.5](https://ja.nuxtjs.org/guide/)
- [vue2-editor](https://github.com/davidroyer/vue2-editor)
  
## インストール

Nuxt.jsプロジェクト下で下記をインストール

```bash
yarn add vue2-editor
```

## pluginsの設定

```js:plugins/quill.js
import Vue from "vue"
import Vue2Editor from "vue2-editor"

console.log(Vue2Editor)
Vue.use(Vue2Editor)
```

## nuxt.config.jsの設定

```js:nuxt.config.js
plugins: [
    { src: '~plugins/quill.js', ssr: false }
],
```

## エディタの設定

読み込みができたら次はVueファイルで読み込み

```html
<template>
  <div class="container">
    <no-ssr placeholder="Loading Your Editor...">
      <vue-editor
        id="editor"
        v-model="content"
        useCustomImageHandler
        @imageAdded="handleImageAdded"
      />
    </no-ssr>
    <div v-html="content" />
  </div>
</template>
<script>
export default {
  data() {
    return {
      content: ''
    }
  },
  methods: {
    handleImageAdded(file, Editor, cursorLocation, resetUploader) {
      const formData = new FormData()
      formData.append('image', file)
      const config = {
        headers: {
            // header setting
        }
      }
      this.$axios.$post('/api_url', formData, config)
        .then((result) => {
          const url = result.data.url // Get url from response
          Editor.insertEmbed(cursorLocation, 'image', url)
          resetUploader()
        })
        .catch((err) => {
          // eslint-disable-next-line no-console
          console.log(err)
        })
    }
  }
}
</script>
```

やっていること

- SSRされると使えないので、されないようにno-ssrで囲む
- vue-editorタグでコンポーネントを呼び出し
- 画像がアップロードされたらaxiosでPOST

## 使い方

### Props

ドキュメントを元に翻訳

| Name | Type | Default | Description |
|:-----------|:------------|:------------|:------------|
| id | String | quill-container | IDの設定 Vueファイル上に複数のエディターを設置する場合に必要 |
| v-model | String | - | v-htmlなどで出力するとプレビューがみれる |
| useCustomImageHandler | Boolean | false | Base64へのデフォルト変換を使用する代わりに画像のアップロードを処理する |
| placeholder | String | - | Placeholderの設定 |
| disabled | Boolean | false | エディターの無効下 |
| customModules | Array | - | 登録するQuillモジュールの設定 |
| editorToolbar | Array | - | カスタムツールバーを設定 |
| editorOptions | Object | - | エディターにオプションを追加（フォーマットの追加、カスタムQuillモジュールなど） |

### Events

| Name | Parameters | Description |
|:-----------|:-----------|:-----------|
| focus | quill | focusイベントで発火
| blur | quill | blurイベントで発火
| selection-change | range, oldRange, source | selection-changeイベントで発火
| text-change | delta, oldDelta, source | text-changeイベントで発火
| imageAdded | file, Editor, cursorLocation | useCustomImageHandlerがtrueの時にエディターに写真が追加されたら発火

##　まとめ

Quillエディタ初めて使ってみたけど、使いやすいイメージ
Ajax処理で基本的にはサーバーとのやり取りをしつつ最後に
構築されたHTMLをデータベースに格納すればいいかなと

欲を言えばHTMLを直接記述できるエディタもほしい
4日目(2)：Ruby認定試験による勉強

#変数、定数いろいろ
- ローカル変数
    - アルファベット小文字または`_'で始まる識別子
- グローバル変数
    - $で始まり、宣言が必要なく、プログラムのどこからでも参照できる。
    - 初期化されていないグローバル変数を参照した場合、値はnil。
- インスタンス変数
    - @で始まり、特定の オブジェクトに属する。
    - そのクラスま たはサブクラスのメソッドから参照できます。
    - 初期化されていないインスタンス変数を参照した場合、値はnil。
- クラス変数
    - @@で始まり、クラス定義 の中で定義される
    - クラスの特異メソッド、インスタンスメソッドなどから参照／代入ができる。
- 定数
    - アルファベット大文字で始まる。
    - 他の言語では『定数』なので、再定義しようとしても、警告が出て、再定義できない。
    - Rubyでは、再定義しようとすると、警告が出るが、再定義できてしまう。
   
#superメソッド
親クラスのメソッドを呼び出す

```
class User 
  attr_accessor:say
  def initialize
    @say = "Hello"
  end
end
class Oriver < User
  def initialize
    super
  end
end

oriver = User.new
puts oriver.say
#実行結果：Hello
#この時、superメソッドは親クラスのUserから、@sayを呼び出している
```

#attr_accerssor(attr_readerとattr_writer)
- attr_accerssorはゲッターとセッターの機能があるアクセスメソッド
- インスタンス変数の値はクラス内からしか取得出来ない。
- クラス外からインスタンス変数を取得更新するには、ゲッター、セッターが必要
    - ProgateのPHPの方なら説明がちゃんとあった。
    
#include (モジュール名, モジュール名, ...)
クラスやモジュールに、他のモジュールをインクルードする。
引数にはモジュールを指定し、上の様に複数指定することができる
##Math module
浮動小数点演算をサポートするモジュール.

円の面積
```
include Math
#円の面積
def area r
  return r * r * PI
end
#球の体積
def volume r
  return (4/3) * r * r * r * PI
end 
#πの値
puts PI　#結果：3.141592653589793
area(2)　#結果：12.566370614359172
volume (2)　　: 25.132741228718345
```
これは便利。
スマートコントラクトとブロックチェーン

ブロックチェーンを支える重要な役割を果たしているのが「スマートコントラクト」というものです。

#一般的なスマートコントラクトとは？
スマートコントラクトとは、契約に関する様々な課題やリスクを技術の力で解決しようという考え方です。

スマートコントラクトが活用されている身近な例として、Netflix や Amazon Primeに代表されるサブスクリプションサービスが挙げられます。消費者は最初の契約時に定期的に料金を支払う契約をしており、自動的に消費者からお金が振り込まれるようになっています。

他にも交通機関の電子マネーなどスマートコントラクトは社会にも浸透してきています。

#中央集権モデル
このスマートコントラクトとブロックチェーンの関連性を話す前に中央集権モデルについて言及していきます。
中央集権モデルとは特定の個人、企業や団体が管理するモデルのことで、現在まで経済のこの中央集権モデルの中で発展してきました。GoogleやFacebookなどの企業もこの中央集権モデルと言えます。
中央集権にはメリットデメリット様々あります。
＜メリット＞
・トラブルに素早く対応できる
・意思決定にかかるコストか低い
＜デメリット＞
・異なるサービスとの連携や共有が困難
・特定のモデルに依存するリスク

これらのデメリットを解決するのが非中央集権モデルと言われており、非中央集権モデルを確立するのに重要な技術がブロックチェーンです。

#ブロックチェーン
ブロックチェーンとは、不特定多数で管理される分散型台帳の一種のことさします。
誰もかシステムの管理や維持に参加することができ、全体の合意のものにシステムが形成されるので、特定の誰かが管理することが難しいと言われています。

###ブロックチェーンの合意形成アルゴリズム
複数の参加者で合意形成する仕組みをコンセンサスアルゴリズムと言います。
ブロックチェーンが提唱される以前は不特定多数の参加者での合意形成は不可能とされてきました。
ですが、ブロックチェーンによる確率的合意アルゴリズムが、不特定多数での合意形成を可能にしました。

###ブロックチェーンによるスマートコントラクト
確率的合意アルゴリズムとは、合意形成の確からしさを確率的に確約し、時間の経過とともに過去の合意を覆すことが難しくなるアルゴリズムのことです。
これまでの合意形成は、成立条件を１つにして、１度成立されれば覆されないことが前提でだったので、ブロックチェーンでは成立条件を緩和することにより、不特定多数での合意形成を可能にしました。

今まではインターネットでは情報の共有はできていましたが、価値の移転まではできていませんでした。ただ、ブロックチェーンにより今までできていなかった価値の移転まで可能になりました。

ブロックチェーンとスマートコントラクトの関係性は、デジタル上での様々な価値を移転を自動化して行うところにあります。


###ブロックチェーンの価値
ブロックチェーンは様々な産業において大きな価値を生み出すと言われています。

![Blockchain範囲.png](https://qiita-image-store.s3.amazonaws.com/0/342028/10a846ab-da37-f44d-d45c-4f77ccf527b9.png)

日本においても大きな価値があると経産省も公表しています。
![２きぼ.jpg](https://qiita-image-store.s3.amazonaws.com/0/342028/a9a77e13-05d7-ffa4-bbf6-7060bef3b352.jpeg)

実際に様々な分野でブロックチェーンを活用したサービスが生まれてきています。
![１ユース.jpg](https://qiita-image-store.s3.amazonaws.com/0/342028/cdd68463-3f48-c172-dae9-2716534fa6c5.jpeg)

#DApps
ブロックチェーンとスマートコントラクトの基礎が理解できたので、それらの技術を用いた非中央集権モデルのアプリケーションDApps(Decentralized Applications)を開発していきたいと思います。

DAppsを開発する前にテストネットとウォレットについて理解しておきたいです

###テストネット
ブロックチェーンには実際の取引が行われるメインネットの他に、開発用のテストネットが用意されています。
メインネットで開発を行うと、コード変更するたびに手数料がかかったり、一度デプロイしてしまうと変更できなかったりなど、様々な弊害が起こるので、メインネット以外で開発を行います

###ウォレット
DAppsを試すのにはウォレットというアプリが必要になってきます。
ウォレットとは、仮想通貨を管理する財布のようなものです。ただ、ウォレット自体に通貨のデータが保存されているわけではありません。どのアカウントがどのくらいの残高を持っているかはブロックチェーン上のデータとして保存されており、ウォレットはアカウントに紐付く残高を操作する鍵を管理するアプリとなります。

#参考図書
「[試して学ぶスマートコントラクト開発](https://www.amazon.co.jp/%E8%A9%A6%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%AF%E3%83%88%E9%96%8B%E7%99%BA-%E5%8A%A0%E5%B5%9C-%E9%95%B7%E9%96%80/dp/4839966885)」 DMM.comブロックチェーン研究所

###終わりに
最後まで読んでいただきありがとうございました。
間違っているところなどありましたらコメントいただけたら幸いです。
データ分析・機械学習のIoT講習会に行ってきた話

#午前　データ分析、機械学習のプロセスや手法についての座学

**1.データ分析概論**
IoTをどう活用するか、データ分析の目的は何か、どんな手法で分析するかという内容。
統計の手法[^1]や、QC7つ道具[^2]、モデリングの手法[^3]を紹介していた。

**2.機械学習概論**
機械学習の目的、種類、そしてそれをどう処理して応用するかという内容。
従来の機械学習と深層学習(ディープラーニング)の違い[^4]、画像認識システムへの応用[^5]を紹介していた。

###感想
午前は工学系の大学でやるような内容だった。
特に1は、自分が高専の授業で習ったものと重なる部分も多かった。
`効率良くデータ分析をするにはどうすれば良いか`という観点から、いくつかの具体例を提示して適解を紹介していた。
「ほぉほぉ、こんな方法があるのかぁ」という感じで聞いていた。

#午後　Pythonを用いたハンズオン

**3.機械学習プラットフォーム**
様々なプラットフォーム[^6]を紹介した上で、Pythonの代表的な機械学習ライブラリである[Scikit-learn](https://scikit-learn.org/stable/)と、Googleが開発を行っている[TensorFlow](https://www.tensorflow.org/)に焦点を当てていた。
また、Pythonのプログラミング環境として、初心者向けの[Jupyter Notebook](https://jupyter.org/)の使い方を紹介していた。

**4.機械学習手法の理解**
機械学習の利用シーンを3つを上げ、それぞれに適切なアルゴリズムでハンズオン学習を行った。

|利用シーン|説明|アルゴリズム|
|:----|:----|:----|
|クラス分類|データに適切なクラスを割り当てる|SVM[^7]|
|回帰|過去の傾向から未来の値を予想する|線形回帰[^8]|
|クラスタリング|類似性からデータをグループ化する|K平均法[^9]|

**5.実践的な機械学習の利用**
はじめに、気象データと電力消費量のデータを元に、2つのデータのヒストグラムを作成し、それらのデータを結合することで、
`気温と電力消費量の関係をひと目で分かるようなグラフ`をpythonで作成した。
その後、実際に機械学習を用いて、気象データから電力消費量を予測した。
`データの準備`→`機械学習の実行と評価`→`実測値と予測値の相関グラフの作成`
という一連の流れで機械学習を体験した。

###感想
自分自身、機械学習というものに触れたことがなかったので、慣れない部分も多かったが、視覚的にわかりやすく学ぶことができた。
どんなデータを渡すかで機械学習の精度が大きく変わったり、適切なアルゴリズムを用いないと精度が落ちたり、驚かされる部分も多かった。
今回の例では、`気温`、`日照時間`、`時刻`、`日付`を用いたときに精度が一番良く、それに`風速`、`湿度`を加えると精度が落ちた。
何でもかんでも、データを無造作に与えれば精度が上がるというわけではなく、与えるデータを選別しなければいけないようだった。

[^1]: 分布の中心傾向を表す「最頻値」「中央値」「平均値(相加平均、加重平均、移動平均)」、分布のばらつきを表す「分散(偏差平方和、標本分散、不偏分散)」「標準偏差」「正規分布(ガウス分布)」など。
[^2]: 「層別」「パレート図」「ヒストグラム」「チェックシート」「特性要因図」「散布図」「管理図」を`QC7つ道具`という。
[^3]: 機械の故障分析などで利用される「SVM」や「決定木モデル」、ある数値から別の数値を予測する場合に使われる「線形回帰モデル」、顧客分類などに利用される「クラスターモデル」や「K平均法」など。
[^4]: 例えば、何かを分類したいとき、「色を見て分類しろ！」と人間が着眼点を指定して、人工知能が分類を行うのが従来の機械学習である。深層学習は、着眼点を人間が教えなくても、人工知能が森羅万象の中からパターンを見つけ出してくれる。
[^5]: そのままの画像ではデータサイズが大きすぎるので、「畳み込み層」や「プーリング層」を用いて計算コストを軽減したりするらしい。
[^6]: 「Google Cloud Platform」「Azure Machine Learning」「Amazon Machine Learning」「IBM Watson」「Caffe」「Chainer」「PyTorch」など。
[^7]: 「マージン最大化」や「カーネルトリック」などを用いて、最適に分類する。
[^8]: 「最小二乗法」を用いた。
[^9]: [K平均法の動作原理を可視化したサイト](http://tech.nitoyon.com/ja/blog/2013/11/07/k-means/)がある。