OmniAICreator/Qiita-1.07M huggingface dataset:
【Blender】 ボーンを入れてウェイトペイント、ポージング

<img width="600" alt="スクリーンショット 2019-01-29 13.01.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/258078/6c643402-1eeb-7f3a-f6ca-6afea237fcf9.png">

前回記事
[【超初心者向】Blenderで3Dモデルを作る](https://qiita.com/mochifuture/items/2b79c27bcd0faa2d26e8)

# ボーンを追加

## アーマチュアを追加
アーマチュアとは、ボーンの集合体の総称。

## ボーン、Tip、 Rootとは
<img width="209" alt="bone.png" src="https://qiita-image-store.s3.amazonaws.com/0/258078/7f094905-46d7-d8b7-2972-a349709714cd.png">

Rootの方が全体の中心方向、Tipは先端方向となります

3Dカーソルを中央に合わせる `Shift + C`
オブジェクトモードで、`shift + A` ->`アーマチュア`を選択
追加されたアーマチュアを選択して、編集モードへ切替
ボーンを腰骨のあたりに移動
`G + Z`でZ軸方向に移動
TipやRootを選択し`G`するとボーンを伸縮できます

`E (Extend)`でボーン追加

左右対称モードでボーンを編集: オプション> アーマチュアオプション> X軸ミラー　にチェック
`Shift + E`で左右対称にボーン追加できます

関節にしたい、曲げたい部分に、最小限のボーンを入れます

# メッシュとボーンの関連づけ（親子関係 parent-child)

今のままではメッシュとボーンが関連づいていない

オブジェクトモードで、
1. メッシュオブジェクトを選択（**先にメッシュオブジェクト。この順番は大事！**）
2. Shift + アーマチュアを選択し`Ctrl＋P`
3. ペアレント対象メニュー内`アーマチュア変形`を選択

# ウエイトペイント

アーマチュア、ボーンに対して、連動させたいメッシュを設定する

**準備 メッシュに埋もれたBoneを常に表示する**
オブジェクトモードでボーンを選択>プロパティウィンドウのアーマチュアタブ（人形のアイコン）>表示の項目内、`レントゲン`にチェックを入れる

**ポーズモード**に入ってウェイトを設定したいボーンを選択
次に、メッシュを選択し、 `Ctrl+Tab` ->青くなる！　ウェイトペイントモード
左右対称にペイント　ツールシェルフのオプションで、`Xミラー`にチェックを入れる

<img width="500" alt="スクリーンショット 2019-01-29 7.07.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/258078/50dc0e0d-4f3c-c03b-2f47-ad647ab5c519.png">


## ボーンに対して連動させたい頂点をペイント
ボーンを選び、このボーンについてきてもらいたい頂点を塗っていく
青→緑→黄色→赤の順でウエイトが強くなる

連動させたいBoneごとに塗っていきます
<img width="500" alt="スクリーンショット 2019-01-29 12.57.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/258078/83d9e2d0-57e2-8f8d-5503-862e8bc0b5c0.png">

**ウェイト値の削除**
ブラシのブレンドモードを「減算」にする
または
ブラシのブレンドモードを「ミックス」-> ウェイト値を0.0にして塗る

`Ctrl+Tab`でポーズモードに戻して、ポージングしてみて確認。
ポージングを元に戻したいときは
回転 `Option+R`
移動 `Option+G`

##　オートIK
ポーズオプションのオートIKにチェックを入れると
全体に連動して動いてくれる（Boneの親子関係を連動させる）

オートIKあり（右側の手のBoneだけ動かしています）
<img width="300" alt="スクリーンショット 2019-01-29 14.40.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/258078/2e4e12f7-1f9a-80e1-fb6f-184ef135b9ae.png">

オートIKなし
<img width="300" alt="スクリーンショット 2019-01-29 14.41.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/258078/d2c8813d-e97c-460b-ded2-d91605a80411.png">


`レンダー`モードにするとUVテクスチャがついた状態で確認できますよ！
<img width="500" alt="スクリーンショット 2019-01-29 13.01.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/258078/6c643402-1eeb-7f3a-f6ca-6afea237fcf9.png">

次回はアニメーションを設定します！
[【Blender】アニメーションで3Dモデルを動かす](https://qiita.com/mochifuture/items/e62a8477523074703b30)


### 参照記事

[初心者のための！作って学ぶBlenderの基礎：④ボーンを設定する](https://nvtrlab.jp/column/2-4)
[【Blender】ウェイトペイント](http://sou-was.jugem.jp/?eid=30)
[Blender でボーンを指定してウェイトを自動計算する](https://dskjal.com/blender/weight-with-selected-bones.html)
AWS Fargate + ELB + αの構成で気づいたことメモ

業務でFargate導入にトライして気が付いたことのメモです。
誤りなどあればぜひ教えてください。

# Fargate
* fargateはクラスタのタイプではなく、タスク定義とサービスに指定する起動タイプ
* ネットワークモードはタスクを起動するときの設定なのでサービス...ではなくタスク定義に設定する
* ユーザーはEC2を指定しないので、サブネットやセキュリティグループはECSのサービスで設定する
* 動的ポートマッピング ではない のでホストポートも必ず指定する。

# ALB/NLB
* カスタムオーソライザーは設定できないが、代わりにWAFをデプロイできる。カスタムヘッダーの固定値の検証などなら可能
* fargateに対応する場合はTargetsのTargetDescriptionにIPを指定する必要があるが、そもそも事前にIPがわからない
* したがって、fargateかつCloudFormationの場合はECSのサービス側で利用するTargetGroupを設定する

# その他
## API Gateway
* ALBを後ろに配置する場合はVPC Linkはサポートされていないが、NLBの場合はサポートされている

## Custom Authorizor
* VPCラムダ（VPCConfigでサブネットとセキュリティグループを指定したラムダ）も利用可能
* ENIのアタッチ・コンテナの再起動にかかる時間は通常のラムダ同様


# 参考資料
参考: [AWS CloudFormationを使ってAWS Fargateの環境を作成してみる](https://qiita.com/isleys/items/eaebbffb24be2c7cbcd3#%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E7%92%B0%E5%A2%83%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B)
Django 2.xでbase.htmlにmodelを表示する方法

Django Girl TutorialでWebアプリケーションを書いてる時に、「ブログの基本情報はbase.html（ベースとなるtemplate）に記載しているけど、それをテーブル化してModelから参照したデータを表示したいなぁ」と思ったことがあったので、その方法２つを備忘録的に記載します。  
  
# 方法１．テンプレートタグ・フィルターを実装する
templateからpython側の処理を呼び出したい時に使用するテンプレートタグ・フィルターを実装し、それをbase.htmlで呼び出す方法です。

## myfilter.pyを用意
テンプレートタグ・フィルターを実装するために必要なファイルを、以下の構成で用意します。

```
app/
　├ __init__.py
　├ admin.py
　├ apps.py
　├ model.py
　├ templatetags/ ← ディレクトリを追加
　│　│ __init__.py ← 空のファイルを用意
　│　└ myfilter.py ← ここに実装
　├ views.py
　└ templates
　   └ base.html
```

※\_\_init__.pyは該当ディレクトリをPythonディレクトリとして認識するために必要なファイルなので、必ず用意してください。

続いて、myfilter.pyにテンプレートタグ・フィルターを実装します。
ここでは、Profileモデルからpk=1のデータを取得し返却する、**get_profile**というテンプレートタグ・フィルターを実装します。

```python:myfilter.py
from django import template
from app.models import Profile
import markdown

register = template.Library()

@register.filter
def get_profile(value):
    profile = Profile.objects.get(pk=1)
    return profile
```

## base.html側で、実装したテンプレートタグ・フィルターを呼び出す
base.html側で、実装したテンプレートタグ・フィルターを呼び出すには以下の通りに記述します。

```html:base.html
{% load myfilter %}
・・・
    {% with '' | get_profile as profile %}
    <h1><a href="/">{{ profile.title }}</a></h1>
    <h4>{{ profile.detail }}</h4>
    {% endwith %}
```
テンプレートタグ・フィルターは引数が必須ですが、特に渡す値が無い為、ここでは''を渡しています。

# 方法２．middlewareを実装する
djangoでは、Viewの入出力タイミング（リクエストとレスポンス）をフック出来るMiddlewareというものを実装出来ますので、それを用いてモデルを参照します。

## middleware.pyを用意
Middlewareを実装するためのファイル(middleware.py)を、以下の構成で用意します。

```
app/
　├ __init__.py
　├ admin.py
　├ apps.py
　├ model.py
　├ middleware.py ← ここに実装
　├ views.py
　└ templates
　   └ base.html
```


続いて、middleware.pyを以下の通りに実装します。
Middlwareの実装方法の詳細については[公式ドキュメント](https://docs.djangoproject.com/ja/2.1/topics/http/middleware/)や、他の方の投稿記事の方が参考になります。
ここでは、request.blogProfileにProfileモデルからpk=1のデータを取得し、格納しております。

```python:middleware.py
from blog.models import BlogProfile

class BlogProfileMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # リクエストへの前処理を記述
        # reqeust.profileに、Profileモデルからブログ情報を取得する
        request.proflie = Profile.objects.get(pk=1)

        # 固定
        response = self.get_response(request)

        # レスポンスへの後処理を記述

        return response
```


# base.html側で、request.profileを参照する

```base.html
<h1><a href="/">{{ request.profile.title }}</a></h1>
<h4>{{ request.profile.detail }}</h4>
```

以上で、base.htmlにmodelを表示する方法は終わりです。

# おまけ ～modelをキャッシュする～
先ほど挙げた２つの方法ですが、両方とも毎回モデルを取得する（データベースにクエリを発行している）のが気になります。
そこで、別の方法を調べたところ、[cached_property](https://docs.djangoproject.com/ja/2.1/ref/utils/#django.utils.functional.cached_property)なるものがありました。

```models.py
from django.utils.functional import cached_property

class Profile(models.Model):

    @cached_property
    def get_profile(self):
        return self.objects.get(pk=1)
     
```

これで毎回呼び出しても、モデルの取得結果がキャッシュされているので安心ですね。
自作キーボード組み立て　HelixPico


#自作キーボードとは
2018年は自作キーボードのブームでしたね。
ばねの硬さや戻り具合を調節したり、キャップや配列を変えたり光らせたりなどでき、自分好みのキーボードを作ることが出来ます。


#やってみて
はんだ付けが難しかったです。
特にキーボードを光らせるためのライトはとてもデリケートなので、熱に当てすぎてもいけないし、なかなか接着もできないしで、難易度がものすごく高いので初心者はお勧めできないかもです。
私が今回組み立てたのは遊舎工房さんのHelixPicoというキットでした。設定でキーを押した時に音が鳴るように出来て、とても楽しいです。
https://yushakobo.jp/helixpico/


##記事内容
内容については、こちらのリンクへ移動しました。

[TakumiWada's Blog] 自作キーボード作ってみました！(1)
https://takumiwada129.hatenablog.com/entry/2019/01/28/100000
シェルスクリプトからAppleScriptを実行する(ダイアログ編)

シェルスクリプトを使ってAppleScriptを実行するコードを書いてみようと思います。
今回はダイアログを表示してみます。

### 1. 環境

- OS：MacX

### 2. シェルスクリプトを作成する

- 拡張子をshにしたファイルを新規作成し、以下のようなコードを書く。(ファイル名をapple.shにする)

```
#/bin/bash

case $(
 osascript -e '
  tell application "System Events"
   activate
     button returned of (display alert "YESかNOのどちらかを押してください" buttons {"NO", "YES"})
  end tell
') in
 YES)
  echo "YESが押されました";
  ;;
 NO)
  echo "NOが押されました";
  ;;
esac

```

※　osascript：AppleScriptを実行するためのコマンド

### 3. ターミナルからシェルスクリプトを実行

```
$ apple.sh
```

- ダイアログが表示されます。「YES」を押すとターミナルに「YESが押されました」と表示され、「NO」を押すとターミナルに「NOが押されました」と表示されます。

![03_1.png](https://qiita-image-store.s3.amazonaws.com/0/239358/60821d6d-0969-688a-d8a4-6e71013fd859.png)
Railsで利用可能なカラムの型


#Railsで利用可能な型

|型  |説明  |
|---|---|
| string | 文字列 |
| text | 長い文字列  |
| integer | 整数 |
| float | 浮動小数点数型 |
| decimal | 固定長整数型 |
| datetime | 日時 |
| timestamp | タイムスタンプ |
| time | 時刻 |
| date | 日付 |
| binary | バイナリデータ |
| boolean | 真偽値 |


#参考
[Railsドキュメント | テーブルの作成](http://railsdoc.com/migration#テーブルの作成(create_table))
SQLは最後に；つけないとダメ

ずっと簡単にDB操作できるツールを使っていたので忘れてた。
ターミナルでmysqlをいじっていたところ

mysql> select * from test_db
    -> 
    -> 

…？？？なんでうんともすんとも言わないんだよ！！！
と思ってたら最後に；つけてなかった……
便利ツールに頼りすぎて基本のキを忘れてた私が悪かった。ごめんmysql
【C++Builder】TChartでX軸・Y軸の目盛りを自分で作成する方法

## 動作環境
C++Builder 10.2

## TChartについて
情報が少ないC++Buolderで、さらに情報が少ないTChart。
TChartの編集は、右クリックで表示される「Edit Chart...」からも出来るが、ここから編集すると何を変更したのか分からなくなってしまうので、プロパティを直接編集する方がオススメ。

プロパティについては私はこのページがとても参考になりました。
http://www3.netwave.or.jp/~take0/dt_Chart.htm

## TChartでX軸・Y軸の目盛りを自分で作成する

TChartで、X軸Y軸のスケールを動的に変更したいという案件。
例えば、Y軸の最大値を±100uVから±100mVに変更したい場合、

* ±100uVの場合

```
Chart1->LeftAxis->Maximum=10;
Chart1->LeftAxis->Maximum=-10;
```

* ±1mVの場合

```
Chart1->LeftAxis->Maximum=1000;
Chart1->LeftAxis->Maximum=-1000;
```
としてしまうことも出来るけど、それだと単位が常に[uV]になってしまい、表示したときに見にくくなる。なので、設定値によって単位も変えて表示したい場合は、以下のように目盛りが自動で生成されないようにし、自分で作成する。

```AxisTest.cpp
// 目盛りが自動生成されないように指定
Chart1->LeftAxis->Automatic = false;
Chart1->Axes->Left->Items->Clear(); // 自動生成される目盛りを一度clearする

// radioButtonの指定値によってswitch
int i_Vol;
switch(Y_Axis->ItemIndex){
 case 0: // 100uVの場合
  i_Vol=100;
  Chart1->Axes->Left->Items->Add(100,100);
  Chart1->Axes->Left->Items->Add(0," 0[uV] ");
  Chart1->Axes->Left->Items->Add(-100,-100);

 break;
 case 1: // 1mVの場合
  i_Vol=1000;
  Chart1->Axes->Left->Items->Add(1000,1);
  Chart1->Axes->Left->Items->Add(0," 0[mV]");
  Chart1->Axes->Left->Items->Add(-1000,-1);
  break;
}

// Y軸の範囲指定
Chart1->LeftAxis->Maximum = i_Vol;
Chart1->LeftAxis->Minimum = ( -1 )* i_Vol;
```

同様にX軸を変更する場合は

```AxisTest.cpp
// 目盛りが自動生成されないように指定
Chart1->BottomAxis->Automatic = false;
Chart1->Axes->Bottom->Items->Clear();   // 自動生成する目盛りを一度クリアする

int i_Max,i_Div;
AnsiString A_XLabel;

switch(X_Axis->ItemIndex){
 case 0: // 30秒の場合
	i_Max=30;
	i_Div=5;
	 break;
 case 1: // 1分の場合
	i_Max=60;
	i_Div=10;
	 break;
}

// 表示するX軸の幅を設定する
Chart1->BottomAxis->Minimum = 0;
Chart1->BottomAxis->Maximum = i_Max;

int i,i_min,i_sec;
for(i=0; i < i_Max ;i++){
  if(i % i_Div == 0){
   i_min=0;
   i_sec=i;
   Chart1->Axes->Bottom->Items->Add( i, A_XLabel.sprintf("%d:%d",i_min,i_sec));
 }
}
```
## 実行結果

はじめはこんな感じなデータが
![image.png](https://qiita-image-store.s3.amazonaws.com/0/274481/26fdcd37-974b-551c-cdd0-f15075e47818.png)

Y軸を貼りかえた場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/274481/f9bb3e90-b47c-7cf2-be25-e7dc398d05f8.png)

X軸も貼りかえた場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/274481/3476123e-9a8a-558a-9e32-1f877e1cea0f.png)

以上！
docker rmiで Error response from daemon: conflict: unable to delete  (cannot be forced) - image has dependent child images


```
$ docker rmi db6d572e4c12
Error response from daemon: conflict: unable to delete db6d572e4c12 (cannot be forced) - image has dependent child images
```
docker ps -a でまだ何か残っていれば、docker rmをする。

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```
-f(force)で無理やり消す。

```
$ docker rmi -f kaizenjapan/100pon
Untagged: kaizenjapan/100pon:latest
Untagged: kaizenjapan/100pon@sha256:8b69cb41b23af90e4bbe0e4fdaea93dead6450a189a7ea38c2f4230eaced13dc
```

#参考資料(reference) 

Docker イメージ削除 'image has dependent child images' への対処
https://qiita.com/inoko/items/da265416142d12ef6d97

#文書履歴(document history)
ver. 0.01 初稿　20190129 午後
ver. 0.02 参考資料追記 20190129 夕
jupyter labをリモートから使う


# 環境
Ubuntu 18.04.1 
python 3.6.7、
jupyter 4.4.0
jupyter notebook 4.4.0
jupyter lab 0.35.4
※ちょっと古くなってきたから最新環境ではどうなるか・・

# インストール
※ jupyter等のインストールはaptとpipで行う。

# 環境設定
#### 1. notebook_config.pyの作成
`$ jupyter notebook --generate-config`　　(「jupyter lab --generate-config」でもok)
configファイル(~/.jupyter/jupyter_notebook_config.py)を作成。(~/はホームディレクトリ)

#### 2. ipythonを実行、下記のコマンドでパスワードのハッシュ値を生成
`$ ipython`
`In [1]: from IPython.lib import passwd`
`In [2]: passwd()`

ここでパスワードを入力するとハッシュ値が生成(sha1:XXXXXXXXXXX)されるので、
そちらをコピーして、テキストファイルなどに保存。

#### 3. ~/.jupyter/jupyter_notebook_config.pyの末尾に下記を記載。
``` ~/.jupyter/jupyter_notebook_config.py

c = get_config()
c.IPKernelApp.pylab = 'inline'
c.NotebookApp.ip = '0.0.0.0'              #(過去バージョンでは'*'指定だったけど今はだめみたい。)
c.NotebookApp.open_browser = False
c.NotebookApp.port = 9999                 #(任意)
c.NotebookApp.password = 'sha1:XXXXXXXXXXX'   #(#先ほど保存したハッシュ値を記載)
```

#### 4. 起動してみる
`$ jupyter lab`
下記みたいな表示が出ていれば成功。

```
 JupyterLab server extension not enabled, manually loading...
 JupyterLab extension loaded from /home/xxxx/.local/lib/python3.6/site-packages/jupyterlab
 JupyterLab application directory is /home/xxxx/.local/share/jupyter/lab
 Serving notebooks from local directory: /home/xxxx/.jupyter
 The Jupyter Notebook is running at:
 http://(サーバ名 or 127.0.0.1):9999/
 Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

```

※ 起動スクリプトに下記を登録しておけば、reboot時に自動で立ち上がるようになる。
`nohup jupyter lab &`



#### 5. リモートからアクセス
ブラウザから下記のURLでアクセス
`http://[サーバIP]:9999/`

パスワードを求められるはずなので、ハッシュ値作成の際使用したパスワードを入力。

# 最後に
jupyterは基本的にローカルに立てて使うものらしいで、
サーバへのインストール、リモートアクセス許可についてはセキュリティを考えながら実施するべき。
redmine pluginでmigrationエラー、pluginのmigrate管理はどうなっている？

plugin名を変更した後、migrationをやっていこうとしたとき以下のエラーを検出。

```
$ rake redmine:plugins:migrate
   == 1 CreatePositions: migrating ===============================================
   -- create_table(:positions)
   rake aborted!
   StandardError: An error has occurred, this and all later migrations canceled:

   SQLite3::SQLException: table "positions" already exists: CREATE TABLE …
```

やろうとしたことは、既存のmodelを削除して新しいmodelを追加することだったのだが、一個目のmigrationファイルがもう一回実行されたことで、create tableがもう一回走った模様。

migrationは対象のデータベースのschema_migrationsテーブルで管理されているのだが、pluginはどう管理されているか確認してみた。それが以下の通り(どのmigrationを通したかを残す1カラムの表でした)。

```
[連番]-[plugin名]
```

なるほど、plugin名を変えるとここが合わなくなるのね。早めに気づけて良かった。
sqlでupdateすることで、うまくmigrationが通りました。
PHPでシャローコピーとディープコピーの違いをうまく理解出来ていなかった話

# はじめに
オブジェクトをクローンして値を書き換えようとしたら、どうも上手くクローン出来ず、元のオブジェクトの情報も書き換わって変だな〜と思って調べたらcloneと値渡しをごっちゃにしていたのでメモ

##　シャローコピー
[PHPマニュアル](http://php.net/manual/ja/language.oop5.references.php)によると、この書き方では両方とも同じIDを保持するため、同じオブジェクトとして扱われる模様。

```php
<?php
class CloneTest {
    public $property_val;
}

$origin_obj = new Test;
$clone_obj = $origin_obj;

$origin_obj->property_val = 123; //456
$clone_obj->property_val  = 456; //456
```

## ディープコピー
オブジェクトのcloneを生成したいしたい場合は、```clone $a```と書く必要があるそうです。

```php
<?php
class CloneTest {
    public $property_val;
}

$origin_obj = new Test;
$clone_obj = clone $origin_obj;

$origin_obj->property_val = 123; //123
$clone_obj->property_val  = 456; //456
```
Windows10環境にPythonとANACONDA NAVIGATORを入れる。

#Windows10環境でPythonで画像処理をするための環境を整える。

【目的】
Windows10環境で画像処理システムをPythonで開発したい。
そのために必要なソフトをインストールしていく。

## Pythonのダウンロードとインストール

https://www.python.org/downloads/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/7564c36d-9c9d-8799-613d-8cc10c28469d.png)


インストール作業は割愛。普通にインストールしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/7caed635-51e8-5e48-eb2f-46bb5618cbf9.png)


## Python Anaconda Distribution のダウンロードとインストール
　
Python Anaconda Distribution （パイソン　アナコンダ ディストリビューション）には、Numpy
SciPy,Matplotlib, Scikit-Learn, Pandas を提供しています。これらの科学計算ライブラリが容易に使えることが魅力です。OpenCVを使用する設定も非常に簡単です。

入れていきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/679ef49c-0e80-4339-931a-203837ba8693.png)

インストールしたPythonは3.7なので、ANACONDAもバージョンを合わせます。
（Pythonが32bitなので、そちらも合わせていきます。32-Bit Graphical Installer (509.7 MB )）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/b8d625f5-675b-605b-9913-275cd052e79a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/04b33090-8885-66b9-974a-47f67a75f02c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/0698058c-62b1-f747-034a-4bde05778948.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/290d743c-df44-9ea1-af82-68ea2dc626a1.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/b00e5b3d-cc0a-1713-0fa0-e0b8a6f95e1c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/18ba98d2-6c60-69a4-b144-332d9a52a728.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/07af350b-132d-b1da-fd3e-e2c4a34733d6.png)

5分～10分くらい待ちましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/9e7fc23b-1456-e7c9-d7c5-a5d510f5c3a2.png)


Visual Studio Codeをインストールする聞かれます。（お好きにどうぞ）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/96dae4d4-0adc-3c39-1b1c-1f78afa436bc.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/cc638e06-1f5f-994c-871a-b524747ee59c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/fb7144e9-6cb2-7f26-6a04-a390e3d6cbb4.png)

ANACONDA NAVIGATOR を起動します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/64609d7c-8c63-b0c9-4d1a-06424974f9b8.png)
『詳細 正規表現 第三版』のRuby(2.6.0)版

『詳細 正規表現 第三版』は正規表現の名著だが、Perl, Java, .NET, PHP, Pythonの例は載っていもRubyは載っていない。  
なので、補完と勉強のため、Ruby版のコードを書いていく。

## 環境
Ruby 2.6.0

## 3.2.2 ^Subject: (.*) のサンプル

メールのデータから、タイトルを抜き出すための正規表現のサンプル。  

Rubyでは正規表現リテラルで直接表す事ができる（便利！）。
文字列を正規表現にコンパイルすることもできるが、リテラルを使うこの方が多そう。
```/i```で大文字小文字を区別しないように設定できる。  
Rubyでは、オブジェクト指向型のアプローチを取る。

```ruby
r = /^Subject: (.*)/i
m = r.match(line)
if m
  subject = m[1]
end
```

もしマッチすれば、```m```には```MatchData```objectが入り真偽値がtruthyに、
マッチしなければ```nil```となり、真偽値がfalsyになる。  
```m[1]```から順番に、```()```でキャプチャした部分を取り出すことができる。

### ちなみに

単にマッチしたかどうかを調べたければ、

```ruby
if line =~ r
```

という記法も使える。
この場合、```line =~ r```の返り値はマッチしていればマッチした文字列の位置が返ってくるのでtruthyとなり、
マッチしなければnilになるのでfalsyになる。

処理効率的には

```ruby
if r.match?(line)
```
の方が良いらしいが、深くはわからない。

## 3.2.3 置換のサンプル

文章内のメールアドレスをリンクに置き換える処理をする。

```ruby
r = /
  \b
  # メールアドレスを\1にキャッチする
  (
    \w[-.\w]*
    @
    [-\w]+(\.[-\w]+)*\.(com|edu|info)
  )
  \b
  /ix
text.gsub!(r, '<a href="mailto:\1">\1</a>)')
```

Rubyでは、置換の場合```sub```、全置換の場合```gsub```を使う。
```gsub```は元の文字列を置き換えず、新しい文字列を返すが、
```gsub!```は元の文字列を置き換える。

``` /x ```オプションを用いることで、正規表現内での改行とコメントを無視している。

続きはまた今度。
論文読込み：「Fully-Convolutional Siamese Networks for Object Tracking」の要約

# はじめに
今回選んだ論文は Siamese Network(シャムネットワーク)を使用した物体追跡です。Siamese Network 自体は非常にシンプルなネットワークとなっています。本論文は2016年発表されました。
# Siamese Network
本論文での提案手法である Siamese Network は以下の図になります。このアーキテクチャで行っていることは検索対象が写っている画像($z$)を検索画像($x$)から探します。二つの画像の相互相関から類似度が高い領域をスコアで出力します。検索方法は一つ前のフレームに写っていた場所を中心に検索します。

<img src=https://qiita-image-store.s3.amazonaws.com/0/328247/4fa8ee92-4c4b-5012-f3b1-095452037b14.jpeg width="60%">

# トレーニング
学習する際には検索対象となる画像と検索する画像をペアにして学習します。画像は検索画像を対象画像よりも大きくさせて学習させます。
<img src=https://qiita-image-store.s3.amazonaws.com/0/328247/962b925b-91c0-3ec0-9213-da3adb1103dd.jpeg width="60%">

# 実験結果
データセットは ILSVRC を使用しています。モデルはゼロから訓練を行った本論文の提案手法である Siamese Network を使用した結果になります。本手法ではモデルの更新(オンライン学習)を実行しない。それは、検索対象画像($z$)を最初のフレームのみ検索して使用しているからです。単純なアルゴリズムであるのにかかわらず、不鮮明な画像(2段目)、外観の大幅の変化(1,3,4段目)、低照度(6段目)、スケール変更(6段目)など、多くの困難な状況に対しても検出が可能です。一方で混みったシーンには敏感です(5段目)。

<img src=https://qiita-image-store.s3.amazonaws.com/0/328247/804dbc7a-936a-7a98-7e9d-b97206947a69.jpeg width="80%">
[PHP]超簡単スクレイピング / 任意テキストに部分一致するタグ検索

```php:コード
<?php
$html = file_get_contents("https://www.yahoo.co.jp");
$dom = @DomDocument::loadHTML( $html );
$xml = simplexml_import_dom( $dom );
$dataList = $xml->xpath("//*[contains(text(), 'もっと見る')]"); //ここに任意の文字を設定する
var_dump($dataList);
```
Yahoo!のトップページで「もっと見る」というテキストに部分一致するタグを検索する。

```html:結果
array(1) {
  [0]=>
  object(SimpleXMLElement)#3 (2) {
    ["@attributes"]=>
    array(1) {
      ["href"]=>
      string(51) "https://news.yahoo.co.jp/list/?d=20190129&mc=f&mp=f"
    }
    [0]=>
    string(15) "もっと見る"
  }
}
```
【Java】 (list == null || list.size() == 0)でNULL／空チェックしている事が気に入らない

# **注意！！**
初心者向け + 個人的な意見多めな記事です。


# 動作環境

- java 1.8.0_191


# 背景

コードレビューをしていて、たまに目にするのが、

```java
        List<String> list = （Listがreturnされる）何かしらの処理／メソッド;
        
        // NULLおよび空チェック
        if (list == null || list.size() == 0) {
        }
```

というListのNULL／空チェックを行っているコードです。

動作的には問題ありません。
しかし、あまり気に入らないので修正してもらうことがあります。
理由としては主に**２つ**あります。

# 1つ目：ListがNULLになることがあるの？

まず、「何かしらの処理／メソッド」でlist変数をNULLにすることがあるのか確認してほしいです。

NULLにすることがあるのならば、そこの処理を修正したほうがいいです。

## なぜ？

NullPointerExceptionとなる可能性を減らすためです。
また、呼び出し元のNULLチェックをなくすことができます。

もし、「何かしら処理／メソッド」が共通化しているなら、全ての呼び出し元でNULLチェックしなければなりません。
呼び出し元でNULLチェックしていなければ、NullPointerExceptionになるリスクが出てきます。

NULLを返すことがなかったら、メソッド呼び出し元はNULLが返ってくるケースを想定する必要がなくなります。
呼び出し元の実装が、すこ～～～し楽になります。

list内の要素を```remove()``` や```removeAll()``` などを使って全削除するとか、
```Collections.emptyList()```などで、空リストを返すようにしましょう。

また、List宣言にfinalをつけることも得策です。
※ コメントにて教えていただきました。

# 2つ目：size == 0ではなく、isEmpty()を使ってほしい

これは個人的な趣味？意見？です。
```list.size == 0```ではなく、```list.isEmpty()``` としてほしいです。

## なぜ？

「```isEmpty()```の中身は```size == 0```じゃないか！！！」という意見もあると思います。
全くその通りです。
処理内容としては何も変わりません。

でも ```list.size == 0``` より ```list.isEmpty()``` のほうが分かりやすくないですか…？
たぶん``` list.isEmpty()``` のほうが、Javaプログラマじゃない人が見ても、「空かどうか確認してるんだな！」って分かりやすいのではないかと思います。

# 個人的な結論

NULLチェックは止めて、```isEmpty()```の空チェックのみにしてほしいです。
NULLチェックが不要になるように、「何かしらの処理／メソッド」でNULLを絶対に返さないように、空リストは返してもNULLは絶対に返さないこと。
```size() == 0``` より、```isEmpty()``` のほうが可読性が高いと**個人的に思う**ので、```isEmpty()``` を使用すること。

```java
        List<String> list = （Listがreturnされる）何かしらの処理／メソッド;
        
        // 空チェックのみ
        if (list.isEmpty()) {
        }
```

# 「NULLチェックしてるつもり」コードに出会うこともある

たまに、下のように ```&&``` で判定しているコードがありますが、NULLがきたらNullPointerExceptionになるので注意しましょう。

```java
if(list == null && list.size() == 0){}
```

# おまけ

どうやら新入社員研修で、(list == null || list.size() == 0)と教わったらしいです。
間違ってないけど………とモヤモヤしたので記事にしました。（どいうことだ
新人エンジニアに覚えてもらいたいPullRequestの書き方

新人エンジニアの諸君！今日も元気にPRを出していきましょう！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47327/c102f38f-df1a-458a-b87c-c4a0858fd5d3.png)

# タイトルは明確に
タイトルは簡潔、明確に付けましょう。英語は好みが分かれるのでチームのコミットログを見ながら決めてください。

##  良いタイトルの例
「DBの呼び出し時にコネクションをプールさせない変更」
「IE9で罫線が表示されない問題への対応」
「申請が行なわれた際にエラーになる件への対応」

## 悪い例
その1「高橋さんが3日前に言っていた件」
一体何を…？

その2「feature/yousan/201901/admin/fix-event-button」
PR元のブランチ名を使うパターン。でもブランチ名って見づらいんですよね。

その3「fix #1000」
Issueやチケット番号で対応させたいのはわかるのですが、ひと目でわかりません。
PRの本文に`Fix #1000`などと書いて参照しましょう。

# 確認できる方法を書く
確認できるURLがあればそのURLを記載しましょう。
もしくは手元でチェックアウトして動かしてもらうのであればその旨を書いてください。

ブランチごとに独立したデプロイが可能であれば確認が捗ります。

なければ画像（スクリーンショット）や動画があれば良いです。
「百聞は一見にしかず」です。

# 誰に何を確認してもらいたいか
見た目や動作、コードなどでレビュワーが複数候補になる場合があります。
また何を確認して欲しいのか、コードなのか動作なのか設計なのか、思っている範囲で書きましょう。
チームとしてレビューの対象となるかどうかは別の問題ですが、不明な箇所は積極的に明らかにしましょう。
開きっぱなしのPRとなって放置されてしまいます。

# コンフリクトは修正する
コンフリクトを含んだPRは **取り込めません**。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47327/8cbbf3a5-6672-be25-0a9c-1f2351a0cc2d.png)

テストも同様です。
PRを出した人の責任でコンフリクト、テスト失敗を解消しましょう。
コンフリクトの解消になれていない場合には[Gitをおさらい](https://qiita.com/crarrry/items/c5964512e21e383b73da)して、先輩エンジニアにヘルプを要請しましょう。

# ブランチを開きっぱなしにしない
ブランチを作る -> 修正 -> PR -> レビュー -> (繰り返し） -> マージ

ブランチを開いてからPRで取り込まれるまでに日数がかかると大変です。コンフリクトが発生したり、任されたIssueの目的があやふやになったり、他の人が修正してしまったりする可能性が高まります。
概ね3日以内にマージされることを目標としましょう。

# PRはあなたのもの
PRはあなたのものです。他の人のものではありません。
あなたの実績ですし、あなたの貢献ですし、あなたの仕事です。

誇りと責任を持って取り組みましょう。


よいPRライフを！
NPCMJ (Kainoki) のデータをダウンロードして tregex で読み込む

# NPCMJ
NPCMJ (NINJAL Parsed Corpus of Modern Japanese) は国立国語研究所の共同研究プロジェクト『統語・意味解析コーパスの開発と言語研究』が開発している現代日本語のツリーバンクで、現在、約2万文のデータが公開されている。

http://npcmj.ninjal.ac.jp/

全データをダウンロードして、ローカルで検索したり、自分で修正して使うこともできる。

http://npcmj.ninjal.ac.jp/interfaces/cgi-bin/index.sh?db=npcmj&lang=jp
（"Download all bracketed trees" から）

# tregex
ローカルでの検索ツールとして便利なのは tregex。これは Stanford NLP のサイトから入手できる。

https://nlp.stanford.edu/software/tregex.html
（現在の最新バージョンは Version 3.9.2）

zip ファイルを解凍して、stanford-tregex.jar をクリックするとプログラムが立ち上がる（java をインストールするようメッセージが出たら、それに従う）。

メニューの [FILE] --> [Load trees] から NPCMJ のデータを置いたディレクトリを選び、[Load with file filters]、[Okay] でデータを読み込む。

画面中央の [Browse trees] をクリックするとデータが表示される。
Muktinath temple

 Muktinath tour package, Muktinath temple   
Muktinath or Muktidham is a sacred place in high Himalayas of Nepal. This is the holiest place for Hindus and Buddhists across the world! This is the land of salvation. Muktinath Temple situated in an altitude of 3800 meters at the foot hill of ThrongLa mountain pass in lower Mustang area. Muktinath Temple is a small temple dedicated to Lord Vishnu, Muktidham is the only Divya Desam or Vaishnava Divya Desam in Nepal. Totally there are 108 Divya Desam across the planet. Muktinath Temple considered one of the oldest temples in Nepal, before Buddhism it was called Thiru Saligram. Saligram is a sacred stone find in Kaligandaki river which is flowing near Muktinath Temple.
Reaching Muktinath Temple was extremely difficult in older days as it situated in high Himalayas. In old time people used to walks for days to reach this holy place. Now days there’s road connectivity till the temple so one can reach the temple. Still the road condition is not so good and goes through high mountains. In our Muktinath tour package we assure pilgrims to take care of everything to take them safely to Muktinath Temple. In our Muktinath tour we take people on the road as well as by flight. Our local experts make sure you will do the darshan and return back without any problem.  It takes at least 2 days to reach Muktinath temple in Mustang valley. Going to Mukatinath / Muktidham is once in a life time journey so we always work hard to take you there safely without any problem. Now days people need entry permits to enter Mustang zone we acquire it priorly before your Muktinath Tour Package start. So if you want to visit Muktinath then We Ramblers give you the best service and guaranteed departure for Muktinath. Call us or register with us for a holiest journey to land of salvation!
Kubernetes ：コンポーネントのアーキテクチャ

[「Kubernetes完全ガイド」](https://www.amazon.co.jp/Kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear-%E9%9D%92%E5%B1%B1/dp/4295004804) を元に、Kubernetesのコンポーネントのアーキテクチャをまとめます。

Kubernetesクラスタは下記の7つのコンポーネントから構成される、kube-apiserverを中心とした分散システム。
* etcd
* kube-apiserver
* kube-scheduler
* kube-controller-manager
* kubelet（＋コンテナランタイム）
* kube-proxy（＋Network Plugin）
* kube-dns（CoreDNS）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/251519/0b637388-b873-4145-dce9-db4859a03edd.png)
出典：(https://www.amazon.co.jp/Kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear-%E9%9D%92%E5%B1%B1/dp/4295004804)


## etcd
OSSの分散KVS（Key-Value-Store）で、Kubernetesクラスタの登録情報格納領域。
奇数台（3/5/7）でクラスタを組む事が推奨。

## kube-apiserver
Kubernetes APIを提供するコンポーネント。
kubectlはkube-apiserverにリクエストを送信する事で、DeploymentやService等の作成、削除を実施

例）kubectlでPodの登録時、kube-apiserverはPod情報をetcdに書き込むが、起動ノードが決まっていない為、ノード未割当となる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251519/7b2d2e83-68ab-aa30-187a-6aa670bf5536.png)

kube-schedulerは、このノード情報をkube-apiserverにリクエストを送って書き換えてスケジューリング。
kubeletが続いてノード上でPodを起動

![image.png](https://qiita-image-store.s3.amazonaws.com/0/251519/a49f43c7-e876-1bb7-1bed-40016a772818.png)

## kube-scheduler
起動するノードが未割当のPodについて、ノードの状態やAffinity等を考慮して、起動ノードを決定

## kube-controller-manager
様々なコントローラを実行するコンポーネント。例）DeploymentやReplicaSetの状態を監視しながら、必要なPod/レプリカを作成

## kubelet
各Kubernetesノード上で動作するコンポーネント。Docker等のコンテナランタイムと連携し、コンテナの起動・停止を実施。

## kube-proxy
各Kubernetesノード上で動作するコンポーネント。Service作成時に、ClusterIPやノードポート宛のトラフィックのPodへの転送方式を決定。
* userspace : （カーネルでなく）ユーザースペースで処理
* iptables：　カーネル上のiptablesで処理する為、高速・安定処理
* ipvs：　大規模環境用

別途、FlannelやOpen vSwitch等、オーバレイネットワークを構築するソフトウェアとの連携が必要

## kube-dns（後継：CoreDNS）
Kubernetesクラスタ内のDNSサーバ。
Service作成時やServiceに紐づくPodに変更があった際に、DNSエントリを連携して書き換える。
【2019年1月現在】GitHubアカウント作成方法

GitHub初心者です。自分がアカウント作った作業ログを載せていくだけです。
よろしくお願いいたします。m(_ _)m

---

# GitHubアカウント作成

https://github.com/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/bc959b03-4ee4-6904-3d96-b29554cf0e2c.png)

- Username、Email、Passwordを入力して「Sign up for GitHub」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/13def540-a7ea-3803-adb0-85baa2c6e115.png)

- 「検証開始」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/d2671a28-c0f3-ce67-d39f-286169e9de2b.png)

- 「終了」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/a94bebc0-c498-2bfe-ae8d-32714f065655.png)

- デフォルトでFreeの無料プランが選択されているのでそのまま「Continue」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/eb175518-23a9-b528-7fff-defc18e14c44.png)

- 入力フォームが表示されますが、何も入力せず「Submit」か「skip this step」をクリックしてもアカウント作成できるようです

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/aa0fe842-d17c-5364-fe47-e98814602273.png)

- githubにログインした状態の画面になる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/563ad84d-291e-cee8-a8a9-1adf1560a95b.png)

