OmniAICreator/Qiita-1.07M huggingface dataset:
Python、最速のbool→int

Pythonで`bool`型の値を`int`型に変換しようとしたとき、最速で処理できる書き方は何なのかと疑問に思った。
なので計測した。Python 3.6で検証。

```python3:検証用プログラム.py
import timeit

r = 3
n = 10 ** 7

def check(stmt):
	print('{}\t{}'.format(stmt, min(timeit.repeat(stmt, repeat=r, number=n))))

# False -> 0, True -> 1
check("x = False; int(x)")
check("x = True; int(x)")

check("x = False; (0, 1)[x]")
check("x = True; (0, 1)[x]")

check("x = False; [0, 1][x]")
check("x = True; [0, 1][x]")

check("x = False; { False: 0, True: 1 }[x]")
check("x = True; { False: 0, True: 1 }[x]")

check("x = False; 1 if x else 0")
check("x = True; 1 if x else 0")

check("x = False; x + 0")
check("x = True; x + 0")

check("x = False; x * 1")
check("x = True; x * 1")

check("x = False; x * x")
check("x = True; x * x")

check("x = False; x & 1")
check("x = True; x & 1")

check("x = False; x | 0")
check("x = True; x | 0")

check("x = False; x ^ 0")
check("x = True; x ^ 0")

# False -> 1, True -> 0
check("x = False; (1, 0)[x]")
check("x = True; (1, 0)[x]")

check("x = False; [1, 0][x]")
check("x = True; [1, 0][x]")

check("x = False; { False: 1, True: 0 }[x]")
check("x = True; { False: 1, True: 0 }[x]")

check("x = False; 0 if x else 1")
check("x = True; 0 if x else 1")

check("x = False; 1 - x")
check("x = True; 1 - x")

check("x = False; x ^ 1")
check("x = True; x ^ 1")
```

# 実験結果
検証に使ったPC。

- パソコンA : Windows 10
- パソコンB : CentOS 7

## パソコンA

| コード | False→0 | True→1 |
|:--|--:|--:|
| `int(x)` | 1.899 | 1.902 |
| `(0, 1)[x]` | 0.548 | 0.536 |
| `[0, 1][x]` | 0.998 | 0.874 |
| `{ False: 0, True: 1 }[x]` | 1.868 | 1.929 |
| `1 if x else 0` | <font color="red">0.367</font> | <font color="red">0.378</font> |
| `x + 0` | 0.521 | 0.537 |
| `x * 1` | 0.530 | 0.544 |
| `x * x` | 0.519 | 0.534 |
| `x & 1` | 0.761 | 0.776 |
| `x` &#124; `0` | 0.825 | 0.890 |
| `x ^ 0` | 0.854 | 0.908 |

| コード | False→1 | True→0 |
|:--|--:|:-:|
| `(1, 0)[x]` | 0.550 | 0.525 |
| `[1, 0][x]` | 1.005 | 0.989 |
| `{ False: 1, True: 0 }[x]` | 2.085 | 2.077 |
| `0 if x else 1` | <font color="red">0.377</font> | <font color="red">0.389</font> |
| `1 - x` | 0.559 | 0.574 |
| `x ^ 1` | 1.112 | 1.085 |

## パソコンB

| コード | False→0 | True→1 |
|:--|--:|--:|
| `int(x)` | 0.980  | 0.989 |
| `(0, 1)[x]` | 0.213  | 0.216 |
| `[0, 1][x]` | 0.481  | 0.485 |
| `{ False: 0, True: 1 }[x]` | 0.825  | 0.826 |
| `1 if x else 0` | <font color="red">0.151</font>  | <font color="red">0.159</font> |
| `x + 0` | 0.204  | 0.204 |
| `x * 1` | 0.203  | 0.209 |
| `x * x` | 0.202  | 0.206 |
| `x & 1` | 0.330  | 0.343 |
| `x` &#124; `0` | 0.336  | 0.356 |
| `x ^ 0` | 0.334  | 0.358 |

| コード | False→1 | True→0 |
|:--|--:|:-:|
| `(1, 0)[x]` | 0.213  | 0.216 |
| `[1, 0][x]` | 0.480  | 0.487 |
| `{ False: 1, True: 0 }[x]` | 0.825  | 0.826 |
| `0 if x else 1` | <font color="red">0.151</font>  | <font color="red">0.160</font> |
| `1 - x` | 0.205  | 0.198 |
| `x ^ 1` | 0.368  | 0.350 |


# 結論

**条件演算子`1 if x else 0`を使う方法が一番速かった。**
手軽さも考慮すると`x + 0`あたりも良さげ。`int(x)`が最も遅いのはちょっと意外。
変換処理部分を何回も使いまわすような場合や、別の計算機環境ではまた結果が異なるかもしれない。

あとQiitaに対する要望として、表中のコードのインライン表示の内部で縦棒(`|`)を使えるようにしてほしい。
Docker で Err http://httpredir.debian.org jessie InRelease

# エラー内容
```
Err http://security.debian.org jessie/updates InRelease              
  
Err http://deb.debian.org jessie InRelease                           
  
Err http://security.debian.org jessie/updates Release.gpg            
  Temporary failure resolving 'security.debian.org'
Err http://deb.debian.org jessie-updates InRelease                   
  
Err http://deb.debian.org jessie Release.gpg
  Temporary failure resolving 'deb.debian.org'

```

# 対策
ホストの接続するネットワークを切り替えること．

# 原因
ホストが接続しているネットワークがProxy等で邪魔していると推測される．
https://github.com/docker-library/rails/issues/43
Goで、ファイル更新後、自動でコンパイルするやつ

## Goファイルのコンパイルが面倒
Goは、ファイル更新の度に、コンパイルする必要があり、中々に面倒。
なので、sassみたいに監視してくれるやつを探していたら、良いものがあったので、メモしておく。

## 利用方法
### インストール
1. ライブラリインストール```go get github.com/codegangsta/gin```
2. インストール確認```gin -v```

### 使用
main.goのコンパイル後に、main.goに変更があればリコンパイル
```gin -i run main.go```

 


コンパイル後に、全ファイルの何かが変更されたら自動リコンパイル
(ginはWEBアプリケーションのコマンドラインツールなので、cssやjsの変更も監視対象に含まれます)
```gin -i --all run main.go```

