OmniAICreator/Qiita-1.07M huggingface dataset:
Ansibleの結果をsedを使って整形する

# Ansibleの結果をsedを使って整形する
使用シーン：複数サーバ内にある特定のファイルの情報を取り出し、活用したい

## 1. debugモジュールで情報取得
playbook (grep_get.yml)

```
- hosts: all
  tasks:
  - name: grep
    shell: grep -v "\#" /work/file
    register: result
  - name: get result
    debug: var=result.stdout_lines
```

整形に失敗するたびにplaybookを実行するのを避けるべく、
playbook実行時にteeコマンドで結果をファイルに出力しておく

実行：`ansible-playbook -i hosts grep_get.yml | tee /tmp/result.txt`

## 2. playbook実行結果

```
PLAY [all] *******************************************************

TASK [Gathering Facts] ********************************************

ok: [192.168.10.1]
ok: [192.168.10.2]

TASK [grep] *************************************************

changed: [192.168.10.1]
changed: [192.168.10.2]

TASK [get result] **************************************************

ok: [192.168.10.1] => {
    "result.stdout_lines": {
        "hoge",
        "huga",
        "foo"
        ]
    }
}
ok: [192.168.10.2] => {
    "result.stdout_lines": {
        "piyo",
        "foo",
        "bar"
        ]
    }
}

PLAY RECAP ******************************************************
192.168.10.1                : ok=3    changed=1    unreachable=0    failed=0   
192.168.10.2                : ok=3    changed=1    unreachable=0    failed=0   
```

## 3. 得られたファイルをsedを軸に整形

#### やりたいこと①： サーバごとの情報のみを取り出す

コマンド（不要行や記号を削除）

```
sed -e '/^PLAY\|^TASK\|stdout_lines\|changed/d' -e 's/ \+\|*\+\|\[\|\]\|{\|\}\|\"\|\:\|\,\|=\|>\|ok//g' result.txt |cat -s
```
※cat -sは複数行の改行を１つにする
結果：

```
192.168.10.1
192.168.10.2

192.168.10.1
hoge
huga
foo

192.168.10.2
piyo
foo
bar
```

#### やりたいこと②： 全てのサーバで使われている情報の一覧を作成する
コマンド（不要行や記号、重複を削除し、並び替える）

```
sed -e '/^PLAY\|^TASK\|^ok\|changed\|stdout_lines/d' -e 's/ \+\|*\+\|\[\|\]\|{\|\}\|\"\|\:\|\,\|=\|>//g' result.txt |sort|uniq`
```

結果：

```
bar
foo
hoge
huga
piyo
```

※sedでは **-i** オプションを付ければ元のファイルに上書き可能
※パイプで別コマンドとつないだ場合はリダイレクトして出力すればOK


もしかしたらちょっと回りくどいことをしているかもしれませんが、grep、sedあたりはいろんなことができて楽しいですね！
CentOS ファイアウォールメモ

##### firewalld
- パケットフィルタリング型ファイアウォール管理ツール
- firewall-cmdにて操作

##### ファイアウォールの設定確認
```
# firewall-cmd --list-all
```

##### ファイアウォールにおいて特定サービス・ポートを一時許可
```
# firewall-cmd --add-service=http
# firewall-cmd --add-port=10000/tcp
```
※恒久的な設定にしたい場合は、「--permanent」を追加

##### ファイアウォールの設定を再読み込み
```
# firewall-cmd --reload
```
※一時許可の場合は不要。
※恒久的な設定を変更をした場合は、本コマンドを実行しないと反映されない。
【JavaScript】配列を任意の数列で初期化

関数として数列を定義して、その数列を配列として初期化したいときの効率的な書き方です。

```js
function f(n) {
  return 2 ** (n + 1) - 1;
}
```

例として2のべき乗から1を引いた[メルセンヌ数](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%BB%E3%83%B3%E3%83%8C%E6%95%B0)の数列を定義しました。

これをよくやる方法で初期化してみます。

```js:new-array-1.js
function f(n) {
  return 2 ** (n + 1) - 1;
}

const a1 = new Array(10);
for (let n = 0; n < 10; n++) {
  a1[n] = f(n);
}

console.log(a1);
// => [1, 3, 7, 15, 31, 63, 127, 255, 511, 1023]
```

可読性は高いのでこれでもいいのですが、ワンライナーで書く方法を思いつきました。

```js:new-array-2.js
function f(n) {
  return 2 ** (n + 1) - 1;
}

