OmniAICreator/Qiita-1.07M huggingface dataset:
ROS Kineticで、ARマーカーの姿勢データの取得

# 動機

ROSのパッケージにある、ar_track_alvarの準備ができたので、つぎは実際にトピックを拾って、マーカーの姿勢をとれるかやってみる。



# 環境
- Ubuntu 16.04 LTS
- ROS Kinetic Kame
- 今回使用したのUSBカメラ（Logicool C270　UVC対応）1台

# 参考にした情報
[ROSではじめるロボットプログラミング](https://www.amazon.co.jp/dp/4777519015)

# ARマーカーの姿勢情報の取得

## ar_pose_markerのデータ取得
ar_pose_markerトピックをsubscribeするノードを作成する。

特に書いてなかったがこれまで「camera_eval」と名前をつけたパッケージで、カメラ接続の検証などをしていたため、そのパッケージ内のscriptsに、以下のようにコードをつくる。
シンプルに、subscriberとcallbackだけ。

```python:ar_pose_subscriber.py
import rospy
from ar_track_alvar_msgs.msg import AlvarMarkers

class ARPoseSubscriber(object):
    def __init__(self):
        self.sub = rospy.Subscriber("/ar_pose_marker", AlvarMarkers, self.callback_alvmarker)

    def callback_alvmarker(self, markers):
        
        for m in markers.markers:
            marker_id = m.id
            if marker_id == 4:
                marker_pose = m.pose.pose
                pos = marker_pose.position
                ori = marker_pose.orientation
                rospy.loginfo("marker[%d] position (x,y,z) = (%3.3f: %3.3f: %3.3f), orientation (x,y,z,w) = (%3.3f: %3.3f: %3.3f: %3.3f)" 
                              % (marker_id, pos.x, pos.y, pos.z, ori.x, ori.y, ori.z, ori.w))

        return

if __name__ == '__main__':
    rospy.init_node('ar_pose_subscriber')
    ARPoseSubscriber()
    
    rospy.spin()
```
ここでは、3x3の九つマーカーが印刷されたものを使っているので、センターにあるmarker_id==4のものだけ、loginfoに出力するようにしている。


```
$ chmod 755 ar_pose_subscriber.py
```
として、実行可能にしておく。


つぎに、launchファイルに下のように追加する。

```
  <node name="ar_pose_subscriber" pkg="camera_eval" type="ar_pose_subscriber.py"/>

```
パッケージ名は、先ほどのコードが置いてある自作のパッケージ名として、実行可能にしたpythonファイルを指定する。


別の端末を立ち上げて、

```
rqt_console
```
とすれば、出力したloginfoがどんどん発行されて流れて行くのが見れる。


ひとまず、位置・姿勢の情報がとれた。厳密な値の比較をしていないが、カメラからマーカーを離すとzの値が増加するし、カメラに対してマーカーを右に動かすとプラスに、左に動かすとマイナスに値が変化する様子が見れた。


# tfトピックのデータ取得（失敗？）

それでは次に、/tfトピックでもできるかやってみよう。

（2018/4/12追記）

/ar_pose_markerの土岐と同様に、/tfのメッセージの型も分かったので、

```python:tf_subscriber.py
import rospy
import tf
import tf2_ros

from tf2_msgs.msg import TFMessage

class TfSubscriber(object):
    def __init__(self):
    
        self.sub = rospy.Subscriber('/ar_track_alvar/tf', TFMessage, self.callback_tf)

    def callback_tf(self, markers):

        for m in markers.transforms:
            marker_pose = m.transform
            tra = marker_pose.translation
            rot = marker_pose.rotation
            rospy.loginfo("position (x,y,z) = (%3.3f: %3.3f: %3.3f), orientation (x,y,z,w) = (%3.3f: %3.3f: %3.3f: %3.3f)" 
                          % (tra.x, tra.y, tra.z, rot.x, rot.y, rot.z, rot.w))

if __name__ == '__main__':
    rospy.init_node('tf_subscriber')
    TfSubscriber()
    
    rospy.spin()
```

としてみたのだが、rqt_consoleでloginfoに出てこなかった。launchしたときに特にエラー表示もないし、rqt_graphで見てもノードが立ってたり、/tfを受け取れている様子なんだけどね。


[空飛ぶロボットのつくりかた ROStfのお勉強](http://robonchu.hatenablog.com/entry/2017/05/29/145627)
[うごくものづくりのために 座標変換パッケージ "tf"の使い方](http://makemove.hatenablog.com/entry/2014/09/23/182742)
[MyEnigma 世界で一番簡単なtfの使い方](http://myenigma.hatenablog.com/entry/20130210/1360491625)
の情報を見てみると、topicのsubscribeではなくて、tfのlistenerを使う感じ？

tf（モジュール名とトピック名が同じだから、/tfってしないと分かりづらいな）のことをもっと勉強しよう。
VisualStudio EF > Core Power Tools


[EF Core Power Tools](https://github.com/ErikEJ/SqlCeToolbox)


## EF Core Power Tools for Visual Studio 2017

Download the latest version of the Visual Studio 2017 extension from Visual Studio MarketPlace
https://marketplace.visualstudio.com/items?itemName=ErikEJ.EFCorePowerTools



You can download the daily build from [VSIX Gallery](http://vsixgallery.com/extensions/f4c4712c-ceae-4803-8e52-0e2049d5de9f/extension.vsix)


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/63af7579-0c9b-9784-ad15-edbb3ddd4375.png)


Reverse Engineer

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/9cf7b642-854a-7ce3-e048-b124ada27e18.png)
TensorFlow Models の使い方

公開されている TensorFlow Models の使い方です。

プログラムのダウンロード

```bash
git clone https://github.com/tensorflow/models.git
```

サンプルの実行

```bash
cd models/tutorials/image/imagenet
python classify_image.py
```

>このプログラムは、/tmp/imagenet/cropped_panda.jpg を処理します。パンダと判定されます。

大きいデータが、/tmp/imagenet 以下にダウンロードされます。
/tmp は、再起動で消去されるので、/var/tmp/imagenet に移します。

それに伴い、classify_image.py　も修正します。
default='/tmp/imagenet',
を
default='/var/tmp/imagenet',
にします。

例えば、いちごの画像をダウンロードしてテストすると、
![strawberry.jpg](https://qiita-image-store.s3.amazonaws.com/0/179446/e4e208cd-320f-29d3-9f5a-ed134603a14d.jpeg)


```text
$ export TF_CPP_MIN_LOG_LEVEL=2
$ python classify_image.py --image_file  ~/Downloads/strawberry.jpg 
strawberry (score = 0.97967)
banana (score = 0.00068)
Leonberg (score = 0.00047)
ringneck snake, ring-necked snake, ring snake (score = 0.00047)
German shepherd, German shepherd dog, German police dog, alsatian (score = 0.00046)
```

>ちゃんと　strawberry (score = 0.97967) と判定します。

バナナの画像で試すと
![banana4.jpg](https://qiita-image-store.s3.amazonaws.com/0/179446/dce2dd3d-0ca0-589f-511b-cf399c64fd28.jpeg)


```text
$ export TF_CPP_MIN_LOG_LEVEL=2
$ python classify_image.py --image_file  ~/Downloads/banana4.jpg
banana (score = 0.99953)
orange (score = 0.00002)
pineapple, ananas (score = 0.00001)
lakeside, lakeshore (score = 0.00001)
corn (score = 0.00000)
```

>ちゃんと、　banana (score = 0.99953)　と判定します。

でもりんごの成績はあまり良くありません。

![apple2.jpg](https://qiita-image-store.s3.amazonaws.com/0/179446/26b2db4f-f02b-0f74-0a83-a3ce06f52078.jpeg)


```text
$ export TF_CPP_MIN_LOG_LEVEL=2
$ python classify_image.py --image_file  ~/Downloads/apple2.jpg 
orange (score = 0.23259)
Granny Smith (score = 0.22257)
banana (score = 0.05309)
pomegranate (score = 0.04968)
strawberry (score = 0.01616)
```

>欧米産のりんごでないと良い結果が出ないのかもしれません。


次で動作確認しました
>Arch Linux (4.15.15-1-ARCH)
>Raspbian GNU/Linux 9 (stretch)
>Raspbian GNU/Linux 8 (jessie)
text-transformで文頭だけ大文字にするときのCSSメモ

英文の先頭だけ大文字で、他は小文字にする場合のCSSでのやり方を質問されて、
`text-transform` で一発やんけと思ったけど、そうでも無く考えさせられたのでメモ。 (後半ポエム)

## text-transform とは

HTMLに記述されている英文の表示を、大文字/小文字を指定するためのCSSプロパティです。

```html:元ソース(html)
<h1>May the FORCE be with you.</h1>
```

|CSS|意味|表示|
|:----|:----|:----|:----|
| `h1 { text-transform: none; }` | 記述そのまま | May the FORCE be with you. |
| `h1 { text-transform: uppercase; }` | すべて大文字 | MAY THE FORCE BE WITH YOU. |
| `h1 { text-transform: lowercase; }` | すべて小文字 | may the force be with you. |
| `h1 { text-transform: capitalize; }` | 単語の先頭だけ大文字 | May The Force Be With You. |

## 文頭だけ大文字にするには？
`text-transform: capitalize;` だと、文中の各単語の頭文字が大文字になってしまう。
冒頭の「文の先頭だけ大文字にする」には以下のようにする。

```css:css
h1 { 
  text-transform: lowercase;   /* 全体を小文字にリセット */
}

h1::first-letter {
  text-transform: capitalize;  /* 先頭文字だけ大文字化 */
}
```

まず当該のセレクタ全体に対し、 `lowercase` で全体を小文字にリセットし、 `::first-letter` 疑似要素で先頭だけ `capitalize` する。

|CSS|意味|表示|
|:----|:----|:----|:----|
| `上記` | 文頭の1文字だけ大文字 | May the force be with you. |

`text-transform` と `::first-letter` は、ほとんどのブラウザでサポートされているが、 IE8以前のIEではCSS2時代のシングルコロンの疑似クラスしか受けつけないので注意。


## 考察
### 1. 手法の妥当性
上述の通り `text-transform` を使用して大文字/小文字表示のある程度のコントロールは効く。
しかしこの手段は「どうしても」という時に使う程度に考えておき、
実際表示されたい様にHTMLにもともと記述するのが本来的であると考える。

※ 例えば、上記の方法だと 「I AM SAM.」 の場合に 「I am sam.」 となってしまい、期待値の 「I am Sam.」が実現できない。

### 2. セマンティクス(意味性)
次にこの手法がアクセシビリティやセマンティクスの面でHTMLの品質に与える影響を考える。

> **F2: 達成基準 1.3.1 の失敗例 － 適切なマークアップ又はテキストを用いずに、テキストの見た目の表現の変化を用いて情報を伝えている | WCAG 2.0 達成方法集**
> https://waic.jp/docs/WCAG-TECHS/F2.html

上のページの「失敗例3」では、強調するために `span class="yell"` などのマークアップをし、`text-transform` を使用している例があるが、このように強調目的で表現する場合には `strong` や `em` など「強調」というセマンティクス(意味性)を持つタグでマークアップする方がHTML５としては本来的だ。

### 3. アクセシビリティ
次にアクセシビリティの観点でこの手法がいいのかを考えてみた。

#### コードとして
CSSで文字情報の内容や見た目を操作するもの（例えば `::before` 擬似要素に `content` プロパティでテキストを出力するような方法） は、感覚的にアクセシビリティ的によろしくないのかな、と思い込んでいたが、以下を読む限りそうではなさそう。

> **C22: テキストの視覚的な表現を制御するために、CSS を使用する | WCAG 2.0 達成方法集**
> https://waic.jp/docs/WCAG-TECHS/C22.html

※もちろん ↑の `content` の例は言語に依存したテキスト情報をCSS側にハードコードするという点でメンテナブルではなく、HTML/CSSの棲み分けとしても気持ちがわるい。
（そういう場合は自分だったら `content: attr("data-***");` とかで情報をHTML側に集約させるとか？）

#### 可読性として
というかアクセシビリティという点で言えば、「可読性」(読みやすさ) がそもそもの論点か。
大文字の方が読みやすい(例えば略語など)で、局所的に `uppercase` をかけるというなら妥当かと思うが、
であればもともとHTMLにそのように記述するのがやはり本来的。

#### 音声リーダー対応
強調ないし装飾の目的でHTML上、全てを大文字に記述してしまうと、音声リーダーの読上げが期待値通りにならないという点も紹介されていた。

```html:NG
<span>FORCE</span>       <!-- 読上げ "エフオーアールシーイ―" -->
```
```html:OK
<span>Force</span>       <!-- 読上げ "フォース" -->
```

この問題を回避する場合、CSS側で見た目上 uppercaseにする方法が妥当。

```html
<span style="text-transform:uppercase">Force</span>
```
↑の方法であれば視覚的に 「FORCE」と表示し、音声リーダーは「フォース」と読んでくれる。

> **参考**
> *アクセシビリティガイドライン > 39. ユーザーが一般的に理解できる外来語・外国語を除き、外国語を必要以上に用いない... ： 三井住友銀行*
> http://www.smbc.co.jp/accessibility/guidelines/guideline_39.html

まとめると、特段意味がなく装飾だけの目的で大文字/小文字のCSS操作をする際には、視覚的に読みづらくなってないかを考慮し、する場合は音声リーダのことも考えると良い。というところか。
Markdown エディタを Atom からVisual Studio Code に移行したメモ

## 経緯
社内プロキシ環境が変更になった際、 Atom のパッケージインストーラが以下のようなエラーでうまく動かなくなってしまいました。

```
tunneling socket could not be established, statusCode=407
```

「`~/.atom/.apmrc` に `http(s)-proxy` を設定しろ」みたいな記事を参考にいろいろと試行錯誤してみましたが、解決には至らず、、、

良い機会だったので、 ~~Micr●s●ft 製品は宗教上の理由で敬遠していましたが、~~巷でちらほら名前を聞く Visual Studio Code (VSCode) に手を出してみることに。

## 環境
+ Windows 7 64bit
+ Visual Studio Code v1.22.1
+ 社内プロキシ環境下

## やりたいこと
Markdown でゆるゆるドキュメントを作成して、PDFやHTMLで出力したい。

## VSCode のインストール
[VSCode の公式サイト](https://code.visualstudio.com/download)からインストーラ（ `VSCodeSetup-x64-{version}.exe` ）をダウンロードし、手順に従ってインストールするだけ。

## 拡張機能のインストール
### Atom Keymap `ms-vscode.atom-keybindings`
Atom で慣れ親しんだキーボードショートカットを使えるように。

### Markdown+Math `goessner.mdmath`
$\LaTeX$ 形式で数式を記述できるように。数式のレンダリングエンジンには KaTeX を採用している。

### Markdown Preview Github Styling `bierner.markdown-preview-github-styles`
Markdown のプレビューを GitHub スタイル（の CSS）で表示する。

## インストールしなかった拡張機能
### Auto-Open Markdown Preview `hnw.vscode-auto-open-markdown-preview`
`*.md` ファイルを開いた際に自動でプレビューを表示する。

軽微な誤字脱字くらいだとプレビューを使わずにパパッと修正したいこともありますが、エディタを画面左半分（右半分）表示で作業している際に、自動でプレビューまで開かれると編集領域が画面1/4の狭さになってしまうため不採用。

### Markdown PDF `yzane.markdown-pdf`
`*.md` ファイルを `*.pdf` （または `*.html` ）として出力するコマンドを追加する。

（数式も含めて）プレビューをそのまま出力してくれると嬉しかったんですが、難しい？ようなので一旦保留。

### Markdown All in One `yzhang.markdown-all-in-one`
様々な機能が含まれているっぽい。

自分にはちょっと冗長な気がしたので不採用。

### Markdown Preview Enhanced `shd101wyy.markdown-preview-enhanced`
上に同じ。

## 設定変更
`ファイル > 基本設定 > 設定 > ユーザー設定` に以下の設定を追加。

```json
{
    "http.proxy": "http://{your-proxy}:{your-port}"
}
```

## Markdown から PDF (HTML) 出力まで
1. `*.md` を作成
1. `Ctrl + Shift + M` でプレビューを表示
1. `表示 > コマンド パレット > Markdown: Clip Markdown+Math to HTML` または `Ctrl + K .` を実行
1. 3.でクリップボードにコピーしたHTMLを `*.html` として保存
1. `*.html` を煮るなり焼くなりする

## 感想
まだそこまで使い込んでいませんが、Atom と比べて起動時間が早いのが良いですね。

> [Atom vs Visual Studio Code 速度比較!! Electron系テキストエディタ2大決戦!!](https://ryuta46.com/379)

VSCodeは基本機能だけでもかなり充実しているという印象を受けますが、便利な拡張機能がまだまだありそうなので気が向いたら追記したいと思います。

というか、PDF (HTML) 出力の手順が若干スマートではないので、少しばかり改善したい所存。
gitノート: コミットを分割

ファイルX,Yを一回のコミットで追加したが、これをそれぞれのコミットに分割して追加したことにしたい

    $ mkdir X
    $ cd X/
    $ git init
    $ touch README.txt
    $ git add README.txt
    $ git commit -m "initial commit"
    $ touch X Y
    $ git add X Y
    $ git commit -a -m "add X, Y"

ログ確認 

    $ git log
    commit 6f04e67c167eda51089086644566983c25c9a828
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 14:42:36 2018 +0900
    
        add X, Y
    
    commit a886aa67c6f2eba22ce19466bf4bec5cf67248f8
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 14:41:45 2018 +0900
    
        initial commit

最新のコミットを分割し、 X,Yをそれぞれのコミットで追加することにする。

    git rebase -i HEAD^1

一行目を編集

```diff
-pick 6f04e67 add X, Y
+edit 6f04e67 add X, Y
```

エディタを終了すると rebaseが一時停止する

    Stopped at 6f04e67... add X, Y
    You can amend the commit now, with
    
            git commit --amend
    
    Once you are satisfied with your changes, run
    
            git rebase --continue

最新のコミットをリセットして

    $ git reset HEAD^

X,Yをそれぞれ追加してコミット 

    $ git add X
    $ git commit -a -m "X"
    [detached HEAD ed4ff58] X
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 X
    
    $ git add Y
    $ git commit -a -m "Y"
    [detached HEAD 835430c] Y
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 Y

最後に `git rebase --continue`を実行。

    $ git rebase --continue
    Successfully rebased and updated refs/heads/master.

ログを確認

    $ git log
    commit 835430c1e950d5edf6cbcfb15bdaf59c1b34a5db
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 14:47:45 2018 +0900
    
        Y
    
    commit ed4ff58c43b72148f1e05df78adc5ce6f7e66390
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 14:47:39 2018 +0900
    
        X
    
    commit a886aa67c6f2eba22ce19466bf4bec5cf67248f8
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 14:41:45 2018 +0900
    
        initial commit

正直 rebaseしなくても resetだけでいいのではないかと思うのだが、なんだかよく分からない。
Setup Common Configuration in new AWS Ubuntu16.04 Server.

# 1. Setup timezone
```
# sudo timedatectl set-timezone Asia/Taipei
```

# 2. Mount EBS (Option)
```
# lsblk

# sudo mkfs -t ext4 /dev/xvdb
or
# sudo mkfs -t ext4 /dev/nvme1n1

# sudo mkdir -p /media/SecondDisk

# sudo mount /dev/xvdb /media/SecondDisk
or
# sudo mount /dev/nvme1n1 /media/SecondDisk
```

# 3. Auto mount EBS when boot (Option)
```
# sudo blkid -s UUID
/dev/xvdb: UUID="d0ada05e-4b41-49e8-adf0-fd48c4ac93dd"

# sudo vim /etc/fstab
...
...
...
UUID=d0ada05e-4b41-49e8-adf0-fd48c4ac93dd       /media/SecondDisk      ext4    defaults        0       0
...
...
...
:wq!
```
【Excel VBA】ユーザー定義関数でオブジェクトの数をカウントする

# 記事の概要

自分の備忘録も兼ねて、気が向いたときに作成した関数を載せていきます:muscle:

# 環境

- Excel2016
- Windows10

# ユーザー定義関数

```vb
Public Function cntObjects(objName As String) As Long

 Dim obj As Object

       For Each obj In Sheet1.OLEObjects
          If obj.Name Like "*" & objName & "*" Then
             cntObjects = cntObjects + 1
          End If
       Next
       
End Function
```

###### 補足

何をしているのかというと...

Sheet1の全てのオブジェクトを参照
→もしも、そのオブジェクト名にobjNameを含む場合
→cntObjectsを+1する

＊今回は「Sheet1」を指定していますがここはご自身で変更してください。
＊objNameには”TextBox”だの”OptionButton”だのを入れてください。

# 使用例
###### 準備
開発タブ > 挿入 > ActiveXコントロール　でCheckBoxを6つ挿入しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241380/2281be9a-ffe0-84ed-bc96-82c995b5735e.png)



###### ①CheckBoxの数をメッセージボックスに表示

```vb
Public Sub ex1()

       MsgBox cntObjects("CheckBox")

End Sub
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241380/61e69878-8a21-fe95-8d05-23aafc710c3a.png)


###### ②チェックが入ったCheckBoxの数をメッセージボックスに表示

```vb
Public Sub ex2()

 Dim i As Long
 Dim cnt As Long
 Dim buf As String
 
    buf = "CheckBox"

       For i = 1 To cntObjects(buf)
          If Sheet1.OLEObjects(buf & i).Object.Value = True Then
             cnt = cnt + 1
          End If
       Next i
       
       MsgBox cnt

End Sub
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241380/285b2c2a-aac3-1978-6467-41ed5d1f1a6d.png)
paramikoでSSH通信するまで

インストールからParamikoでSSH通信するまでのメモ、
Python及びpipを使ったことなかったので、基本的にな部分からメモを残す。

## pipへの環境変数追加

Python/Scriptを環境変数に追加。

## Paramikoのインストール

プロキシ環境下での作業だったので、以下のcommandによりinstallを行う。

```
pip install --proxy=http://[username]:[Pass]@[proxy]:[port] paramiko
```

## 実装

Paramiko自体の使い方は以下のサイトを参考にさせていただいた。
https://qiita.com/ototo/items/cc1bc7b83f0722dfd5ca

以下のようにクラスを作成。

```python
# coding: utf-8

import paramiko
import time

class SSHConnector:
    __hostName = ''
    __userName = ''
    __password = ''
    __port = ''
    __ssh = None

    def __init__(self,hostName,userName,password,port):    
        self.__hostName = hostName
        self.__userName = userName
        self.__password = password
        self.__port = port
        self.__initSSH()
        
    def __del__(self):
        self.__ssh.close()
        
    def __initSSH(self):
        self.__ssh = paramiko.SSHClient()
        self.__ssh.load_system_host_keys()
        self.__ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        self.__ssh.connect(self.__hostName, username=self.__userName, password=self.__password, port=self.__port, timeout=15.0,look_for_keys=False)
        
        
    def sendMessage(self,command):
        ssh_shell = self.__ssh.invoke_shell()
        ssh_shell.send(command)
        time.sleep(3)
        resultMessage = ''
        if (ssh_shell.recv_ready()):
            resultMessage += ssh_shell.recv(9999)
            resultMessage += '\r\n'
        else:
            print 'error'
           
        return resultMessage 
```
## さいごに

ざっと書いては見たものの、Pythonの書き方も不慣れなため、Gitとか見てもう少し勉強すべき。
h2oでtry_files

# try_filesとは

+ 元はnginxのconfで使える関数のこと
+ 例えば`http://example.com/users`みたいなURLにアクセスしたときに実態は`users.php`や`users.html`を返したいときに使う
    + webアプリでやりがちな、RESTなURI表現をするときに使いたい
+ 参考: https://gist.github.com/kenjiskywalker/4596258

これをH2Oでどうやるのか

# 参考設定例

```yaml:h2o.conf
hosts:
  "*":
    reproxy: ON
    listen:
      port: 80
    paths:
      /:
        file.dir: /var/www/html/
        mruby.handler: |
          lambda do |env|
            unless env["PATH_INFO"].end_with?('.html')
              new_path = env["PATH_INFO"] + '.html'
              return [307, { 'x-reproxy-url' => new_path }, []]
            else
              return [399, {}, []]
            end
          end
```

## ポイント

+ `reproxy: ON`
    + これで内部リダイレクトが可能になる
+ `/faq`のようなパスに対して`.html`を付加している
    + `'x-reproxy-url'=> new_path` では `'x-reproxy-url' => "/faq.html"` となる


もしもっとスマートな方法がありましたらコメントいただけるとありがたいです
「ありがとう」の方言をJavaScriptで使おう！

ありがとうの方言をまとめてみました。
ボッコというロボットに喋らせたら、意外と上手く喋ってます(笑)

ランダムに一個取り出す記述になっていますので、ご自由にご利用ください。

```js
var arigato_hogen = [
      "ありがとうごす", //青森県
      "ありがとさん", // 秋田県	
      "ありがとうがんす", // 岩手県	
      "もっけ", // 山形県
      "ありがとうさん", // 山形県	愛知県	
      "ありがとうがす", // 宮城県
      "たいへん", // 福島県
      "してもらって", // 福島県	
      "ありがとうござんす", // 長野県
      "きのどく", // 岐阜県 富山県 石川県 福井県
      "うたてー", // 岐阜県
      "ごちそうさまです", // 新潟県	
      "ごちそうさま", // 富山県	
      "ようした", // 石川県
      "おおきに", // 愛知県 福井県 大阪府 兵庫県 佐賀県 宮崎県
      "ありがとうおます", // 兵庫県
      "だんだん", // 島根県 宮崎県 熊本県
      "ようこそ", // 鳥取県
      "ありがとうござんす", // 岡山県	
      "ありがとうあります", // 広島県	
      "たえがとうございます", // 山口県	
      "たまるか", // 高知県		
      "ありがとうござす", // 長崎県
      "かたじけない", // 宮崎県
      "ちょうじょう", // 熊本県	
      "ありがとうごわす", // 鹿児島県
      "にへーでーびる", // 沖縄県
      "たんでぃがーたんでぃ", // 宮古島	
];
var arigato = arigato_hogen[Math.floor(Math.random()*arigato_hogen.length)]
```

他にも、美人の方言もまとめてみました。ありがとうと合わせてご利用いただけます。

```js
bijyo_hogen = [
        "きりょーよし！北海道では、昆布も売ってるんだって！！！ん。そだねー", // 北海道
        "おなこよし！いつも、ありがとうごす", // 青森
        "おなごぶりいーひと！いつも、ありがとうがんす", // 岩手
        "きりょーいー！いつも、たいへん！してもらって！", // 福島
        "ふりがいーひと！", // 栃木 
        "ぎぴん！", // 埼玉
        "きりょーよし！いつも、きのどく、ようした", // 石川
        "おじょーもん！", // 山梨
        "べっぴんさい！いつも、きのどく、うたてー", // 岐阜
        "えーにょーば！いつも、だんだん、ようこそ", // 島根
        "じょーもんさん！", // 福岡
        "ちゅらかーぎー！いつも、にへーでーびる", // 沖縄
        "ちゅらかーぎー！いつも、たんでぃがーたんでぃ" // 宮古島
];
var bijyo = bijyo_hogen[Math.floor(Math.random()*bijyo_hogen.length)]
```

最後まで見てくれて、にヘーでーびる
valid selector

### hashを作ってidの代わりにしようとすると先頭が数字の場合エラーになる。
```html
<li id="1234567"></li> <!--bad-->
<li id="x1234567"></li>
```
```js
let fn={};
fn.rhash=()=>{return Math.random().toString(36).slice(-8)}
fn.rid=()=>{return 'x'+Math.random().toString(36).slice(-8)}
;
let a=document.querySelector('#'+'x1234567')
console.log(a)
let b=document.querySelector('#'+'1234567')
console.log(b)
//Uncaught DOMException: Failed to execute 'querySelector' on 'Document': '#1234567' is not a valid selector.
```
git 複数のコミットを1つに圧縮する

ファイル X,Y,Zを3回に分けて追加・コミットした。これらをひとつにまとめたい。

    $ touch X
    $ git add X
    $ git commit -m "X"
    $ touch Y
    $ git add Y
    $ git commit -m "Y"
    $ touch Z
    $ git add Z
    $ git commit -m "Z"

ログで確認

    $ git log HEAD~3..
    commit 9e0944f5b0d51d67127a4256751163ba0490d154
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 13:55:54 2018 +0900
    
        Z
    
    commit 5b461fe467c13b2c65e77b9346005ac6cc7f0fb3
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 13:55:47 2018 +0900
    
        Y
    
    commit d01a3a6788abcf018d9ba77e6afcb391e67c0d43
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 13:55:37 2018 +0900
    
        X


rebaseを d01a3a6の一個前のところで -iオプションで実行、エディタを開く。

    $ git rebase -i d01a3a6^

先頭3行を以下のように書き換え。 squashは「前のコミットに押し込める」の意。

    pick d01a3a6 X
    squash 5b461fe Y
    squash 9e0944f Z

エディタを終了するとコミットが始まる。自動でテキストが入っているのでとりあえずそのままにして終了。

ログで確認

    $ git log
    commit 3c6afc8c7fb4b03b2454515c81e29412d8e75d6a
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 13:55:37 2018 +0900
    
        X
    
        Y
    
        Z
    ...

13:55:37に行ったコミット Xに Y,Zの追加も含まれるようになった。
GCPのGAEとCloudSQLでwebサービスを作ってみた

# GAE, Google Cloud SQL, Google Cloud Storageでwebサービスを作ってみた。

## 作ったサイト
[匿名で不満や愚痴、普段言えない本音を匿名で投稿しちゃおう！boooing](https://boooing.jp)

##【概要】

- twitterログインが必要です。(殺害予告とか違法な内容をつぶやかれるのを抑止するため) 
- 匿名で不満や愚痴をつぶやけます(ログインするけど、名前は一切表示されません)
- twitterにも@boooing1のアカウントで代理投稿します。(ここも完全に匿名です。)
- twitterやサービス内に頂いたコメントは、サービス↔twitter完全連携します。
- 不満書きたいのにtwitterの文字数制限で伝えきれないのが嫌だったので、サービス内では1000文字まで入力できます。
- twitterは、某質問系BOXの用に画像を添付します。
- サービス内では、３枚まで画像をはれます。(それもtwitterに連携します)

## 【インフラ】

- Google App Engine
- Google Cloud Storage
- Google Cloud SQL

##【フロント】
djangoのテンプレートを使ってます。
SPAとか、特別なことは特にないので割愛します。

## 【サーバサイド】

- python3 
- django1.11

## 【苦戦したところ】その1 画像のキャプチャ
まず、webdriverを使って、画像をキャプチャしました。
[こんなかんじ](https://qiita.com/setsulla/items/918ea1872c1947bf108f)の記事を参考にしてやってみたんですが

[こんな感じ](https://twitter.com/boooing1/status/978319081307713538)で、スクロールバーが表示されてしまいました。

サイズ調整を試みるも、長文がくると[こんなふうに](https://twitter.com/boooing1/status/978661291228258311)画像が切れちゃいました。

某質問系BOXは、文字数が長くても切れません。

色々と調査したところ、HTML自体をcropできる記事を見つけたのでそちらを参考に修正。

ようやく[キレイに](https://twitter.com/boooing1/status/981826544585748480)画像かすることができました。(しかも文字が見やすくなった)

## 【苦戦したところ】その2 画像のキャプチャどこでやるの問題
GAEは、デプロイや、運用などがお手軽にできるので、作ってすぐに動かすことができます。
便利！

でも、chromedriverのインストールなど、通常のGCEやEC2のようにサーバに入っての環境構築ができないため、この部分だけGCE契約するのか・・・？っと悩んみました。

【解決策】
Dockerfileを使ってchromedriverを構築する。

GAEは、カスタムしたDockerfileを配置することが可能なので、Dockerfileで、chromedriver関連をインストールするようにしました。
元になるGAE用のイメージは[こちら](https://cloud.google.com/appengine/docs/flexible/custom-runtimes/build)

```:Dockerfile
...
FROM gcr.io/google-appengine/python

RUN apt install unzip
RUN wget https://chromedriver.storage.googleapis.com/2.31/chromedriver_linux64.zip
RUN unzip chromedriver_linux64.zip -d ~/bin/

...

```

## 【苦戦してるところ】全然人が来ない。

まず、GAのキャプチャを見てください。
<img width="1126" alt="スクリーンショット 2018-04-11 13.59.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/38197/74e8db45-471a-0606-1192-f818317ec04f.png">

3/27にリリースして、全然増えません。
しかも、4/4の夜から4/5にかけて、twitterに制裁を受けてました。
(検索やハッシュタグで、引っかからない状態)


## 【事件】twitterアカウント凍結
4/6に@boooing1アカウントが凍結。。。。

かと思いきや、１時間ほどで何故か解除・・・・

人為的ミスか？？？

凍結されてしまったので、クローズする気になってたのですが、なんとか生きながらえたので、記事に書いてみましたｗ


## 【現在】
まだまだ、改善点は多いと思うのですが、ほそぼそと運用中。
ここでの学びを次に活かすぞー!!
python-oscで0がFalseになってしまう時の対処方法

## 概要

[python-osc](https://github.com/attwad/python-osc)の`OscMessageBuilder`を使ったOSCクライアントからメッセージ引数で`0`を送受信すると、Type Tagが`i`ではなく`F`すなわちFalseになってしまい、相手のアプリが正しく動かないなどの不具合が発生することがあります。
`SimpleUDPClient`の`send_message()`でも同様の問題が起きているようなので、以下の例が参考になれば幸いです。

## 実例

以下に実例を掲載します。

まず、`0`が`False`になってしまう駄目な場合。

```python
from pythonosc import osc_message_builder
from pythonosc import udp_client

if __name__ == "__main__":
    client = udp_client.UDPClient("127.0.0.1", 5005)

    msg = osc_message_builder.OscMessageBuilder(address="/my_address")
    msg.add_arg(0)
    msg = msg.build()

    client.send(msg)
```

これを意図通りに`0`が`int`になるようにするには次のようにします。

```python
from pythonosc import osc_message_builder
from pythonosc import udp_client

if __name__ == "__main__":
    client = udp_client.UDPClient("127.0.0.1", 5005)

    msg = osc_message_builder.OscMessageBuilder(address="/my_address")
    msg.add_arg(0, osc_message_builder.OscMessageBuilder.ARG_TYPE_INT)
    msg = msg.build()

    client.send(msg)
```

## まとめ

このように`add_arg`の第二引数に`osc_message_builder.OscMessageBuilder.ARG_TYPE_INT`を加えることで、`0`を`int`として送ることが出来るようになります。
ちなみに、`osc_message_builder.OscMessageBuilder.ARG_TYPE_INT`の代わりに`osc_message_builder.OscMessageBuilder.ARG_TYPE_FLOAT`を指定すれば、`0`を`float`の値として送ることも出来ます。
勉強ネタ(perlのただのメモ)

# perl
## htmlから `<title>` タグのデータを取得する
* htmlファイル

```
...
<title>
aaa
</title>
...
```

* コード

```perl
print if (/<title>/.. /<\/title>/);
```

## ファイルから n行からm行までのデータを取得する

* コード

```perl
print if (n .. m); # n, mには数字が入る
```

以下と同じ ( `$.` は ファイルから読み込み時の現在の行数)

```perl
print if ($. == n .. $. == m); # n, mには数字が入る
```

## 雑多
### 特殊変数

```
$_       # デフォルトの入力とパターン検索のスペース
$.       # ファイルから読み込み時の現在の行数
$/       # 入力時のレコード区切り文字。通常は改行。
$,       # 出力時の項目区切り文字。print @xx; の時に有効
$"       # 出力時の項目区切り文字。print "@xx"; の時に有効
$\       # 出力時の行末文字。print "$xx"; の後ろに付加される
$#       # 出力時の数値形式。通常は"%.20g"。詳細はprintfを参照
$%       # 出力時の現在のページ番号
$=       # 出力時の現在のライン数
$-       # 出力時の残り行数
$~       # 出力時のフォーマット名(デフォルトはハンドル名と同じ)
$^       # 出力時のヘッダフォーマット名
$|       # 0以外が代入されると出力をバッファリングしなくなる。
$$       # プロセスID
$?       # 最後に実行されたコマンドのステータス
$&       # パターンマッチにマッチした部分文字列
$`       # パターンマッチにマッチした部分の前側の文字列
$'       # パターンマッチにマッチした部分の後側の文字列
$+       # パターンマッチの最後の()に対応する文字列
$*
$0       # perlスクリプトのコマンド名
$1       # パターンマッチの際の1番目の()に対応する文字列
$[       # 配列の最初の添え字。通常は0。
$]       # perlのバージョン情報
$;       # 高次元連想配列の添え字の区切り文字
$!       # エラー番号、もしくはエラー文字列
$@       # 直前のevalコマンドのエラーメッセージ
$<       # このプロセスの実ユーザーID
$>       # このプロセスの実効ユーザーID
$(       # このプロセスの実グループID
$)       # このプロセスの実効グループID
$
$^D      # デバッグフラグの値
$^F      # システムファイルディスクリプタの最大値
$^I      # -iオプションで指定した拡張子の名前
$^L
$^P      # デバッガが使用する内部フラグ
$^T      # スクリプトを実行した時刻
$^W      # 警告スイッチの現在値
$^X      # perl自身の起動時の名前
@_       # サブルーチンへの引数
@INC     # perlライブラリ検索ディレクトリ
%INC     # 読み込まれたライブラリファイルの配列
__LINE__ # スクリプト中の現在の行数
__FILE__ # スクリプトのファイル名
```

### 代入演算子

```perl
a += b; # a = a + b;
a -= b; # a = a - b;
a *= b; # a = a * b;
a /= b; # a = a / b;
a %= b; # a = a % b;
a **= b; # a = a ** b;
a &= b; # a = a & b;
a ^= b; # a = a ^ b;
a |= b; # a = a | b;
a <<= b; # a = a << b;
a >>= b; # a = a >> b;
a &&= b; # 左辺がTrueの場合に右辺の値を左辺に代入
a ||= b; # 左辺がFalseの場合に右辺の値を左辺に代入
a .= b; # a = a . b;
```

### 範囲演算子

```perl
@list = (0 .. 5); # @list = (0, 1, 2, 3, 4, 5);
for (0 .. 5)      # for ($_ = 0; $_ <= 5; $_++)
```

#### フリップフロップ演算子

```perl
if (n .. m); # n行目からm行目までの行全てがtrueになる
if ($. == n .. $. == m); # ↑と同じで行番号変数($.)を省略しない書き方
if (/$str1/ .. /$str2/) # $str1から$str2までの行全てがtrueになる
```

### 正規表現

```perl
if($var =~ /$regex/) # マッチ
if($var !~ /$regex/) # マッチしない
if($var =~ /($regex)/) # マッチする文字列をグループ化
```
#### 補足したグループの後方参照

```perl
$1, $2, $3, ... #(  )の部分にマッチした文字列
$+              #最後にマッチした(  )部分
$&              #マッチした文字列全体(非推奨)
$`              #マッチした文字列に先行する部分(非推奨)
$'              #マッチした文字列に後続する部分(非推奨)
```

以下を推奨

```perl
if($var =~ /($regex)/p) # p修飾子を付ける
# 以下の変数を利用
${^MATCH}      #マッチした文字列全体
${^PREMATCH}   #マッチした文字列に先行する部分
${^POSTMATCH}  #マッチした文字列に後続する部分
```
#### 後方参照させないグループ化

```perl
if($var =~ /(?:$regex)/) # この後に$1,$2,...で参照ができない
```

### クォート演算子
```perl
q(aa)        # 'aa'
qq(aa)       # "aa"
qw(a b c )   # ('a', 'b', 'c')
qx(commnad)  # `command`
qr(regrex)i  # compiled /regrex/i
m(regrex)    # /regrex/
s(a)(b)      # s/a/b/

# 区切り文字は()でなくても良い
q{aa}        # q(aa)
# 以下の括弧はネスト可能
# (), <>, [], {}
```
[Android]ImageViewのscaleTypeを秒で決める

ImageViewのサイズがwrap_contentじゃない前提。

- 絵、写真 → **FIT_CENTER**
- 9パッチ画像 → **FIT_XY**
- スプラッシュ → **CENTER_CROP**

以下補足。読むと秒では決まらない。
    
# よく使うもの

画像は正方形のImageViewに横長の画像をセットした場合のイメージ。

### FIT_CENTER

<img width="265" alt="FitCenter.png" src="https://qiita-image-store.s3.amazonaws.com/0/233769/af85c705-063a-ac1f-061b-f5833e7d0151.png">

- 縦横比保持
- 切り取られず、画像全体が表示される
- ImageViewにちょうど収まるよう拡大・縮小される
- ImageViewの全体は画像で埋まらず、隙間ができる

画像の縦横比を維持したまま、画像全体がImageViewに収まる最大サイズで、Viewの中心に画像を表示する。
Viewと画像の間に、縦か横どちらか隙間が空く。

縦横比保持で画像全体が表示されるので、絵や写真を表示するには一番無難なパターン。
画像全体がImageViewに収まるように表示するので、場合によっては結構小さくなる。

### CENTER_CROP

<img width="266" alt="CenterCrop.png" src="https://qiita-image-store.s3.amazonaws.com/0/233769/975c1e03-e792-db57-7876-f81d93ed022a.png">

- 縦横比保持
- 画像の縦横どちらが切り取られる
- ImageViewの全体を埋めるよう拡大・縮小される

画像の縦横比を維持したまま、縦横どちらかがImageViewに収まる最大サイズで、ImageViewの中心に画像を表示する。
画像はImageViewより大きなサイズになり、Viewに収まりきらない縦か横どちらかは、画像のViewにおさまらない部分がクロップ（切り取り）される。
起動スプラッシュなど、特定の範囲を隙間なく画像で埋めたい場合に使える。

### FIT_XY

<img width="266" alt="fitXY.png" src="https://qiita-image-store.s3.amazonaws.com/0/233769/0615b52d-79ef-c1b3-0cd8-9e4ae74332ef.png">

- 縦横比は保持されない
- 一部が切り取られず、画像全体が表示される
- ImageViewの全体を埋めるよう拡大・縮小される

ImageViewのサイズに合わせて画像を拡大・縮小して表示する。
9パッチを適用した背景画像などに使用する。
縦横比が崩れるため、写真や絵には使えない。

# あまり使わないもの

### CENTER

ImageViewの中央に、拡大縮小なしで画像を表示。
拡大縮小したくなければこれだが、拡大縮小するケースの方が多いのでそんなに使わない。

### CENTER_INSIDE

FIT_CENTERと似ているが、こちらは拡大されない。（縮小はされる）
拡大されないので、画像がImageViewより小さいと隙間が空く。
ほとんどの場合拡大されるFIT_CENTERの方が有用なので、あまり使わない。

### FIT_START、FIT_END

縦横比保持で、左上か右下に寄せる。
たまに使うかもしれない程度。

### MATRIX

Image Matrix を使って行列変換するときに指定。
画像を変形や回転させる場合に使えるが、理系でないとピンとこないかもしれない。

# 補足
scaleTypeについてはこちらが詳しい。
https://akira-watson.com/android/imageview_scaletype.html
エンジニアが知ってて損はないマーケティング - ユーザーシナリオ

# はじめに

[前回](https://qiita.com/neriai/items/e00a5cebc6a9dc80c40f)に引き続き、今回はユーザー視点でサービスを利用してもらうための分析手法を説明します。

現在、インターネットの海の中で様々なサービスが乱立しているとおもいますが、
私達が日常的に利用しているサービスの中で、無意識的に画面操作を行っているように思いがちかもしれませんが、
必ずと言っていいほど見ている画面やクリックしたボタンなどの操作はなにかしたの理由があって行っている場合が多いです。

そういったユーザー側の心理を元にインターネットサービスは日々改善されていってるのですが、今回はユーザーシナリオと呼ばれるフレームワークを元に解決していきます。

# ユーザーシナリオ

前回、[ロジック・ツリー](https://qiita.com/neriai/items/e00a5cebc6a9dc80c40f#%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%83%84%E3%83%AA%E3%83%BC%E3%81%A8%E3%81%AF)の説明で用いたショッピングサイトを例とします。

## 購入までの手順

ショッピングサイトで商品を購入するとき、以下のような手順で購入することが想像できます。

1. ショッピングサイトに訪れる
2. 商品を探す
3. 商品を吟味する
4. 商品を購入する

## 購入までのユーザー心理

次にこのような手順を踏む際のユーザー心理を考えてみましょう。
今回は、ノートパソコンを購入したいユーザーを例とします。

1. パソコンがほしい。Google検索で「ノートパソコン　買う」で検索してみよう。ショッピングサイトがでてきた。見てみよう。
2. ノートパソコンは「軽くて」「バッテリーが長持ち」するものがほしいな。予算は「15万円以内」がいいな。
3. 3台検索結果にヒットした。どれが一番いいのか比べてみよう。
4. このMacのパソコンにしよう。購入画面は...

このようにユーザーの心理が働くのではないでしょうか。

## サイトとユーザー心理の紐付け

ショッピングサイトの手順とユーザー心理の番号を見比べてみてください。
ユーザー心理に対して、ショピングサイトの各番号の画面はなんとなく一致しているように見えはしないでしょうか。

これは、ユーザーが求める価値や欲求に対して、ショッピングサイトがその心理に適合させるような設計になっているからです。

実は、これらを図や表に落とし込んだものがユーザーシナリオとなります。

## ユーザーシナリオの作成

![ユーザーシナリオ.png](https://qiita-image-store.s3.amazonaws.com/0/90598/f2daeecd-419e-7102-07e8-88de90688011.png)

上記で記載したユーザー心理を、それを分析した際に見えてくる価値や欲求、また、実際のユーザー操作となる各画面の遷移を紐付けます。

これらを行うことで、ユーザーに対して説得力のあるサービスを作っていく足がかりとなるのではないでしょうか。

ちなみに、上記の図に書かれている「要件」とは、エンジニアが一般的に開発する上で行う要件定義に繋がってくる材料となってきます。

## 次に見えてくるもの

上記で添付したユーザーシナリオの画像の下部のほうにキャリアやユーザーイベントといった項目があるとおもいます。
上記でユーザー心理がなんとなく分かったと思いますが、実はユーザー心理は１種類しかないわけではなく実際には多くの要因によって複数存在する場合が多いです。
その要因といったものが、

例えば、キャリアです。普段パソコンとスマートフォンの両方を持っている場合、利用しているサービスや時間帯、用途などが異なっているかとおもいます。それがユーザー心理にも影響してきます。

パソコンの場合は、会社や家でしか使わないので、昼休みや夕食後などに利用することが多く、スマートフォンは通勤通学中などの隙間時間に利用することが多いのでこれらが心理に違いを生み出す可能性があります。

また、性別や年齢、国籍や地域などによっても異なる場合も起因するがあります。

以上のことから、次に考えるべきことはサービスを利用してもらいたいユーザー
いわゆる「ターゲット」を設定することを始めるのがよいでしょう。

# さいごに

次回は、少し趣向を変えて各種ツールを触ってみて、
KPIを設定するための現状のサービスを分析したり、どういった指標をKPIに設定すればロジック・ツリーとして成り立つのかを紹介できればと思います。
『精神的に消耗しやすい人がしている11の悪い習慣』を自己チェックしてみた

# はじめに

『[精神的に消耗しやすい人がしている11の悪い習慣](https://www.lifehacker.jp/2018/04/bad-habits-mental-energy.html)』
タイトルにつられて読んでみたら、面白かったので自己チェックしてみた。

## ※チェック記号について
○：あてはまる
△：一部あてはまる
×：あてはまらない

## 1. 計画性がない
#### チェック：△
最近、ようやくToDoリストアプリ（Microsoft To-DO）を使いだして、日々の予定をざっくりとたてるようになったが、「Microsoft To-DO」では優先順位の設定ができないし、全体のスケジュール管理は別途必要。
#### 対策
ToDoについては別のアプリを探す？仕事についてはToDoだけじゃ不十分か。

## 2. 過密スケジュール
#### チェック：△
基本的には多少余裕を持たせるようにしているが、そもそも予定がざっくりしているので、気づくと全然予定がこなせない時がある。
#### 対策
「1. 計画性がない」を改善することで、こちらも改善されるかな。

## 3. 散らかっている
#### チェック：○
職場は一応、毎週掃除の時間があるからまだましだけど、自宅はやばいことになってる（笑）
#### 対策
自宅の掃除も曜日を決めて実施する。（でも自信ない。。。）

## 4. 先延ばしにする
#### チェック：○
面倒くさいことはついつい後回しになってしまう。。。
#### 対策
2分以内でできることなら、書き留めずに、その場ですぐにやるっていうのがいいらしい。

## 5. メモを取らない
#### チェック：△
手書きやアプリでメモをとるようにはしてるけど、それが整理できてないから、どこに何を書いたか忘れる（笑）
#### 対策
タスクはToDoリストに、覚え書はQiitaにまとめる。

## 6. 完璧主義
#### チェック：△
たまに「そこまで時間かけて突き詰める必要なかった」と思う時がある。
#### 対策
満足感が得られているかどうかを判断基準にするといいらしい。

## 7. マルチタスク
#### チェック：△
どうしても急な予定が割り込んで、マルチタスクになることがある。
でも結局、一つを片付けてからやった方が効率よかったってことが多い。
#### 対策
「[ポモドーロ・テクニック](https://www.lifehacker.jp/2014/07/140714pomodoro.html)」ってのがあるらしい。

## 8. 食生活が貧しい
#### チェック：△
最近、体調を壊したので、多少気を付けてはいるけれど。。。
#### 対策
玄米や全粒粉、フルーツや野菜、良質なタンパク質などの低GI食品をとる。
カフェインは取りすぎないこと。
（まぁ出来る範囲で。。。）

## 9. 水を飲んでいない
#### チェック：△
最近ちょっと気にしながら飲んでる。でもまだ足らんかな。
#### 対策
常に水を手元に置いて、こまめに飲むようにする。
アプリでチェックもできるらしい。
・「[My Water Balance](https://itunes.apple.com/us/app/my-water-balance-daily-drink-tracker-reminder/id964748094?ign-mpt=uo%3D8)」（iOS）
・「[Water Drink Reminder](https://play.google.com/store/apps/details?id=com.northpark.drinkwater)」（Android）

## 10. 睡眠不足
#### チェック：△
だいたい５～６時間程度。ちょっと少ないか。
#### 対策
個人差はあるみたいだけど、やっぱり８時間は必要らしい。

## 11. 好きなことを後回しにする
#### チェック：×
むしろ逆（笑）現実逃避しないよう気をつけよう！
#### 対策
好きなことをやる時間を決めて、やるときはやる！

# あとがき
Qiitaに乗せるような内容じゃないと書いてから気づいたけど、せっかくなのでアップしておく。
特定フォルダ内の動画/音声ファイルの時間の長さの取得

メモ代わりに

```
$ ls | xargs -i@ ffprobe @ -hide_banner -show_entries format=duration -pretty -loglevel quiet| grep duration
duration=0:00:48.912000
duration=0:00:48.300000
duration=0:00:44.082000
duration=0:00:46.837000
duration=0:00:44.660000
　・
　・
　・
```
git rebaseでコミットを並べ替える

コミットの順番をあとから並べ替える実験。「ファイルA,B,Cを追加したが、A,C,Bの順でコミットしてしまった。 A,B,Cの順にしてコミットとファイルの整合性をとりたい」というシナリオ。

    mkdir X
    cd X
    git init
    touch A
    git add A
    git commit -m "A"
    touch C
    git add C
    git commit -m "C"
    touch B
    git add B
    git commit -m "B"

logを確認する。

    $ git log -l HEAD~2
    commit 8fde7ad6837d3fd69eff0284cdf57d95ae58ba16
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 13:38:56 2018 +0900
    
        B
    
    commit 73b9b66d4adf3e56ea2a45a5b4be0086cfd4be88
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 13:38:48 2018 +0900
    
        C
    
    commit a89a9a0d4ba0c70d500a6da48eb872d04284a40b
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 13:38:39 2018 +0900
    
        A

この履歴を A,B,Cの順に並べ替えたい。そのために git rebaseを用いる。

    git rebase -i HEAD~2

    pick 73b9b66 C
    pick 8fde7ad B
    
    # Rebase a89a9a0..8fde7ad onto a89a9a0
    #
    # Commands:
    #  p, pick = use commit
    #  r, reword = use commit, but edit the commit message
    #  e, edit = use commit, but stop for amending
    #  s, squash = use commit, but meld into previous commit
    #  f, fixup = like "squash", but discard this commit's log message
    #  x, exec = run command (the rest of the line) using shell
    #
    # These lines can be re-ordered; they are executed from top to bottom.
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    #
    # However, if you remove everything, the rebase will be aborted.
    #
    # Note that empty commits are commented out

この pickの行を書き換える。B,Cを入れ替えてエディタを終了する。

    pick 8fde7ad B
    pick 73b9b66 C

もう一度ログを確認

    $ git log -l HEAD~2
    commit 9c0c8762922977b0ea5996b27b3845433e9cdd3e
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 13:38:48 2018 +0900
    
        C
    
    commit 2f583be0b740fc5e02a8e54a3489bbe0fca9ad99
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 13:38:56 2018 +0900
    
        B
    
    commit a89a9a0d4ba0c70d500a6da48eb872d04284a40b
    Author: Nunocky <nunocky@example.com>
    Date:   Wed Apr 11 13:38:39 2018 +0900
    
        A

good
Let's Encrypt を使ったMosquittoサーバでエラー

<a link="https://letsencrypt.org/">Let's Encrypt</a> でSSL/TLS証明書の自動更新をしているMosquittoサーバで注意。

Cerbotクライアントで

> certbot certonly --standalone --standalone-supported-challenges http-01 -d　'ドメイン名'

のような自動更新設定をしたような場合。

<a link="https://certbot.eff.org/">certbot</a>クライアントは独自の簡易サーバにて自動取得を試みるため、他に競合するサーバ（Apatch, nginxなどポート80、443を使うようなサービス）が起動している場合は自動取得ができないため、該当するサービスは停止状態にしておく必要がある。

例えばサーバ起動時にnginxが自動起動するような設定がある場合、

>systemctl disable nginx.service

で自動起動設定を無効化する。
[memo] Install phantomjs into Ubuntu 

```
sudo apt-get update 
sudo apt-get install build-essential chrpath libssl-dev libxft-dev -y 
sudo apt-get install libfreetype6 libfreetype6-dev -y
sudo apt-get install libfontconfig1 libfontconfig1-dev -y 
cd ~ 
export PHANTOM_JS="phantomjs-2.1.1-linux-x86_64" 
wget https://github.com/Medium/phantomjs/releases/download/v2.1.1/$PHANTOM_JS.tar.bz2
sudo tar xvjf $PHANTOM_JS.tar.bz2 
sudo mv $PHANTOM_JS /usr/local/share 
sudo ln -sf /usr/local/share/$PHANTOM_JS/bin/phantomjs /usr/local/bin 
phantomjs --version
```
Linuxコマンド一覧

```
sudo apt update        #Devian系の場合
```

システムのインストール、あるいは再起動などの操作は一般ユーザーには許可されてはいない為に、sudoコマンドを利用して管理者権限（root権限ともいう）に切り替える必要がある。


```
sudo -s　　　　　　　　　　　　　　　　#一時的にrootユーザーに切り替える
```

一時的にrootユーザーに切り替える

```
date
```

```
cal        /         cal -7   /    cal -7  2018
```

```
date   --help
```

```
man cal
```

```
pwd
```

```
cd  変更先ディレクトリ
```

```
cat　　　　　ファイル名
```

```
cd ~
```

```
cd -
```

```
ls           
```
＃「ls」でカレントディレクトリにあるファイルを、「ls ディレクトリ」でディレクトリにあるファイルの一覧を表示します

```
etc /ディレクトリ
```

```
ls -l
```

```
less
```

```
cp　　　コピー元ファイル　　　　　　コピー先ファイル
```

```
cp コピー元ファイル　　　　　　コピー先ディレクトリ
```

```
mv 　移動元ファイル　　　　　　　移動先ディレクトリ
```

```
mv　　　変更元ファイル　　　　　　変更後ファイル
```

```
rm　　　　　削除ファイル
```

```
mkdir　　　　　　作成するディレクトリ
```

```
mkdir top
mkdir top/sub
```

```
mkdir -p top/sub
```

```
cp -r コピー元のディレクトリ　　　　　　コピー先のディレクトリ
```

```
mv  top  sub
```

```
rm -r ディレクトリ
```

```
du .           du -h .
```

```
la -l　　　ファイル名
```

```
chmod  アクセル権 　　ファイル名/ディレクトリ名
```

```
sudo  chwon  [-R]  所有者　　　　　ファイル/ディレクトリ
```

```
sudo chgrp  [-R]  所有グループ   ファイル/ディレクトリ
```

```
ps　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　#現在のシェルの確認
```

```
cat etc/shells　　　　　　　　　　　　　　　#利用可能なシェル一覧
```

```
ls   /ファイル名、ディレクトリ名 　＋ tabキー（〜２回）　　　　　　　　　　　　　　　　＊
```

```
ls              #カレントディレクトリのファイル一覧
```


メタキャラクタ

```
ls *.jpg　　　　　　　　　　　　　　　　　#ファイル名の末尾が.jpgのファイル

ls ?.jpg        #ファイル名が英数字一文字

ls [abc]*       #ファイル名がaかbかcで始まるファイル

ls [^abc]*　　　　　　　　　　　　#ファイル名がaかbかcで始まらないファイル
```

```
echo $HOME   #ユーザーのホームディレクトリのパス

echo $LANG   #ユーザーの言語・地域情報
LANG=値で、変更できる

echo $PATH   #コマンドを検索するディレクトリ(コマンドサーチパス）

echo $PS1    #プロンプトの書式
　　=> \h:\W \u\$

echo $HISTSIZE       #保存するコマンド履歴数

echo $HISTFILESIZE　　　　　　#ファイルに保存するコマンド履歴数
```

```
type cal        #コマンドの場所
```

```
GCM＋CordovaでAndroid Oreoにプッシュ通知する際の注意

## あれ通知されない？
Android Oreo＋targetSdkVersion=26でビルドしたアプリに対してプッシュ通知した際、Android Oreoからの新機能である「通知チャンネル」に対応しないと通知が表示されません。
https://qiita.com/mm36/items/0d356e814ef3da54c9da

## Cordovaの場合
Cordovaでプッシュ通知をする場合、[phonegap-plugin-push](https://github.com/phonegap/phonegap-plugin-push)を使うケースが多いと思います。

このプラグインも最新版(v2.2.2 2018/04/11現在)では通知チャンネルに対応していて、ちゃんと通知が届きます。
しかし、v2.xはFCM対応しているので、GCMのままが良いんだっ・・という場合には使えません。
（何でいまだにGCM使ってんの？というツッコミはなしで・・）

## 応急処置
そこで、phonegap-plugin-push（のv1.xブランチ）をforkして、通知チャンネルに対応しました。
https://github.com/pscsrv/phonegap-plugin-push/commit/e8898610f3ad42404a85946548a5828563f9bd83

以下のURLをインポートすればインストールできます。
https://github.com/pscsrv/phonegap-plugin-push.git#v1.x_oreo

init関数でデフォルトの通知チャンネルを作成して、通知を受信した際は登録したデフォルトのチャンネルで通知を表示する、といった流れです。応急処置なので、最低限の実装です。
※v2.xなら[通知チャンネルの作成や削除](https://github.com/pscsrv/phonegap-plugin-push/blob/master/docs/API.md#pushnotificationcreatechannelsuccesshandler-failurehandler-channel)もできます。

## GCMは2019/04/11に削除される
2019/04/11にGCMのサーバーとクライアントAPIが削除されることがアナウンスされました。
https://developers.google.com/cloud-messaging/android/android-migrate-fcm

とりあえず延命措置してみましたが、さっさとFCMに移行しましょう！
PHPでpluck

# PHPでのpluck関数は[array_column](http://php.net/manual/ja/function.array-column.php)です。

フレームワーク等にpluckがあったりするので無いものと思いがちだったり、個人的に忘れやすいのでメモ。

ドキュメントを確認するとオブジェクトにも対応していて（PHP7）、結果配列のキーも設定できる。

```php
$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    )
);
 
$first_names = array_column($records, 'first_name');
print_r($first_names);
```

```php
Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)
```
UiPathでの自動化ロボット作成時によく使った、 VB.Net まとめ

UiPath で自動化ロボットを作成しているうちに、
調べたVB.Netのコードやらをまとめていこうと思います。
都度追加していきます。
分かりづらいと思います。
ごめんなさい；
また、ミス等がございましたら、
指摘をいただけると幸いです。

（ご指摘してくださった方、
どうもありがとうございました！）
　
○○は変数名と思ってください。
基本的にString型ですが、
その他の型の場合は
○○の後に[]で囲んで表記します。
　

---------------------------------
---------------------------------

#日付関連
##その日の日付を取得
*DateTime.Now.Date.ToString("yyyy/MM/dd")*
例）DateTime.Now.Date.ToString("yyyy.MM.dd.ddd")
　　⇒"2018.04.11.Wed"
##時間を取得
System.DateTime.Now.ToString(“hh.mm.ss”)

##その日の曜日を取得、また日本語表記にする
*DateTime.Now.Date.ToString("ddd",New Globalization.CultureInfo("ja-JP"))*
例）DateTime.Now.Date.ToString("dddd",New Globalization.CultureInfo("ja-JP"))
　　⇒"金曜日"
##和暦表示
*C [CultureInfo型] = New CultureInfo("ja-JP")*
*jP [JapaneseCalendar型] = New System.Globalization.JapaneseCalendar*
*C.DateTimeFormat.Calendar = jP*
*DateTime.Now.Date.ToString("ggyy"c)*
例）⇒平成○○

##月の末尾
*year [Integer]*
*month [Integer]*
*DateTime.DaysInMonth(year,month).ToString*

年と月を指定する。

##翌月以降の取得
*dayM[DateTime型] = DateTime.Parse(Now.Date.ToString("yyyy,MM"))*
*○○ = dayM.AddMonths(▲).Tostring("yyyy/MM")*

▲には数字が入る。
翌月の月が知りたい場合は1を、
再来月の場合は2を入力する。

#文字列編集関連
##部分一致
*○○.Contains("▲▲")*
True or False で返ってくる。

##前方一致
*○○.StartsWith("▲▲")*
True or False で返ってくる。

##後方一致
*○○.EndWith("▲▲")*
True or False で返ってくる。

##空白を削除する
文字列の先頭から、末尾までにある空白を削除
*○○.Trim*

##改行を消す
*○○ = ○○.Replace(Chr(13), "").Replace(Chr(10),"")*


##文字の変更
*○○.replace("▽","▲")*
例）text = "あいうえお"
　　text.replace("い","～")
　　⇒"あ～うえお"

##文字の一部取得
*○○.Substring(▲,△)*
括弧内に入るのは数字。
文字列の▲番目から△文字取得するという意味になる。
因みに一文字目は0番目である。

例）text = "あいうえお"
　　text.Substring(2,3)
　　⇒"うえお"

##文字の番号を指定し、それ以降の文字を取得
*○○.Substring(▲)*
例）test = "あいうえお"
　　test = test.Substring(2)
　　⇒ "うえお"

##文字を配列型にする
*○○ = " 文字列 , 文字列 , 文字列 "*
*▲▲[String[]型] = ○○.Split(","c)*
文字列を区切るものを""内に書く。

例）text[String] = " リンゴ 、ゴリラ 、 ラッパ "
　　TEXT[String[]] = text.Split("、"c)
　　⇒TEXT(0) = "リンゴ"
　　　TEXT.Count.ToString = "3"

##文字列の中に、指定した文字が含まれているか。また何番目にあるのか。
*○○.IndexOf("▲▲")*
何文字目に指定の文字が存在するのかを確認できる。
指定の文字がない場合は0以下を示す。
例）test = "あいうえお"
　　test.IndexOf("う").ToString
　　⇒"2"

#型関連
##Int型に変換
*New Integer.Parse(○○)*

##Char型配列に変換
*○○.ToCharArray*
Splitの条件指定時に使用
例）test= "あ
　　　　　い
　　　　　う
　　　　　え"
　改行で区切りたい
　（test.Split(vbCrLf c)ではNG。この形ではtest.Split(","c)といった一文字での指定のみ可能）
　
　Conditions=vbCrLf
　test.Split（Conditions.ToCharArray）

## 文字か数字かの判別
IsNumeric("123").ToString
⇒ True
IsNumeric("あいうえお").ToString
⇒ false

#UiPath関連
##改行
*Environment.NewLine*
*vbCrLf*
Message box 等で使用
ElasticsearchでAND条件検索

ElasticsearchでAND条件検索。
boolとmustを使います。

# 凡例
```
GET index_name/type_name/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "FIELD名": {
              "value": "値"
            }
          }
        },
        {
          "term": {
            "FIELD名": {
              "value": "値"
            }
          }
        }
      ]
    }
  }
}
```

Elasticsearchを使い始めて日が浅いので、
SQLでいうところのコレってどうやるんだっけという問題にぶつかる。。。
React Nativeのreact-native-scrollable-tab-viewの最初のタブの下線が出ないとき


## node_modules/react-native-scrollable-tab-view/ScrollableTabBar.jsを修正

```javascript:node_modules/react-native-scrollable-tab-view/ScrollableTabBar.js
// this.props.scrollValue._value これを下のに変更
this.props.scrollValue.__getValue()
```

すると治る。
UTF-8文字列のバイト列を調べる

UTF-8形式の文字列のバイト列を調べたい場合に使うコマンドのメモ。

# 16進数で出力

16進数で出力したい場合にはodコマンドで16進ダンプします。

```shell
$ echo -n 'あいうえお' | od -tx1 -An
```
# 10進数で出力

オプションを-tu1にすれば10進数になります。

```shell
$ echo -n 'あいうえお' | od -tu1 -An
```

# 2進数で出力

2進数で出力したい場合にはxxdコマンドで2進ダンプします。

```shell
$ echo -n 'あいうえお' | xxd -g -1 -b
```
サイボウズの未読一覧をどんどん消化するスクリプト

# サイボウズの未読一覧をどんどん消化するスクリプト

![0.fpvlmj42e4t.png](https://qiita-image-store.s3.amazonaws.com/0/182837/6988cf55-b940-15c8-fda4-cd5d94da330f.png)
こんな感じで未読が溜まるとすべてチェックを入れてクリックを繰り返さないといけないです。
とても面倒です。
別に既読にしなくてもいいんですけど・・・トップにこの表示がずっとあるのは嫌ですよね。

F12キーを押して以下のスクリプトをコンソールにコピペすれば解決します。

```JS
//ループ管理用関数
function Loop(maxCount, i) {
  if (i <= maxCount) {
    mark_as_read();
    setTimeout(function(){Loop(maxCount, ++i)}, 1000);//1秒ごとに自関数を実行
  }
};

//ループ内処理
function mark_as_read(){
	$('[name=Check]').click();//すべてチェックをクリック
	$('[name=Read]').click();//既読にするをクリック
};

//main
Loop(48, 0);
```

いちいち既読とかつけない人はぜひお試しください。
Python > a[0] > for multidimensional a, a[0] is interpreted by taking all elements in the unspecified dimensions.

@ Scipy lecture notes, Edition 2017.1
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
p54
https://www.scipy-lectures.org/intro/numpy/array_object.html#indexing-and-slicing

> for multidimensional a, a[0] is interpreted by taking all elements in the unspecified dimensions.

意訳「多次元aの場合、a[0]は不定次元の全要素と解釈される」

https://ideone.com/6hDszk

```py
import numpy as np

ary = np.eye(3)
print(ary)
print(ary[0])

```

```txt:run
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]
[ 1.  0.  0.]
```

`a[0]`を使うと間違いにつながる、という認識を持った。
Python > f.dtype > S7 > リスト内のstringsの長さの最大が7

@ Scipy lecture notes, Edition 2017.1
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
p52
https://www.scipy-lectures.org/intro/numpy/array_object.html#basic-data-types


`dtype('S7')`という結果となる例がある。

定義したリスト内のstringsの長さの最大が7であるということらしい。

https://ideone.com/Yh56UD

```py
import numpy as np

f = np.array(['Bonjour', 'Hello', 'Hallo', ])
print(f.dtype)

for elem in f:
	print(len(elem))
```

```txt:run
|S7
7
5
5
```

fの定義の最後の","は不要に思う。
https://github.com/scipy-lectures/scipy-lecture-notes/issues/371
(こういう報告はした方がいいかどうかは悩むところ）
Azureで学ぶ　実践Kubernetes

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Azureで学ぶ　実践Kubernetes」で使われた資料のご案内です。</p>

- <strong>Azureで学ぶ　実践Kubernetes</strong><br />
https://speakerdeck.com/shin5ok/azuredexue-bu-shi-jian-kubernetes

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
MySQL で接続エラー

mysqld が途中で中断された多数の接続要求を特定のホストから受け取ったとき、

>Error: Host '' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

接続が成功せずに「max_connect_errors」の回数要求が失敗するとこのエラーが表示される。
まず、＜接続失敗の原因を解明、解決をした後＞に

>flush hosts;

でエラーをクリア。

>set global max_connect_errors=エラー数;

で許容接続エラーのMaxを変更する（※エラー数は例えば「10000」等）

>show global variables like '%connect%';

で確認。
np.random: random numbers (Mersenne Twister PRNG): > PRNG:Pseudorandom number generator | DRBG:deterministic random bit generator

@ Scipy lecture notes, Edition 2017.1
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
p50

> np.random: random numbers (Mersenne Twister PRNG):

PRNGとは何か?

Pseudorandom number generator
https://en.wikipedia.org/wiki/Pseudorandom_number_generator
> 
A pseudorandom number generator (PRNG), also known as a deterministic random bit generator (DRBG)

別名としてDRBGともいうらしい。

deterministic (決定論的)なので、stocastic(確率論的）と対照的なのだろう。
https://en.wikipedia.org/wiki/Stochastic_process