OmniAICreator/Qiita-1.07M huggingface dataset:
pict の出力が見辛いので tsv -> json してみた

テスト仕様考える時にこんな`pict`書くじゃん？<img width="757" alt="スクリーンショット 2018-01-30 15.32.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/b2543d2c-77a4-287d-bf4f-42b5a267ed98.png">
出力がでこぼこして見辛いじゃん？
<img width="757" alt="スクリーンショット 2018-01-30 15.32.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/a67ecace-fa76-c895-f048-c6b7227a9e29.png">
こんなの書くじゃん？

```python:tsv_to_json
#!/usr/bin/python

import sys
lines = sys.stdin.readlines()

trim = lambda x: x.strip()

keys = trim(lines[0]).split('\t')
values = map(trim, lines[1:] )

key_value = lambda line: ['"%(key)s": "%(value)s"' % locals() for key, value in zip(keys, line.split('\t'))]
to_json_row = lambda line: '{%s}' % ','.join(key_value(line))

print '[%s]' % ','.join(map(to_json_row, values))
```
`json`にしてみるじゃん？
<img width="757" alt="スクリーンショット 2018-01-30 15.33.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/9285ef99-1a2d-02c6-7bfb-f4f2271666d8.png">
`jq`してみると見やすい気がするし、色が付いてなんかうれしいじゃん？
<img width="757" alt="スクリーンショット 2018-01-30 15.32.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/d9473e09-4ba0-fe14-a393-ae923bdca591.png">
実際はもっと巨大な`pict`なので、`tsv`形式だともっとでこぼこして辛いんじゃん
けどそれに伴って`json`も縦長になるので、このツールが役に立つかは謎じゃん？

お昼休憩に遊んだだけで、楽しんだからこいつは十分に役目を果たしたじゃん？

そんだけじゃん
PyCharmで「matplotlibrc」を使おうとしたらエラーが出た

