OmniAICreator/Qiita-1.07M huggingface dataset:
NiftyNetで3D U-Netを実装する

前回の記事でNiftyNetで3次元セグメンテーションを実装しました。
https://qiita.com/takeajioka/items/2a128639dde4c5c97b67
前回はDenseVnetというネットワークを用いましたが、今回はより有名な3D U-Netで実装します。
データセットは前回と同じKaggleのElectron Microscopy 3D Segmentationを用いました。

##3D U-Netの概要
U-Netは比較的少ない教師データで精度よく学習できると言われています。
https://lmb.informatik.uni-freiburg.de/Publications/2016/CABR16/
論文を読むとわかる通り、**inputデータのサイズとoutputデータのサイズが一致していない**ということがわかります。
niftyNetではこのネットワーク構造を忠実に再現して使うため、window sizeを決めるときに注意しなければなりません。

##実装する
3D U-Netのconfigは以下のようになりました。
参考にしたコードなど：https://cmiclab.cs.ucl.ac.uk/CMIC/NiftyNet/blob/dev/config/unet_config.ini
https://github.com/NifTK/NiftyNet/issues/17
https://stackoverflow.com/questions/46831160/niftynet-indices-are-out-of-bounds-error

```
############################ input configuration sections
[EM]
path_to_search = ./data/EM3D/
filename_contains = input
spatial_window_size = (96, 96, 96)

[label]
path_to_search = ./data/EM3D/
filename_contains = groundtruth
spatial_window_size = (8, 8, 8)

############################## system configuration sections
[SYSTEM]
cuda_devices = ""
num_threads = 1
num_gpus = 1
model_dir = models/EM3D/

[NETWORK]
name = unet
activation_function = prelu
batch_size = 1
decay = 0
reg_type = L2
volume_padding_size = 44
queue_length = 1
window_sampling = uniform

[TRAINING]
optimiser = adam
sample_per_volume = 1
lr = 0.01
loss_type = CrossEntropy
starting_iter = 0
save_every_n = 100
max_iter = 100

[INFERENCE]
border = (44, 44, 44)
save_seg_dir = ./segmentation_output/

############################ custom configuration sections
[SEGMENTATION]
image = EM
label = label
label_normalisation = False
output_prob = False
num_classes = 2
```

重要な点は、
1.spatial_window_sizeをoutputでは`input - 88`にする。
2.Volume paddingを44に設定する。
3.borderも44に設定する。
という点です。
この設定が3D U-Netには必要で、これをしないとエラーになりました。
パラメータの意味は以下に説明があります。
https://niftynet.readthedocs.io/en/dev/window_sizes.html

またWindows sizeが小さいですが、GPUメモリの都合上これが上限です。
Windows sizeをこれ以上小さくすることも出来ないので、３D U-Netには8GB以上のGPUが必要だとわかりました。

ちなみに通常の2次元でのU-NetもNiftyNetで実装することが出来て、configファイルは以下が参考になります。
https://miccai-sb.github.io/materials/U-Net_Demo.html

実行コマンドは以下です。

```
net_segment train -c <configファイルのパス>
net_segment inference -c <configファイルのパス>
```
inferenceの方はものすごく時間がかかりました。(spatial_window_sizeが(8, 8, 8)で小さなタイルで全体を処理をするため。)

##感想
volume_paddingをしないといけない点がとても気になります。
対策として、niftynetパッケージのpyファイルを編集することでvolume_paddingをしないようにすることも一応は可能のようです。
また、V-netなどの他のネットワークではvolume_paddingは必要ないのでそっちを使う手もあります。

