OmniAICreator/Qiita-1.07M huggingface dataset:
Anaconda Navigator でサクッと jupyter nbextensions を入れる

# まとめ
`Anaconda Navigator` -> `Environment` から、jupyter nbextensions などのモジュールを簡単にインストールできる。
ただしNavigator上で見つかるものに限る（おそらくAnaconda Cloud上にあるものだけ）。   

# 背景
Jupyter Notebook には便利な拡張機能 `nbxtensions` がある。
一昔前（version 4 くらいだったか）のanacondaでこれをインストールする方法の一つには、 conda-forge からインストールするものがある。（参考：[AnacondaのJupyter notebookでnbextensionsを使う(Qiita)](https://qiita.com/SaitoTsutomu/items/1326e05eb992a8aa849d)）。
PC環境やそれまでのインストール状況によっては、この方法がうまくいかない場合もあった（著者の体験による）。
最近になって新しいPC環境にanaconda を入れたときに、ふと `Anaconda Navigator` に目が留まった。
触ってみると、いろいろと便利らしいことがわかった。    

# Anaconda Navigator
`Anaconda Navigator` は Anaconda でインストールしたツールやパッケージを一元的に管理するツール。   
Anaconda の最新版（2017/06/08時点ではv5.2）をインストールすると付いてくる。
起動したらこんな感じ。
![anaconda_navi_home.png](https://qiita-image-store.s3.amazonaws.com/0/146354/4d28a02f-3f6a-c932-9f5c-6d69cad2db38.png)

`Home` では Jupyter NotebookやSpyder、またインストールしていればVSCodeなどを起動することができる。
ほかのツールを使いたいときにいちいちWindowsボタンを押すのが面倒な人は起動すべし。   

`Environment`では現在Anacondaに存在している環境を管理できる。下図だと base(root) だけが入っている。
![anaconda_navi_ennvironment.png](https://qiita-image-store.s3.amazonaws.com/0/146354/7cd4602c-cf26-5027-1a7c-80218fbedc6f.png)


# 本題：nbextensions をいれてみる
`Environment`のパッケージリストにて "Not installed" か "All" を選択し、右にあるSearch に nbextensionsを入れる。
いまの環境だと下図のように２つのパッケージが見つかる。これらをチェックし、右下の "Apply"を押す。
![anaconda_navi_nbextensions_1.png](https://qiita-image-store.s3.amazonaws.com/0/146354/b0f03119-ed83-01bc-a396-9ea11c11ee7e.png)

インストールするパッケージの確認ダイアログが表示されるので、Applyを押す。
![anaconda_navi_nbextensions_confirm.png](https://qiita-image-store.s3.amazonaws.com/0/146354/f94cfbe7-5a44-6f5f-b41f-ee8a0b02cf0f.png)

あとはパッケージのインストールが終了するのを待つ。

## Nbextensionsの確認
Home に戻って Jupyter Notebook を開き、`Nbextensions` の項目があることを確認する。
![jupyter_notebook_nbextensions.png](https://qiita-image-store.s3.amazonaws.com/0/146354/c8bba99e-ce5f-81bc-0be6-cc3244a07b45.png)

もしなかったら、[こちらの記事にあるように](http://gabdro.hatenablog.com/entry/2017/04/13/110932)コマンドプロンプトで次のコマンドを実行すると出てくるはず。

```cmd
jupyter nbextensions_configurator enable --user
```

ちなみに、この操作によって nbextensions`%USERPROFILE%\.jupyter\nbconfig\tree.json` の `"nbextensions_configurator/tree_tab/main"` がtrueになる。

```json

{
  "load_extensions": {
    "nbextensions_configurator/tree_tab/main": true
  }
}
```

# おわりに
パッケージの更新もできる様子。
CentOS6にtomcatをインストールしたらDocumentRootはどこになるのか

CentOS6にTomcatをインストールするには以下のターミナルで以下のコマンドを実行

```shell
sudo yum install -y tomcat tomcat-webapps tomcat-admin-webapps
```
DocumentRootは以下のディレクトリになった
/var/lib/tomcat/webapps
MacにtomcatをインストールしたらDocumentRootはどこになるのか

MacにTomcatをインストールするには以下のターミナルで以下のコマンドを実行

```shell
brew install tomcat
```
DocumentRootは以下のディレクトリになった
/usr/local/Cellar/tomcat/'VERSION'/libexec/webapps
Android開発、JavaのOptionalと奮闘する24時間

# JavaのOptionalと向き合って

今回はAndroid開発で重要なOptionalについて学習しましたのでアウトプットしてみます。
SwiftでiOS開発する時にはもはやOptional抜きでの開発は考えられないぐらい
Optionalという概念はモバイル開発でよく使われています。

iOSでいうことの

``` Optional.swift
let string1: String? = nil
let string2: String = "Hello Swift"
```

たったこれだけの違いですが、SwiftではOptinalを使うコストというのは非常に最小限で表現できました。
当然Objective-CもOptionalの概念が後から導入されました。
そのため、さもやJavaも簡単に書けるだろうとタカを括っていたら
これを使うのがなかなか難しかった印象があります。

## Optionalを使うための準備

JavaにもOptionalを使えることが分かって、
さあ使おうと思ったらいきなりコンパイルエラーが起こりました。

どうやら、AndroidStudioではデフォルトで付いているのではなく、
APIレベルというものがあるらしいです。
API　Levelが24以上の時しか使えないそうなので、build.gradleファイルの変更が必要とのことでした。

```build.gradle

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example.sanpuru.sampleapp"
        minSdkVersion 24 // <- ここを24以上に変更する
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
```

こうしないとOptionalが使えないとのこと。
もちろん、このファイルを変更したらSyncします。

これでやっと使えるようになります。

## JavaでOptionalを宣言してみよう

さあ、ここからやっとJavaでOptionalが使えるようになりました。
宣言の仕方は下記の通ります。
StringとIntegerを宣言します。

``` Optional.java

       Optional<String> optString = Optional.of("string");
       Optional<Integer> optInt = Optional.of(1);
```

このように宣言します。
固定値が入っていますが、実際の現場ではこのような使われかたはせず
大体はAPI通信を行なった後に帰ってくるJSONのオブジェクトのキー値を差し込む感じになります。
これでJSONのvalueが`null`であってもアプリが落ちることがなくなりました。

## Optionalの変数を実際に使うにはどうすれば良いか

上記ではstringではなく、Optional.of("string")の値が入っています。
これをprintしてもstringにはなりません(多分)。

Optionalはそのままでは使われることはなく、普通はunwrapします。
イメージとしてはOptionalというラップに包まれているstringや1を取り出すと言った感じです。

一般的な書き方としては

```Unwrap.java
        // orElse
        String hoge = optString.orElse("デフォルト値");
        Integer foo = optInt.orElse(100);
```

と言った感じで`String`や`Integer`に直します。

他には

``` Present.java
if (optString.isPresent()) { // 値の存在をチェックするメソッド                    

    // 値を取得するgetメソッドは、値が存在していない場合実行時例外を投げてアプリが落ちる
    String string = optString.get();                                                          

    System.out.println(string);                                                             
}    

```

という使い方がありますが、上記のgetメソッドは値が存在しない場合は
(例えば、Optional.of("")という感じの場合)
実行時エラーを吐いてしまってアプリが落ちてしまいます。

なので、`.orElse(デフォルトの値)`と言ったような書き方になるんじゃないでしょうか。

### Optionalの使い方をマスターした後に学習しやすい概念

僕の場合はOptionalを理解した後はJava8 Streamが使えるようになるんじゃないかなと思います。
iOSでいうことのRxSwiftと同じような書き方になってきますね。
その後にJavaを書くようになってからラムダ式だとか、メソッド参照の意味とかを理解できるようになりました。
この辺を理解できるようになったらあなたも立派なJavaエンジニアになれると思いますよ。


### 参考ページ

[JavaのOptionalのモナド的な使い方](https://qiita.com/koher/items/6f4a8d8b3ad3142bf645)

[Java 8 "Optional" ～ これからのnullとの付き合い方 ～](https://qiita.com/shindooo/items/815d651a72f568112910)

[[Java8] Optionalで脱Exception!](https://qiita.com/Aruneko/items/b883dd705d4ada03de52)

この辺りのページを参考にすればよりOptionalの必要性を理解することができます。
railsのエラー「Errno::EACCES: Permission denied」の解決

# 事象
「rails new」で新しいアプリを作成し、「bundle install」をしようとした時に発生。

# 環境
- rails 5.2.0
- rbenv 1.1.1

# エラー内容
```terminal
$ rails new
$ bundle install
Errno::EACCES: Permission denied @ dir_s_mkdir - /Users/Username/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/extensions/x86_64-darwin-17/2.3.0-static/websocket-driver-0.6.5
An error occurred while installing websocket-driver (0.6.5), and Bundler cannot continue.
Make sure that `gem install websocket-driver -v '0.6.5' --source 'https://rubygems.org/'` succeeds before bundling.
```

# 解決策
## ①エラーログに記載してあったコードをそのまま実行。
```terminal
$ sudo gem install websocket-driver -v '0.6.5' --source 'https://rubygems.org/'
Password:
Building native extensions.  This could take a while...
Successfully installed websocket-driver-0.6.5
Parsing documentation for websocket-driver-0.6.5
Installing ri documentation for websocket-driver-0.6.5
Done installing documentation for websocket-driver after 1 seconds
1 gem installed
```
これでもインストール自体はできたのですが、その後再び同じエラーで止まってしまった。
根本的解決ではなかったため、違う方法を検討。

## ②/rbenv以下の権限を変更する
今回は以下のファイル権限の所有者がrootになっていたので、自分に変更。

`/Users/Username/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/extensions/`

```terminal
$ cd /Users/Username/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0-static/
$ ls -la
total 0
drwxr-xr-x  10 Username   staff  320  6  7 23:24 .
drwxr-xr-x   3 Username   staff   96  5 11 14:46 ..
drwxr-xr-x   6 root  staff  192  6  7 22:53 bigdecimal-1.3.4
drwxr-xr-x   6 root  staff  192  6  7 22:54 io-console-0.4.6
drwxr-xr-x   6 root  staff  192  6  7 22:54 json-2.1.0
drwxr-xr-x   6 root  staff  192  5 11 14:47 nio4r-2.3.1
drwxr-xr-x   6 root  staff  192  5 11 14:47 nokogiri-1.8.2
drwxr-xr-x   6 root  staff  192  6  7 22:54 psych-3.0.2
drwxr-xr-x   5 root  staff  160  6  7 23:24 websocket-driver-0.6.5
drwxr-xr-x   5 root  staff  160  5 11 14:47 websocket-driver-0.7.0
$ sudo chown Username bigdecimal-1.3.4/
$ sudo chown Username io-console-0.4.6/
$ sudo chown Username json-2.1.0/
$ sudo chown Username nio4r-2.3.1/
$ sudo chown Username nokogiri-1.8.2/
$ sudo chown Username psych-3.0.2/
$ sudo chown Username websocket-driver-0.
```
（ファイル一括変更のやり方が分からなかったので個別に変更）

今回はこちらで`bundle install`が最後まで通ったので、解決としました。
ubuntuでCtrl＋Spaceを無効化

* 自宅マシンのUbuntuでCtrl＋Spaceが言語切り替えに使われており、IDEでCode補完ができない事態が発生したので対処法をメモる。

1. 画面右上の言語バーをクリック。
2. Configureをクリック。
3. Global Configタブより、Trigger Input MethodでCtrl+Spaceが指定されているのをEmptyにする。
Gem導入の際のしょうもないミス備忘録

今日はN+1問題を直すために自分の環境に`bullet`を導入してみた。
その時、すごいしょうもないミスで15分ほど潰してしまったのでもう繰り返さないように書き残しておく。

```Gemfile.rb
group :deployment do
  gem 'capistrano', '~> 3.4.0', require: false
  gem 'capistrano-bundler', '~> 1.1.2', require: false
  gem 'capistrano-figaro', require: false
  gem 'capistrano-rails', '~> 1.1', require: false
  gem 'capistrano-rbenv', '~> 2.0', require: false
  gem 'capistrano3-unicorn', require: false
  gem 'bullet'
end
```

この状態で`bundle install`する。
そして、ネット記事とかREADMEとかを見てポップアップが出る程度の最低限の設定を追記

```config/environments/development.rb
Rails.application.configure do

（省略）

  config.after_initialize do

    （省略）

    Bullet.enable = true
    Bullet.alert = true
    Bullet.bullet_logger = true
  end

（省略）

end
```

これで`rails s`すると下記のようなエラー

```rb
xiting
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/config/environments/development.rb:18:in `block (2 levels) in <top (required)>': uninitialized constant Bullet (NameError)
	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.8/lib/active_support/lazy_load_hooks.rb:36:in `execute_hook'
	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.8/lib/active_support/lazy_load_hooks.rb:45:in `block in run_load_hooks'
	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.8/lib/active_support/lazy_load_hooks.rb:44:in `each'
（省略）
```

なんで？と10分くらい悩んだあと、
`group :deployment do`に、bulletのgemを導入していたと気づく（なぜか`develop`と見間違えていた、、、）

ので、修正して

```Gemfile.rb
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug'
  gem 'sqlite3'

（省略）

  gem 'bullet'
end
```

再度、`rails s`する。

しかし結果が変わらない。

```rb
xiting
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/config/environments/development.rb:18:in `block (2 levels) in <top (required)>': uninitialized constant Bullet (NameError)
	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.8/lib/active_support/lazy_load_hooks.rb:36:in `execute_hook'
	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.8/lib/active_support/lazy_load_hooks.rb:45:in `block in run_load_hooks'
	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.8/lib/active_support/lazy_load_hooks.rb:44:in `each'
（省略）
```

なんでや！Gemfile直したやろ！とまた5分くらい悩む。

しばらく悩んだ後、あーと思って`bundle install`をし直す。
そして再度`rails s`すると、、、

```rb
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx92$ rs
=> Booting WEBrick
=> Rails 4.2.8 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2018-06-17 00:00:00] INFO  WEBrick 1.3.1
[2018-06-17 00:00:00] INFO  ruby 2.4.2 (2017-09-14) [x86_64-darwin15]
[2018-06-17 00:00:00] INFO  WEBrick::HTTPServer#start: pid=26298 port=3000
```

直った！（当たり前）

Gemfileの記述を修正したら、`bundle install`をし直さないと設定が反映されないという当たり前すぎることをうっかり忘れていた。
書くのも恥ずかしい内容ではあるが、gemの導入とかだとついconfigなどに問題があるのかと思いがちで基本的なことを忘れてしまうのでもう繰り返さないようにとりあえず残しておく。
こういうしょうもないのは一瞬で気づきたい。。。( 'ω' )
RxSwiftでTableViewに精神を殺された😇（解決していない）←した

# 前置き
ど素人のガチでコード書いている時間は3ヶ月程度のレベルです。
プログラマー歴も同等です。（経験値少なすぎおじさん）

メモというかこの悩みと悲しみを未来永劫忘れないためのメモ（未解決事件）

## RxSwiftを使ってTableViewに精神を殺された😇
何がやりたいかというと、
`UIViewContoroller`に`UITableView`と`Cell`を乗っけてるViewがある。
その`Cell`に情報を入れたいだけ。（普通の使い方だよぉ...）
（NavigationControllerもいるよ）

``` クソコードViewController.swift

import UIKit
import RxSwift
import RxDataSources
import RxCocoa

class mainView: UIViewController {

 // StoryBoardから設定したViewController配下のUITableView
 @IBOutlet weak var tableView: UITableView!

 // Modelは独自で定義してた項目群
 // 実際はViewModelに定義してソコから参照している
 var item = BehaviorRelay<Model>(value: nil)

 override func viewDidLoad() {
  super.viewDidLoad()

 // これは監視を仕込むための関数
  subscribe()
  }

 // やったるでー
 func sbuscribe() {

  item.asObservable()
   .bind(to: tableView.rx.items(cellIdentifier: identifier, cellType: tableViewCell.self)) { _, item, cell in 
  
  // Cellに対してごにょごにょする
  cell.label.text = "いえーい"

 }
 .disposed(by: disposeBag) // 簡略

 // 省略
}
```
## オコラレタ
Xcodeはお怒りである。
`Generic parameter 'Self' could not be inferred`
箇所は`tableView.rx.items`の`rx`の部分に赤線。
すぐ翻訳しちゃうマンは翻訳をした。
`汎用パラメータ 'Self'を推測できませんでした`

なるほど、わからん。

### 謎(なぞ)
色々調べて、StoryBoardも見直して、作り直して、色々試したけど...
意味がわからなかった。

経験不足から推測ができないのは辛い。
まるで目星が立たない。
というか、別の箇所ではほぼ、同じ構成で動いているのだ。
なぜ、

そもそも、`Rx`を使った`TableView`の扱い方が間違っている可能性の方が大いにある。
というか、普通の`TableView`でさえ扱えきれていないのに😡

心折れそう。

## 追記

コメントご指摘をいただきました。

```
.bind(to: tableView.rx.items(cellIdentifier: identifier, cellType: tableViewCell.self)) { _, item, cell in 
```

を記載してた、`tableViewCell.self`に誤りがありました。
`rx`で怒られていましたが、原因は全く関係のない箇所...

エラー箇所だけではなく、全体の構成をしっかりと意識して調査しなければなりませんね。
良い勉強となりました！

アドバイスありがとうございます
Course 2  >  Week 1 Practical aspects of Deep Learning（Coursera Deep Learning Specialization 受講記録）

Coursera > [Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning) > Course 2 : Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization >  **Week 1 Practical aspects of Deep Learning** の個人的な受講記録。

#概要
Course 2 では、モデルの精度を上げたり学習速度を向上させるための基本的なテクニックを学ぶ。3週分の講座から構成される。

1. [Week 1 Practical aspects of Deep Learning](https://qiita.com/onooooo/items/8a571a78605fce18be22)
2. [Week 2 Optimization algorithms](https://qiita.com/onooooo/items/fcb86624b837c734aa60)
3. [Week 3 Hyperparameter tuning, Batch Normalization and Programming Frameworks](https://qiita.com/onooooo/items/a648062b67893fd1b58f)

今回は Week 1 の受講記録。

---
#Setting up your Machine Learning Application
##Train / Dev / Test sets
データの分割について。（Train/Dev/Test）
ビッグデータを扱う場合はDev/Testデータセットの比率は少なくても良い（1%やそれ未満など）。TrainとDevデータセットの Distributions （日本語だと「分散」？）が異なることはしばしばあり得るが、DevとTestのデータの Distributions は揃えるべき。DevとTestで全然違うところから持ってきたデータを使っちゃうとデータの傾向が異なるからうまくいかないよ、ということかと。

##Bias / Variance
high bias → under fitting
high variance → over fittng

##Basic Recipe for Machine Learning
high bias (under fitting) の対策

 - bigger network
 - train longer
 - (Neural Network Architecture の見直し)
 
high variance (over fitting) の対策

 - more data
 - regularization
 - (Neural Network Architecture の見直し)

最近のディープラーニングの世界においては、high biasとhigh varianceは必ずしもtrade offの関係ではない。

#Regularizing your neural network
##Regularization
over fitting を解消するためのテクニックのひとつ、Regularization（正則化）。L2 norm や L1 norm がある。L2 regularization のほうが一般的。L1 regularization はスパース化（Wベクトルの要素の多くが0になる）の効果が期待できるが、L2のほうがずっとよく使われる。
※そしてこの講座でもこれ以降は L2 regularization のみ使われているっぽい。
Weight Decayとも呼ばれる。

##Why regularization reduces overfitting?
Wの値が抑制され、ネットワークがシンプルな方向に訓練される。

##Dropout Regularization
Dropout も Regularization の手法のひとつで、 OverFitting の解消に効果がある。
訓練時、各レイヤの keep_prob の割合だけユニットを残して、それ以外はOFFにする。
Inverted Dropout

##Understanding Dropout
ドロップアウトを直感的に理解するための説明
・・・だと思うけど、いまいち理解できず。大勢に影響はなさそうなので気にせず飛ばす。

##Other regularization methods
その他のRegularization手法。

- Data Augmentation
 - データの水増し（画像サイズの反転、切り抜き、回転など）
- Early Stopping
 - error値が悪化する前に訓練を切り上げる

#Setting up your optimization problem
##Normalizing inputs
データの正規化
訓練のスピードをアップすることができる
入力データの平均を0、分散を1にする

##Vanishing / Exploding gradients
勾配消失、勾配爆発

##Weight Initialization for Deep Networks
重みの初期化。
たいていのアクティベーション関数にはHe initialization
TanH（Sigmoidも？）はXavier initialization

##Numerical approximation of gradients
微分の近似値の求め方

##Gradient checking
勾配確認
バックプロパゲーション処理のデバッグ手法のひとつ。
コスト関数を2回呼び出して偏微分の近似値を求める

##Gradient Checking Implementation Notes
Gradient checkingはあくまでもデバッグ目的。トレーニング時は無効にすること。
Dropout時は使えない

#Programming assignments
##Initialization
0で初期化、ランダム初期化、heの初期化で成績を比較する

##Regularization
Non Regularization、L2 Regularization、Dropout　で比較する

##Gradient Checking
Gradient Checkingによってバックプロパゲーション関数の正当性を評価する

#Heroes of Deep Learning (Optional)
##Yoshua Bengio interview
あとで見ます・・
【Javaの開発効率UP】DCEVMとHotSwapAgentで、再起動せずにソースコードの変更を反映する

# What's DCEVM

https://github.com/dcevm/dcevm
http://hotswapagent.org/

Java実行中に動的にコードを差し替えるためのJVMの拡張。
HotSwapAgentと組み合わせて、**アプリケーションを再起動することなしにコードの変更を反映する**ことができる。 

IntelliJのプラグインがあるのでそれと合わせて使う方法を書きます

参考：
https://github.com/dmitry-zhuravlev/hotswap-agent-intellij-plugin#dcevm-installation

# 他のHot Swapツールとの比較

Javaを再起動せずにソースコードの変更を反映する方法はいろいろある

## IntellijやEclipse等のIDEのホットスワップ機能
クラスの構成に変更がなければ動的に差し替えられる。
が、変更があったときには差し替えられない（メソッドが増えた、名前が変わった、pricvate→publicにした、など）

## JRebel
最強。だけどお値段が高い

## Spring Loaded (※Spring専用)
開発が止まっている

## DCEVM + HotSwapAgent
親クラスやインターフェースの変更以外は差し替えられる


# インストール方法

参考：
https://github.com/dmitry-zhuravlev/hotswap-agent-intellij-plugin#dcevm-installation

## 1. JDKをインストール
DCEVMはすべてのバージョンのJDKに対応しているわけではない。
現在（2018/5/22）対応している最新のバージョンは`Java 8u152`なのでこのバージョンのJavaをダウンロードしてインストール

ここからダウンロードできる。が、過去のJDKをダウンロードするにはユーザ登録が必要。
http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html


## 2. DCEVMをインストール

### ダウンロード
https://github.com/dcevm/dcevm/releases/ から`DCEVM-8u152-installer.jar`をダウンロード。

### インストーラ起動
管理者権限で起動

```sh
sudo java -jar DCEVM-8u152-installer.jar
```

### JDKにDCEVMを適用
1. `Add instration directory...`をクリックし、JDKのディレクトリを開く
2. 1で開いたJDKを選択し、`Install DCEVM as altjvm`をクリック
![](https://cloud.githubusercontent.com/assets/1389501/23869992/4aab27ae-0825-11e7-879d-1221cc013228.gif)
出典: https://github.com/dmitry-zhuravlev/hotswap-agent-intellij-plugin#dcevm-installation

## IntelliJにHotSwapAgentプラグインをインストール

<img width="936" alt="Screen Shot 2018-05-15 at 11.07.01.png (372.8 kB)" src="https://img.esa.io/uploads/production/attachments/3034/2018/05/15/8996/68dcb155-128c-4ad6-a882-6adc6ededd0b.png">

「`HotSwapAgent`」で検索してInstallをクリック。インストール完了後IntelliJを再起動

### IntelliJで使用するJavaを変更

`File` → `Project Structure...`を開き`、Project SDK`の`New...`→`JDK`をクリックし、↑でインストールしたJDKを選択
<img width="1009" alt="Screen Shot 2018-06-08 at 0.12.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/109747/a3018266-57fe-c5bc-c50e-86ad15f1a22e.png">


### HotSwapAgent Pluginを有効にする
`Preferences`→`Tools`→`HotSwapAgent`
HotSwapAgentを有効にする起動設定にチェックを入れる
<img width="1065" alt="Screen Shot 2018-06-07 at 23.51.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/109747/e95f80f9-b540-e808-2ca1-577234ed821c.png">


ついでにHotSwapが有効になっていることを確認
<img width="992" alt="Screen_Shot_2018-05-15_at_11_46_54.png (257.0 kB)" src="https://img.esa.io/uploads/production/attachments/3034/2018/05/15/8996/bacfe2b0-e39c-4bad-b30e-827db5dd6144.png">


### 完成！
Javaアプリケーション立ち上げる（デバッグ起動）とHOTSWAP AGENTのログが出る。
<img width="968" alt="Screen Shot 2018-05-15 at 11.24.32.png (136.0 kB)" src="https://img.esa.io/uploads/production/attachments/3034/2018/05/15/8996/5a4c17af-2173-429e-807e-3e9b27c94674.png">
この状態でコードを変更し、コンパイルすると、アプリケーションを再起動しなくても即時に反映される。

- 単体でコンパイル(: Command+Shift+F9/ ⊞: Ctrl+Shift+F9)
- 全部コンパイル(: Command+F9/ ⊞: Ctrl+F9)
Ramdaで素数を列挙する

引数(min,max)をとり、min以上max以下の素数を配列として返す関数を作ります。
Ramdaと非Ramda(Plain JS)で2通り書きます。再帰は使いません。

`dispPrimeNum(4,30) // =>[5,7,11,13,17,19,23,29]`
のように使います。

# Ramda版
下記のようになります。

```javascript:prime.js
// isDivBy :: Number -> Number -> Boolean
const isDivBy = R.pipe(R.flip(R.mathMod), R.equals(0));
// isPrimeNum :: Number -> Boolean
const isPrimeNum = R.chain(R.allPass, R.pipe(R.dec, R.range(2), R.map(R.complement(isDivBy))));
// dispPrimeNum :: Number -> Number -> [Number]
const dispPrimeNum = R.pipe(R.range, R.filter(isPrimeNum));
```

# Plain JS版
再帰は使わないので下記のようになります。
もっといい方法がありそうですが、今は深夜なのでこれが限界です。

```javascript:prime.js
// PlainJSの場合(再帰未使用)
const dispPrimeNum = function (min, max) {
  let arr = [2];
  for (var i = 3; i <= max; i++) {
    let iIsPrime = true;
    for (let j of arr) {
      iIsPrime = iIsPrime && i % j !== 0;
    }
    if (iIsPrime) {
      arr.push(i);
    }
  }
  arr = arr.filter(n => n >= min);
  return arr;
}
```

# 比較してみて
Ramdaの書き方は知らない人が見ると面食らうかもしれませんが、慣れた人からするとスッキリしてむしろわかりやすいのではないのでしょうか。
辞書の作成

Python（プログラム）の勉強とアルゴリズムの勉強で幅優先探索を実装しようとしましたが・・・その前に辞書の使い方を勉強しようと思い今回この記事を作成しました。

※超初心者です・・・

今回は1つのリストから色々な条件で辞書を作成します。
↓が今回辞書を作成するリストです。
今回はリストの先頭要素がインデックスになっていて、その後の4個の要素がNodeを表していることを想定してsampleのリストを作成しました。

```python
#辞書を作成する
sample = [[1,11,22,33,44],[2,21,22,23,24],[3,21,32,33,34],[4,41,42,43,44],[5,44,52,53,54]]
```

リストの先頭をキー、残りを値として辞書を作成しました。

```python
d = {}
for line in sample:
    d[line[0]] = line[1:5]

print(d)
#{1: [11, 22, 33, 44], 2: [21, 22, 23, 24], 3: [21, 32, 33, 34], 4: [41, 42, 43, 44], 5: [44, 52, 53, 54]}
```

次はリストの2個目以降をkeyとしてkeyが存在する場合はそのkeyに値を追加し、keyが存在しなければ新しいkeyを作成して辞書に追加するということをやってみました。

```python
d = {}
for line in sample:
    for i in line[1:5]:
        value = line[1:5]
        d.setdefault(i, []).extend(value)

print(d)
#{11: [11, 22, 33, 44],
# 22: [11, 22, 33, 44, 21, 22, 23, 24],
# 33: [11, 22, 33, 44, 21, 32, 33, 34],
# 44: [11, 22, 33, 44, 41, 42, 43, 44, 44, 52, 53, 54],
# 21: [21, 22, 23, 24, 21, 32, 33, 34],
# 23: [21, 22, 23, 24],
# 24: [21, 22, 23, 24],
# 32: [21, 32, 33, 34],
# 34: [21, 32, 33, 34],
# 41: [41, 42, 43, 44],
# 42: [41, 42, 43, 44],
# 43: [41, 42, 43, 44],
# 52: [44, 52, 53, 54],
# 53: [44, 52, 53, 54],
# 54: [44, 52, 53, 54]}
```

dict.setdefaultは
dict.setdefault(key,keyが存在しない時の処理)を定義できるようで、
今回はkeyがなければ空のリストを作成するという処理にしました。そのリストにextend()で要素を追加してみました。

この辞書のvalueは重複要素が存在し、またキーの値が含まれているので、重複要素の削除とキーの値の削除を行います。

```python
for key, value in d.items():
    value = set(value)
    value.remove(key)
    d[key] = value

print(d)
#{11: {22, 33, 44},
# 21: {22, 23, 24, 32, 33, 34},
# 22: {11, 21, 23, 24, 33, 44},
# 23: {21, 22, 24},
# 24: {21, 22, 23},
# 32: {21, 33, 34},
# 33: {11, 21, 22, 32, 34, 44},
# 34: {21, 32, 33},
# 41: {42, 43, 44},
# 42: {41, 43, 44},
# 43: {41, 42, 44},
# 44: {11, 22, 33, 41, 42, 43, 52, 53, 54},
# 52: {44, 53, 54},
# 53: {44, 52, 54},
# 54: {44, 52, 53}}
```

色々な条件で辞書作成をしようと思いましたが、今回は以上です。最後に作った辞書があればNodeとそのつながりが分かるので、幅優先探索の実装ができそうです。
はじめてのFlask - Hello World -

流れでFlask使い始めたけど、
一から作って見ないとわからないと思ったので、

とりあえずおきまりの。
## Hello World
→ http://flask.pocoo.org/

```main.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, World!"              
```
$ FLASK_APP=main.py flask run
ポートはデフォルトで５０００だそうなので、
$ curl http://0.0.0.0:5000/
Hello, World!

ほなおっけー。
ちょっと改変して

## 場合分け
```main2.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, World!"
@app.route('/Japan')
def hello2():
    return "Hello, Japan!"
```
$ curl http://0.0.0.0:5000/
Hello, World!
$ curl http://0.0.0.0:5000/Japan
Hello, Japan!

場合分けはそういう感じね。
でも run めんどくさい...
main に書けばいいのね
→ https://a2c.bitbucket.io/flask/tutorial/setup.html?highlight=run

```main2.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, World!"
@app.route('/Japan')
def hello2():
    return "Hello, Japan!"

if __name__ == '__main__':
    app.run()
```
## 外部アクセス
あと、デフォルは立てたサーバーは自分のコンピューターからしかアクセスできないそうで、
外部から見たいときは単純に
`app.run(host='0.0.0.0')`
とすればいいそうで。

## 終わりに
細かいところはこれから詰めて行きます。悪しからず。

ごちそうさまでした。
ThymeleafでHTMLにJavaScript変数を埋め込む方法

```html
<script th:inline="javascript">
      /*<![CDATA[*/
         var user = /*[[${session.userName}]]*/ 'Foo';
         var users = /*[[${users}]]*/ null;
       /*]]>*/
</script> 
```

※session.userNameには文字列、usersにはJavaのオブジェクトのListが入っている
↓

```html
<script>
    /*<![CDATA[*/
        var user = 'John';
        var users = [{'name':'Nobuchan','age':4},{'name':'Daichan','age':3}];
    /*]]>*/
</script> 
```
.NET Framework Developer Packについて

結論としては.NET Framework Developer Packには本体と日本語パックがある。日本語パックだけインストールしたためうまくいかなかった。

.NET Framework 4.7.2が登場したので、Visual Studioのターゲットフレームワークに選択できるように、ドロップダウンリストから「別のフレームワークを選択する」を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23796/f2abe91d-88a4-8842-9534-e3512abf8bc0.png)

すると、https://www.microsoft.com/net/download/visual-studio-sdks
に遷移し、Developer PackをダウンロードするとNDP472-DevPack-JPN.exeがダウンロードされた。
これは日本語パックであり、これだけダウンロードしてもVisual Studioから.NET Framework 4.7.2を選択できるようにならない。

このサイトからダウンロードするとNDP472-DevPack-ENU.exeがダウンロードできる。
https://docs.microsoft.com/ja-jp/dotnet/framework/install/guide-for-developers
RustでHTTP/2+TLS対応なWebAPIの入口を作ってみる

# 追記
セッション管理機構が貧弱すぎる（登録してないユーザがシステムを閲覧できちゃうかも）ので、
対応策を考えてみる記事も別途書いた。
[Rust WebフレームワークのACTIXで使う安全なセッション管理機構を考えてみる](https://qiita.com/segfo/items/8d992320184fa0a41157)

# はじめに
最近ラズパイ使ったIoTとかAndroid使ったIoTが流行りじゃないですか。
で、Rustも流行ってるじゃないですか（俺の中では）

というわけで何となくホストサーバと会話できるようなAPIを作りたくなった。

ただ、HTTP/1.1はなんか個人的にバイナリじゃないのが嫌なので
バイナリな感じのHTTP/2でやりたかった。

# HTTP/2ことはじめ
なーかなかRustでHTTP/2を喋れる良いAPIがなかった

* [iron](https://github.com/iron/iron)：割と有名なやつだけどHTTP/2しゃべれない、TLSに対応させようとするとルーティングがなぜか80番ポートに誘導される。原因はわかってるから[パッチ送った](https://github.com/iron/iron/pull/566/files)
けど、反映されず（おそらく英語に難ありなので理解されてない気がするが、この際どうでもいい）
 なんか2018年7月8日に反映されてた。~~→ironは公式で非推奨となっていた。（NOTE: Iron is not actively maintained at the moment, please consider using a different framework）~~ →再び開発が再開されました。([Revert "README: Add note about maintenance status of iron (#576)" · iron/iron@9ad396d](https://github.com/iron/iron/commit/9ad396d17733f3e082b91dbf18daceabd961f4c6#diff-04c6e90faac2675aa89e2176d2eec7d8))
* [gRPC](https://github.com/stepancheg/grpc-rust)：セッション管理機能が未実装
* [rust-http2](https://github.com/stepancheg/rust-http2)：この状態からどうしろと・・・（ドキュメントが壊滅）

セッション管理ができて、暗号化・サーバの真正性検証ができるライブラリないかなー
とか探してたら、偶然見つけた。

# 上記すべての要件を満たすFW：[ACTIX](https://github.com/actix)

* ミドルウェアでセッション管理対応
* TLS対応
* HTTP/2対応
* 何よりも[ドキュメント](https://actix.rs/docs/)が豊富

これはいいぞ。

というわけでサクッとコードを[Web Application Server by Rust with actix-web](https://qiita.com/atsuk/items/c04fffe4ed0e73a67cd0)(@atsukさん)とか[公式](https://github.com/actix/examples/tree/master/tls/)からコピペしつつ、とりあえず動くものを作ってみた。

``` Rust
#![allow(unused_variables)]
extern crate actix;
extern crate actix_web;
extern crate openssl;

use actix_web::*;
use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod};

// リクエストハンドラ(リクエストが飛んできたときに処理するやつ)
fn index(info: Path<(u32, String)>) -> String {
    format!("Hello {}! id:{}", info.1, info.0)
}

fn main() {
    let sys = actix::System::new("http2_api-test");

    let mut builder = SslAcceptor::mozilla_intermediate(SslMethod::tls()).unwrap();
    builder.set_private_key_file("key.pem", SslFiletype::PEM).unwrap();
    builder.set_certificate_chain_file("cert.pem").unwrap();
    
    server::new(|| {
        App::new()
            // 直接来たらIDと名前を表示する。処理関数は↑の"index"
            .route("/{id}/{name}/index.html", http::Method::GET, index)
            // rootに来たらリダイレクトする。
            .resource("/", |r| r.method(http::Method::GET).f(|req| {
                HttpResponse::Found()
                    .header("LOCATION", "/0/anonymouse/index.html")
                    .finish()
                })
            )
    }).bind_ssl("127.0.0.1:8443", builder).unwrap().start();

    println!("Started http server: 127.0.0.1:8443");
    let _ = sys.run();
}
```

おもむろに
https://localhost:8443/
にアクセスすると
https://localhost:8443/0/anonymouse/index.html
にリダイレクトされる。

ﾔｯﾀｰ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30037/2b22412f-a22a-766f-0330-8e8b5935473c.png)

ｷﾀｰ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30037/5c785e7e-f090-645e-e15f-5fec43d4bdc2.png)

というわけで、レスポンスの構造体をProtocolBuffersとかmessagepackにしてやれば、バイナリな感じのAPIができて俺マジで幸せ。

ってなる。（気がする）

多分使うのはIDLからコード生成できるProtocolBuffers使う気がする。


んでは以上。
今更だけどDockerでJenkins構築するのにデータ永続化必須だよねって言ってほしかった

Docker覚えたての時、JenkinsとDockerって相性悪いと思っていた。
DockerでJenkins動かしたらコンテナ内にビルドしたモジュール取りに行くの大変じゃない？
そんな手間かけるくらいなら最初からJenkinsをローカルにインストールした方がはやくないない？って
そんなことなかった。盛大な勘違してた。

ちょっと感動したので、その時のメモ書き。

# DockerでJenkins構築するにはビルド結果のデータを永続化

* Dockerの永続化って、要はコンテナとローカルのフォルダを共有させること。
* コンテナ内のJenkinsの「/var/jenkins_home」中に成果物（ビルド結果）が入る。
  それをローカル「/home/java-user/jenkins-docker」に出力すれば良い。

```sh:Dockerでjenkinsを起動するコマンド
docker run -p 8080:8080 -p 50000:50000 -v /home/java-user/jenkins-docker:/var/jenkins_home jenkins
```

* Docker Composeで書くと以下のような形になる。docker-compose upで起動可能。

```yaml:docker-compose.yml
version: '3.3'

services:
  jenkins:
    image: jenkins:2.60.3
    ports:
      - '8080:8080'
      - '5000:5000'
    volumes:
      - /home/java-user/jenkins-docker:/var/jenkins_home
```

## 初回起動時の注意事項

* 初回インストール時は、インストールキーを入力必要なのでオプションdはつけない。

## よしビルドしてみよう！そしたらエラった

* Javaのブログラムでgradleでビルドしたとき、GitからCloneしたファイルのアクセス権ないよってエラーが出力された。

```
FATAL: command execution failed
java.io.IOException: Cannot run program "/var/jenkins_home/workspace/doma-sample/gradlew" (in directory "/var/jenkins_home/workspace/doma-sample"): error=13, Permission denied
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
	at hudson.Proc$LocalProc.<init>(Proc.java:245)
	at hudson.Proc$LocalProc.<init>(Proc.java:214)
	at hudson.Launcher$LocalLauncher.launch(Launcher.java:850)
	at hudson.Launcher$ProcStarter.start(Launcher.java:384)
	at hudson.Launcher$ProcStarter.join(Launcher.java:395)
	at hudson.plugins.gradle.Gradle.performTask(Gradle.java:333)
	at hudson.plugins.gradle.Gradle.perform(Gradle.java:225)
	at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
	at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:735)
	at hudson.model.Build$BuildExecution.build(Build.java:206)
	at hudson.model.Build$BuildExecution.doRun(Build.java:163)
	at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:490)
	at hudson.model.Run.execute(Run.java:1735)
	at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
	at hudson.model.ResourceController.execute(ResourceController.java:97)
	at hudson.model.Executor.run(Executor.java:405)
```

じゃあアクセス権付与すればよい。

```sh:シェルスクリプトに以下のように記載
cd /var/jenkins_home/workspace/doma-sample/
chmod +x gradlew
```

※　Jenkinsの設定イメージ

![build-gradle.png](https://qiita-image-store.s3.amazonaws.com/0/230829/697daab4-d596-6bca-0389-780e8c3d17a7.png)

無事、ビルドできました。あとはビルドしたファイルをローカルの環境で動かすだけ。
【RSpec】【CircleCI】はじめの一歩小さなサンプルメモ

# 前提

- Ruby
- RSpec
- CircleCI 1.0
- GitHub連携
- ビルドするまでの簡単小さなメモ。とりあえず動くとこまでで、パラメータは適当

# 手順サンプルメモ

## GitHubにリポジトリ作成

### ローカルにリポジトリ作成

```sh:command
% git init
```

### Gemfile

```sh:command
% bundle init
```

Gemfileができるので、rspec関連を追加

```ruby:Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"
gem 'rspec'
gem 'rspec_junit_formatter'
```

```sh:command
% bundle install
```

### RSpec関連
テストファイルなどは適当に準備する

```sh:command
★
% rspec --init 
% vim spec/person.rb ★テスト対象のクラスを作成
% vim spec/person_spec.rb ★テストファイルを作成
```

```ruby:person.rb
class Person
  attr_accessor :name
  def initialize
    @name = "kure"
  end
end

class Person2
  attr_accessor :name
  def initialize
    @name = "kure2"
  end
end
```

```ruby:person_spec.rb
require 'person'

RSpec.describe Person do

  it "name is kure" do
    person = Person.new
    expect(person.name).to eq("kure")
  end

  it "name is kure(subject)" do
    expect(subject.name).to eq("kure")
  end
end
```

#### 動作確認

テストが通ればOK

```sh
> bundle exec rspec
2 examples, 0 failures
```

### CircleCI関連

```sh:command
% mkdir .circle
% vim .circle/config.yml
```


適当に最小限

```yaml:config.yml
machine:
  timezone:
    Asia/Tokyo
  ruby:
    version: 2.4.0
test:
  post:
    - bundle exec rspec
```

準備できたらGitHubにpushしておく


## CircleCIに連携

- サインアップ
- 「ADD PROJECTS」
- 作成したGitHubのリポジトリを「Set Up Project」

うまくいけば↓の通りSuccessするかな

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/02f9fe8d-9a0d-9165-c4ce-c78b0ec7444c.png)
Management3.0の背景と、Management1.0/2.0/3.0の違いを自分なりに整理してみた

##はじめに
Management3.0 と Management2.0、Management2.0とManagement1.0の違いがわかったようでわからなかったので、一度整理してみた。
なお、以下は、あくまでも筆者個人の頭の整理をかねて書いたものである。公式の見解とは異なることを予めご承知おきたい。

##Management3.0の背景
おそらく以下の二つの問題意識から注目されているのだとおもう。
1. Agile界隈では、メンバが Self Management、Self organization をすることが、結局のところ Be Agile、かつ 高い Performanceを発揮するよねという共通理解に至った。その際、Managerの役割は今後どうなるのだろうか？
2. 一方、[一見幸せそうな女性が実は仕事を憎んでいる、幸せではない](https://qiita.com/warumonogakari/items/c65a23fa41b2633da7d4)という命題にたいし、では、この女性をどうやったら（仕事にたいしても）幸せにできるのか？

２は、いわゆる働き方改革方面の 従業員満足度や生産性向上 のひとつのカギとみてよいのだろう。

##Management3.0とは、Management1.0/2.0/3.0の違い
Management3.0では、Managementの在り方を発展段階説のようにとらえている。
定義は 本家のサイトにあるのでそれを参照していただきたいのだが、ここでは表にして整理してみる。横軸順に、組織・成員の状態、そのための構造、各々の役割 といった順にならべてみた。

|   |組織perforamance状態|Memberの幸福|Management構造|Managerの役割|Memberの役割|
|:---|:---|:---|:----|:--------------------|:----|
|Management1.0|変化がなく単純繰り返し作業なら高い|Don't care.どうでもよい|階層構造|権威主義前提（＝ManagerはMemberより偉い）、MemberをManageする|言われたことを言われたとおりに|
|Management2.0|変化が多く創造的な業務でも高いperformaceを発揮することをめざす|従業員満足度調査で検証するなどMemberの満足は大事だが、幸せは実は別にあることも|状況に応じ最適なものを叫ばれているが、いざとなると実態は階層構造だったりする|Servent Leadershipが叫ばれているが、権威主義ものこっている。Member各々をManageし個々が高い成果を発揮すればよいと考える|   あるときは言われたとおりに、あるときには自己組織化・Self Management|
|Management3.0|変化が多く創造的な業務でも高いperformaceを発揮することをめざす|Memberが仕事に対しても幸せになれるように目指す|状況に応じて最適なものに|組織performanceとMemberの幸福をあげるためにSystem（仕掛け）をつくってManageする、これが唯一の役割。|自己組織化・Self Management|

組織・成員の状態が目的、そのための構造・各々の役割が手段となる。
こうやってみると、Management3.0と 2.0では、目指す目的は同じだけど、最大の違いは手段で、 Memberも Manageするか(2.0)、Systemを Manageするか(3.0)にある。
手段実現の過程で、従来の Memberを Manageすることにこだわり Memberの幸福を忘れてしまう、あるいはせいぜいマズロー欲求５段階説でいう社会的欲求でとどまってしまうのが Management2.0、逆に Systemを Manageするための設計検討の結果、階層構造で Member を Manage することが、組織performaceにとってもMemberの幸福にとってもベストと判断される場合は Management3.0といってよい。[^1] 

##おわりに
我々プログラマの間では「Bugを憎んで人を憎まず」ということわざがあるが、Management3.0では 望ましくない状態を System bug ととらえ Managerおよび Memberのせいにはしないと考えると、わかりやすいかもしれない。
筆者は、Management自体が実は engineering そのものととらえているが、Management3.0でも同じことをいっているととらえている。

[^1]: たとえば交渉人一人とその他一人の会社の場合、[その他の一人がその交渉人一人のManageをおこなった](https://ja.wikipedia.org/wiki/THE_%E3%83%93%E3%83%83%E3%82%B0%E3%82%AA%E3%83%BC)方がいい
Windowsのコマンドでファイルを結合する

Linuxではコマンドで簡単にファイルを結合（マージ）できますが、Windowsのコマンドで結合する方法は知らなかったので備忘録として記事にしました。

ファイルの結合は`copy`コマンドで行いますが、ポイントは`/b`オプションを付与することです。

**`/b`はバイナリファイルとして扱うためのオプションですが、テキストファイルの結合にもこのオプションを付与することで、文字コードや改行コードが弄られることなく結合することが可能です。**

### 1. ディレクトリ配下の１つのファイルに結合するコマンド
`*`が利用できるので、複数のファイルを結合する際に利用しましょう。

```console:ディレクトリ配下の１つのファイルに結合する
C:\tmp>copy /b C:\tmp\data\*.txt C:\tmp\all.txt
C:\tmp\data\A.txt
C:\tmp\data\B.txt
C:\tmp\data\C.txt
        1 個のファイルをコピーしました。

C:\tmp>
```

### 2. 指定したファイルを１つのファイルに結合するコマンド
`+`で結合したいファイルを１つづつ指定します。

```console:指定したファイルを１つのファイルに結合する
C:\tmp>copy /b A.txt + B.txt + C.txt ABC.txt
A.txt
B.txt
C.txt
        1 個のファイルをコピーしました。

C:\tmp>
```
XMLHttpRequestを使う

#はじめに
FirefoxのaddonからHTTPのリクエストでデータを送信します。

#XMLHttpRequestを使ったサンプル

* XMLHttpRequestを使うとリクエストを送信できます。
* Query parameter で渡す値は encodeURIComponent で encode します


```javascript:background.js
browser.contextMenus.create({
    id: "name",
    title: "get name",
    contexts: ["selection"],
});

var name = "blue";
getting = browser.storage.local.get("name", function (value) {
    name = value.name;
});

browser.contextMenus.onClicked.addListener((info, tab) => {
    getting = browser.storage.local.get("name", function (value) {
        name = value.name;
    });

    if (info.menuItemId === "name") {
        url= "http://sample/?arg0=" + name;
        doGet(url);
    }
}

function doGet(url) {
	console.log(url);
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.onload = () => {
      console.log(xhr.status);
    };
    xhr.onerror = () => {
      console.log(xhr.status);
      console.log("error!");
    };
    xhr.send();
}
```

#サーブレットでのデータ受け取り

GETのqueryパラメータで値を取得します。

* UTF-8で URLEncode した parameterを取得します。
* Access-Control-Allow-Origin: * のヘッダーを指定します。
 
```java:doGet
protected void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	try {
		request.setCharacterEncoding("UTF-8");
		response.setHeader("Access-Control-Allow-Origin", "*");
		response.setContentType("text/html; charset=UTF-8");
	} catch (UnsupportedEncodingException e1) {}
	
	String arg0 = request.getParameter("arg0"); 
	// encoding が動作しなかった時用
	String query = request.getQueryString();
	if (query.indexOf("arg0=")>0) {
		arg0 = query.substring(query.indexOf("arg0=")+5);
		arg0 = URLDecoder.decode(arg0, "UTF-8");
	}
	// 省略
}
```

# Access-Control-Allow-Originについて
Access-Control-Allow-Origin がないと Firefoxの console に以下のメッセージがでます。

* エラーは出てますがサーバー側ではリクエストは受け付けられ処理されます。
* エラーは応答メッセージを処理しないことを示しているようです。


```text:console
クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、
http://sample/?arg0=name にあるリモートリソースの読み込みは拒否されます 
(理由: CORS ヘッダー ‘Access-Control-Allow-Origin’ が足りない)。
```

#参考
https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest
https://developer.mozilla.org/ja/docs/Web/HTTP/HTTP_access_control
Pickleされたデータをテキストファイルに出力する

Python初心者の僕が

先輩のご指導のもと、辞書データからpickleで取り出したデータをそのままテキストファイルに書き込もうとしたら失敗した。
対象データは[DBLP](http://dblp.uni-trier.de/)の学会、著者データ

```python
dic_author = pickle.load(open('dblp_4area_coauthor.dic'))#辞書データからpickle
f = open('A*Amat.txt','w')#書き出しファイル宣言
f.write(author_venue)#書き込み
---------------------------------------------------------------------------
TypeError                         Traceback (most recent call last)
<ipython-input-30-e02e9c0a5373> in <module>()
----> 1 f.write(author_venue)

TypeError: expected a string or other character buffer object
```

# そもそもpickleとは

【参考サイト】

[Python 公式ドキュメント 11.1. pickle]
(https://docs.python.jp/2/library/pickle.html)
[開発効率をあげる！Pythonでpickleを使う方法【初心者向け】](https://techacademy.jp/magazine/15826)
[[python]オブジェクトのピクル(pickle)化](http://dackdive.hateblo.jp/entry/2014/09/16/112404)
 
> **pickle**
 動詞 他動詞
〈野菜などを〉塩水[酢]に漬ける.

簡単に説明するとpickleを行うことで複数のオブジェクトをひとまとまりにしたり、そのまとまりを読み込むことができる。
ちなみに読み方はピクル、ピッケルじゃないよ！

pickleすごい…！
データをオブジェクトごと保存できるのか。
つまり今回の問題はpickleで保存しておいた辞書データの書き込みができていなかったという問題であった

辞書もpikleも知らない結果である。

# 辞書データを書き出す
pythonで利用される辞書型
簡潔にいうとkeyとvalueを持つデータ型
ハッシュで保存されているため要素の検索がO(1)であるとか。

【参考サイト】
[【Python入門】dictionary（辞書）型の要素を検索、追加、削除する方法](https://www.sejuku.net/blog/24122)

たしかに、そのまま書き込もうとしてもできるわけがなかった。

というわけで、forループを回した

辞書型のkeyのみを出力する場合は
in hogehoge.keys() とすればよい。

```python
f = open('Vlist_key.txt','w')
for k in dic_venue.keys():
    f.write(venue+'\n')
f.close()
```

keyとvalueをどちらも出力する場合は、hogehoge.items()としてかつ、変数を２つ用意する。

```python
f = open('Vlist_key.txt','w')
for k,v in dic_venue.items():
    f.write(k+','+str(v)+'\n')
f.close()
```
結果

```terminal
$ cat Vlist_items.txt 
JCDL,2
SIGMOD conference,16
:
PODS,17
SIGIR,0
PKDD,14
```

しらべていたらどうやらjsonだともっと簡単に簡単にできるみたい。
#辞書型データをJSONファイルに書き込む


```python
import json
file = open("venuelist.json", 'w')
json.dump(dic_venue, file)
file1.close()
```

結果

```terminal
$ cat venuelist.json 
{"JCDL": 2, "SIGMOD conference": 16, "PAKDD": 12, "COLT": 9, "ICML": 6, "ECDL": 3, "NIPS": 5, "TREC": 1, "KDD": 10, "VLDB": 15, "ICDM": 11, "UAI": 7, "ECIR": 4, "ECML": 8, "ICDT": 19, "SDM": 13, "EDBT": 18, "PODS": 17, "SIGIR": 0, "PKDD": 14}
```

# まとめ
pickleと辞書型は便利
【R】変数名に値を代入する（ディレクトリ内のcsvファイルをまとめて読み込み）

### 参照

ググってたら以下のサイトが出てきたので、参照にして書きました。

[Rで他言語みたいに変数名を変えながらfor文とかでつまったこと](https://futabooo.hatenablog.com/entry/20110910/1315634652)

### 結論

assign()を使うことで、```x <- hoge```ではない方法でオブジェクトに値を代入できる。

```assign(x, 'hoge')```

### 利用例

これでfor文を回して、あれこれできる。
例えば、readr::read_csv()で一気にデータを読み取りたいとき

```{r}
files <- list.files()  # カレントディレクトリ下のファイル名を取得（全てcsvファイルとする）
for (i in 1:length(files)){
    assign(str_sub(as.character(files[i]),end=-5), read_csv(files[i]))
}
# str_sub()しているのは、.csvを排除したファイル名を変数名にしたいため
```

### まとめ

assign()を知っていると色々捗って便利！

（Pythonでも上と同じことをやりたいんですけど、上手い方法あるんですかね）
vSphere HA 隔離アドレスへアクセスできないときの対処法

## **概要**
クローズド環境にてクラスタのvSphere HAを有効にしたとき、クラスタに参加している全てのESXiホストに「隔離アドレスへアクセスできません」というエラーが表示される。

### **原因**
vSphere HAを有効にすると、デフォルトゲートウェイのIPアドレスが隔離アドレスとしてデフォルトで指定されている。
今回構築した環境はクローズドであり、デフォルトゲートウェイが存在していなかったため、ESXiホストが隔離されていると判断され、上記のようなエラーが発生したと考えられた。
※隔離アドレスとは?
ESXiホスト自身がネットワークから隔離されているかどうか判断するためにpingを送信するアドレスのこと

##**対処方法**
- デフォルトゲートウェイを隔離アドレスとして指定されないようにする。
- 隔離アドレスをデフォルトゲートウェイではなく、他のアドレスに指定する。

###**変更内容**
クラスタのvSphere HAの編集画面にて詳細オプションを追加する必要がある。
追加するオプションは以下2つ。
**・das.isolationaddressX IPアドレス**
　隔離アドレスをデフォルトゲートウェイアドレスから他のアドレスに変更する。
　X部分は0から9までの数字が入り、最大10個のIPアドレスを指定できる。
**・das.usedefaultisolationaddress false**
　デフォルトゲートウェイを隔離アドレスとして使用しないようにする。

※その他オプション等の詳細は以下のURLを参照。
[vSphere HA詳細オプション](https://docs.vmware.com/jp/VMware-vSphere/6.5/com.vmware.vsphere.avail.doc/GUID-E0161CB5-BD3F-425F-A7E0-BF83B005FECA.html)

###**変更方法**
１．クラスタを選択後、「Configuration」タブのvSphere HAから編集を行う。
![pic](https://drive.google.com/uc?export=view&id=1EsoL4FPR48Z_835JSxTiZSIkttxk7qzQ)

２．詳細オプションの項目で上記2つのオプションと値を追加する。
![alt](https://drive.google.com/uc?export=view&id=1VamTtR9PEPHCKGEepZie2jlPeJ7n8dXT)


３．項目ごとに追加ボタンをクリックし、設定パラメータと値を入力する。

設定を保存してもエラーが解消されない場合は、一度vSphere HAをオフにしてからオンに切り替えると警告は表示されなくなる。


-----------
**追記**
vSphere HAは、隔離アドレスへアクセスできない状態のとき、ESXiホストやネットワークにアクセス障害が発生しても、ホスト上のVMはHAが発動しないため注意。

クローズド環境で障害テストを実施するときは気を付けてください。
Flaskメモ

DockerでFlask環境を作成などのメモ。

参考
https://qiita.com/nanakenashi/items/cbe8e8ef878121638514
https://a2c.bitbucket.io/flask/quickstart.html#http

#Dockerfile
```:Dockerfile
# ベースイメージの指定
FROM python:3

# ソースを置くディレクトリを変数として格納                                                  
ARG project_dir=/flask/
ARG gcloud_dir=/gcloud/

# 必要なファイルをローカルからコンテナにコピー
ADD requirements.txt $project_dir
ADD hello.py $project_dir

# requirements.txtに記載されたパッケージをインストール                         
WORKDIR $project_dir
RUN pip install -r requirements.txt

# （コンテナ内で作業する場合）必要なパッケージをインストール
RUN apt-get -y update
RUN apt-get -y install vim git tar wget tmux tig

# gcloudのインストール
WORKDIR $gcloud_dir
RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-192.0.0-linux-x86_64.tar.gz?hl=ja
RUN tar -zxvf google-cloud-sdk-192.0.0-linux-x86_64.tar.gz?hl=ja 
WORKDIR $project_dir
```

```:requirements.txt
click==6.6
Flask==0.11.1
itsdangerous==0.24
Jinja2==2.8
MarkupSafe==0.23
Werkzeug==0.11.10
```

```python:hello.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    name = "Hello World"
    return name

@app.route('/good')
def good():
    name = "Good"
    return name

##server run
if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=5000)
```


#イメージの作成、コンテナの起動
flaskという名称のDockerイメージをビルド。

```:Dockerイメージ作成
docker build -t flask . 
```
flaskイメージから、flask_webという名称のコンテナを起動する。

```:コンテナ起動
docker run -d --name flask_web -p 5000:5000 -v `pwd`:/flask flask python hello.py
```

#flaskメモ
##外部ネットワークからのアクセス
runメソッドの中で以下指定する。

```:runメソッド
app.run(host='0.0.0.0')
```

##デバッグモード
コード修正した際に自動でリロードしてくれるらしい。
runメソッドの中で以下指定する。

```:runメソッド
app.run(debug=True)
```

#mongodb→pandasの中身表示

```python:runメソッド
import pandas as pd
from pymongo import MongoClient

@app.route('/')
def 関数():
    client = MongoClient('host', port)
    collection = client.データベース.コレクション

    mongo = collection.find({条件})

    df = pd.DataFrame(list(mongo))

    return df.to_html(classes='test')
```
Chefのnot_if, only_ifはor条件。ではand条件でスキップさせたい場合にはどう書くか。



Chefのリソースに複数のnot_ifやonly_ifがあった場合、それらは全てor条件で判断され、一つでも合致すると実行されない。

#ブロック書式

##OR条件の例
```ruby:

execute '/usr/local/bin/foo' do

  ...  

  not_if { File.file?('/tmp/bar') }
  not_if { File.file?('/tmp/baz') }
end

```
この場合、一つでも対象ファイルがあるとスキップされる

##AND条件の例
ではand条件は？
これは単にブロック内でand条件を使えば実現可能。

```ruby:
...
  not_if { 
    File.file?('/tmp/bar') &&
    File.file?('/tmp/baz') 
  }
...
```
この場合、両方のファイルがあるときのみスキップされる

#文字列書式
only_ifやnot_ifは、文字列を指定することもでき、その場合、その内容を実行した戻り値が判断に使用される。

##OR条件の例
```ruby:
...  
  not_if 'test -f /tmp/bar'
  not_if 'test -f /tmp/baz'
...
```

同様に、一つでも対象ファイルがあるとスキップされる。

##AND条件の例

さて、この場合のandはどの様に表すか。。。

```ruby:
  not_if '
    test -f /tmp/bar &&
    test -f /tmp/baz
  '
```


これで行けますね。

#備忘

文字列書式はsystem()でブロック書式に書き換え可能

```ruby:
  # これらは同じ意味
  not_if 'test -f /tmp/bar'
  not_if { system('test -f /tmp/bar') }
```





#参照


- [ChefTips: only_if, not_if は複数使える](https://qiita.com/kentarok/items/a08e9d8ac844ce5b3926)
- [Chef の only_if / not_if でハマった。](https://qiita.com/kizashi1122/items/b68a0badab7056f89e71)
- [Chef実践入門 ~コードによるインフラ構成の自動化](https://www.amazon.co.jp/Chef実践入門-コードによるインフラ構成の自動化-WEB-PRESS-plus/dp/477416500X)
- [execute](https://docs.chef.io/resource_execute.html)
    - not_ifなどのGuardsは、:userや:environmentなどを指定可能
railsアプリをherokuに上げてJSが動かないけどassets precompile以外が原因だった話

##起こったこと

ローカルで動くjqueryが、herokuにあげると動かなくなる。（モーダルが出ない）
ググってアセットプレコンパイル周りが怪しいと言われるが、
それらをいじっても解決しない。


##原因と解決策
application.jsの中で
jqueryを先に読み込まないとダメだった。


修正前（下3行を上に持ってきた。）

```javascript
// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's
// vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file. JavaScript code in this file should be added after the last require_* statement.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require_tree .
ここから下3行を
//= require jquery3
//= require popper
//= require bootstrap-sprockets
```

修正後

```javascript

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's
// vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file. JavaScript code in this file should be added after the last require_* statement.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.
//
ここに入れた
//= require jquery3
//= require popper
//= require bootstrap-sprockets
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require_tree .
```

herokuにデプロイし直して無事完了。
認証と認可

「認証と認可ってごっちゃになるんだよな」に対する説明用ポエム。ざっくりイメージを掴むの向け。

# 認証
ある個人を特定すること。
「Aさんですね？」

# 認可
行動やリソースの使用を許可すること。
「伺っております。奥へどうぞ」

もともと 認可 = 認証 で長いこと来ていた。

# 認証 = 認可 の時代
認可は「玄関を開けて中へ入る」ことに例えることができる。
「鍵」を持っている人間は「玄関を開けて中へ入る」ことができる。これは明らかに行動の許可。なので、認可だ。
(この「鍵」とはつまりIDとパスワード、またはそれに類するもろもろのことだ)
周囲の知らない人間からすれば、家の鍵を開けて入る人間はまあその家の人間だろう、としか思われない。これが 認可 = 認証 の時代である。

しかし、様々なサービスが普及するとこの「鍵」が増えすぎるという事態が発生した。鍵束がジャラジャラして邪魔になったようなものである。
単に邪魔なだけならまだしも、管理が行き届かなくなるのは自明である。
また横着して同じ「鍵」を使い回すことも行われるようになった。これはセキュリティ上問題である。

ここで認証と認可を切り離す需要が生まれた。

# 認証 ≠ 認可の時代
認可と切り離された認証は、つまり身分証明である。
ある信頼できそうな発行元によって「これはこの人である」という確認を受け、その旨証明書を発行してもらう。
(これは「IDトークン」なんて名前で呼ばれる)

実際にサービスを利用するときは「身分証明書」を提示するだけでよい。あとはサービスの提供者が発行元に連絡を取るなりなんなりして確認してくれる。
本物だと確認されれば、その個人に対して認可されるべき全てのサービス/リソースへとアクセスできる。

この仕組はまさに身分証明書そのもので、マイナンバーカードやパスポート、免許証などは政府によって個人が認証された結果、その証明として発行されたものであるということが出来る。
こう言えば、認証と認可の違いも、ごっちゃにするとどう危険なのかもなんとなく想像できるだろう。

するとどうなるか。こんなイメージになる。
玄関に鍵穴はなく、駅改札のような非接触読み取り機がある。IC付きのマイナンバーカードをそこにタッチすると情報が読み取られ、宅内有線とインターネットを経由して認証局へ問い合わせる。
無事認証が成功するとドアが開き、機械はこう言う。
「認証に成功しました。ロックを解放します。おかえりなさい、XX様」

## むすび
ネットの世界では、今のところ「国」というものが身分証明をしているわけではない (そういう国がないわけではないが) 。
そのかわり、現在強力なサービスを展開している企業群、すなわち Google や facebook や twitter 、その他各種大物たちが「認証 ≒ 身分証明を代行するよ」、と名乗りを上げた。
……というと語弊があるが、世に数多ある「Google アカウントでログイン」だの「facebook アカウントでログイン」だの「twitter アカウントでログイン」だのの正体は概ねこういうことであり、OpenID Connect だのなんだのという「外部に認証してもらう」システムはこのためにある。