- メールが届いているので「Verify email address」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/e0ee0c72-22ec-3e96-f860-916662cbab30.png)

- アカウント登録完了しました

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/91aeff0a-dc63-0bcc-1452-3c607a60996b.png)

# 2段階認証

必要な方は2段階認証にするとよいと思います

参考：[GitHubで二段階認証に変更する - Qiita](https://qiita.com/katsukii/items/9773e9cfea7d929fcf9c)

https://github.com/settings/security

- 「Enable two-factor authentication」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/968b0c7b-ed5d-5cf8-f368-a3624474f4f0.png)

- アプリを使って認証する方法とSMSで認証する方法が選べます、今回はSMSで行いました。
- 「Set up using SMS」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/66866a52-83c2-5ca1-abe6-c1cd0b0077ab.png)

- 復旧用のコードが表示されるのでコードを控えておく
- 「Next」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/36856bcd-d981-07ce-4b12-dd237d56c7b1.png)

- 「Country code」にJapan +81を設定し、「Phone number」に電話番号を入力し「Send authentication code」をクリック
- 送信されたコードを「Enter the six-digit code sent to your phone」の欄に入力し「Enable」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/aaa20737-425c-7c27-0e31-6ad6fe307037.png)

- 2段階認証が有効になりました

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/95dc4466-ce95-2b4b-758c-5d2285a8d058.png)