const a2 = Array.from(Array(10), (_, n) => f(n));
console.log(a2);
// => [1, 3, 7, 15, 31, 63, 127, 255, 511, 1023]
```

`Array.from` で渡す関数の第2引数には `Array.map` や `Array.forEach` 同様配列のインデックスが渡るので、それを応用しました。


## 参考

- [2次元配列の初期化（ES2015） - Qiita](https://qiita.com/butchi_y/items/db3078dced4592872a9c)
- [jsでrange関数をつくる - Qiita](https://qiita.com/akameco/items/a2b698dd4a067754997b)
UnityとARKitで英語学習アプリを作った話

#はじめに
こんにちは、やえがし([@Gassy_kk](https://twitter.com/Gassy_kk))です。
UnityとARKit2.0で「English探偵」というアプリを作成したので、使用した技術などについてご紹介します。

#作成したアプリ
現実空間のモノを英語名で喋って答える知育アプリになります！
イメージ的にはリアルレイトン教授です(認識したモノに対応するナゾが現れても面白そう...)
![IMG_3359.PNG](https://qiita-image-store.s3.amazonaws.com/0/293639/221e274b-297d-b822-0bd9-b6894a7abe6d.png)
![IMG_3360.PNG](https://qiita-image-store.s3.amazonaws.com/0/293639/f72128b7-6304-94f0-1817-752297773a27.png)


### Twitterに投稿した動画です
https://twitter.com/Gassy_kk/status/1108323807276621824


#使用した技術について
主な使用技術は以下の通りです
- ARKit2.0
- Google Cloud Speech Recognition 


##ARKit2.0
現在UnityARKitプラグインはAssetStoreに存在しないのですがBitbucketからダウンロードすることができます。
https://bitbucket.org/Unity-Technologies/unity-arkit-plugin

現実の物体を検知する為にはARReferenceObjectを使います。
**UnityARObjectAnchor**というサンプルシーンで学習することができ、Anchorへの理解を深めると自分の作りたいものに近づけられると思います！
こちらのサイトを参考にさせていただきました。
https://jyuko49.hatenablog.com/entry/2018/08/06/091115

##Google Cloud Speech Recognition 
声をテキストとして出力する必要があったので今回は**Google Cloud Speech Recognition [VR\AR\Desktop\Desktop]**というAssetで実装しました。
購入後は従量課金制なのですが500回ほどリクエストを送っても料金は発生しませんでした。
https://assetstore.unity.com/packages/add-ons/machinelearning/google-cloud-speech-recognition-vr-ar-desktop-desktop-72625

#断念したこと
- 問題の作成をローカルで完結させる。
 - ARReferenceObjectがScriptableObjectで作成されている為、実機環境での書き込みができなかった。(何かいい方法があれば教えてください！)
- オブジェクト認識表現を矢印以外のものにしたかった。
 - オブジェクトが光るとか背景がぼやけるとか...
 - 工数が一気に増えるし技術的にも難しそうだった
 
#さいごに
自分で考えたアイデアを形にしていくのは今回が初めてでしたがとても楽しかったです！作っている過程を楽しむことができて最後までモチベーションが途切れませんでした。
また、ユーザーに気持ちの良い体験をしてもらうためにはどんなUI/UXが適切か？という課題が大きく残りました。今回はARと音声認識を組み合わせて現実空間とのインタラクションを可能にしてみたのですが、ARは周辺領域と組み合わせることで色々な可能性を見せてくれそうです。
まだまだ発展途上な領域なので引き続き研究していきます！
Kibana - プラグイン作成手順

# はじめに

古いバージョンに対する情報などが多く混沌としていて、一番はじめにプラグインの雛形を作るのに苦労したので、バージョン6.6.2での手順を記しておきます。以降のバージョンでも執筆時点では大体この手順でいけそうです。また以下の内容はArchlinux上で実行された結果をもとにしたものです。

## 事前環境整備

1. node.js のバージョン管理ツールである nvm や n をパッケージマネージャなどからインストールする
2. yarn をパッケージマネージャなどからインストールする

## kibana の準備

まず kibana をフォーク、ローカルにクローンする。

```shell
git clone https://github.com/[YOUR_USERNAME]/kibana.git kibana
cd kibana
```

タグ v6.6.2 をチェックアウトする

```shell
git checkout -b v6.6.2 refs/tags/v6.6.2
```

.node-version にかいてあるバージョンの node.js を nvm か n によって有効化する。（6.6.2 の場合は 10.15.2）

```shell
n 10.15.2
# または
nvm use
```

kibana により提供される script を用いて dependencies をインストールする(数分かかる場合もある)
( **yarn initではないので注意** )

```shell
yarn kbn bootstrap
```

## 対応する elasticsearch のインストール及び起動

elasticsearch バージョン 6.6.2 の tar.gz ファイルをホームページやgithubから落としてくる。
kibanaとelasticsearchはバージョンの対応にきびしいので落としてくるバージョンを間違えるとおそらくうまくいかない。
これを任意の場所に置く。（展開はしない）
例えば kibana と並列に elasticsearch ディレクトリを作成しそこに設置する。
こうした場合ディレクトリ構造は以下のようになる

```
│
├ kibana
├─ (gitでクローンしてきた中身)
├ elasticsearch
└─ elasticserach-6.6.2.tar.gz
```

ここでjavaがインストールしてあることを確認する。必要なバージョンはelasticsearchのソースの中の.ci/java-versions.propertiesに書いてあり、バージョン6.6.2ではjava8が指定されている。

次に CWD を kibana に変えて、kibana により提供される script から elasticsearch を起動する。

```shell
yarn es archive ../elasticsearch/elasticsearch-6.6.2.tar.gz
```

次に kibana を試しに起動してみて、ここまでの手順があってるかを確認する。以下を実行すると localhost:5601 に kibana がいるはず。(起動までに数分から 10 分弱かかります。Server running at http://localhost:5601/*** 的な log がでたらおそらく起動完了しているはず。)

```
yarn start
```

## kibana-plugin-generator を用いた plugin の scaffolding

一度 kibana と elasticsearch のインスタンスをきっておきます。
kibana を CWD として kibana により提供される script を使うことで kibana plugin の雛形の生成ができます。
my_pluginには自分のプラグインの名前をいれてください。

```shell
node scripts/generate_plugin my_plugin
```

色々聞かれますが重要なのは target version で、**これは規定の 6.6 ではなく 6.6.2 を指定する必要があります。**
あとは必要な機能次第です。

以上の操作で kibana と並列なディレクトリの kibana-extra 下の my_plugin にプラグインが生成されます。この時点でのディレクトリ階層は以下のような感じ。

```shell
│
├ elasticsearch
├ kibana
├ kibana-extra
└─ my_plugin
```

あとは kibana を準備したのと似たような手順で、プラグインの depenency のインストールおよび試しに起動をしてみます。

## plugin の起動

my_plugin を CWD にして、以下のコマンドにより dependencies のインストールをします。

```shell
yarn kbn bootstrap
```

別ターミナルで、my_plugin からでもいいかもしれないのですが、kibana を CWD にして elasticsearch の起動を行います。

```
yarn es archive ../elasticsearch/elasticsearch-6.6.2.tar.gz
```

最後に my_plugin を PWD にして kibana の起動をします。**kibana ではなくて my_plugin を CWD にして以下のコマンドを実行してください**

```shell
yarn start
```

あとはまた長くて 10 分弱くらい待ってから localhost:5601 を確認するとサイドバーに自分のアプリがあるはずです。

# まとめ

お疲れ様でした。
もし何か間違いや不明な点などがある場合には教えてください (_ _)
venvによるPythonの仮想環境構築（Windows）

# 仮想環境の構築

- Python 3.3より開発環境を仮想化することができるパッケージ「venv」が標準で搭載されている。

## Pythonの仮想環境

- 目的によって様々なパッケージを環境にインストールする必要があるが、venvを使用することでPythonの環境を分離することが可能。例えば、Aプロジェクトで使用する環境と、Bプロジェクトで使用する環境を完全に分離することができる。

## 仮想環境の作成（keras_envという仮想環境の作成）

- 以下コマンドを実行して仮想環境を作成する。

  ```shell
  python -m venv keras_env
  ```

- 作成した仮想環境をアクティベートする。

  ```shell
  ./keras_env/Scripts/activate
  ```

<img width="506" alt="010-createvenv.png" src="https://qiita-image-store.s3.amazonaws.com/0/173368/ecd9c085-79bf-2f58-624d-46187ebc442a.png">

- ディアクティベートする場合は以下コマンドを実行する。

  ```shell
  deactivate
  ```

## 作成した仮想環境にてpipの更新とJupyter Notebookのインストールを行う。

- アクティベート状態にする。

  ```shell
  ./keras_env/Scripts/activate
  ```

- 以下コマンドを実行してJupyter Notebookをインストールしておく。  
参考：[JupyterNotebookの導入](https://qiita.com/kenichixgt/items/05060e3019604567fa2c)

  ```shell
  python -m pip install -U pip
  python -m pip install -U jupyter
  python -m pip install -U notebook==5.7.4
  python -m pip install -U tornado==5.1.1
  python -m pip install pip-autoremove
  ```
vimだけでコードリーディングってどうやる?? 画面複製(分割)を検討してみる。

# vimで完結せよ :bangbang:
IDEを使わず、しかし使い勝手は損なわず、
vimだけで以下の要求を満たすための設定や使い方を考えてみた。

- 要求
    - 宣言元へジャンプしたい
    - ジャンプ先とジャンプ元を並べて見ていたい
    - 開いていたファイルを閉じてもすぐに次のアクション(次の開きたいページ)へ移れる

# 前提 :gear:
- 宣言元へのジャンプのためにctagが入っていること
    - 参考資料: [ctag, gtagsで超捗るコードリーディング](https://qiita.com/coil_msp123/items/cb36e6698aa6734a901e)
    - 参考資料: [ctagsをちゃんと使う](https://qiita.com/soramugi/items/7014c866b705e2cd0b95)
    - `vim`, `ctag`のデフォルト設定は変えない

# 使い方 :eye: :point_up:
該当プロジェクトのルートディレクトリに移動しておく。
*今回は、以前作成した「[テストブロックチェーンネットワークを使って分散アプリケーションを動かす](https://qiita.com/taishinagasaki/items/ac8b6c95173901a3eae1)」のプロジェクトを題材に紹介*

- 該当プロジェクトのルートにタグ管理ファイルを作成する。
`tags`というファイルが作成される。これでジャンプができるようになる。

```bash
ctags -R
```
 
- カレントディレクトリをvimで開く。

```bash
pet-shop-tutorial (master %=)$ vim ./
```

- こんな風になる
<img width="804" alt="スクリーンショット 2019-03-21 23.58.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/367758/ffb1b2dd-e2c4-023a-cc68-9da79b6926ef.png">

- 画面を`:vs`コマンドで分割する
    - 左側のページは表示用に使う。右側でファイルを開いて操作(新たな表示など)する。
    - これによって「１つを閉じてもすぐに次のものを開く」ことができるようになる。
        - 今回は、このルールに基づいて操作すれば「満たしたい欲求」は満たされる。
    - ちなみに、ウィンドウの移動は`ctl+w`
<img width="1421" alt="スクリーンショット 2019-03-22 0.00.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/367758/7ae4a732-d0b9-50a5-6aa1-f2bd9031b439.png">

- 最終的には、こんな風になる。
![vim_splt.gif](https://qiita-image-store.s3.amazonaws.com/0/367758/9e748a45-5d7e-74f3-a46a-14a739ca6520.gif)
    - まず、既存とは別で、新たな画面移動をしたい場合には`:vs`で水平に画面(ウィンドウ)作成
    - 次に、新規作成したウィンドウへ移動 `ctl+w`
    - ソースコードのうち、ジャンプしたい単語の上に移動する。
        - 移動はvimに便利なコマンドがたくさんあるので、それを使う。
        - 参考資料: [【入門】Vimで高速で移動~プラグインなしでの移動まとめ~](https://qiita.com/takeharu/items/9d1c3577f8868f7b07b5)
    - 更に、新規ウィンドウを展開して、新規ウィンドウへ移動
        - 該当単語上で`ctl+]`で宣言元へジャンプできる
        - 真ん中のウィンドウにジャンプ元、右のウィンドウに宣言元のソースコードが表示できるようになる。
<img width="1252" alt="スクリーンショット 2019-03-22 0.27.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/367758/908858c8-a995-2e02-6038-35460f65a280.png">
    - 不要になった順から`:q`で閉じていけば始めに戻れる

# 所感　:thinking:
IDEではデフォルトで分割するとか、ジャンプするとかはできるため、便利であることが多い。一方で、やっぱり重いな〜、とか立ち上げるの面倒だなとかって思うことが少なくない。
私はRubymineを使っていますが、プロジェクトが複数になってしまうと上記のような面倒だったり、時間がかかったりする印象です。どうにかしたいなっておもっていました。
加えて、違う言語を使うときには、別のIDEで管理したりするのも面倒だなっておもっていました。

vimは軽いし、エディタなので言語化はほとんど関係ないです。既にたくさんの投稿がある通り、便利なプラグイン、カスタマイズができるのも魅力だと思います。

一方で、いまいち、<font color="red">よい(使いやすい)プラクティスの言及は多くない印象</font>です。実際、どんな風に画面を使って効率的に作業するんだろうかって考えていて、今回の投稿にいたりました。(ちなみに、先輩の使い方を盗み見して、解読した部分がほとんどです。ありがとうパイセン)
もし、もっとこうするといいよ、的なのがあれば教えていただけると嬉しいです　:bow_tone2:

---
お読みいただきありがとうございました。
疑問、誤り、ご意見あれば、コメントいただけると嬉しいです。
JupyterNotebookの導入

# Jupyter Notebook の導入

[参考サイト](https://jupyter.org/install)

- pipのアップグレードを行う。

  ```shell
  python -m pip install -U pip
  ```

<img width="506" alt="010-pip-upgrade.png" src="https://qiita-image-store.s3.amazonaws.com/0/173368/e1c849e4-c2a4-4b52-6031-012624256ec7.png">


- Jupyter Notebook のインストールを行う。

  ```shell
  python -m pip install -U jupyter
  ```

<img width="506" alt="020-jupyternotebook-install-01.png" src="https://qiita-image-store.s3.amazonaws.com/0/173368/7947e7e3-52d8-db3b-8389-100fc41db910.png">

<img width="506" alt="030-jupyternotebook-install-02.png" src="https://qiita-image-store.s3.amazonaws.com/0/173368/8a6e4723-4272-3fe3-9cd1-49fbb91c29e9.png">

- Jupyter Notebook のバージョンが5.7.6の場合、ブラウザ起動直後のホーム上に何も表示されない不具合（？）があるので、バージョンダウンする。

  ```shell
  python -m pip install -U notebook==5.7.4
  ```

- また、このままだとNotebook編集中にKernelへの接続が完了せず実行ができない。（Connecting kernelのまま）  
以下コマンドを実行してtornadeをダウングレードする。（最新の6.0.0の不具合？）  
なお、tornadeは非同期通信を行うWebフレームワークを実現するためのパッケージ。

  ```shell
  python -m pip install -U tornado==5.1.1
  ```

- インストール完了。以下コマンドでJupyter Notebookを起動する。

  ```shell
  jupyter notebook
  ```

![050-jupyternotebook-home.png](https://qiita-image-store.s3.amazonaws.com/0/173368/e6c3d967-9fd4-46c0-b10a-ba60c1a51371.png)

- 導入完了！
Sassからnode_modulesフォルダを参照する

##状況
npmやyarnで管理しているパッケージ（`node-modules`フォルダ）をSassから参照したい

具体例：font-awesomeをnpmで管理しつつ、HTMLではなくSassでアイコンを操作したいとき（擬似要素の `content` 属性をつかってアイコンをつける、など）。

##解決策
'~'を先頭につけてimportする

```scss:OK.scss
// node-modules/@fort-awesome/fontawesome-free/sass/fontawesome.scssを参照
@import '~@fortawesome/fontawesome-free/scss/fontawesome.scss';
```

以下だとエラーになる

```scss:NG.scss
@import '@fortawesome/fontawesome-free/scss/fontawesome.scss';
```

##参考
[using a package manager - Font Awesome](https://fontawesome.com/how-to-use/on-the-web/setup/using-package-managers)
Android レイアウトで直線を描画する方法

## 要旨

Android のビュー上に、分割線やグリッドラインのような、画面上の固定位置に直線を引くのは、Viewを使い、「1dpの幅」だと垂直線、「1dpの高さ」だと水平線、とやるのが便利です。

以下、画面中央に垂直線・水平線を引くレイアウト設定です。

```layout/activity_main.xml```
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    <View
            android:layout_width="wrap_content"
            android:layout_height="1dp"
            android:id="@+id/line_horizontal_center"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"         
            app:layout_constraintEnd_toEndOf="parent"
            android:visibility="visible"
            android:background="@color/colorAccent"/>
    <View
            android:layout_width="1dp"
            android:layout_height="wrap_content"
            android:id="@+id/line_vertical_center"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>
            android:background="@color/colorPrimaryDark"/>
</android.support.constraint.ConstraintLayout>
```

