OmniAICreator/Qiita-1.07M huggingface dataset:
matplotlibでよく使われるやつを改めてまとめた

Pythonのグラフ作成ライブラリ「matplotlib」でよく使われる手法をまとめたので、グラフ作成に役立ててください。また最後に、データ分析の流れを経験できるオススメ学習コンテンツを紹介したので、ご参考ください。

## ライブラリのインポート

```py
import matplotlib.pyplot as plt
```

## jupyter notebook上で表示させるようにする

```py
%matplotlib inline
```

## 折れ線グラフ

```py
x = [1,2,3]
y = [2,4,6]
plt.plot(x, y)
```

- `plot`の第1引数がX軸、第2引数がY軸
- 引数で線の色(`color=''`)やマーカーの種類(`marker=''`)、インデックス(`index=''`)なども指定できる
- 指定しない場合は自動で保管される

## 散布図

```py
x = [1,2,3]
y = [2,4,6]
plt.scatter(x, y)
```

- `scatter`の第1引数がX軸、第2引数がY軸
- 引数で線の色(`color=''`)やマーカーの種類(`marker=''`)、インデックス(`index=''`)なども指定できる
- 指定しない場合は自動で保管される

## 棒グラフ

```py
left = [1, 2, 3]
height = [100, 200, 300]
plt.bar(left, height)
```

- `bar`の第1引数が棒グラフの左からの順序、第2引数がグラフの高さ
- 引数で棒の色(`color=''`)や太さ(`width=''`)、各棒下のラベル(`index='tick_label'`)なども指定できる
- 指定しない場合は自動で保管される

## グラフタイトルの追加

```py
plt.title('グラフタイトル')
```

## X軸ラベル、Y軸ラベルの追加

```py
plt.xlabel('X軸ラベル')
plt.ylabel('Y軸ラベル')
```

## X軸、Y軸の表示範囲

```py
plt.xlim(Xの最小値, Xの最大値)
plt.ylim(Yの最小値, Yの最大値)
```

- 指定しなければ自動で判断される

## 罫線の追加

```py
plt.grid()
```

- 引数で色(`color=''`)や太さ(`linewidth=`)なども指定できる
- 指定しなければ自動で判断される

## 凡例の追加

```py
plt.legend()
```

- 散布図や折れ線データに`index`が付与されていれば(`plt.scatter(x, y, index = 'ラベル1')など`)、凡例として表示される
- `legend`の引数で場所などを指定できる
- `legend`の引数を指定しなければ自動で場所が判断される

## グラフの複数配置

```py
plt.figure(figsize=(6,4))
 
# 左上
plt.subplot(2,2,1)
plt.plot(x1, y1)
 
# 右上
plt.subplot(2,2,2)
plt.plot(x2, y2)
 
# 左下
plt.subplot(2,2,3)
plt.plot(x3, y3)
 
# 右下
plt.subplot(2,2,4)
plt.plot(x4, y4)
 
plt.show()
```

1. まず`plt.figure(figsize=(〇,〇))`でグラフ領域全体の大きさを決める
2. `plt.subplot(グラフの縦並び数,グラフの横並び数,その中で何番目か)`を指定したのち`plt.plot(x, y)`でグラフをプロットする ※もちろん`scatter`でも`bar`でも可
3. 最後に`plt.show()`

## 【最後に】データ分析手法の習得にオススメのコンテンツ（私が制作したもの）

私が制作したものですが、初心者向けのPythonデータ分析学習コンテンツです。データの取り込み、前処理から可視化の流れを学習できる教材です。考察イメージまで記載されているのでオススメです。一部無料公開されているので、ご興味あればお試しください。

https://www.techpit.jp/courses/30
AWS Lambda で環境変数を渡してみる(Node.js)



もう一年ぐらい前の話だと思うのですが、AWS Lambda アプリケーションに環境変数を渡せるようになっており、まだ試したことがなかったので今回やってみました。

これまでは例えば認証用のキー情報のようなものを、アーカイブしてアップロードするソースコードのどこに含めるか悩ましかったのですが、これからは環境変数で渡せます。

管理コンソールでキーと値を設定し、

<img width="500" alt="スクリーンショット_2017-12-22_17_23_54.png" src="https://qiita-image-store.s3.amazonaws.com/0/35733/f9599aea-c1ef-e138-aa78-7067d5fad225.png">

コード内で `process.env` オブジェクトから取得してみます。

<img width="500" alt="スクリーンショット_2017-12-22_17_27_42.png" src="https://qiita-image-store.s3.amazonaws.com/0/35733/733d1efe-8a1d-5ef2-b1d6-ac1fb4a63054.png">

次のように無事、取得できました。

<img width="500" alt="スクリーンショット_2017-12-22_17_28_35 のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/35733/39e0252a-a4e3-65ca-66d7-b992897a0ae2.png">

## ローカルで実行する場合はどうするか

Lambda を AWS 上で実行する場合は上記のように管理コンソールで環境変数を設定すればよいですが、開発時にローカルで Lambda を実行する場合に環境変数をどう設定するかを考えてみました。

前提として、ローカルでは本体のコード(ここでは`index.js`とする)を起動するドライバスクリプトを次のように用意しているものとします。

```javascript:localRun.js
const index = require('./index'); // 本体コードを読み込み

const event = { // eventオブジェクトを作成
  // ...
};

const context = { // contextオブジェクトを作成
  // ...
};

const callback = function (error, response) { // callback関数を作成
  if (error) {
    console.log(error);
  } else {
    console.log(response);
  }
};

index.handler(event, context, callback); // 本体コードのhandler関数を実行
```

> ローカルのコマンドラインコンソールから `$ node localRun.js` で実行

### ① ドライバスクリプト内で環境変数を設定する

ドライバスクリプトのコード内で環境変数を設定するようにします。

```diff:localRun.js
const index = require('./index'); // 本体コードを読み込み

const event = { // eventオブジェクトを作成
  // ...
};

const context = { // contextオブジェクトを作成
  // ...
};

const callback = function (error, response) { // callback関数を作成
  if (error) {
    console.log(error);
  } else {
    console.log(response);
  }
};

+ // 環境変数を設定
+ process.env['HOGE'] = 'moge';

index.handler(event, context, callback); // 本体コードのhandler関数を実行
```

### ② ドライバスクリプトの起動時にコマンドラインで環境変数を設定する

ドライバスクリプトを次のように起動するようにします。

`$ HOGE='moge' node localRun.js`

### ③ `dotenv`ライブラリを使って環境変数を設定する