「機械学習」の勉強がてら、PyCharmに「[matplotlibrc](https://matplotlib.org/users/customizing.html)」を入れて色々と遊ぼうと思っていたところ以下のエラーに遭遇。

# エラー内容
```
Traceback (most recent call last):
File "/Users/[USER_NAME]/PycharmProjects/[PROJECT_NAME]/hebi.py", line 1, in <module>
    import matplotlib.pyplot as plt
:
RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.

Process finished with exit code 1
```

日本語でおk。

多分Pythonのパスかバージョンの差が招いたものっぽい？

# 対処方法
matplotlibrcの設定ファイル `matplotlibrc` を直接修正する。

ファイルのパスは以下。適宜変更してください。

```
/Users/[USER_NAME]/PycharmProjects/[PROJECT_NAME]/venv/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc
```

```text:matplotlibrc
# If you omit this parameter, it will always default to "Agg", which is a
# non-interactive backend.
# backend      : macosx
backend: TkAgg # 【追加】
```

「backend」 を `macosx` から `TkAgg` に変更すればOK。

対処方法はいくつか存在しており、その中で一番手軽な方法で対処しました。

# 参考記事
[【Mac】matplotlibをimportした際に「Python is not installed as a framework.」のエラー - from umentu import stupid](https://www.blog.umentu.work/%E3%80%90mac%E3%80%91matplotlib%E3%82%92import%E3%81%97%E3%81%9F%E9%9A%9B%E3%81%AB%E3%80%8Cpython-not-installed-framework-%E3%80%8D%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC/)
matplotlib で線分をアニメーションさせる


pyplot の描画をアニメーションをさせるには matplotlib.animation の ArtistAnimation が便利ですね。
ただ、線分を使ったアニメを作ろうとしたら少々戸惑いましたのでご参考まで。

通常、アニメはこんな要領かと思います。

```python
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

x = np.arange(0, np.pi * 2, np.pi / 10.0)
y = np.sin(x)

fig = plt.figure()
imgs = []

for i in range(len(x)):
    img = plt.plot(x[:i+1], y[:i+1], 'b-o')
    imgs.append(img)

anim = animation.ArtistAnimation(fig, imgs, interval=100)
anim.save('result1.gif', 'imagemagick')
plt.show()

```
![result1.gif](https://qiita-image-store.s3.amazonaws.com/0/116423/94bc8467-dfea-e8e4-5158-0badbd615a9f.gif "result1.gif")

また、線分を書くのはこのように、線分を個別に配列にして plot すると簡単です。

```python
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

step = np.pi / 10.0
xs = np.arange(0, np.pi * 2, step)

for x in xs:
    y = np.sin(x)
    plt.plot([x, x + step], [y, y], 'b-o')

plt.savefig('result2.png')
plt.show()
```
![result2.png](https://qiita-image-store.s3.amazonaws.com/0/116423/cef5334b-c18f-161c-39ee-bf253c275d90.png "result2.png")

さてこれをアニメーションさせたいのですが、この plot のたびに append したのでは変なアニメになってしまいます。

![result3.gif](https://qiita-image-store.s3.amazonaws.com/0/116423/4b464a19-a167-036f-1650-9e790d5ad512.gif "result3.gif")

まあこれはあたりまえの話でありまして、希望としては複数の plot をまとめて１フレームとして追加したいわけです。
しかし、下記では失敗します。

```python
for i in range(len(xs)):
    lines = []
    for x in xs[0:i+1]:
        y = np.sin(x)
        img = plt.plot([x, x + step], [y, y], 'b-o')
        lines.append(img)
    imgs.append(lines)
```
```
  :
AttributeError: 'list' object has no attribute 'set_visible'
```

まあそうだよなあ、乱暴だったよなあ。（ああ、python に時間取られるのいやだなあ…）

しかし答えはアハ的なもので、append ではなく extend にすれば通ります。

```python
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

step = np.pi / 10.0
xs = np.arange(0, np.pi * 2, step)

fig = plt.figure()
imgs = []

for i in range(len(xs)):
    lines = []
    for x in xs[0:i+1]:
        y = np.sin(x)
        img = plt.plot([x, x + step], [y, y], 'b-o')
        lines.extend(img)
    imgs.append(lines)

anim = animation.ArtistAnimation(fig, imgs, interval=100)
anim.save('result4.gif', 'imagemagick')
plt.show()
```

![result4.gif](https://qiita-image-store.s3.amazonaws.com/0/116423/065699c1-218d-ef0e-9500-75dd5f56b1b5.gif "result4.gif")

要するに plot の戻りってリストなんですね（[Line2D]）。

以上です。おそまつさまでした。

#### この記事の環境
- Python 3.5.1 :: Anaconda 2.5.0 (x86_64)
バッファ切替時に*Message*などを無視する

Emacsで複数のファイルを開いて`C-x <right>`で切り替えて作業する際、`*Message*`や`*tramp/ssh hostname*`のようなバッファが邪魔なので、バッファ名の最初と最後が`*`のバッファを、バッファ切り替え時に表示しないようにする。

```elisp:init.el
(defun switch-buffer-skipping-special-buffer (next)
  (let ((start-buf (buffer-name))
        (func (if next 'next-buffer 'previous-buffer)))
    (funcall func)
    (while (and (string-match "\\`\\*.+\\*\\'" (buffer-name))
                (not (string= start-buf (buffer-name))))
      (funcall func))))

(defun next-buffer-skipping-special-buffer ()
  (interactive)
  (switch-buffer-skipping-special-buffer t))
(defun previous-buffer-skipping-special-buffer ()
  (interactive)
  (switch-buffer-skipping-special-buffer nil))
```

あとは`next-buffer-skipping-special-buffer`や`previous-buffer-skipping-special-buffer`を適当なキーにバインドすればOKです。
あくまで切り替え時に該当バッファを飛ばしているだけなので、`switch-to-buffer`などを使えば普通に表示させることも可能です。
[react:day1] Reactをはじめます＆デバッグ環境も


## 環境
os: mac
editor: vs code

## 動機
react nativeを使いたい。ならまずはreactから手を出すか！

## reactアプリのgeneratorをinstall

```bash
# generatorをinstall(facebook製だよ)
npm install -g create-react-app

# installが終わったらreactアプリをgenerete. my-appという名前のアプリ
create-react-app my-app
```

##my-appディレクトリが作成されているので移動 & server起動

```bash
cd my-app

# server start
npm start
```

####tips
npm startはpackage.jsonの scripts startを呼び出している

```package.json
{
  "name": "my-app",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.2.0",
    "react-dom": "^16.2.0",
    "react-scripts": "1.1.0"
  },
  "scripts": {
    "start": "react-scripts start", # ⇦これを呼び出している
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}
```

サーバーが立ち上がればこの画面が表示される
![スクリーンショット 2018-01-30 15.13.05.png](https://qiita-image-store.s3.amazonaws.com/0/24013/f3b3ea49-994b-7dbe-25e5-0649ebdfc81d.png "スクリーンショット 2018-01-30 15.13.05.png")

## Hello, world

index.jsを以下のように書き換える

```index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';

var element = React.createElement('h1', { className: 'greeting'}, 'Hello, world')
ReactDOM.render(element, document.getElementById('root'));
registerServiceWorker();

```

saveすると画面が変わる
![スクリーンショット 2018-01-30 15.17.21.png](https://qiita-image-store.s3.amazonaws.com/0/24013/5c55ae3c-2eed-2170-29e4-522aadddf582.png "スクリーンショット 2018-01-30 15.17.21.png")

##vs codeでデバッグできるように設定ファイルを作成する
![launch_json_create.gif](https://qiita-image-store.s3.amazonaws.com/0/24013/4ffada9b-47cc-4a58-8455-3a3a1d6fb6c2.gif "launch_json_create.gif")


こんな感じでデバッグできるようになる
![debug_start.gif](https://qiita-image-store.s3.amazonaws.com/0/24013/b46452a5-d375-df15-aade-dddd8fa5f6ca.gif "debug_start.gif")
aliyuncli の設定をしてみた

[前回](https://qiita.com/ngratin/items/02f52f5ae8f9af49d647) は aliyuncli のインストールまでを行いましたので、今回は API key を発行して aliyuncli に設定するまでをご紹介します。


## AccessKey の発行
AccessKey はコンソールから発行しますので、まずコンソールへログインします。トップページに AccessKey というリンクがあるので、そこへ移動します。

<img width="769" alt="スクリーンショット 2018-01-30 15.25.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/b194847f-9ef2-b671-d26b-4a00a2ff583f.png">

AccessKey の作成ボタンをクリック

<img width="829" alt="スクリーンショット 2018-01-30 15.26.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/d4ebb0ea-3198-c428-b63c-45fa9ca262f4.png">

すぐに Key が発行されます。　詳細ボタンを開くと「AccessKeyId」「AccessKeySecret」が表示されますので、大切に覚えておきます。もしくは 「AK 情報を保存」ボタンを押すと csv でDownloadできます。

<img width="585" alt="スクリーンショット 2018-01-30 15.26.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/358f7a72-3670-0b0c-7d08-5d7c703bc1a9.png">

## aliyuncli に AccessKey を設定
`aliyuncli configure` コマンドで設定をします。　AccessKey, AccessKeySecret は先程取得したものを入力します。
Region は東京を利用する場合は、「ap-northeast-1」を入力。output format は table/json/text の 3 種類から好みのフォーマットを選んで入力します。

ちなみにリージョンのリストは [こちら](https://jp.alibabacloud.com/help/doc-detail/40654.htm) より確認できます。

```bash
$ aliyuncli configure
Aliyun Access Key ID [None]: xxxxxxx
Aliyun Access Key Secret [None]: xxxxxxx
Default Region Id [None]: ap-northeast-1
Default output format [None]: text
```

無事に成功すると `~/aliyuncli` 以下に 4 つのファイルが出来ていました。

```bash
$ ls -1 ~/.aliyuncli
configure
credentials
oascredentials
osscredentials
```

続きは [aliyuncli を使ってみた](https://qiita.com/ngratin/items/0fc2ad1a14c959614bdb) です。
Azure VMのステータス(状態)

|ステータス(VMPowerState)|状態|Azureポータルでの表記|備考|
|:--|:--|:--|:--|
|VM starting|起動中|開始中||
|VM running|起動済み|実行中||
|VM stopping|停止中（リソース保持）|実行中|OSのみ停止中|
|VM stopped|停止済み（リソース保持）|停止済み|OSのみ停止済み|
|VM deallocating|停止中（割り当て解除）|実行中or割り当て解除中|
|VM deallocated|停止済み（割り当て解除）|停止済み (割り当て解除)|

*VM stopped(停止済み)は引き続きコンピューティングの料金が発生
*VMPowerStateは以下のPowerShellで取得可能

```bash
$VMState = Get-AzureRmVM -Name 'VMName' -ResourceGroupName 'RGName' -Status
```

# 参考サイト
[AzureVMの電源状態一覧とそれをPowerShellスクリプトで取得する方法](https://qiita.com/07JP27/items/634a7aed7df001e0f3eb)
[仮想マシンV2の状態について](http://statemachine.hatenablog.com/entry/2015/12/10/154110)
FileNameCopy がアインインストールできない！

#FileNameCopyとは？
FileNameCopy というソフト
※[こちら](http://www.vector.co.jp/soft/winnt/util/se369645.html)からDL可

右クリックに[名前をコピー]、[ファイルパスをコピー] を追加してくれる地味に便利なソフトです。

ファイル名とフルパスを Shift+右クリック→パスをコピー とは違ってダブルクォートなしでコピーしてくれます。

#他のソフトに移行しようとアンインストールをコンパネからポチッ
＿人人人人人人人人人人人人人人＿
＞　アンインストールできない　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣

#なぜ？
※ここからは推測


- XP対応の古いソフトだから
- 64bitは考慮されてない
- exe形式のインストーラーではなく、inf形式のインストーラー

#対策
諦めてレジストリをいじります。

インストールするときの setup.inf を覗きます。

1.レジストリエディタを開く。（わからない人は Win+R で regedit って打ってね）

2.HKEY_CLASSES_ROOT\AllFilesystemObjects\shell まで展開します。

![ss20180130_152933.jpg](https://qiita-image-store.s3.amazonaws.com/0/136398/037b23a4-1f9c-3fa2-71a5-065d4a96df78.jpeg)
↑こんな感じ
3.NameCopy と PathCopy を削除します。
![ss20180130_153116.jpg](https://qiita-image-store.s3.amazonaws.com/0/136398/ae554c5e-fa5c-3a19-854c-2c20cdd97992.jpeg)
↑きれいさっぱり

4.おわり。右クリックメニューから[名前をコピー]、[ファイルパスをコピー]が消えてると思われます。

#さいごに
フリーソフトの対応バージョンはよく見ようね！
Project Euler Q72 【分数の数え上げ】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$n$と$d$を正の整数として, 分数 $\frac{n}{d}$ を考えよう. $n<d$ かつ $HCF(n,d)=1$ のとき, 真既約分数と呼ぶ.

$d ≤ 8$について真既約分数を大きさ順に並べると, 以下を得る:
$\frac{1}{8}, \frac{1}{7}, \frac{1}{6}, \frac{1}{5}, \frac{1}{4}, \frac{2}{7}, \frac{1}{3}, \frac{3}{8}, \frac{2}{5}, \frac{3}{7}, \frac{1}{2}, \frac{4}{7}, \frac{3}{5}, \frac{5}{8}, \frac{2}{3}, \frac{5}{7}, \frac{3}{4}, \frac{4}{5}, \frac{5}{6}, \frac{6}{7}, \frac{7}{8}$

この集合は$21$個の要素をもつことが分かる.

$d ≤ 1,000,000$について, 真既約分数の集合は何個の要素を持つか?

## アプローチ
要するに、
$φ(2)+...+φ(1,000,000)$を求めればよい。

## 解答

```bash
time seq 2 1000000 |
factor |
awk '{delete a;printf $1*1" ";for(i=2;i<=NF;i++){a[$i]=1};for(k in a){printf k" "};print ""}' |
awk '{a=$1;for(i=2;i<=NF;i++){a*=(1-1/$i)};print $1,a}' |
awk '{a+=$2} END{print a}'
303963552391

real    0m3.526s
user    0m6.590s
sys     0m0.075s
```

このような数列をファレイ数列というらしい。
[ファレイ数列 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%83%AC%E3%82%A4%E6%95%B0%E5%88%97)

自力で気づけたからよかったが、ファレイ数列の長さを求めるときにトーティエント関数が登場するようだ。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/072.html
clang-tidyで命名規則のチェック（&自動修正）

`clang-tidy`、C/C++のプログラミングでは、とても便利な静的解析ツールです。
`-fix`や`-fix-errors`オプションをつけて実行すれば、ある程度自動修正してくれる賢さも嬉しいです。

命名規則のチェックや、自動修正に対応していることに気づいたので紹介します。
種類ごとにキャピタライズ(CamelCase,lower_case)や、プレフィクス/サフィックスルールを決められます。

いちおう[ドキュメント](https://clang.llvm.org/extra/clang-tidy/checks/readability-identifier-naming.html)もありますが、指定できるオプションは記載されていませんでした。[テスト](http://llvm.org/svn/llvm-project/clang-tools-extra/trunk/test/clang-tidy/readability-identifier-naming.cpp)を直接見るのが確実です。

`clang-tidy`は、`.clang-tidy`ファイルに設定を書いておくと、デフォルトでそれを使ってくれます。
個別の設定をいちいち引数で指定するのは面倒なので、設定ファイルにまとめて書いておくのがおすすめです。

```yaml:.clang-tidy
Checks: 'readability-identifier-naming'
HeaderFilterRegex: '.*'
CheckOptions:
  - key:             readability-identifier-naming.ClassCase
    value:           CamelCase
  - key:             readability-identifier-naming.EnumCase
    value:           CamelCase
  - key:             readability-identifier-naming.FunctionCase
    value:           camelBack
  - key:             readability-identifier-naming.MemberCase
    value:           lower_case
  - key:             readability-identifier-naming.MemberSuffix
    value:           _
  - key:             readability-identifier-naming.ParameterCase
    value:           lower_case
  - key:             readability-identifier-naming.UnionCase
    value:           CamelCase
  - key:             readability-identifier-naming.VariableCase
    value:           lower_case
```

## 参考メモ
[ソースコード](http://llvm.org/svn/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/IdentifierNamingCheck.cpp)より。

### 対象の種類
複数に当てはまる場合、上のが優先されます。*は複数ヶ所に反映されるもの。なかなか混沌としています。

1. `Typedef`
1. `TypeAlias`
1. 名前空間
  1. `InlineNamespace`
  1. `Namespace`
1. `Enum`*
1. Enum定数
  1. `EnumConstant`
  1. `Constant`*
1. クラス系
  1. `AbstractClass`
  1. `Struct`
  1. `Class`
  1. `Union`
  1. `Enum`*
1. メンバ
  1. `ConstantMember`
  1. `Constant`*
  1. `PrivateMember`
  1. `ProtectedMember`
  1. `PublicMember`
  1. `Member`
1. 引数
  1. `ConstexprVariable`*
  1. `ConstantParameter`
  1. `Constant`*
  1. `ParameterPack`
  1. `Parameter`
1. 変数
  1. const系
     1. `ConstexprVariable`*
     1. `ClassConstant`
     1. `GlobalConstant`
     1. `StaticConstant`
     1. `LocalConstant`
     1. `Constant`*
  1. `ClassMember`
  1. `GlobalVariable`
  1. `StaticVariable`
  1. `LocalVariable`
  1. `Variable`
1. メソッド
  1. `ConstexprMethod`
  1. `ConstexprFunction`*
  1. `ClassMethod`
  1. `VirtualMethod`
  1. `PrivateMethod`
  1. `ProtectedMethod`
  1. `PublicMethod`
  1. `Method`
  1. `Function`*
1. 関数
  1. `ConstexprFunction`*
  1. `GlobalFunction`
  1. `Function`*
1. テンプレート引数(型)
  1. `TypeTemplateParameter`
  1. `TemplateParameter`*
1. テンプレート引数(型以外)
  1. `ValueTemplateParameter`
  1. `TemplateParameter`*
1. テンプレート引数(テンプレート)
  1. `TemplateTemplateParameter`
  1. `TemplateParameter`*
1. 非対応ぽい
  1. `MacroDefinition`
  1. `PureFunction`
  1. `PureMethod`
  1. `TemplateUsing`
  1. `Using`

### キャピタライズの種類

- aNy_CasE
- lower_case
- UPPER_CASE
- camelBack
- CamelCase
- Camel_Snake_Case（アップデートで追加？[^1]）
- camel_Snake_Back（アップデートで追加？[^1]）

[^1]: https://reviews.llvm.org/D21472
aliyuncli をインストールしてみた

Alibaba Cloud を統合管理するためのツールである aliyuncli をインストールしてみました。　

## aliyuncli のインストール
[GitHub リポジトリ](https://github.com/aliyun/aliyun-cli) の README にある通りにインストールすれば大丈夫です。
今回は macOS へインストールするので `pip` でインストールすれば完了です。

```bash
$ sudo pip install aliyuncli 
```

バージョン 2.1.9 がインストールされました。

```bash
$ aliyuncli --version
2.1.9
```

## aliyun sdk のインストール

各サービスを利用するためには、 `Aliyun Python SDK` をインストールする必要があります。この SDK はサービス毎に独立しており、個別にインストールする必要があります。必要な分だけインストールできるので良いですね。

Aliyun Python SDK を 1 つもインストールしていない状態でコマンドを実行すると、このように警告が出ます。

```bash
RuntimeError: aliyun sdk not properly installed, you will need install at least one sdk.
ECS sdk install cmd for example:  pip install aliyun-python-sdk-ecs
```


とりあえず、 ECS(Elastic Compute Service) 用の SDK をインストールしておきます。

```bash
$ pip install aliyun-python-sdk-ecs
```

SDK のリストは [ここ](https://github.com/aliyun/aliyun-cli#sdk-list) にあります。

| Product | SDK |
|:--|:--|
| BatchCompute | aliyun-python-sdk-batchcompute |
| Bsn | aliyun-python-sdk-bsn |
| Bss | aliyun-python-sdk-bss |
| Cms | aliyun-python-sdk-cms |
| Crm | aliyun-python-sdk-crm |
| Drds | aliyun-python-sdk-drds |
| Ecs | aliyun-python-sdk-ecs |
| Ess | aliyun-python-sdk-ess |
| Mts | aliyun-python-sdk-mts |
| Ocs | aliyun-python-sdk-ocs |
| Oms | aliyun-python-sdk-oms |
| OssAdmin | aliyun-python-sdk-ossadmin |
| Ram | aliyun-python-sdk-ram |
| Ocs | aliyun-python-sdk-ocs |
| Rds | aliyun-python-sdk-rds |
| Risk | aliyun-python-sdk-risk |
| R-kvstore | aliyun-python-r-kvstore |
| Slb | aliyun-python-sdk-slb |
| Ubsms | aliyun-python-sdk-ubsms |
| Yundun | aliyun-python-sdk-yundun |


続きは [aliyuncli の設定をしてみた](https://qiita.com/ngratin/items/03fdba7137be94e1935c) です。
XPathでいかにしてMay'nちゃんを探すのか

最近、Webページのオートパイロットやオートパイロットでのテストで何かとお世話になっているSelenium + Junitの環境で ' (シングルクオート)を含んだ文字列を探そうとしたら思いっきり嵌ったのでメモ

Seleniumなどでエレメントを特定する際に ' (シングルクオート)が含まれている文字列を検索したい場合には ' (シングルクオート)をエスケープしなければなりませんが、残念なことにXpath 1.0の仕様では ' (シングルクオート)をエスケープする方法が用意されていませんでした。
XPath 2.0からは、例えば ' (シングルクオート)で囲われた文字列中の ' (シングルクオート)をエスケープするには ' (シングルクオート)を2個続けて書いて '' の様にエスケープするらしいのですが、Firefoxの最新版やChromeでも未だXPath 2.0は使えないらしいです。

で、結局どうしたか？というと以下の様になりました。

例えば、以下の様な文字列が含まれたエレメントをXPathで探す場合には、

```html:
<a aria-label="アプリ May'n ちゃん &quot;Love&quot; <1>" href="#MarketListingPlace:p=tmp.03831173739257532153.1317485953465" data-column="TITLE"><img src="gwt/placeholder_icon_24.png" role="presentation"><div> <div>May'n ちゃん "Love" &lt;1&gt;</div> <div></div> </div> </a>
```

以下の様にします (Firefox quantamのconsoleで検索する場合)

```
$x("//a[@aria-label=concat('アプリ May', \"'\", 'n ちゃん \"Love\" <1>')]")
```

Selenium + Junitなら以下の様な感じで

Selenium + JunitのBy.xpathで検索

```java:
  searchString = "アプリ May'n ちゃん \"Love\" <1>";
  xPathStringLiteral = toXPathStringLiteral(searchString);
  searchXpath = "//a[@aria-label=" + xPathStringLiteral + "]";
  wait.until(ExpectedConditions.elementToBeClickable(By.xpath(searchXpath))
```

toXPathStringLiteral

```java:
  private String toXPathStringLiteral(String string) {
    if ( string.indexOf("'") == -1 ) {
        return "'" + string + "'";
    }
    if ( string.indexOf('"') == -1 ) {
        return '"' + string + '"';
    }
    return ("concat('" + string.replace("'", "', \"'\", '") + "')");
  }
```

…と恐ろしく面倒でした
jsのhash(Object)をmergeする

jsのhash(Object)をmergeする方法をたまに忘れちゃうのでメモ。

## Object.assignを使う

```
test = {x: 1, y: 2, a: 3, b: 4}
console.log(Object.assign(test, {c: 5}))

> {x: 1, y: 2, a: 3, b: 4, c: 5}
```

## 3dots(Spread Operator)を使う

```
test = {x: 1, y: 2, a: 3, b: 4}
console.log({...test, c: 5})

> {x: 1, y: 2, a: 3, b: 4, c: 5}
```

## Lodash/Underscoreを使う

```
test = {x: 1, y: 2, a: 3, b: 4}
console.log(_.merge(test, {c: 5}))

> {x: 1, y: 2, a: 3, b: 4, c: 5}
```
DockerfileからDockerイメージを作成する


# Dockerfileとは
「Dockerfile」ファイルとは、Dockerコンテナの構成内容をまとめて記述するテキスト形式のファイルです。

1行につき、1つの操作を「命令」と「引数」でスペース区切りに記述する。
「＃」で始まる行はコメント行として処理されます。

```bash
# コメント
命令 引数
```

主な命令と用途は以下のとおり。命令は引数と識別しやすいように、大文字にするのが推奨。

| 命令 | 用途 |
|---|---|
|FROM|元となるDockerイメージの指定|
|MAINTAINER|作成者の情報|
|RUN|コマンドの実行|
|ADD|ファイル／ディレクトリの追加|
|CMD|コンテナーの実行コマンド |
|ENTRYPOINT|コンテナーの実行コマンド |
|WORKDIR|作業ディレクトリの指定|
|ENV|環境変数の指定|
|USER|実行ユーザーの指定|
|EXPOSE|外部に公開するポートを指定|
|VOLUME|ボリュームのマウント|

# 「docker build」 でビルドする
作成したDockerfileからdockerイメージをビルドします。

```bash
docker build [ -t ｛イメージ名｝ [ :｛タグ名｝ ] ] ｛Dockerfileのあるディレクトリ｝
```
LinuxでIPアドレスを追加する


Linuxでネットワーク関連の設定をした際のメモです。

## IPアドレスを表示する

```bash
 ip addr show
```

## IPアドレスを追加する
 永続化されず、一時的に追加することが出来ます。
OS再起動すると勝手に消えちゃいます。
 
 ```bash
 ip addr add 192.168.2.10/24 dev eth0
```

## IPアドレスを削除する

```bash
 ip addr del 192.168.2.10/24 dev eth0
```
Project Euler Q71 【順序分数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$n$と$d$を正の整数として, 分数 $\frac{n}{d}$ を考えよう. $n<d$ かつ $HCF(n,d)=1$ のとき, 真既約分数と呼ぶ.

$d ≤ 8$について既約分数を大きさ順に並べると, 以下を得る:
$\frac{1}{8}, \frac{1}{7}, \frac{1}{6}, \frac{1}{5}, \frac{1}{4}, \frac{2}{7}, \frac{1}{3}, \frac{3}{8}, \frac{2}{5}, \frac{3}{7}, \frac{1}{2}, \frac{4}{7}, \frac{3}{5}, \frac{5}{8}, \frac{2}{3}, \frac{5}{7}, \frac{3}{4}, \frac{4}{5}, \frac{5}{6}, \frac{6}{7}, \frac{7}{8}$

$\frac{3}{7}$のすぐ左の分数は$\frac{2}{5}$である.

$d ≤ 1,000,000$について真既約分数を大きさ順に並べたとき, $\frac{3}{7}$のすぐ左の分数の分子を求めよ.

## 解答

```bash
time seq 5 1000000 |
awk '{for(i=int($1*3/7);($1*2/7)<=i;i--){a=$1;b=i;r=a%b;while(r!=0){a=b;b=r;r=a%b};if(b==1){print $1,i;next}}}' |
awk '{if(a[$2]!=1){printf("%d %d %1.10f\n",$1,$2,$2/$1);a[$2]=1}}' |
sort -k3,3n |
grep -B1 "^7 3 " |
awk '{print $2;exit}'
428570

real    0m5.700s
user    0m7.690s
sys     0m0.144s
```

最初は全件を対象にしていた為ものすごい時間がかかった。
最初の`awk`で`for`の範囲を限定したり、値を列挙しつつユークリッドの互除法をしたり、
分子が同じ数なら分母が小さい方がでかい数だよね、という考えを適用したりして
対象をどんどん少なくしていき、なんとか処理時間を短くすることに成功した。

このような数列をファレイ数列というらしい。
[ファレイ数列 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%83%AC%E3%82%A4%E6%95%B0%E5%88%97)

ファレイ数列の性質として、
$\frac{2}{5}$と$\frac{3}{7}$の間に$\frac{2+3}{5+7}=\frac{5}{12}$が存在する。
これを$d ≤ 1,000,000$の範囲で繰り返していけばよい。

この性質を利用すると、

```bash
time echo 2 5 |
awk '{a=$1;b=$2;while(b<=10^6){a+=3;b+=7};print a-3}'
428570

real    0m0.034s
user    0m0.034s
sys     0m0.001s
```

速攻で解けた。。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/071.html
Screenful使ってる？

# Screenful

Trelloの内容をうまいこと集計したいと思ってPower-upを探していたら、Screenfulというフィンランドはヘルシンキ発のサービスを見つけた。ほぼ日本語情報がないので、とりあえず書いておく。

これ。かなり格好いいチャートができて、カスタマイズも結構できる。
https://screenful.com/

- 少なくともBurndown for Trelloよりずっとよい。
- 現在3週間無料体験中。
- 大きなテレビに投影して、2分ごとにチャートを切り替えてくれるTV modeとか、いろいろある。
- あと、Trelloの各ボードをまとめて集計してくれる機能もあって、複数プロジェクトを横串で見ないといけないときにありがたい。
- 日本語も表示できる。（ただしSlackから出てきた週刊レポートの日本語が化けていたので、いま問い合わせ中）
- Trelloだけじゃなくて、JIRAとかGitHubにも対応している。
- 難点はちょっと高いことだが、ユーザー数あたりで増えない価格設定なので、まあこんなものかなあと。

もう少し使ってみて次回レポートを出す。
プロキシ環境下でWin8.1 で python用にpip叩くためのメモ 

最近、入門した初心者ですので、
もっと効率が良い方法などはあるかもしれませんが、
備忘録代わりに書いておきます。

##やりたいこと
やんごとなき事情により、Windows8.1で
python3.6.4を使った開発を行わなければならないが、
その環境はProxy配下のため、普通にpipコマンドを叩くだけではパッケージのインストールができないので、プロキシ設定をするっていうだけのシナリオ

(ここでは例として「pandas」)

#事前準備
以下は既に調査＆作業済で話しすすめてます。
・Pythonのインストール
・環境変数などへの諸々の設定
・プロキシ周りの設定は以下を適宜読み替えて使用ください
PROXY=https://proxy.XXX:8080
HTTPS_PROXY=https://proxy.XXX:8080


##1.ざっくり手順
コマンドプロンプトを起動
→pip用にプロキシ設定を行う。
→インストール おしまい

##詳細手順
###コマンドプロンプトを管理者権限で起動
Windows キー + X
→Aキー
→Alt + Y

###プロキシ設定
set HTTP_PROXY=https://proxy.XXX:8080
set HTTPS_PROXY=https://proxy.XXX:8080

###インストールコマンドを叩く
pip install pandas

以上おわり、お疲れ様でした
生産性を高めるIntelliJ IDEA初期設定とマイナーショートカット

# 初期設定

| 設定方法 | 効果 |
|--------------------------|----------------------------------------|
| Auto Import > Show import poupuにチェックを入れる | 自動でインポート文の候補をポップアップ表示 |
| コードを選択し、⌘+Bを押した時に表示されるポップアップ内の右矢印ボタンを押す(Show Write Access | 「宣言に移動(⌘+B)」時に選択した文を検索範囲から除外 |

# ショートカット
PyCharm 公式ショートカット一覧 (日本語版) Windows/Linux : https://natsujikan.com/jetbrains/keymap/pdf/shortcut_pycharm_windows.pdf

## ナビゲーション・参照

| key | function |
|--------------------------|----------------------------------------|
| option + Space | 変数の中身やメソッドの定義情報を表示 |
| Ctrl + Shift + Backspace | 最後に編集したロケーションにナビゲート |
| F2 / Shift + F2          | 次/前の強調表示されたエラー            |
| Command + ↑              | ナビゲーションバーへ移動               |
| opt + F12                | Terminal開閉(カーソルも移動)             |
| Ctrl + ↓                 | 次のメソッドに移動  (システム環境設定->キーボード->ショートカットから既存のmacショートカットを削除する必要あり)             |

## 一般

| key        | functino                                             |
|------------|------------------------------------------------------|
| Ctrl + Tab | タブおよびツール・ウィンドウの切り替え(Switcher表示) |

## 編集

| key        | functino                                             |
|------------|------------------------------------------------------|
| opt + ↑ | コードブロックを連続的に広げて選択 |
| Command + D | 現在の行または選択したブロックを複製 |
| Command + Shift + U | キャレットまたは洗濯したブロックでの単語の大/小文字を切り替え |
CoinCheck事件から学ぶ非機能要件の重要性

最近、社内から非機能要件に関する相談が複数あったことや、CoinCheckのNEM流出問題もあったことから、改めて非機能要件テーマにその必要性とどのように定義するべきかをテンプレートとセットでご紹介します。

# CoinCheck事件の被害の拡大は非機能要件が甘かった

先日発生したCoinCheckにおける**仮想通貨NEMの流出検知に8時間かかった**のは非機能要件の詰めが甘かったとしかいいようがありません。

非機能要求グレード活用シート(後述)のE7.1.5にもありますが重要度が高い資産に対する検知をしっかりと定義していれば、8時間もかかるということはなかったのではないでしょうか？

そして、そのリスクを考えると一定時間の取扱総額を定義して一定額以上は取り扱えないようにある種のサーキットブレーカーを取り入れることは事前に十分想定可能であり、それはマルチシグやコールドウォレットの対応よりも容易と考えます。こうした仕組みは銀行ATMでもとられており、十分にシステム構築時に想起可能な要件と思われます。

# 非機能要件はなぜ必要なのか

大きなシステムの新規構築時には必ず検討する非機能要件ですが、新規案件の小粒化や改修案件の増加によりきっちりと非機能を検討する機会が減少してきているように感じます。また、Cloud開発や機械学習などこれまでとは異なる新分野に対する非機能要件が正しく認識できていないなどもあると思います。

私は生保や航空会社の大きな新規システム開発を過去に担当していたことから非機能を自分で検討し、開発し、運用する経験を幸運にも得られました。ただ、そういった経験がない場合に非機能要件の導出を自力で行うことはとても難しいと思います。(当然ながら開発経験のないITコンサルができるわけがありません。)

**そして悪いことに正しく検討されなかった非機能要件はシステム開発の後半でおばけのように次々と出現してきます。**これはシステム開発におけるリスクを食いつぶし、そこで働くエンジニアの精神を蝕んていきます。なぜなら、ウォーターフォール開発における、後工程での要件追加は必然的にソースコードをスパゲッティにするからです。

CoinCheckの例を見るまでもなく、正しい非機能要件定義はお客様にとっても有用です。豪華すぎず、必要な範囲で非機能を定義することで、お客様も開発も保守も運用も幸せになれると思います。

# 非機能要件を正しく定義する第一歩

日本では非機能要件関連の活動として以下のような団体がそれぞれ取り組んでいます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/161223/6d8d1ad2-37a2-af7b-196f-4aaba15d1e48.png)
[画像引用元：IPAの「非機能要求グレード研修教材」より]

この表の中でシステム開発会社がまず確認するべきものはIPA/SECの非機能要求グレードになります(下記URL)。

**「えー、こんなの見る暇ないよー」**という声が聞こえてきそうです。**ただ、安心してください。ここにはそのまま使えるテンプレートが以下のサイトに含まれています。テンプレートみんな好きですよね。**

こちらよりダウンロードできるZipファイルにはPDFが5ファイルとテンプレートとなるExcelが含まれています。まず、こちらを全部ざっとでもいいので目を通してもらって、この資料の存在を意識していただければと思います。
**必ず何かの機会でネタ帳として使える機会がでてくると思います。**

#### 非機能要求の見える化と確認の手段を実現する「非機能要求グレード」の公開
https://www.ipa.go.jp/sec/softwareengineering/reports/20100416.html

# なぜ非機能要件が開発の後半で明らかになるか
原因のほとんどは人的要因だと考えます。
要件定義や設計を行っているエンジニア及び顧客が非機能要件を定義できていないのです。システムテストあたりから運用メンバーが引き継ぎも兼ねてテストにはいりますが、その時点で彼らから「なんであのログないの？」「計画停止した後の動きがおかしい」など指摘が挙がり始めるのです。

要件定義の段階から彼らを交えるなどするか、無理ならウォーターフォールでなくリーンなどのアジャイルを適用してこの問題を回避することが一つの策と考えます。

それも無理なら、要件定義や設計の本に非機能のことはあまり書いていないことは明確なので、以下のテストや見積もりの本から先回りして確認することが良いと思います。
以下の本は私は会社と家に置くほど読み込んでおり、とても良い本でおすすめです。ソフトウェア見積もりは不確実性のコーンの原典です。
[基本から学ぶソフトウェアテスト](http://amzn.to/2DZsHcA)
[ソフトウェア見積り　人月の暗黙知を解き明かす](http://amzn.to/2DZrl1q)
Python簡易コマンドラインツール用のlogging設定の備忘録

書き捨て以上、製品以下くらいの、自分用・社内用ツール的なスクリプトをPythonで作るとき、つい適当にしがちなログ処理を上品に実装するためのメモ。

```py3
#!/usr/bin/env python3

from logging import getLogger
logger = getLogger(__name__)
del getLogger

def _main():
    from argparse import ArgumentParser
    parser = ArgumentParser()
    # configure arguments here
    set_logging_arguments(parser)
    args = parser.parse_args()
    init_logging(args)
    log_environment_info(args)

    logger.debug('This is debug message.')
    logger.info('This is info message.')
    logger.warning('This is warning message.')
    logger.error('This is error message.')
    logger.critical('This is critical message.')


def set_logging_arguments(parser):
    q = parser.add_argument_group('logging arguments')
    q.add_argument('--verbose', '-v', action='count', default=0, help='increase log level')
    q.add_argument('--quiet', '-q', action='count', default=0, help='decrease log level')
    q.add_argument('--logfile', help='dump all logs to file')

def init_logging(args):
    from logging import getLogger, StreamHandler, FileHandler, Formatter, NOTSET, WARNING, CRITICAL
    rootlogger = getLogger()
    rootlogger.setLevel(NOTSET)

    handler = StreamHandler()
    # https://docs.python.org/3/library/logging.html?highlight=notset#logging-levels
    handler.setLevel(sorted([NOTSET, WARNING+(args.quiet-args.verbose)*10, CRITICAL])[1])
    rootlogger.addHandler(handler)

    if args.logfile:
        handler = FileHandler(args.logfile)
        handler.setLevel(NOTSET)
        # https://docs.python.org/3/library/logging.html?highlight=notset#logrecord-attributes
        handler.setFormatter(Formatter('%(asctime)s: %(name)s: %(levelname)s: %(message)s'))
        rootlogger.addHandler(handler)

def log_environment_info(args, *, logger=logger, envvars=True):
    import sys, os
    logger.debug(f'python executable: {sys.executable}')
    logger.debug(f'python version: {sys.version}')
    logger.debug(f'working directory: {os.getcwd()}')
    logger.debug(f'command line: {" ".join(map(repr,sys.argv))}')
    logger.debug(f'arguments:')
    for k in sorted(vars(args).keys()):
        logger.debug(f'    {k}: {getattr(args, k)!r}')
    if envvars:
        logger.debug(f'environment variables:')
        for k, v in sorted(os.environ.items()):
            logger.debug(f'    {k}: {v!r}')

if __name__ == '__main__':
    _main()
```

コマンドラインに、`-q`又は`-v`オプションを必要な個数付けることで、標準エラー出力に出すログの量を変えられるようにしている。
`--logfile`を指定すれば実行時の環境情報も含めて全てのログをファイルにダンプできる。環境変数までは要らない、という場合は`envvars=False`としてやる。

ログ設定をする3つの関数は、別ファイルに切り出して、

```py3
    from hogehoge import set_logging_arguments, init_logging, log_environment_info
    set_logging_arguments(parser)
    args = parser.parse_args()
    init_logging(args)
    log_environment_info(args, logger=logger)
```

のように読み込むようにしてやれば、目障りではなくなるし使いまわしも簡単になる。。
Hugo で、記事中の日付や分数をそのまま表示させたい

Hugo でブログを書いているとき、テキスト中に `1/2` とか `12/31` とかって文字列があると、こんな感じに展開される

```html
<sup>12</sup>⁄<sub>31</sub>
```

<img width="152" alt="スクリーンショット 2018-01-30 14.16.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/45034/f471f177-c9ea-d088-bc5e-0ef281631739.png">

日付や分数などを書いていて、意図しない表示になってしまうことがあった。そのままプレーンに表示させたく、この変換機能をオフにする設定を探したので、メモしておく


### config で設定

config.toml に以下を追加

```toml
[blackfriday]
smartypants = false
```

config.yaml なら

```yaml
blackfriday:
  smartypants: false
```

### link

Blackfriday は、Hugo が使っているマークダウン・レンダラとのことです

- Blackfriday  
https://github.com/russross/blackfriday

Hugo での設定に関する公式ドキュメントはこのへんに

- Configure Blackfriday  
https://gohugo.io/getting-started/configuration/#configure-blackfriday
python-gattlibのインストール方法

# 経緯
BLEモジュールを使いたいとの要望が飛んできたのでRaspiでの実装に挑戦中です。
bleライブラリのインストールに詰まったのでそのメモ書きです。

# 手順
[こちら](https://qiita.com/dz_/items/4e858e4d50db19b57491)を参考にさせてもらいました。

```
# ①pyBluez の依存パッケージをインストール
$ sudo apt-get install python-dev libbluetooth3-dev

# ②pyBluez のインストール
$ sudo pip install pybluez

# ③gattlib の依存パッケージをインストール
$ sudo apt-get install libglib2.0 libboost-python-dev libboost-thread-dev

# ④BLEを使う場合に必要な gattlib をインストール
$ sudo pip install gattlib
```

①②③までは順調だったのですが④のgattlibのインストールがうまくいかない…
エラーログを見るとBT_SNDMTUとBT_RCVMTUが宣言されていない様子

# 対策
調べてみると[こちら](https://bitbucket.org/OscarAcena/pygattlib/issues/14/build-error-bt_sndmtu-undeclated-first-use)に回答がありました。

google翻訳
-私はこれが環境問題でありpygattlibではないと思います。閉鎖
とのことで開発環境に問題があるとのこと。

とりあえず[こちら](https://qiita.com/mt08/items/278ef51e1d6c1259e098)を参考にRaspiを最新にアップデート

Raspiのカーネルを最新のStretchにしたところカーネルは4.9なので↓のリンクで現在のカーネルバージョンのヘッダファイルにて宣言されていることを確認。
[http://elixir.free-electrons.com/linux/v4.9/source/include/net/bluetooth/bluetooth.h#L122](http://elixir.free-electrons.com/linux/v4.9/source/include/net/bluetooth/bluetooth.h#L122)

再度、④のpipコマンドを実行してみましたがエラーが治りません。
アップデートではなくカーネルビルドが必要なのでしょうか、理由は私ではわからないので手動インストールに変更。

# 対策その２
[bitbucket](https://bitbucket.org/OscarAcena/pygattlib/downloads/)からソースをダウンロード→scpでraspiにzipを送信。

```
# 解凍
unzip OscarAcena-pygattlib-a858e8626a93.zip

# 一応setup.pyの前にmake
cd OscarAcena-pygattlib-a858e8626a93
make

# setup.pyでインストール
sudo python setup.py install
```

これで無事pygattlibインストールが完了しましたのでBLEモジュールのセンサ受信ソフトの作成に取り掛かることができます。

# 終わり?に
加速度センサのMACアドレスを知りたいのですがlescanしても数が多すぎてわかりません…
そもそもMACアドレスでconnectを行うのかどうかもわかりません…
進捗があればこちらに追記か別記事を書く予定です。
guiflowで書くUI Flowsによる画面遷移図の書き方と管理方法

# guiflowで書くUI Flowsによる画面遷移図の書き方と管理方法
* 動機と背景
* guiflowとは
* UI Flowsとは
* guiflowのインストール
* guiflowの使い方
* gitlabで管理

## 動機と背景
　今回久しぶりに新規プロジェクトの立ち上げに入り、様々な管理ツールや言語、フレームワーク等全て自由に選んで良いよと言われたので、フェーズ毎にいろいろ調べながら環境を整えている。
　画面遷移図を書くフェーズでメンテのしやすいツールを探したら、マークダウン式で書けるguiflowというツールがあったので使ってみた。

## guiflowとは
　マークダウン式の記述でUI FLowsを出力してくれるツール。
Win, Mac, Linux で使えるらしい。(Macでのみ動作確認済み)

## UI Flowsとは
* 画面名
* 画面パーツ
* 画面遷移するユーザーの行動  
　だけを一つのブロックに記述し、画面遷移するユーザーの行動から矢印を引っ張って画面遷移図を作っていく方法。  
細かくはこちらとgitflowの使い方の項に書かれた例を参考に。  
http://www.standardinc.jp/reflection/article/ui-flows/  
具体的なデザインは判らないが、デザイン依頼前に作成し、後からデザインと紐付けるのが有効な使い方だと思う。  

## guiflowのインストール
　UI Flowsを使う際にguiflowというツールを使うと、マークダウン式の記述で図を自動生成してくれる。
Macでしか確認していないが、Windowsやlinuxでも動くらしい。
Mac版はこちらからguiflow-darwin.zipをダウンロードする。 
https://github.com/hirokidaichi/guiflow/releases/tag/v_0.1.1  

## guiflowの使い方
　書き方はここに書いてあるが、他に使いやすいよう以下のルールを追加
https://qiita.com/nobb_hero/items/24a8ace5137efed26061  

* パーツ名の頭には「・」をつける(パーツは上から二番目の枠の中としか図では判らないので区別するため)
* 同じ遷移先の場合「==>」を一つにまとめる(2つ同じ遷移先がある場合、ユーザーの行動を2行並べてから「==>」でまとめて遷移先を書く)
* 同じパーツを使った別のアクションの場合(タップと長押しなど)は「パーツ名(ユーザーの行動)と記載する
* リロードやAjax的な画面遷移のないアクションは記載しない

```
例)  
[メイン画面]  
・メイン画面文言  
・Aボタン  
・Bボタン  
-  
Aボタン(タップ)  
Aボタン(長押し)  
==> サブ画面  
  
[サブ画面]  
・サブ画面文言  
・戻るボタン  
-  
戻るボタン  
==> メイン画面  
```

↑の場合、
メイン画面
* パーツはメイン画面文言、Aボタン、Bボタンの3つ
* Aボタンはタップと長押しでサブ画面に遷移(記載は無いが、内部処理が違うはず)
* Bボタンは記載が無いので遷移無し(リロードとかかな？と推測)

サブ画面
* パーツはサブ画面文言と戻るボタンの2つ
* 戻るボタンをタップするとメイン画面に戻る(記載が無い場合はデフォルトの行動をしたとする)

となり、guiflowで書くと、こうなる  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157437/21ff88a8-249a-8c14-64e6-b4b978dbc41c.png)

　例では判らないが、ページ数が増えてくると必然的にやじるしの数がすごく増える。
追加ルールはその見づらくしている主な原因となるやじるしを減らすためのルールとなる。

## gitlabで管理
　手動管理です。ごめんなさい。
作った画像をgitlabに載せるには、右上のダウンロードアイコンを押すとクリップボードにコピーされるので、gitlabのwikiに直接ペーストすると、gitlabがうまい具合にアップロードファイルに変換してはり付けられる。
　あとは、これを出力するテキストをgitの専用レポジトリにファイルとして用意しておけばOK。
　マークダウン式のテキストで図が出力できるのがとても簡単。
欲を言えばguiflowがwebサービスであればもっと良かったが、昔みたいにエクセルで書くのより遙かに楽なので満足している。
Cognosのロール「システム管理者」に「すべてのユーザー」グループを復元するSQL

※自分でも読んでもいまいちピンとこなかったのでタイトルを少し変更しました。 (2018.8.2)


こんな時に読んでみてください。

・システム管理者に特定のユーザーやグループを追加する前に「すべてのユーザー」グループを削除してしまった。
・各ロールから「すべてのユーザー」グループが削除済みの権限管理が正しくされた環境のContent Storeを、認証のセットアップがないとりあえずな環境にDBバックアップからリストアした時。

=================================================================
Cognos Administrationで権限設定を実施している際に、何かの拍子にシステム管理者グループに属するユーザーが誰もいない設定にしてしまった時に、システム管理者にすべてのユーザーを復旧する方法です。

下記SQLを実行することで、システム管理者グループのすべてのユーザーを追加することができます。

\<Cognosインストールディレクトリ>\configuration\schemas\content\db2\AddSysAdminMember.sql

SQL実行例
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/2d979770-b6c5-6c55-1abb-c83bb0375d06.jpeg)



※Content StoreのDBのタイプによって、content配下のパスは変更になります。
※SQL実行前にCognosのサービスを停止し、SQL実行後Cognosのサービスを起動してください。
※SQL実行前にContent Store DBへコネクトしておいてください。
※必要に応じてDBのバックアップを取得してください。


システム管理者が不在になってしまうとCognos Administrationを起動することができなくなり、運用に大きな影響を与えてしまいます。かといってContent Storeをバックアップから戻すわけにもいかないし、といった状況でも慌てず対応していただければと思います。
キャプチャはCognos BI 10.2.2のものですが、Cognos Analytics 11.0.7でも実績を確認しております。


～補足～
Content Store用DBのスキーマを変更している場合は、SQLにスキーマ名を追加することでSQLが実行可能になります。

```SQL:オリジナルSQL
insert into CMREFORD1 (PROPID, CMID, ORD, REFCMID) select	27, (select cmid from cmobjprops1 where upper(objid)='::SYSTEM ADMINISTRATORS'),coalesce((select max(ord) from CMREFORD1 where cmid=(select cmid from cmobjprops1 where upper(objid)='::SYSTEM ADMINISTRATORS')), -1)+1, CMID from CMOBJPROPS1 where upper(OBJID)='::EVERYONE';
```

```SQL:スキーマ名を追加したSQL
insert into DB2ADMIN.CMREFORD1 (PROPID, CMID, ORD, REFCMID) select	27, (select cmid from DB2ADMIN.cmobjprops1 where upper(objid)='::SYSTEM ADMINISTRATORS'),coalesce((select max(ord) from DB2ADMIN.CMREFORD1 where cmid=(select cmid from DB2ADMIN.cmobjprops1 where upper(objid)='::SYSTEM ADMINISTRATORS')), -1)+1, CMID from DB2ADMIN.CMOBJPROPS1 where upper(OBJID)='::EVERYONE';
```
PHPにおけるJSONエンコード整形

PHPでJSON形式にエンコードするには、

json_encode()
http://php.net/manual/ja/function.json-encode.php

が用いられる。
引数に指定した値をJSON形式の文字列として返す関数だ。
以下のように使うのだが、

```php
$a = [
    'name'    => '山田太郎',
    'age'     => 20,
    'address' => '東京都新宿区'
];

echo json_encode($a);

// {"name":"\u5c71\u7530\u592a\u90ce","age":20,"address":"\u6771\u4eac\u90fd\u65b0\u5bbf\u533a"}
```

文字列がUnicodeエスケープシーケンスに変換されてしまう。
これでも実際問題ないのでいいのだが、いかんせん普通の人間は読めない。
そこでオプション追加。

```php
echo json_encode($a, JSON_UNESCAPED_UNICODE);

// {“name":"山田太郎","age":20,"address":"東京都新宿区"}
```

これなら読める。
しかしデータが大きくなってくると1行JSONは読みづらい。
なので、さらにオプション追加。

```php
echo json_encode($a, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);

// {
//     "name": "山田太郎",
//     "age": 20,
//     "address": "東京都新宿区"
// }
```

いい感じ。構造がわかりやすくなった。
他にもオプションはたくさんある。

http://php.net/manual/ja/json.constants.php

開発時だけ出力を読みやすく整形するのが便利だと思います:thumbsup_tone1:
(おまけ)VueAdminを使ってみよう！

[VueAdmin](https://admin.vuebulma.com/#/dashboard
)なるものがあるのでこれをインストールしてみます。
素晴らしいサンプルがたくさんありますね！
コピペで使える事間違えなしです。

[NPM vue-admin](https://www.npmjs.com/package/vue-admin)

```
git clone https://github.com/vue-bulma/vue-admin.git
cd vue-admin
npm install
npm run dev
```
:terminalでファイルを開く

Vim の :terminal の中から外の Vim を操る方法
https://mattn.kaoriya.net/software/vim/20171219121032.htm

に記載されている内容ですが、いくつか躓いたのでメモ

# 普通に:terminalからvimを起動してファイルを開く

それをすると、別のvimがterminalの中で開いてしまって、`vim` in `vim` の状態になる。terminalの中で開くのではなく、親vimで開いてほしい。

# vim --remote を使う

`:terminal cmd /c vim --remote $HOME`

確かに開くけど、開いた後にterminalウィンドウは消えてほしい。

# ++close を使う

`:terminal`にはオプションとして`++close`がつけられる。これをつけるとジョブが終了したらウィンドウも閉じてくれる。

`:terminal ++close cmd /c vim --remote $HOME`

が、今回の場合はなぜか閉じてくれない。なぜだろう...

# vim --remote-send を使う

この記事の最初に貼り付けたURLに記載の通り `--remote-send` を使ってみる。

`:terminal cmd /c vim --remote-send ":e $HOME<CR>"`

なんかうまくいかない...

一旦 `:terminal` でターミナルを起動して `vim --remote-send ":e $HOME<CR>"` と入力してみる

```
C:\>vim --remote-send ":e $HOME<CR>"

C:\>:e $HOME
C:\>
```

あぁ、そうかターミナルに文字列が送信されちゃうのか。ということで頭に`<C-W>`をつける

```
C:\>vim --remote-send "<C-W>:e $HOME<CR>"
```

`E948: ジョブはまだ実行中です (! を追加でジョブを終了)`

言うとおりにつけてみる。

```
C:\>vim --remote-send "<C-W>:e! $HOME<CR>"
```

ちゃんと表示した。でも裏にはバッファとして残ってるみたい。`:e`をやめて`:split`にしてみる。

```
:terminal ++close vim --remote-send "<C-W>:split $HOME<CR>"
```

ちゃんと表示して、且つ裏にもバッファは残ってない。

# 上記を踏まえて peco と組み合わせてみる

カレントディレクトリのファイルのみを表示(`dir /a-D /b`)して`peco`に食わせてフィルタリングしたやつを`vim`で開く

```:pcd.bat
@echo off
for /f "usebackq delims==" %%i in (`dir /a-D /b ^| peco`) do (
  vim --servername %VIM_SERVERNAME% --remote-send "<C-W>:split %%i<CR>"
  break
)
```

```
:terminal ++close pcd.bat
```


# まとめ

* `:terminal`からファイルを親vimで開きたいときは`--remote-send`を使う。
* 送信するコマンドの前には`<C-W>`を置く
* `:e!`だと、裏にバッファが残っちゃうので`:split`を使う
* `++close`してジョブが終了したときにウィンドウも閉じてもらう
ubuntu1604にpython3.6.3をインストール

よく忘れるので、

```
sudo add-apt-repository ppa:jonathonf/python-3.6
sudo apt update
sudo apt install python3.6
```
これで3.6がはいりました。

```
~$ python --version
Python 2.7.12
~$ python3 --version
Python 3.5.2
~$ python3.6 --version
Python 3.6.3
```
3つはいってますね。
`python`を標準で3.6.3で動かすなら、venvやらpyenvを入れたほうがいいと思います。

公式ではvenvみたいすね。



```
~$ sudo apt search python3-venv
Sorting... Done
Full Text Search... Done
python3-venv/xenial 3.5.1-3 amd64
  pyvenv-3 binary for python3 (default python3 version)

~$ sudo apt search python3.6-venv
Sorting... Done
Full Text Search... Done
python3.6-venv/xenial 3.6.3-1ubuntu1~16.04.york1 amd64
  Interactive high-level object-oriented language (pyvenv binary, version 3.6)
```

`python3-venv`か`python3.6-venv`は3.6.3をつかうなら、後者をいれて環境を作ること。
デフォルトレイアウトバグを回避する

#IDE スタートアップ レイアウト

Delphi / C++Builder / RADStudio (以下 Delphi) 10.2.2 Tokyo では、IDE 起動時に「IDE スタートアップレイアウト」という特別なレイアウトで表示されるようになりました。

[IDE スタートアップ レイアウト](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E5%88%9D%E6%9C%9F%E8%A1%A8%E7%A4%BA%EF%BC%88IDE_%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BC%89#IDE_.E3.82.B9.E3.82.BF.E3.83.BC.E3.83.88.E3.82.A2.E3.83.83.E3.83.97_.E3.83.AC.E3.82.A4.E3.82.A2.E3.82.A6.E3.83.88)

![IDEStartupLayout.png](https://qiita-image-store.s3.amazonaws.com/0/12977/a977d3f1-79bd-a1cf-9f81-cfc351ca445b.png)

#デフォルトレイアウト バグ

恐らくスタートアップレイアウトの変更に伴って、プロジェクトを開いた時、必ず「デフォルトレイアウト」が使われるようになってしまいました。

Quality Portal にバグとして報告されています。

[[RSP-19530] Custom IDE layout](https://quality.embarcadero.com/browse/RSP-19530?jql=text%20~%20%22Startup%20layout%22)

#消極的解決方法

今までの Delphi ユーザーは自分なりのレイアウトを設定している人も多く大変困っていましたが、とあるところで回避方法が発見されました。

「[スタートアップレイアウト]と[デフォルトレイアウト]を自分で作ったレイアウトで上書きして！」

oh...

恐らくこれはバグではなく今後この方針で行きそうなので、上記の解決方法を使うのが良さそうです。

#まとめ
スタートアップレイアウト必要なｋ、うわなにをするやめｒくぁｗせｄｒｆｔｇｙふじこｌｐ
muninからchatworkにアラートを送る方法


AWSのEC2にmuninをインストールして、そこからチャットワークに通知するようにしました。

# 手順

1. muninをインストールする
2. Chatworkに送信するためのスクリプトを用意する
3. munin.confにchatworkに送信する設定を行う

# 1. muninをインストールする

```
sudo yum install -y munin munin-node
sudo chkconfig munin-node on
```

munin-nodeは、muninのみを指定しても併せてインストールされますので省略しても問題ありません。
他のサーバも監視する場合、監視先のサーバではmunin自体は不要です。

# 2. chatworkに送信するためのスクリプトを用意する

場所はどこでも良いのですが、muninが配置されていた/var/lib/muninにインストールしました。
muninユーザーで実行できるように実行権限をつけるのを忘れない様にしましょう。

最初の方のROOM_ID、API_KEY、SEND_TOは適当に書き換えてください。

```ruby:/var/lib/munin/chatwork_notify.rb
#!/usr/bin/ruby

require "net/http"

ROOM_ID = NNNNNNNNN
API_KEY = "XXXXXXXX"
SEND_TO = "[To:NNNNNN] zenpou"

url = "https://api.chatwork.com/v2/rooms/#{ROOM_ID}/messages"
uri = URI.parse (url)
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true

message = "[info][title]#{ARGV.join}[/title]#{SEND_TO}\n#{STDIN.read}[/info]"

request = Net::HTTP::Post.new (uri.request_uri)
request.add_field "X-ChatWorkToken", API_KEY
request.set_form_data :body => message
https.request(request)
```

# 3. munin.confにchatworkに送信する設定を行う

[localhost]などのサーバ毎の設定より前に送信するコマンドを設定します

```
contact.admin.command /var/lib/munin/chatwork_notify.rb "Munin Alert [${var:group}]:${var:host}"
contact.admin.max_messages 3
contact.admin.always_send  warning critical
```

各サーバ毎に、アラートの基準も設定が必要です

```
[localhost]
    address 127.0.0.1
    use_node_name yes
    df._dev_xvda1.warning 90
    df._dev_xvda1.critical 95
    load.warning 2
    load.critical 4
```

試しにしきい値を物凄く低くして、warning状態にして以下のコマンドを実行して送信を試す事ができます。

```
su - munin --shell=/usr/bin/munin-cron
```
Alibaba Cloud のZone

#Alibaba CloudのZone
ドキュメントはここから https://jp.alibabacloud.com/help/doc-detail/40654.htm
中国の方がZone数まで乗ってます。Google翻訳をして読みましょう。 https://help.aliyun.com/document_detail/40654.html?spm=5176.product25365.6.541.r9z7vl

国際リージョン


| リージョン | 香港 | シンガポール | アジア太平洋南東部 2 | 東京 | 米国西部 1 | 米国東部 1 |
|:--|:--|:--|:--|:--|:--|:--|
| 都市      | 香港 | シンガポール | シドニー | 東京 | シリコンバレー | バージニア |
| リージョンID | cn-hongkong | ap-southeast-1 | ap-southeast-2 | ap-northeast-1 | us-west-1 | us-east-1 |
| ゾーン数    |3            |2              |1                |1              |2 |1 | 

東京リージョンのゾーンが一つしかないので今後増えることを期待したいところです。
エンジニア採用の際に確認するポイント(ポテンシャル採用編)

# [概要]
採用活動に携わるようになって、面接時の観点を整理したくなった。
ので、現時点での自分の考えを書いてみた。
基本的には、「自立自走できて、今後の成長{確度,角度}に期待が持てる人」というイメージ。
現状のスキルセットは問わず、ポテンシャル採用をする際の視点という感じ。

# [ベースとなる能力]
ベースとなる能力として、会話をする力と思考習慣があると思っている。
## 会話をする力

### 何？
1. 相手の発言を聞き、
2. それを正しく解釈し、
3. それに対する返答を言語化し、
4. 簡潔に出力する力

### なぜ重要？
この力が乏しいと、そもそもまともにコミュニケーションが取れないため円滑に仕事ができないから。


### 確認の仕方
質問に対してまともな返答が来るか、で確認できる。
1が足りない例：こちらが話している途中で遮って話し出す。
2が足りない例：質問している内容に対してトンチンカンな答が返ってくる。
3が足りない例：じっと黙ったままフリーズしてしまう。返答に説得力が乏しい。
4が足りない例：結論から話さない。だらだら思い付いたままに話す。

## 思考習慣

### 何？
普段から思考をする習慣

### なぜ重要？
長期的に自己成長していくための礎となる。
指示待ちではなく自立自走していく人材になってくれそう。

### 確認の仕方
その人が普段から考えていそうなこと(考えておいてほしいこと)について質問し、「なんで？」を繰り返してみればわかる。
例えば将来的にどうなりたいのか、なぜ転職したいのか、なぜ弊社を受けたのか、とか。

# [さらにあると望ましい能力]
具体と抽象の往復、メタ認知、動機の3つが揃っていると強い。

## 具体と抽象の往復
具体を抽象に昇華し、抽象を具体に当てはめる能力。
### なぜ重要？
具体的な体験から大切なことを一般化して抜き出す習慣があると、少ない体験からより多くの学びを得ることができる。
その学びを次のアクションに活かすことができるので、行動改善のスピード感が高まる。
### 確認の仕方
特定のケースについての話と、それを一般化したケースの話を区別できているか？
具体を集めて抽象に昇華する習慣があるか？をうまく聞き出せそうな質問は、現在模索中。

## メタ認知能力
自分を客観的に見る力。
### なぜ重要？
自分の理想と現実を分析し、何が足りないのかを把握することができるので、成長スピードが早い。方向性がぶれにくい。ぶれても自力で軌道修正ができる。
### 確認の仕方
あなたは何を望んでいるのか、どうなりたいのか？あなたがこのチームで期待されていることは何だと思うか？
その理想と現実のギャップを埋めるために取り組んでいることは？
とかを聞いてみる。明瞭な答えだと良い。
また、事前に自己研鑽はどうしているかとか聞いておいて、それが理想と現実のギャップを埋める行為として出てきたものと一致していると良い。

## 動機

### 何？
弊社で働く動機。

### なぜ重要？
上の方で上げたすべての項目を高いレベルで満たしていたとしても、働くことに対するモチベーションが存在しないと働かない。能力を活かしてくれない。
どんなハイスペックな車でも、ガソリンが無いと動かない。

### 確認の仕方
どうしてこの業界で働きたいの？なぜ弊社で働きたいの？ということを聞き、深掘りしていく。
別に弊社でなきゃならない理由がはっきりと説明できる必要はない。別の会社でも当てはまる理由でも良い。
なぜなら、弊社に入社した後に、能動的に働いてくれそうかを確認するためのものだからだ。

入社後、「働くことでこれを実現したい」というような動機だと、働くことを望んでいることがわかるので良い。
「年収面で今の自分を正当に評価してくれるところに転職したい」とかだと、転職がゴールになるし入社後に働く動機とはならないので、満たさない(悪いと言っているわけではなく、それだけではこの動機の項目にチェックが付かないという話)。




# [終わりに]
エンジニア全く関係ないなと思った。

(この記事は都度アップデートしていく予定。)
Sprockets::FileNotFound in FileName#index

# Sprockets::FileNotFound in #index

下記エラー

<img width="1277" alt="スクリーンショット 2018-01-30 13.12.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/31394/5df1fbe5-c7d5-6070-9d17-8456e7c8bdc6.png">

```
// about supported directives.
//
//= require rails-ujs <-- これが無いとのこと
//= require turbolinks
//= require_tree .
```

なので、削除します。

app/assets/javascripts/application.js

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

```

これで表示されます。
初心者がVue.jsの公式ガイドを勉強するメモ　イベントハンドリング編

# イベントハンドリング編
## 今回のお題です
## https://jp.vuejs.org/v2/guide/events.html
* ブラウザー結果は、掲載しませんので、実際に確認してみてください。

## メソッドイベントハンドラ
### イベントの購読

* App.vue 

``` html
<template lang="pug">
  #App
    div: button(@click="counter += 1") Add 1
    div: button(@click="greet") Greet
    p {{ counter }} times.
</template>

<script>

export default {
  name: 'app',
  data  () {
    return {
      counter: 0,
      name: 'ヤス'
    }
  },
  methods: {
    greet (event) {
      alert('Hello' + this.name + '!')
      if (event) {
        alert(event.target.tagName)
      }
    }
  }
}

</script>
```

* ここは、復習セクションですね。

## インラインメソッドハンドラ

* App.vue

``` html
<template lang="pug">
  #App
    div {{ greet.hello }}
    div: button(@click="say('hi!')") Say hi
    div: button(@click="say('what?')") Say what
    div: button(@click="saySet('saySet!')") Say Set method
</template>

<script>

export default {
  name: 'app',
  data  () {
    return {
      greet: {
         hello: ''
      }
    }
  },
  computed: {
  },
  methods: {
    say (event) {
      return this.greet.hello = event
    },
    saySet (event) {
      return this.$set(this.greet, 'hello', event)
    }

  }
}

</script>
```
* 前章（リストレンダリング編）で覚えた, setメソッドも使って見ます。
* 引数での受け渡し　OK　ですね。  

## イベント修飾子

* App.vue

``` html
<template lang="pug">
  #App
    div: a(@click.prevent="href='https://google.com'" :href="href") google ?
    div: a(@click="href='https://google.com'" :href="href") google ?
    // クリックしてしまったら、ブラウザの左矢印で戻ってください。
</template>

<script>

export default {
  name: 'app',
  data  () {
    return {
      href: 'https://www.yahoo.co.jp/'
    }
  },
  computed: {
  },
  methods: {
  }
}

</script>
```

* このあたりのバブリング/キャプチャリングの話はよくわかっていないのですが、例がわかりやすいpreventのサンプルを作って見ました。
* preventは画面推移の抑止に使われます。　この場合は、aタグの基本動作が抑止されます。
* 修飾子は、数珠つなぎにできるみたいなので、動作がイメージ出来ていると組み合わせもできそうですね。　

## キー修飾子

* App.vue

``` html
<template lang="pug">
  #App
    p {{ inputText}}
    //- enter key を離すと実行
    input(@keyup.13="inputMethod(inputText)" v-model="inputText")
</template>

<script>
import Vue from 'vue'

export default {
  name: 'app',
  data () {
    return {
      inputText: ''
    }
  },
  methods: {
    inputMethod(input) {
      alert(input)
    }
  },
  computed: {
  }
}

</script>

```
* キー入力のコントロールが出来るみたいです。　ちなみにサンプルは、エンターキーが押下状態から戻った時に、中の式が実行されます。


## 自動キー修飾子
 * キー割り当ての拡張みたいですね。今は用途が思いつかないです。
 * マウスコントロール、システムコントロールも説明でわかるかと思います。
 * イベントの発生を細かく制御する仕組みみたいです。
 

---

* 今回はこれで終了です。　あっさりになってしまいました。