最後まで読んでいただいてありがとうございましたm(_ _)m
プログラミング勉強サイトまとめ

## hello world から例外処理まで（入門）
- [Aidmy](https://aidemy.net/)  
- [paiza](https://paiza.jp/)  
- [progate](https://prog-8.com/) 
- [dotinstall](https://company.dotinstall.com/)

## 標準ライブラリ確認サイト　
- [アルゴリズム雑記　※かなり使える](https://algorithm.joho.info/)  
- [note.nkmk.me ※pythonのみ](https://note.nkmk.me/)

## アルゴリズム　
- なぜアルゴリズムが必要なのか？  
    [『フカシギの数え方』 おねえさんといっしょ！ みんなで数えてみよう！
](https://www.youtube.com/watch?v=Q4gTV4r0zRs)  
- アルゴリズム入門  
[AtCoder 版！蟻本 (初級編)](https://qiita.com/drken/items/e77685614f3c6bf86f44)

# オンライン実行環境
[paiza io](https://paiza.io/ja/projects/new)
[Play code](https://playcode.io/)




 

#
grepで検索した結果のファイルをすぐにvimの複数タブで開くコマンドを作る

# 概要
``grep``して引っかかったファイルをコピーしてペーストして```vim```を開くことが多かったので、これってもしかしてめっちゃ時間を無駄にしているのでは、と思いました。
ということで専用のコマンドを書いてみました。

# コマンドの実装
## 実行環境
``zsh``派なので、``.zshrc``で動作確認していますが、多分``bash``でも動くと思います。

## 実装
```shell:~/.zshrc
function svim() {
    if [ "$1" = "" ]
    then
        echo 'no arguments';
        return;
    fi
    vim -p `grep -lr $1 $2 | perl -pe 's/\n/ /g'`;
}
```

## 使い方
``svim {引数}``で、カレントディレクトリは以下のファイルを引数の文字列で検索し、ヒットしたファイルを全て``vim``で開きます。第2引数にフォルダを指定すると、そのフォルダの中で検索します。

```shell
$ svim HOGEHOGE
または
$ svim HOGEHOGE src/components
```

# 解説
せっかくなのでちょっとした解説も書きます。

## 引数チェック
最初に、引数が0、つまり``$1 = ""``のときは``return``します。

## grep
``-lr``オプションで、ファイル名だけを羅列し、かつ配下のディレクトリを再帰的に検索します。

```shell:例
$ grep -lr hoge *                                                                                
Resources/views/base.html.twig
Resources/data/page.yml
```

## perl
次に、``perl``を使って改行を全て空白に置換することで、検索結果のファイル名を横並びにします。
``-pe``オプションを付けることで、``sed``コマンドのように``s/hoge/fuga/g``の書式を使った検索ができます。

```shell:例
$ cat sample.txt 
hoge
fuga
foo
bar

$ cat sample.txt | perl -pe 's/\n/ /g'
hoge fuga foo bar % 
```

## vim
最後に``vim``ですが、``vim``は``-p``オプションを付けて開くことで、複数ファイルをタブで一度に開くことができます。

```shell:例
$ vim -p sample.txt sample2.txt 
2 files to edit
```

こんなふうに開きます。
<img width="227" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/156567/6b873df9-dd01-d6aa-e2cf-844f12944870.png">

僕は``vim``のショートカットをいろいろ変えていて、``sn``とか``sp``でタブを前後移動できるため、タブで開くほうが都合が良かったのです。

# 余談
以上になりますが、理想を言えば``grep``した検索結果があまりにも多いと``vim``がパンクしてしまうので、``grep``結果の件数を見てフィルタリングしたいなと思います。

# 余談Ⅱ
https://qiita.com/yuku_t/items/0c1aff03949cb1b8fe6b

あっ``vimgrep``というものがあるのか、知らなかった。とはいえシェル上から探したい場面もあると思うので両方使えるようにこっちも勉強してみます。
エクセルの印刷倍率と表示倍率を全シート設定するVBAコード

# エクセルの印刷倍率と表示倍率を全シート設定するVBAコード

【目的】
　社内資料でも、顧客納品物でも、エクセルは印刷や表示倍率の設定調整が面倒。
　シートが沢山あると、設定も大変。だからさくっとVBAでやる。

　次のようなシート構成だとする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/0aeda897-553e-b6fb-7dfe-41a34bdf3f0f.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/49516533-c81d-719f-2492-bd3a8546fa90.png)


## VBAコード。


```

Private Sub hogehoge()

    '-- エクセルの印刷倍率と表示倍率を全シート設定するVBAコード

    Dim objSheet As Worksheet

	' ブックの全シートを 1 つずつループして処理する

	For Each objSheet In ThisWorkbook.Worksheets

		Debug.Print objSheet.Name & "を処理します"

		Sheets(objSheet.Index).Select
		objSheet.Range("A1").Select       '-- カーソルをA1に設定（お好みで）

		If objSheet.Name = "特別なシートA" Then
			objSheet.PageSetup.Zoom = 100 '-- 印刷倍率
			ActiveWindow.Zoom = 100       '-- 表示倍率
		ElseIf objSheet.Name = "特別なシートB" Then
			objSheet.PageSetup.Zoom = 75
			ActiveWindow.Zoom = 65
		Else
　　　　　　　　　　　　　'-- それ以外
			objSheet.PageSetup.Zoom = 65
			ActiveWindow.Zoom = 65
		End If

	Next

End Sub

```

## コードの使い方

任意のシートを選択して右クリック、「コードの表示」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/a0b85ad0-4990-b087-e805-7342d95b1293.png)

コピペ。

「hogehoge」にマウスカーソルを合わせて実行ボタン

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/47044c07-a597-b0c3-e73b-59d13c27787a.png)

VBAを保存しないので、実行したらコピペした内容を消して、コードを閉じる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/bb731e3c-cb6d-0220-adf5-fad8ce186161.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/d53d7624-f18c-b8f0-7f71-6e2d2db24b37.png)

一発で全シート設定できるので助かる。

『　objSheet.Name = "特別なシートA"　』のような条件分岐を入れておけば、
特定のシートを選別して、個別に設定することができるので便利。

以上です。
AWS S3＋CodeDeployでデプロイしてみたよ

## 必要ソフトの準備（Python, pip, AWS CLI || git）
CodeDeployを使用するにあたってソースコードを何処から持ってくる必要がありますが、CodeDeployで選べるのはS3かGitHubのどちらかとなります。

- piplineを使えばcodecommit等も使えますが、今回はS3での手順となります。
- アップ先にS3を使用する場合は、AWSコンソールから直接アップするかAWSCLIのコマンドでアップする方法があります。   
[AWS CLIのインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)

## AWS設定
### ファイルアップロード用 S3バケットの作成
  - バケット名：codedeploy-bucket
        
### CodeDeploy から EC2 や AutoScaling などの情報を参照するための権限(IAM Role)を作成
  - AWS の Management Colsole から IAM を選択し Role を作成します。「IAM → ロール → ロールの作成 → CodeDeploy → ユースケースの選択(CodeDeploy) → 次(アクセス権限) → 次(確認) → ロールの作成」

### S3からファイルを取得する権限(IAM Role)を作成しEC2にアタッチ
  - S3から情報取得するロールの作成：「IAM → ロール → ロールの作成 → EC2 → 次(アクセス権限) → AmazonS3ReadOnlyAccessを選択 → 次(確認) → ロールの作成」
  - EC2にロールをアタッチ：「ec2管理 → インスタンス選択 → アクション → インスタンスの設定 → IAMロールの割当て/置換」からアタッチ

### EC2にAWS CodeDeploy エージェントをインストール(CodeDeployはrubyで動いてるので入って無ければrubyを入れる。例ではwgetも使用)
```
yum -y install ruby
yum -y install wget
cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
```
  ※ bucket-nameは作成したS3バケットと同じaws-codedeploy-ap-northeast-1(東京)
  ※ CodeDeploy エージェントをインストールすると /var/log/aws/codedeploy-agent/ にログが出力されるようになる
  参考： https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html

### CodeDeployエージェント起動
```
sudo service codedeploy-agent start
sudo service codedeploy-agent status
```

## デプロイ設定
### アップ対象のフォルダ内にappspec.yml を作成（下記例は最低限）
```
version: 0.0
   os: linux
   files:
        - source: /
          destination: /var/www/html/app
```
※参考：https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file.html

### アプリケーション作成
- CodeDeploy の Console画面にて、デプロイ → アプリケーション → アプリケーションの作成 

### デプロイグループの作成
- サービスロールの選択
- デプロイタイプはインプレースか「Blue/Green」を選択 ※今回はインプレース想定
- 環境設定では EC2インスタンス を選択し、キーと値を選択または追加。対象インスタンスが複数ある場合は、タグでデプロイ対象に紐づけたタグを使う
- デプロイ設定を選択。  
※[1個づつか、半分か、全部いっぺんにデプロイするかの選択。それぞれ成否判定が異なるので注意](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/deployment-configurations.html)
- ロードバランサを使用しているなら対象のロードバランサ―を選択できます。  
※[詳しい動作はデプロイタイプによって異なります。](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/integrations-aws-elastic-load-balancing.html)

## デプロイ
  1. S3へソースのアップ。

```
aws deploy push --application-name hoge --description "hoge" --ignore-hidden-files --s3-location s3://codedeploy-bucket/hoge.zip --source .
```
※「AWS CLI」でS3にアップする場合
  2. AWSコンソール画面からCodeDeploy → デプロイ → アプリケーション → アプリケーション選択 → デプロイタブ → デプロイの作成
  3. デプロイグループ：AWS設定で作成したデプロイグループ選択
  4. リビジョンタイプ：今回は「S3に格納・・・」を選択
  5. リビジョンの場所：アップしたリビジョンを選択  ※手動デプロイだと対象が分かり辛い
  6. 各種動作を設定して、「デプロイの作成」でデプロイ実行

## まとめ
CodeDeploy単体だと、都度ソースを手動でアップしデプロイを実行しなければいけませんので非常に面倒です。デプロイ対象の判別も目視なのでミスが発生してしまいそうです。  
CodePiplineを使えば自動デプロイも可能でその辺が見事に解消されるので、そちらも合せて使う事をお勧めします。
[CodeCommit＋CodeDeploy＋CodePiplineでデプロイを自動化](https://qiita.com/tailix/items/08a176457801be3278ec)
素のJavaScriptでXPathを使う

今どきのJavaScriptは、document.querySelectorAllがあるから、jQueryがいらない。

ただ、querySelectorAll はCSSセレクタしばり。ほとんどの場合の要素指定はCSSセレクタでいけるんだけど、CSSだとテキストノードのマッチ機能がない。

ページングの「次へ」リンクなどが、CSSセレクタとして特定できなくても、「次へ」の文字列の一致で特定したいときはある。その場合はCSSセレクタではなくXPathのほうが便利。

ちょっとコツが要るが、「クラス名がc-paging__pagenavi-itemのテキストが">"というアンカーをクリックしなさい」というソースは以下のスニペットでいける。

```javascript
var nodesSnapshot = document.evaluate('//a[@class="c-paging__pagenavi-item" and text() = ">"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
nodesSnapshot.snapshotItem(0).click();
```

document.evaluate の第一引数がXPathセレクタなので、そこだけ差し替えればいろいろ遊べる。
curlで複数パラメータをGETで渡す

macのターミナルからGETパラメータを複数渡すAPIを叩きたいが、うまくいかない。
`-v`オプションでリクエストを確認すると、パラメータを1つしか渡せていないよう。
`&`をエスケープする必要があった。

```sh

curl --globoff -v -H 'Authorization: Bearer [accessToken]' \
 http://example.com/search?params[key1]=value1\&params[key2]=value2
```

ちなみに、パラメータに`[]`を使う場合は、`--globoff`オプションをつける必要がある。

#### 参考
- [curlで複数パラメータのGETを投げる \- Qiita](https://qiita.com/nobu_121/items/52bb9d5961aa3e017813)
- [curlで\[\]とか\{\}を含むURLから取得する \- Qiita](https://qiita.com/fujiba/items/ed0c9d9de1a61880af04)
- [curl コマンド \| コマンドの使い方\(Linux\) \| hydroculのメモ](https://hydrocul.github.io/wiki/commands/curl.html)
IntelliJ のプロジェクトのテストコードのディレクトリを認識させる方法

IntelliJ のプロジェクトのテストコードがあるディレクトリをテストディレクトリとして認識させる方法

1. テストコードディレクトリを認識させる。
テストコードディレクトリを右クリックし、以下の機能を実行すること

```
mark Distribute as > Test Sources Root
```

を選択する。
選択することでフォルダの色が変更されます。


2. テスト実行
テストディレクトリを右クリック

```
Run All Tests
```
を選択することでテストが実行される。
Nuxt.js v2.4にアップグレードしたらハマったところ

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Nuxt v2.4.0 is finally here 🎉<br>Official TypeScript support, smart prefetching and many more features &amp; bug fixes.<a href="https://t.co/Ljf29xYvXi">https://t.co/Ljf29xYvXi</a></p>&mdash; Nuxt.js (@nuxt_js) <a href="https://twitter.com/nuxt_js/status/1089948593392365568?ref_src=twsrc%5Etfw">January 28, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

今日リリースされたので早速やってみました。

## nuxt-sass-resources-loader動かない

https://github.com/anteriovieira/nuxt-sass-resources-loader/issues/25

style-resources-moduleを使うようにとのこと。

```shell
yarn remove nuxt-sass-resources-loader
yarn add @nuxtjs/style-resources
```

## Vuexのクラシックモードがv3で廃止

> Classic mode for store/ is deprecated and will be removed in Nuxt 3

Nuxt.jsのv3ではVuexのクラシックモードを非対応とのことなのでwarningが出ます。

この機会にモジュールモードに書き換えた。
https://ja.nuxtjs.org/guide/vuex-store/

ほか何かあれば追記していきます。
laravel/config 内で objectやcollect を使わないこと！

同じようにはまる人のために・・

```
php artisan config:cache
```

したら以下のようなエラー

```
Your configuration files are not serializable.
BadMethodCallException::("Method Illuminate\Support\Collection::__set_state does not exist.")
Error::("Call to undefined method stdClass::__set_state()")

```

原因

```php:config/hoge.php

return collect([
  (object)[
    'id'=>1,
    'name'=>'hoge'
  ],
  (object)[
    'id'=>2,
    'name'=>'fuga'
  ],
]);

```

config/*.php で、配列以外を返すとだめみたいです。

解決

```php:config/hoge.php

return [
  [
    'id'=>1,
    'name'=>'hoge'
  ],
  [
    'id'=>2,
    'name'=>'fuga'
  ],
];

```

受け手側で、collect() するなりする！
vue.js で 緯度経度から住所を取得

都道府県を取得したいだけなので、マップは使わない。

https://github.com/PDERAS/vue2-geocoder


上記をインストールして、コードはこれ。

```

<script>
        created() {
            
            if (navigator.geolocation){

                navigator.geolocation.getCurrentPosition((position) => {

                    Vue.$geocoder.setDefaultMode('lat-lng');
                    
                    var latLngObj = {
                        lat: position.coords.latitude,
                        lng: position.coords.longitude
                    };

                    let res = Vue.$geocoder.send(latLngObj, response => {

                        let d = response.results.splice(-2,1);
                        this.pref = d[0]['address_components'][0]['long_name'];//愛知県
                    });
                });


            } else {
                //alert('非対応ブラウザ');
            }

        },
</script>

```
WSL/ROS/RPLiDAR 第弐の挑戦


気になっていた格安 RPLiDAR A1M8 を入手したので、動作確認してみた。
## 1.windwows で動作確認。
まず、SDKをダウンロードします。
![slamtec02.gif](https://qiita-image-store.s3.amazonaws.com/0/295124/971bdd2e-9bbc-f8eb-a2a7-594d1766dd96.gif)
接続はUSB-Serial(CP2102)なので、ドライバーをインストールし
接続し、ポート番号を確認。
![slamtec09.gif](https://qiita-image-store.s3.amazonaws.com/0/295124/bc2ecafa-dbaa-bc48-2908-c4b0fbe330b6.gif)

SDK/tools の frame_grabber.exe を起動し、スキャンします。
![slamtec10.gif](https://qiita-image-store.s3.amazonaws.com/0/295124/93c7818f-9567-2f99-ea75-93a65bef9be5.gif)
確認OKです。
##2. Ubuntu14+ROS(JADE)で確認
![slamtec11.gif](https://qiita-image-store.s3.amazonaws.com/0/295124/2a22b4e3-55b5-95b9-4d16-bbb0cb67c66e.gif)
$ cd ~/catkin_ws/src
$ git clone https://github.com/slamtec/rplidar_ros.git
$ cd ~/catkin_ws
$ catkin_make
USB-Serial を udevの設定で 0666 にモード設定します。設定例のスクリプトは
~/catkin_ws/src/rplidar_ros/scripts にあります。

$ roslaunch rplidar_ros view_rplidar.launch


![rplidar_scan.gif](https://qiita-image-store.s3.amazonaws.com/0/295124/8b72603f-7ae3-f54c-f4a5-30aa54360b00.gif)
確認OKです。
## 3.WSL/Ubuntu16/ROS(Kinetic)で確認--失敗
3.1 X環境設定
![slamtec03.gif](https://qiita-image-store.s3.amazonaws.com/0/295124/03d307b1-f6cc-b021-7c5a-2f5a9d17481d.gif)
Native OpenGLを無効化します。
![slamtec04.gif](https://qiita-image-store.s3.amazonaws.com/0/295124/7428b7ee-26db-0154-d8d7-76f4bdeb2239.gif)
3.2Ubuntu起動
![slamtec05.gif](https://qiita-image-store.s3.amazonaws.com/0/295124/4667a929-39d1-91fc-d95f-f02d4e3a0c95.gif)
3.3 /dev/ttyS9 設定
![slamtec06.gif](https://qiita-image-store.s3.amazonaws.com/0/295124/b566e26a-9cb2-f5b5-a10c-086761e73f6b.gif)
3.4 rviz起動
![slamtec07.gif](https://qiita-image-store.s3.amazonaws.com/0/295124/f72f4191-443b-3623-4e10-29d821dc90e5.gif)
3.5 USB Serial TimeOut
![slamtec08.gif](https://qiita-image-store.s3.amazonaws.com/0/295124/b88dfc72-0a6a-659f-54b3-574daa8c11c7.gif)

どうも、現状のWSLでは ioctl() がサポートされていないため、DTR信号をモーターの制御に使用している今回のrplidar が動作不能となったもよう。
動作NGです。

---
この記事は憶測でかかれています。
2019.01.29
Pythonで迷路ゲームを作ってみました.

# 1. はじめに
強化学習(Reinforcement Learning)の導入例(以下写真みたいな)でよく見る
迷路ゲーム(CUI)を作ってみました.
キーワードとしては以下になります。

- 迷路自動生成機能
- start/goal位置の自動設定

# 2. 開発に用いた環境/モジュール
- Python 3.7
- numpy
- random
- math
- scipy

# 3. 全体のコード
Google Driveで共有します.
https://drive.google.com/open?id=1q0EkWOMs_PnlUT4mcdecKrXDnngpl6o2 

# 4. 遊び方
## 4.1 起動コマンド
$ python play_game.py

## 4.2 ルール
1. easy, normal, hardの3つから難易度を選択
⇒start位置、goal位置, MAPが自動生成される

2. 極力はやくゴールへ向かう.
*移動ステップごとに報酬が-1される.
迷路での強化学習エージェントを演じるみたいな感じです.


# 5. ゲームの様子
![m1.PNG](https://qiita-image-store.s3.amazonaws.com/0/276691/60a6b8e1-528b-4eee-ef5a-aac0710a01cc.png)
![m2.PNG](https://qiita-image-store.s3.amazonaws.com/0/276691/71ef1940-d487-252b-46fe-4d34548afad5.png)

![m3.PNG](https://qiita-image-store.s3.amazonaws.com/0/276691/340e8a1b-44ee-ee15-da80-4a57a375ef1b.png)

![m4.PNG](https://qiita-image-store.s3.amazonaws.com/0/276691/e07a80b7-cc82-f488-1c63-44e613ae88a8.png)


# 6. 主要機能の紹介

## 6.1. 迷路自動生成機能
棒倒し法というアルゴリズムを用いて作成しました。

アルゴリズム
 1. -1だけで構成されるM×M配列を生成(*Mは3以上の奇数)
 2. M×M行列の(i,j)要素の内,i ,j∈(任意の奇数)である位置を壁(コードではmath.nan)とする.
  例. 5×5行列(i=[0,1,2,3,4],j=[0,1,2,3,4])なら、
  壁とみなす( i, j )の組み合わせは、  [(1,1),(1,3),(3,1),(3,3)]の4つ

## 6.2. start/goal位置の自動設定
1. MAPとして用いるM×M行列の4隅を表す4点から、
正規分布(normal)を用いて20個ずつ乱数生成.
2. 20個ずつある乱数から、MAPの位置になりえない、あるいは壁である部分を削除
3. 2.の結果からランダムに1点ずつ抽出(計4点)
4. 計4点のユークリッド距離行列をmeshgridを使って作成
5. 4から最もユークリッド距離が遠くなる組み合わせをstart, goalとして設定する.
(どちらがstart, goalかはランダム)

以下、start/goalの設定に使ったコード

```python
def set_mainpos(self, MAP):
        

        size = (MAP.shape[0], MAP.shape[1])
        corners = [[0,0],[0,size[0]],[size[0],0],[size[0], size[0]]]
        flag = 0 #start, goalが同じにならないため ( なった例がある. )
        while flag == 0:

            candidate = []
            for k,v in corners:
                tmp = [normal(k,int(size[0]/3.3), 20).tolist(), normal(k,int(size[0]/3), 20).tolist()]
                tmp = [ [ i for i in tmp[0] if i < size[0] and i > 0 ], [ i for i in tmp[1] if i < size[0] and i > 0 ]]
                
                flag2 = 0
                while flag2 == 0: # nanをstart, goalにしないための処理
                    tmp2 = [int(choice(tmp[0])), int(choice(tmp[1]))]
                    if str(MAP[tmp2[0],tmp2[1]]) != str(nan):
                        flag2 = 1
                
                
                
                candidate.append([int(choice(tmp[0])), int(choice(tmp[1]))])

            shuffle(candidate)
            

            tmp_index = np.arange(np.array(candidate).shape[0])
            xx, yy = np.meshgrid(tmp_index, tmp_index)
            distances = np.linalg.norm(np.array(candidate)[xx]-np.array(candidate)[yy], axis=2) 
            
            index = np.where(distances==distances.max())[0].tolist(), np.where(distances==distances.max())[1].tolist()
            
            candidate[index[0][0]]

            self.main_pos["start"] = candidate[index[0][0]]
            self.main_pos["goal"] = candidate[index[0][1]]

            if  self.main_pos["start"] !=  self.main_pos["goal"]:
                flag = 1

     

```