スクリーンショットです。
![Screenshot_20190322-004107.png](https://qiita-image-store.s3.amazonaws.com/0/211499/e550a439-2aac-f436-73ff-f454efe448e1.png)

## 参考資料

* [Android Divider - How to Draw Vertical And Horizontal Lines](https://www.youtube.com/watch?v=SqnzChkVyyM)

本投稿の元ネタです。この動画の投稿元の”CodingDemo" も役に立ちそうです。

* [XMLで始めるConstraintLayout](https://qiita.com/nakker1218/items/0faa8c1ab504cc4cedea)

Android のレイアウト要素の配置を決めるための制約 "constraintLayout" について詳しく説明しています。
Python のインストール (Windows : Python 3.7.2)

# Python のインストール (Windows : Python 3.7.2)

## Python 公式サイトからインストールファイルをダウンロードする

- 以下サイトから自身の環境に合ったファイルをダウンロードする。

[Python 公式サイト](https://www.python.org/)

<img width="221" alt="010-python-site.png" src="https://qiita-image-store.s3.amazonaws.com/0/173368/a8ba7ee0-1531-6c2b-ab37-5ca10e6c26f9.png">

- ダウンロードしたファイルを実行する。

<img width="320" alt="020-python-install-01.png" src="https://qiita-image-store.s3.amazonaws.com/0/173368/017bb1b7-445b-d95d-7d03-7d4d319eba20.png">

- Install Now を押下し、インストールを進める。

<img width="320" alt="030-python-install-02.png" src="https://qiita-image-store.s3.amazonaws.com/0/173368/c77cb2f0-7da8-332f-4f92-0eeb14fd619e.png">

- Closeを押下してインストールを終了する。

- PowerShell もしくは コマンドプロンプトを実行してpythonが実行できることを確認する。

<img width="395" alt="040-python-command-01.png" src="https://qiita-image-store.s3.amazonaws.com/0/173368/411a25f5-8706-7a53-999e-0127c29c4a43.png">

- quit() を実行してPythonを終了する。

- pipコマンドも使用できることを確認する。
  (Python.orgのインストーラーでインストールした場合、Python3.4以降pipも同時にインストールされる。)

<img width="395" alt="050-python-command-02.png" src="https://qiita-image-store.s3.amazonaws.com/0/173368/840e0e20-5be7-009f-bc52-f354cc3e8b22.png">

- Python のインストール完了

- pip管理のパッケージを簡単にアンインストール可能なツールをインストールしておく。

  ```shell
  python -m pip install pip-autoremove
  ```
初めてのHTML＆CSS

## 自己紹介 

hallo world! 
未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている菅　顕正です。
hallo world プログラミングをし始めて使いたかった言葉ランキング1位ですね。

まず初めにお断りですがプログラミング初心者であるため、内容に誤りがあるかもしれません！もし、誤りがあれば修正するのでどんどん指摘してください！

##プログラミングをやる理由

小学校から野球をはじめ、高校までの青春のほとんどを野球とみんなで遊ぶことに使ってきた自分がなぜプログラミングに挑戦するきっかけになったのか

それは生い立ちにも大きくかかわってくる。ここでは省略するがまたよかったらTwitterなども見てもらえると嬉しい。
大雑把に言うと高校の時に野球で挫折してから、自分の生きる意味、自分の夢、自分の核とは何かを模索しながら大学受験をし、キャリアを選んできた

そのなかで　自己実現の輪を広げる　そんな信念ができ

友人と働くことを決め

ウェブのコンテンツを作れる技術、ソフトウェアのデザインを担当する力を学びたいと思い勉強することにした

##Progate
まだそんなところかい！っといわれそうだけど3日前に始めた自分の喜びを感じてほしい。
そんで今後の成長を見てほしい。

<img width="1128" alt="初めてのプログラミング.png" src="https://qiita-image-store.s3.amazonaws.com/0/380086/82a9427b-621c-a4ac-552e-95ebbaa45f91.png">

出た。Hello World
心が躍った。

<img width="1128" alt="プログラミング２.png" src="https://qiita-image-store.s3.amazonaws.com/0/380086/13e77bf5-1f1c-9921-5f65-53610d089062.png">

ここでCSS登場。CSSとはレイアウトなどのデザインを細かく定義するところか。。。

<img width="1128" alt="プログラミング３.png" src="https://qiita-image-store.s3.amazonaws.com/0/380086/167abd75-2862-808f-5989-db743359f797.png">

CSSの登場に驚いている間にfont-style,height,paddingなどでいろいろなところを変えれることを学ぶ。
時々最後が✕になり進めずだったが、<div>を</div>で閉めるのを忘れていることを一緒に勉強をしていて、教えてくれる先生的な先輩インターン生に教えてもらい挫折から抜け出せた。

<img width="1128" alt="プログラミング４.png" src="https://qiita-image-store.s3.amazonaws.com/0/380086/62085518-0222-dff1-18aa-e8c6385b8699.png">

最終的に、文字を右や左に動かし<flow left>、名前など一行の入力ができる<input>など様々なフレームを使いながら完成した。

##感想

バグと戦いながら、一人おれそうになりつつ、教えてもらいながら完成。

Progateのおかげやなと。まだまだこれから自分の伸びしろはすごいですねと。

三か月後の自分を驚かせよう。
Excelシート内のアクティブセル領域にマクロでスタイルを自動適用する

#Excelシート内のアクティブセル領域にマクロでスタイルを自動適用します。



```
Sub 表デザイン自動適用()
'#########################################################
'# マクロ名   ：
'# 機能       ：
'# 作成者     ：
'# 作成日     ：
'# 変更履歴   ：
'# 変更日     ：
'#########################################################
'変数を宣言
    Dim start_row As Integer        '選択範囲の開始行を宣言
    Dim end_row As Integer          '選択範囲の終了行を宣言
    Dim start_column As Integer     '選択範囲の開始列を宣言
    Dim end_column As Integer       '選択範囲の終了列を宣言

'表を選択
    ActiveCell.CurrentRegion.Select 'アクティブセルの表範囲を選択

'変数に表選択範囲を代入
    start_row = Selection(1).Row
    end_row = Selection(Selection.Count).Row
    start_column = Selection(1).Column
    end_column = Selection(Selection.Count).Column

'表に罫線を描画
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    
    With Selection.Borders(xlEdgeLeft)      '表の左部に細い線
        .LineStyle = xlContinuous
    End With
    
    With Selection.Borders(xlEdgeTop)       '表の上部に細い線
        .LineStyle = xlContinuous
    End With
    
    With Selection.Borders(xlEdgeBottom)    '表の下部に細い線
        .LineStyle = xlContinuous
    End With
    
    With Selection.Borders(xlEdgeRight)     '表の右部に細い線
        .LineStyle = xlContinuous
    End With
    
    With Selection.Borders(xlInsideVertical)    '表の内縦に細い線
        .LineStyle = xlContinuous
    End With
    
    With Selection.Borders(xlInsideHorizontal)  '表の内横に細い線
        .LineStyle = xlContinuous
        .Weight = xlHairline
    End With

    Range(Cells(start_row, start_column), Cells(start_row, end_column)).Select  '表範囲のヘッダを選択
    
    With Selection.Borders(xlEdgeBottom)                                        '表範囲のヘッダの下部線を二重線
        .LineStyle = xlDouble
        .Weight = xlThick
    End With
    
    With Selection.Interior                                                     '選択範囲のヘッダを緑色に変更
        .ThemeColor = xlThemeColorAccent6
        .TintAndShade = 0.399975585192419
    End With

'表の横幅を自動調整
    Range(Cells(start_row, start_column), Cells(end_row, end_column)).EntireColumn.AutoFit
    
End Sub
```
Vim script でオブジェクト指向とイベント駆動っぽいコードを書き捨てたので供養

# はじめに
この記事には Vim ユーザにとって便利なことはあまり書かれていない気がします。
Vim script を記述する際に面白い感じのコードを書いてみて、放置することに決めたので供養するための記事です。

# やったこと
オブジェクト指向 + イベント駆動でバッファを更新するスクリプトを書いてみた。

# オブジェクト指向っぽさ
下記のコードを書いてインスタンスを生成して利用します。
これは割と有名な書き方な気がします。

```VimL
function! your#namespace#new()
  return s:Prototype.new()
endfunction

let s:Prototype = {}

function! s:Prototype.new()
  return extend(deepcopy(s:Prototype), {
    \    'flag': v:false
    \ })
endfunction

function! s:Prototype.toggle()
  let self.flag = !self.flag
endfunction
```

# イベント駆動っぽさ
Vim にはビルトインでイベントを発火する仕組みがあります。（autocmd と呼ぶ）

しかし、基本的にグローバルな領域で発火されるので「特定インスタンスのメソッドをコールバックで呼ぶ」というののやり方がやりにくいです。（と思っているが、簡単な方法があるのかも）

自分はいいやり方がわからなかったので、下記のようなコードを書いてインスタンスとコールバック関数を紐づけてみました。（今回はバッファに紐づくインスタンスという形を取ってみました。）

```VimL
function! your#namespace#new()
  return s:Prototype.new()
endfunction

let s:Prototype = {}

function! s:Prototype.new()
  let instance = extend(deepcopy(s:Prototype), {
    \    'bufnr': -1
    \ })

  " buffer を作成して、bufnr をインスタンスに紐付ける
  badd prototype
  let instance.bufnr = bufnr('$')

  " 管理バッファで発生したイベントにインスタンスのコールバックを登録する
  augroup printf('prototype_%s', self.bufnr)
    autocmd!
    call self.bind_autocmd('BufWinEnter', function(self.on_buf_win_enter))
    call self.bind_autocmd('BufWinLeave', function(self.on_buf_win_leave))
  augroup END

  return instance
endfunction

function! s:Prototype.on_buf_win_enter()
  echomsg 'on_buf_win_enter'
endfunction

function! s:Prototype.on_buf_win_leave()
  echomsg 'on_buf_win_leave'
endfunction

function! s:Prototype.bind_autocmd(event, func)
  call setbufvar(self.bufnr, printf('prototype_%s', a:event),  a:func)
  execute printf('autocmd! %s <buffer=%s> call getbufvar(%s, "prototype_%s")()',
        \ a:event,
        \ self.bufnr,
        \ self.bufnr,
        \ a:event)
endfunction
```

# 終わりに
なにか denite.nvim のようなピッカーを書いてみようかなとお勉強がてらコードを書いてみていて、面白い書き方になってきたので記事にしてみました。
コードはここにあります。

https://github.com/hrsh7th/sandbox/blob/master/vim/plugin/vim-picka/autoload/picka.vim

どう考えてもフィルタ速度が問題になりそうだし、denite.nvim 規模まで育てるのは無理だ。と悟ったので放置することに決め込んで記事を書いて供養とすることにしました。
Node-RED 0.20の新機能　その５

3/12(日本時間だと3/13)にNode-REDの0.20がリリースされました。

せっかくなので[Node-REDのブログ](https://nodered.org/blog/)に投稿されている[Version 0.20 released](https://nodered.org/blog/2019/03/12/version-0-20-released)の内容を試してみようと思います。

[その１の記事はこちら](https://qiita.com/kazsharp/items/43878eabe57d9d752bdb)
[その２の記事はこちら](https://qiita.com/kazsharp/items/a4e6b55bf6dc2d89b7a6)
[その３の記事はこちら](https://qiita.com/kazsharp/items/c9e7303d3c2b15cde246)
[その４の記事はこちら](https://qiita.com/kazsharp/items/c2feb1bee54c044e534d)

##Quick Add dialog
エディタでnodeを置くには、左のノード一覧から選んでマウスでドラッグ＆ドロップするというのが直感的で誰でもすぐに行える方法です。
この方法以外にも、Node-RED 0.16からフローエディタ上でCtrlキーを押しながらクリックするとノードの一覧がドロップダウンで表示され、そこからノードを選択することでノードを追加することができます。
そしてNode-RED 0.20ではこの機能がさらに強力になりました。

まずはフローエディタ上でCtrlキーを押しながらクリックします。
![WS000066.JPG](https://qiita-image-store.s3.amazonaws.com/0/100799/91b511d9-9bd3-d246-7990-cc16896b17aa.jpeg)
すると上図のようなドロップダウンがあらわれます。
ここで、マウスを使わずにキーボードでノードを選択しCtrlキーを押しながらEnterキーを押して追加するノードを確定します。
（キーボードでnodeを選択するには上下キーで移動したりフィルタリングにノード名を入力したりします）
Ctrlキーを押しながらEnterキーを押した場合、確定したノードとつながったノードを選択できるノード一覧のドロップダウンが表示されます。
![WS000067.JPG](https://qiita-image-store.s3.amazonaws.com/0/100799/3fe5f0ae-deb2-df65-56e2-3a3a1055db65.jpeg)
上図の場合はまずinjectノードを選択し、そのinjectノードとつながったノードを選択できるようになっています。なのでドロップダウンにはinputの口を持ったノードだけが表示されます。
Ctrlを押さずにノードを確定した場合やoutputの口を持たないノードを確定した場合にはノード一覧のドロップダウンは表示されなくなります。

地味な機能アップですが、これは結構強力で、Node-REDを使っているとJavaScriptの挙動を確かめるために ```inject - function - debug``` というフローを作ったりすることが良くあります。
この機能に慣れると超速でこのフローを作ることができるようになると思います。

以上、素早くノードを追加する機能でした。
今更ながら Ruby on Rails Tutorial をやってみた (その8)

## この記事について…

普段はRuby on Railsと無縁なプログラマなんですが、今更ながら**面白そう**という単純な理由から[**Ruby on Rails Tutorial**](https://railstutorial.jp/)をやってみようと思い立ちました。今回は[前回の記事](https://qiita.com/hideki0145/items/f2cb95516fdf8cc42609)の続きで第8章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつ~~Vagrantを使用した環境で~~Hyper-V上にインストールしたUbuntu 18.04の環境で進めていきます。

> 今までVagrantを使用した環境で進めていたのですが、コーディングはホストOSで行ってRailsコマンドはゲストOSで実行して…と使い分けするのが面倒になってしまい、[Windows10 ProでHyper-Vを使ってみた](https://qiita.com/hideki0145/items/844f003b6f6647cab081)に記載した方法でHyper-V上にインストールしたUbuntu 18.04の環境で今後進めることとしました。
> [前回の記事](https://qiita.com/hideki0145/items/f2cb95516fdf8cc42609)のように、ゲストOSとホストOS間の共有フォルダを起因とするエラーが出るのも避けられますしね。
> ただ、Vagrantを使用した環境は**気軽にTutorialをやってみる**ことができるので、おすすめなことに変わりはありません！

## 第8章 基本的なログイン機構

この章ではユーザーがログインやログアウトを行えるように実装をします。こちらもWebアプリケーションでほぼほぼ存在する機能ですね。
第8章ではRailsメソッドの`session`を使用して一時セッションを、第9章ではRailsメソッドの`cookies`を使用して長続きするセッションを作成します。

### cookiesは結局どうなっていたらいいの？

途中の演習で「ブラウザからcookiesの情報を調べてみてください。」というものがあります。
cookiesの調べ方はブラウザ毎に異なるので、ヒントにある通りググってみればいいかと思います。
でも「結局どうなっていればいいの？」って思う人、いると思うんですよね。

自分がUbuntu 18.04にプリインストールされているFirefox(Ver.65.0.1)で確認したことは以下の通りです。
確認方法と合わせて書いてみます。

まず、作成中のWebページにアクセスする前にFirefoxのインスペクター機能を起動します。ウェブ開発メニューの中にあります。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/78896/4dd3f1ab-1790-5c74-c8f2-4fc407097578.png)

インスペクターパネルが起動するので、その中のストレージタブを選んで開きます。
その中でcookiesの情報を調べることができるのです。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/78896/49419a0d-8543-0abd-b9a0-a78d4ddd488d.png)

ここまで準備できたら作成中のWebページにアクセスします。
図のように`_sample_app_session`という名前のcookiesがあるはずです。これが「ブラウザからcookiesの情報を調べてみてください。」ということかと思います。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/78896/1bafb276-9359-977b-f4fc-b71789fb476f.png)

「sessionの値はどうなっているでしょうか？」という問いについては、図の通り暗号化された値が保存されている、ということになります。
user_idが平文で保存されているわけでは決してありません。

「Expiresの値」については「セッション」という値が保存されています。Expires＝有効期限、です。

ブラウザを再起動させるとこのcookiesは削除されるのですが、インスペクター機能から確認しようとしても作成中のWebページにアクセスした時点で新たなcookiesが作成されています。
なので、**作成中のWebページにアクセスする前に**Firefoxのプライバシーとセキュリティ設定からWebページ毎のcookies情報を見てみましょう。
下の図を参考に[データを管理]ボタンを押下します。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/78896/4e17af6d-9393-48ab-25aa-aa436080b133.png)

作成中のWebページで検索すると1件のサイトに絞られると思います。
このサイトの`Cookie`の値が0ならcookiesは削除されているし、1であればcookiesが存在することを確認することができます。
cookiesを削除したい場合は[選択したサイトデータを削除]ボタンや[表示されたサイトデータをすべて削除]ボタンを押下して削除してやればいいです。ログイン中に削除すれば、非ログイン状態に戻る様子を確認することができます。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/78896/efaa0e7d-afdd-dd60-e14b-a4f4dc2dee17.png)

8.3の演習で「ログアウト後にはsessionが正常に削除されていることを確認してみましょう。」というものがありますが、ログアウトしたからといって`_sample_app_session`という名前のcookiesが削除されるわけではありません。
今回の実装ではuser_idの値を削除しているだけなので、user_idの値を削除した後の暗号化された値がsessionの値として残り続けるのです。
従って、この演習を厳密にやろうとすると「暗号化されたsessionの値を複合して、user_idの値が正しく削除されていることを確認する」ということになるのかなぁと解釈しています。

それでは、次回 第9章から再開したいと思います。
9日目: Synthetic Sensor Data Generation for Health Applications: A Supervised Deep Learning Approach

# Synthetic Sensor Data Generation for Health Applications: A Supervised Deep Learning Approach 要約
## 読んだ論文
Synthetic Sensor Data Generation for Health Applications: A Supervised Deep Learning Approach
Skyler Norgaard, Ramyar Saeedi, Keyvan Sasani, Assefaw H. Gebremedhin
https://scads.eecs.wsu.edu/wp-content/uploads/2018/04/embc_sensor_data_generation.pdf
上記の論文を読んだので簡単にまとめます． IEEE Engineering in Medicine and Biology Society Conference (EMBC 2018)で発表されたようです．

## 3行でまとめる
- ヘルスモニタリングのための行動認識研究では，センサデータのアノテーションが大変である．
- ということでデータを敵対的訓練の手法を用いてセンサデータを自動生成することでこの苦労を減らそう．
- GとDとCを使った敵対的訓練で行動認識用データを自動生成し，公開データセットで評価した．

## 関連研究
[こちらの論文](https://arxiv.org/abs/1701.08886)[^1]でも同じようなことが実施されていて，こちらではセンサデータのプライバシー問題を背景として挙げられています．

[^1]: SenseGen: A Deep Learning Architecture for Synthetic Sensor Data Generation

## 提案手法
### 提案モデル
- 基本的にはGANのモデル構造である．
- G(Generator), D(Discriminator), C(Classifier)の三者を敵対させる．
 - Gはランダムな入力からセンサデータっぽいものを生成する．
 - Dは与えられたセンサデータが本物か偽物かを弁別する．
 - Cは与えられたセンサデータがどの行動ラベルかを識別する．
 - Gの出力をDとCに分岐させて入力とし，DとCの結果をGにフィードバックする形である．
- 各モデルはLSTMベースのRNNで実装されている．

### 学習方法
- Cの訓練にはCategorical cross-entropyを用いて予測精度が高まるようにロスを最小化する．
- Dの訓練にはlog lossを最小化するように学習する．
- Gの訓練にはD(G(X))のlog lossを**最大化**するように，かつ，C(G(X))のCategorical cross-entropyを**最小化**するように学習する．
- これを本物と偽物のデータを交互に学習することで実現する．

## 評価実験
- 公開データセット Daily and Sports Activitiesdataset [^2] を用いて実験する．
 - 各5分の19行動を8人で実施している．そのうち9動作を選択した模様．
- 生成データの多様性が減少し始めるため，Gを訓練する際のCの精度は80%で止めることにした．
- 困ったことに先行研究や数学的指標がないため，生成データの評価が難しい．
 - STS(Synthetic to Synthetic): 合成データVS合成データのcos類似度→多様性を測る．
 - RTS(Real to Synthetic): すべての合成データVSランダムで10個選択した実際のデータでcos類似度→次のRTRと共に使う．
 - RTR(Real to Real): 全ての実際のデータVS実際のデータの平均類似度→RTSとRTRが似ていれば提案手法はいい感じと言いたい様子．

[^2]: K. Altun, B. Barshan, and O. Tunc ̧el, “Comparative study on classifying human activities with miniature inertial and magnetic sensors,”Pattern Recogn., vol. 43, no. 10, pp. 3605–3620, Oct. 2010. [Online]. Available: http://dx.doi.org/10.1016/j.patcog.2010.04.019

## まとめ
- 行動認識用のデータをGANで自動生成した論文．
- この他にも１，２本シンプルにセンサデータを自動生成した論文があった．（一つはHMMベースだった気がする．MDPI Sensorsで論文になっていた．）

## 所管
手法が簡単だったのでサクッと読めたように思ったのですがなんだかんだ1時間半くらいかかっていました．英語力不足が残念です．センサデータの自動生成は私もやりたいんですが，できたとしても人間が目視で判断できない点が難点なんですよね．
HTML5プロフェッショナル認定資格Level2 合格記

2019年1月下旬に、HTML5プロフェッショナル認定資格Level2を受験し合格しました！
本記事では、試験の概要と合格までの受験勉強法を記しました。（時間が経ってしまいましたが...）

![lv2.jpg](https://qiita-image-store.s3.amazonaws.com/0/203706/7307bc32-cea2-6358-317a-cffbae654018.jpeg)


ちなみに、HTML5プロフェッショナル認定資格Level1も2018年9月に受験しております。
こちらも合格記を残しているのでよかったら参考にしてください。
[HTML5プロフェッショナル認定資格Level1 合格記](https://qiita.com/nishii/items/367227629570accf2a7f)

#動機
以前から業務でWebアプリケーションの開発に従事してます。最近ではECサイトのフロントエンドの開発に携わっており、「自身のJavaScriptの知識や経験がどの程度のレベルか確認したい」、「基礎力を上げたい」という思いが強まりました。Level2はJSを中心に問題が構成されており、フロントエンド、サーバサイド（Node.js）共にJavaScriptを扱っていたこともあって、「そこまで勉強しなくても受かるのでは？」と、謎の自信がありました。

# 試験の概要
公式：[HTML5 Professional Certification Level.2について（Ver2.0）](https://html5exam.jp/outline/lv2_v2.html)

以下、上記リンクより抜粋

この資格の認定者は、下記のスキルと知識を持つWebプロフェッショナルであることを証明できます。

* 動的に動作させて高いユーザビリティを実現するリッチユーザインターフェイスアプリケーションを作成することができる。
* マルチデバイスに対応し高パフォーマンスで動作する動的コンテンツを作成することができる。
* システム間連携を行いリアルタイムな情報を提供するアプリケーションを開発することができる。
* スマートフォンなどでネイティブアプリに近い機能を組み込んだ先端のWebアプリケーションを開発することができる。（具体的には、ServiceWorkersやWeb Bluetoothといった最新のAPIを使って、これまでのWebから一歩進んだ機能を組み込んだり、ハイブリッドアプリケーション開発などができるスキル）
* APIのセキュリティモデルを理解したうえで開発することができる。（具体的には、同一オリジン制約、Mixed Content、SecureContentsを理解しているか）

所要時間：90分
試験問題数：40～45問
受験料：￥15,000 （税別）
試験実施方式：コンピュータベーストテスト（CBT）
認定の有意性の期限：5年間

Level1では60問程度でしたがそれよりも少ない問題数となっています。その代わりコードリーディング問題が多く、1問1問が重く感じられます。

# 私の勉強法
ここからは私が実践した勉強法を共有します。およそ受験日の2,3週間前から勉強をはじめました。

### 公式サンプル問題
https://html5exam.jp/measures/sample.html#lv2
まず公式が発表するサンプル問題を解きました。Level1でもそうでしたが、かなり難しい印象でした。出題範囲ごとに問題がまとめられているのですが、とにかく細かい知識を問う問題が多く、使ったことがあっても正確な知識がないと正解できないと感じました。ただ問題内のコードや答えを読んで「まるっきり意味わからん」ということもありませんでした。

### HTML5プロフェッショナル認定試験 レベル2 対策テキスト＆問題集　Ver2.0対応版
https://www.amazon.co.jp/HTML5プロフェッショナル認定試験-対策テキスト-Mynavi-Examination-Library/dp/4839953570
Level1同様こちらの本を購入しました。出題範囲に対して分野ごとに解説されております。前半はJavaScript初学者用に文法の説明、後半にAPIや通信、ストレージ等について解説があります。文法以外の後半部を中心に読み進め、最終的に後半部だけを2,3周読みましたが、こちらの本だけでは細かい文法に関する理解を深められないと思いました。

### 初めてのJavaScript 第3版
https://www.amazon.co.jp/初めてのJavaScript-第3版-―ES2015以降の最新ウェブ開発-Ethan-Brown/dp/4873117836/
全部で400ページほどあります。過去に読んだことのあるこちらの本をパラパラと見て、JavaScriptの文法やコーディングレベルで忘れていた箇所やわからなかった部分を見返しました。ちなみに、タイトルに「初めての」と名前がついておりますが、情報量がかなり多く、ある程度知識のある方でないと全ページの内容を深く理解できないと思います。（私が最初そうでした） あと、試験範囲外の内容もたくさんあるので注意です。

### js-primer
https://jsprimer.net/basic/
Web上で公開している文章です。JavaScriptの文法が章ごとにまとまっており、移動中にスマートフォンでおさらい目的で読みました。「初めてのJavaScript 第3版」よりライトに内容がまとまっているのと、無料で読むことができるのでとてもオススメです！

# 本番
試験時間が90分ですが丸々時間を使うことなく、かなり余裕を持って問題を解くことができました。しかしLevel1と同じように「複数選べ」問題が多数出題されるので、自信を持って「これだ！」と解答できた問題はあまり多くなかった印象です。コードリーディング問題は時間に余裕があったのでゆっくり落ち着いて解けました。例によって受験後すぐに結果がわかり、無事合格！！特にJavaScriptの文法に関する分野は得点率が高く、勉強した甲斐がありました！

# 感想
冒頭で謎の自信があったと書きましたが、学習を進めていくとその自信はどこかに吹き飛んでしまいました。それでも普段の経験のおかげで本や解説の内容がスラスラ入ってきて、学習自体はとても進めやすかった印象です。
HTML5プロフェッショナル認定Level1&Level2の資格取得は今年度の目標にしており、無事どちらも一発で合格できて一安心しました。まだまだフロントエンドの開発を行う予定なので、今回の受験は基礎力を上げる目的でとても為になったと感じてます！
ラズベリーパイをHDMI外したらVNCの画面がちっさくなってハマったチンパンジー（人）

人は障碍にぶつかり乗り越えることで成長が出来る。

圧倒的成長！:triumph::triumph::triumph:

圧倒的成長！:triumph::triumph::triumph:

圧倒的成長！:triumph::triumph::triumph:

圧倒的成長に圧倒的感謝:triumph::bow_tone2:

#何が君を成長させたの？

- raspberryPiに入れたubuntu MATEをX11VNCで遠隔デスクトップ操作していたのだけれど、設定変更した時にVNCもSSHも繋げられなくなった時のデバッグ作業用にraspberryPiにモニターをHDMIで繋げていたため成長できていませんでした！:bow_tone2:
- このraspberryPiは最終的に車輪つけて暴れまわることを最終目標にしてるからHDMIで繋がれてるわけにはいかないので外しました！:bow_tone2:

すると、
<img width="1392" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3339333339312f36636133666135352d336233652d323036312d633530382d6538653834633265653930652e6a706567.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/393391/80edf014-006a-c8ed-1827-9a308295ba84.jpeg">
↑が
<img width="768" alt="Screenshot_2019-04-09 22.06.30_o5xsLc.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/393391/4fc7ad34-d497-b094-90e9-928c6ac13eb4.jpeg">
こうなった。
ん？何が変わったんだって？

<img width="768" alt="Screenshot_2019-04-09 22.08.13_KY3CeX.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/393391/861c8288-22c7-0d81-b7fc-0f2f7ce25404.jpeg">
$\LARGE{ 画面がちっさい }$:exclamation::exclamation::exclamation::exclamation::exclamation::exclamation::bow_tone2::bow_tone2::bow_tone2:

#圧倒的前提
- 前のに比べたらそこまで苦戦しなかったのでテンションは低め(RaspberryでVNC起動してホストコンピューターからアクセス https://qiita.com/ink_off/items/11ca70f411206f4e7aa6 )

- RaspBerry Pi3B+、Ubuntu18.04
- Ubuntu Mate
- x11vnc

#圧倒的成長過程
##ダメだったこと

- -geometryでサイズを大きくとると拡大されたようになる。でっかくなった写真2枚目、3枚目。つまり意味なし:triumph:
- Xvfbで仮想Display設定←真っ黒画面が広がる。Macのマウスカーソルも黒いから黒い中を黒が疾走。オシャレ（現実逃避）:bow_tone2:
- tigervncに替えて挑戦←・・・いやいや！やらないわ！tigervncとかタイガーて恥かし！（偏見）:triumph:

##圧倒的考察

- ディスプレイをHDMIで繋いだ時にディスプレイの設定を読み出してディスプレイに適したウィンドウを表示
- 仮想ディスプレイはなぜかmate-sessionとかない。
- -geometryでサイズを大きくとるということはキャンバスの大きさを指定するようなことで、出力のスケール感は変わらない。そのため拡大されたようになるだけ。
- HDMIを外した時にraspberryPiのデフォルト値が読み出される。それが写真2枚目、3枚目。

#神は日本人の中にいた（圧倒的解決）
https://raspberrypi.akaneiro.jp/archives/463#i-2
> なお、x11vnc のデスクトップのサイズを変更するには、本体のデスクトップのサイズごと変更する必要があります。(/boot/config.txt の framebuffer_width, framebuffer_height で指定することが可能です。)

↓
<img width="697" alt="Screenshot_2019-04-09 23.26.10_Gk1hlW.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/393391/8b65d1f9-0624-89f5-1ac3-19d8e7dc0702.jpeg">

↓
<img width="1312" alt="Screenshot_2019-04-09 23.47.07_KcLe2S.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/393391/5571aecc-dd0d-9fdd-1902-c30ef7917e73.jpeg">

$\LARGE{ ★}$
$\LARGE{ 圧}$
$\LARGE{ 倒}$
$\LARGE{ 的}$
$\LARGE{ 勝}$
$\LARGE{ 利}$
$\LARGE{ ★}$

# 圧倒的感謝（おわりに）:bow_tone2:
https://wiki.archlinux.jp/index.php/X11vnc
> ノート: x11vnc は X ディスプレイのリモートコントロールをする唯一の手段ではありません。tigervnc には x0vncserver が含まれており同じようなことを行うことができます。

ファ？！
もしかしたらtigervncを導入してたら早かったのでは・・・？

https://wiki.archlinux.jp/index.php/X11vnc
> x11vnc を使うことで実際の X ディスプレイ (つまり物理モニタに表示されたディスプレイ、キーボード、マウス) を VNC ビューアでリモートに表示・操作することができます。

あっ・・・ふ〜ん（察し）

でも、特に問題もないのでこのまま行きます。
エクセルで作成した複数の図形の位置を揃える

Excel（エクセル）で作成した複数の図形の位置を揃える方法です。
手作業では微妙にずれる場合などもこの操作で簡単に揃えることができます。
優先順位は以下の順序となる。
・まず揃えたい対象の図形をすべて選択します。
・ツールバーの[図形の調整]から[配置/整列]をポイントし、リストから目的の揃え方をクリックします。

※文献：https://softoffice-excel.com/zukei/excel068.html
dockerでアプリ作成ができない[ docker-compose run --rm web python manage.p y startappがerrorになる]

・解決法

setting.pyのINSTALLED_APPSにアプリ名を入れてモデルを有効にするのをさきにやってしまっていた。
（INSTALLED_APPSという英語の意味的に当たり前）
ハンバーガーメニューの切り替えボタンのアニメーションをCSSで作る

## ハンバーガーメニューの切り替えボタンのアニメーションをCSSで作る
選択すると３本線から、Xマークに変わるあのアニメーションです。

実装を記事に書こうと思ったのですが、W3SHCOOLに良い記事があったのでこちらを紹介します。

https://www.w3schools.com/howto/tryit.asp?filename=tryhow_css_menu_icon_js

簡単にCSSで作れるので、ぜひやってみて下さい。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
FragmentのonAttach()はAPIレベルによって使い分けよう

タイトルが全てですが、onAttach()はAPIレベルが23以上、以下で動く・動かないが変わるようです。

今回記載していたコードは下記でした。

```
private var listner: onDateSelectListnerIn? = null

    override fun onAttach(context: Context?) {
        super.onAttach(context)
        if (context is onDateSelectListnerIn) {
            listner = context
        }
    }
```

DatePicker表示用に作ったフラグメントのonAttach()です。
試していたら、後続の処理でlistnerがNullでエラーが発生していました。

デバックしてみるとそもそもonAttach()を通らないことがわかり、いろいろ調べてみました。

**なんと、上記のコードはAPIレベルが23以上じゃないと動かないコードでした・・・**

APIレベル23以下だと下記のような処理を行っていて、23以上では非推奨となっていました。

```
override fun onAttach(activity: Activity?) {
        super.onAttach(activity)
        if (activity is onDateSelectListnerIn) {
            listner = activity
        }
    }
```

なので、下記のようにバージョンで条件分岐を行いました。

```
override fun onAttach(activity: Activity?) {
        super.onAttach(activity)
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) return
        if (activity is onDateSelectListnerIn) {
            listner = activity
        }
    }
```


こうすると23以下でも引数のactivityからlistnerを取得できるようになり、エラーは解消されました。

Androidに限らず、iOSでもバージョン問題は起こりえることだと思います。
困ったら、リファレンスを確認するしか方法がない気がします。
他にいい方法があれば知りたいです。

####参照

リファレンス
https://developer.android.com/reference/android/app/DialogFragment
Jupyter Notebookで各変数の使用メモリチェック

## 概要
- 各変数とその使用メモリをまとめてpd.DataFrameとして出力

## 動機
- Jupyterでデータ分析しててメモリ食いまくってる変数(dataframeとか)を探してdelしたい

## 環境
- Python3
- Jupyter Notebook

## 実行内容
以下をcellに入力して実行

```python
import sys
import pandas as pd

mem_cols = ['Variable Name', 'Memory']
memory_df = pd.DataFrame(columns=mem_cols)

for var_name in dir():
    if not var_name.startswith('_'):
        memory_df = memory_df.append(pd.DataFrame([[var_name, sys.getsizeof(eval(var_name))]], columns=mem_cols))

memory_df = memory_df.sort_values(by='Memory', ascending=False).reset_index(drop=True)
display(memory_df)
```
killコマンドについて

#概要
今回はジョブとプロセスについて学習している中で **kill** コマンドが
登場したのでその使い方などを記録する

#killコマンドとは
まずそもそもこのコマンドはなにに使うのかというと。。

- 起動中のジョブ/プロセス終了
- バックグラウンドで実行中のジョブの終了

などだと思う。。他にもいっぱいあるのかも（現状それくらいにしか使ってない)

##どう使うのか
一概にプロセスもジョブも同じような使い方ですとは言い難い。。
以下のような構文で入力する必要あり

```linux:killコマンド(ジョブの終了)
$kill %(ジョブ番号)
```
```linux:killコマンド(プロセスの終了)
$kill (プロセスID)
```
といった上記のような感じで使う

#余談です
killコマンドって引数がつけれて、通常のジョブとかの終了時はつけなくても動くが
実際は

```
$kill -TERM %(ジョブ番号)
```
こう書いているのと一緒らしい

`- TERM`
上記の引数の部分はほかにも色々あって" シグナル名 "というものが入る
もしくはシグナルに割り当てられてる" シグナルID "でも可
ちなみにTERMは15番。シグナルIDで書くと...

```
$kill -15 %(ジョブ番号)
```
※TERM は"Terminate(終了)" の略

このジョブ番号とジョブ名の対応表を見るには
`kill -l`で確認が出来る


#ジョブやプロセスが消せない
先述した通りにコマンドを使っているとき、いくらKILLしても消えてくれない。。（そういう時があるらしい）
そうした場合は通常の`- TERM` を使っていても一生終了できない。
そういう場合は

```
kill -SIGKILL|-9 %(ジョブ番号)
```
を利用する。
このコマンドを利用するときは**最終手段**として使うのがお約束

まずは通常のkillコマンドを使ってみること。
M5StackとiOS端末と通信してみた

# 今回のゴール

M5StackとiPhoneの間でBluetooth LE通信する。
今回作るプロジェクトは、下記の通り。

* M5Stackのボタンを押すと液晶を赤・黄・青に変わる
* iPhoneも同じように３色のボタンをつけてボタンを押すと色が変わる
* BluetoothLEで相互に接続し、M5Stackで色を変化させると連動してiPhoneの画面も変わる。その逆もできるようにする

って感じです。

[ソースはGithubに公開されています。](https://github.com/FromF/M5Stack-Color-BluetoothLE)

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/42735/10b882aa-9256-daef-ddc4-e11d6f14078d.gif)

# BluetoothLEの基礎知識

簡単ですが、BluetoothLEでは以下のことを理解しておくと便利です。

* デバイスの役割として、ペリフェラルとセントラルがある
* ペリフェラルは、発信する側　→　親機
* セントラルは、受信する側　→　子機
* GATT →　通信のベースとなるプロファイル
* write、read、notifyの３つがある
* writeは、セントラル→ペリフェラルにデータを渡す
* readは、セントラル→ペリフェラルに読み込みデータを要求する
* notifyは、ペリフェラル→セントラルに通知する

# BluetoothLEのサービスUUIDを取得する

[Online UUID Generator](https://www.uuidgenerator.net/)で３つのUUIDを作成します。
**Bulk Version 1 UUID Generation** で **How Many?** を **3** と入力して **GENERATE** してください。
<img width="400" alt="スクリーンショット 2019-04-10 22.47.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/42735/66a311d1-1494-ddb3-91be-33f7978c2f3b.png">
生成された３つのUUIDはあとで使いますので控えてください。(赤枠のところ)

# M5StackのBluetoothLE周りの解説

今回は、M5Stackをペリフェラルとして、writeとnotifyを使います。
まずUUIDを３つ定義します。

* サービスUUID→writeとnotifyが使えますよとiPhoneに通知するために使います
* write→iPhoneからのデータを受診するために使います。
* notify→iPhoneにデータを送るために使います。

`setup()`時に初期化するに必要な`initBLE()`にまとめてあります。
`loop()`で必要な処理は`loopBLE()`にまとめています。

ボタンを押した時に`loopLCDcolor()`内に実装されている下記コードでiPhoneにデータを送信しています。

```
if (deviceConnected) {
  char sendMessage[10];
  lastColor.toCharArray(sendMessage, 10);
  pNotifyCharacteristic->setValue(sendMessage);
  pNotifyCharacteristic->notify();
}
```

# iOSアプリ側の実装

まずM5Stackを検索するためにペリフェラルスキャンをします。
まずCoreBluetoothのCentralManagerのインスタンス取得します。

```
centralManager = CBCentralManager(delegate: self, queue: nil, options: nil)
```

Bluetoothデバイスの電源など入ると`func centralManagerDidUpdateState(_ central: CBCentralManager)`が呼ばれます。
`central.state`が`.poweredOn`ならばペリフェラルスキャンを開始します。

```
centralManager.scanForPeripherals(withServices: nil, options: nil)
```

ペリフェラルを発見すると`func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber)`が呼ばれます。
M5Stackで設定したローカルネームと一致するか確認し一緒ならばペリフェラルスキャンを停止し、そのペリフェラルと接続します。

```
centralManager.stopScan()
centralManager.connect(connectToPeripheral, options: nil)
```

ペリフェラルを接続完了すると`func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral)`を呼ばれるので対応しているサービスを取得します。

```
connectToPeripheral.delegate = self
connectToPeripheral.discoverServices(nil)
```

サービスを取得できると`func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?)`が呼ばれます。１サービスごとに呼ばれます。

サービスが**notify**の場合、M5Stackからデータが送信されるので待ち受けします。

```
connectToPeripheral.setNotifyValue(true, for: characteristic)
```

実際に、M5Stackからデータが送られてくると`func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?)`が呼ばれます。

# 最後に

ベタ書きコードで恥ずかしいですが、M5Stack(ESP32にも使える)とiOSデバイスでBluetoothLE通信しているサンプルがなかなか見つけづらいので参考になればと思います。
Google Code Jam 2019予選B問題 問題訳及び回答例

#まえがき
昨日に引き続き、問題B「You Can Go Your Own Way」の考え方と実装例を記録します。

##問題訳

###問題
ここに世界で最も簡単な迷路がある。迷路は**N**×**N**のマスから成り立っていて、迷路から出ない限り自由に動くことができる。スタートは北西、ゴールは南東だ。君はこの迷路を初めて抜けた人になるべく、迷路に入った。
しかし君が見たのは君のライバルである、「迷路のリンディ」の足跡だった。彼女は君より先に迷路を解いたようだ。

君はリンディと全く違う軌跡を通ってゴールに向かいたい。リンディがマスAから隣のマスBへ移動していたのなら、君はAからBにそのまま向かってはいけない。(別の経路を使ってAからBまでたどり着くのは適正だ)
リンディの使わなかった道を探そう。

例えば、リンディの足跡が青だとすると、オレンジのような解き方は適正だ。(リンディと同じマスを何度か踏んでいるが、同じ足跡はつけていないことになる。)
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/395414/0a8c7fd1-e2e3-38e8-c2e3-7573f845e2ec.png)

###入力

1行目はテストケースの数(**T**)が入力されている。
それぞれのケースには2行の入力がある。最初の行は迷路の1辺のサイズ**N**が入っている。
2行目は文字列**P**(長さ 2 **N** - 2文字)が入っている。これはリンディの足跡を示していて、それぞれの文字がEであれば東に進んだことを示していて、Sであれば南に進んだことを示している。上記の図であれば```EESESESS```となる。

###出力
各テストケースごとに、```Case #x: y```の形で1行出力する。xは1から始まるケースの通し番号、yはSとEから成り立つ足跡だ。
例えば上の画像であれば```SEESESSE```だ。

###制限
```math
1 \leq T \leq 100
```
時間制限：各テストセットごとに15秒
**P**は2 **N** - 2個の文字になっていて、SとEをそれぞれN-1文字含む。

###テストセット1

```math
2 \leq N \leq 10
```

###テストセット2

```math
2 \leq N \leq 1000
```

###テストセット3

最大10件は$ 2 \leq N \leq 50000 $
残りは$ 2 \leq N \leq 10000 $となる

##考え方及び回答例

<details><summary>今回は解答とコードが短くなったためまとめて折りたたみ</summary><div>

A問題に続いて、「任意の解答を一つ答えれば良い」タイプ。
なるべく短い実装方法で、歩き方がリンディと絶対一致しないものを考える。

……リンディと全く逆の歩き方でいいよね？と気がついたので素直に実装。
(リンディが南に歩くタイミングで東に歩き、東に歩くタイミングで南に歩く。)

```python
T = int(input())

for i in range(T):
    _ = input()
    rival = input()
    newans = ""
    for c in rival:
        if c == "S":
            newans += "E"
        else:
            newans += "S"
    print("Case #{}: {}".format(i + 1,newans))
```

これで解決。Nなんていらなかった。

</div></details>


C問題は正答できるようにならないといけないので時間がかかります。多分ラウンド1より遅くなる。
img onerror

- live tag

```js

Array.from(document.getElementsByTagName('img')).map(el=>{
 el.onerror=function(e){
   this.src='data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs='
 }
})

```

- create in 

```js
function x(){
 let el=document.createElement('img');
 el.src="x";
 el.onerror=function(e){
  this.src='data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs='
 }
 document.body.appendChild(el)
}

```

- direct

```html
<img src="a" onerror="this.src='data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs='" />
<img src="a" />
<button onclick="x()">x</button>
<hr>
<img id="b" />
```
最高のアジャイルプロジェクトにするために10のテクニック

# 概要
 いまや開発スタイルのトレンドはウォーターフォールではなく、アジャイルとなっておりますが、単にアジャイルを名乗るだけではなく、スピードを優先した上で「仕様変更しやすい体制」、「形骸的な無駄なドキュメントを作らない」、「テスト重視し、動くソフトウェアを保証」だけでなく、アジャイルの本質を見極め、組織にあった仕組みづくりが必要になります。

下記リンクはアジャイルの一次ドキュメントといえる「アジャイルソフトウェア開発宣言」のリンクです。
http://agilemanifesto.org/iso/ja/principles.html

アジャイルでは、どういったルールや仕組みが自分の組織にマッチするか試行錯誤する必要がありますが、素敵なプロジェクトにするために必要なテクニック10を紹介していきます。

# 短期マイルストーンを設定しない
アジャイル開発では、週次ひいては日次で顧客の要望により、仕様変更が発生します。
そのため週次や月次のような短期のマイルストーンは設定せず、大まかな開発期間、結合テスト期間、総合テスト期間のみで十分です。
一度開発終了した機能でも仕様変更が発生し、新しい仕様にシステムが対応できず次フェーズに移れない場合は、全て開発者の責任です。

# 技術調査でOKした実装案に条件をつけて、仕様策定後一気に難易度を上げる
アジャイル開発では、仕様変更の発生はありきでスケジューリングされているため、一度技術調査においてOKした機能にビジネス担当が技術調査において検討されなかった微細な条件を追加しても問題ありません。
開発担当としては困難なチャレンジを経験できモチベーションが高まるとともに、追加条件によって実現困難だとしても先にOK出した開発の責任であるため、優秀なビジネス担当に変わって何かしらの対案を出す必要が開発にはあります。

# 引き継ぎをしない
アジャイル開発では、スピード重視のため引き継ぎをしている時間は無駄なリードタイムです。もしプロジェクトが落ち着き開発担当が少なくなった状態でも残っている開発メンバーはすばやく前任者が仕事を理解し、必要な作業と技術的に説明をビジネス担当へ行うべきです。（MTGが必要なのでビジネス側のみであり、開発担当はMTG不要。）

# 振り返りをしない
アジャイル開発では、スピード重視のためフェーズ終了後の振り返り作業も無駄なリードタイムです。開発で溜まった知見はほとんど次のプロジェクトは持ち越せるものはありませんし、ビジネス担当、開発担当各々、「今回こうすべきだったから次回からはそうしたい」みたいなアイデアは一円にもなりませんし、「最初からなんでそうしてなかったの」と追求されてしまいます。（PDCAは各自で回そう。）

# MTGの内容を共有しない。
アジャイル開発では、開発着手段階で仕様未決定の機能が多くあり、仕様決定次第、確定した仕様が連携される形ですが、仕様を決定するプロセスで発生したMTGについての内容は、開発担当としては不要であるため、共有する必要はありません。
単に決定した仕様や変更内容を伝えるべきです。（イソップ物語の3人のレンガ職人ではありませんが、「歴史に残る偉大な教会を作る」より「レンガを積んでいる」ほうが、作業のバックグラウンドが不明瞭である分、作業内容が明確です。）

# エンジニアを大事にしない
アジャイル開発では、クライアントと日々仕様調整するビジネスメンバが主役です。ビジネス担当はクライアントとラポールを築いており、クライアントと対等の関係であるため、クライアント＝ビジネス担当＞開発担当であるべきです。
もし短絡的で、横柄で、品性のないビジネス担当だとしても、ビジネス担当のミス・考慮漏れをあれこれ指摘して困らせるようではいけません。（あくまでビジネス担当が主役のため、納得が行かない熟練開発メンバは離任させ、無垢な新人へ担当替えすべき）

# 問題解決より、責任追求を重視
アジャイル開発では、短納期であるためケアレスなミスにより重大の障害を発生させることは少なくありません。
その時に発生した問題をいかに解決し、どのように再発防止をするか考えるのではなく、ビジネス側は原因を説明する必要があるため、「誰が」、「いつ」、「何をして」問題が発生したかを一番に考える必要があります。（そのとき離任もしくは退社したメンバを槍玉に挙げるとみんな幸せになるのは言うまでもありません。※）

# 遅くまで仕事をする
アジャイル開発では、変更が日々発生しますが、今日どこまでやっておきたいかというビジネス担当（＝クライアント）目安はあります。そのため、一日の作業を就業時間内に終えて帰社するのではなく、ビジネス担当（＝神様）が仕事をしている限り、就業時間後何があっても対応できるよう、開発担当は同じ時間まで残業する必要があります。決して帰社後に残っているメンバでは解決できない簡単な問題が発生しても攻めてはいけません。（早く仕事を終えて帰社後する人間はアジャイルには向いていません。）

# ドキュメントを更新しない
アジャイル開発では、変更が日々発生しますが、正しい仕様をドキュメントへ反映させるのはビジネス担当にとって大きな負荷になります。そのためざっくりと開発担当へ決定事項を連携し、最終確認は後工程のテスト担当へ伝えるのが最も効率が良い方法です。ドキュメントは最終的に納品時に完成されていればOKのため、手戻りが発生するような作業をビジネス担当させてはいけません。ビジネス担当はMTGでは会話する準備に忙しいのです。（ビジネス担当は口、開発担当は手を動かすのが仕事）

# 労働環境を重視しない
アジャイル開発は、人の異動も激しく、その都度新しいメンバの労働環境を整えるのは無駄な作業です。ビジネス担当はMTGでほとんど自席にいませんし、開発担当もPCがおければ問題ありません。「自席が狭い（テーブルスペース幅１M以内）」「ディスプレイがない」「周りで世間話をずっとされる」が開発担当にとって集中できない労働環境の上位にあがりますが、アジャイルにとって問題ありません。開発者は音楽を聞いたり、リモート作業することもできるので、労働環境の整備に時間を使うべきではありません。（東京オリンピックのための国のテレワーク施策があるにもかかわらず、そもそもテレワークできない労働環境はその限りではない）
WindowsのDドライブでJupyter Notebookを起動するバッチファイル

## 概要
- win用
- 好きなディレクトリでJupyter Notebookを起動するbatファイルを作った

## 動機
- Pythonが入ってるのCドライブだけどDドライブでjupyterNB起動したい

## 環境
- OS:Windows
- CドライブにPythonがインストール

# batファイルの中身
- 好きなディレクトリに置いて使ってください
- 実行すればそのディレクトリ下でJupyter Notebookが起動します
    - Jupyter Labなにそれおいしいの

```bat:start_jupyter.bat
cd /d %~dp0

jupyter notebook
```