## 参考
[codegangsta/gin](https://github.com/codegangsta/gin)
[【Go】作業効率アップ！ファイル監視 -> 自動コンパイル -> 自動実行の完全自動化](http://thoames.hatenadiary.jp/entry/2017/10/13/124133)
windowsMRでバーチャル生放送をするためのセットアップ

# はじめに

バーチャルYoutuberが、去年の終わりごろから急に流行ったのだけれども、僕にはあまりパっとしなかった。
もともとニコ生主だった僕はみゅみゅさんという方のバーチャル生放送を見てようやくはっと気がついて**『これは楽しそうだ』**と思って、急いでwindowsMR機を手に入れてセットアップをした。
セットアップをした当初は異常にいろんな課題があったのだけれども、これを書くに当たり、再セットアップをしたら、ものすごくすんなり行ったので、僕の使っている環境とは結構違うことになっていることに留意していただきたい。
約20分ほどでセットアップは終了する。(2018/1/24時点)

自分の動いているところは以下のアーカイブなどで見ていただければと思います。
https://www.youtube.com/watch?v=9dv3GDKVues

# 環境
ここではハードウェアとソフトウェアについて記述する。
### ハードウェア
- windows10機
- CPU corei7 6700
- mem 32G
- SSD 960G / HDD 2T
- GPU GTX1060 3G
- HMD windowsMR(Lenovo explorer)

#### Lenovo explorer を選定した理由
そもそも、viveやOculusを選定しなかった理由が大きく、ネガティブな要素でwindowsMR機の導入をした。

- viveのネガティブな要素
    - 電源が3つ必要
    - 自室が狭い（センサーの設置場所がない）
    - 机が大きくセンサーの影になる場所が多い
- Oculusのネガティブな要素
    - USB3.0ポートが3つ取れない
    - 外部センサーを設置する場所が机の上にない
    - 作業机により、影になる場所ができる

上記のような理由から、viveとOculusを買えなかった。
windowsMR、Lenovo explorer を買った理由としては、

- HDMIとUSB3.0ポートの2つがあれば良い
- Bluetoothドングルでコントローラーのペアリングが完了
- HMDにセンサーがついているので影になることがない
- 買った当時はwindowsMR機最軽量

蛇足が長くなってしまった。

### ソフトウェア
- Unity2017.3
- SteamVR 1.2.3
- FinalIK 1.6.1
- ニコニ立体ちゃん（アリシア）

ニコニ立体ちゃんは色々と版権フリーだったり、モデル改変OKだったりと、色々使いやすそうだなと思って、選んだ。 

## 環境構築
### ソフトウェアのインポート
何も考えず、アリシアのunitypackageを突っ込む。
AssetStoreから、SteamVRを検索してインポート。
AssetStoreから、FinalIKを検索して購入、インポート。
以下のようになる。
![2018-01-24_12h22_47.png](https://qiita-image-store.s3.amazonaws.com/0/11300/e2e781c9-de2a-1f18-2992-57aae9045a59.png)

### セットアップ
何も考えずに、ヒエラルキーのMainCameraを消す。
![2018-01-24_12h22_58.png](https://qiita-image-store.s3.amazonaws.com/0/11300/cac6a073-f01d-1260-d05c-99da1cb190b5.png)

SteamVRのなかの、CameraRigというprefabを、ヒエラルキーに置く。
Alicia_solidという、アリシアのモデルのprefabをヒエラルキーに置く。
CameraRigを親にするためにAlicia_solidをCameraRigの中に入れる。
FinalIKの中のVRIKを、Alicia_solidにアタッチ。
![2018-01-24_12h25_02.png](https://qiita-image-store.s3.amazonaws.com/0/11300/50acb6a5-ba1e-40c7-cf07-346f16a7e064.png)

何も考えず、

- 頭 (head)
- 右手首 (wList_R)
- 左手首(wList_L)

のボーンを複製。
![2018-01-24_12h26_25.png](https://qiita-image-store.s3.amazonaws.com/0/11300/3a3252e2-4110-d081-ca72-b9a376258e65.png)

何も考えず、複製したボーンを、CameraLigのcontroller(Left)、controller(right)、Camera(eye)、の子供にする。
![2018-01-24_12h31_23.png](https://qiita-image-store.s3.amazonaws.com/0/11300/75df9a1f-1778-5f57-4a66-f9e3f4a34719.png)

Alicia_solid のインスペクタから、VRIKをまで下にスクロールして、solverを開く。
今回使用するのは、Spine、LeftArm、RightArm なので、開く。
HeadTargetにCamera(eye)にいれた、headをつける。
LeftArmのTargetに、controller(Left)の中のwList_Lを設定。
RightArmのTargetに、controller(Right)の中のwList_Rを設定。
![2018-01-24_12h32_56.png](https://qiita-image-store.s3.amazonaws.com/0/11300/36eba99d-c592-a46c-80d9-077432652792.png)

これで、プレビューボタンを押すと、なんと割とちゃんと動く。（2018/1/24現在）
![2018-01-24_12h36_55.png](https://qiita-image-store.s3.amazonaws.com/0/11300/cfd0d3d3-9fb3-8600-3968-8985f06744ed.png)

以上です。

## 前は動かなかった
負け惜しみですが、2018/1/13日時点だと上記の方法ではきちんと動きませんでした。
どこかで、UnityXRを使った自前の環境も記事にしたいなと思っています。
今回1行もコード書いてないですが、**本当は載せる予定だったんですけど、載せる必要がなくなってしまった！！！**

Unityちゃんと触ったの久しぶりなので、わかんないことだらけなんですが、まぁ、ぼちぼちやっていきます。
**あと、よかったらチャンネル登録お願いします。**
https://www.youtube.com/channel/UC8bcQkG7UiUlxb3wcqrs86Q
主に生放送です。
ElasticBeanstalk 上の NodeJS が80番ポートへのアクセスを受けるまでの流れ

Elastic Beanstalk の NodeJS Platform でアプリケーションを作成すると
80 ポートでアクセスできる Web アプリケーションが簡単に出来上がる。

しかし NodeJS は 80 番ポートとは異なるポート 8081 番を Listen しており、
どういった経路で 80 番からのアクセスを受けているのか調べた。

## ポート転送の流れ (結論)

- iptables (PREROUTING)
    - 転送ポート: 80 --> 8080
- nginx (Proxy)
    - 転送ポート: 8080 --> 8081
- node (Server)

まず 80 番ポートへのアクセスを iptables が 8080 に変換し、
次に LISTEN 8080 の状態で起動している nginx が 8081 に転送、
次に LISTEN 8081 の状態で起動している NodeJS がリクエストを処理する。

一般的に 0 ~ 1023 番のポートは「well known port」と呼ばれ、Linux では root 権限がないとポートの Listen が出来ない。

root ユーザで `node` プロセスを動かすことは危険だが、
このようにポート転送することで一般ユーザで起動することが出来る。

ElasticBeanstalk では `node` プロセスは `nodejs` ユーザが起動していた。

## 上記の情報元

EC2 インスタンスに入って上記を調べた時のメモ。
関係のない出力内容は一部割愛。

### iptables の設定

80 で受けたアクセスを 8080 へ転送する NAT が作成されている。
PREROUTING チェインのため EC2 インスタンスがアクセスを受けた時にまず処理される。

```bash
$ sudo iptables -t nat -S PREROUTING -v
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -c 0 0 -j REDIRECT --to-ports 8080
```

### nginx の設定

8080 で受けたアクセスを 8081 に転送するプロキシ設定。
本題とは関係ないが通信の gzip 圧縮・展開もこの層で行われる。

```bash
$ cat /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
upstream nodejs {
    server 127.0.0.1:8081;
}

server {
    listen 8080;
    
    location / {
        proxy_pass  http://nodejs;
        proxy_set_header   Connection "";
        proxy_http_version 1.1;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

gzip on;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
```

### 関連プロセスの Port Listen 状況

node が 8081, nginx が 8080 をそれぞれ Listen していることが分かる。

```bash
$ sudo netstat -anp
tcp        0      0 :::8081                     :::*                        LISTEN      2969/node
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN      2977/nginx
```


### NodeJS 起動時の環境変数

`PORT=8081` とあるので `node` は 8081 を Listen する。

```bash
$ sudo od -S1 -An /proc/$(ps aux | grep ^nodejs | perl -anlE 'say $F[1]' | tail -1)/environ
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin:/opt/elasticbeanstalk/node-install/node-v6.11.5-linux-x64/bin
SHELL=/bin/sh
TERM=linux
EB_NODE_COMMAND=node app.js
USER=nodejs
PWD=/var/app/current
HOME=/tmp
SHLVL=1
UPSTART_INSTANCE=
LOGNAME=nodejs
PORT=8081
UPSTART_JOB=nodejs
NODE_HOME=/opt/elasticbeanstalk/node-install/node-v6.11.5-linux-x64
_=/opt/elasticbeanstalk/node-install/node-v6.11.5-linux-x64/bin/node
```

### NodeJS のデフォルトのアプリケーションソース

上記で分かるように環境変数 `PORT` には 8081 が設定されているため、
8081 ポートが Listen される。

```js:app.js
var port = process.env.PORT || 3000,
    http = require('http'),
    fs = require('fs'),
    html = fs.readFileSync('index.html');

var log = function(entry) {
    fs.appendFileSync('/tmp/sample-app.log', new Date().toISOString() + ' - ' + entry + '\n');
};

var server = http.createServer(function (req, res) {
    // 省略
});
```
PythonとTwitterAPIを使って過去のtweetを取得する


#Twitter認証キーの取得
環境設定や、認証キーの取得はこちらを参照してください。
[PythonとTwitterAPI使ってtweetしてみる](https://qiita.com/kolife/items/dce09f2d8c549dab48a8)

#タイムラインを取得する
各種認証キーをconfig.pyとして準備します。

```config.py
CONSUMER_KEY = "**************"
CONSUMER_SECRET = "**************"
ACCESS_TOKEN = "**************"
ACCESS_TOKEN_SECRET = "**************"
```

```timeline.py
# -*- coding:utf-8 -*-
import json, config
from requests_oauthlib import OAuth1Session

CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(CK, CS, AT, ATS)

url = "https://api.twitter.com/1.1/statuses/user_timeline.json"

params ={'count' : 100}
req = twitter.get(url, params = params)

if req.status_code == 200:
    timeline = json.loads(req.text)
    for tweet in timeline:
        print(tweet['user']['name']+'::'+tweet['text'])
        print(tweet['created_at'])
        print('----------------------------------------------------')
else:
    print("ERROR: %d" % req.status_code)

```

#実行結果
<img width="662" alt="スクリーンショット 2018-01-24 13.14.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/200669/1986abe2-ad26-a25f-3c6c-6ffaf52445fc.png">


(／▽＼） ハズカシ
Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい（PowerMockito編）

## 前書き

* [Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい](https://qiita.com/opengl-8080/items/a9e53d38c18a473e85b1)
* [Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい（黒魔術編）](https://qiita.com/deaf_tadashi/items/f145bc4645127b88281b)

もっと簡単に、だけどちょっとズルい方法で実現しました。
タイトルの通り、PowerMockitoを使います。

## コード

```java
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.junit.Assert.assertTrue;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.when;

@RunWith(PowerMockRunner.class)
public class MyTest {

    @Test
    public void test() {
        final Integer a = mock(Integer.class);
        when(a.intValue()).thenReturn(1, 2, 3);
        assertTrue(a == 1 && a == 2 && a == 3);
    }
}
```

## ちょっと解説

PowerMockitoはご存知のとおり、`final`クラスのモックをつくって、いろいろさせることができるライブラリです。
オートアンボクシングにより`Integer`オブジェクトとプリミティブの`int`を`==`で比較できます。
また、オートアンボクシングで`Integer#intValue`が呼ばれるので、このときに返す値を、PowerMockitoで順番に指定したのでした。
Javaでif (a == 1 && a‬ == 2 && a‬‬ == 3)でtrueを出力（見えない識別子編）

[Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい](https://qiita.com/opengl-8080/items/a9e53d38c18a473e85b1)に対するシンプルかつインチキなアンサー

```Java
public class AmazingEqualEqualOperator {
	public static void main(String[] args) {
		int a=1,a‬=2,a‬‬=3;

		if (a == 1 && a‬ == 2 && a‬‬ == 3) {
			System.out.println("true");
		} else {
			System.out.println("false");
		}
	}
}
```

目に見えないが変数に使える文字がある。

ここでは [双方向テキスト](https://ja.wikipedia.org/wiki/%E5%8F%8C%E6%96%B9%E5%90%91%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88)で用いられる制御文字 U+202C Pop directional formatting (PDF) を用いている。つまり、int a と a¥u202C と a¥u202C¥u202C の３種類の見た目が同じ変数を使い分けているだけ。

[Character.html#isJavaIdentifierStart(char)](https://docs.oracle.com/javase/jp/9/docs/api/java/lang/Character.html#isJavaIdentifierStart-char-)
[Character.html#isJavaIdentifierPart(char)](https://docs.oracle.com/javase/jp/9/docs/api/java/lang/Character.html#isJavaIdentifierPart-char-)
を用いることで、Javaの識別子の先頭に用いれる文字か、Javaの識別子の2文字目移行に用いれる文字かを判別することができる。
a == 1 && a == 2 && a == 3にするRubyスクリプト

Ruby2.5で書きました．

```irb
irb(main):001:0> a = [1,2,3]
=> [1, 2, 3]
irb(main):002:0> a.class.class_eval do
irb(main):003:1*   def ==(n)
irb(main):004:2>     self.shift == n
irb(main):005:2>   end
irb(main):006:1> end
=> :==
irb(main):007:0> a == 1 && a == 2 && a == 3
=> true
```
sprintf の記号の覚え方 ( 2進数 / 6進数 / 10進数 / 16進数 )

# %b = binary = 2進数

https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA

>バイナリ (binary) とは二進法のことであるが、コンピュータが処理・記憶するために2進化されたファイルまたはその内部表現の形式（バイナリデータ）のことを指して用いることが多い。

後者の意味で使うことが多いと思うが、バイナリという言葉自体が「二進」という意味である。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/725a7f1f-8a22-b805-c7e4-daa5a2170034.png)

## 例

```ruby
sprintf('%b', 30) # => "11110"
```


# %o = octal = 8進数


オクトパスと語源が同じっぽい。

>語源
>「オクテット」（8組との意味）は、ラテン語やギリシャ語の数字の「octo-」から来ている。

https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%AF%E3%83%86%E3%83%83%E3%83%88_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4324e5ed-2977-ad5b-7b98-4b6ecdd65e73.png)

[タコのキャラクター（魚） | かわいいフリー素材集 いらすとや](http://www.irasutoya.com/2013/01/blog-post_31.html)

## 例

```ruby
sprintf('%o', 30) # => "36"
```

# %d = decimal number = 10進数

「デシリットル」と合わせると覚えやすいかもしれない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e553be33-685c-c3a0-1672-fee1e07d88b9.png)



```ruby
[15] pry(main)> sprintf('%d', 30) # => "30"
```



# %x = hexadecimal = hex = 16進数

hexは六角形のこと。

- hexadecimal = hex + decimal
- 「アルファベット6個」+「10進数」

と考えると覚えやすいかもしれない。

```ruby
sprintf('%x', 30) # => "1e"
```








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Emacsの設定の共通化

普段使いのマシンはMacなんですがどこでもEmacsを動かしたい気持ちになります。（Windowsは除く）
簡単に解決できることだけど面倒だったのでやってなかった環境変数を読み込む対応を最近やったので備忘録

## Emacsで環境変数を読み込む
Emacs Lispで環境変数を読み出す手段があることはなんとなくわかっていたんですが調べてもすぐにヒットしなかったのでないモノ扱いしていた...
本腰入れて探し始めたら結構簡単に見つかった

```#lisp
(getenv ENV_NAME)
```
これだけだった...

自分のEmacs環境だと

```#lisp
;; Cask
;; cmigemo
```

これさえ設定しておけば問題なく動くことがわかったのでEmacsの設定を共通化した
便利便利(*´ω｀*)
DataTablesでカスタムソート

#ソースコード
<p data-height="361" data-theme-id="light" data-slug-hash="VyNKJM" data-default-tab="js,result" data-user="umerin" data-embed-version="2" data-pen-title="DataTables  custom sort" class="codepen">See the Pen <a href="https://codepen.io/umerin/pen/VyNKJM/">DataTables  custom sort</a> by umerin (<a href="https://codepen.io/umerin">@umerin</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

#メモ

`columnDefs`というオプションの`columns.orderDataType`に好きな名前を付けます。

```JavaScript
columnDefs : [
  { 
    'title' : '都道府県',
    'data' : 'prefectures',
    'targets' :  0,
    'orderable' : true,
    'orderDataType' : 'dom-jp'  //今回はdom-jpにしました。
  }
]
```

~~セルの情報ごとに数字かアルファベットを返すと、自動でソートしてくれます。~~
数字だと辞書順になってしまい、14より2が昇順で下になってしまうようです。
数字2ケタの文字列に変更しました。
<font color="Thistle">※最新バージョンは確認していません</font>

```JavaScript
$.fn.dataTable.ext.order['dom-text'] = function(settings, col)
{
  return this.api().column(col, {order:'index'}).nodes().map(function(td, i){

    //ここに書いてあげます。

  });
}
```

DataTablesの概要と使い方はこちらのQiita記事が参考になります。

- [DataTablesの使い方](https://qiita.com/nissuk/items/7ac59af5de427c0585c5)

こちらのブログを参考にさせていただきました。

- [DataTablesでオリジナルのソートを定義する](https://you84815.blogspot.jp/2017/07/datatables.html)
Kubernetes Meetup note - 2018.01.23 @San Jose 

# Kubernetes Meetup

Kubernetes 1.6 ---ぐらいから？1.9まで長きにわたって運用していた人のお話
----
https://branch.io/
ここのひと


 - Consider upgrade cycle twice a year.
 - Every 6 month upgrade operation
  - So that we need to have separate cluster.

 - Kubernetes Upgrade
  - Rolling update 
   - API operation doesn't work during upgrade, but the services keeps working.
 
 
 - AWS
  - Spot instance -- use Kubernetes.
  - Still don't use DB by Kubernetes.
  - multi AZ architecture 
   - consider deeply.
  
 - Operation
  - Auto restarts will save you
  - Set pod requests and limits and defaults.
  - oids trying to manage their own resource can fail
   # set java -Xmx and cgroups
   # nginx and worker_proccesses auto
  
 - Kubernetes command
  - "kubectl explain" 
   - excellent, save search by google, read a document.
  - "kubectl top"
  - Use "HorizontalPodAutoScaler"
   - but with caution.

 - Monitoring
  - Count unable to use container
  - Restart
   - restart is OK, to save the platform.
     However, too many restart is trouble.

 - I wish
  - Standardized log management.
  
  
-- HPA
-- CNI
-- CI/CD developers
-- istio  -- service mesh


----
要するに

 - リリースサイクルが速いので半年に1回アップデートを覚悟しろ
  - アップデートを前提とした設計にせよ
　- Read is better than Use
  - バージョンアップで動作が変わるとか割とあり得るので根幹を理解せよ、と言うことらしい
  
 - Rolling Updateは可能
 　- Multi Master
  - サービスは止まらないが時間が掛かるので考えてやれ
  - ステージングは別クラスタにせよ、NemaSpaceを分けて共存とかするな
  
 - AWS kubernetes
  - small spot は効果的
  - DBは依然として使わない
  - A-Z（複合プラットフォームって事？）はよくよく考えろ
   - 特定のインスタンスでしか動かせないDockerコンテナ集団になったら意味がない
   
 - Operation
  - kubeclt explain 
   - とても使える。下手なドキュメントを読むより良い
  - ReSchedulle, Rebalance はするな
   - 気持ちは分かるが、「揃える」のを目的でやるな
   
 - Monitoring
  - Auto restart will save you
   - 基本的にはWarningをあげつつもとりあえずrestart は仕込んでおけ
  - 起動「できない」コンテナの数を監視する
   - 起動できないコンテナがおおい = なんかおかしい
  - Restart は通知だけして仕込みはしておけ
   - 頻繁にRestart してるのは気付かないといけないから
   - でもRestartぐらいは割と当たり前

ってなことぽい
Django2 でユーザー認証（ログイン認証）を実装するチュートリアル

Django について日本語で読める書籍やチュートリアルはほとんどなく、あってもかなり古いバージョンだったりと寂しい状況です。

<a href="https://qiita.com/toku-hiro/items/5f7d8ad97477152f9d27">Django 2.0 の CRUD 操作が身につくチュートリアル</a>　に続き、Django 2.0 を学びつつ、アウトプットとしてチュートリアルを作ってみました。

簡単なブログアプリを作りながら、Djangoによるユーザー認証（ログイン認証）とユーザー登録の基本を身につけることができますので、お役立てください。

## Django2 でユーザー認証（ログイン認証）を実装するチュートリアル
<ol>
<li><a href="https://it-engineer-lab.com/archives/506">環境構築とアプリ雛形の作成</a><br>venv による仮想環境とDjango2のインストール、プロジェクトとアプリケーションの雛形作成。</li>

<li><a href="https://it-engineer-lab.com/archives/544">サインアップとログイン・ログアウト</a><br>このチュートリアルのメイン記事。Djangoのユーザー認証のコツ。ユーザー認証とユーザー登録の実装方法。</li>
<li><a href="https://it-engineer-lab.com/archives/737">ブログアプリへの実装</a><br>CRUDと認証のサンプルとして、ブログアプリを仕上げています。新しく学ぶことは少なく、実質的に「おまけ」。</li>
</ol>

といった構成になっています。


###Django ユーザー認証の特徴
<a href="https://docs.djangoproject.com/ja/2.0/misc/design-philosophies/#explicit-is-better-than-implicit">設計思想 - 暗黙よりもはっきり示した方がいい</a>にあるように、Djangoは自動生成等の「魔法」を最小限に留めています。

Laravel（PHP）のようにコマンドひとつで魔法のようにユーザー認証を導入できるフレームワークと比べると、Django のユーザー認証はあれこれ作る手間がかる印象を持つかもしれません。
Net::SFTPのdownloadメソッドは異常に遅い

# Net::SFTPとは

Rubyでリモートホストにファイルをコピーする一つの手段として、[Net::SFTP](https://github.com/net-ssh/net-sftp) というgemがある。

最小限の使い方は以下の通り。`gem install net-sftp`してから

```ruby
require 'net/sftp'

Net::SFTP.start('host', 'username', :password => 'password') do |sftp|
  # upload a file or directory to the remote host
  sftp.upload!("/path/to/local", "/path/to/remote")

  # download a file or directory from the remote host
  sftp.download!("/path/to/remote", "/path/to/local")
end
```

また、[Net::SSH](https://github.com/net-ssh/net-ssh)と一緒に使う場合は以下のようにもかける。

```ruby
require 'net/ssh'
require 'net/sftp'

Net::SSH.start('remote_host') do |ssh|
  ssh.sftp.download!("/path/to/remote", "/path/to/local")
end
```

pure ruby実装なので、速度が気になる。ファイル転送速度をrsyncやscpと比較してみた。

# 速度比較

対象とするファイルは２つ。136MBのテキストファイルと、約1GBのbzip2圧縮されたバイナリファイル。
２つのマシンでの転送速度を比較した。

## 使ったrubyコード

```ruby
require 'net/ssh'
require 'net/sftp'

Net::SSH.start('remote_host') do |ssh|
  ssh.sftp.download!(ARGV[0], ARGV[1])
  # ssh.sftp.upload!(ARGV[0], ARGV[1])
end
```

## 使用したrubyおよびrsync

- ruby 2.5.0
    - net-ssh 4.2.0
    - net-sftp 2.1.2
- rsync 2.6.9

## 結果

結果は以下の通り。それぞれ転送にかかった時間を表している。
rsyncは圧縮あり(-z)の場合となしの場合も比較した。

uploadの場合

|                  |   136MB text file |    1GB binary file |
|:-----------------|------------------:|-------------------:|
| `rsync -az`      |                6.7 |               12.9 |
| `rsync -a`       |                3.4 |               16.9 |
| `scp`            |                3.3 |               14.3 |
| Net::SFTP        |                5.4 |               21.3 |

downloadの場合

|                  |   136MB text file |    1GB binary file |
|:-----------------|------------------:|-------------------:|
| `rsync -az`      |                6.9 |               13.9 |
| `rsync -a`       |                4.9 |               16.7 |
| `scp`            |                3.4 |                9.7 |
| Net::SFTP        |               61.6 |              > 300 |


当然ながらrsyncの方がNet::SFTPより速いのだが、uploadの場合はSFTPがrsyncより極端に遅いというわけではない。
しかし、downloadの場合はSFTPが極端に遅い。

実装がどうなっているのかは確認していないが、Net::SFTPのdownloadを使う場合は気をつける必要がありそうだ。
CentOS 7 + python3 + Djangoの本番環境を動かしてみる


# 概要
いくつか参考資料見たけど2018/01時点の情報でまとまってる資料がない感じだったのでさっくり作業ログをまとめてみるテスト。
めんどいので、基本root作業で。


# Python3のインストール
```
yum install -y https://centos7.iuscommunity.org/ius-release.rpm
yum install -y python36u python36u-libs python36u-devel python36u-pip
```

# Djangoのインストール
```
pip3.6 install django
```

# 一般ユーザ(tetsuo)でDjangoの動作確認
```
su - tetsuo
django-admin.py startproject myapp
```

treeの出力結果

```
.
└── myapp
    ├── manage.py
    └── myapp
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py

2 directories, 5 files
```

# 一般ユーザで開発用サーバの動作確認

まずはおまじない。

```
su - tetsuo
vi ~/myapp/myapp/settings.py
```

以下の内容で編集

編集前

```
ALLOWED_HOSTS = []
```

編集後

```
ALLOWED_HOSTS = ["*"]
```

開発用サーバの起動

```
python3.6 myapp/manage.py runserver 0.0.0.0:8000
```

ブラウザで

```
＜サーバのグローバルIPアドレス＞：8000
```

にアクセス。

こんな画面になってたらOK。
![Kobito.2Ssap8.png](https://qiita-image-store.s3.amazonaws.com/0/35808/309112dd-f958-78d2-00b5-9dff89423428.png "Kobito.2Ssap8.png")


# 本番環境の準備

yumでmod_wsgiをインストール

```
yum install -y python36u-mod_wsgi
```

/etc/httpd/conf.modules.d/10-wsgi-python3.6.conf
に設定ファイルが出来ているので編集する。

```
vi /etc/httpd/conf.modules.d/10-wsgi-python3.6.conf
```

編集内容はこんな感じ。

編集前

```
<IfModule !wsgi_module>
    LoadModule wsgi_module modules/mod_wsgi_python3.6.so
</IfModule>
```

編集後

```
<IfModule !wsgi_module>
    LoadModule wsgi_module modules/mod_wsgi_python3.6.so
    WSGIScriptAlias / /home/tetsuo/myapp/myapp/wsgi.py
    WSGIPythonPath /home/tetsuo/myapp/
    <Directory /home/tetsuo/myapp/myapp>
    <Files wsgi.py>
    	Require all granted
    </Files>
    </Directory>
</IfModule>
```

apacheの実行ユーザが /home/tetsuo の下を見れるようにしておく

```
chmod -R g+rx ~tetsuo
chgrp -R apache ~tetsuo
```

apache再起動

```
service httpd restart
```

ブラウザで

```
＜サーバのグローバルIPアドレス＞
```

にアクセス。

こんな画面になってたらOK。
![Kobito.7uxcSm.png](https://qiita-image-store.s3.amazonaws.com/0/35808/08473173-cfa7-be8d-75db-7936ddc8e3ea.png "Kobito.7uxcSm.png")
R tips

# R おぼえがき

## 関数のプロット

### 学習曲線

ピロリとアンダーソンはa 、b の実測値をそれぞれ1.40
、0.24と求めた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99215/273f2c6b-2a58-e927-7eb0-78280e17c52c.png)


https://ja.wikipedia.org/wiki/%E5%AD%A6%E7%BF%92%E6%9B%B2%E7%B7%9A

```R
y <- function(x){ return(1.4/x^0.24) }
plot(y,0,100)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99215/64a353cf-4fcf-81ca-5226-b77eb931ed59.png)
[Swift] で a == 1 && b == 2 && c == 3 を真にする[おまけつき]

完全に乗り遅れたけど作りました

```swift
protocol Incrementable {
	mutating func increment()
}
extension Int: Incrementable {
	mutating func increment() {
		self = self + 1
	}
}

class A<T> where T: Incrementable, T: Equatable {
	
	var value: T
	init(_ value: T) {
		self.value = value
	}
	static func == (lhs: A<T>, rhs: T) -> Bool {
		defer { lhs.value.increment() }
		return lhs.value == rhs
	}
}

let a = A(1)

if a == 1 && a == 2 && a == 3 {
	print("俺が副作用だ！")
}
```

無駄にややこしいです！！

### おまけ

ジェネリクスなのでこんなこともできるよ

```swift
extension Character: Incrementable {
	mutating func increment() {
		if let c = unicodeScalars.first?.value {
			self = Character(UnicodeScalar(c + 1)!)
		}
	}
}

let c = A(Character("a"))

if c == "a" && c == "b" && c == "c" {
	print("俺も副作用だ！")
}
```
【PHP】豆知識：｛｝波括弧とfwrite()の魔法

### {}波括弧って何？

今回は{}波括弧を中心に説明します。
PHPerはこの{}波括弧を知っている人が少なくないと思います。
自分も変数をパースする時に、よく使っていますね。

こんな便利な｛｝をダイスキです。

### {}波括弧の記法

#### 基本記法

```php:sample_1

// 文字列の変数のパース
$gender_flag = '0';
echo "gender: { $gender_flag}";   // NG: gender: { 0}
echo "gender: {$gender_flag }";   // OK: gender: 0
echo "gender: {$gender_flag}";    // OK: gender: 0

// 配列の変数のパース
$gender_flag = array('male' => '0', 'female' => '1');
echo "gender: {$gender_flag[male]}";   // NG: NOTICE ERROR(undefined variable)
echo "gender: {$gender_flag['male']}"; // OK: gender: 0

// オブジェクトの変数のパース
$gender_flag = new stdClass;
$gender_flag->male = '0';
$gender_flag->female= '1';
echo "gender: {$gender_flag->male}";      // OK: gender: 0

// HTML画面の入力値による変数のパース
<input type="radio" name="gender_flag" value="{$gender_flag->male}" checked>Male
<input type="radio" name="gender_flag" value="{$gender_flag->female}">Female

```

#### 本当に弱点？

今回{}波括弧に変数を埋め込んだ文字列をcsvファイルに出力したいの場合は？

```php:sample_2

// 定義
$gender_flag = '0';
$str = "gender: {$gender_flag}";

// ログ出力
$handle = fopen("c:\\logs\\20180124.log", "a");
fwrite($handle, $str);
fclose($handle);

// ログファイル(20180124.log)を確認しましょう
gender: 　　　　             
//      ↑ [0]が消えた？

```

#### 現象解消
｛｝波括弧がダイスキなヒトにとって、｛｝波括弧が弱点あることを信じられないけど、原因調査しなきゃ、グーグルには｛｝波括弧に関して、こういうような情報がなかなか出ないな（汗～～）
。。。。なぜ。。。。
。。。。なんで。。。。
。。。。どして。。。。
。。。。（時間過ぎ）。。。。
。。。。（もしかして波括弧の原因じゃないと）。。。。
。。。。（時間過ぎ）。。。。
良く調べたら、こういう現象は｛｝波括弧のせいじゃなくて、PHPではfwriteを使う時、先頭の[0]がよく消えるらしくて、（汗～～）では、書き方を次にしたら、どうですか？

```php:sample_3

// 定義
$gender_flag = '0';
$gender_flag = sprintf("%s", $gender_flag);   // ←-追加行
$str = "gender: {$gender_flag}";

// ログ出力
$handle = fopen("c:\\logs\\20180124.log", "a");
fwrite($handle, $str);
fclose($handle);

// ログファイル(20180124.log)を確認しましょう
gender: 0　　　　             
//      ↑ [0]が出た！

```

結局：
やはり｛｝波括弧は完璧！！！



*参考*
[PHPマニュアル - 文字列](http://php.net/manual/ja/language.types.string.php)
[PHPでのCSV出力について](http://blog.asial.co.jp/721)
Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい（黒魔術編）

# 前書き

[Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい](https://qiita.com/opengl-8080/items/a9e53d38c18a473e85b1) の黒魔術編です。

# 動作環境
- Java8
- javassist 3.22.0-GA

# ロジック等

Javaなので（？）、if判定部分は別のクラスに抜き出します。
引数の値を書き換える訳ではないので、staticなメソッドにします。

```java
package study.javassist;

public class Judge {

	public static boolean judge(int a) {

		if (a == 1 && a == 2 && a == 3) {
			return true;
		} else {
			return false;
		}

	}

}
```

上記クラスを呼び出す、メインクラスは以下です。

```Java
package study.javassist;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

public class JudgeCall {

	public static void main(String[] args) {
		try {
			new JudgeCall().execute();
		} catch (NotFoundException | CannotCompileException e) {
			e.printStackTrace();
		}
	}

	private void execute() throws NotFoundException, CannotCompileException {
		ClassPool cp = ClassPool.getDefault();
		CtClass cc = cp.get("study.javassist.Judge");
		CtMethod method = cc.getDeclaredMethod("judge");
		
		String newJudgeMethod = "{return true;}";
		method.setBody(newJudgeMethod);
		
		cc.toClass();

		System.out.println(Judge.judge(1));
		System.out.println(Judge.judge(2));
		System.out.println(Judge.judge(3));
		System.out.println(Judge.judge(4));
	
	}
}

```

# 結果
```
true
true
true
true
```


# 解説
execute()メソッドの中で、study.javassist.Judgeクラスのjudgeメソッドの処理内容を書き換えて、常にtrueになるようにしています。

# やってみた感想
javassist、なんとなく避けてたけどシステムの基盤部分を扱う際に使えるのでは？
次に機会があったら検討してみる。
LogglyにKubernetes上のコンテナのログを送る


[ここが元ネタ](https://www.loggly.com/blog/send-kubernetes-logs-loggly/) です。Kubernetes上に構築した全てのコンテナのログを [Loggly] に送信します。

仕組みとしては fluentd コンテナ ([DaemonSet]) をデプロイして、各Agentノードの ``/var/lib/docker/containers/`` 以下のコンテナログを自動的に [Loggly] へ送信して貰う感じです。

## Loggly のカスタマートークンを発行する

多分、アカウントを作った時点で既に１つが発行済です。

* https://your-account-name.loggly.com/tokens

![tokens.png](https://qiita-image-store.s3.amazonaws.com/0/60131/bb9f707d-8f0c-38a4-0e03-08fa542f7b26.png "tokens.png")

## fluentd (daemonset) をデプロイする

次の [DaemonSet] をデプロイします。Image の実態は fluentd で、[k8s標準のfluentd Imageを元にしている](https://hub.docker.com/r/garland/kubernetes-fluentd-loggly/) ようです。送信先のURLだけ変えたそうな。

環境変数 ``LOGGLY_URL`` のところを各自の環境に合わせて変えて下さい。

* ``https://logs-01.loggly.com/inputs/{{ カスタマートークン }}/tag/{{ タグ }}``
    * {{ カスタマートークン }}
        * → 前述の発行済みトークンです
    * {{ タグ }}
        * → [好きなタグ名を付けます](https://www.loggly.com/docs/tags/)。送信されたログにこのタグが付与されるので [Loggly] 上でログを区分けできます

```yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: fluentd-es-v1.20
  namespace: kube-system
  labels:
    k8s-app: fluentd-es
    kubernetes.io/cluster-service: "true"
    version: v1.20
spec:
  template:
    metadata:
      labels:
        k8s-app: fluentd-es
        kubernetes.io/cluster-service: "true"
        version: v1.20
    spec:
      containers:
      - name: fluentd-es
        image: garland/kubernetes-fluentd-loggly:1.0
        command:
          - '/bin/sh'
          - '-c'
          - '/usr/sbin/td-agent 2>&1 >> /var/log/fluentd.log'
        env:
          - name: LOGGLY_URL
            value: "https://logs-01.loggly.com/inputs/{{ カスタマートークン }}/tag/{{ タグ }}"
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      # nodeSelector:
      #   alpha.kubernetes.io/fluentd-ds-ready: "true"
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

```

簡単ですね (^o^)


[Loggly]:https://www.loggly.com/
[DaemonSet]:https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
Tips_03:建築設備のエネルギーデータをpandasで処理するときの注意

# Pandasで処理するときの注意
## 建築設備のエネルギーデータ
一般に、建築設備におけるエネルギーデータは、カラム名が日本語でついます。
<img width="400" alt="SnapCrab_NoName_2018-1-24_11-41-27_No-00.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/148213/6239f080-a2b6-b04b-67ae-9c99c9995903.jpeg">


pandasで読み込む際も、下記のようにencoding = 'Shift-JIS'と指定してあげないとエラーを吐きます。

```py3:csv_read
# header:0行目,index_col:0行目,パースする日時:0行目
df= pd.read_csv(r'Data\\' + file + '.csv',encoding="Shift-JIS",header=0,index_col=0,parse_dates=[0])

```
 もちろん、時系列データとしてタイムスタンプもついていますので、それぞれ指定してあげないといけません。

詳しい処理は、省きますが、元のヘッダ情報を使用して、四則演算論理演算を行ったうえで、ファイルを作成するという処理を行いました。

## 問題
何も考えずに、下記のコードで出したら、エラーも吐かずに出力できました。が、よくよく中身を見ると文字化けパレードだったので、別システムで読み込みができずにエラーログを大量に出していました。

```py3:csv出力問題個所
df.to_csv(r'add_items_Result\\' + file + '.csv')
```

## 解決策

結果として、下記のように読込の時と同じように出力時もencoding = 'Shift-JIS'を指定してあげないとダメみたいです。

```py3:csv出力正常
df.to_csv(r'add_items_Result\\' + file + '.csv',encoding='Shift-JIS')
```

## まとめ

**文字コードって難しい。**
Excel 2016 > Error > 動作を停止しました > 対処: 別シートに移動して該当シートに戻る

```txt:動作環境
Excel 2016
Windows 10 Pro (64bit) Fall Creators Update適用済
```

### 症状と再現手順

Excelが「動作を停止しました」となる。

再現手順

1. ファイルを開く
2. カーソルキーを押す

### 対処 (根本解決ではない)

1. ファイルを開く
2. 別シートに移動する
3. 該当シートに戻る

同じ対処として以下に記載がある。
https://social.technet.microsoft.com/Forums/ie/en-US/257b033d-31c3-47dc-85f2-0c60c8b3f303/excel-arrow-keys-stop-working-not-scroll-lock?forum=excel
> Thursday, June 22, 2017 1:30 AM
> cyanice
> Excel randomly freezes the cell so I can't move it, but if I switch to another workbook and switch back, it works again.

...
>Tuesday, January 16, 2018 4:08 AM
>Phil Pas
and all of a sudden your keyboard input is seemingly ignored. Clicking over to a new tab (or creating a new tab if one doesn't exist) and then clicking back to the original tab does seem to restore cursor key functionality but that is a work around and not a resolution. 
 


やりとりでは根本解決は見つかっていないようだ。

### 効果がなかった対処

- クイック修復
- オンライン修復
- プリンタドライバの標準設定変更

同じファイルを別のPC上で開くと問題は起きない。

Office 2016になってから不安定になったという情報は散見している。
AppDelegateをSwift化の話

どうも、しゅです。（コメントで日本語に対して違和感がある箇所をご指摘いただければ嬉しいです。

昨日やっとAppDelegate.mをAppDelegate.swift化しました🎉 🎉 🎉 。コードの量はそんなに変わらないけど、全体が900行から700行になりました、AppDelegate.swiftはたった200行です。自分がAppDelegateを再構築する時、昔のAppDelegateを書きにくくなる原因がわかりました。

## AppDelegateの多重役割
AppDelegateがiOSプロジェクトを作った時点で自動に生成されました。Objective-C時代では、AppDelegateとともにmain.mのファイルもあります。そこでAppDelegateを初期化して、アプリを立ち上がります。

AppDelegateの役割を大きく分けると三つになります。

#### １. UIApplicationDelegateの実装
アプリがバックグラウンドからフォアグランドに入る時の行動、アプリが終了する前の行動、プッシュ通知が来たらどう処理するなどのことです。詳しくは[こちら](https://developer.apple.com/documentation/uikit/uiapplicationdelegate)です。

#### ２. ライブラリーとSDKの設定
基本的にはライブラリー、SDKなどのシングルトンインスタンスに変数を設定すること。ライブラリーはデファクトの値、SDKはアプリのキーなどの情報を設定します。

#### ３. URL遷移の処理
ウェブライトのリンク、プッシュ通知、他のアプリなどから、自分のアプリにどのViewControllerに遷移することです。

**複数の役を持ってるクラスのコード量が増えると、どんどん読みにくくなる。**

## 解決策

AppDelegateを機能によって三つの部分に分けて、各クラスが単一の役しか持ってません。

```swift
//url遷移の処理
enum URLSchemeType: String {
	case google = "google"
}
	
enum URLLinkType: String {
	case home = "h"
}

class AppDelegateURLHandler {
	func handleURL(url: URL) {
        //urlに対して、遷移先を決める
	}
}
```
```swift
//SDKとかライブラリーの設定
enum ConfigType {
	case debug
	case release
}

class AppDelegateConfig {
	let config: ConfigType
	let xKey: String //DebugとRelease時が違う
	init() {
		#if DEBUG
		config = .debug
		#else
		config = .release
		#endif
		switch config {
		case .debug:
		xKey = "debugKey"
		case .release:
		xKey = "releaseKey"
		}
	}
	
	//AppDelegateからこれを呼び出す、大体SDKの設定がDidFinishLaunch関数で。
	func setupDidFinishLaunch() {
		setupXSDK()
	}

	private func setupXSDK() {
		XSDK.shared.setKey(xKey)
	}
}
```
```swift
//詳しくは書かないけど、大体こんな感じです。
class AppDelegate {
	private let config = AppDelegateConfig() 
	private let urlHandler = AppDelegateURLHandler()
	/*
	UIApplicationDelegaetの実装
	*/
}
```

これではAppDelegateの仕事を他のクラスに任せることができました。コードも前より読みやすくなりました。🐒🐒🐒（ある程度Swiftのおかけです。）
Ubuntu/DebianでIntelマイクロコードの固定方法(再起動問題暫定対処)

Intelのマイクロコードが取り下げられLinusからボロクソいわれている昨今
Ubuntuにてマイクロコードを以前のバージョンで固定する方法を書きます。

1/29にリリースと聞く新しいマイクロコードが出るまでの繋ぎです。(なので対処)
問題があるようでしたら指摘いただければ取り下げます。

#バージョン確認

```
sudo apt-cache madison intel-microcode
```

20180108と旧バージョンが表示されるので旧バージョンをメモします。

#バージョン固定

```
sudo vi /etc/apt/preferences.d/cpu
+ Package: intel-microcode
+ Pin: version 旧バージョン番号
+ Pin-priority: 1001
```

#インストールバージョン確認

```
sudo apt-get update
sudo apt-get -s intel-microcode
```

-sでシミュレーションします。
インストールバージョンに旧バージョンが表示されれば成功です

#インストールするなら

```
sudo apt-get -y install intel-microcode
```

#Debianは
source.listをきちんと設定しないとそもそもインストールされません。
https://wiki.debian.org/Microcode
で設定方法が記載されております。
Debianはマイクロコードが問題のあるバージョンではないのですが
インストールされる状況であれば上記と同じ設定をして下さい

###もしAMDも固定しろと言われたら
濡れ衣ではありますが上からの命令があった場合
intel-microcodeをamd-microcodeにするだけです。
XSERVERにgit pushしようとしたらPermission deniedとか言われた対策

# 事象
`git push origin master`で怒られました。

```
$ git push origin master
XXXXX@XXXXX.xsrv.jp: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

一回gitbucketにoriginの向き先を変えて、戻したらこの有様です。

**なんでうまくいってるものを消してしまったのか……理解に苦しみます。**

地雷踏みの面目躍如といったところ。
~~会社のサーバーぶっ壊したこともあります~~


# 調査
ssh接続は問題なくできてました。

    ssh -i ~/keys/XXXXX.key -p 10022 XXXXX@XXXXX.xsrv.jp

パスワードを入力すれば繋がります。

しかしgitからはパスワードすら求められません。
どうやら、gitの方はローカルの`~/.ssh/id_rsa`を使ってつなぎに行こうとしているっぽい？
少なくともsshで利用している鍵を使っていないようです。

**まあ、sshでは指定してるけど、gitでは指定してませんもんね……そりゃね……。**

じゃあ、remote addで鍵を指定するようにしてやれば動くのか？

と思い返して[当時の記事](https://qiita.com/ragingalpaca/items/d6bab7b8d989de46f53e)を見返すも、それらしい記述はありません。
remoteのヘルプをざっと見たんですが見つからず（探すのが下手なだけかもしれないけど）。

（sshのデフォルト設定を変更すればいけるのか……？でもそこまでするほどじゃない）


# 妥協、もとい解決
**しかたないので、ローカルのid_rsaを利用してXSERVERに接続するようにしました。**
というわけで、XSERVERにssh接続するための鍵情報を更新します。

- [SSH設定 | レンタルサーバー【エックスサーバー】](https://www.xserver.ne.jp/manual/man_server_ssh.php)

手順としては

1. ローカルにid_rsaがなければ作成する（作成してあるので省略）
2. XSERVERにログイン後、設定したいサーバーのサーバーパネル -> SSH設定 -> 公開鍵登録・設定に移動する
3. `cat ~/.ssh/id_rsa.pub`で出てきた文字列を貼り付けて、設定

こんな感じになります。
登録するときの注意書きにも書いてありますが、それまで利用していた鍵情報が上書きされるので、上記のssh接続はできなくなります。
まあ、鍵のパラメータを消せば動くわけですが。

ssh -p 10022 XXXXX@XXXXX.xsrv.jp


# ２周目が発生したので根本的に解決を目指す
えっと、この記事のことをすっかり忘れてやらかしました。

XSERVERにssh接続できない→鍵情報作り直そう→git pushできない→鍵を変えよう→ググる→自分のQiitaが出てくる

と、綺麗にループに入ったので根本的解決を目指します。

そもそもsshでつなぎに行くときと`git remote`でsshを使うときの鍵が違うのがおかしいわけですよ。
という当たり前のことにようやく思い至れるくらい理解が進んだので、その方向で調べました。

- [gitにsshで接続（ポートと秘密鍵を指定) - まじめにゆいがどくそん](https://nilfigo.hatenablog.com/entry/20130705/1373000104)

普通に出てきました。
そうとわかって調べないと見つからないものってありますよね……（言い訳）

## 鍵情報を追記
なんかどっかに追記するらしいです。
`vi ~/.ssh/config`とかで以下を記述します。

```bash:~/.ssh/config
Host my.XXXXX.server
    Hostname XXXXX.xsrv.jp
    User XXXXX
    IdentityFile ~/app/tool/XXXXX.key
    Port 10022

```

鍵ファイルをなんでそんなところに置いてるんですかね、僕。
（理解が進んで不自然さに気付いた）

## 試しに接続
これをやると、１行目のHostで指定した名前（上の場合はmy.XXXXX.server）がエイリアスとして利用されて、`$ ssh my.XXXXX.server`でssh接続できるようになるらしいです。
試しにやってみます。

```bash:
$ ssh my.XXXXX.server
Enter passphrase for key '/Users/YYYYY/app/tool/XXXXX.key':
Last login: Sat May 12 08:43:00 2018 from 118-86-189-179.kakt.j-cnet.jp
[XXXXX@ZZZZZ ~]$ 

```

おー、つながった。

## pushしてみる
というわけでremoteを修正します。

```bash:
git remote set-url origin ssh://my.XXXXX.server/home/XXXXX/XXXXX.xsrv.jp/git/YYYYY.git

```

これでpushしたところ、configで指定したkeyのパスワードを求められて、無事に動作しました。
Dockerコンテナで時刻合わせはどうすればよいのか？

# 結論
- 時刻合わせはホスト側の責務
- コンテナ側ではおとなしくホスト側の時刻を使う

# 経緯
いろいろなサービスで，正確な時刻を供給することは大切だ．だからDockerでもNTPサーバを…あれ？ DockerコンテナでNTPサーバ動かしたら1サービス1プロセスにならないぞ (´･ω･`) どうしよう，と一瞬悩んだが，
[Docker コンテナの時刻同期(時刻データ)について](https://qiita.com/hirotaka-tajiri/items/f5900b236a005d7ffe58) 
という記事で書きつくされていた．

Cloudサービスならば提供者が時刻をキープしてくれているだろうが，自分がDockerデーモンを動かしている，つまりホスト環境をコントロールしているのであれば，そこにNTPサーバを入れて時刻合わせをする必要がある．
会社で少し盛り上がった Project Euler をやってみる 003

# Problem 003
```
13195 の素因数は 5, 7, 13, 29 である.
600851475143 の素因数のうち最大のものを求めよ.
```
---

# Answer 003 (Python)

(コメント欄でご指摘頂き、修正したものです)
修正前のものは下に残してあります。

```python3
class Problem3:

    NUM = 600851475143
    PRIME = []

    def main(self):
        i = 1
        while(i < self.NUM ** (1/2)):
            i += 1
            if i in self.PRIME:
                pass
            elif self.isPrime(i):
                self.PRIME.append(i)
            else:
                continue
            # 最後に割り切れて終わると答えが1になってしまうので以下2行追記
            # @shiracamus さんにご指摘頂きました
            if self.NUM == i:
                break
            if self.NUM % i == 0:
                self.NUM = self.NUM / i
                i = i - 1
        print(int(self.NUM))

    def isPrime(self, num):
        for i in self.PRIME:
            if i > num ** (1/2):
                return True
            if num % i == 0:
                return False
        return True


if __name__ == '__main__':
    p = Problem3()
    p.main()
```

## 修正前版

1種類の素因数しかない場合にうまく動作しない。
コメント欄で[@shiracamus](https://qiita.com/shiracamus)さんにご指摘頂き上記の修正版を用意しました。

```python3
class Problem3:

    NUM = 600851475143
    PRIME = set()

    def main(self):
        i = 2
        while(i < self.NUM ** (1/2)):
            if i not in self.PRIME and self.isPrime(i):
                self.PRIME.add(i)
            else:
                i += 1
                continue
            if self.NUM % i == 0:
                self.NUM = self.NUM / i
        print(int(self.NUM))

    def isPrime(self, num):
        for i in self.PRIME:
            if i > num ** (1/2):
                return True
            if num % i == 0:
                return False
        return True


if __name__ == '__main__':
    p = Problem3()
    p.main()
```
---

# (参考) Project Euler とは

[Project Euler](https://projecteuler.net/) はプログラミングで数学の問題を解くサイトです。問題は600問以上あるので、勉強に使うのも良し、楽しむのも良しです。

サイトに登録すれば、解答を submit することができ、その場であっているか判定してくれます。

また、問題だけであれば、日本語に翻訳された Wiki もあるのでそちらを見ながらやると捗ると思います。

[Project Euler(日本語訳)](http://odz.sakura.ne.jp/projecteuler/)
Windows 版 neovim でクリップボードが動作しない場合の対処（暫定策）

# TL;DR
* Windows 版 neovim では `win32yank.exe` を使うが，パスを認識していないことがある
* neovim の変数として管理している `$PATH` を参照せずに Windows の環境変数の `%PATH%` を参照しているらしい
* Windows の環境変数の `%PATH%` に Windows 版 neovim のパスを追加すると直る

正直あんまり調べてない

# Windows 版 neovim におけるクリップボード機能の実現方法
neovim におけるクリップボードが動作するか否かの判断は， `neovim/share/nvim/runtime/autoload/provider/clipboard.vim` を読めばどうなっているかが分かる．

```vim
function! provider#clipboard#Executable() abort
  if exists('g:clipboard')
   " 中略
  elseif has('mac') && executable('pbcopy')
   " 中略
  " 以下同様に各プラットフォーム対応の分岐が続く
  elseif executable('win32yank')
    let s:copy['+'] = 'win32yank -i --crlf'
    let s:paste['+'] = 'win32yank -o --lf'
    let s:copy['*'] = s:copy['+']
    let s:paste['*'] = s:paste['+']
    return 'win32yank'
  elseif exists('$TMUX') && executable('tmux')
    " 中略
  endif

  " 後略
endfunction
```

Windows 版 neovim においては， `nvim-qt.exe` と同じディレクトリ（`neovim/bin`）に `win32yank.exe` が存在するため， `executable('win32yank')` の返り値が `1` となってクリップボードが有効になるはずである．
しかし，この返り値が `0` となる場合があって，動作しないことがある．

# 発生状況の確認
状況としては以下

* `nvim-qt.exe` をダブルクリックして起動した場合，返り値は `1`
* `nvim-qt.exe` と関連付けたテキストファイルをダブルクリックして起動した場合，返り値は `0`
* しかし，どちらの場合も `!win32yank` が Windows 版 neovim 上から実行できる

# 解決方法
[ここ](https://github.com/neovim/neovim/issues/7000) や [ここ](https://github.com/neovim/neovim/issues/7377) の issue を見ると， neovim と windows の環境変数との間でパスの認識に差があることが伺える．
とりあえず， neovim の開発チームに問題は知られているだろうし， vim-script をちょっといじって直るような問題でもなさそうなので，暫定策で回避する（あんまり issue の議論を読んでいない）．
`executable('win32yank')` は windows の環境変数のパスを参照しているようなので，それに `neovim/bin` を追加する．
僕の場合は， `C:\Users\xxxxxxxx\AppData\Local\Program\Neovim\bin` を追加した．
ディレクトリ内のファイルをtarでまとめてウェブサーバーに投げつける方法


```shell
tar cvz * | curl http://hogehoge.com -X POST --data-binary @-   
```

カレントディレクトリをtarでまとめてリモートに投げます！

```php
$hoge = file_get_contents('php://input'); 
```

サーバ側はこんな感じで取得させます。
後は好きに料理してください！
micro:bit でモールス信号に挑戦

温度の通信ができたので気をよくして、他に何か通信したくて、なんと無謀にもモールス信号に挑戦しようと考えた。

## 今回のルール

- 通信文字はアルファベット(A - Z)
- 2 つのボタンでトン・ツーを表現する (A ボタン - トン、B ボタン - ツー)
- 文字と文字の間は振る
- AB ボタンを両方押したら単語の終了、送信

先に [Delphi でプロトタイプを作ってみた](https://qiita.com/CYonezawa/items/605af814d6bda78b50e3)

## むむ、配列の初期値設定は
変数の定義と、配列の値設定で 2 要素の設定はできるのだが、アルファベットの 26 個分設定したい。
結局ベースをブロックで作って、Javascript 側に変換して、コードを記述する方法で対応した。
![mbit01.png](https://qiita-image-store.s3.amazonaws.com/0/164551/74f27527-f74e-1f06-30b9-b4c3656fd27a.png)

## アルファベットとモールス信号の対応表
2 つの配列を作って、それぞれに文字を設定して、要素の番号で同期させるようにする

|モールス符号|アルファベット|  
|:------|:------|
|AB|A|
|BAAA|B|
|BABA|C|
|BAA|D|
|A|E|
|AABA|F|
|BBA|G|
|AAAA|H|
|AA|I|
|ABBB|J|
|BAB|K|
|ABAA|L|
|BB|M|
|BA|N|
|BBB|O|
|ABBA|P|
|BBAB|Q|
|ABA|R|
|AAA|S|
|B|T|
|AAB|U|
|AAAB|V|
|ABB|W|
|BAAB|X|
|BABB|Y|
|BBAA|Z|

## コードはこうなった

```javascript
let mWord: string[] = []
let mList = ""
let ｍAlpha: string[] = []
let mCount = 0
let mInWord = ""
input.onButtonPressed(Button.A, () => {
    mList = "" + mList + "A"
})
input.onButtonPressed(Button.B, () => {
    mList = "" + mList + "B"
})
input.onButtonPressed(Button.AB, () => {
    basic.showString(mInWord)
    radio.sendString(mInWord)
    mInWord = ""
    mList = ""
})
radio.onDataPacketReceived( ({ receivedString: mInWord }) =>  {
    basic.showString(mInWord)
})
input.onGesture(Gesture.Shake, () => {
    basic.showString(mList)
    for (let mCount = 0; mCount <= 25; mCount++) {
        if (mList == mWord[mCount]) {
            mInWord = "" + mInWord + ｍAlpha[mCount] + ""
        }
    }
    mList = ""
})
ｍAlpha = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
mWord = ["AB", "BAAA", "BABA", "BAA", "A", "AABA", "BBA", "AAAA", "AA", "ABBB", "BAB", "ABAA", "BB", "BA", "BBB", "ABBA", "BBAB", "ABA", "AAA", "B", "AAB", "AAAB", "ABB", "BAAB", "BABB", "BBAA"]
mList = ""
mInWord = ""
mCount = 0
radio.setGroup(1)
basic.forever(() => {
	
})
```

ブロックエディタ側だと結構複雑っぽかったが、コードはなんかシンプル

## 動かしてみた
先に、H(AAAA) シェイク E(A) シェイク L(ABAA) シェイク L(ABAA) シェイク O(BBB) シェイク で HELLO の単語は作ってあり、最後に ABボタンを押して転送するところだけ動画になっています。

![microMorse.gif](https://qiita-image-store.s3.amazonaws.com/0/164551/7ce41e6b-e7a3-db06-7d91-9b6be97cc9c8.gif)

## 余談
もくもく会で作っていたら、同じ無線グループ番号を使っていて、意図しない通信が発生するというハプニングが発生した
が、怪我の功名で、同じ無線グループ番号送信用 micro:bit を複数用意すれば、いろんなコントロールもできるんじゃね？的な発想に発展し、たぶんこれで micro:bit リモコンタンクを作ってくれるだろうと期待 ( 他力本願 )

なお、[次回のもくもく会は 2018年1月30日](https://microbit.doorkeeper.jp/events/69217) です！
iOSアプリがユニバーサルリンクから起動されているかどうかを知る

## やりたいこと

### よくある実装

よくあるユニバーサルリンクの実装は以下のように`application(_:continueUserActivity:restorationHandler:)`のなかで`userActivity`から情報を取ってきて起動処理をするものです。

```swift
extension AppDelegate {
  func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
      if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
          // ユニバーサルリンクの処理
        print(userActivity.webpageURL!)
      }
    }
    return true
}
```

アプリが起動していない状態でユニバーサルリンクをクリックすると、`application(_:didFinishLaunchingWithOptions:)`などの初期化処理の後にこの関数が呼ばれます。

### やりたいこと

しかし今回、どうしても`application(_:didFinishLaunchingWithOptions:)`の処理の中で中でユニバーサルリンク起動かどうかを知る必要がありました。

## `application(_:didFinishLaunchingWithOptions:)`の中でユニバーサルリンク起動かどうか知る

結論からいうと、`launchOptions`のキーに`.userActivityDictionary`を指定して、その中身から`userActivity`の内容がとれます。


```swift
class AppDelegate {
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
    if let userActivityDictionary = launchOptions?[.userActivityDictionary] as? [UIApplicationLaunchOptionsKey : Any],
    let userActivity = userActivityDictionary[.userActivityType] as? NSUserActivity {
      // application(_:continueUserActivity:restorationHandler:)のuserActivityと同じものが取得できる。
      if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
        print(" ユニバーサルリンクから起動。URL:\(userActivity.webpageURL!)")
      }
    }
    return true
  }
}
```

`userActivity`が`nil`かどうか判断すればユニバーサルリンク起動か知ることができます。
python-igraph がインストールできなかった際の対処法

Ubuntu 16.04 LTS に Cytoscape 向けのPython用ラッパー兼ユーティリティー集である py2cytoscape をインストールする際に python-igraph のエラーが発生しました。

```
  Makefile:2357: ターゲット 'libigraph.la' のレシピで失敗しました
  make[3]: *** [libigraph.la] エラー 1
  make[3]: ディレクトリ '/tmp/pip-build-a2e2flrv/python-igraph/tmp/igraph.ola6sjpv/igraph-0.7.1/src' から出ます
  Makefile:1377: ターゲット 'all' のレシピで失敗しました
  make[2]: *** [all] エラー 2
  make[2]: ディレクトリ '/tmp/pip-build-a2e2flrv/python-igraph/tmp/igraph.ola6sjpv/igraph-0.7.1/src' から出ます
  Makefile:480: ターゲット 'all-recursive' のレシピで失敗しました
  make[1]: *** [all-recursive] エラー 1
  make[1]: ディレクトリ '/tmp/pip-build-a2e2flrv/python-igraph/tmp/igraph.ola6sjpv/igraph-0.7.1' から出ます
  Makefile:382: ターゲット 'all' のレシピで失敗しました
  make: *** [all] エラー 2
  Could not download and compile the C core of igraph.
  
  
  ----------------------------------------
  Failed building wheel for python-igraph
```

調べたところ libigraph0-dev が必要とのことだったので、こちらをインストールしたところ正常にインストールできました。
```
$ sudo apt-get install -y libigraph0-dev
```

### 参考になった記事
***
[Failing to install python-igraph](https://stackoverflow.com/questions/28435418/failing-to-install-python-igraph
)