npmモジュールである [dotenv](https://www.npmjs.com/package/dotenv) ライブラリを利用します。

`$ npm install dotenv` でローカルに導入した後、`.env` ファイルを次のように用意し、

```:.env
HOGE=moge
```

ドライバスクリプトを次のように起動するようにします。

`$ node -r dotenv/config localRun.js`

## おわりに

AWS Lambda のコード内で環境変数を利用する方法、および、ローカルで実行する場合の環境変数の設定方法を３通り紹介させて頂きました。個人的には ③ の方法にして、`.env`ファイルを Git 管理下から除外するのがおすすめかなと思います。
glmer/lmerで信頼区間を算出する方法

# ご挨拶
R + RStudioの自己学習の成果を自分へのメモも兼ねて遺していきます。
不正確な点には生暖かくご指摘を下さい。


# 背景
Rで頻度論のglmmを実行する際、lme4パッケージのlmer関数またはglmer関数が頻用されます。
glmmML等の他の関数と比較すると、複数のランダム変数を扱えることがメリット。その一方で、PQRを用いるために、ガウス求積を用いるglmmMLやSASと比べて推定が正確じゃないことがデメリットとされます。

そんなlme4 (lmer/glmer) の実用上の問題は、95%信頼区間 (CI) をデフォルトでは算出してくれないこと。glm関数ではconfint関数を使いますが、lmer/glmerではオブジェクト型が異なるのでconfint関数が動きません。lme4パッケージには代替の関数が準備されています。

# confint.merMod関数
それがこのconfint.merMod関数。.以降のmerModはlmer/glmerで生成されるオブジェクト型の名前です。

## S3 method for class 'merMod'
confint(object, parm, level = 0.95,
	method = c("profile", "Wald", "boot"), zeta,
	nsim = 500,
        boot.type = c("perc","basic","norm"),
        FUN = NULL, quiet = FALSE,
	oldNames = TRUE, ...)

levelで信頼水準を指定し、methodで信頼係数の算出法を指定します。理想はmethodにbootを指定し、bootstrapで信頼区間を算出することです。が、ここがひとつ、躓きポイントになります。

methodにprofileかbootを指定した場合、きちんと収斂する良いモデルでないとエラーを吐き続けます。サンプルサイズが小さかったり、モデルが特定できなかったりすると、profileやbootでは信頼係数を算出できません。そういう場合でもWaldなら算出できますけど、その時点でモデルの筋が悪いことが判明しているので、Wald使って算出した信頼区間を信頼してよいかは甚だ怪しいところ。モデルの素性もよろしくないと想定されるので、モデル、特にランダム変数周りをシンプルにしてあげると良いような (経験論ですが)。
numpy.einsum

```python
a = np.arange(6).reshape(2,3)
b = np.arange(6).reshape(3,2)*2
print(a)
print(b)
print(np.dot(a,b))
print(np.einsum("ij,ji->i",a,b)) # sum(aij*bji)
print(np.einsum("ij,ji->j",a,b)) # sum(bij*aji)
print("====")
a = np.array([1,2,3,4]).reshape(2,2)
b = np.array([1,2,3,4]).reshape(2,2)*2
print(a)
print(b)
print(np.einsum("ii",a))
print(np.einsum("aa",a))
print(np.einsum("ij",a))
print(np.einsum("ii->i",a))
#print(np.einsum("ii->ii",a)) # invalid
print("====")
print(np.einsum("ab->a",a))
print(np.einsum("cd->dc",a))
print(np.einsum("ij,ji->i",a,b))
print(np.einsum("ij,ji->j",a,b))
#print(np.einsum("ij,ji->x",a,b))  # invalid
print("====i,j,k====")
print(np.einsum("ij,jk->k",a,b))
print(np.einsum("ij,jk->ik",a,b)) # ab
print("====")
#print(np.einsum("ii,ii",a,b)) # invalid
#print(np,einsum("ii,jj",a,b)) # invalid
print(np.einsum("ii,ii->i",a,b)) # (a11b11, a22b22): multiply diagonal components
print(np.einsum("ii,jj->j",a,b)) # (a11(b12+b21), a22(b12+b21)): multiply multiply a's diagonal matrix and b's anti-diagonal matrix

n = 2
A = np.random.uniform(0,1,(n,n))
B = np.random.uniform(0,1,(n,n))
print("====sum====")
s = time.time()
x = A * B.T
print(x)
print(np.sum(x, axis=1))
print("time:"+str(time.time()-s))
print("====einsum====")
s = time.time()
print(np.einsum("ij,ji->i", A, B)) 
print("time:"+str(time.time()-s))
```
```
[[0 1 2]
 [3 4 5]]
[[ 0  2]
 [ 4  6]
 [ 8 10]]
[[20 26]
 [56 80]]
[20 80]
[ 6 28 66]
====
[[1 2]
 [3 4]]
[[2 4]
 [6 8]]
5
5
[[1 2]
 [3 4]]
[1 4]
====
[3 7]
[[1 3]
 [2 4]]
[14 44]
[14 44]
====i,j,k====
[44 64]
[[14 20]
 [30 44]]
====
[ 2 32]
[10 40]
====sum====
[[ 0.11653899  0.12994759]
 [ 0.43544416  0.679387  ]]
[ 0.24648658  1.11483116]
time:0.00037097930908203125
====einsum====
[ 0.24648658  1.11483116]
time:0.00011920928955078125
```
# Refs.
* [交換法則](http://www.geocities.jp/miyagawasusumu2004/works/math/matrix/matrix.html)
* [反対角行列](https://ja.wikipedia.org/wiki/%E5%8F%8D%E5%AF%BE%E8%A7%92%E8%A1%8C%E5%88%97)
* [numpy.einsum](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.einsum.html)
* [アダマール積](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%80%E3%83%9E%E3%83%BC%E3%83%AB%E7%A9%8D)
* [【einsum】アインシュタインの縮約記法のように使えるnumpyの関数。性能と使い方を解説。](http://www.procrasist.com/entry/einsum)
QMLのオブジェクトを作ろう - Qtで作るAndroid目覚ましもどき #3-2 -

Qtで作るAndroid目覚ましもどきシリーズ３としてまず画面構成の話をします、の２回目。

# QMLのオブジェクトを作ろう 
## 概要
要するにモジュール化の話でしょうか。普通のプログラムにおいてmainの関数が大きくなりすぎないようにしたり部品を使いまわしたりするために適当にモジュールを作成するように、QMLも部分を切り出してモジュール化することができます。
cやjavascriptなどのプログラムと違うところとしては、モジュールは必ず別のファイルになります。QMLは１つのファイルについては（大きな）部品１つだけを書くようになっています。
この程度の話は本などを読めば書いてあるようで、なんか私が勉強した本は不親切な書き方だった気がするのでこの記事を書きます。

## やりかた
まず（部品の名前を決めて）部品の名前.qmlファイルを作って内容も適当にこさえて、その部品を配置したいqmlに部品の名前を書いてあげればよいです。
部品を使いたいqmlのファイルの先頭には部品があるフォルダをimportします。

## 例
### 部品をつくる
[手前味噌](https://github.com/hakua-doublemoon/SummerIce/tree/master/summer_ice)から例を出します。
`ApplicationWindow`にある`Asm_toggles`という部品を置くために、Asm_toggles.qmlファイルを作った、というわけです。
部品は更にサブの部品で構成することができるので、`Asm_toggles`も`Parts_toggle`という部品の集まりで構成されています。
部品のファイルの書き方は……書けるように書きますが、たいていItemとかRectangleとかを一番大きなくくり（つまりはベースですね）にすると思います。

### 部品を置く（import）
部品を子、部品を置くqmlを親とした場合、親のファイルの先頭らへんで子のフォルダをimportします。
私のmain.qmlでは`Asm_toggles`がitemフォルダにあるので下記のように書いています。
`import "qrc:/item/"`
同じフォルダに親と子がいる場合はこう書くことが多いと思います。
`import "."`
気持ち的にフォルダごとインクルードというかインポートするのは乱暴な感じですが、qmlファイルのimportはqmlファイル単体を指定してもうまくできないようです。

## 備考
* Itemをベースにした自作のオブジェクトどうしを並べようとすると互いにめり込む時があります。そういうときはimplicitHeightなどを活用しましょう。（implicitHeightについて、私の説明は[前回の記事](https://qiita.com/hakua-doublemoon/items/42782fd755ea2e347aed#item)です）
* 親子間のプロパティの参照については次回以降で説明します。
各種QMLオブジェクトの覚え書き - Qtで作るAndroid目覚ましもどき #3-1 -

Qtで作るAndroid目覚ましもどきシリーズ３としてまず画面構成の話をします。
まあ、大したことはしてないです。なので大した話じゃないですがこういうQMLの話も日本語だとそんなにないので何かの気付きにつながればと。
一番はリファレンスを見ることだとは思いますが。Qtのリファレンスはサンプルの断片や図での説明とかもありますし。
私の書いたソースはこれですので、気になったらこれのqmlファイルを適当に見てください。→ [SummerIce](https://github.com/hakua-doublemoon/SummerIce/tree/master/summer_ice)

# QML Object Types
## ApplicationWindow
先頭にいる子。よくわかってない。
これをなしにRectangleで画面表示もできるができることは限られるっぽい。
（QQmlApplicationEngineが使えなかったり？）

## Image
画像を表示するオブジェクト。特記するプロパティは下記。

* fillMode  
  `Image.Stretch` などの列挙子が使って画像のリサイズなどを指定できる。  
  今回使っているのは`Image.PreserveAspectCrop`で、意味はアスペクト比を保ちつつ画像をImageオブジェクトの全体に表示する（あまった部分はクロップされる＝切られる）。

## Item
一番基本になるオブジェクト。なのでこの次に書くオブジェクトの作成でもこのItemオブジェクトをベースに作ることが多い。
基本のオブジェクトなので特別なプロパティもすぐには出てこないが、注意点はとりあえず一つある。`implicitHeight`と`implicitWidth`だ。

* implicitHeight / implicitWidth  
  Itemはwidthとheightのプロパティを持ちつつもそれがあまり有効に反映されない場合がある。Item自身は特に形を持たないオブジェクトだから。  
  なのでItemをベースにした部品を並べていると部品が部品にめり込む時がある。  
  そういうときは`implicitHeight`と`implicitWidth`を必要なように定義しておく必要がある。  
  例としてはParts_hscroll_list.qmlになります。（だったはず……）

## Rectangle
図形の初歩。手を抜くときにItem代わりに使う時もある。
colorは16進数のカラーコードかSVG color name（日本語ではこれなんていうんだろう？）のほか、`Qt.rgba()`を使ってRGBでの指定もできる。デフォルトの色は白。表示したくないときはtransparentとかにしましょう。
色に関しては他のオブジェクトと共通……詳細は[リファレンス](https://doc-snapshots.qt.io/qt5-dev/qml-color.html)を参照。

## MouseArea
マウスやタッチの操作を受け付けるオブジェクト。ボタンを作る時はRectangleかImageと一緒にすることが多いでしょう。
……これについてはいろいろ書けそう。気が向いたら書きます。
ひとつだけここで書きたかったのはwheelイベント・wheelシグナルについて

#### wheel(WheelEvent wheel)
なんかスワイプみたいに指ではじいたらメニューの項目が変わる部品を作りたいなーと思った。（そう言うのってなんていうんだろう？　スクロールといえばそうだけど、スクロールみたいに大きくするつもりもなかった）
とはいえQtの扱いとしては指でのスワイプもマウスでのホイールも同じ感じっぽい。
そんなわけで、まず対象のMouseArea上でホイール/スワイプされた時にはonWheelイベントが発生するので捕まえる。
そしてどういうホイールだったかを取得するには`wheel`という特別なパラメータをMouseAreaのシグナルハンドラー内で使えるので使う。
wheelパラメータについてはググったらなんか英語で出てきた気がするので正確なことはそちらを参照。
とりあえず私はスワイプの方向が知りたかったので、縦方向のスワイプの取得には`wheel.angleDelta.y`を、横方向のスワイプは`wheel.angleDelta.x`を使って取得した。それぞれ上下と左右で値の正負が変わるのでそれで向きが判断できる。
具体的な内容はParts_scroll_list.qmlとParts_hscroll_list.qmlを見てください。

## Text
文字を出すオブジェクト。
文字を出すだけなら簡単だが、折り返したりなんなりするときはいろいろ設定できる、奥深い子。
背景を持つわけではないのでRectangleやImageとセットにすることが多いと思うが、それらを表示域とする場合に上下左右のマージンなどを置こうとするとanchorの使い方が難しくなる。
というわけでそのうちanchorの覚え書きを別に書き起こすかもしれない。

## Row
Rowの中にあるオブジェクトを横に整列させるオブジェクト。これ自体は表示されない。
配置するだけならanchorとか使っても良いが、これを使うとマージンとかの設定が楽なので適宜使う。
兄弟にColumnがいる。

## Timer
名前のとおりのタイマー。目に見えるオブジェクトでも何でもない。
普通にタイマーとして使う以外に、良いのか悪いのか知らないが、非同期で実行したいことをこのTimerのtriggeredシグナルの延長でやるという使い道もある。

* repeat 
  デフォルトはfalseでいわゆるワンショットタイマーとして動作する。
  Timer定義時にこれの初期値は省略しないのが私の流儀です。

* running
  trueにするとタイマーが始まります。falseにすれば止まります。デフォルトはfalse。
  タイマーを開始するときにはstartメソッド、停止するときにはstopメソッドが使えますが、どうやらこのrunnningプロパティをいじったときにそれらの関数は内部的に呼ばれるっぽい。
  ところでAndroidアプリにおいてはWindowのQML上にいるTimerがrunning=trueになっていても、そのアプリが非表示になればタイマーは止まります。（表示されればまた動き出します）

<br>

とりあえずはこんなものか……毒にならない記事であることを祈る。
UbuntuにJenkinsをインストールする

### 前提条件
- 自分用メモ:thought_balloon:
- ubuntu 16.04

### 本文
まずはJDKをインストール

```shell
$ sudo dpkg -P oracle-java7-installer
$ sudo sudo apt-get -f install
```

そしてJenkinsをインストール！この辺は[公式Wiki](https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+on+Ubuntu)通り。

```sell
$ wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key $ add -
$ sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
$ sudo apt-get update
$ sudo apt-get install jenkins
```

`hostname:8080`にアクセス（ufwで塞いでる場合は事前に開けておく）

```
/var/lib/jenkins/secrets/initialAdminPassword
```
にあるパスワードをコピってこいっていわれるので、

```shell
$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword
```
表示さしてコピーしてログイン。
そしたら[Install suggested plugins]と[Select plugins to install]と２択のボタンが出てくるのでとりあえずオススメの方をインストール。（この辺よくわからんので:smirk:）

Create First Admin Userという画面に行くのでユーザー情報をごにょごにょ入力してsubmit！
したらば <b>Jenkins is ready!</b> となにやら急に元気に言われる:relaxed:
これでとりあえずインストール完了:beers:
### おまけ

ポート8080が気持ち悪い場合は...

```shell
$ sudo vi /etc/default/jenkins
```
で`PORT=8080`を検索、よしなのに変えたらJenkinsをリスタート。

```shell
$ sudo /etc/init.d/jenkins restart
```
ConohaでOpenCVを使ったC++プログラムの実行ができない・・・涙→解決！

Linux初心者です。

ConohaでOpenCVを使ったC++プログラムをコンパイル＆実行できません・・・。できないことを記事にするのも厚かましく申し訳ないのですが、同じように悩んでおられて解決した方・原因が分かる方がいらっしゃいましたら、ご教授くださると助かります。
→解決しましたので、同じように悩んでいる方がいましたら、コメント欄に書いたことをお試しください。

#ConohaでのVPSの作成

Conohaを契約します。私は最も安い東京リージョン512MBプランを契約しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224979/948b06cc-e0cd-f85b-1dcc-48ddb43637a5.png)

「＋サーバー追加」を押した際の、初期設定状態です。

#必要なものをインストール

https://qiita.com/estaro/items/c2f8f790dc62a9f5965f に記載された手順で、OpenCVのコンパイル＆実行に必要なものをインストールします。ありがたいことに、コマンドは先ほどのブログに書かれているものを実行させて頂きました。512MBプランでは2時間ほどかかりましたが、2GBプランだと20分ほどで完了しました。



#実行できない原因

サンプルコードのコンパイルまではうまくいくのですが、

```
./opencvtest: error while loading shared libraries: libopencv_core.so.3.4: cannot open shared object file: No such file or directory
```

と表示され、実行ができません。共有ライブラリ情報に追加するのは

```
# echo /usr/local/lib > /etc/ld.so.conf.d/opencv.conf
# ldconfig -v
```

のみで大丈夫でしょうか。

同じように悩んでおられて、解決した方・原因が分かる方がいらっしゃいましたら、ご教授くださると助かります。よろしくお願いいたします。
Logitech WifiルータをWEPからWPA2に変更した

### ポリシー：今後Qiitaは私的オンラインメモ帳として使う予定です。

家のWifiルータの設定がWEPだった。
よくわかっていないけどWEPは危ないと聞いた気がする。
変えよう。よくわかっていないけど。

# WEP？WPA2？

そういえば昔ラズパイをつなぐときにWPA2-Enterpriseに繋いだことある気がする。（[こんなの](http://ossyaritoori.hatenablog.com/entry/2016/08/20/195428)）

これらの違いについては[この辺の記事](https://www.netspotapp.com/jp/wifi-encryption-and-security.html)が簡潔で良い感じ。
とにかくセキュリティが強い順に並べると以下の通りになるらしい。

>
1. WPA2 + AES
1. WPA + AES
1. WPA + TKIP/AES (TKIPはフォールバック方法として使われています)
1. WPA + TKIP
1. WEP
1. オープンネットワーク(一切セキュリティーなし)

冒頭に出たEnterpriseは外部のサーバでアカウント情報的なのを管理するので市販の個人のルータで設定することはまずないっぽい。


そしてWEPがどれだけダメかというと「2004年には、WEPは公式にWi-Fiアライアンスから破棄」されたくらい。
記事を書いた時点で15年前くらいに既に止めろってなってたらしい。
さらには[「WEPは10秒で破れる」](https://internet.watch.impress.co.jp/cda/news/2008/10/14/21162.html)とも2008年に言及がある。

WEPだめやん…変えよ。


# Logitech の Wifiルータで設定変更
家にあったのはLogitechのWifiルータ。
[この文章](http://qa.elecom.co.jp/faq_detail.html?id=4236)
に従って設定を変えた。

## ルータのモードについて
まずは，**ルータをアクセスポイントモードAPからルータモードRTへ変更**する。

？？？

[この記事](http://qa.elecom.co.jp/faq_detail.html?id=4949)を参考にすると，

- 一本の有線LANケーブルを複数回線に分配するのが「**ルータ**」
- Wifiの接続先となる機能を「**アクセスポイント**」

と言うらしい。
普通私がWifiルータとして想像するものはどちらの機能もあるのである。

- つまり普通のルータは**ルータモードRT**として使う。

ただ，例外としてルータの情報を中継したりする場合はさらに接続ポイントを分岐させる必要はない&ごっちゃになるので分岐させないただの窓口としての**アクセスポイントモードAP**があるということ。

なるほど～～～～。というわけで通常仕様なら元からRTモードになってるはず。
要はこの項では何もしない！解散！

## ルータに接続
有線でルータとPCを接続する。

その後，ブラウザで**192.168.2.1**と打ってルータにアクセスする。
これは会社ごとにきまっているらしく，Buffaloだと192.168.1.1だったり，192.168.1.2だったりする。

次に以下のような感じの画面でID/passを要求されるので**両方adminと入力**。ザルかよ。
![](http://www.elecom.co.jp/support/faq/parts/Elesapo/4236_009.jpg)

その後は設定画面が出るのでがんばってください。
WPA2 AESというのをチョイスしてパスフレーズを設定して終了。

最後にルータを再起動しておしまい。
【メモ】Xcodeでビルド時のエラー箇所を特定するTips

XcodeでBreakpointを設定するだけ。
やり方はこの記事。

[[Xcode]ビルド実行時にThread 1: signal SIGABRT と表示された時の対処](http://lab-b.jp/2014/01/30/post-1364/)
【ツイッターで去年をツイートを振り返る】Tweet Reflectorを作りました

# やったこと

- ツイッターで日時指定して、過去のツイートを取得できるWebアプリを作りました
- 名前はTweet Reflector(もしくはTweet Reflection)です
- https://kdmgs110.github.io/tweet-reflection/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/c2c5685a-88df-7dc2-16c1-a4020ed7c1fe.png)

# 何がうれしい？

- 普通に日時指定する方法としては
    - ツイッターの検索欄から、クエリをうつ
    - でもそれはかなり面倒でした

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/7fe98b34-63c1-2226-043e-4bd559904927.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/9c08d454-60cb-78d4-e8f6-609bf96c2f3d.png)

（ここから引用）
http://www.appbank.net/2017/08/12/iphone-application/1393490.php

 - もう一つは、自分のアカウントの過去ツイートをダウンロードする方法もありました
    - が、それは自分のツイートしか見れません
    - しかも結構面倒くさい



- なので、Webアプリ上でサクッとつくりました。
    - つらい時とか指定してふりかえるとエモい気持ちになります
    - 気になる女の子がその日に何をしていたのかとか簡単に特定できるので、スケベ探偵できます

# 詳細

ブログよんでください

https://review-of-my-life.blogspot.jp/2018/01/tweet-reflector.html
MinecraftBEサーバー開発をPHPからJavaへ

# はじめに
これはMinecraft BE(旧PE)のサーバー開発に関しての記事です。
PocketMineからNukkitに開発を移るとき、PHPからJavaへプログラム言語が変わります。
プログラム言語が変わっても、できるだけすぐに開発できるように個人的によく使う文法で、PHPとJavaの違うところをまとめてみました。


#変数
よく使う変数ですが、Javaでは**型**を変数名の前に書きます。
PHPでは、引数などに書くことがあったかもしれませんね。

```java:変数
//型名 変数名
int number = 334;
```
型は、値(今回で言えば334)を実装しているクラス名や、そのクラスが継承もしくは実装しているクラス名を書けば大丈夫です。
なのでクラスを作成し、そのオブジェクトを変数へ代入するとなると

```java
class Player{
}
Player player = new Player();
```
このように書くようになります。


#配列
Javaの配列は、phpのように自由度は高くありません。
決めた個数を入れ、同じ型のオブジェクトを入れます。

```java:配列
int[] array = new int[3];
array[0] = 0;
array[1] = 1;
array[2] = 2;
System.out.println(array[1]); // 1
```
上記を短くすることができます。

```java
int[] array = new int[3]{1,2,3};
System.out.println(array[1]); // 1
```


#List,Map
phpでは、配列にたくさんのオブジェクトを代入することができました。
JavaではListやMapというものを使用して、同じようなことができます。

```java:ArrayList,Map
ArrayList<Integer> list = new ArrayList<Integer>(); // List
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>(); // Map
```
ListやMapでは参照型と呼ばれる型を代入します。
参照型は先頭が大文字になっているのがほとんどです。


#まとめ
単語だけ並べたようになっていますが、このようなものがあるのだなーと思ってもらえれば嬉しいです。
参照型やプリミティブ型を知ると幸せになれますよー！
Djangoの開発環境構築

#はじめに
Djangoの開発環境構築で結構苦戦したので、備忘録も兼ねての投稿です。
ネット上にある情報も幾つか参照したのですがエラーが出ることの方が多く苦労しました。

#仮想環境について
Pythonの仮想環境構築のためのツールとして。pyenvやvirtualenv等様々なツールがあります。
これらのツールは移り変わりが激しくなかなか初心者がつまづきやすいポイントです。現在はvirtualenvが既にデファクトスタンダードとして地位を確立しており、安全でかつ多くのアプリのインストールに対応可能であることから多くの人に使われているツールです。

#1.仮想環境構築ツールをインストール
ちなみに今回はpipがインストール済みであることを前提に進めています。もしまだであれば以下の記事等を参考にインストールしてください。
[pipのインストール方法](https://qiita.com/suzuki_y/items/3261ffa9b67410803443)

Python3以外の場合は以下のコマンドでツールをインストールします。
```
sudo pip install virtualenv
```


Python3であれば以下のコマンドを使用します。

```
sudo pip3 install virtualenv
```

#2.該当フォルダ内に仮想環境を構築
今回Djangoでプロジェクトを作成するフォルダに移動して既にインストールしたvirtualenvを使用して
仮想環境を構築します。ホームディレクトリではなく今回プロジェクトを作成するディレクトリに移動してから構築します。

```
virtualenv newenv
```

#3.構築した仮想環境を有効化

仮想環境を用いるにはインストールした後それを有効化する必要があります。

```
source newenv/bin/activate
```

もし仮想環境を無効にしたい場合は以下のコマンドで実行します。

```
deactivate
```

#4.構築した仮想環境内にDjangoをインストール
構築した仮想環境内にDjangoをインストールします。
```
pip install django
```
以下のコマンドでインストールしたDjanogoを確認できます。

```
django-admin --version
```
#5.仮想環境上にDjangoプロジェクトを作成
今回はmysiteというプロジェクトを作成するため以下のコマンドを入力します。
```
django-admin startproject mysite
```

#終わりに
最近は環境構築無しでプログラミングを学べるツールが流行っていますが、実際動くものを作りたければ環境構築は必須です。
環境の変化が激しいため既存のネット上の情報ではエラーが出ることが多いので最新版の環境構築法として参考にしてください。
AngularMaterialのplaceholderを加工したい

基本的な機能の参考サイトはありますが、細かい修正になると見つけられない。あっても英語な事が多いので、備忘録がてら書きます。

#〇今日の内容
1.Placeholderのfloatをなくしたい
2.Placeholderのフォントカラーを変えたい
3.Focusされた時のフォントカラーを変えたい
4.ついでに、Underlineを消したい

#〇修正前、、、、

・Placeholderのデフォルトカラーが暗くてみづらい(左側にいる「荷主」です)
・FocusをあてるとPlaceholderがmd-cardをはみ出しカッコ悪い
・そしてInputの縁とUnderlineが両方あって、更にカッコ悪い

<img width="799" alt="before1.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/b5d7ffaa-450f-c59c-5771-65a4c16ac36e.png">


<img width="793" alt="before2.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/d2b40d04-289c-1162-f049-f3402b36dd9a.png">

#1.Placeholderのfloatをなくしたい

htmlに`floatPlaceholder="never"`を加えるだけでした。

```
<md-input-container class="sample"  floatPlaceholder="never">
 <input class="sample2" mdInput placeholder="荷主">
</md-input-container>
```

floatされなくなりました。
代わりにinputの中に残るようになりました。

<img width="812" alt="after1.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/85fdbe25-229e-fa57-c769-8c68aa64ba60.png">

ちなみに、`floatPlaceholder="never"`は他にも、`"auto"`と`"always"`がいて、全3パターンです。

`auto`は修正前の仕様と同じ、focusするとfloatします。
`"always"`は常にfloat状態になります。

<img width="797" alt="after2.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/db5be423-2c95-3aea-25b9-ea6fd39ceec0.png">

#2.Placeholderのフォントカラーを変えたい

CSSで頭に、`::ng-deep`と付けると修正できます。

```
::ng-deep .mat-input-placeholder{
  color: #fff;
}
```

<img width="787" alt="after3.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/1dbbc27e-70bc-27de-b269-b1a370b05ca8.png">

#3.Focusされた時のフォントカラーを変えたい

CSSで頭に`::ng-deep`、更に` .mat-focused`を加えます。

```
::ng-deep .mat-focused .mat-input-placeholder {
  color: #fff;
} 
```

<img width="861" alt="after4.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/2d49a6cc-c351-d853-9c1b-3493f8991b8e.png">

#4.ついでに、Underlineを消したい

2.3と同じく`::ng-deep`で消せました。

```
::ng-deep .mat-input-underline {
  display: none;
}
```
(Before)
<img width="243" alt="after5.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/d7096220-af5f-25cf-5bc8-c782642a5243.png">

(After)
<img width="247" alt="after6.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/847e57e9-6050-d3c6-ea87-bbb8f9cf04a8.png">

#〇感想

見た目は機能と違って、修正しても現場のパートさんが「見やすくなった！」って喜ぶくらいなので(もちろん重要なことです！！)、現場の作業効率を変えるわけではないので、、、、、

こういうところで時間をとられたくないですね、お役に立てたら嬉しいです。
[Python] コマンドラインからGitHubリポジトリを新規作成する

## 概要
GitHubで新しいリポジトリを作成するとき、わざわざブラウザを開くのがめんどうでした。
コマンドラインから作成できれば楽です。
実際のソースコードは[こちら](https://github.com/yonedaco/ghcreate)

## 仕組み
GitHubのAPIを使っています。
APIにリクエストを送るためにpythonのrequestsというモジュールを使っています。

## 使い方
もしrequestsが入っていなければインストールする。

```
$ pip install requests
```
スクリプトの実行

```
$ python new.py
[enter github username] yonedaco
[enter new reponame] test1
password 🔒
success!
```
GitHubのユーザー名、パスワード、新規作成するリポジトリ名を入力します。
success!と表示されれば成功です。

## エイリアスを貼って使おう
エイリアスをはったら、どの場所にいてもいつでも実行できます。
シェルが起動したときに反映されるよう.bash_profileに追記しています。

```
$ echo 'alias ghcreate="python /Users/yourname/ghcreate/new.py"' >> ~/.bash_profile
```

## 参考

[GitHubAPI](https://developer.github.com/v3/)
[Python Tips：標準入力からパスワード入力を受け付けたい](https://www.lifewithpython.com/2015/05/python-get-password-from-standard-input.html)
Kerasでニューラルネットワークの作成の簡単イメージ

## 背景
分かりにくい、ほんとわかりにくい。
私でもスッとわかるような説明がない。
なので作ってみた。

## 前提条件

- 身長、体重、肩幅、性別のデータセットが大量にあつまった
- これをもとに、身長、体重、肩幅から性別を判定したい
- この判定のため、Kerasを用いてモデルを作成する

## 完成形

[![https://gyazo.com/7610e6941cf936d9db7d9ff20c814679](https://i.gyazo.com/7610e6941cf936d9db7d9ff20c814679.png)](https://gyazo.com/7610e6941cf936d9db7d9ff20c814679)

## 第1段階(事前準備。そしてモデルを作るぞ！と宣言。)

コードで書くと以下の通り。

```py
# 事前準備
from keras.models import Sequential
from keras.layers import Dense, Activation

# モデルを作るぞ！と宣言
model = Sequential()
```

## 第2段階(1層目のレイヤー作成)

- 1層目のレイヤーの丸いやつは3個にしよう。
- 入力データは身長、体重、肩幅だから3つだ。
- 活性化関数はシグモイド関数にしよう。

※`活性化関数`は`次の丸いやつにとって便利な形に変換する関数`のこと

コードで書くと以下の通り。

```py
model.add(Dense(3, input_dim = 3, activation='sigmoid'))
# Denseの第1引数が「丸いやつは3個」の「3」
# Denseの第2引数が「入力データは身長、体重、肩幅」の「input_dim = 3」
# Denseの第3引数が「活性化関数はシグモイド関数」の「activation='sigmoid'」
```

[![https://gyazo.com/00c1986e03a779740a457f3e0661df23](https://i.gyazo.com/00c1986e03a779740a457f3e0661df23.png)](https://gyazo.com/00c1986e03a779740a457f3e0661df23)

## 第3段階(2層目のレイヤー作成)

- 2層目のレイヤーの丸いやつは2個にしよう。
- 入力データはもう関係ない。丸いやつ同士が勝手にやってくれる。
- 活性化関数はシグモイド関数にしよう。

コードで書くと以下の通り。

```py
model.add(Dense(2, activation='sigmoid'))
# Denseの第1引数が「2層目のレイヤーの丸いやつは2個にしよう。」の「2」
# Denseの第2引数が「活性化関数はシグモイド関数にしよう。」の「activation='sigmoid'」
```

[![https://gyazo.com/0ec19321a75f2e2dd61ffa1cf421e61c](https://i.gyazo.com/0ec19321a75f2e2dd61ffa1cf421e61c.png)](https://gyazo.com/0ec19321a75f2e2dd61ffa1cf421e61c)

## 第4段階(3層目のレイヤー作成)

- 3層目のレイヤーの丸いやつは3個にしよう。
- 入力データはもう関係ない。丸いやつ同士が勝手にやってくれる。
- 活性化関数はシグモイド関数にしよう。

コードで書くと以下の通り。

```py
model.add(Dense(3, activation='sigmoid'))
# Denseの第1引数が「このレイヤーの丸いやつは3個にしよう。」の「3」
# Denseの第2引数が「活性化関数はシグモイド関数にしよう。」の「activation='sigmoid'」
```

[![https://gyazo.com/09debb0d65779ab4302fe1bf297b3a40](https://i.gyazo.com/09debb0d65779ab4302fe1bf297b3a40.png)](https://gyazo.com/09debb0d65779ab4302fe1bf297b3a40)


## 第5段階(男女に結び付ける)

- 入力データはもう関係ない。丸いやつ同士が勝手にやってくれる。
- 活性化関数はソフトマックス関数にしよう。

コードで書くと以下の通り。

```py
model.add(Dense(2, activation='softmax'))
# Denseの第1引数が「男女」2種類の「2」
# Denseの第2引数が「活性化関数はソフトマックス関数」の「activation='softmax'」
```

[![https://gyazo.com/7610e6941cf936d9db7d9ff20c814679](https://i.gyazo.com/7610e6941cf936d9db7d9ff20c814679.png)](https://gyazo.com/7610e6941cf936d9db7d9ff20c814679)

## 第6段階(学習方法を決めよう！)

- 学習スタイルは'rmsprop'にしよう
- 男と女の分類問題なので損失関数は'binary_crossentropy'にしよう
- 学習結果が正解かどうかの評価方法は'accuracy'にしよう

※`学習スタイル`は、`目的関数の最小値をいかにして探すか`という手法のこと
※`損失関数`は、`入力データからモデルを通じて出力した結果`と、`データセットの実際の答え`の`差分`を計算式で表現したもの

コードで書くと以下の通り。

```py
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])
# compileの第1引数が「学習スタイルは'rmsprop'」の「optimizer='rmsprop'」
# compileの第2引数が「目的関数は'binary_crossentropy'」の「loss='binary_crossentropy'」
# compileの第3引数が「評価方法は'accuracy'」の「metrics=['accuracy']」
```

## これでモデル完成です。

モデルの良しあしは、

- `レイヤー`を何層にするか
- 各レイヤーの丸いやつ(`ユニット`と呼ぶ)を何個にするか
- `活性化関数`を何にするか(いろいろあります。)
- `学習スタイル`を何にするか(これもいろいろあります。)
- `損失関数`を何にするか(これもいろいろあります。)
- `評価方法`を何にするか(これもいろいろあります。)
- その他、いろいろあるらしいが、私は分からない

で決まるのです！
numpy.diag

```python
n = 2 
C = np.array([1,2,3,4]).reshape(n,n)
print(C)
D = np.array([2,6,0,-1]).reshape(n,n)
print(D)
print(str(np.dot(C,D)))
print(str(C*D))

A = np.random.uniform(0,1,(n,n))
B = np.random.uniform(0,1,(n,n))
# Slow version
print("====dot,diag====")
s = time.time() 
x = np.dot(A,B)
print(x)
print(np.diag(x))
print("time:"+str(time.time()-s))
# Fast version
print("====sum====")
s = time.time()
x = A * B.T 
print(x)
print(np.sum(x, axis=1))
print("time:"+str(time.time()-s))
```
```
[[1 2]
 [3 4]]
[[ 2  6]
 [ 0 -1]]
[[ 2  4]
 [ 6 14]]
[[ 2 12]
 [ 0 -4]]
====dot,diag====
[[ 0.09273369  0.64093528]
 [ 0.05562926  0.79577961]]
[ 0.09273369  0.79577961]
time:0.02531576156616211
====sum====
[[ 0.07589155  0.01684214]
 [ 0.06101996  0.73475965]]
[ 0.09273369  0.79577961]
time:0.00029969215393066406
```
* 証明  

```math  
diag(dot(A,B)) = sum(A*B.T, axis=1)\\
diag(\begin{matrix}
a11b11+a12b21 & a11b12+a12b22 \\
a21b11+a22b21 & a21b12+a22b22 
\end{matrix}) = 
sum((\begin{matrix}
a11b11 & a12b21 \\
a21b12 & a22b22
\end{matrix}), axis=1)\\
(a11b11+a12b21, a21b12+a22b22) = (a11b11+a12b21, a21b12+a22b22)\\
[Q.E.D.]
```
# Refs.
* [ベクトルの内積や行列の積を求めるnumpy.dot関数の使い方](https://deepage.net/features/numpy-dot.html)
* [対角行列](https://ja.wikipedia.org/wiki/%E5%AF%BE%E8%A7%92%E8%A1%8C%E5%88%97)
util.inspect 便利

Node.js Advent Calendar が埋まってなかったので、代わりに細かすぎて伝わりにくいTips入れていきます。

# util.inspect

`object` の文字列化をするための関数です。まぁまぁ便利なのですが、あまり使われてないシリーズです。先日公開した `%o` 便利という記事でも若干出しましたが、もうちょい詳しく解説してみます。

[%o 便利](https://qiita.com/yosuke_furukawa/items/7dc3b9fcf05148a57885)

記事でも触れましたが、 `util.inspect` は `%o` フォーマッターを使った時に内部で呼ばれている関数です。

```javascript
const util = require('util')
const obj = { foo: 'bar', bar: 123, baz: true }
obj.hoge = obj
const str = util.inspect(obj) 
console.log(str) // '{ foo: 'bar', bar: 123, baz: true, hoge: [Circular] }'

console.log('hello %o', obj) // hello { foo: 'bar', bar: 123, baz: true, hoge: [Circular] }
```

JSON valid な文字列ではないので、 `JSON.parse` しようとしてもエラーになります。

一番使うのはやはり debug print の時ですね。 `%o` で大体のケースは抑えられているのですが、 `%o` では深さが4までのオブジェクトしか print されません。もっとオブジェクトの構造が複雑なケースの場合は `util.inspect` を使いましょう。

## util.inspectのオプション

おさらいです。

- showHidden: Enumerable じゃないオブジェクトを表示したいときには `true` にします。デフォルトは `false`

```javascript
util.inspect([1,2,3], { showHidden: true }) // '[ 1, 2, 3, [length]: 3 ]'
```

- showProxy: Proxyのオブジェクトや関数を表示するかどうか、デフォルトは `false`

```javascript
const handler = {
    get: function(target, name){
        return name
    }
}
const p = new Proxy({}, handler)
util.inspect(p, {showProxy: true}) // 'Proxy [ {}, { get: [Function: get] } ]'
```

- depth: オブジェクトを表示する深さ、デフォルトは深さ `2` 全部表示したければ `null` にします。
- colors: ANSIカラーを当てるかどうか、 `true` なら勝手に Node.js が決めた色でカラーリングされます。デフォルトは `false`

```javascript
util.inspect([1,2,3], {colors: true})
// '[ \u001b[33m1\u001b[39m, \u001b[33m2\u001b[39m, \u001b[33m3\u001b[39m ]'
```

- customInspect: v6.6.0 で入った機能。カスタム表示を許可するかどうか、デフォルトは `true` 。カスタム表示機能に関しては後述
- maxArrayLength: 配列の要素を何個まで表示するか。デフォルトは `100` 全て表示したければ `null`
- breakLength: どのくらいの長さで改行するか。デフォルトは `60` 。 `60` なのは歴史上の理由から。 `Infinity` にすれば改行しない。

## util.inspect.custom

debug print を `prototype` を拡張することでカスタマイズすることもできます。

```javascript
const util = require('util')

const Dog = function(name, age) {
  this.name = name
  this.age = age
}

Dog.prototype[util.inspect.custom] = function(depth, options) {
  if (!this.name) {
    // color は https://nodejs.org/api/util.html#util_customizing_util_inspect_colors 参照
    return options.stylize(`Name: No-Name, Age: ${this.age}`, 'null')
  }

  return options.stylize(`Name: ${this.name}, Age: ${this.age}`, 'special')
}

console.log(util.inspect(new Dog('pochi', 12), { colors: true }))
console.log(util.inspect(new Dog('', 0), { colors: true }))

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6031/ec91d545-1fba-ae33-ccb7-88222d16125f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6031/9504d1c4-423a-7b61-7379-2f37797638a8.png)

あんまりカスタム表示は使いませんが、デバッグ表示の際わざわざ表示してほしくないものを隠す時とかに使います。

```javascript
const util = require('util')

class CustomBuffer {
  constructor(buf) {
    this.target = Buffer.from(buf)
  }

  [util.inspect.custom](depth, options) {
    const label = options.stylize(`[CustomBuffer]`, 'special')
    return label + 'length: ' + this.target.length
  }
}

util.inspect(new CustomBuffer('foo')) 
// 通常時はこうなるCustomBuffer { target: <Buffer 66 6f 6f> }
// Custom表示しているとこうなる [CustomBuffer]length: 3
```
[HomeKit対応仕様] Koogeek Wi-Fiスマート LED


![koogeek.jpg](https://qiita-image-store.s3.amazonaws.com/0/7883/77fdcc8d-0c7a-b9d5-960d-9cb55319049f.jpeg "koogeek.jpg")

<a target="_blank" href="https://www.amazon.co.jp/gp/product/B0721QN7YT/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B0721QN7YT&linkCode=as2&tag=tokorom-22&linkId=2d02e58e189b9fe7b31069cab2f5c71a">Koogeek Wi-Fiスマート LED HomeKit 電球 E26 8W 1600万色変色可能 調光調色</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=tokorom-22&l=am2&o=9&a=B0721QN7YT" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

## 主なサービス

|`HMServiceType`〜 | 説明 |
|--- | ---- |
|`Lightbulb` | 電球 |

## 主なキャラクタ

|`HMCharacteristicType`〜 | 説明 | フォーマット | 書き込み |
|--- | ---- | ---- | ---- |
|`PowerState` | 電源の状態 | bool | 可 |
|`Hue` | 色相 | float | 可 |
|`Saturation` | 彩度 | float | 可 |
|`Brightness` | 明るさ | int | 可 |

## 概要

HomeKitのサービス/キャラクタ的には [iOS 11 Programming](http://peaks.cc/tokorom/iOS11) で紹介されているPhilips Hueのランプ（カラー版）と同じです。
そのためHomeKitで操作できる事項もHueと全く同じで、電源のOn/Off、色（色相、彩度、明るさ）が変更可能です。

## Hueとどっちが良い？

まず、カラー版の値段はKoogeekのランプのほうがだいぶ安いです。またHueのようにブリッジが必要なく単体で動作するところもメリットになり得ます。
そのため、HomeKitをちょっと試したいくらいであればKoogeekのほうが圧倒的に優位かもしれません。

一方で、Hueのほうが [各種APIが充実している](https://www.developers.meethue.com/) など一日の長があります。
既にHueのブリッジを所持している、追加のランプはカラー版でなく安いホワイトグラデーションのほうで良いなどあればHueが優位になってきます。
また、計測情報などもなくどのくらいの差があるかはわかりませんが、単体で動作しWi-Fi通信を行うKoogeekのランプに比べ、ZigBeeで通信するHueのランプのほうが日々の電気代は安くなるかもしれません。

まずは試してみたいという感覚なのか、本格的に長期で使っていきたいのかなどによって選択は変わってくるかと思います。

参考: [スマートホーム×DIY 実践と展望 〜 2. 実践Homekitの暮らし](http://kudakurage.hatenadiary.com/entry/2018/01/02/094514)（実際に自宅でHueとKoogeekを一緒に利用しての所感が書かれた記事）

## ライトの電源をOnにするサンプルコード

ライトを点けたり消したりする程度の設定はホームアプリ上でGUIで設定できるわけですが、参考までに敢えてこれをプログラムで実現する場合は以下のようにします。

```swift
// Koogeek LightBulbのpowerStateを取得
let powerState = //< HMCharacteristicTypePowerState

// 電源をOnにする
powerState.writeValue(true) { error in
}
```

なお、ホームアプリからライトをOnにするシーンを作成しようとすると、じつはPowerStateの他にBrightness（明るさ）のキャラクタの設定も一緒に引っついてきます。
これは「好みのライトの状態でOnにする」ためには便利な一方、「前回点いていたライトの状態そのままで電源をOnにしたい」という用途には向きません。

上記コードだとシンプルに電源のOn/Offのみを操作しているため、前回のライトの色や明るさの状態そのままでOn/Offの切り替えだけが可能です。
こんなかんじにホームアプリではやりづらい、もしくはできない設定もプログラムからなら可能な場合があります。[HomeKit対応仕様 Philips Hue Dimmer スイッチ](https://qiita.com/tokorom/items/b1839b216d52141215c1)で紹介しているOn/Offのトグル設定もその１つです。

## まとめ

[iOS 11 Programming](http://peaks.cc/tokorom/iOS11) ではPhilips Hueを

> HomeKitプログラミングにトライするうえで最初に購入するものとして、おすすめしやすい製品の１つです

と紹介していますが、このKoogeekのランプは初期費用が圧倒的に安く、HomeKitプログラミングを試すという用途に絞れば、さらにおすすめしやすい製品と言えそうです。

## iOS 11 Programmingについて

この記事は「iOS 11 Programming」の**第12章 HomeKit入門とiOS 11における新機能**の中の**12.4.2 HomeKit 対応製品利用実例**への追加コンテンツ的位置付けにもなっています。
この製品がサポートするサービス（'HMService'）やキャラクタ（'HMCharacteristic'）の表など、全てこの書籍に合わせた形で掲載しております。

「iOS 11 Programming」にご興味のあるかたは是非、以下リンクからご参照ください。

<a target="_blank" id="purchase" style="text-decoration:underline; color:#1DA1F2;" href="http://peaks.cc/tokorom/iOS11">
iOS 11 Programming
<img src="https://s3-ap-northeast-1.amazonaws.com/peaks-images/project002_cover.jpg" height=200 />
</a>
[失敗]FreeBSDの蟹さん

蟹(REALTEK)さんのRTL8196が入ったターゲットが手に入ったので、ちょっと試してみましたがダメでした。これは調べた事のメモです。

RTL8196はRLX4181というLexraという会社が作ったMIPS系のCPUアーキテクチャを搭載したSOCです。LexraはMIPS社と喧々諤々やったみたいで、それにより両者とも消耗しLexraは表舞台から消えたようです。

REALTEKは2000年代前半からLexraのCPUを利用していたようです。最初にリリースされたものはRTL8181ではないかと思われます。

RTL8196はおそらく2000年代後半から提供されていて、当初はメモリ&Flashとも小さな機種で使われていましたが、2010年代中頃には結構大きなメモリ&Flashの機種でも使われるようになりました。

RTL8196はRTL8650B/8651Cの後継のようです。RTL8196はRTL8196BとRTL8196CとRTL8196D,RTL8196Eがあり、RTL8196Cにはレビジョンが二つあります。またRTL8197,RTL8198というチップもあるようです。

Lexraのインストラクションセットはmips1となっています。またいくつか存在しないインストラクションがあるということです。

ビルド環境に付いてはgcc/binutilにパッチをあてて使えるようにしていて、正式版にはマージされていないようです。

REALTEKが提供しているSDKに含まれるブートのプログラムはREALTEKオリジナル(?)のようでu-bootなどではありません。

このブートプログラムはかなり原始的で、圧縮の処理がないようです。このためファームウエアのイメージは自己解凍ELFとして作られています。イメージはこれをcvimgというツールで変換してkernelのファイルかrootfsのイメージとしています。


SDKに含まれる自己解凍プログラムはrtkloadというコードで、ifdefやコメントアウトが入り交じりかなりひどいコードです。

```
no sys signature at 0009E000!
no sys signature at 00020000!
Jump to image start=0x80500000...
decompressing kernel:
Uncompressing Linux... done, booting the kernel.
done decompressing kernel.
start address: 0x80003630
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
```

decompressing kernelからstart addressがrtkloadのコードになります。

OpenWRTでは書き直していて、lzma-loaderというものを使っているようです。

```
no sys signature at 0009E000!
no sys signature at 00020000!
Jump to image start=0x80500000...


OpenWrt kernel loader for Realtek rtl819xx
Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
Copyright (C) 2013 Roman Yeryomin <roman@advem.lv>
Decompressing kernel to 80000000... done!
Seems kernel_entry address is different from load address, so...
Starting kernel from 80003530...

[    0.000000] Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
```

Flashが8Mのターゲットなのでとりあえず圧縮はせず、生のカーネルを焼いてブートを試してみました。

ZRouterでビルドしてカーネルをターゲットに放り込むshスクリプトは下記のようになります。

```
#!/bin/sh

TERGET="Au_HomeSpotCube"

ENTRY=`readelf -h ${TERGET}_kernel | awk '/Entry point address/{print $4}'`
echo ${ENTRY}
./cvimg linux ${TERGET}_kernel.kbin ${TERGET}_kernel.rtl ${ENTRY} 30000
IMG=${TERGET}_kernel.rtl
echo "bin
put ${IMG}
quit" | tftp 192.168.1.6
```

当初Little Endianかと思ったらBig Endianでした。

これでちゃんと実行されているかは、mips/mips/locore.Sのstartに下記のコードを入れて確認しました。

```
        li      a0, 0xb8002000
        li      a1, 0x50
        sb      a1,0(a0)
```

これでシリアルコンソールにPの文字がでるので、とりあえずカーネルまで実行が移っている事が確認できました。

ところが、FDTのkobjの処理で、Undefined Exception happen.となってしまいます。現在のFreeBSDのmipsはmips32でコンパイルされているのですが、おそらく無いインストラクションとかがあるのかもしれません。

試しにmips1でビルドしてみたら、なぜかgccが吐いたコードにll/scが入ってasがそんな命令知らないとエラーになっていました。

kbojの問題でFDTの問題ではなかったのですが、FDTもendianが絡んできて、big endianでちゃんと動くのか不明です。

ちなみにUndefined Exception happen.はブートが出しているメッセージで、カーネル側がエクセプションハンドラを書き換える前にエクセプションが発生するとブート側に処理が戻ってしまいます。ブートのコードを見てみたら、エクセプションすべて同じメッセージでどのエクセプションが発生しているかも分かりません。

ノーマルのgccでは対応できないし、ましてやclangでは眼中にないとおもわれ、あきらめた方が良さそうです。

後日追記：蟹さんは最近MIPS 24KなSOCも作っているようです。またまた不思議なのはRTL8197DはLexraベースでRTL8197Fは24Kのようです。普通は、CPUアーキテクチャが違う製品を同じ製品ナンバーにしないとおもうのですが。。。
IntelliJでPythonのコードを書いていると怒られるので調べてみる

## 概要
IntelliJなどでPythonのコードを書いているとlen()関数などを使った場合に
「Unresolved reference ...」と怒られたりするので調べてみたメモ。

## 結論
Python SDKを作成して追加すると怒られなくなるようです。

```
File -> Project Structure -> Project -> Project SDK -> new
```

※ Macを使っているのでパスは「/usr/bin/python2.7」でいいみたい。


## 参考サイト
- [How do I get IntelliJ to recognize common Python modules?
](https://stackoverflow.com/questions/6102908/how-do-i-get-intellij-to-recognize-common-python-modules)
PostgreSQLのダンプについてメモ

## 概要
開発環境を作るために、テスト環境からダンプしたりする機会があるので、
ちょっとメモしておく。

## ダンプ
Postgresの場合、ロールとかの権限が移植できていないとアプリが接続エラーになるのでダンプする。
※ 特定のDBに関係するものだけでいいけど、やり方がわからないのでとりあえず全出力...

```sh:ターミナル
# ロールのみ
$ pg_dumpall -U postgres -h 127.0.0.1 --roles-only -p 5432 > ~/roles.sql

# 構造のみ
$ pg_dump -U postgres -h 127.0.0.1 -s -p 5432 --create example_db > ~/schema.sql

# データのみ
$ pg_dump -U postgres -h 127.0.0.1 -a -p 5432 example_db > ~/data.sql
```

## リストア

```sh:ターミナル
$ psql -U postgres -f roles.sql
$ psql -U postgres -f schema.sql
$ psql -U postgres example_db < data.sql
```

## Postgres操作 ＆ 権限

```sh:ターミナル
$ psql -d example_db -U hoge
¥d
¥d table_name
¥q
```

```sql:権限追加（とりあえず...)
GRANT ALL * ON TO hoge;
```

以上
JavaScriptのthisについて

## 概要
「[jBox](https://github.com/StephanWagner/jBox/blob/master/Source/jBox.js)」にバグがあってソースコードを解析していたら、
bindメソッドでfunction内のthisを変更している箇所があったので
調べた内容をメモしておく。

## 実装サンプル
簡単なコードを書いてみる。

```html
<html>
<body>

<script
  src="https://code.jquery.com/jquery-3.2.1.min.js"
  integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
  crossorigin="anonymous"></script>

<script>
(function(){
  // span要素作成
  var hoge = $('<span>');

  // clickイベント
  $(document).on('click', function(){
    this.text('aaaa'); // <- span要素
  }.bind(hoge));  
}(jQuery));
</script>

</body>
</html>
```

## 参考サイト
* [JavaScript の超便利なメソッド bind で this を制御する](http://foreignkey.toyao.net/archives/763)
* [JavaScript中級者への道【2. 4種類のthis】](https://qiita.com/matsuby/items/36ac4743d5eed2391116)
* [Function.prototype.bind()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
Gethを依存させてgaeにデプロイする際の注意点

# Common

Hexをaddressに変換したり、文字列にしたりする

`github.com/ethereum/go-ethereum/common`

は、使うことが出来る。

# Types

`"github.com/ethereum/go-ethereum/types"`

これはgaeでは使えない。
というのも、typesの中でimportされているsecp256k1を実装しているcryptoが`import "unsafe"`しているから。
unsafeに依存したgoファイルはgaeにデプロイ出来ない。

# 署名したい場合

goでsecp256k1を実装するか、nodeやpythonに署名させるしか無さそう。
ポスグレでローカルのデータベースをダンプしherokuの本番環境データベースにリストアする方法

ローカルのDBを本番環境にリストアしようとしてつまずいたのでメモ書きしておきます。
ネットでいろいろな方法が書かれていましたが一番シンプルな方法で実行できました。


#★実行環境
1. OS = windwos10
2. DB = PostgreSQL9.6
3. Heroku CLIはインストール済み
4. 実行日時 2018/01/01

#★実行手順
##1.ローカルのデータベースをダンプ
>pg_dump -U "ユーザ名" "データベース名" > db.dump

パスワードを指定していないので入力を求められる
※db.dumpはダンプファイル名

##2.HeokuのDB管理ページ本番環境のDBパラメータを確認
HerokuのDB管理URL => https://data.heroku.com

※対象アプリ => Settings => View Credentials の順にクリックするとパラメータを確認出来る。

##3.herokuにリストア
>psql -h 【Host】 -p 【Port】 -U 【User】 -d 【Database】 < db.dump 

パスワードを指定していないので入力を求められる（CredentialsのPasswordをコピペ）
※【Host】 【Port】【User】 【Database】 にはheroku Database Credentialsで表示されている値を入力すること。

以上です。
IBM Cloud Private V2.1.0.1 What's new 

2017年12月22日に，IBM Cloud Private V2.1.0.1がリリース。
新機能のメモ書き。

# 個人的に注目しているアップデート
- Kubernetesのバージョンが，1.7.3から1.8.3にアップグレードしたこと
- Dockerイメージのアクセス制御をimagePullSecret無しでできるようになったこと
- ロギングのパフォーマンス向上

# リリース情報
- リリース日
    - 2017/12/22
- Version
    - V2.1.0.1
- 参考ページ
    - 製品マニュアル: [What's new in version 2.1.0.1](https://www.ibm.com/support/knowledgecenter/en/SSBS6K_2.1.0/getting_started/whats_new_1.html)
    - インストールイメージ: [IBM Cloud Private Community Edition](https://hub.docker.com/r/ibmcom/icp-inception/)
    - [developerWorksブログ](https://www.ibm.com/developerworks/community/blogs/fe25b4ef-ea6a-4d86-a629-6f87ccf4649e/entry/IBM_Cloud_Private_version_2_1_0_1_is_now_available_for_download?lang=en)

# 新機能
- Kubernetes 1.8.3対応
- ロールベースアクセス制御
    - private image repositoryのイメージのアクセス制御 (imagePullSecret無し)
    - ref: [Managing images](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/manage_images/managing_images.html)
- Metering(利用量計測)
    - リソース利用状況の月次レポート対応
    - ref: [IBM® Cloud Private metering service](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/manage_metrics/metering_service.html)
- ネットワーク
    - VMware NSX-T 2.0との連携
    - ref: [Integrating VMware NSX-T 2.0 with IBM® Cloud Private](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/installing/nsx_setting.html)
- ストレージ
    - ICP k8sクラスター構成後でもGlusterFS構成が可能に
    - ref: [Adding GlusterFS storage to your IBM® Cloud Private cluster](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/manage_cluster/add_glusterfs.html)
- Cloud Foundry関連
    - [What's new in IBM® Cloud Private Cloud Foundry version 2.1.0.1](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/cloud_foundry/cf_whats_new.html)

# カタログに追加される製品パッケージ
- [IBM® InfoSphere® Information Server for Evaluation v11.7](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/featured_applications/ibm_iisee_eval.html)
- [IBM Spectrum Symphony](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/featured_applications/symphony.html)

# Technology Preview
- Federation
    - 複数クラスターの連携，共通管理サービス
    - ref: [Working with multiple clusters (federation)](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/manage_cluster/manage_federation.html)
- Vulnerability advisor
    - コンテナやprivate image registry内のイメージの脆弱性アドバイザー
    - ref: [Vulnerability advisor](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/manage_cluster/vuln_advisor.html)

# Fixes and improvements
- コンソールのリデザイン
- MariaDBを使ったHA構成の再起動
- RBACで使うLDAPとしてMS Active Directory連携
- 全てのプラットフォームおよびサポートOSに対するICP CLIの導入
- インストール中にモニタリングサービスが使うストレージクラスの指定
- Grafanaのデフォルトダッシュボードの追加
- ロギングサービスのパフォーマンス向上
- カタログサービスの安定性向上
- コンソール上でICPクラスターのバージョン確認
- Workloadを特定namespaceによるフィルタリング表示
- LDAP構成のシンプル化
- HA構成のためのディレクトリ構成サポート
- LDAPの構成とフィルターによるバリデーション機能の拡張
- サービスカタログ，リソースがアルファからベータVersionにアップグレード
機械学習勉強するとき、「なんちゃら行列」が多すぎて、毎回忘れるのでまとめた

## ゼロ行列

すべての要素がゼロの行列のこと。
`O(大文字のオー)`とか`0(ゼロ)`で表記されるケースが多い。

```math
O=\begin{pmatrix}
0 & 0 & 0 \\
0 & 0 & 0
\end{pmatrix}
```
## 正方行列

行数と列数が同じ行列。

```math
\begin{pmatrix}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9
\end{pmatrix}
```

## 単位行列

正方行列であり、且つ、対角成分に1、他は全て0である行列のこと。
`I(大文字のアイ)`とか`E`で表記されるケースが多い。

```math
I=\begin{pmatrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{pmatrix}
```

## 対角行列

正方行列であり、且つ、その対角成分以外がゼロである行列のこと。

```math
\begin{pmatrix}
5 & 0 & 0 \\
0 & 3 & 0 \\
0 & 0 & 8
\end{pmatrix}
```

## 逆行列

例えば、正方行列Aと正方行列Bと単位行列Iが以下の関係であるとする。

```math
AB=BA=I
```

このときBはAの逆行列と呼び、$B=A^{-1}$と表現される。

## 転置行列

対角線で成分をひっくり返した行列のこと。
例えば以下のような行列Aがあるとき、

```math
A=\begin{pmatrix}
1 & 2 & 3 \\
4 & 5 & 6
\end{pmatrix}
```

Aの転置行列は$A^{T}$と表現され、以下となる。

```math
A^{T}=\begin{pmatrix}
1 & 4 \\
2 & 5 \\
3 & 6
\end{pmatrix}
```

## 正則行列

逆行列が存在する行列のこと。

## 直交行列

※間違った記載があったので、以下修正いたしました！

転置行列と逆行列が等しくなる正方行列が直交行列です。

```math
\begin{pmatrix}
1\sqrt {3} & 1\sqrt {2} & -1\sqrt {6} \\
-1\sqrt {3} & 1\sqrt {2} & 1\sqrt {6} \\
1\sqrt {3} & 0 & 2\sqrt {6}
\end{pmatrix}
```

またこの行列の各列を表現する以下のようなベクトル$u_{1},u_{2},u_{3}$があるとすると、
いづれのベクトルも直交(内積がゼロ)する。

```math
u_{1}=\begin{pmatrix}
1\sqrt {3} \\
-1\sqrt {3} \\
1\sqrt {3}
\end{pmatrix},
u_{2}=\begin{pmatrix}
1\sqrt {2} \\
1\sqrt {2} \\
0
\end{pmatrix},
u_{3}=\begin{pmatrix}
-1\sqrt {6} \\
1\sqrt {6} \\
2\sqrt {6}
\end{pmatrix}
```

## 正値対称行列(または正定値対称行列)

固有値がすべて正の対称行列のことを正値対称行列という。
また、以下の行列も同時に覚えておこう。

|特徴|行列名|
|:--:|:--:|
|固有値がすべて正の対称行列|正値対称行列(または正定値対称行列)|
|固有値がすべてゼロ以上の対称行列|半正値対称行列(または半正定値対称行列)|
|固有値がすべて負の対称行列|負値対称行列(または負定値対称行列)|
|固有値がすべてゼロ以下の対称行列|半負値対称行列(または半負定値対称行列)|
|正値対称行列または半負値対称行列|定値対称行列|
PowerShellでのファイル操作Tips

# まえがき


* ちょっとしたファイル操作なら断然CUIだよね！
* ずっとcmdを使ってきたけど、PowerShellが出て久しいし、そろそろPowerShellに移行したいなあ
* Linuxコマンドとcmdコマンドをよく間違える

という人向けに、よく使うPowerShellのTipsをまとめました。

# 筆者的PowerShellの強い所

* aliasが充実 → cmdっぽいコマンド名もLinuxっぽいコマンド名も使える
* 結果をオブジェクトで持っている→パイプで渡してコピーとか移動とか開いたりできる
* 環境変数がドライブになっている

# 筆者的PowerShellの弱い所

* 起動が重い
* 結果が長い文字列だと見切れる
* 文字コードに一部対応してない（EUCとか）

# Tips

## PowerShellのコマンドの主なalias

| 正式名称 | cmdライク| Linuxライク |
|:--|:--|:--|
| Set-Location | cd | cd |
| Get-ChildItem | dir |  ls |
| Clear-Host |  cls |  clear |
| Move-Item  | move | mv |
| Copy-Item  | copy | cp |
| Get-Content| type | cat |
| Remove-Item | del / rmdir | rm |
| Get-Help| help |  man |

ちなみに、PowerShellのaliasには二種類ある（っぽい）

1. Get-Aliasコマンドで一覧化されているものはそれを使える。(例：Move-Item → mv)
2. Get-で始まるコマンドは、Get-を省略できる。(例：Get-Help → help)

## 結果がオブジェクトであることの活用

### サブフォルダにあるhogehogeって名前を含むファイルを全部C:\dest にコピー

\> ls -R \*hogehoge* | copy -D C:\dest

### サブフォルダにあるhogehogeって名前を含む拡張子がxlsxのファイルを全部開く

\> ls -R \*hogehoge*xlsx | ii

## 環境変数まわり

env:というドライブに各環境変数がフォルダで管理されている形になっている。
（完全にフォルダと同一ではなさそうなことに注意）

### 環境変数を参照する

$env:（環境変数名）
で参照できる。
ちなみに%～%では参照できません！

Pathを参照する場合
\> echo $env:Path

### 環境変数一覧を取得
\> ls $env:

### 環境変数のタブ補完

\> env:userp[TAB]
↓
\> Env:\USERPROFILE

### 結果のsplit表示

\> $env:Path.split(';');

C:\Program Files (x86)\Intel\iCLS Client\
C:\Program Files\Intel\iCLS Client\
C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\System32\Wbem
C:\WINDOWS\System32\WindowsPowerShell\v1.0\
C:\Users\Tosh\AppData\Local\Microsoft\WindowsApps

### ホームディレクトリ（%USERPROFILE%）へ移動

\> cd ~
もちろん環境変数の参照でも可能
\> cd $env:USERPROFILE

mavenのrepositoryディレクトリに移動したいなら

\>cd ~\\.m2\repository

## その他

### デフォルトのエクスプローラを開く

\> ii

### hogehogeというコマンドのオンラインヘルプを開く

\>man hogehoge \-o

## PowerShellではうまくいかないこと

### EUCファイル

EUCファイルのファイルを見るのはPowerShellでは無理っぽいです。
使うならcmdを使いましょう。

下記はcmdにて実行。
\>chcp 20932
\>type hogehoge.txt

# 終わりに

他に思いついたら足していきます
PostgreSQLで表示順番に連番を登録する

## 概要
小規模なメッセージ管理ツールで並び替えを行いたいとの要望があったので
連番を一括で登録する方法をメモしておく。

## 要件
* 並び替え対象：表示中のメッセージ（１０件程度）
* ドラッグ＆ドロップで並び替えたい
* 新規登録時に、指定がなければ1番目に登録したい
* 新規登録・更新時に指定した番号に差し込みたい

以上

## 設計
件数がしれているので、表示順番を変更する場合は、
シンプルに表示中のメッセージすべてに表示順番を振り直す仕様とする。

## 表示順番の振り直し方法
postgresで表示順番などのカラムに連番を設定する。

**対象テーブル(sample)**

* ID (id) ※ 主キー
* タイトル (title)
* メッセージ (message)
* ステータス (status) ※ 1:公開, 2:非公開
* 表示順番 (sort)
* 登録日時 (created_at)
* 更新日時 (updated_at)
* 論理削除フラグ (is_deleted)

**一括更新するSQL**

```sql
UPDATE
  sample AS t1
SET
  sort = rank
FROM (
  SELECT
    id,
    ROW_NUMBER() OVER (ORDER BY sort IS NOT NULL, sort ASC, updated_at DESC) AS rank
  FROM
    sample
  WHERE 
    status = 1 
    AND is_deleted = false
) AS t2
WHERE 
  t1.id = t2.id
;
```