niftynet以外では、kerasなどでも３D U-Netを実装したものはもちろんあるようです。
(https://github.com/ellisdg/3DUnetCNN)
データ元のKaggleページのKernelsにはconxを用いたU-Netの可視化方法も解説されているので参考にしたいです。
またimageJプラグインのU-Netでは電子顕微鏡モデルのfine-tuningを行うことができるのでそれを利用する方法もよいと思います。(プラグインの利用方法は過去の記事を参照https://qiita.com/takeajioka/items/ad13fa0ed19aea48ec2b)
サービスコンピューティング

こんにちは、(株)日立製作所 研究開発グループ [サービスコンピューティング研究部](https://qiita.com/organizations/hitachi-services-computing)の木下です。

私達の研究部ではサービスコンピューティングという研究分野を対象とした技術を研究開発しています。本投稿ではサービスコンピューティングとは何か、私達がどう捉えているか、についてご紹介します。

### サービスコンピューティングとは
　Google等でサービスコンピューティングを検索すると以下の文献がヒットすると思います。サービスコンピューティングとは、様々なITサービスを用いてビジネスとしてのサービスを実現するための技術や方法論を検討する研究分野と定義されています。英語ではServices Computingです（Serviceが複数形です）。この定義を聞いてSOA（Service-Oriented Architecture）やSoS（System of Systems）を思い浮かべる方もいらっしゃるのではないでしょうか。実際サービスコンピューティングはSOA等が盛んに議論された頃に始まった研究分野のようです。サービスコンピューティングでは、これらSOAやSoSといったアーキテクチャを踏まえ、様々なITサービスをAPIを介して疎結合で連携させて新しいサービスを実現することを想定しています。詳細な定義は以下の参考文献を参照してください。

- [Wikipedia - Services Computing](https://en.wikipedia.org/wiki/Services_computing)
- [IBM Research - Services Computing](https://researcher.watson.ibm.com/researcher/view_group.php?id=152)
- [IEEE - Services Computing](http://tab.computer.org/tcsvc/)
- [電子情報通信学会 - サービスコンピューティング研究会](https://sig-sc.org/)

### 世の中の変化
　このようなサービスコンピューティングの考え方は、Webサービスが普及し、様々なWebサービスを活用する今となっては当たり前になりました。しかし、基盤となる技術や方法論は日々変遷あるいは進化しています。そのため、サービスコンピューティングにおける研究内容も変わってきているように思います。
　例えばサービスの創生においては、単独一社での創生から、協創やオープンイノベーションに変わってきました。サービスのアーキテクチャにおいてはマイクロサービスやサーバーレスが、サービスの開発においてはDevOpsが普及しています。サービスの開発においてはまた、データと機械学習を用いることが欠かせなくなっており、サービスを継続的に改善する上でDataOpsやMLOpsを開発・改善プロセスに取り込むことが必要となっています。サービスの運用管理においても、データと機械学習を用いるAIOpsが進展してきました。サービス間連携においては、これまでのAPIを介したAPIエコノミーだけでなく、価値を流通させるトークンエコノミーが進展しています。

- [Wikipedia - AIOps](https://en.wikipedia.org/wiki/IT_operations_analytics#AIOps)
- [Wikipedia - DataOps](https://en.wikipedia.org/wiki/DataOps)
- [Wikipedia - MLOps](https://en.wikipedia.org/wiki/MLOps)

### 私達の取り組み
　私達は、これら日々進化する基盤技術や方法論を踏まえ、様々なWebサービスを活用して新しいサービスを効率的に実現することをサービスコンピューティングの目的と捉え、改めて研究として取り組んでいます。研究のスコープは、サービスの創生からアーキテクチャ、開発、運用管理、サービス間連携といったサービスのライフサイクル全体です。
　研究部の取り組みとして電子情報通信学会のサービスコンピューティング研究会に参画しています。次回の第33回サービスコンピューティング研究会は2020年3月16日に日立製作所中央研究所の協創棟で開催予定です。私達の研究部からも多数発表を行う予定です。ちなみに協創棟は、顧客協創を目的として2019年4月にオープンしたばかりの研究棟です。興味のある方は是非参加して下さい。

- [第33回：機械学習工学とサービスコンピューティングおよび一般](https://www.ieice.org/ken/form/index.php?tgs_regid=9a6809ce4d3b9e88f768fa5554056f0b9b9ecea6ce6683acec8df0643ccd18fd&cmd=info&lang=)

中央研究所：　https://goo.gl/maps/KpybA6JU1MwZNvmN6
![_K2P8609.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492068/26424645-4ef7-b7ad-4b91-662104ea8c2a.jpeg)

協創棟：　上の写真の真ん中あたりにX字っぽい建物がありますが、その左側の建物です。
![_R3M3479.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492068/c4ced5c0-581b-a2c9-96c0-ce6794bf953b.jpeg)

会場：　レイアウトは変わります。
![02_kystprm_22APR19_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492068/699db4a6-e834-bfc6-b6af-baa5643c1fbf.jpeg)
【初心者向け】Rubyで超簡単な本紹介アプリを作ってみる

#Rubyでめっちゃ簡単な本紹介アプリを作る

#条件
　・本のタイトルを登録
　・本の著者を登録
　・本のカテゴリーを登録
　・最後に登録した上記3つを表示させる

#擬似コードを書く

```
puts "本の名前を登録"
    タイトルを入力
puts "著者を登録"
    著者を入力
puts "本のカテゴリを入力してください"
    カテゴリを入力

puts "以下の通り登録しました"
puts "本の名前はタイトル名"
puts "著者の名前は著者名"
puts "カテゴリはカテゴリ名"
```

#コーディングしていく

```
puts "本の名前を登録"
    title= gets.chomp
puts "著者を登録"
    author = gets.chomp
puts "本のカテゴリを入力してください"
    category = gets.chomp

puts "以下の通り登録しました"
puts "本の名前は「#{title}」"
puts "著者の名前は「#{author}」"
puts "カテゴリは「#{category}」"

```

※注意点
　gets.chomp　→　改行しない
　gets.to_s　　 →　改行される

私も後で気づきました・・・参考にした記事
https://qiita.com/Take-st/items/26f29a6dea622d1e7e8d

#動作確認

```
本の名前を登録
Fact Fulness
著者を登録
ハンス・ロスリング
本のカテゴリを入力してください
教養
以下の通り登録しました
本の名前は「Fact Fulness」
著者の名前は「ハンス・ロスリング」
カテゴリは「教養」
```

putsばかり使ってしまってるので、次は、配列使って応用化していきたいですね。
以上となります。

間違い等ございましたらご指摘いただけますと幸いです。
クラスまとめ①

##【クラスとは】
→もの一般に関するデータ(変数)と機能(メソッド)をまとめたもの
→あくまでも設計書としての抽象的なもの

```
//クラス定義
class クラス名{
メンバ;
}
```


##【オブジェクト】
→クラスを基にした具体化
→一つのクラスからオブジェクトはいくらでも作成可能
→オブジェクトはクラス型の変数(参照型変数)

```
//オブジェクト化
クラス名 オブジェクト名 = new クラス名();

//メンバの利用
オブジェクト名.フィールド = 値;
オブジェクト名.メソッド();
```

##【メソッド】
→メソッドは処理をまとめたもので、呼び出すとその処理を実行

```
void メソッド名(){処理}
```

→同クラス内のメソッドAからメソッドBを呼び出すことも可能

```
class test{
void メソッドA(){}
void メソッドB(){this.メソッドA();}
}
```

※同クラス内のとき変数やメソッドを呼び出すとき```this.メンバ名;```とthisをつける
→メソッド()内に引数という変数を記述でき、その変数を処理に利用可能(引数はいくらでも定義可能)

```
void メソッド名(型名　引数1, 型名　引数2){}
```

→引数とは逆にメソッドから返される情報を戻り値という
※returnを使うことで一つだけ戻り値を返せる
※戻り値を使うときは戻り値の型を定義する必要あり
※voidは型指定なしを意味する

```
戻り値型 メソッド名(){
return 戻り値;
}
```
【Rails】ローカル環境構築であのホーム画面表示に辿り着いたのでメモとして残します(mac)

# はじめに
~~解説が不足した雑な~~備忘録です。
ローカルの構築でいろいろ苦戦してましたが一応目標のホーム画面が確認できたので手順残しておきます😅

# 過去の失敗と環境の変更点
構築で引っかかっていたところは主に以下のところ

```
$ bundle install
$ bundle exec rake db:create
```
＜対応（失敗）＞
① サーバ起動 $ sudo mysql.server start (停止も含む)
② database.yml での password 設定
③ mysqlに権限付与


##環境
OS               : Mac OS Catalina 10.15.1
Ruby            : v 2.6.3p62
Rails             : ~~v 6.0.1~~　→　<font color="Red">Rails : v5.2.4.1に変更</font>
Homebrew : v 2.1.16
Bundle        : v 1.17.2
~~MySQL       : v 8.0.18 for osx10.15 on x86_64 (Homebrewからのデフォルト)~~　↓
<font color="Red">psql (PostgreSQL) : 12.1　に変更
</font>

#具体的な対処法
① rails5.2.4をインストール（6.0.1が入っていても）
② gemを入れたのでrbenv(rubyのバージョンを切り替えてくれるツール)のフォルダ下のshims(コマンドirb, gem, rake, rails, ruby,etc...を振り分けてくれるフォルダ)更新。
③ `rails5.2.4指定`+　minitestカット　＋　[CoffeeScriptカット](https://fukatsu.tech/rails-coffee-script)
④　db作成＆rails s（server）、ここでダメならポスグレ再起動等+マイグレーション(適正化)して再度サーバ起動

　
フォルダ内容等分かりやすかったご参考先↓↓↓
[rbenvの使い方と仕組みについて](https://qiita.com/Kodak_tmo/items/73147ed4f0eec54d6e94)

```
$ sudo gem install rails:5.2.4
$ sudo rbenv rehash
$ rails _5.2.4_ new sample_app -d postgresql -T --skip-coffee
$ cd sample_app/
$ bundle install
$ brew install postgresql
$ bundle install
$ rails db:create
$ rails s
$ brew services start postgresql
$ brew services stop postgresql
$ brew services restart postgresql
$ bin/rake db:migrate
$ rails s
```
　
urlへ接続

---
http://localhost:3000/
---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434223/db6a68d8-75bd-6b9f-8beb-de0f5b8b32f1.png)



#終わりに
もっとスムーズにいく方法もあるかとは思いますが、筆者の場合このような流れでした。
不足、訂正等ありましたらご指摘いただければ幸いです。
こんな記事の中最後までお読みいただきありがとうございました:bow_tone1:
AzureのマネージドサービスにSSL証明書を設置するためにpfxファイルを作成する

Azureの、例えばApplicationGatewayのようなサービスにSSL証明書を設置するには、pfx形式のファイルを作成しないといけません。

以下のコマンドで、pfxファイルを作ることができます。

```
$ openssl pkcs12 -export -inkey <秘密鍵ファイル名> -in <SSLサーバ証明書ファイル名> -out <任意のpfxファイル名>
```

参考
https://knowledge.digicert.com/ja/jp/solution/SO23603.html
【Metabaseチュートリアル】Questionのデータをダウンロードしてみよう

[< 前(ビジュアライゼーションを理解しよう)](https://qiita.com/k_0120/items/71b536a48b5b959fcd2d)

# このチュートリアルで理解できること

- NativeQueryで作成したQuetionのデータをダウンロードするやり方について

# ダウンロードできる形式

- 2020年1月6日現在、`Excel` `Csv` `Json`の3形式でQuestionのデータをダウンロードすることができます。
- 日本語が含まれるデータを`Csv`形式でダウンロードする場合、文字化けが発生するため、`Excel`形式でのダウンロードをオススメします。

# ダウンロードのやり方

- 下記画像の赤枠のアイコンをクリックすると、ダウンロード形式を選択するメニューが表示されます。
- ダウンロードしたい形式をクリックすることで、データをダウンロードすることができます。

![FireShot Capture 426 - 質問 · Metabase - datasheet.hana-yume.net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311026/a8823448-1b72-4d0c-b396-4105ac5266c5.png)
useEffect を componentDidMount と componentWillUnmount のタイミングだけ実行する

# 解決策
`useEffect` の第2引数に空配列を指定すれば良い。

```
useEffect(() => {}, []);
```

# 詳細
https://ja.reactjs.org/docs/hooks-reference.html#conditionally-firing-an-effect
> 空の配列 [] を渡すと、この副作用がコンポーネント内のどの値にも依存していないということを React に伝えることになります。つまり副作用はマウント時に実行されアンマウント時にクリーンアップされますが、更新時には実行されないようになります。

つまり、[componentDidMount](https://ja.reactjs.org/docs/react-component.html#componentdidmount) と [componentWillUnmount](componentWillUnmount) のときのみ実行される挙動と近くなる。


# 実例
この例では、DOMの `<input type="hidden">` に埋め込まれている JSON を componentDidMount のタイミングで処理している。一部TypeScriptで書かれている。

```jsx
import React, {useState, useEffect} from 'react';
import ReactDOM from 'react-dom';

function unescapeQuote(str: string): string {
    let div = document.createElement('div');
    div.innerText = str;
    // unescape
    return div.innerText;
}

export default function Example() {
    let [data, setData] = useState({});
    useEffect(() => {
        let jsonDataString: string = '';
        const jsonDataElement: HTMLInputElement = document.getElementById('json-data') as HTMLInputElement;
        if (jsonDataElement) {
            jsonDataString = jsonDataElement.value;
        }
        const matome = JSON.parse(unescapeQuote(jsonDataString));
        if (matome) {
            setData(matome);
        }
    }, []); // only componentDidMount
    return (
        <div className="container">
            <div className="row justify-content-center">
                <div className="col-md-8">
                    <div className="card">
                        <div className="card-header">Example Component</div>
                        <div className="card-body">I'm an example component!</div>
                    </div>
                </div>
            </div>
        </div>
    );
}

if (document.getElementById('example')) {
    ReactDOM.render(<Example/>, document.getElementById('example'));
}
```
Gulp超入門 最新版のインストール〜SassとJSのタスク実行まで


Gulp4で書き方が新しくなってたので備忘録ついでにまとめてみました。

## インストール
[ドキュメント](https://gulpjs.com/docs/en/getting-started/quick-start)のインストール手順通りにインストールします。

その前にnodeが正しくインストールされてるかチェックしておきます。

```
node --version
npm --version
```

gulp-cliをインストール

```
npm install --global gulp-cli
```

プロジェクトフォルダを作成し移動

```
mkdir my-project
cd my-project
```

package.jsonの作成、質問に対しては全てエンターキー押していけばOK
Gulpのローカルインストール、ローカルバージョンが出てればOK

```
npm init
npm install --save-dev gulp
gulp --version
```

## Gulpfileを作成
プロジェクトフォルダに`gulpfile.js`を作成

```js
// my-project/gulpfile.js
// タスク
function defaultTask(cb) {
  // place code for your default task here
  cb();
}
function cssTask(cb) {
  console.log('css task');
  cb();
}

// タスクの定義、ここで定義したタスクをコマンドで使用できる
exports.default = defaultTask
exports.cssTask = cssTask
```

実行してみます

```
gulp
```

このような結果になってればOK

```
[14:12:02] Using gulpfile ~/my-project/gulpfile.js
[14:12:02] Starting 'default'...
[14:12:02] Finished 'default' after 3.73 ms
```

あとはタスクを書いてコマンドを実行するだけ

```
// defaultを実行
gulp

// 特定のタスクを実行
gulp cssTask
```


## GulpでSassのコンパイルする方法
必要なプラグインを入れます。[プラグイン検索ページ](https://gulpjs.com/plugins/)で必要なプラグインを検索できます。

```
npm install --save-dev node-sass gulp-sass
```

次はタスクを作成。

タスクの書き方は`.pipe()`のなかにやりたいことを書いていく感じ。`.pipe()`は必要な分だけつなげることができる。

```js
//my-project/gulpfile.js
const { src, dest } = require('gulp');
const sass = require('gulp-sass');
 
sass.compiler = require('node-sass');

function sassCompile(cb) {
  // 複数のファイルを指定する場合は配列使用可能
  return src(['./sass/theme.scss'])
    .pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError))
    .pipe(dest('./css'));
}

exports.default = sassCompile
```

`gulp`でタスクを実行

```scss
// sass/theme.scss
$main: #333;
body {
  color: $main;
}

// css/theme.css
body{color:#333}
```

## Gulpでjsのminify化とuglify化する方法

必要なプラグインを入れる

```
npm install --save-dev gulp-uglify gulp-rename
```

タスクを作る

```js
const { src, dest } = require('gulp');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');
 
sass.compiler = require('node-sass');

function jsUglify(cb) {
  // 複数のファイルを指定する場合は配列使用可能
  return src(['./js/theme.js'])
    .pipe(uglify())
    .pipe(rename({extname: '.min.js'}))
    .pipe(dest('./js'));
}

exports.default = jsUglify
```

`gulp`でタスクを実行

```js
// js/theme.js
function testFunction(param) {
  console.log('test ',param);
}

testFunction('OK');

// js/theme.min.js
function testFunction(t){console.log("test ",t)}testFunction("OK");
```

## まとめ
v3と書き方が少し違うのでちょっと混乱しますね。あとgulp-sassとかのドキュメントも書き方が違うので脳内補完必須。

ここでは`series()`とか`watch()`について触れてないので機会があれば付け足したいです。
[UniTask] Additiveで表示しているシーンの再読み込みをシーン内のスクリプトで完結させる

## 概要
タイトルの通り、Additiveで表示しているシーンの再読み込みをさせたかった。
素直に実装するとDontDestroyもしくは元シーンのスクリプトに再読み込み処理を書くことになり、記述が散ってしまう。どうにかシンプルに実装できないか。

## 実装
以下のコードの`ReloadSceneTask()`が本内容。
UniTaskで実行した処理はそのスクリプトを管理するシーンが破棄されても生き続けます。
そのため、シーン内のスクリプトからそのシーンの破棄されるまでの監視と再生成までが行えます。

確か別の実装方法だと同一のシーンが瞬間的に2つ存在することによりシーン内のEventSystemがバグるような問題が起きていたそうですが、こちらではシーン破棄の完了をきちんと待つためそのような問題は起きません。

```
using UnityEngine;
using UniRx.Async;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class AdditiveSceneManager : MonoBehaviour
{
    [SerializeField]
    private Button reloadSceneButton;
    
    private void Start()
    {
        reloadSceneButton.onClick.AddListener(OnReloadSceneButtonClicked);
    }

    private void OnDestroy()
    {
        reloadSceneButton.onClick.RemoveListener(OnReloadSceneButtonClicked);
    }

    private void OnReloadSceneButtonClicked()
    {
        ReloadSceneTask().Forget();
    }
    
    private async UniTask ReloadSceneTask()
    {
        var currentAdditiveSceneName = this.gameObject.scene.name;
        
        await SceneManager.UnloadSceneAsync(currentAdditiveSceneName);
        SceneManager.LoadSceneAsync(currentAdditiveSceneName, LoadSceneMode.Additive); // シーン破棄後も処理が生き続ける
    }
}
```
VSCodeVimの検索結果を中央に表示する

昨年度末からVSCodeを使い始めました。
webのコーディング道具としては素晴らしいのですが、"/"検索の結果が画面の下の方の端っこの方に表示されたりして、若干見にくくなったりします。

（ここらへんの挙動は、Sublime Textのほうがエレガントですね...）

## 設定を変更する

`settings.json`に下記内容を記述します。

```settings.json
{
  // 検索後のエンターキーでカーソルを中央に移動
  "vim.commandLineModeKeyBindingsNonRecursive": [
    {
      "before": ["<Enter>"],
      "after": ["<Enter>", "z", "z"]
    }
  ],
  // forward, backwardサーチの後にカーソルを中央に移動
  "vim.normalModeKeyBindingsNonRecursive": [
    {
      "before": ["n"],
      "after": ["n", "z", "z"]
    },
    {
      "before": ["N"],
      "after": ["N", "z", "z"]
    }
  ]
}
```

vimの`zz`でカーソルを画面中央に移動できるので、検索のコマンドの後に自動で入力するようにしています。

それでは、楽しいwebプログラミングライフを。
[Rails] Post 401エラー Uncaught SytaxError が@rails-ujsで起きている時の対処


##エラーの背景

form_forをform_withに書き換えた際、Deviseを用いたログイン後の
「ログインしました。」というflashが表示されなくなったことをきっかけに検証ツールでこのエラーにたどり着きました。
![ 2020-01-06 16.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532695/21e93ae3-9bb6-3cda-2448-4be957716dd5.png)


## 対処法

結論から言うと form_withの記述に`local:true`が足りてなかったことにより、ajaxの処理などがうまくいかなかったようです。

```ruby
    = form_with model: @user, url: user_session_path,local: true do |f|
```

今後は描き忘れないようしっかり注意したいと思います！！
以上です。
VSCode で "Cannot find runtime 'node' on PATH. Is 'node' installed?" との戦い

# Cannot find runtime 'node' on PATH. Is 'node' installed?というダイアログが!
Node.js でサーバーサイド書く簡単なサンプルを真似して作ろうとしてデバッグ環境を整えてるときに発生
`node -v`ってやってもちゃんと返却値あるし原因がわからない。。。
"一応" 解決したのでその方法を記載します。

## 環境
* OS: macOS Catalina version 10.15.1
* VSCode: 1.40.2
* Node: v12.14.0 (installed by nodebrew)

## TLDR
launch.json に以下の設定を追加

```
"runtimeExecutable": "/usr/local/var/nodebrew/current/bin/node" <- which node の結果をそのまま貼り付けた
```

[レファレンス](https://code.visualstudio.com/docs/nodejs/nodejs-debugging) によると
> runtimeExecutable - absolute path to the runtime executable to be used. Default is node. See section Launch configuration support for 'npm' and other tools.

runtimeExecutable: '実行ファイルの絶対パスを書く。デフォルトはnode。'
のような感じかな。。?

## 戦いの記録
### launch.json はどうなってる?
program はちゃんと app.js となっていて問題ない感じ。。。

```js
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Launch Program",
            "skipFiles": [
                "<node_internals>/**"
            ],
            "program": "${workspaceFolder}/app.js"
        }
    ]
}
```

### 実行
でも実行すると "Cannot find runtime 'node' on PATH. Is 'node' installed?" が出る、、、なぜ、、、？泣
Is 'node' installed? とおっしゃいますがちゃんと node はインストールしてるよ？？？

### 調べる
いくつかサイトを見てみたけどなんかしっくりこない、、、
その中で runtimeExecutable という単語が出てきてパス指定してるような雰囲気が、、！
レファレンス見て真似してなんとかデバッグできるようになりました。

## まとめ
この方法でデバッグできるようにはなったけどなぜデフォルトだと node がないと言われてしまうのか謎、、、
nodebrew でやってるから？？
でも $PATH にはちゃんと追加してるしなー
ということで動いたけどしっくりこない感じ。。。
正しい方法知ってる方がいらっしゃったら教えて欲しい、、ぜひ、、っ
[Android] ListViewの使い方

##使い方

まずレイアウトファイルにListViewを追加しておく。

そしてロジックファイルで以下のように書く。

~~~java
public class MainActivity extends AppCompatActivity {

    ListView listViewFruits_;

    //ListViewに表示したい配列
    private static final String[] FRUITS = {
            "りんご","みかん","ぶどう"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listViewFruits_ = findViewById(R.id.listViewFruits);

        //AdapterにFRUITS配列を指定する
        //android.R.layout.simple_list_item_1は用意されているレイアウトファイル
        ArrayAdapter<String> arrayAdapter =
                new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, FRUITS);

        //Adapterをセットする
        listViewFruits_.setAdapter(arrayAdapter);
    }
}
~~~

今回は用意されたレイアウトファイルを使ったが、BaseAdapterクラスを使って自分でカスタムしたものを作ることもできる。
以下のURLがとても参考になる。
https://qiita.com/Tsumugi/items/47f31bb7351979a45653
エンジニア目指してる方向け、おすすめ勉強法

# はじめに

勉強法と書いてはありますが、人それぞれやり方は違います。
あくまでも自分が食いっぱぐれないように始めたプログラミングですが
本格的に勉強し始めて、ハマった勉強の順番を記述しています。

またそこまで大した内容ではないのであまり期待せぬよう。
※amazonリンク貼っていますがアフィリンクではありません。

# 1.書籍

[いきなりはじめるPHP](https://www.amazon.co.jp/%E3%81%84%E3%81%8D%E3%81%AA%E3%82%8A%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BPHP-%E3%83%AF%E3%82%AF%E3%83%AF%E3%82%AF%E3%83%BB%E3%83%89%E3%82%AD%E3%83%89%E3%82%AD%E3%81%AE%E5%85%A5%E9%96%80%E6%95%99%E5%AE%A4-%E8%B0%B7%E8%97%A4%E8%B3%A2%E4%B8%80/dp/4897978858/ref=pd_sbs_14_t_0/357-8327886-2083447?_encoding=UTF8&pd_rd_i=4897978858&pd_rd_r=be56d96a-ea71-48f9-992f-033d90af960b&pd_rd_w=05Ta5&pd_rd_wg=WFIlD&pf_rd_p=ca22fd73-0f1e-4b39-9917-c84a20b3f3a8&pf_rd_r=SZQBW1BR4VB4A6MQRMVD&psc=1&refRID=SZQBW1BR4VB4A6MQRMVD)

こちらの書籍は自分がプログラミングを勉強していて初めて楽しいと思った感じた書籍です。
よくある「はじめての○○」系の入門書は、とりあえずハローワールドを出し、基礎構文の説明から入りなど
詳しく知るためにはとてもよいとは思いますが、まだ興味も持っていないものに対してはハードルが高いなと思います。

この本ではそういった説明はあるものの、実際にWebページを作りながら、構文の説明などが間に挟まっているため、作っている途中のワクワク感や、できたときの喜びが一緒に味わえました。

ここからPHPで他に何ができるのか、どういったものが作れるのかと調べ始め知識が増えていきました。

個人的にはおすすめです。

# 2.友人作り

中々難易度が高いですが今後を左右していたレベルの重要なものになります。
わからない事があった場合Googleさん以外に聞ける人がいるというのは本当に安心できます。
相手はすごい人ではなくて大丈夫です。ITに関して一緒に話せる仲間を作るだけでOKです。

# 3.ハッカソン

[ハッカソンとは](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3)
[ハッカソンで作ったもの(未完成)](https://github.com/yoshioka11/KidsMedicalRecord)
ハッカソンの出場。上記である程度(ある程度といってもデータベースの設定をAPIファイルごとに定義するくらいやばいレベル)色々できるようになった時にたまたま小さなハッカソンに出ようと友人に誘われました。

なんか賞をもらいました。
レベルは高くなくても、自分たちで考えたアイデアを元に作るというのはとても楽しいものでした。
また、一人ではできそうにないものでも数人で行うと更に世界が広がってためになりました。

中のコードはとてもひどいものですが、それでも実際に動いた時の喜びなどは今でも忘れないです。

# 4.おまけ

[入社試験的なので作ったやつ](https://github.com/yoshioka11/PictFight)

自分は面接がとても苦手でした。
理由としては専門に通っていたのですが二十歳までは本当に遊んでばかりで何もしていなかったので
「頑張ってきたことはなんですか」などの質問や、「会社に入ってからしたい事はありますか」などの質問に答えられなかったのです。

ですが、最近はプログラミングの試験で採用まで行けるような会社が増えてきました。
上記のgithubは入社試験のような課題が与えられ作ったものです。
初めて使う言語でしたが、目標(今回でいうと採用まで)を持って取り組めば
とても楽しく行うことができました。

なのでコミュ症だから。。。などでも諦めず色んな所から挑戦すれば大丈夫だと思います。


以上。
AngularでStatic Site Generatorを使ってみた

#AngularでStatic Site Generatorを使ってみた

angular v9以上であれば使えるようである。

下記コマンドで依存含めていい感じに入れてくれる。
ng add @scullyio/init

差分は下記

```src/polyfills.ts
/***************************************************************************************************
  
* SCULLY IMPORTS
  
*/
  
// tslint:disable-next-line: align 
import 'zone.js/dist/task-tracking';
```

```src/app/app.component.ts

import {IdleMonitorService} from '@scullyio/ng-lib';
...
export class AppComponent implements OnInit {
    constructor(private idle: IdleMonitorService,


```

```scully.config.js
exports.config = {
  projectRoot: "./src/app",
  routes: {
  }
};
```

```package.json
  "scripts": {
    "e2e": "ng e2e",
    "scully": "scully",
    "scully:serve": "scully serve"
    ...},
  "dependencies": {
    "@scullyio/init": "0.0.9",
    "@scullyio/ng-lib": "latest",
    "@scullyio/scully": "latest"
   ...}
```
動画のサムネイルを取得する方法

今回はiflameを使用した動画の埋め込み方法を紹介します。

## 動画IDの取得
まず使用したいyoutubeの動画へアクセスします。
アクセスしたurlの「v=」以降の文字列が動画IDです。

## iflameへの埋め込み
iflameを使用し、サイトへ動画を埋め込みます。

F12を押し、開発者ツールを開きます。
その後iflame使用箇所を検索します。

---
iflameタグ内のsrc部分が動画取得先となっています。
ここの「embed/」以降を先ほど取得した動画IDに書き換えれば埋め込んでいる動画も変わります。
LaravelのControllerでjsonリクエストをarrayで受け取る

# 動作環境

- Laravel Framework 6.8.0

# コード

```php
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class HogeController extends Controller {
    public function register(Request $request) {
        $content = $request->getContent();
        $json = json_decode($content, true) ?? [];
        // 適当な処理
        return response('registered', 201);
    }
}
```

# 参考にした記事
- [Laravel get JSON array](https://laracasts.com/discuss/channels/laravel/laravel-get-json-array)
blueprint で API仕様書

# 概要

Markdown形式で記述するAPI BlueprintでのAPI仕様書作成とHTMLへの出力方法です。

1. レンダラ(aglio)のインストール
2. Api Documentの記述
3. HTML出力
4. テスト

## 1. aglioのインストール

nodeのバージョンが v8.x でないと動かないので、バージョンを変更しておく。

```
$ mkdir blueprinttest
$ cd blueprinttest
$ nodenv install 8.17.0
$ nodenv local 8.17.0
```

aglioをインストール

```
$ npm install aglio
```

## 2. Api Documentを書く

ドキュメントファイルを作成してコードエディタとかで開く。

```
$ touch test.apib
$ code .
```

次のようにAPI Blueprintの仕様に従いapi仕様書をかく。

書き方はこちらを参考に。

- API Blueprint tutorial
    - https://apiblueprint.org/documentation/tutorial.html

    
<pre>

FORMAT: 1A
HOST: http://localohst/

# API ドキュメント大見出し

## このドキュメントのみかた

このドキュメントに定義されているAPIは以下のグループで構成されています。

- A Group
- B Group

## Headerについて

このAPIは認証トークンが必要です。各APIには次のようにヘッダにトークンを設定します。

```
Authorization: Bearer {token}
Content-Type: (application/json)
```

## Responseについて
Response Body は JSON オブジェクトとして次の形式で戻ります。

```
{ 
    "status" : "Success",
    "field1" : "データ1",
    "field2" : "3211",
}
```

# Group A
A GroupのAPIを定義します

## 名前取得A [/api/beta/v1/name/get]

指定したIDで名前を取得するAPIです。

### 名前取得A [POST]

+ Request
    + Headers

        ```
        Authorization: Bearer {token}
        Content-Type: (application/json)
        ```

    + Attributes
        + id: 1 (string, required) - ID

+ Response 200 (application/json) 
    + Attributes
        + status (string ,required) - 成功時はSuccess、失敗時はFail
        + name: "名前" (string, required) - 名前


# Group B
B GroupのAPIを定義します

## 名前取得B [/api/beta/v1/nameb/get]

指定したIDで名前を取得するAPIです。

### 名前取得B [POST]

+ Request
    + Headers

        ```
        Authorization: Bearer {token}
        Content-Type: (application/json)
        ```

    + Attributes
        + id: 1 (string, required) - ID

+ Response 200 (application/json) 
    + Attributes
        + status (string ,required) - 成功時はSuccess、失敗時はFail
        + name: "名前" (string, required) - 名前

</pre>


## 3. HTML出力

aglioコマンドでHTML出力します。

```
aglio -i test.apib -o test.hml
```

`-i` で元ファイル、`-o` でHTMLとして出力するファイル名　を指定します。
実行後指定したHTMLファイルが生成されています。
開くとこんな感じ。


<img width="1029" alt="スクリーンショット 2020-01-06 16.13.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252067/aa344593-ba41-d312-6068-7c67d9c4beaf.png">


## 4. テスト
既にAPIが開発環境にあり、ドキュメントがテスト通りかテストしたい場合は dredd というプラグインを使います。

```
npm install -g dredd
```

これで次のようにテストしたい仕様書とAPIサーバURLを指定すればOKです。

```
dredd test.apib http://localhost
```
Auth0＋ファイル1つでローカルサイトにログイン機能を付ける！

##小さいな1歩から始めることにしました。
前回、[超初心者がログイン機能のついたサイトのデスクトップアプリ化に挑戦（あんど失敗・・）](https://qiita.com/marumaruchan/items/2a9667f5a30f71038da9)でAuth0で認証を付けた自分のサイトをエレクトロン化するとログイン機能が消えるという問題にぶつかりました。
色々悩みましたが、Auth0が提供してくれるサンプルファイルは多くあって、複雑すぎて何が間違っているかさっぱり見当がつきません・・（涙）。
そんな時、「[ファイル一つコピペで試すAuth0+Vue.jsのログインサンプル](https://qiita.com/n0bisuke/items/7de00908acc7854e79af)」という記事を読んだので、コードを参考にしながら単純なファイルを用いて、ローカルサイトに認証（Line限定）を付けてみることにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508834/41121b80-059a-4402-9f8a-ba13f86717fc.png)
##環境
Windows 10
Node.js v12.4.0
Visual Studio Code version 1.41
Live Server 5.6.0
##方法
Step1.　好きな名前のフォルダを作ったらVisual Studio Codeを立ち上げます。
Step2.　Visual Studio CodeでLive Serverをダウンロードします。
Step3.　「[ファイル一つコピペで試すAuth0+Vue.jsのログインサンプル](https://qiita.com/n0bisuke/items/7de00908acc7854e79af)」を参考に、
　　　　Index.htmlファイルを作成します。
Step4. Visual Studio Code右下の「Go Live」をクリック、
           どこにつながるか確認しておきます。念のため、一旦Go liveは終了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508834/78d415c9-a6f1-c04a-76eb-f5c4a00a0ff4.png)
Step5.　Auth0で認証用のアプリを作成します。（[コチラ](https://qiita.com/marumaruchan/items/552cc7b679c06bc66d53)の方法1~3）
Step.6　Auth0のApplication SettingsにてAllowed Callback URLs、
　　　　Allowed Web Origins、Allowed Logout URLsをStep4で確かめた
　　　　ローカルサイトに変更し、Saveします。
Step7. Auth0のDomain及びClint IDをIndex.htmlの該当箇所にコピーします。
Step8.　再度、「Go live」をクリックし、ローカルサイトで認証機能が付くか確認。

##結果
あ～、できた！！
【トップ画面】
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508834/7d5bd181-1a96-74e5-93f5-62d220f07bf4.png">
↓
【ログイン画面】
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508834/5c97b331-ba9c-f141-3560-d8c2b3e70883.png">
↓
【ログイン後】
<img width="400" alt="image.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508834/67ec4f53-f304-6155-3cc2-b882f3755b50.png)


##感想
またもやQiita＆先人の知恵に助けられました。
数週間悩んで体感したことは複雑なコードはレベルの高いことが初心者でもチャレンジできるが、逆に壁にぶち当たるとほぼ何もできないこと。
私でも構造が理解できるこの方法で次はエレクトロン化に挑戦したいと思います。
CEH(Certified Ethical Hacker)に合格するために実施したこと

CEH v9に合格した際に利用した教材と勉強法です。公式トレーニングは受講していません。リーズナブルな金額で入手できる教材と、それを用いた勉強法を紹介します。CEHの詳細については[こちら](https://www.eccouncil.org/programs/certified-ethical-hacker-ceh/)を参照。

# 前提条件
セキュリティの資格を英語で勉強するのも、英語で受験するのもCEH v9が初めてでした。英語力は TOEIC 800後半くらい。

# 最も役に立った教材
学習にあたっては、教材と問題集をバランスよく実施する必要がありますが、私が利用して最も役に立ったと思える教材です。現在はCEHは日本語でも受験ができるのかもしれませんが、教材は英語に良いものが多いですので、それらを紹介します。

### [CEH Certified Ethical Hacker All-in-One Exam Guide, Fourth Edition](https://www.amazon.co.jp/Certified-Ethical-Hacker-Guide-Fourth/dp/126045455X/)
通称AIO。教科書といっていいと思います。マストです。数回通読が必須だと思います。しかし真の価値は付属の問題集アプリTotal Testerにあります。問題集については後述。
★★★★★(星5がMax)

### [The Complete Ethical Hacker Certification Exam Prep Course(Udemy)](https://www.udemy.com/course/the-complete-ceh-exam-prep-course-become-an-ethical-hacker/)
Udemyの16.5時間のコース。超おすすめ。比較的わかりやすい英語。聞き取りが苦手でもUdemyは英語字幕が出せるのでそれで理解できます。ハッキング用のVMやチートシートもあり、CEH学習目的以外にもかなり有用。Udemyの安売りの際には是非購入を。
★★★★★

## 補助学習資料
上記を実施した上で、個別のテーマについて深く理解したい場合のあくまでの補助学習資料。

### [実践 Metasploit ―ペネトレーションテストによる脆弱性評価](https://www.amazon.co.jp/dp/4873115388/)
Metasploitについての書籍。Udemyのコースを進めていくと実際に触ることになりますが、Metasploitについて深く知ることができます。
★★★★☆

### [実践ネットワークセキュリティ監査―リスク評価と危機管理](https://www.amazon.co.jp/dp/4873112044/)
AIOを読んでからこちらを読むと、かなり腑に落ちます。いい意味で2005年の出版とは思えません。良書。
★★★★☆

### [暗号技術入門 第3版](https://www.amazon.co.jp/dp/4797382228/)
今後の資格勉強でも活用する予定。暗号についてまとまっている本は貴重。
★★★★★

### [Penetration Testing: A Hands-On Introduction to Hacking](https://www.amazon.co.jp/dp/B00KME7GN8/)
ペンテストについてとても良くまとまっています。英語。この出版社(No Starch Press)から出ている本は良書が多いと思います。
★★★★☆

# 問題集
教科書やWebコースだけでは合格することは難しいと思います。問題の数をこなしてCEH特有の問題の形式に慣れる必要があります。ただ、問題集はあくまで自分の弱点を見つけるためのもので、答えを覚え込むものではありません。誤った箇所は教科書に戻って理解を深めましょう。

### [CEH Certified Ethical Hacker All-in-One Exam Guide, Fourth Edition](https://www.amazon.co.jp/Certified-Ethical-Hacker-Guide-Fourth/dp/126045455X/)
既出の教科書でもありますが、付属の問題集アプリTotal Testerが素晴らしい。これで問題に慣れましょう。これの95%くらいを正解できればかなり良い感じです。難点は20問に1問くらいの割合で誤りがあることと、こればかりをやっていると答えを覚えてしまって、問題を見た瞬間に正解がわかり勉強にならないこと。
★★★★★(既出ですが)

### [CEH Certified Ethical Hacker Practice Exams, Fourth Edition](https://www.amazon.co.jp/Certified-Ethical-Hacker-Practice-Fourth/dp/1260455084/)
AIOと同じ著者による問題集。こちらもTotal Testerでやり込めます。問題点は上と同じ。
★★★★★

### Udemyの CEH 問題集
上記をすべて実施して答えも覚えて勉強にならなくなってしまったら、Udemyで"CEH Practice"等で検索してみましょう。色々なコースが出てきますので、Udemyの安売りの際に評価の高そうなものを試してみましょう。初見の問題集で85%以上正解できると、かなり自信を持ってよいのではないかと思います。この手の試験では複数のソースに当たることが重要だと思っています。私は最終的に初見のコースで90%弱くらいのスコアでしたが、本番もその同じくらいのスコアでした。

# その他
やっておいた方が良いと思われることを挙げました。

### とにかくツールを触ってみよう
CEHではさまざまなツールが取り上げられますが、Metasploit、Nmap、Wiresharkなど、もしこれまで触ったことがないのであれば、ぜひ触ってみましょう。Udemy等で入手した、脆弱性学習用のアプリやMetasploitable2などのVMに対して、いろんなコマンドやオプションを実行してみましょう。教科書を読むだけではなく、実際に触ると理解が深まります。

### 問題集に偏重しない
自戒を込めてですが、問題集はあくまで形式に慣れるためと、自分の弱点を洗い出すためのもので、答えを覚えても本番の得点力には繋がりません。Udemyなどいろんなソースの問題集を試してみましょう。
macOS CatalinaでHyperが動かないとき

# tl;dr

- **zipをダブルクリックで解凍しない**
- `unzip`で解凍する
- それか`brew cask install hyper`で入れる。



# 詳しく

macOS Catalinaの[Archive Utilityは不具合を抱えている](https://applech2.com/archives/20191016-macos-1015-catalina-archive-utility-issue.html)ようで、一部のzipファイルを正しく解凍できない。これはissueでも言及されている。

[New Hyper Install Won't Open on MacOS Catalina Beta · Issue \#3750 · zeit/hyper](https://github.com/zeit/hyper/issues/3750)


その結果Hyperが正常に起動できなくなった、というわけ。

<img width="488" alt="スクリーンショット 2020-01-06 14.49.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69399/cbf81617-8319-f4ab-3653-b881381ff030.png">


なので、macOS CatalinaのArchive Utilityを使わない方法で解凍する必要がある。

~~ところで今の方って解凍って言葉通じるんですかね~~
CentOSのXfceにあるドックランチャーにアイコンを追加する方法

異常に忘れるのでメモです

1. ドックランチャーで右クリック > [Panel] > [Add New Items...]でダイアログを表示する
 - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/53fa6a1c-5f98-e139-b8f0-9c3d69d749b5.png)
1. ダイアログで[Luncher]を選択して[Add]ボタンで追加
    - 表示したいアプリがダイアログの一覧にあれば選択して[Add]で終わり
1. [Close]ボタンでダイアログを閉じる
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/644de210-90eb-6e9c-df69-b1c9d31fc151.png)
1. 追加されたアイコンを右クリック > [Properties]でダイアログを表示する
1. [+]ボタンでアプリケーションを選択
    - なければ[ノートがきらっとした]ボタンでアプリケーションの場所を選択できる
        - EclipseなどはEclipse.exeを指定すればOK
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/fcde4312-956c-49b4-d270-5e384ea65127.png)
1. [Add]ボタンでダイアログを閉じる
1. [Close]ボタンでダイアログを閉じる
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/5d92c231-4086-764f-c248-680b9d617daf.png)
Tableau Desktop (Windows)に内蔵されるジオコーディング データベースに関するまとめ

#v2019.4以降
データソースとしてHyperと各TDSファイルが以下に配置されています
C:\Program Files\Tableau\Tableau [version]\Local\data\GeocodingData.hyper

v2019.4以前のFDB(Firebird Database)はHyper形式へ移行されました
https://kb.tableau.com/articles/issue/default-cities-recognized-by-tableau

参考: 逆引き
https://public.tableau.com/profile/steve.street#!/vizhome/TableaugeocodedLatitudeLongitudevalues/TableauGeocodedLocations
https://public.tableau.com/profile/ryusuke.ashiya#!/vizhome/CityGeocorderforJapan-201912/CityGeocorderforJapan

#v2019.4以前
データソースとしてFDBと各TDSファイルが以下に配置されています。
C:\Program Files\Tableau\Tableau [version]\Local\data\GEOCODING.fdb
Swift 多次元配列の宣言、追加、削除について　備忘録

こんにちは、今回は多次元配列について記事が少なくつまずいたので備忘録として記事にしました。
Xcode Version 11.3
Swift Version 5.1.3

```Swift:Array.swift
//多次元配列

//宣言
var array:[[String]] = [] // >>> array = []
var hoge:[[String]] = [["こんにちは"],["Hello","Study"]] // >>> hoge = [["こんにちは"],["Hello","Study"]]

//追加
array.append([]) // >>> array = [[]]
array[0].append("こんばんわ") // >>> array = [["こんばんわ"]]

//削除
hoge[1].remove(at:0) // >>> hoge = [["こんにちは"],["Study"]]
hoge.remove(at:0) // >>> hoge = [["Study"]]
```
SpringBootでテスト時にRedisを動作させない

- Spring Boot 2.1.8.RELEASE
- JUnit 5.5.2

SpringBootでRedisを使用しているがTestでRedisを動作させたくない。

`RedisAutoConfiguration`と`RedisRepositoriesAutoConfiguration`を除外する。
Spring Data's reactive Redisを使用しているなら`RedisReactiveAutoConfiguration`も対象。

当然`RedisTemplate`や`StringRedisTemplate`は登録されなくなるので、テスト時は別途用意する。

# 除外方法

`@EnableAutoConfiguration`で`exclude`する。

```java
@SpringBootTest
@EnableAutoConfiguration(exclude = {
        RedisAutoConfiguration.class,
        RedisRepositoriesAutoConfiguration.class
})
class MyTest {
```

`@SpringBootTest`は既にAutoConfigurationは有効だが、`@EnableAutoConfiguration`を明示するとその設定が優先される。

# アノテーションを作る

全てのテストで個別に指定するとクラスのアノテーションがうるさくなる。メタアノテーションの機能を使用し、アノテーションを作っておく。


```java
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@SpringBootTest
@EnableAutoConfiguration(exclude = {
        RedisAutoConfiguration.class,
        RedisRepositoriesAutoConfiguration.class
})
public @interface MySpringBootTest {
}
```

テストクラスはこうなる。

```java
@MySpringBootTest
class MyTest {
```
Oracle Management Cloud インスタンス作成手順

Oracle Cloudにある運用管理クラウドサービス Oracle Management Cloudの新規インスタンス作成の手順を紹介します。
まずは、Oracle Cloudにログインしたところから始めます。
**2020/4 TokyoリージョンでもOMCがAvailableになりました！!**
**2020/8 OsakaリージョンでもOMCがAvailableになりました！!**

##OMCインスタンス作成フロー
- Oracle Cloud infrastructureの右上のリージョンはUS EAST、US WEST、FrankFrut、London、Tokyo、Sydney、のいずれかを選択し、プラットフォーム・サービス -> Management Cloudをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/24b77cb1-fd23-f58f-3377-2c348e296344.png)

- Create Instanceをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/d1cba5f6-cb5f-7ef2-80af-dfbef46660ca.png)

- インスタンス名を入力して、Createをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/e2e77eb7-8d51-c080-61f8-37ec357779ad.png)

- 20-30分ほど待つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/3f01e153-a748-6284-48c8-442e3d84f223.png)

- 作成完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/cc372938-956c-2323-6b9a-e0ee820957c3.png)

- OMC初期画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/c7838dd4-9ce8-9817-8eb3-04a12bdefa39.png)

これでOMCインスタンスが準備できました。
次にAPM Agent、Cloud Agentをそれぞれのプラットフォームにインストールしていきます。


Oracle Management Cloud関連の情報は[こちら](https://qiita.com/western24/items/1e44bfcaa77f3251a263)

## 追記 2020/1

※Management Cloudを選択した際に下記の古いOMCのインスタンス作成の画面に遷移してしまう場合は、別のリージョンを選択して試してみて下さい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/52d65cca-8009-275d-b47f-d41f860d3db4.png)
【Python】変数の定義と使い方

#変数とは
Pythonにおける変数とは、オブジェクトを参照するための名前である。
一つのオブジェクトに複数の名前を付けることが出来る。
オブジェクトは固有のidを持っており、
変数が異なるidを参照する場合は異なるオブジェクトを、
変数が同一のidを参照する場合は同一のオブジェクトを、参照する。

```python:hensuu.py
a=[1,2,3]
b="Hello"
#a,bは異なるオブジェクトを参照するため異なるidを持つ
print(id(a))
>>>2238481401096
print(id(b))
>>>2238482196976

#a,bに同一オブジェクトを参照させる
b=a
print(id(a))
>>>2238481401096
print(id(b))
>>>2238481401096

#同一オブジェクトを参照しているのでbの値を変更すると
#aの値も変更されたかのように見える
b[0]=100
print(b)
>>>[100,2,3]
print(a)
>>>[100,2,3]
```

#変数の種類
変数には、単一のオブジェクトを指すものや、複数の変数をまとめて扱うリストや辞書型変数などがある。

#変数の宣言
変数を宣言するときには**変数名**が必要になる。
**=に対して、左側が変数名**である。変数名は自由に決定することが出来る。（厳密には予約語を除く）
一方で、**=に対して、右側が変数名に対する値**となる。
変数は一度宣言したあと、何度でもそのプログラム中で用いることが出来る。
**文字型変数の宣言方法**は、**""ダブルクォーテーション**で囲むことである。
一方で数値型の変数の宣言は、そのまま記述すればよい。

```Python3:variable.py
variable_string="1"
#output=変数名:variable_stirng 値:1
#これは文字としての1であるため、演算(+,-,*,/等)を行えない

variable_integer=1
#output=変数名:variable_integer 値:1
#これは数値としての1であるため、演算(+,-,*,/等)を行える
```

#変数の利用
最後に可読性に関して一例を示す。
いずれのプログラムも半径が1,5それぞれの場合の円の面積を出力するプログラムである。
変数を用いた下のプログラムの方が読みやすいのではないだろうか？

```Python3:S1.py
print(1*1*3.14)
print(5*5*3.14)
#output=3.14 , 78.5
```
```Python3:S2.py
r=1
R=5
pi=3.14
print(r*r*pi)
print(R*R*pi)
#output=3.14 , 78.5
```
眺めて覚えるC言語 その2 PythonからC言語を呼ぶ(引数)　string

```capi.py
import myModule as capi
print(capi.Message("こんにちは、日本"))

実行する
capi>python capi.py
こんにちは、日本
こんにちは、日本
```

```capilib.c
#include <Python.h>

static PyObject* Message(PyObject* self, PyObject* args){
    char* str;
    if (!PyArg_ParseTuple(args, "s",&str)){
        return NULL;
    }
    printf("%s\n",str);
    return Py_BuildValue("s", str);
}
// Function Definition struct
static PyMethodDef myMethods[] = {
    { "Message", Message, METH_VARARGS, "Prints Message"},
    { NULL }
};
static struct PyModuleDef myModule = {
    PyModuleDef_HEAD_INIT,"myModule","C API Module",-1,myMethods
};
PyMODINIT_FUNC PyInit_myModule(void){
    return PyModule_Create(&myModule);
}
```
**注目ポイント**

```
char* str;
//引数の取り込み
if (!PyArg_ParseTuple(args, "s",&str)){
    return NULL;
}
//戻り値の作成
return Py_BuildValue("s", str);
```
 - PyArg_ParseTuple(args, "s",&str)は、引数　"s" string をstrに読み込む。
 - 戻り値　"s"は、stringを表す。
 - [例 ](https://docs.python.org/2.0/ext/buildValue.html) https://docs.python.org/2.0/ext/buildValue.html
[React]開発環境構築

Reactの勉強を行うにあたり、まずは開発環境の構築を行います。
今回はAWSのCloud9上に環境構築を行う手順を紹介します。
現状はアプリ作成までですが、今後追記していく予定です。

### 環境
- OS：Amazon Linux
- Node.js：v10.18.0
- npm：6.13.4

以下、各ソフトの超概要
**Node.js**
　サーバサイドで動作するJavaScriptのプラットフォーム。

**npm**
　Node.jsのモジュールを管理するツール。

### 手順
`Create React App`でReactのアプリケーションを作成

```:console
npx create-react-app [アプリ名]
```
暫く待つと、以下のログが表示されインストール完了

```:インストール完了ログ
Happy hacking!
```
アプリ名のディレクトリが生成されているため、そこに移動後、アプリケーションを起動する。

```:console
cd [アプリ名]
npm start
```

`preview` → `Preview Running Application`と選択し、以下の画面が表示されたらアプリケーション実行成功。
![Reactのデフォルト画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507377/8c302603-7540-7780-feda-1556b933c7a0.png)

### おまけ
以下のようなエラーが表示された場合、アプリケーション内でエラーが発生している。
![エラー文.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507377/221ac568-dc97-70af-c901-1068678946c1.png)

httpsの場合、WebSockets over SSLを使用しなくてはいけないところをWebSocketsを使っているためにエラーが発生しているとのこと。
`react-script`のバージョン`3.3.0`で発生しているデグレのため、一旦`3.2.0`にダウングレードする必要がある。
※自分の環境では`3.3.0`になっていた。

```:対応内容
npm install react-scripts@3.2.0
```

参考リンク
https://github.com/facebook/create-react-app/issues/8075
https://github.com/facebook/create-react-app/pull/8079

### 修正
・Node.jsの説明が色々おかしかったので修正
・`おまけ`の説明を見直し
MicrosoftAuthenticatorでMicrosoftアカウントにスマートフォンを追加

office365職場または学校アカウントと２段階認証のmicrosoftAuthenticatorの設定について
デバイスを追加する際にややこしい部分があったので、備忘録兼ねて記事に残そうと思います。

※初めて２段階認証する場合は初めてのログイン時に、「アプリのインストール」や「QRコードの読み込み」を画面の指示通りに進めれば問題ないかと思います。あくまでAuthenticatorを別のデバイスで追加する場合や、新しいデバイス（スマホなど）に引っ越したい場合などのためなのでご注意を。


https://myprofile.microsoft.com へアクセス。
ここでは、ブラウザで先に職場または学校アカウントでログインしているとマイアカウントページへそのまま遷移すると思います。ログインしていなければ、ログイン画面出ると思いますので会社職場アカウントでログインしてね。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467457/ff957e04-980a-f2fd-e450-cde6de77c222.png)


①セキュリティ情報の部分にある「追加のセキュリティ情報」をクリック。

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467457/fc1e9ec7-18eb-42c4-2683-001b6724ffb8.png)

②認証アプリまたはトークンの部分に「Authenticatorアプリの設定」ボタンがあるのでクリック。
※その下の部分には、現在登録されている認証用のデバイス一覧が表示されているかと思います。この画面では私の認証用デバイスが３つ表示されています。

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467457/64eeb965-d0df-c946-ad17-e31b4b3869f7.png)

③これ以降は初めて２段階認証するときと一緒だと思いますが、画面にQRコードが出てくるので新しく追加したいデバイスでAuthenticatorを立ち上げ、追加する作業をおこなってください。

※まだダウンロードしてない方は。
・Android用
https://play.google.com/store/apps/details?id=com.azure.authenticator&referrer=adjust_reftag%3Dc7DDiHpM9ZtuB%26utm_source%3DDocs%253A%2BAAD%2Bend%2Buser%2B%2528docs.microsoft.com%2529
・iphone用
https://apps.apple.com/us/app/microsoft-authenticator/id983156458

![Screenshot_20200106-142333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467457/e7e94dbc-ed94-856c-b707-7b988ff0c9c9.png)
![Screenshot_20200106-143603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467457/dc8d52f9-ebd3-8037-89ed-32bb6483ff25.png)
![Screenshot_20200106-142349.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467457/2487a56c-071b-1be5-cf48-de91e3f343ac.png)


④QRコードの読み込みをして、「次へ」をクリックするとAuthenticatorの確認が始まります。PC画面には「デバイスへの通知に応答してください」というメッセージが出ます。
少し間がありますが、新しいデバイスへ通知がありますので、「承諾」をタップしてください。
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467457/b4a5e087-6763-15aa-fecb-020423027070.png)


以上の作業で、先ほどの認証アプリ一覧に新しいデバイスが追加されたと思います。もし、エラーなどで通知が来なかったり、「承諾」をタップしてもしばらく進まなかったりする場合は、ブラウザの再起動から行う必要があるかもしれません。応答時間はmicrosoftのサーバーの混み具合にもよるかと思いますので慌てずに。
ROS2インストール・初期設定 for Eloquent Elusor

[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)
Dashing Diademata用は[こちら](https://qiita.com/NeK/items/d2bdd8798de7cdea1932)


# Ubuntu 18.04
[install]:https://index.ros.org/doc/ros2/Installation/
[公式インストールガイド][install]のDebian Packagesに従ってインストール．

## 特記
### localeについて
説明ではen_US.UTF-8だが，ja_JP.UTF-8に置き換えてインストール．

### Install ROS2 packages
[公式インストールガイド][install]のDebian packagesにて[Install ROS2 packages](https://index.ros.org/doc/ros2/Installation/Dashing/Linux-Install-Debians/#install-ros-2-packages)でインストールするものを選択しないといけないが，以下のように選ぶ．

- Ubuntu Desktop 18.04
    - Desktop Install(Recommended)
- Ubuntu Server 18.04
    - ROS-Base Install(Bare Bones)

Ubuntu Server 18.04は，例えば[Raspberry Pi 3B+](https://qiita.com/NeK/items/849c6d1e05fb05314fc6)でロボットを制御する場合(GUIが不必要な場合)での使用が考えられる．

### 上記ガイド以外でインストールしたもの

```Bash:terminal
$ sudo apt install python3-colcon-common-extensions
$ sudo apt install python-catkin-pkg python-bloom
$ sudo apt install python-pip python3-pip
$ sudo -H pip install -U catkin_pkg
$ sudo -H pip install empy
$ sudo -H pip install lark-parser
$ sudo -H pip install numpy
$ sudo -H pip3 install -U catkin_pkg
$ sudo -H pip3 install empy
$ sudo -H pip3 install lark-parser
$ sudo -H pip3 install numpy
$ sudo apt install ros-eloquent-rqt*
```

# 細かいメモ
ros-eloquent-rqt*はうまくできない．が問題ない？
その他はほとんど既にインストール済になっている？

pip install -U catkin_pkgやempyをしていないと，ROS2のビルド(colcon build)でImportErrorが出る場合がある．というか出た．

特にlarkをインストールしていないと独自メッセージ作成の時にImportErrorで"no module lark"と出た．rosidlでlark-parserを使用しているみたい
[参考](https://github.com/ros2/rosidl/issues/354)

pip install larkも必要かも？いらないとは思うが．

rosと共存していて管理者でインストールする時には，pip3でインストールした方がよいかも．
【Python】print関数

#Print関数でできる事
メッセージや変数の中身を表示することができる。
#メッセージを表示する
メッセージを表示したい場合は、**ダブルクォーテーション**で表示内容を囲むこと！

```python3:print.py
print("ここに表示したいメッセージを記入する")
# output = ここに表示したいメッセージを記入する
```

#変数の中身を表示する
変数の中身を表示したい場合は、print()内にそのまま記入する。
変数に文字を格納する場合は、**ダブルクォーテーションが必要**。
変数に数値を格納する場合は、**ダブルクォーテーションは不要**。

```python3:print.py
text="あいうえお"
print(text)
# output = あいうえお
```
#メッセージ＋変数の中身の表示する方法
いくつかの方法がありますが、ここではその一例を示します。
使う関数は**format()**です。
**format()**は**文章内の{x}にformat()内のx番目の変数を対応させる関数**です。

```python3:print.py
pi=3.14
r=5
print("円周率は{0}で、半径は{1}です。半径は{1}で円周率は{0}です。".format(pi,r))
# output = 円周率は3.14で、半径は5です。半径は5で円周率は3.14です。
```
EC2内でcrontabとmysqldumpを使ってRedmineの自動バックアップを行う

# 環境
- EC2（Linux）
- Docker

# dump実行用シェルファイルを作成

```
$ vi backupdb.sh
```
backupdb.shに記述するコマンドは以下。

```
#!/bin/sh
docker exec mysql mysqldump -u ユーザー名 -pパスワード -h ホスト名 データベース名 > ~/redmineBk.sql
```

mysqlコンテナの中のmysqldumpを使ってsqlファイルにバックアップ対象のデータを出力します。
ユーザー名やデータベース名などは、redmineコンテナの中の`config/database.yml`に記載されています（-pとパスワードの間にスペース入れない）。
下記コマンドで参照できます。

```
$ docker exec -it redmine bash  # redmine用のコンテナを指定
root~ /usr/src/redmine# cat config/database.yml
```


# crontabを設定

cronを使って定期的に自動でバックアップを取得できるように設定しておきます。

```
$ crontab -e
```

```
# 分 時 日 月 曜 実行ファイル
00 19 * * 1-5 /home/ec2-user/backupdb.sh
```

この場合、毎週月~金曜日の19時にバックアップを取得する設定となっています。
設定したcronは、`crontab -l`で確認できます。

# 参考
[Redmineのバックアップとリストア](http://guide.redmine.jp/RedmineBackupRestore/)
[crontabの書き方](https://gist.github.com/koudaiii/4f3a2c78db0274c91f55)
マテリアライズド・ビュー・ログを検証する（２）

マテリアライズド・ビューのリフレッシュを行う場合に、データを提供するリモート・インスタンスでどのような操作が行われるかを確認するため SQL 文のトレースを取得してみました。ただしこれらの動作はマテリアライズド・ビューや、マテリアライズド・ビュー・ログの作成オプションによって変化します。


# 準備
データ・ソース側でテーブルを作成します。マテリアライズド・ビュー・ログは、デフォルト設定で作成します。

```
SQL> CREATE TABLE mtest1(c1 NUMBER PRIMARY KEY, c2 VARCHAR2(10));
表が作成されました。

SQL> INSERT INTO mtest1 SELECT LEVEL c1, 'data1' c2 FROM DUAL CONNECT BY LEVEL <= 100000;
100000行が作成されました。

SQL> COMMIT;
コミットが完了しました。

SQL> CREATE MATERIALIZED VIEW LOG ON mtest1;
マテリアライズド・ビュー・ログが作成されました。
```

リモート・インスタンスでマテリアライズド・ビューを作成します。差分リフレッシュができるように、REFRESH FAST 句を指定します。

```
SQL> CREATE MATERIALIZED VIEW mview1 REFRESH FAST AS SELECT * FROM mtest1@link1;
マテリアライズド・ビューが作成されました。
```

元テーブルに１件のレコードを格納し、マテリアライズド・ビューとの差分を作ります。

```
SQL> INSERT INTO mtest1 VALUES (0, 'add');
1行が作成されました。

SQL> COMMIT;
コミットが完了しました。
```

マテリアライズド・ビューの高速リフレッシュを実行し、データ・ソース側インスタンスで SQL 文のトレースを取得します。

```
SQL> EXEC DBMS_MVIEW.REFRESH('MVIEW1', 'f');
PL/SQLプロシージャが正常に完了しました。
```

# トレース結果

実行された SQL 文のうち、情報が更新される SQL 文をいくつか紹介します。

テーブル定義の更新します（用途は不明）。

```
update tab$ set spare3 = :1, spare5 = :3
where
obj# = :2
```

マテリアライズド・ビュー・ログ内のレコードに対して更新時刻をアップデートしています。

```
update "SCOTT"."MLOG$_MTEST1" set snaptime$$ = :1
where
snaptime$$ > to_date('2100-01-01:00:00:00','YYYY-MM-DD:HH24:MI:SS')
```

マテリアライズド・ビューの更新時刻をアップデートします。SYS.MLOG\$ テーブルはマテリアライズド・ビュー・ログの情報を格納しています。その他にいくつかの用途不明のテーブルを更新します。

``` 
update sys.mlog$ set youngest = :1, yscn = :2
where
mowner = :3 and master = :4

UPDATE sys.snap_loadertime$ SET youngest = :1
WHERE
tableobj# = :2

update sys.sumpartlog$ s set s.timestamp = :1, s.scn = :2
where
s.bo# = :3  and    s.timestamp >= to_date('4000-01-01:00:00:00',
'YYYY-MM-DD:HH24:MI:SS')
```

マテリアライズド・ビューの情報を更新します。SYS.SLOG\$ テーブルはデータベース内のテーブルに対して作成されたマテリアライズド・ビューの情報が格納されます。DBA_REGISTERED_MVIEWS ビューの元になるテーブルです。

```
update sys.slog$ set snaptime = :1, tscn = :2
where
snapid = :3 and mowner = :4 and master = :5
```

不要になったマテリアライズド・ビュー・ログ内のレコードを削除します。複数のマテリアライズド・ビューがテーブルを参照している場合は、すべてのマテリアライズド・ビューがリフレッシュされるまで削除されない場合があります。

```
delete from "SCOTT"."MLOG$_MTEST1"
where
snaptime$$ <= :1
```

最後にマテリアライズド・ビュー・ログの情報を更新します。

```
update sys.mlog$ set oldest = :1, oldest_pk = :2, oldest_oid = :3,
   oldest_new = :4, youngest = :5, oldest_seq = :6,  last_purge_date = sysdate,
   last_purge_status = 0, rows_purged = :9, purge_job = :10
```