OmniAICreator/Qiita-1.07M huggingface dataset:
Golangで周期的に実行するときのパターン

(contextを使ってキャンセルするパターンを追記しました。)

周期的な実行のトリガーには`time.Ticker`を使用します。
例えば、`doPeriodically()`を100msec間隔で実行したいときは以下のようにします。

```go
package main

import (
	"log"
	"time"
)

func main() {
	log.SetFlags(log.Lmicroseconds)
	ticker := time.NewTicker(time.Millisecond * 100)
	defer ticker.Stop()
	count := 0
	for {
		select {
		case <-ticker.C:
			log.Printf("count=%d\n", count)
			count++
			doPeriodically()
		}
	}
}

func doPeriodically() {
	/* do something */
}
```
## 2018.2.16 追記
`defer ticker.Stop()` を追加しました
この例ではあってもなくても変わらないのですが、forループを何かの条件で抜けるようにしたときには必要になるので。

#参考
もっといい記事をこれ書いた後で見つけてしまいました。
[Goで一定周期で何かを行う方法](https://qiita.com/ruiu/items/1ea0c72088ad8f2b841e)

## contextによるキャンセル付き (2018.3.13 追記)

```golang
func doPeriodically(t time.Time) {
	/* do something */
}

func periodicLoop(ctx context.Context, interval time.Duration) {
	ticker := time.NewTicker(interval)
	defer ticker.Stop()
	doPeriodically(time.Now())
	for {
		select {
		case <-ctx.Done():
			return
		case t := <-ticker.C:
			doPeriodically(t)
		}
	}
}
```

mainでは以下のようにctxを作成して、periodicLoopに渡し、止めたいときにcancel()を呼びます。

```golang
func main() {
	...
	
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()
	go periodicLoop(ctx, 2*time.Second)

	/* call cancel() to stop */
}
```
[Laravel] Exception(エラー)でいつもの通知をさせるが、処理は続行させたいとき

ループ処理等で Exception はいつもの通知処理をしてほしいが、その次の処理は途切れずに続行してほしい場合に利用。所謂、半握り潰し状態にしたい時。

Laravel 5.5以降はこれでいける。

```php

try{

    // エラーが起こるであろう処理

}catch(\Exception $e){
    // キャッチしてレポート。でも処理は続行
    report($e);
}

```

それ以前のバージョンは、さらに以下の関数をカスタムヘルパーなりに突っ込めばいける。
ちなみに5.6のヘルパ関数を丸ごとポリフィルとして利用しているだけなので、バージョンアップで衝突しないように関数名を変えておくか、気づきとしてわざと衝突させるようにするとよい。

```php

use Symfony\Component\Debug\Exception\FatalThrowableError;
use Illuminate\Contracts\Debug\ExceptionHandler;

// Ver.5.4 以前向けのポリフィル
function report($exception)
{
    if ($exception instanceof Throwable &&
        ! $exception instanceof \Exception) {
            $exception = new FatalThrowableError($exception);
    }
    app(ExceptionHandler::class)->report($exception);
}

```


ちょい古めのLaravelでハンドラを直接呼び出してよいものか迷っていたところ、5.5のソースに出会い、海の向こうの人も同じ事考えていたんだなぁと思いました。おわり
[git] 指定されたファイルの、レポジトリ上での最終更新日時を表示する

必要になったので、[7年前にTumblrでメモしていたもの](http://maraigue-memo.tumblr.com/post/2335407043)を持ってきました。
なおそのときは、Twitterで@[limitusus](https://twitter.com/limitusus)氏と@[omasanori](https://twitter.com/omasanori)氏に助けていただきました。（[当該ツイート](https://twitter.com/omasanori/status/15351944759480320)）

# 実現方法

```sh
PAGER=cat git log --pretty=format:%cd -1 <FILENAME>
```

-   「`git log <FILENAME>`」で、`<FILENAME>`に対する更新ログを表示できる。
-   「`PAGER=cat`」がないと、環境変数`PAGER`に指定されたビューア（環境変数が未指定なら`less`？）で表示される。ここでは端末に表示させたいだけなので`cat`を指定。
-   「`--pretty=format:<書式指定文字列>`」で表示方法を指定。ここでは`%cd`（レポジトリ上の更新日時）のみ表示するようにした。
-   「`-1`」はログを新しいものから1件のみ（すなわち、最新のもののみ）表示するためのオプション。
ロック画面でモニターの電源が切れるのを防ぐ

# ロック画面でモニターの電源が切れる

「電源とスリープ」の設定で「次の時間が経過後、ディスプレイの電源を切る(電源に接続時)」を2時間にしていても、ロック画面になると約1分でモニターの電源が切れる。
※実際には電源自体は入っています

モニタがスリープするとロック画面が表示されるまでに少し時間がかかる(まぁ1秒程度ですが)
モニタが暗い間でも入力自体は生きているので、

0. テキトーにキーを叩く(この時点でパスワード入力画面になっている)
0. パスワードを入力する（ｶﾁｬｶﾁｬｯ…
0. Enter（ﾀｰﾝ!!

を画面復帰前にやってしまっても問題ないのですが失敗すると恥ずかしいので一応対策を調べてみました。

ズバリな記事がありました。
[Windows10のロック画面で1分経つとモニタ電源が切れる](https://social.technet.microsoft.com/Forums/ja-JP/885f32a6-344f-4e82-8c40-d55d33f84f43/windows101?forum=win10itprogeneralJP)

備忘がてら一応手順を残しておきます。

## 手順

0. レジストリの変更
    - キー：`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\7516b95f-f776-4464-8c53-06167f40cc99\8EC4B3A5-6868-48c2-BE75-4F3044BE88A7`
    - 種類：`REG_DWORD`
    - データ：`2`  
    ![レジストリ.png](https://qiita-image-store.s3.amazonaws.com/0/64415/5dc84192-bb87-1449-7313-6108097e4444.png)  
    ![レジストリ変更.png](https://qiita-image-store.s3.amazonaws.com/0/64415/ad3a3398-07b8-7020-6aa6-87dec167b7c2.png)
0. 設定変更
    - 設定→「電源とスリープ」→「電源の追加設定」(`コントロール パネル\ハードウェアとサウンド\電源オプション`でもOK)
    - 選択しているプランの「プラン設定の変更」→「詳細な電源設定の変更(C)」
    - 「ディスプレイ」→「コンソール ロック ディスプレイ オフのタイムアウト」
    - 設定：`1分`となっているところを`120分`ぐらいに変更
0. 変更前後
    - 変更前  
    ![レジストリ変更前.png](https://qiita-image-store.s3.amazonaws.com/0/64415/d0c9ab1a-1ccc-85b6-822b-eb7adbf28c00.png)
    - 変更後  
    ![レジストリ変更後.png](https://qiita-image-store.s3.amazonaws.com/0/64415/82ea16b1-113c-eb58-3a80-aa5c2b752d24.png)

## 雑記

「モニター 電源 スリープさせない」「スクリーンセーバー モニター 電源切れる」などでググってもそれらしき記事が見つからなかった。
ググるの得意な人にとってはググり方が悪いって話で済むかもしれません。

ちなみに上記の記事は「windows ロック画面 モニター」で見つかりました。
「ロック画面」というキーワードが大事だったのかな？
Python > string > replace() > [count]引数 > 先頭から count 個の old だけを置換します

```txt:動作環境
ideone (Python 3.5)
```

https://docs.python.jp/3/library/stdtypes.html#str.replace
> str.replace(old, new[, count])(原文)
文字列をコピーし、現れる部分文字列 old 全てを new に置換して返します。オプション引数 count が与えられている場合、先頭から count 個の old だけを置換します。

replace()のcount引数は使ったことがなかった。

https://ideone.com/4NkoVo

```py3
atxt = "a<LF>b<LF>c<LF>"
wrk = atxt.replace("<LF>", "\n")
print(wrk, end=":all\n")

wrk = atxt.replace("<LF>", "\n", 2)
print(wrk, end=":count=2")
```

```txt:run
a
b
c
:all
a
b
c<LF>:count=2
```

### Scipy Lecture notes

@ Scipy Lecture notes, Edition 2017.1
p19

`hello, world!`を`hezlo, world!`に変換する例が記載されている。

```py
In [55]: a.replace('l', 'z', 1)
Out[55]: 'hezlo, world!'
```
Golangでlogのタイムスタンプをマイクロ秒単位にする方法

#最初に結論

logのタイムスタンプをマイクロ秒単位にするには、log.SetFlags(log.Lmicroseconds) を実行しておけばよい。
https://golang.org/pkg/log/#pkg-constants


#例
## デフォルトのlog

```go
package main

import (
	"log"
	"time"
)

func main() {
	count := 0
	for {
		time.Sleep(100 * time.Millisecond)
		log.Printf("count=%d\n", count)
		count++
	}
}
```

```
$ go run a1.go
2018/01/22 10:58:34 count=0
2018/01/22 10:58:34 count=1
2018/01/22 10:58:34 count=2
2018/01/22 10:58:34 count=3
2018/01/22 10:58:34 count=4
2018/01/22 10:58:34 count=5
2018/01/22 10:58:34 count=6
2018/01/22 10:58:34 count=7
2018/01/22 10:58:35 count=8
2018/01/22 10:58:35 count=9
2018/01/22 10:58:35 count=10
2018/01/22 10:58:35 count=11
2018/01/22 10:58:35 count=12
2018/01/22 10:58:35 count=13
2018/01/22 10:58:35 count=14
```

## log.SetFlags(log.Lmicroseconds)した場合

```go
package main

import (
	"log"
	"time"
)

func main() {
	log.SetFlags(log.Lmicroseconds)　// <-- これを追加
	count := 0
	for {
		time.Sleep(100 * time.Millisecond)
		log.Printf("count=%d\n", count)
		count++
	}
}
```

```
$ go run a2.go
10:59:40.963792 count=0
10:59:41.064928 count=1
10:59:41.166225 count=2
10:59:41.267365 count=3
10:59:41.367690 count=4
10:59:41.468041 count=5
10:59:41.569157 count=6
10:59:41.670192 count=7
10:59:41.771581 count=8
10:59:41.871852 count=9
10:59:41.972876 count=10
10:59:42.074049 count=11
10:59:42.174963 count=12
```
AzureのBlob serviceでファイルの別名ダウンロード設定

# 実現したいこと
AzureのBlob serviceに保存されているファイルに対して，ダウンロードの際に付けられるファイル名を別途指定したい

## 前提
* AzureのBlob serviceには既にWebインターフェイスまたはAPIからファイルがアップロードされている（file1234という名前とする）
* このファイルをダウンロードすると manual.pdf という名前で保存されるようにする
* 2018年5月現在，APIを利用せずにWebインターフェイスによる操作でこれを実現することはできない

## ソースコード

```ruby
#!/usr/bin/env ruby

require "azure"  

Azure.config.storage_account_name = "myaccountname"
Azure.config.storage_access_key = "Rfof7hZYw7oj.......uKbI1nPGoUkc0yFvA=="

Azure::Blob::BlobService.new.set_blob_properties(
  "mycontainer", 
  "file1234",
  { blob_content_disposition: "attachment; filename=manual.pdf" }
)

```
**【2018.02.02 スペルミス修正済】attachement -> attachment**
なぜか割と普通に動いていました．(・_・;)

## 解説
- require "azure"  
Microsoftの提供するAzure関係のライブラリ．Rubyの標準ライブラリではないので，sudo gem install azure で入れるか，ちゃんとやるならGemfileに書いてbundle installするかしておく
- Azure.config....の2行  
Azureに接続するための情報．最初の myaccountname はAzureでBlob serviceを作成したときに付けた名前で，次の行はアクセスキー（秘匿すべき情報）．Storage accountのAccess keysメニューから取得できる
- Azure::Blob::BlobService.new.set_blob_properties  
対象となるコンテナ"mycontainer"の"file1234"という名前のブロブのプロパティを設定する．ここで指定した情報がHTTPヘッダのContent-Dispositionフィールドとなる．

## 検証環境 (2018.05.08)
|ライブラリ等     |バージョン|
|---             |---:     |
|Ruby            |2.3.1    |
|azure (ruby gem)|0.7.10   |
Herokuにpush時にdoes not appear to be a git repository出た時の対処

## 起きた問題

`git push heroku master`を実行した時、以下のようなエラーが出た

```
$ git push heroku master

fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.

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

gitがリモートのリポジトリを参照出来ていなかった。

vimで`.git/config`を見てみる。

```ini
[remote "origin"]
  url = https://hoge@bitbucket.org/hoge/hoge.git
  fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
  remote = origin
  merge = refs/heads/master
```

remoteの参照先にherokuがなかった。

## リモートにherokuを追加する。

vimで`.git/config`を直接編集してもいいし、コマンドで追加してもいい。

コマンドだと`git remote add heroku https://git.heroku.com/アプリケーション名.git`とする

上記コマンド実行後、再度`.git/config`を見てみると、remoteにherokuが追加されているのがわかる。

```ini
[remote "origin"]
  url = https://hoge@bitbucket.org/hoge/hoge.git
  fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
  remote = origin
  merge = refs/heads/master
[remote "heroku"]
  url = https://git.heroku.com/hoge.git
  fetch = +refs/heads/*:refs/remotes/heroku/*
```

上記が確認できたら、`git push heroku master`でpushができるようになります。
会社で少し盛り上がった Project Euler をやってみる 001

# Problem 001
```
10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.

同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.
```
---

# Answer 001 (Python)

よりよい解答を[@shiracamus](https://qiita.com/shiracamus)さんからコメント欄に頂いていますのでそちらをご覧頂くのが良いと思います！

```python3
import numpy as np

class Problem1:

    NUM = 1000

    def main(self):
        data = np.array([i for i in range(1, self.NUM) if self.isMultipleOf3Or5(i)])
        print(data.sum())


    def isMultipleOf3Or5(self, num):
        if num % 3 == 0: return True
        if num % 5 == 0: return True
        return False


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

# (参考) Project Euler とは

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

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

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

[Project Euler(日本語訳)](http://odz.sakura.ne.jp/projecteuler/)
tmux > link > スクロールできるように > C-b [ の後に > 上矢印キーやPage Up|Downなど | Qで終了

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.9を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
tmux 1.6-3.el6
```

tmuxでペインを分割している。
その場合、画面に収まりきらない表示に対してスクロールで戻ることができずに不便に思っていた。

以下を見つけた。
https://superuser.com/questions/209437/how-do-i-scroll-in-tmux
> answered Nov 11 '10 at 3:02
Dennis Williamson

`C-b`と`[`を入力することで、矢印キーやPage Up,Downキーによるスクロールができるようになる。
Steamに登録してみる(レガシー)

アカウント作って飛ぶ
http://steamcommunity.com/greenlight

「あなたの作品を投稿」リンク押して飛ぶ

今すぐ支払うを押す
飛んだ先で

下記の商品を買う
http://store.steampowered.com/app/219820/Steam_Greenlight_Submission_Fee/

![Greenlight.jpg](https://qiita-image-store.s3.amazonaws.com/0/175864/57c44032-5fed-5e08-2109-9746b3557f61.jpeg)
![名称未設定 1.jpg](https://qiita-image-store.s3.amazonaws.com/0/175864/cad1cedb-05ae-1f45-4384-7586ca513436.jpeg)
![名称未設定 2.jpg](https://qiita-image-store.s3.amazonaws.com/0/175864/da2e60f0-63ff-90f5-2461-8df45c1b45da.jpeg)
MySQLのdump

dump方法(InnoDB)

```shell
$ mysqldump -uroot  --all-databases --master-data   --single-transaction --flush-logs --events > dump
```


リストア方法

```shell
$ mysql -u root -p<password> < dump
$ echo 'flush privileges;'|mysql -u root -p<password>
```
2つ目のコマンドはユーザ情報を反映するのに必要です。
※dumpを流し込んだだけでは、ユーザ一覧には表示されるのですが、そのユーザでログインとかできないです。
Windowでgvimの起動時ディレクトリを変更する

Windowsでgvimをショートカットから起動すると
起動時のディレクトリが**インストール場所/vim80-kaoriya-win64**になってしまいます。
vimのエクスプローラから作業する際に不便だったので変更してみました。

色々方法はあるようですが一番簡単そうな方法が下記

- ショートカットアイコンを右クリックからプロパティ
- ショートカットタブの**作業フォルダー**を任意の値へ変更

↓ ではホームディレクトリを設定しています 
<img src="https://qiita-image-store.s3.amazonaws.com/0/122918/93b73eec-7a5f-34b1-dd5d-cee974acb2b6.png" width="240px">

# まとめ
結構簡単でした。
「会社法人等番号」を「法人番号」へと変換するRubyのコード

# コード
12桁の会社法人等番号の左端に一桁のチェックディジットを付加して13桁の法人番号を生成するためのRubyコード

```ruby
# 12桁の会社法人等番号，0から始まることもあるので文字列で与えることにする
n12 = "000012050002"

# 13桁の法人番号
n13 = (9 - n12.split("").map(&:to_i).map.with_index {|d, i| 
  i.odd?? d : d * 2 }.inject(:+) % 9).to_s + n12
# => "7000012050002" 
```

# 参考
- [JavaScript版変換コード](https://qiita.com/kawasaki/items/d124b51a4d75ebec33fb)
- [法人番号の定義に関するQiita記事](https://qiita.com/kawasaki/items/bfa9f0edc32c132eff30)
個人的よく思い出せなくなる用語集

あー、アレってなんていうんだっけ？と忘れた単語を書いていきます…。

# プログラミング

- 生存期間
    - scope(スコープ)
- 断片化
    - フラグメンテーション
    - デフラグ
- トランザクション
    - アトミック処理
    - 排他処理/排他制御
- アライメント
- 可変/mutable <-> 不変/immutable
- コンクリートなクラス
- シリアライズ
    - 逐次化
    - 直列化
    - marshalling マーシャリング
- ニーモニック
- 契約プログラミング
    - 事前条件 (precondition) 
    - 事後条件 (postcondition)
    - 不変条件 (invariant) 
- 第一級オブジェクト（ファーストクラスオブジェクト、first-class object）
- TTL(time to live)/生存期間
- case
    - case-sensitive/大文字・小文字を区別する
    - case-insensitive/大文字・小文字を区別しない
- ヒューリスティック（な値）
# サーバ
- リレーサーバ

# ゲーム

- Navigation Mesh
- Distance Field
- 被写界深度
Ubuntu で apt-get update が404になる問題

# apt-get update が404になり失敗する問題

Ubuntu 17.04 で apt-get update をしたところ、大量の404エラーが出てしまった。
その後、 apt-get install や upgrade も404で失敗する現象に遭遇した。

```bash
$ sudo apt-get update

Err:11 http://jp.archive.ubuntu.com/ubuntu zesty/universe Sources
  404  Not Found
Ign:12 http://jp.archive.ubuntu.com/ubuntu zesty/multiverse Sources
Ign:13 http://jp.archive.ubuntu.com/ubuntu zesty/main Sources
Err:14 http://jp.archive.ubuntu.com/ubuntu zesty-security/multiverse Sources
  404  Not Found
Ign:15 http://jp.archive.ubuntu.com/ubuntu zesty-security/universe Sources
Ign:16 http://jp.archive.ubuntu.com/ubuntu zesty-security/main Sources
Err:17 http://jp.archive.ubuntu.com/ubuntu zesty-updates/restricted Sources
  404  Not Found
Ign:18 http://jp.archive.ubuntu.com/ubuntu zesty-updates/universe Sources
Ign:19 http://jp.archive.ubuntu.com/ubuntu zesty-updates/main Sources
Err:20 http://jp.archive.ubuntu.com/ubuntu zesty-proposed/restricted Sources
  404  Not Found
Ign:21 http://jp.archive.ubuntu.com/ubuntu zesty-proposed/main Sources
Ign:22 http://jp.archive.ubuntu.com/ubuntu zesty-proposed/universe Sources
Err:23 http://jp.archive.ubuntu.com/ubuntu zesty-backports/multiverse Sources
  404  Not Found
...
```

# 解決方法

よく提示されている解決方法が `/etc/apt/source.list` を書き換えるというもの。
古いUbuntuを使っていると起こることがあり、 `/etc/apt/source.list` の中の `archive.ubuntu.com` `security.ubuntu.com` を `old-releases.ubuntu.com` に置換すれば直る。
`/etc/apt/source.list` は以下のコマンドで置換される。
なお、 `jp.archive.ubuntu.com` を使用している場合は `jp.` も消す必要があるという報告があった。

```bash
# バックアップ
$ sudo cp -p /etc/apt/sources.list /etc/apt/sources.list.bak
# 置換
$ sudo sed -i -e 's/archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
```

# これで解決しない場合

僕は上記の方法だけでは解決しなかった。
apt-get はパッケージ情報をキャッシュしており、update 時はこれを元にダウンロードしてくる。
なぜかこれがおかしくなってしまったようで `/etc/apt/sources.list` を編集しただけでは404が直らなかった。
以下のようにキャッシュを吹っ飛ばしたら直った。

```bash
$ sudo rm -rf /var/lib/apt/lists/*
```

参考： https://github.com/owncloud/core/issues/27775

# これでも解決しない場合

僕は上記の方法で解決したが、他に `software-properties-gtk` を使って `/etc/apt/sources.list` を再生成する解決方法を提示されている方がいたので参考までに。

[apt-get updateで404](https://qiita.com/Atsushi776/items/cb8d7d5bbce53d374a41)
SSL/TLS証明書「Let's Encrypt」でTLS-SNI検証を無効化によるエラー

# エラー内容
TLS-SNI検証を無効化による影響で、certbotコマンドでエラーが出るようになっていました。（2018年1月より）
[Let’s Encrypt ACME TLS-SNI検証を無効化](https://rms-digicert.ne.jp/digital-certificate-news/update-regarding-acme-tls-sni)

エラー内容は以下のような内容です。
```Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.
```

以下には正常動作したときの結果だけを記載しますが、他のエラーなど苦戦した詳細な実行結果の記事は別で記載していますので、良ければ参照してください。
[「Debian9」SSL/TLS証明書「Let's Encrypt」の導入記録](http://backleaflet.blogspot.jp/2018/01/debian9-ssltlslets-encrypt.html)

# 前提条件
[Debian9] で試しています（[Ubuntu] でも同じのはず）
[Apache] が事前にインストールされている
[Let's Encrypt] はドメイン名が必要（IP直での証明書の取得はできません）

# 実行手順
## Certbot クライアントのインストール
OSごとにインストールの方法が違います。今回は「Debian 8 (jessie)」に従いインストールします。（今回は「Debian 9 (stretch)」ですが、まだ資料がないので）
[Certbot クライアントのインストール - Let's Encrypt 総合ポータル](https://letsencrypt.jp/usage/install-certbot.html#Debian8)

リポジトリ [backports] から入手する必要なないようで、以下を実行。
```$ sudo apt-get install certbot python-certbot-apache```

これで [certbot] が使えるようになる。

## certbotで証明書の取得
本来なら以下のコマンドで証明書を取得するのだが、これだと[certbot]コマンドの初回でたずねなれる[メール設定]や[同意]の入力をすすめることができるが、肝心の証明書取得のところで、予期せぬエラーとなる。
```× $ sudo certbot --apache```

同じことを何度やっても以下のエラーとなる。
```Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.
```

これが、TLS-SNI検証を無効化による影響のようだが、以下のコマンドを実行すると証明書の取得ができた。ただしこれを実行する前にApacheを一時的にとめる必要がある。
```$ sudo certbot --authenticator standalone --installer apache
```

手順に従い操作を進めていくと証明書が無事取得できました。
```Congratulations! You have successfully enabled https://xxx.mydomain.com
```

# その他参考
実行時の他のエラーや、実行時の詳細記録、複数の証明書取得なども試しています。よろしければ参照ください。
[「Debian9」SSL/TLS証明書「Let's Encrypt」の導入記録](http://backleaflet.blogspot.jp/2018/01/debian9-ssltlslets-encrypt.html)
RustのLinux/Windows/macOS向け64bitバイナリをTravis-CIで生成する

# はじめに

この手の記事も3回目ですが、ようやくTravis-CIだけでLinux/Windows/macOSの64bitバイナリが生成できるようになりました。
Travis-CIのRustサポートも改善されてかなり少ない記述でできるようになっています。

# 必要なファイル

必要なファイルは`.travis.yml`と`.cargo/config`の2つです。

## `.travis.yml`

Travis-CIの`language: rust`で`rustup`も入るようになりました。
`before_script`で追加するのは`rustup target add`とwindows用のリンカとしてmingwのgccのみでOKです。

```yaml
language: rust

os:
  - linux
  - osx

before_script:
  - if [[ $TRAVIS_OS_NAME == "linux" ]]; then rustup target add x86_64-unknown-linux-musl; fi
  - if [[ $TRAVIS_OS_NAME == "linux" ]]; then rustup target add x86_64-pc-windows-gnu; fi
  - if [[ $TRAVIS_OS_NAME == "linux" ]]; then sudo apt-get -qq update; fi
  - if [[ $TRAVIS_OS_NAME == "linux" ]]; then sudo apt-get -qq install binutils-mingw-w64-x86-64 g++-mingw-w64-x86-64; fi

script:
  - if [[ $TRAVIS_OS_NAME == "linux" ]]; then cargo build --release --target=x86_64-unknown-linux-musl; fi
  - if [[ $TRAVIS_OS_NAME == "linux" ]]; then cargo build --release --target=x86_64-pc-windows-gnu;     fi
  - if [[ $TRAVIS_OS_NAME == "osx"   ]]; then cargo build --release --target=x86_64-apple-darwin;       fi
```

## `.cargo/config`

特定のターゲットに対して`cargo`が使うリンカを指定します。

```ini
[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
```

# 32bitビルドについて

前回までは32bitビルドも入れていたのですが、今回改めて試したところ32bitのwindowsだけうまくいきませんでした。
とはいえそろそろ32bitサポートは切ってもいいのではないかと思い64bit限定でTravis-CIに集約してみました。
ざっくばらんメモ_21：stackGAN-v2

###stackGan-v2をトライ
最近突然話題になり始めた[attnGAN](https://arxiv.org/abs/1711.10485)に関して、
そのコードをトライしようと思ったがまだ公開されていなかった。
そこで著者らの関連作である[stackGAN++](https://arxiv.org/abs/1710.10916)をとりあえずトライ。
こちらは[コード](https://github.com/hanzhanggit/StackGAN-v2)が既に公開されている。
ちなみにPytorch版。

AWS p2.xlarge Ubuntu 16.04環境, Pytorch=v0.3.0, torchvision=v0.2.0でトライ。
まずはdependencyをインストール。conda createで専用の環境を作成しインストール。
ここでpython2.7指定なのでpython3系でやってしまうと詰まるので注意する。
いずれも`pip install`でインストールした。

続いてデータのダウンロード。
1.で指定されているpreprocess済の[bird](http://www.vision.caltech.edu/visipedia/CUB-200-2011.html)データ用
char-CNN-RNN text embeddingsモデルを取得。
[ここ](birds.zip)からダウンロードできるが、
その中の`birds/train/char-CNN-RNN-embeddings.pickle`当たりがおそらくはそう。

次に2.で指定されている[bird](http://www.vision.caltech.edu/visipedia/CUB-200-2011.html)データそのもの
をダウンロード。

3.4.ので指定されているimagenetとLSUNデータはとりあえず今回はダウンロードせず。

これで準備が整ったはずなので、さっそくbirdsデータの学習スクリプトをトライ。
```
python main.py --cfg cfg/birds_3stages.yml --gpu 0
```
しかし早速エラーを得る。
```
IOError: [Errno 2] No such file or directory: u'../data/birds/text/002.Laysan_Albatross/Laysan_Albatross_0002_1027.txt'
```
見てみると、`text`というフォルダがたしかに存在せず、代わりに`text_c10`というフォルダがあったのでソフトリンクで
くっつけて対処（これで本当に良いかは不明）。

再度走らせると今度は無事学習が開始。
学習過程は`output`フォルダにログが存在するので、`tensorboard`を使って
モニタ出来る。

またpretrained modelを使って生成テストもできる。
生成できた画像の例。
![Black_Footed_Albatross_0001_796111_256_sentence2.png](https://qiita-image-store.s3.amazonaws.com/0/70838/c4398591-3bca-f547-e019-534e5938ffc6.png) ![Black_Footed_Albatross_0005_796090_256_sentence5.png](https://qiita-image-store.s3.amazonaws.com/0/70838/0b50f399-5c41-4f79-2395-18810d801b01.png)
![Black_Footed_Albatross_0005_796090_256_sentence6.png](https://qiita-image-store.s3.amazonaws.com/0/70838/e32d1b89-e807-ea5c-08d0-20bb2de7c017.png) ![Black_Footed_Albatross_0007_796138_256_sentence6.png](https://qiita-image-store.s3.amazonaws.com/0/70838/c5d62dbe-590f-1e4f-9e2b-6bffdbf00e5b.png)

色々複数体が合体しているものが多い印象で、良くニューロンの可視化でも似たようなことが起きている事から
今時のネットワークは単体とそうでないものの見分けがつかないのかもしれない。
【Swift】Xcode9.2でエラーが出るけどビルドに成功する(@IBDesignableを使った場合)

何回か出会いましたので自身の備忘録の意味も含めて投稿させていただきます。

下記の画像のようにエラーが出ているけれどもビルドには成功するという現象が起きます。

![error.png](https://qiita-image-store.s3.amazonaws.com/0/219965/99e012c6-ef0c-b9b3-c93d-6c0cdda6afc7.png)


原因は@IBDesignableを付与しているクラスでエラーになる可能性がある場合に
発生します。

以下のファイルでエラーの原因箇所の特定ができます。

```
Library/Logs/DiagnosticReports/IBDesignablesAgentCocoaTouch_XXXXXX.crash
```

```IBDesignablesAgentCocoaTouch_XXXXXX.crash
Thread 0 Crashed:
0   sztk.sample.NSCocoaErrorSample	0x0000000219779d3b UITextViewPlus.changeFontSize() + 763 (UITextViewPlus.swift:26)
1   sztk.sample.NSCocoaErrorSample	0x000000021977980a UITextViewPlus.init(frame:textContainer:) + 234 (UITextViewPlus.swift:16)
2   sztk.sample.NSCocoaErrorSample	0x00000002197798ba @objc UITextViewPlus.init(frame:textContainer:) + 106
3   com.apple.UIKit               	0x0000000105a3e7d0 -[UITextView initWithFrame:] + 58
...
```

<br>

原因のファイルは以下です。


```UITextViewPlus.swift
@IBDesignable
class UITextViewPlus: UITextView {
    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
        changeFontSize()
    }
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        changeFontSize()
    }
    
    private func changeFontSize() {        
        let ratio = UIScreen.main.bounds.size.width / 320
        
        // *****nilになる可能性がある**********
        self.font = UIFont(
            name: (self.font?.fontName)!,
            size: (self.font?.pointSize)! * ratio
        ) 
    }
}
```

<br>

以下のようにnilになる可能性を排除するとエラーは解消されます。

```
private func changeFontSize() {

    guard let font = self.font else { return }

    let ratio = UIScreen.main.bounds.size.width / 320
    self.font = UIFont(
        name: font.fontName,
        size: font.pointSize * ratio) ?? font
}
```

どうせならビルドエラーになって欲しいですね。。。
mysqlバックアップ、復元

※　俺的メモ

GCPなどで画像を管理している場合、連番がおかしくなるので、
DBを戻した後、IDに大きめの数字を入れて、数字を変更する。


#リモートサーバーのバックアップ

```

mysqldump --default-character-set=utf8mb4 -uroot -pyour -h 199.999.999.999 --all-databases | gzip > gcp.sql.gz

```


#バックアップ

db を db.sql という名前で保存
(文字コードはutf8mb4に指定)

```

mysqldump --default-character-set=utf8mb4 -u root -p db > db.sql

```

#復元

復元する時は文字コード関係ない

```

mysql -uroot -p db < db.sql


```

#もっと詳しい手順


[ 復元したいサーバー ]

1 バックアップを戻すときは 現在ある

・infomation_schema
・mysql
・perfomance_schema
・phpmyadmin

などのデータベースをすべてエクスポート moto.sql として保存

[ 復元したいファイル fukugen.sql.gz を アップロード]
[ 復元したいファイル moto.sql を アップロード]

ファイルの準備完了。
これよりバックアップを復元していく。


##sql.gz ファイルを解凍しつつ、インポートしていく
zcat fukugen.sql.gz | mysql -uroot -p


##同名ファイルが上書きされているといけないので、先に取得しておいた moto.sql を復元。

mysql -uroot -p love-db.sql.gz

mysql dump エラーが発生したら注意。ｌ
https://oranie.hatenablog.com/entry/20101022/1287738129
Unity(C#)でC++で作成されたDLLを使用する基本的な方法

# 前提
開発環境：Unity 2017 + Visual Studio Community 2017
言語：Unity C#, C++

# DLLを作成するためのVisual Studioプロジェクトを作成する
今回はC++を使用してDLLを作成するため、
「ファイル」「新規作成」「プロジェクト」ででてくるウィンドウの「ダイナミックリンクライブラリ(DLL)」
を選択する。
自身の環境ではDllForDebugというプロジェクト名で行いました(名前やソリューション等の説明は割愛)。

# ソースファイルの編集
「プロジェクト名.cpp」というファイルがソリューションエクスプローラにて確認できるので、そこに必要な関数を書き込む。
自身のソースファイルを一部抽出したので不自然な関数ですが、int型の4を返す関数「add_b」を定義しています。

```C++:DllForDebug.cpp
#include "stdafx.h"
#include "iostream"

// 後述するヘッダーファイル
#include "DLLForDebug.h"

// 4を返す関数
int add_b()
{
    int b = 4;
    return b;
}
```

#  ヘッダーファイルの設定
ヘッダーファイルを新規作成し、以下のように記述する。
今回はプロジェクト名と同じファイル名にしています。

```C++:DLLForDebug.h
extern "C"
{
    __declspec(dllexport) int add_b();
}
```

# ビルド
プロジェクトのプロパティ、もしくはデフォルトの場合上部にプラットフォームを選択する場所があるので、64bitにしてビルドする。
ここはUnityの環境に合わせる必要がある。

# Unity側の設定
今回Unityで簡単に動かすためのプロジェクトを新規作成する。
AssetsフォルダにビルドしたDLLとC#スクリプトを作成する。
SceneにObjectを作成(自分の場合Empty)し、先述のC#スクリプトを追加して実行時に走るようにする。
自身の環境の場合、「RunDLL.cs」という名前にしました。

```c#:RunDLL.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// IntPtr型を使用するのに必要
using System;

// Dllの読み込みに必要
using System.Runtime.InteropServices;

public class RunDll : MonoBehaviour
{
    // Dll内の関数を宣言
    [DllImport("DllForDebug")]
    private extern static int add_b();

    // Use this for initialization
    void Start()
    {
      Debug.Log(add_b())
    }

    // Update is called once per frame
    void Update()
    {

    }
}
```
# 結果
Consoleの場所に4というログが出ているはずです。
C++で作成した配列を返すDLLをUnity(C#)で適切に受け取る

# したいこと
C++で作成した、配列を返すDLLをUnity(C#)で受け取る方法を考察します。

# 前提
開発環境：Unity 2017 + Visual Studio Community 2017
言語：Unity C#, C++

# 使用するDLL
C++で以下のコードで生成されたDLLを使用します。
C++の配列の使い方が間違っている気がする汚いコードです。

```C++:DllForDebug.cpp
#include "stdafx.h"
#include "DLLForDebug.h"
#include "iostream"
// グローバル変数
int* arr = new int[5];
float* arr_float = new float[5];
char* arr_char = new char[5];
// {0, 1, 2, 3, 4}のint型配列を返す
int* ReturnIntArray()
{
    int i = 0;
    for (i = 0; i <= 4; i++)
    {
        arr[i] = i;
    }
    return arr;
}
// {0, 0.75, 1.50, 2.25, 3}のfloat型配列を返す
float* ReturnFloatArray()
{
    int i = 0;
    for (i = 0; i <= 4; i++)
    {
        arr_float[i] = i * 0.75;
    }
    return arr_float;
}
// {a,i,u,e,o}のchar型配列を返す
char* ReturnCharArray()
{
    arr_char[0] = 'a';
    arr_char[1] = 'i';
    arr_char[2] = 'u';
    arr_char[3] = 'e';
    arr_char[4] = 'o';
    return arr_char;
}
```

```C++:DllForDebug.h
extern "C"
{
    __declspec(dllexport) int* ReturnIntArray();
    __declspec(dllexport) float* ReturnFloatArray();
    __declspec(dllexport) char* ReturnCharArray();
}
```

# Unity上での動作
以下のソースファイルを使用して、Unity上での実行を確認しました。
ここで使用する「Marchal.Copy」についての詳細は、[MSDN](https://msdn.microsoft.com/ja-jp/library/ms146635(v=vs.110).aspx)を参照してください。

```C#:RunDLL.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// IntPtr型を使用するのに必要
using System;
// Dllの読み込みに必要
using System.Runtime.InteropServices;
public class RunDLL : MonoBehaviour
{
    // Dll内の関数を宣言
    [DllImport("DllForDebug")]
    private extern static IntPtr ReturnIntArray();
    [DllImport("DllForDebug")]
    private extern static IntPtr ReturnFloatArray();
    [DllImport("DllForDebug")]
    private extern static IntPtr ReturnCharArray();
    
    // Use this for initialization
    void Start()
    {
        int i = 0;
        // 格納したい配列先
        int[] arrInt = new int[5];
        float[] arrFloat = new float[5];
        char[] arrChar = new char[5];
        // 配列の先頭ポインタをIntPtr型の変数にそれぞれ格納する
        IntPtr ptrInt = ReturnIntArray();
        IntPtr ptrFloat = ReturnFloatArray();
        IntPtr ptrChar = ReturnCharArray();
        // コピー
        Marshal.Copy(ptrInt, arrInt, 0, 5);
        Marshal.Copy(ptrFloat, arrFloat, 0, 5);
        Marshal.Copy(ptrChar, arrChar, 0, 5);
        // Log
        for (i = 0;i <=4; i++)
        {
            Debug.Log(arrInt[i]);
            Debug.Log(arrFloat[i]);
            Debug.Log(arrChar[i]);
        }
    }
    // Update is called once per frame
    void Update()
    {
    }
}
```

#結果と問題
Consoleを確認すると、int型とfloat型は正確な情報を手に入れることが確認できます。
何故かchar型が上手くいかない問題…
難しいと思っていたmacのVagrantのアンインストール、再インストールが簡単だった話

#突然vagrantがupできなくなった

多分アップデートしたのが原因かと思います
いろいろ調べてみたのですが、再インストールしたほうがいいと思い再インストールの方法を調べることにしました

(いいから早く教えろって人は１番下のまとめをどうぞ)



#つまずいたところ
macユーザーなのですが調べていたらwinのvagrantのアンインストールは簡単だけどmacは難しいなどの情報が出てきてvagrantをしばらく使っていなかったので焦りました。
調べていったらmkdirなどで１つ１つ消す方法があったのでやってみましたがアクセス拒否されたりしてしまい笑うしかなかった！！！！！！！！！あは

#とりあえずもう一度インストーラーを入れてみる

途方に暮れてしまい、もうとりあえずインストーラー入れちまおうぜってことでダウンロードしました。

https://www.vagrantup.com/downloads.html

インストールが終了してインストーラーを起動させてみたら...

<img width="600" alt="スクリーンショット 2018-01-22 2.10.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/232752/35396a60-e354-4b64-4c1b-e2d49d934202.png">


ん...？ uninstall.tool...？？？？
嘘だろおいと思いながらuninstall.toolを起動させてみると

```
Do you wish to uninstall Vagrant (Yes/No)?
```
とターミナルに表示されました。

Yesと入力しパスワードを入れるとあっさりアンインストールできました。

そのあと、vagrant.pkgからインストールし、無事再インストールができました...

#まとめ

https://www.vagrantup.com/downloads.html からインストーラーをダウンロードし、

uninstall.toolを起動→Yesと入力→パスワード入力

であっさりアンインストールが完了します。
vagrant.pkgからまたインストールして再インストール完了。


１、２時間悩んでたのが馬鹿らしくなるほど数十秒でできました...

完全にインストーラーにアンインストールするためのツールがあるものもあるという基本的なことが抜けていました。

灯台下暗しというか、頭抜けすぎてたって話でした。
mac で rbenv install で The Ruby openssl extension was not compiled.

# 問題点

```
rbenv install 2.5.0-dev
```

rbenvで新しいrubyのバージョンを以下のようなエラーがでた

```
The Ruby openssl extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
```

# 対処法
```
CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" rbenv install 2.5.0-dev
```

# 参考
https://github.com/rbenv/ruby-build/issues/377#issuecomment-310569462
Amazon EC2にMySQLServerをインストール


AWSでインスタンスを作成しAMIにAmazonLinuxAMIを選択、yumでMySQLServerをインストールしようとした際、変に最新をインストールしようとした為、余計な手間がかかったのでメモ。結果的に最新のをインストールするの諦めました。


#### リポジトリの登録
```
$ sudo yum install http://repo.mysql.com/mysql57-community-release-el7.rpm
$ sudo yum -y install mysql-community-server
読み込んだプラグイン:priorities, update-motd, upgrade-helper
8 packages excluded due to repository priority protections
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ mysql-community-server.x86_64 0:5.7.21-1.el7 を インストール
--> 依存性の処理をしています: mysql-community-common(x86-64) = 5.7.21-1.el7 のパッケージ: mysql-community-server-5.7.21-1.el7.x86_64
--> 依存性の処理をしています: mysql-community-client(x86-64) >= 5.7.9 のパッケージ: mysql-community-server-5.7.21-1.el7.x86_64
--> 依存性の処理をしています: systemd のパッケージ: mysql-community-server-5.7.21-1.el7.x86_64
--> 依存性の処理をしています: systemd のパッケージ: mysql-community-server-5.7.21-1.el7.x86_64
--> 依存性の処理をしています: libsasl2.so.3()(64bit) のパッケージ: mysql-community-server-5.7.21-1.el7.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ mysql-community-client.x86_64 0:5.7.21-1.el7 を インストール
--> 依存性の処理をしています: mysql-community-libs(x86-64) >= 5.7.9 のパッケージ: mysql-community-client-5.7.21-1.el7.x86_64
---> パッケージ mysql-community-common.x86_64 0:5.7.21-1.el7 を インストール
---> パッケージ mysql-community-server.x86_64 0:5.7.21-1.el7 を インストール
--> 依存性の処理をしています: systemd のパッケージ: mysql-community-server-5.7.21-1.el7.x86_64
--> 依存性の処理をしています: systemd のパッケージ: mysql-community-server-5.7.21-1.el7.x86_64
--> 依存性の処理をしています: libsasl2.so.3()(64bit) のパッケージ: mysql-community-server-5.7.21-1.el7.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ mysql-community-libs.x86_64 0:5.7.21-1.el7 を インストール
---> パッケージ mysql-community-server.x86_64 0:5.7.21-1.el7 を インストール
--> 依存性の処理をしています: systemd のパッケージ: mysql-community-server-5.7.21-1.el7.x86_64
--> 依存性の処理をしています: systemd のパッケージ: mysql-community-server-5.7.21-1.el7.x86_64
--> 依存性の処理をしています: libsasl2.so.3()(64bit) のパッケージ: mysql-community-server-5.7.21-1.el7.x86_64
--> 依存性解決を終了しました。
エラー: パッケージ: mysql-community-server-5.7.21-1.el7.x86_64 (mysql57-community)
             要求: libsasl2.so.3()(64bit)
エラー: パッケージ: mysql-community-server-5.7.21-1.el7.x86_64 (mysql57-community)
             要求: systemd
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest

```

#### エラーになるので入れられるmysql-serverのバージョンを確認
```
$ sudo yum --showduplicates list mysql-server
利用可能なパッケージ
mysql-server.noarch                                           5.5-1.6.amzn1                                            amzn-main

```

#### リポジトリを削除
```
$ sudo yum remove mysql57-community-release.noarch
$ sudo yum remove mysql-community-common-5.7.21-1.el7.x86_64
```

#### もう一度インストールでようやくインストール成功
```
$ sudo yum -y install mysql-server
```


#### まとめ
mysql5.7のelのバージョン次第ではインストール出来たかも。もしくはlibsasl2.so.3()(64bit) を追加すればよかったか・・・（面倒なのでやらなかった。）systemdについてはバグなんじゃない？って意見もあるような

[Is it possible to install mysql 5.7 on Amazon Linux AMI?](https://unix.stackexchange.com/questions/334776/is-it-possible-to-install-mysql-5-7-on-amazon-linux-ami)
CoffeeScriptを始める①

# CoffeeScriptとは
`CoffeeScript`は、`JavaScript`に変換（トランスパイル）して実行する言語。
`JavaScript`より、記述量が少なくて済み、可読性が高いことから最近人気。
とりあえず、ものはためしで実行環境を作ってみようと思う。

# エディタ環境
自分はAtomをつかっているので、記述環境を作る。これは簡単。

## preview
`CoffeeScript`をリアルタイムで`JavaScript`に変換して表示してくれるパッケージ。
`setting`の`install`から、previewを検索してインストール。

## linter-coffeelint
構文チェック、記述ルールを設定できるようにlintを導入。
これも`setting`の`install`から検索してインストール。
しかし、`coffeelint`自体が入っていないと機能しないことに入れてから気づいた。(当たり前）
`coffeelint`の導入はまた後日。

# 実行環境
一番簡単には、以下の公式サイトの`TryCoffee`から実行可能。
[CoffeeScript](http://coffeescript.org/)

でも、ローカルで実行環境作りたいよね。。。ということで、次回ローカルでの環境づくり。

# 参考
[AtomでCoffeeScriptの開発環境を整える](https://qiita.com/kyo_nanba/items/c8e5e79cb1816e8c9dba)
[CoffeeScript入門](https://qiita.com/ozw_sei/items/b45e316fced8aec9a97e)
nuxt.jsを使う時にlocalStorageでstoreを永続化する

# nuxt.jsで再読込しても入力中の内容を保持したい

という動機から、状態をlocalstorageに保存することにしました。
日本語での知見はあまりなかったので、投稿しておきます。

## localstorageに保存が可能になるとどうなる？
- 再読込しても、storeの状態を保つことができます。
- 入力中のフォームの内容や、画面の状態を復元することができます。
- store中のstateはlocalstorageを消し去らないと新しい値とかを追加しても状態が変わらなくなってしまいます。

## vuex-persistedstateを使う
Reduxでも経験がありますが、こういうときにはstoreが変わった瞬間に自動的に保存してくれて、ページが始まった瞬間に復元してくれる、ライブラリを用いるべきです。
探した結果、最終的にnuxt.jsのissueなどで見ることの多かった"vuex-persistedstate"を使うことにしました。
結局このライブラリが一番、vuexでlocalstorageなどの永続化をするときに人気のライブラリのようです。

https://github.com/robinvdvleuten/vuex-persistedstate

``` console
npm install -S vuex-persistedstate
```

使い方、一通りググりながら試行錯誤した結果、やり方はいくつか有るようですが、下の記事に紹介されているコードに落ち着きました。
https://github.com/nuxt/nuxt.js/issues/972#issuecomment-332308183

``` plugins/persistedstate.js
import createPersistedState from "vuex-persistedstate";

export default ({store, isHMR}) => {
  // In case of HMR, mutation occurs before nuxReady, so previously saved state
  // gets replaced with original state received from server. So, we've to skip HMR.
  // Also nuxtReady event fires for HMR as well, which results multiple registration of
  // vuex-persistedstate plugin
  if (isHMR) return;

  if (process.client) {
    window.onNuxtReady((nuxt) => {
      createPersistedState()(store); // vuex plugins can be connected to store, even after creation
    });
  }
};

```

``` nuxt.config.js
...

  plugins: [
    { src: "~plugins/persistedstate.js", ssr: false }
  ]
}
```

一応、完コピのようで、isClient isServerという変数がduplicateになったとエラーが出ていたので、そこだけ修正しています。

## 簡単なアプリでデータベースに保存するまでもないなというときに
アプリの状態を手軽に保存したい時、よくlocalstorageを使いますがnuxt.jsでも使っていけそうだと思いました。
これだとクライアントをまたいだデータの引き継ぎとかはできませんので、使用する機会は考える必要がありそうですが、結構良い選択肢ではあると思います。

## Nuxtの利点であるSSRもできるという点とは相性が悪い
SSR実行時のnodeにはlocalstorageがありませんから、window.localstorageはさわれません。
そのため、今回のプラグインも`{... , ssr; false}`として、SSR時は起動しないようにする必要があります。
(a == 1 && a == 2 && a == 3) を常に真にできますか？


頭の体操のために作ってみました。
特に意味はありませんが、GitHubに[リポジトリ](https://github.com/Morichan/a_equal_1_and_2_and_3)を上げました。

元ネタ: [Can (a ==1 && a== 2 && a==3) ever evaluate to true?](https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true)

他の言語の先駆者:

* [a == 1 && a == 2 && a == 3がtrueになるRubyスクリプト](https://qiita.com/shiozaki/items/53c66cea655bef08b9ea)
* [a == 1 and a == 2 and a == 3 がTrueになるPythonスクリプト](https://qiita.com/yteshi/items/b4be995fccbf0769a47d)
* [C言語でもa == 1 && a == 2 && a == 3をtrueにしてみたい](https://qiita.com/shiozaki/items/fe3ee5a4775e5ca19f20)

追記:
別の書き方を思いついたので載せておきます。
[(a == 1 && a == 2 && a == 3) を常に真にできますか？ その2](https://qiita.com/Morichan/items/cc4e426b5128fac4a61b)


# 簡単なあらまし

元ネタのサイトにありますが、変数aを1にも2にも3にも等しくするということです。
一見すると訳が分かりませんが、これを疑似コードで表すと、次の通りです。

```java:要約
if a == 1 && a == 2 && a == 3:
    print("True!")
```

解法として様々あるようです。

* aをオブジェクトとして呼ばれる度にaの戻り値を変更する
* aの後ろの半角スペースをハングルの半角スペースにすることで別の変数として処理する



# 僕の考えた最強の解法

自分で考えて、とりあえず実装してみた2つを紹介します。

## シジルの変更によって全ての真偽値判定を真にする

シジルとは、スカラや配列を表す`$`や`@`といった、Perlにおいて変数の種類を表すために、変数の前に付ける記号のことです。

Perl固有の書き方ができます。

```pl:by_changing_sigil.pl
use strict;
use warnings;

my $a = 1;
my @a = (1, 2);
sub a { 3 };

if ($a == 1 and @a == 2 and &a == 3) {
    print "True!\n";
}
```

```bash:実行結果
$ perl by_changing_sigil.pl
True!
```

元ネタではJavascriptが対象のため、Perlを用いる場合は変数aにシジルを付けなければなりません。

この時にシジルを変更することで、簡単に戻り値を変えることができます。

```pl:解説
$a == 1;
# 変数$aと1が等しい場合は真を返す。

@a == 2;
# 配列@aの要素数と2が等しい場合は真を返す。

&a == 3;
# 関数&aの戻り値と3が等しい場合は真を返す。
```

ちなみに`and`演算子で繋げていますが、`&a`が見づらくなるために変更しているだけで、`&&`でも同じ動作をします。



## `==`演算子のオーバーロードによって全ての真偽値判定を真にする

`overload`モジュールを使うことで、オブジェクトにおける演算子のオーバーロードができます。
これを利用して、`==`演算子による処理を変更します。

```pl:by_overloading_operator.pl
package AllEqualObject;

use overload
"==" => \&operator_eq;

sub new {
    my $self = shift;
    bless [@_], $self;
}

sub operator_eq {
    my $self = shift;
    return 1;
}

1;



package main;

use strict;
use warnings;

my $a = AllEqualObject->new;

if ($a == 1 && $a == 2 && $a == 3) {
    print "True!\n";
}
```

```bash:実行結果
$ perl by_overloading_operator.pl
True!
```

ここでは、`AllEqualObject`のインスタンスで`==`を利用すると、`operator_eq`関数を呼出し、数値1を返します。
Perlにおいて数値1は真なので、`$a == 1`でも`$a == 0`でも`$a == -1`でも真を返します。



# 終わりに

小さいことですが、いろいろ勉強になりました。

ここまで読んでくださってありがとうございました！

もしおかしい点、気づいた点がありましたら教えてください。
特に、もっと面白い解法がある場合は教えてくれると嬉しいです！
LinuxMintでWiFi 5GHzに接続できなかった時の対処(Realtek)

ASUS R206SにLinuxMintをインストールしたら、WiFi 5GHzに接続できなかった時の対処です。

面倒くさくて長いこと放置していましたが、似たようなことで困っている人がいるようだったので調べてみました。

まず`lspci | grep Wireless`でデバイスを調べたところ、

```
01:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8821AE 802.11ac PCIe Wireless Network Adapter
```

Realtekの`RTL8821AE`であることが分かり、Webで検索すると同じような質問を見つけました。

[Realtek 8821AE cannot connect to 5Ghz?](https://forums.linuxmint.com/viewtopic.php?t=228026)

>Try the rtlwifi_new driver from lwfinger:
>https://sites.google.com/site/easylinuxtipsproject/reserve-7#TOC-The-rtlwifi_new-driver-from-lwfinger

トライふんたらかんたら…と言われるがままにリンク先の手順を踏んだところ、無事接続できるようになりました。

ビルド環境をインストールして,
```sudo apt-get install git build-essential linux-headers-$(uname -r)```

rtlwifi_newとやらのcloneを作成
```git clone https://github.com/lwfinger/rtlwifi_new.git```

Makeしてインストール

```
cd rtlwifi_new
make
sudo make install
```
再起動して、WiFiに接続
Java SE 8 Silver (Java SE 8 Programmer I) 合格手記

# Java SE 8 Silver(Java SE 8 Programmer I)合格手記

## 購入した本

[徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応 単行本（ソフトカバー）](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-Java-Silver-%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-808/dp/4844339931)

## もう一夜漬けで試験に臨むしかないそこのあなたへ

### **総仕上げ問題①、②を丸暗記するのが一番早いです！**

総仕上げ問題①、②さえ押さえておけば「あ！ ここ進●ゼミでやたところだ！！」という問題がザクザク出てきます。もうjavaは完璧だぜ！という方や、とにかく時間がない！という方は総仕上げ問題を解きまくりましょう。もはやそのままなんじゃないかという問題が多数出現します。

## 申し込み方法がすごく難しくて心が折れそうなあなたへ

こちらの記事を参考にさせていただきました。

[Java Silverの試験を受けたんだが手続きがマジめんどくさかった](http://blog.livedoor.jp/zzzaaawwwaaa/archives/5611428.html)

特にCertViewの初回認証には手こずりました。
あれ？初回認証だからとりあえずログインするんじゃないの？
と思って2回入れたところで罠だと気付きました。もう間違えることができません汗。

あと自分の所属企業がOracle Partner Network(OPN)に入っているかどうかとかいうよくわからない質問にも悩みました。とりあえずあとで設定できるようなので選択しないでおきました。



## 勉強方法

前提として、自分はjavaは文法や基本的なクラスの使い方程度を知っていて、知らないことがあれば適宜ググる程度の知識でした。継承や例外はなんとなくIDEに頼りながら実装していました。ラムダ式は存在を知っていたぐらいです。

1. まず、「1問問題を解く」->「解答を見て答え合わせ」を繰り返していきます。自分は解いた記憶がすぐなくなってしまうので、即解答を見るようにしていました。
2. 1章解き終わったら、軽く解答部分をもう一度読み直します
3. 1. ~ 2. を9章まで繰り返します。
1章大体1時間で読み終わることができました。
4. 9章まで解き終わったら、総仕上げ問題①に手をつけます。「10問解く」->「答え合わせ」を繰り返して行きます。これも解いた内容を忘れないうちに答え合わせするためです。
5. あとは4. をひたすらテスト当日まで繰り返します。

特に試験前は総仕上げ問題を集中的にやっており、結果的に試験には似たような問題がでてくれたのでとても良かったです。

## 勉強後の感想

序盤の1章から4章までは、今までなんとなく見過ごしていた仕様から、こんなん実際に使わんだろ！！と思ってしまうような可読性無視のトリビアにしかならないような知識まで載っていたりしますが、それはそれで面白かったので楽しみながら読み進められました。（インクリメントとデクリメントの鬼計算は特に印象に残っています笑）

```java
int b = a++ + a + a-- - a-- + ++a; // b=32
``` 

6章から8章はメソッド/カプセル化、継承、例外といったものを扱い、やや苦戦しました。
特にjava初心者の方はここで躓きやすいのではないでしょうか。Java Silverを勉強していて、この範囲の基礎を身につけられたのは本当に良かったと思っています。

いちいちググる時間をなくすための投資だと思えば、こういう基礎知識をいっぺんに復習する時間を取るのもありだなあと思いました。せっかくの機会でしたので、定着できるように少しずつ時間をとっていきたいなと思いました。
【VeeValidate】条件付きでバリデーションをかける方法


例えば、ある項目のチェックが入っているときだけ、特定の要素にバリデーションをかける場合
例）「別の配送先に送る」を選択した時だけ、別の配送先の入力項目にバリデーションをかけるような場合



###うまくいったパターン
三項演算子を使って、`v-validate`の値を動的に変更する方法

```html
v-validate="条件 ? 'required' : '' "
```

[うまくいったパターン](https://jsfiddle.net/1LbLv89m/10/)

`v-model`でデータのバインディングを行い、チェックが入った場合に
`required`のバリデーションをかけています

###うまくいかなかったパターン
バリデーションを`attach`と`detach`で登録 or 解除する方法

```js
this.$validator.attach('name', 'required');
this.$validator.detach('name');
```
他の方法としてバリデーションを`attach`と`detach`で登録 or 解除する方法を試したのですが、
`attach`で登録したバリデーションが`validateAll()`ではチェックしてくれませんでした。。。
また、明示的に要素に`v-validate`をつけないと`validate()`自体も動作してくない。。。
何かいい方法を知っている方がいれば教えて欲しいです。

[上手くいかなかったパターン](https://jsfiddle.net/1LbLv89m/22/)
Amazon S3 に Git LFS サーバを超簡単に立てる

元ネタはこちら。
[Serverless Git LFS for Game Development - Alan Edwardes](https://alanedwardes.com/blog/posts/serverless-git-lfs-for-game-dev/)
[Amazon API Gateway](https://aws.amazon.com/jp/api-gateway) + [Amazon Lambda](https://aws.amazon.com/jp/lambda/) + [Amazon S3](https://aws.amazon.com/jp/s3/) を使うんだそうです。
### 準備: [AWS](https://aws.amazon.com/jp/) のアカウントをとる

AWSのアカウントがなければとります。
作成の流れは [公式のドキュメント](https://aws.amazon.com/jp/register-flow/) でだいじょうぶです。

アカウントをとったら初期設定しておきます。以下のエントリが参考になりました。
[AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ - Qiita](https://qiita.com/tmknom/items/303db2d1d928db720888)

## サーバ作成手順

* AWSコンソールにログインします。

* 以下の魔法のリンクをクリックして、[AWS CloudFormation](https://aws.amazon.com/jp/cloudformation/) のスタックを作成します。 **← ※欧州 (アイルランド)に作成されます。東京リージョンに作る場合は一番下の[追記](#追記)のリンクを使って下さい**
  * https://console.aws.amazon.com/cloudformation/home#/stacks/new?region=eu-west-1&templateURL=https://ae-infrastructure-eu-west-1.s3.amazonaws.com/git-lfs/git-lfs.yaml
* 作成できたら「次へ」をクリックします。

* スタックに名前をつけます。（これは個々のリソースに名前を付けるためにも使用されます。）
* Git LFSエンドポイントの共有ユーザー名とパスワードを設定します。

![Screen_Shot_2018-01-21_at_22_29_22-fullpage.png](https://qiita-image-store.s3.amazonaws.com/0/3956/a0b4a3e3-7a9a-6850-621b-4676b514c6fb.png)

* 「次へ」をクリックします → オプションの設定ページはスルーで「次へ」をクリックします。
* 「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。」にチェックして「作成」をクリックします。

![Screen_Shot_2018-01-21_at_23_05_08-fullpage.png](https://qiita-image-store.s3.amazonaws.com/0/3956/d057ed30-6f85-f0e7-8f42-fd55dae2876a.png)

* スタックのリストに新しいスタックができて（スタックがなければリロードして下さい）、「CREATE_COMPLETE」と表示されたら成功です。

![Screen_Shot_2018-01-21_at_23_10_18-fullpage.png](https://qiita-image-store.s3.amazonaws.com/0/3956/f7e1c24d-d4eb-1bec-fb09-05ff7dbb2e0f.png)

* スタックの詳細画面に入って、出力を確認すると、Git LFSのエンドポイントのURLが表示されているので、リンクをコピーします。

![Screen_Shot_2018-01-21_at_22_34_53-fullpage.png](https://qiita-image-store.s3.amazonaws.com/0/3956/1af39c17-0213-067c-1fd8-d12fb6cb3b40.png)

## Git LFS に lfs.url を設定

Git LFS は導入してあることとします。

以下のコマンドで、 `.lfsconfig` を作成します。

```
git config -f .lfsconfig lfs.url <表示されたエンドポイントのURL>
```

`git lfs env` で確認して、`Endpoint=` の行が設定したURLになってたらOKです。

`.lfsconfig` を commitしてください。

`git push` すると、S3の方にLFSオブジェクトがpushされるようになります。

## 問題点

URL を見ればわかると思いますが、この方法で作成するとリージョンが **欧州 (アイルランド)** に作成されます。
東京リージョンにS3を立てたいと思って、 URL の `region=eu-west-1` の部分を `region=ap-northeast-1` に変えてみましたが、リージョンを変えると成功しないみたいです。

[alanedwardes/Estranged.Lfs - Github](https://github.com/alanedwardes/Estranged.Lfs)

どなたか検証お願いします。 m(_ _)m

#### 追記

わかった気がします。

同じリージョン内のでしかオブジェクトが参照できないぽいので、
自分のS3に東京リージョンでバケット作って、 git-lfs.yaml と git-lfs-lambda.zip をコピーしました。
パブリックアクセス許可にしたので、下のURLで誰か試してください。

https://console.aws.amazon.com/cloudformation/home#/stacks/new?region=ap-northeast-1&templateURL=https://s3-ap-northeast-1.amazonaws.com/kanemu-infrastructure-ap-northeast-1/git-lfs/git-lfs.yaml
【備忘録】Laravelをhetemlにのせてメールを送る設定。

#envの設定
やりかたはいろいろあると思いますが。

>MAIL_DRIVER=smtp
MAIL_HOST=smtp.hetemail.jp
MAIL_PORT=465
MAIL_USERNAME={hetemailのID}
MAIL_PASSWORD={hetemailのPW}
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=送信アドレス
MAIL_FROM_NAME=送信者

tslで、どうしてもメールが送れず。
sslでポートを変えたらうまくいきました。

hetemlからtslで送れるやりかた、
知ってたら教えてください。
rvenv install -lで欲しいrubyバージョンが見つからない時

色々と新しくしたかったので、
最近使ってなかった方のMacを綺麗にして、バージョンをHigh Sierraに上げたり、
もろもろのバージョンアップやら何やらの作業をしている途中の出来事

とりあえずrubyのバージョンはrbenvでやるようにしたかったので、rbenvを導入。
以下はhomebrewでインストール済みです。

- rbenv
- ruby-build

# 事前情報

```
$ ruby -v 
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]
```
これを最新にしたい

```
$ rbenv install -l

Available versions:
  1.8.6-p383
  1.8.6-p383
  1.8.6-p420
  1.8.6-p420
... (中略)
  2.1.3
  2.2.0-dev
  2.2.0-dev
  2.2.0-preview1
  2.2.0-preview1
  jruby-1.5.6
  jruby-1.5.6
  jruby-1.6.3
...
```

rbenv入れたばっかなので、リストのバージョンが古い

書いている時点での最新安定版は2.5.0でrbenvでも入れられるよう

[rbenvでruby2.5.0をインストール](https://qiita.com/paranishian/items/a194590f137c72d190a4 "rbenvでruby2.5.0をインストール")

# ruby-buildをバージョンアップしてみる
これでいけるはず

```
$ brew update
$ brew upgrade ruby-build
```

```
$ brew update
Already up-to-date.

$ brew upgrade ruby-build
Error: ruby-build 20171226 already installed
```
を？
すでに最新のが入ってるっぽい？

```
$ rbenv install -l

Available versions:
  1.8.6-p383
... (中略)
  2.1.3
  2.2.0-dev
  2.2.0-dev
  2.2.0-preview1
  2.2.0-preview1
  jruby-1.5.6
...
```

やっぱり最新のがない(；´∀｀)

# 解決法
仕方ないので、無理やりやってみる

```
$ rbenv install 2.5.0
```

```
ruby-build: definition not found: 2.5.0
See all available versions with `rbenv install --list'.
If the version you need is missing, try upgrading ruby-build:
  cd /Users/xxxxx/.rbenv/plugins/ruby-build && git pull
```  

無理やりやったら、エラーコードにヒントが出てきた!!(ﾟ∀ﾟ)

素直に実行

```
$ cd /Users/xxxxx/.rbenv/plugins/ruby-build 
$ git pull
remote: Counting objects: 4769, done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 4769 (delta 946), reused 961 (delta 940), pack-reused 3800
Receiving objects: 100% (4769/4769), 1.15 MiB | 1.53 MiB/s, done.
Resolving deltas: 100% (3549/3549), completed with 119 local objects.
From https://github.com/sstephenson/ruby-build
   e1811b9..01e7b7b  master                 -> origin/master
 * [new branch]      end-to-support-old-rbx -> origin/end-to-support-old-rbx
 * [new tag]         v20141027              -> v20141027
 * [new tag]         v20141028              -> v20141028
 * [new tag]         v20141113              -> v20141113
 * [new tag]         v20141128              -> v20141128
....
```

再びrbenv install実行

```
$ rbenv install 2.5.0

ruby-build: use openssl from homebrew
Downloading ruby-2.5.0.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.0.tar.bz2
Installing ruby-2.5.0...
ruby-build: use readline from homebrew
Installed ruby-2.5.0 to /Users/tomono/.rbenv/versions/2.5.0

$ rbenv local 2.5.0
$ rbenv local
2.5.0
```

なるほど、gitで最新化せなあかんのね。知らんかった。
初心者的なつまづきでした。
PythonからPagerDutyのIncidentを生成する

# 目的

監視の仕組みを独自で作成した際に問題となるのは、
外部のアラートの仕組みなどと連携する場合です。

ここでは、Pythonで作成した監視の仕組みとPagerDuryを
連携させるための例を説明します。


# 手順概要

1. PagerDutyのIntegrationを設定
2. Pythonのコードを記述

# 手順詳細

## PagerDutyのIntergrationを設定
### Serviceの作成

`Configutaion` -> `Services` と選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/51004a2c-6d39-bc1d-1033-6ba3a730b7eb.png)

`Add New Services`ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/4fbb4d81-fefa-02c4-3c90-f8d92c7a37b7.png)

次は、ServiceとIntegrationの設定を進めます。
(Escalation Policyなどの設定は含めません)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/ea932a47-6036-2bcc-aba5-121bb4d716d7.png)

1. Serviceの名前を指定します
2. `Use our API directry`を選択します
3. `Events API v2`を選択します
4. `Intagration`の名前を設定します

あとはよしなに。
`Add Service` ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/f3fe9efc-df63-585b-e4a0-a85e0f6e0ab5.png)

先ほど作成した`Service`を選択し、`Integration Key`を選びます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/13648488-72a4-5345-25f3-f6a15eff9f85.png)


## Pythonのコードを記述

[pypd - PagerDuty Python API Client](https://github.com/PagerDuty/pagerduty-api-python-client)を利用します

### pagerduty-api-python-clientのインストール

```python
pip install pypd
```

### コードを記述

単純に`Incident`を生成するだけのコードです。

integration_keyには先ほど作成した。
PagerDutyとの`Integration Key`を指定します。

```python:Incident生成のサンプルコード
import pypd

integration_key = 'hogehogehogehoge'

pypd.EventV2.create(data={
    'routing_key': integration_key,
    'event_action': 'trigger',
    'payload': {
        'summary': 'test',
        'severity': 'error',
        'source': 'test',
    }
})
```

本コードをベースとして、任意のタイミングでPagerDutyで`Incident`を生成することができます。
他にも`Incident`の一覧を取得したりなど様々な作業をpypdを用いて実現できそうです。