OmniAICreator/Qiita-1.07M huggingface dataset:
rspecで複数のexpectをまとめて使い回す。

## 概要

rspecでテストを書いていると、値だけ違う同じexpectの組み合わせを何度も行うことが多いと思います。仕様が変わったりすると大量に変更箇所が出てきて、「あ〜やっぱりテストはコストがかかるからやめようか〜」なんてことになりかねません。ヘルパーメソッド的なものにまとめたいと思いました。

で、どこにexpectをまとめたヘルパーメソッドを作るのか探してみると、カスタムマッチャーを使った例がいくつか見つかりました。

https://relishapp.com/rspec/rspec-expectations/v/3-8/docs/custom-matchers/define-a-custom-matcher

ところがカスタムマッチャーのmatchメソッドはtrue/falseを返すように設計されているため、なかでexpectを使うとエラーメッセージがもみ消されて、どこで、どんな感じにテストがこけたのか全く分からなくなってしまいます。

また、追加的なテストはchainメソッドで行いますが、これはテストを実行するというより、メンバー変数に値を入れておき、matchメソッドの中でその変数の有無を見て追加チェックを行うためロジックが複雑になってしまいます。

そこで、いい感じにテストをまとめられるmoduleを作りましたので共有させていただきます。エラーメッセージの問題は[こちらの投稿](https://qiita.com/joker1007/items/7f90797437fc0e4eb5be)を参考にしました。

モジュールはgistに公開しました。
https://gist.github.com/gomo/83e021828a0aeade3b3370d404c2ee7b


## 使い方

`RSpec::Matchers.define`のブロックにincludeして使います。

```rb
RSpec::Matchers.define :have_foo_bar do |foo, bar|
  include ChainChecker
```

エントリーポイントは`match`ではなく`main`に渡すブロックになります。

```rb
RSpec::Matchers.define :have_foo_bar do |foo, bar|
  include ChainChecker

  main do |actual|
    expect(actual.foo).to eq foo
    expect(actual.bar).to eq bar
    # メンバー変数に入れて置くとchainの中で利用可能です。
    @quux = actual.quux
  end
```

`chain`メソッドでは`check`メソッドにブロックを渡してテストを予約します。これでmainに渡したブロックが最初に評価され、その後chainを呼び出した順にcheckブロックが評価されていきます。


```rb
RSpec::Matchers.define :have_foo_bar do |foo, bar|
  include ChainChecker

  main do |actual|
    expect(actual.foo).to eq foo
    expect(actual.bar).to eq bar
    @quux = actual.quux
  end

  chain :with_quux do |baz, qux|
    check do |actual|
      expect(@quux.baz).to eq baz
      expect(@quux.qux).to eq qux
    end
  end
end
```

テストコードは下記のようになります。

```rb
context 'some' do
  it 'should have foo and bar' do
    some = Some.find(1)
    expect(some).to have_foo_bar('foo value', 'bar value')
      .with_quux('baz value', 'qux value')
  end
end
```
Windows10でスタートアップフォルダを開く

`Win+R`で「ファイル名を指定して実行」を開き、`shell:startup`を実行します。

# 捕捉
Windows 7まではスタートボタンを押して表示されるメニュー内にあったスタートアップフォルダですが、Windows 10（8から？）ではなくなってしまいました。  
上記コマンドで表示されるフォルダにショートカットを置くことで、Windows 7以前と同様にOS起動時にアプリケーションを実行させることができます。
グローバルナビやモーダル表示の時に背景を固定する　メモ

# グローバルナビやモーダル表示の時に背景を固定する
グローバルメニューやモーダルを表示したときに、背景を固定することが増えたのでメモ。
スマホでも背景が（多分）固定されます。
今のところは不具合なしのはず。

**jQuery**

```javascript:jQuery
var btn = $('.btn');//動作に利用する要素
var flg;//メニューorモーダルが開いてるかの判定用フラグ
var scrollpos;//スクロール値

btn.on('click',function(){
  if(flg !== true){//メニューorモーダルを開くときの動作
    
    scrollpos = $(window).scrollTop();
    $('body').addClass('fixed').css({ 'top': -scrollpos });
    
  }else if(flg !== false ){//メニューorモーダルを閉じるときの動作

    $('body').removeClass('fixed').css({ 'top': 0 });
    window.scrollTo(0, scrollpos);

  }
});

```

**CSS**

```css:CSS(SCSS)
body.fixed {
  position: fixed;
  width: 100%;
  overflow: hidden;
}
```
Laravelで使用するDBをSQLite3に変更する方法


Laravelで使用するDBをデフォルトのmysqlから、sqliteに変更する方法

# 解決策
envファイルの以下の2行だけ設定を直せばsqliteにつなぐ設定にできる。

```.env
DB_CONNECTION=sqlite
DB_DATABASE=database.sqlite
```

# 変更が更新されない場合

envを変更しても更新されない理由は`php artisan config:cache`でキャッシュされている。
再度キャッシュすれば変更される。

# 参考記事

https://qiita.com/kawax/items/ea881a6c18b8d4e94d83
https://qiita.com/the_hello_world/items/1422998753af958d60ef
JavaScriptでnew Dateのmsにzをつけた際の挙動

# 1995-12-17T03:24:00z か 1995-12-17T03:24:00で new Dateの結果が違う

初めて知りましたが、msにzかZをつけてあげるとパースの際にタイムゾーンに合わせた時間にしてくれるみたいです。

```javascript

// 9時間足してくれる
1995-12-17T03:24:00z
→ Sun Dec 17 1995 12:24:00


// 9時間足してくれない
1995-12-17T03:24:00
→ Sun Dec 17 1995 03:24:00

```

Zをつけるとパースの際にUTC時刻だと判定するみたいです。
しゅごい:relaxed:

この日付フォーマットを `ISO 8601` というらしいです。

ECMA Scriptの仕様書は[こちら](https://tc39.github.io/ecma262/#sec-date-time-string-format)
VBSでフォルダをコピーする方法

VBSでフォルダをコピーする方法について記載します

# 概要
VBScriptを使ってフォルダをコピーする方法について記載します。

# ソースコード
以下のソースコードをメモ帳で書いて「.vbs」という拡張子で保存します。

```ruby:.vbs
Option Explicit
On Error Resume Next

Dim FSO            'FileSystemObject'
Dim CopyFromFolder 'コピー元フォルダ名'
Dim CopyToFolder   'コピー先フォルダ名'

CopyFromFolder = "コピー元フォルダ名のパス"
CopyToFolder = "コピー先フォルダ名のパス" 

Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
If Err.Number = 0 Then
    'コピー先フォルダが存在しないときは作成する
    If FSO.FolderExists(CopyToFolder) <> True Then
        FSO.CreateFolder(CopyToFolder)
    End If

    'フォルダコピー
    FSO.CopyFolder CopyToFolder, CopyFromFolder, True
    If Err.Number = 0 Then
        WScript.Echo "データをコピーしました。"
    Else
        WScript.Echo "エラー: " & Err.Description
    End If
Else
    WScript.Echo "エラー: " & Err.Description
End If

Set FSO = Nothing
```

# 使い方
vbsファイルを開くだけで処理が実行されます。
querlyでhas_manyのdependent指定漏れを検出するパターン

以前から[querly](https://github.com/soutaro/querly)を使ってコードレビューで抜けがちな点をチェックできないかと考えていたのですが、やりたいことが出来ずに挫折していたところ、[CodeReviewMeetup #4](https://sider.doorkeeper.jp/events/79228)で gfxさんの発表（[歴史的経緯の説明 as code \- Speaker Deck](https://speakerdeck.com/gfx/li-shi-de-jing-wei-falseshuo-ming-as-code)） を見て再度やる気が出てきたので、Railsのモデル（ActiveRecordを継承したクラス）で「`has_many` に `dependent:`が指定されていないメソッド呼び出しを検出する」というのができないか、やってみました。

どうやらこれでいけるようです。

```console
$ cd app/models
$ querly console 
> find has_many(...,!dependent: :symbol:)
```

これ以外にも「`has_many` で `-> { order(...) }` を指定していない呼び出しを見つける」というのをやろうとしたのですが、（おそらく）querlyでProcやLambdaを検出できるパターンが用意されていないようなので、やるなら[Interpolation Syntax](https://github.com/soutaro/querly/blob/master/manual/patterns.md#interpolation-syntax) でやることになりそうです。ただ、これだと `query console` で試せないため、`querly.yml` に正規表現指定して試行錯誤する必要がありそうです。 `querly.yml` が間違ってるときのエラーがわかりづらくてちょっとつらいので、もうちょっとモチベーション高めのときにチャレンジしようと思います。
Nvidia-docker v1が動かなくなった…

# はじめに
先の北海道の地震では弊社サーバーが軒並みダウンしました。停電対策してなかったので当たり前ですが。サーバーは復旧したのですが、サーバーで運用していたNvidia-dockerが起動しなくなりました。。。まじですかい。新しくコンテナを作り直す方法とかNvidia-docker v2を使用するなどの方法もあるのですが色々とリスクがあったので出来ればそのまま動かしたい…のが本音でした。

# 使用環境
Ubuntu16.04

```
# nvidia-docker version
NVIDIA Docker: 1.0.1

Client:
 Version:      17.05.0-ce
 API version:  1.29
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:10:54 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.05.0-ce
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:10:54 2017
 OS/Arch:      linux/amd64
 Experimental: false
```

# 症状
以下のコマンドでエラー

```
$ docker start hogehoge
Error response from daemon: linux runtime spec devices: error gathering device information while adding custom device "/dev/nvidia-uvm-tools": lstat /dev/nvidia-uvm-tools: no such file or directory
Error: failed to start containers: hogehoge
```
#対応
以下のコマンドを試してみた

```
$ nvidia-modprobe -u -c=0
```
人によってはこれでうまく行くと言う話もあったけど無理でした。
以下のサイトを参考にしました。
https://github.com/NVIDIA/nvidia-docker/issues/526

```
sudo mknod -m 666 /dev/nvidia-uvm-tools c $(grep nvidia-uvm /proc/devices | awk '{print $1}') 1
```
無事起動。ほっ。
中の人曰く。

- v2を使ったら？
- 上のコマンド試してみたら？

だそうです。
ご参考まで。(ついでに自分の備忘録）
Firebaseを使ってNefry BTとPythonでデータのやり取り

# はじめに
ちょっと前ですが、**Nefry BTでハードウェア**をつくり、**そのハードウェアをトリガーにしてPCのwebカメラで画像認識(openCV)をする**、といったものをつくりました。
そのとき、システムのイメージとしては下記の画像のような感じです。

Nefry BTを使うと簡単にwifiを通してデータのやり取りができるので、firebaseにデータを渡しpythonにデータを下ろすというイメージです。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/212276/a6300051-3a19-85af-c62e-9b1f1db4040d.png)

# Nefry BT側のプログラム
写真のようなボタンが押されたら、1というデータをFirebaseに渡すというプログラムになります。

![P_20180901_133106_vHDR_On.jpg](https://qiita-image-store.s3.amazonaws.com/0/212276/ed184b1c-8e20-e41c-dee3-57cbffc945bd.jpeg)


```c++

#include <Nefry.h>
#include <NefryFireBase.h>
#define SW_PIN A0
//URLに書き換えること
#define FIREBASE_HOST "自分のfirebaseのURL"

NefryFireBase firebase;

void setup()
{
  firebase.begin(FIREBASE_HOST);
  pinMode(SW_PIN, INPUT_PULLUP);
  Nefry.enableSW(); 
}

void loop()
{
  if(digitalRead(SW_PIN) == HIGH) {
      Serial.print("ボタンが押されていない");  
      DataElement elem = DataElement();
      elem.setValue("SW", "0");
      firebase.write("Nefry", &elem);//FireBaseのデータを書き込む
      Nefry.ndelay(1000);
  }else{
      Serial.print("ボタンが押された");  
      DataElement elem = DataElement();
      elem.setValue("SW", "1");
      firebase.write("Nefry", &elem);//FireBaseのデータを書き込む
      Nefry.ndelay(1000);
    
  }
}

```

# Pythonのプログラム
```python

from firebase import firebase

firebase = firebase.FirebaseApplication("https://自分のfirebaseのURL/", None)
result = firebase.get('/Nefry', None)

#jsonをパースする
response = result["SW"]
print(response)

#もしif文の中身がうまくいかないときは,型をチェックしてみること
if response == "1":
    print("ボタンが押された")
else:
    print("ボタンが押されていない")

```

# まとめ
firebaseでNefry BTとpythonの間でデータがやり取りできると、画像認識などモノづくりの幅が広がるかもしれませんね。
Railsでbootstrapを使おうと思ったら詰まった話

# はじめに
Ruby on Railsチュートリアルに従ってWebアプリケーションを作ってbootstrapを使おうと思っていたんですが、いくつかうまいこと動かないものがありました。
これはなんぞやということで色々調べていたらどうやらrailsチュートリアルではbootstrap3までしか対応していなくてbootstrap4を入れるには色々弄らないといけないらしい。
困ったので書き残しておこうと思います。
参考にしたのは[公式ドキュメント](https://github.com/twbs/bootstrap-rubygem)になります。

***

a. Gemfileに以下のものを加える。
`gem 'bootstrap', '~> 4.1.3'`
`gem 'jquery-rails'`

b.application.cssに
`@import bootstrap;`
を加える。

c.application.cssの拡張子をapplication.scssに変更する。

d.application.scssについて、
`*= require`から始めるコメント文を全て削除する。
これを削除しないとbootstrapの変数がうまく扱えないらしい。なお、これを削除した関係で読み込むcssは@importから指定して明示的に読み込む必要がある。

e.application.jsに以下を追加する。
`//= require jquery3
//= require popper
//= require bootstrap-sprockets`

これでbootstrap4が使えるようになる。
custom.cssを使う場合には、application.scssから`@import custom`としてやる。
bootstrap4と3では使える変数名も異なるのでそこにも気をつける必要があるかも。。。
Rustのdbgマクロ

Rustのデバッグ用機能のとして[RFC2361](https://github.com/rust-lang/rfcs/blob/master/text/2361-dbg-macro.md)で新しくdbg!マクロが追加されたので使ってみました。

## 従来
printデバッグをしようとすると

```rust
#[derive(Debug)]
struct SomeStruct {
    pub a: usize,
    b: usize,
}


fn main() {
    let val = 1;
    eprintln!("{}", val);
    let some_struct = SomeStruct { a: 1, b: 2 };
    eprintln!("{:?}", some_struct);
}
```
こんな感じで`{}`,`{:?}`,`{:#?}`を使ってデバッグする必要がありました。
多少面倒な感じがありました。

# dbg!
今回の追加されたdbg!マクロはこの煩わしさをいい感じに解決してくれました。
こんな感じの[コード](https://play.rust-lang.org/?gist=057cda45a8f1ea66dea0235181a0cda4&version=nightly&mode=debug&edition=2018)を実行すると 

``` rust
#![feature(dbg_macro)]

#[derive(Debug)]
struct SomeStruct {
    pub a: usize,
    b: usize,
}

#[derive(Debug)]
enum SomeEnum {
    A,
}

fn main() {
    dbg!(1);
    let val = 1;
    dbg!(val);
    dbg!("ABCD");
    dbg!(vec![1, 2, 3, 4]);
    let some_struct = SomeStruct { a: 1, b: 2 };
    dbg!(some_struct);
    dbg!(SomeEnum::A);
    let a = 1;
    let b = 2;
    let c = 3;
    let d = dbg!(a + b + c);
    dbg!(d);
    dbg!(a) + dbg!(b) + c;
}

}

```

ファイル名+行数でめっちょいい感じに出力してくれます。
うれしい！

```rust
[src/main.rs:15] 1 = 1
[src/main.rs:17] val = 1
[src/main.rs:18] "ABCD" = "ABCD"
[src/main.rs:19] vec![1 , 2 , 3 , 4] = [
    1,
    2,
    3,
    4
]
[src/main.rs:21] some_struct = SomeStruct {
    a: 1,
    b: 2
}
[src/main.rs:22] SomeEnum::A = A
[src/main.rs:26] a + b + c = 6
[src/main.rs:27] d = 6
[src/main.rs:28] a = 1
[src/main.rs:28] b = 2
```

### 補足
- stderrで出力してくれます
- println!と同様に所有権が渡されます。  
  よってこのような[コード](https://play.rust-lang.org/?gist=2e625899237a1f9015fbcdaff63d3286&version=nightly&mode=debug&edition=2018)は動きません。  

```rust
#![feature(dbg_macro)]

#[derive(Debug)]
struct SomeStruct {}
fn some_fn(_st: SomeStruct) {}
fn main() {
    let some_struct = SomeStruct {};
    dbg!(some_struct);
    some_fn(some_struct);
}
```
- [実装](https://github.com/rust-lang/rust/pull/54317/files)

# 追記
nightly版(9/26~)でしか動きません。
BigQuery 日付で自動的にパーティションを区切り有効期限を設定する

永久保存する必要のないデータにおすすめ。
日付ごとのテーブルを追加していく必要もないし、有効期限が切れたパーティションを自動で削除してくれる。

# テーブル作成

BigQueryのWebUIでテーブルを作成する。

構成例：
プロジェクト：sample-project
データセット：sample-dataset
作成するテーブル：user_login

```json:user_login
[
    {
        "name": "date",
        "type": "TIMESTAMP",
        "mode": "REQUIRED"
    },
    {
        "name": "user_id",
        "type": "INTEGER",
        "mode": "REQUIRED"
    }
]
```

テキスト編集に切り替えてJSONコードを貼りつけます。
最初はフォームで設定した後にJSONコードを出力してみるといいでしょう。
慣れたら自分でJSONコード作って貼りつけた方が早いと思います。
![eade80b1c8026d97501dd2dd8bd82bf4.png](https://qiita-image-store.s3.amazonaws.com/0/178991/0264899c-40c4-d7a4-9ac6-943a57e12456.png)
詳細オプションでパーティションの対象となるカラムを選択します。
今回は「date」
自動作成も可能です。（カラム名は「_PARTITIONTIME」になる）
リアルタイムにデータを挿入する場合は自動でもよいでしょう。
バッチ等で後から異なる日付で登録する場合は、今回の「date」のようにTIMESTAMP型のカラムを作ります。
全件取得することがなければ「パーティションフィルタを要求」にチェックをつけます。
チェックをつけるとデータ取得時に日付で絞り込みをしないとエラーになります。
（これで間違えて全件取得してしまう事故も防げます）

※注意点
・BigQueryのデフォルトタイムゾーンは「UTC」
・分割テーブルあたりの最大パーティション数 4000（※執筆時点）
　https://cloud.google.com/bigquery/quotas?hl=ja#partitioned_tables

# パーティションに有効期限を設定

WebUIで操作できない項目なのでコマンドラインツールを使います。
https://cloud.google.com/sdk/docs/?hl=ja

インストールした後にコンソール起動するとgoogleに認証を求められるので（勝手にブラウザが起動します）
BigQueryのアカウントとパスワードでログインしてください。
その後コンソールでどのプロジェクトを操作するのか聞かれるので選択します。
今回は「sample-project」
設定が終わったらコンソールで以下のコマンドを打ちます。

```
bq update --time_partitioning_expiration 2592000 sample-project:sample-dataset.user_login
```

これでパーティションの有効期限が30日になりました。
スキーマの詳細を見ると「パーティションの有効期限」という項目が増えていて設定値が「30日」になっているのが分かります。

![483f5aec29e13cd447723a44ffd79bb1.png](https://qiita-image-store.s3.amazonaws.com/0/178991/1a56c964-5f40-17a3-4aab-9aa9e7fafe85.png)
[GCP]Cloud StorageのアップロードイベントをCloud Functionsへ通知するための流れをざっくり

## 概要
`Google Cloud Functions`(以下、GCF)と`Google Cloud Storage`(GCS)を組み合わせて、サーバレスな関数を作る機会が合ったので手順を書く。
これによって、GCSにmp4をアップロードしたタイミングでGCFを起動しZencoderのAPIを通してHLSに変換したり応用した。

## やりたかった事
- GCSの特定バケットにアップロードされたイベントでGCFを起動する
- GCFはbeta版のNode.js(version8)を使う
- 環境変数をyaml形式のenvファイルに定義しGCFで使用する
    - env varはベータ版のようで下位互換なしで変更される可能性があるため注意。[詳細はこちらに](https://cloud.google.com/functions/docs/env-var)

## 前提
gcloudコマンドがインストールされている事。してない場合は[ここ](https://cloud.google.com/sdk/downloads)から

## GCFの関数サンプル
適当なディレクトリを作成し`npm init`して、エントリポイントとなる`js`ファイルを作成する。
例として`index.js`とする。`package.json`の設定は`npm init`でも後で修正するでも良い

```index.js
'use strict';

exports.sampleHandler = (data, event) => {
  console.log('hello GCS upload event');
};
```

```package.json
{
  "name": "sampleHandler",
  "version": "1.0.0",
  "description": "Google Cloud Functions Sample",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "private": true
}
```

## デプロイするまでのコマンドフロー
gcloud componentであるbetaをインストールする

```
$ gcloud components update && gcloud components install beta
```

GCFへのデプロイする。`runtime`には`nodejs8`を指定する。(いずれ、Goも指定できるようになる)

```
gcloud beta functions deploy {FUNCTION_NAME} --region {REGION} --runtime nodejs8 --stage-bucket {GCS_SRC_STORAGE} --trigger-bucket={TARGET_GCS_BUCKET}  --env-vars-file={ENV_YAML}
```

## コマンドオプション一覧
```
- {FUNCTION_NAME}
    - GCFのエントリポイントとなる関数名。例だとsampleHandler
- {REGION}
    - どのリージョンを使用するか
- {GCS_SRC_STORAGE}
    - GCFのソースコードを保存するGCSバケット
- {TARGET_GCS_BUCKET}
    - アップロードイベントを監視するGCSバケット
- {ENV_YAML}
    - 環境変数を定義したyamlフォーマットのファイル
```

## 終わり
gloud beta functionsコマンドの詳細は[公式ドキュメントにて](https://cloud.google.com/sdk/gcloud/reference/beta/functions)
smartyでdebug

###smartyのテンプレート側でdebug

```smarty:hoge.html
<!--$hogeが配列であれば以下の形でログを出力できる-->
{$hoge|@var_dump}
```

あとは{PHP}関数を使う方法でも出力できる。

```smarty:hoge.html
{php}
global $hoge;
var_dump($hoge);
{/php}
```

上記の例は、マストでglobal宣言が必要になるので注意する。
{PHP}関数は、汎用的にPHPをテンプレート内で実行できるので便利！！
Slack風のハイライトアニメーションを数行のCSSのみで作成する

# 作るもの

SlackはこまかいところまでUIにこだわりを感じるサービスですが、中でも特定のメッセージにリンクからジャンプした際、一瞬黄色くハイライトして数秒で消えていくのが地味に好きです。
![slack-effect.gif](https://qiita-image-store.s3.amazonaws.com/0/50195/5c74b981-dbc6-0472-efa6-81c8f9b55bdf.gif)
どこにジャンプしたのかが一目瞭然で、なおかつ画面を汚さない表現ですよね。

これと似たような効果を簡単なCSSのみで再現してみました。アンカーリンク `<a href="#...">` を使ってページ内スクロールをしているWebページに、すぐに導入できる方法です。

**デモ:**
<p data-height="265" data-theme-id="dark" data-slug-hash="PyZEJy" data-default-tab="html,result" data-user="psephopaikes" data-pen-title="Slack Highlight Effect" class="codepen">See the Pen <a href="https://codepen.io/psephopaikes/pen/PyZEJy/">Slack Highlight Effect</a> by HIRATA (<a href="https://codepen.io/psephopaikes">@psephopaikes</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>



# 作り方

コードはこんだけです。

```html:html
<!-- リンク -->
<a href="#link">David Verner</a>

...

<!-- リンク先 -->
<h2 id="link" class="highlight">David Verner</h2>
```

```css:css
.highlight:target{
    animation: highlight 4s;
}
@keyframes highlight {
    0%   { background: #FFC }
    100% { background: none }
}
```

### 解説
`:target`疑似属性とCSSのkeyframeアニメーションで実現しています。

`:target`疑似属性とは、要は「**ページ内アンカースクロールで、要素にジャンプしたときに対象となる**」属性です。上記CSSの例であれば、`.highlight:target`の部分は、「**`highlight`というクラスを持つ要素に、アンカーリンクでジャンプしたら**」スタイル`animation: highlight 4s;`の部分が適応されます。カンタンですね。
git diff --diff-filterが地味に優秀（削除ファイルのみ／変更ファイルのみにフィルター）

先日、関わっているプロジェクトで不要なファイルを整理していたら、3000行も削除してしまっていました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">不要なファイルを整理しまくってたら3000行も削ることになってしまった。破壊活動だ…。 <a href="https://t.co/XiHOtplGuo">pic.twitter.com/XiHOtplGuo</a></p>&mdash; F.Shibusawa (@smartponzu) <a href="https://twitter.com/smartponzu/status/1047663178950164480?ref_src=twsrc%5Etfw">2018年10月4日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

既存のコードをリファクタリングしたり、要らないなと思ったファイルは容赦なく削除したりしてると、masterとの差分がとんでもないことになります。「どのファイルを削除したんだっけ？」って思って `git diff --name-only` とかしても変更分と削除分が混ざってめちゃ見にくいです。

そんな時に、 `--diff-filter=*` オプション！

```
--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]
    Select only files that are Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), have their type (i.e. regular file, symlink, submodule, ...) changed (T), are Unmerged (U), are Unknown (X), or
    have had their pairing Broken (B). Any combination of the filter characters (including none) can be used. When * (All-or-none) is added to the combination, all paths are selected if there is any file
    that matches other criteria in the comparison; if there is no file that matches other criteria, nothing is selected.

    Also, these upper-case letters can be downcased to exclude. E.g.  --diff-filter=ad excludes added and deleted paths.

    Note that not all diffs can feature all types. For instance, diffs from the index to the working tree can never have Added entries (because the set of paths included in the diff is limited by what is in
    the index). Similarly, copied and renamed entries cannot appear if detection for those types is disabled.
```

## 変更した差分だけみたい時
```
$ git diff upstream/master --diff-filter=M
```

## 削除した差分だけみたい時
```
$ git diff upstream/master --diff-filter=D
```

## リネームした差分だけみたい時
```
$ git diff upstream/master --diff-filter=R
```

なお、逆に特定の差分を除外したいなんて時もあると思います。そんな時は、
> Also, these upper-case letters can be downcased to exclude. E.g.  --diff-filter=ad excludes added and deleted paths.

とあるように、小文字を指定してあげればOKです。
例えば、削除した差分だけ除外したい時は、

```
$ git diff upstream/master --diff-filter=d
```

のように書けばOKです。まあ便利。

ぜひ3000行くらい削除して「もう何をどんくらい削除したか分からん！」ってときに使ってみてください。
各ミドルウェアのバージョン確認方法まとめ【意外と知らない？】

# apache
https://centos.bungu-do.jp/archives/6

# centos
https://webkaru.net/linux/centos-version/

# php

```
php -v
```

# mysql

```
mysql --version
```

ストレージエンジンは下記
https://db.just4fun.biz/?MySQL/%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E4%B8%80%E8%A6%A7%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
Gitlabのリポジトリをクローンできない。Sourcetreeでエラーになる。

Sourcetreeを使ってGitlabからリポジトリをクローンしようとしたらエラーになった。

##Sourcetreeのエラー内容

```
remote: HTTP Basic: Access denied
fatal: Authentication failed for xxxxxxxxx
```

##原因
Gitlabの登録を外部サービス（github、googleなど）から行ったため、パスワードが設定されていない状態になっている。

##解決方法
Gitlabの管理画面から
右上のユーザーアイコンのprofile → 左ナビのpassword → パスワード設定
Railsにおける日付や時間を扱うカラムの命名規則

日付や時間を管理するカラムの命名規則についてネットで調べた && 社内で聞いてみたのでまとめてみたいと思います。
Railsでの開発をメインでやっているので、 `過去分詞_at` などRails寄りの内容になってしまいますｗ

## 日付・時間管理のカラムに求められる要件
大きく分けると日付・時間を管理するカラムには2つの要件があると思っています。
1. 過去の日付・時間を管理する
2. 未来の日付・時間を管理する

### 過去の日付・時間を管理する
何かが行われた日時を管理するカラムで、 `過去分詞_at` で表されます。
railsでマイグレーションするとデフォルトでファイルに入っている `timestamp` によって作られる
`created_at` や `updated_at` などがこれに当たります。

ちなみに `created_at` は `Mon, 10 Sep 2018 10:00:00 JST +09:00` のように日付と時間(とタイムゾーン)を持ちますが
時間の管理がいらない場合は、 `created_on` と英語の文法と同じように書いてあげていいようです。

※ 過去分詞_on はrailsでよく使われる記法のようで他の言語では下記のようなパターンが使われることがあるようです。
過去分詞_date
date_過去分詞
過去分詞

### 未来の日付・時間を管理する
` 名詞_date` で表します。時制を持たない複合名詞となるので、未来の日付に使えます。
過去の日付・時間を管理する要件も満たせるのですが、個人的には完了日の命名規則は↑で示したようにたくさんあるので、 `名詞_date` は未来の日付に使う などの設計規則を決めてしまってもいいのかなと思っています。

例としては、契約の更新日を管理するカラムだと `renewal_date` のようになります。
API Blueprint でAPI設計書を書く 超入門編 Part1

#Q.API Blueprint ってなに？
### A.APIの仕様書を簡単にかつ明確にドキュメントにできるツール(言語)
AWSのAPI GateWayやGCPのGoogle Cloud Endpointsで手軽に個人でRestful APIを作れる時代の今、後々共同開発する際にAPIの仕様を理解できるよう、人に後から説明するのは手間がかかります。
APIドキュメントを書いておけば、そういった時間は大幅に軽減されます。
APIドキュメントを書くツールとしてはSwaggerとAPI Blueprintが有名です。今回はAPIBluePrintを紹介しますがSwaggerについて知りたい方は @gcyata さんの投稿がわかりやすいのでリンクを載せておきます。
[Swaggerの概要をまとめてみた。by @gcyata](https://qiita.com/gcyata/items/342073fa7607fd4082bd)

# 1.API Blueprintの完成イメージを見せて!
![home.gif](https://qiita-image-store.s3.amazonaws.com/0/171398/3cac0ae7-3349-9194-bbfe-e67c1181cd48.gif)
こんな感じです！おしゃれで見やすいですよね！
あなたもたった五分で作れます！　やっていきましょう。

# 2.ソースコード
API Blueprintはmd(markdown)記述にかなり似ています。拡張子は.apibとしていますが、.mdでも問題なく動きます。
今回使っていくサイトはAPI Blueprint公式サイトのExampleからreal-world-apiをお借りします。
https://apiblueprint.org/documentation/examples/real-world-api.html
これをコピペして任意のファイルに保存してください。拡張子は.apibです。

# 3.コマンド
apibからhtmlにするにはaglioというライブラリを書くのが一番簡単でした。
https://github.com/danielgtaylor/aglio
インストールにはnpmを用います。npmがわからない方はtaiponrockさんの
[Node.js / npmをインストールする（for Windows）](https://qiita.com/taiponrock/items/9001ae194571feb63a5e)
を参考にnpmを導入してください！

```sh:aglioのインストール

$npm install -g aglio
```
任意のファイル名.apibを保存したファイルに移動します。

``` sh
$cd hogehoge
```
## ローカルサーバーを起動する。

``` sh:ローカルサーバーの起動
$aglio -i <filename.apib> --server
```
すると

```
Server started on http://127.0.0.1:3000/
Rendering .\filename.apib
```
[localhostの3000番ポート](http://localhost:3000/)でサーバーが立ち上がります。
ソースファイルを更新すると自動更新してくれる開発環境が一行で手に入ります。
![localhost.JPG](https://qiita-image-store.s3.amazonaws.com/0/171398/b2d7d2d9-5ae5-a3cf-3335-aad0913d0a94.jpeg)
## htmlファイルに保存する

``` sh:htmlファイルを作成
$aglio -i <filename.apib> -o <output.html>
```
カレントディレクトリに生成後のHTMLが保存されています。
試しに開いてみましょう(http://localhost:3000/) 
![html.JPG](https://qiita-image-store.s3.amazonaws.com/0/171398/f1775a12-6df5-f16b-f7ff-7a419abf6beb.jpeg)

ばっちりです！
# お疲れさまでした！
API BluePrint Part1はここまで！
次回はソースコードの中身を見ていきます。
jQuery Validation Pluginが使いやすくておすすめ

フォームの入力チェックに使うjavascriptだけれども。

https://jqueryvalidation.org/

なかなかよくできてて使いやすい。

基本的には適用したいformにidを振って、

```html
<form method="post" action="" id="applyForm">
<input type="text" name="name" id="name">
<input type="text" name="zip" id="zip">
.
</form>

<script type="text/javascript" src="js/jquery.validate.js" ></script>
```

```js
$("#applyForm").validate({
});
```

とするだけ。input部品のnameに対してルールやメッセージを指定すればよい。

```js
$("#applyForm").validate({
    rules: {
        name: {
            required: true,
            maxlength: 50
        }
    },
    messages: {
        name: {
            required: "お名前を入力してください。",
            maxlength: "お名前は50文字以内で入力してください。"
        },
     }
});
```

デフォルトで使えるルールにはメールアドレスチェックもあるが、自前でつくる場合は、以下のように用意しておいて、呼べば良い。

validate()の外。

```js
jQuery.validator.addMethod("isZip", function(value, element) {
  return this.optional( element ) || /^\d{3}-?\d{4}$/.test( value );
}, '郵便番号をご確認ください。');
```

validate()の中。

```json
        zip: {
            required: true,
            isZip: true
        },
```

で、表示されるエラーメッセージなんだが、デフォルトだと

```html
<input type="text" name="name" id="name" class="error">
<label id="name-error" class="error" for="name">お名前を入力してください。</label>
```

というようにlabelでclassがerrorでinput要素の後ろにくっつく。

これを変えたい場合は、validate()の中に以下のように追加する。

```js

    errorElement: "span",// labelがspanにかわる
    errorClass: "alert",// class="alert"にかわる
```

さらに、

```js

    errorPlacement: function (err, element) {
        element.before(err);
    }
```

とすればinput要素の前に表示されるようになる。

input要素に応じて表示場所を変えたい場合は、

```js

    errorPlacement: function (err, element) {
        if (element.attr("name") == "zip") {
            element.parent().before(err);
        } else {
            element.before(err);
        }
    }
```

というようなこともできる。

すばらしい。

合体。


```js
jQuery.validator.addMethod("isZip", function(value, element) {
  return this.optional( element ) || /^\d{3}-?\d{4}$/.test( value );
}, '郵便番号をご確認ください。');

$("#applyForm").validate({
    errorElement: "span",
    errorClass: "alert",
    rules: {
        name: {
            required: true,
            maxlength: 50
        },
        zip: {
            isZip: true
        }
    },
    messages: {
        name: {
            required: "お名前を入力してください。",
            maxlength: "お名前は50文字以内で入力してください。"
        }
     },
    errorPlacement: function (err, element) {
        if (element.attr("name") == "zip") {
            element.parent().before(err);
        } else {
            element.before(err);
        }
    }
});
```
GitHubでタブ幅を変更するブックマークレット

- 最近Goを使っているのだが、Goではインデントにタブ(4スペース前提)を使うことが推奨される。
- GitLab、Githubではタブは8スペースで表示される
- つらい
- [Githubのタブが8文字で見にくいのでextensionで解決](https://qiita.com/sue738/items/c68bf768f4aa30e88682)という記事でGithubでは `ts=n` を入れるとタブ幅を変更できることを知った
- でも手動でパラメータ付けるのは辛い
- じゃあブックマークレットでやればいいじゃん
    - これと同じ発想 => [BitbucketやGitHubで、ブラウザで差分表示する時に空白を無視するブックマークレット](https://qiita.com/gimKondo/items/6b60a52bf73eae5e758b)
- でも今のプロジェクトで使ってるのはGitLabで、GitLabでは `?ts=n` パラメータは効かない
- やっぱりつらい
- でも、せっかく作ったし、いずれGithubでGo使うこともあるかもしれないし公開しておく。

4スペースに変更するブックマークレットはこちら(他のスペース幅にする場合は2箇所のts=2を適当な数値変更すれば良い)

```javascript
javascript:(function(){var q=location.href.split("?");var h=location.href.split("#");var%20b=location.href.split(/[\?#]/)[0];var%20p=q.length==1?"?ts=4":"?"+q[1].split("#")[0]+"&ts=4";var%20a=h.length==1?"":"#"+h[1];location.href=b+p+a;})()
```
昨日のエクセルマクロの学習

昨日は、エクセルVBAをやっておりました。
エクセルVBAでMsgBoxを出したり、for文を使ったり
特定のセルにワークシート関数のifやsumを使って
結果を出してみたり、ということをやってきました。

昨日は、for文を使って、変数iに数字を代入させて
代入させた数字をワークシート名にして連続的に
生成させるということをしていました。

その画像は下記になります。
![VBA-Macro-1003.jpg](https://qiita-image-store.s3.amazonaws.com/0/200171/202b140b-5618-a203-9d6a-ea814ebbedef.jpeg)
上の画像では、ワークシートの名前を「20181003」といった形にしてみました。

次の画像はこちらです。
![VBA-Macro-1003(1).jpg](https://qiita-image-store.s3.amazonaws.com/0/200171/c8577af3-7c28-308e-338d-7e5595972cd1.jpeg)
for文を使って1～10まで連続的にワークシートを生成してみました。
その際、Withステートメントを使い、ワークシートの生成をさせました。

こうして新しいことを覚えていくのはワクワクします。
全く別の分野と組み合わせて、マクロでクイズを作ったりしようかなと
考えて日々、勉強しています。

まだまだ、エクセルマクロに関して知識が足りない部分は多いですが
頑張っていこうと思います。

できるだけ毎日更新するようにしていきます。

最後に、昨日のマクロの実装したときのキャプチャを載せます。
![VBA-Macro-1003(2).jpg](https://qiita-image-store.s3.amazonaws.com/0/200171/4ac7b63e-bc78-b1e1-9694-8e53d7f2a3af.jpeg)

また、後程更新したいと思います。
[iOS][Xcode 9]超便利！ 新しく色をアセットに追加できるようになった！

#色をプロジェクトに追加し、新しく追加した色を設定
![AddCustomColor.gif](https://qiita-image-store.s3.amazonaws.com/0/82835/a0345bcf-a587-9155-fc76-c8a3ff8f68d4.gif)

1. *.xcassetsを選択し、右クリックから”New Color Set”を選択します。
2. 色を設定し、新しい色の名前に変更します。
3. 新しく作成した色を選択できるようになりました。

Xcode 9から新しく追加されました。
Linuxの本番サーバでコマンドプロンプトを赤文字にするハック

## 用途

* 本番サーバでの作業はクリティカルなのだけど、本番サーバと他のサーバでプロンプトが同じだと判別しづらいので、プロンプトの色を赤にするハック。

## 追記

`vim ~/.bashrc`

```.bashrc
export PS1='[\[\033[31m\]\u@\h \W\[\033[00m\]]$ '
```
Neo4jにログインできない場合の対処

業務でNeo4jを使うことになりました。

学習用に以下の記事を参考に環境構築している際にログインができない問題に当たったので解決法を残しておきます。
> [Neo4j をWindowsでHello World (2018)](https://qiita.com/567000/items/363c23079e74e16a9c63)

# エラーメッセージ

```
WebSocket connection failure. Due to security constraints in your web browser, the reason for the failure is not available to this Neo4j Driver. Please use your browsers development console to determine the root cause of the failure. Common reasons include the database being unavailable, using the wrong connection URL or temporary network problems. If you have enabled encryption, ensure your browser is configured to trust the certificate Neo4j is configured to use. WebSocket readyState is: 3
```

![neo4j-error.jpg](https://qiita-image-store.s3.amazonaws.com/0/256853/73b1e343-7335-072a-5dc4-4cee72a90b9b.jpeg)

# 解決策
公式ページに載っていました。
> [Explanation of error “WebSocket connection failure. Due to security constraints in your web browser, the reason for the failure is not available to this Neo4j Driver…](https://neo4j.com/developer/kb/explanation-of-error-websocket-connection-failure/)

neo4j.conf内の以下の文(71行目)をアンコメント

```
// dbms.connector.bolt.listen_address=:7687
```
↓

```
dbms.connector.bolt.listen_address=:7687
```

と、これをやった後に気づいたのですが、ずっとhostのところにusername、を入力してました(上記スクショ参照)そりゃあログインできませんね。
もしつまづいた方は試してみてください。
Rails:  db:reset よりも db:migrate:reset を使うべき理由 (とその違い)

なぜなら。

`db:reset` < `db:migrate:reset`

という関係で、後者の方が**強力**だからだ。
`db:migrate:reset` はすべてをやり直してくれる。

自分はこの関係を理解しておらず 「db:resetの方が強力だ」と思い込んでいたため、はまった。

# 両者の違い

- db:reset はマイグレーションファイルを編集しても、その内容は反映されない。スキーマファイル ( db/schema.rb ) だけを利用する。
- db:migrate:reset はマイグレーションファイルを直接利用する。つまり、変更が反映される。

# 備考

- [rake db:reset と rake db:migrate:reset の違い](http://easyramble.com/difference-bettween-rake-db-migrate-reset.html) を参考にした
- 語感的に db:reset の方が強そうなのだが、イメージとは逆だった。

# Links

- [古いアカウントの記事より移動](https://qiita.com/Yinaura/items/6c7891452b15b2b8b1b9) 








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Jenkins Piplelineでなぜか「FileNotFoundException」が出たので対処

Jenkinsfileが見つからないとのエラー？が出たので、[設定]-[Script Path]のjenkinsfileを一度空にしてから再度指定したら直った
```bash
java.io.FileNotFoundException
	at jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.java:167)
	at jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.java:159)
	at jenkins.plugins.git.GitSCMFileSystem$3.invoke(GitSCMFileSystem.java:193)
	at org.jenkinsci.plugins.gitclient.AbstractGitAPIImpl.withRepository(AbstractGitAPIImpl.java:29)
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.withRepository(CliGitAPIImpl.java:72)
	at jenkins.plugins.git.GitSCMFileSystem.invoke(GitSCMFileSystem.java:189)
	at jenkins.plugins.git.GitSCMFile.content(GitSCMFile.java:159)
	at jenkins.scm.api.SCMFile.contentAsString(SCMFile.java:338)
	at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.java:110)
	at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.java:67)
	at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:303)
	at hudson.model.ResourceController.execute(ResourceController.java:97)
	at hudson.model.Executor.run(Executor.java:429)
Finished: FAILURE
```
RustでDBを扱うときのベストプラクティス

## はじめに

RustでDBといったらDieselですが、色々ややこしいですよね、こいつ。
なので自分なりのルールというか、Tipsをまとめようと思います。
大層なタイトルつけといてなんですが、これ全然**ベストプラクティスじゃないです**。
なので、**あなたのプラクティスを教えてください！**
都度更新していきたいと思います。

### 特定の環境でしか使えないようなmigration codeは書かない

たとえPostgresを使うことが決まっていたとしても、テストなどで SQLite が活躍するので。

例えば、以下のようなSQLはよくない

```sql
CREATE TABLE posts (
  id SERIAL PRIMARY KEY
)
```

SERIALはPosgresでしか使えない。
SERIALの代わりにINTEGERを使う。
必要なら AUTO INCREMENTつける。

```sql
CREATE TABLE posts (
  id INTEGER PRIMARY KEY
)
```

### 最初はSQLite環境でデバッグを行う
 	
SQLのデバッグとか。
前まではDockerで立てたりしてたんだけど、こっちの方が早い。

```bash
$ diesel setup --database-url db.sqlite3
$ diesel migration generate --database-url db.sqlite3
$ diesel migration run --database-url db.sqlite3
$ diesel print-schema --database-url db.sqlite3
```


### テストではSQLiteのin memory版を使う

```rust
SqliteConnection::establish(":memory:").unwrap()
```

便利

### diesel.tomlファイルを使う

http://diesel.rs/guides/configuring-diesel-cli/

`diesel setup`を行うと、デフォルトの`diesel.toml`ファイルができあがる。

今の所は`print_schema`セクションしかないみたいだけど。
`file`フィールドは絶対使う。

これは、`$ diesel print-schema` のたびにそこにschema情報が書かれるというもの。


### Migrationをプログラムで行うときは`diesel_migrations`を使う

[diesel_migrations](https://crates.io/crates/diesel_migrations)

テストのときとかね。
そもそも migration をプログラム上で行うのはアンチパターンなのだろうか。
教えて欲しい。
C / C++ 最初の一度だけ実行する関数

### 概要
この関数何回か呼ばれるけど、この部分一回だけ実行したいなぁ・・・
ってことがまれによくあるので、解決方法を変態度が低い方から紹介していく。

### 1.グローバル変数フラグ
一番原始的な方法。
野蛮とも言う。
むしろ変態度が高いかもしれない。
名前空間を汚染するからやめたほうがいい。
というかやめろ。

```cpp
#include <iostream>
void f(){ // 一度だけ実行したい関数
  std::cout << "hello" << std::endl;
}

bool IsFirst = true;
main(){
  for(int i;i < 10;i++){
    if( IsFirst ){
      f();
      IsFirst = false;
    }
  }
}
```

### 2.static変数フラグ
一番一般的かもしれない。

```cpp
#include <iostream>
void f(){ // 一度だけ実行したい関数
  std::cout << "hello" << std::endl;
}

main(){
  static bool IsFirst = true; 
  for(int i;i < 10;i++){
    if( IsFirst ){
      f();
      IsFirst = false;
    }
  }
}
```

### 3.`std::call_once`を利用( c++のみ )
マルチスレッド対応。
お行儀がよい。

```cpp
#include <iostream>
#include <mutex>
void f(){ // 一度だけ実行したい関数
  std::cout << "hello" << std::endl;
}

main(){
  for(int i;i < 10;i++){
    static std::once_flag flag;
    std::call_once( flag, f );
  }
}
```

### 4.static変数の初期化を利用
マニアック過ぎ。
でも、一番スマート（だと思う）。

```cpp
#include <iostream>
void f(){ // 一度だけ実行したい関数
  std::cout << "hello" << std::endl;
}

main(){
  for(int i;i < 10;i++){
    // static変数の初期化は最初の一度しか実行されない。
    static bool CallOnce = [](){ f();return true; }(); // 右辺はラムダ式の実行
  }
}
```


### 5.マクロで定義
4で紹介した方法の応用。
`__LINE__`でユニークな名前を生成してるのがミソ。

```cpp
#include <iostream>
void f(){
  std::cout << "f" << std::endl;
}
void g(){
  std::cout << "g" << std::endl;
}
void h(){
  std::cout << "h" << std::endl;
}

#define CAT_(a,b) a##b
#define CAT(a,b) CAT_(a,b)
#define do_once(f) static bool CAT(DO_ONCE_,__LINE__)=[](){f();return true;}();

main(){
  for(int i;i < 10;i++){
    do_once( f ); // f,g,h がそれぞれ一回ずつ呼ばれる
    do_once( g );
    do_once( h );
  }
}
```
任意の引数の関数を呼ぶには、ラムダ式に包んでやるといい。

```cpp
do_once([](){ function( 1,2,3,"abc"); });
```


### 6.おまけ N回実行
5で紹介した方法の応用。

```cpp

#include <iostream>
void f(){
  std::cout << "f" << std::endl;
}

#define CAT_(a,b) a##b
#define CAT(a,b) CAT_(a,b)
#define do_times(f,n) static int CAT(DO_ONCE_CTR,__LINE__)=n;\
                       if(CAT(DO_ONCE_CTR,__LINE__)>0){\
                         f();\
                         CAT(DO_ONCE_CTR,__LINE__) --;\
                       }\

main(){
  for(int i;i < 10;i++){
    do_times( f, 5 );// f が5回実行される
  }
}
```
[ブログ]量子コンピュータ用pythonライブラリまとめ

#はじめに
　どうも、初めて記事を投稿します。和麿です。この数年毎日のようにニュースで人工知能と言う言葉を目にします。僕も2年前にNAVERまとめサイトで人工知能に関連した記事に興味を持った人間の一人です。その中でpythonを覚え、ヘタの横好きでぼちぼち続けています。
　最近は人工知能ライブラリは広く普及して、至るところでGPUとubuntu、Googleの出したTensorflowを用いたデモンストレーションを目にします。ここまで来ると天邪鬼の私はあまり面白くありません。『次のテーマはないか』そう感じています。その中で最近僕が注目しているテーマは以下の２つです。

- ブロックチェーン
- 量子コンピュータ関連ソフト

　この中で今回は量子コンピュータのpythonライブラリを浅く紹介していこうと考えております。構成はブログのように書いていきます。本記事では量子コンピュータのシュミレータやそれに関するサービス開発している企業を紹介します。その後各会社が出しているライブラリを軽く紹介していこうと考えています。

#ライブラリを開発している会社
　まず、量子コンピュータ関連ソフトの開発をしている企業を示します。Microsoft、Google、IBM、D-Wave、Rigetti、MDR株式会社が僕の知るライブラリを開発中の企業です。その中でpythonのライブラリを開発している企業はMicrosoftを除いた5社です。この事実を踏まえると今後pythonを用いた量子コンピュータ開発がドンドン進んでいくだろうと私は予想しています。

##Google
　Googleでは<a href="https://github.com/quantumlib" target="_blank">quantumlib</a>というプロジェクトが走っています。この中には<a href="https://www.infoq.com/jp/news/2018/08/google-cirq-quantum-library" target="_blank">Cirq</a>というライブラリなどが開発されています。このライブラリは量子アルゴリズムの作成、操作、最適化をシミュレーションしてくれるソフトになっています。使用方法はそれぞれのgithub内のREADEMEを読めば分かるようになっています。
　余談ですがGoogleは量子コンピュータのハードウェアも開発しています。これを<a href="https://jp.techcrunch.com/2018/03/06/2018-03-05-googles-new-bristlecone-processor-brings-it-one-step-closer-to-quantum-supremacy/" target="_blank">Bristlecone</a>と呼びます。今後はハードとソフト両面を見た開発が進んでいくと予想しています。

##IBM
　IBMでは<a href="https://github.com/Qiskit" target="_blank">Qiskit</a>と言うソフトウェアが開発されています。本ソフトでは量子回路を実装し、シミュレーションを行うことができます。インストール方法はgithub内のREADMEにかかれています。参考プログラムもあり、知識がなくても環境があれば動かすことは可能です。
　IBMもGoogleと同様に<a href="https://www.ibm.com/developerworks/jp/cloud/library/cl-quantum-computing/index.html" target="_blank">IBM-Q</a>というハードウェアも開発しています。<a href="https://www.businessinsider.jp/post-167668" target="_blank">慶応大学や産業界が注目して</a>います。本装置はクラウドコンピューティングのサービスが実施されているようです。

##D-Wave
　<a href="https://www.youtube.com/watch?v=CMdHDHEuOUE" target="_blank">D-Wave</a>はNASAとGoogleも協力して量子コンピュータの実用化を目指している会社です。ここもすでに量子コンピュータの実現を達成しています。勿論シミュレータソフトの開発も2018年現在行われています。<a href="https://github.com/dwavesystems" target="_blank">dwave-nealやqbsolv</a>など複数のソフトが開発されています。


##Rigetti
　<a href="https://wired.jp/2017/07/31/quantum-computing-factory-taking-on-google-ibm/" target="_blank">Rigetti</a>は量子コンピュータの実現を目指すVB(Venture Business)です。ここでも<a href="https://github.com/rigetticomputing" target="_blank">pyQuil</a>を始めとしたシミュレータの開発が行われています。

##MDR株式会社
　<a href="http://mdrft.com/" target="_blank">MDR株式会社</a>は量子コンピュータの実用化を目指したの本発のVBです。東大発ベンチャーのようです。ここでも<a href="https://github.com/mdrft" target="_blank">WildqatやBlueqat</a>のソフトウェアが開発されています。
　ここは<a href="https://prtimes.jp/main/html/rd/p/000000004.000033764.html" target="_blank">MUFG(三菱UFJ銀行)と共同開発を進めたり、国家プロジェクトにも参加</a>して活動を行っているようです。

#おわりに
　今回は個人的な備忘録として記事を書きました。まとめてみて再度思ったのですが、今後量子コンピュータの実用化はドンドン進んでいくと感じました。個人的には日本の企業に頑張って欲しいと思いました。
　素人の記事なので間違いや網羅しきれていない部分は多々あると思います。もし何かありましたら、コメントなどでこっそり教えてください。（笑）
　それでは本記事を終了します。ここまで読んでいただいた方には感謝申し上げます。ありがとうございました。

以上
Minecraft Bedrock Edition のサーバを Docker で雑に

とりあえず雑に。情報共有になることを信じて。

誰かにもっとよい物を作って欲しいです。docker-compose あたりで。

Minecraft Bedrock Edition(1.6.1.0) です。具体的に言うと Android, iOS, Windows 10。

正確には Xbox One や Nintendo Switch も含まれるのですが、彼らは任意のサーバを利用することができないはずです。

## tl;dr

```Dockerfile
FROM ubuntu:18.10
MAINTAINER local
WORKDIR /root
RUN apt update && apt install -y make wget gcc perl unzip libcurl4-openssl-dev
RUN wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.6.1.0.zip && wget https://github.com/openssl/openssl/archive/OpenSSL_1_0_0-stable.zip
RUN unzip OpenSSL_1_0_0-stable.zip && unzip bedrock-server-1.6.1.0.zip
WORKDIR /root/openssl-OpenSSL_1_0_0-stable
RUN ./config shared && make && make install
ENV LD_LIBRARY_PATH .:/usr/local/ssl/lib
WORKDIR /root
CMD ["./bedrock_server"]
```

## 説明

> FROM ubuntu:18.10

なんか glibc だかのバージョンが古いらしくて、それをどうにかできたのが ubuntu 18.10 だった。alpineでの実現方法を知りたい

> MAINTAINER local
> WORKDIR /root

適当

> RUN apt update && apt install -y make wget gcc perl unzip libcurl4-openssl-dev

`curl` があるけど個人的な好みで `wget` を得た

`unzip` は解凍用

`gcc perl libcurl4-openssl-dev` は OpenSSL のビルドをするため

> RUN wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.6.1.0.zip && wget https://github.com/openssl/openssl/archive/OpenSSL_1_0_0-stable.zip

bedrock の linux 用サーバと `libssl.so.1.0.0` を要求してくるので OpenSSL 1.0.0 を得る

> RUN unzip OpenSSL_1_0_0-stable.zip && unzip bedrock-server-1.6.1.0.zip

雑に解凍

> WORKDIR /root/openssl-OpenSSL_1_0_0-stable
> RUN ./config shared && make && make install

OpenSSLのビルド。 `config` に `shared` を付けたのは so ファイルを生成させるため。

> ENV LD_LIBRARY_PATH .:/usr/local/ssl/lib

bedrock_server の起動に必要な環境変数。 `/usr/local/ssl/lib` は `libssl.so.1.0.0` のため

> WORKDIR /root
> CMD ["./bedrock_server"]

起動。終了のことは考えてない。
historyコマンド

# お題
家ではLinux、会社ではMacを使っていて、```history```コマンドにご厄介になることが多い。
（```fish```とか```peco```とか入れてる人はそんなことないのかな・・・）
使うのは、たいてい、過去に自分が叩いた（長めの）コマンドが何だったか知りたい時。
こんな感じで。「```history | grep docker```」
とした時に、似たようなのが複数出て、「これ、いつ叩いたやつだっけ？」と、ふと、ヒントが欲しくなる。
コマンド叩いた日時が出たらいいなぁと思って調べたら設定ひとつでできたので、ついでに便利そうな設定や使い方が他にもないか調べてみた。

# 環境
Linux(Ubuntu)だけど、historyいじるので本体を汚すのは避けたくdocker(イメージは```ubuntu:latest```)を使用。

# 実践
## ■コンテナ準備

```
> sudo docker pull ubuntu:latest
latest: Pulling from library/ubuntu
　〜省略〜
Status: Downloaded newer image for ubuntu:latest

> sudo docker run -itd ubuntu

> sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
79a9cefd4368        ubuntu              "/bin/bash"         7 seconds ago       Up 5 seconds                            fervent_kare

> sudo docker exec -it 79a9cefd4368 bash
root@79a9cefd4368:/# 
```

## ■historyコマンド叩いたら各コマンド実行日時も出るようにする

```
root@79a9cefd4368:/# history
    1  history
root@79a9cefd4368:/# export HISTTIMEFORMAT='[%Y/%m/%d %H:%M:%S] '
root@79a9cefd4368:/# history
    1  [2018/10/03 16:15:14] history
    2  [2018/10/03 16:15:26] export HISTTIMEFORMAT='[%Y/%m/%d %H:%M:%S] '
    3  [2018/10/03 16:15:29] history
root@79a9cefd4368:/# 
```

これで、パイプで ```grep``` する時、日付で絞れる。
（ログインのつど ```export``` 叩くの嫌だから、 ```.bashrc``` あたりに書いておく。）

## ■(「history」みたいに)いちいち履歴に出なくていいやつを除外する

```
root@79a9cefd4368:/# export HISTIGNORE=history*:man*
root@79a9cefd4368:/# pwd
/
root@79a9cefd4368:/# history
    1  [2018/10/03 16:31:31] export HISTIGNORE=history*:man*
    2  [2018/10/03 16:31:39] pwd
root@79a9cefd4368:/# man ls
bash: man: command not found
root@79a9cefd4368:/# history
    1  [2018/10/03 16:31:31] export HISTIGNORE=history*:man*
    2  [2018/10/03 16:31:39] pwd
root@79a9cefd4368:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@79a9cefd4368:/# history
    1  [2018/10/03 16:31:31] export HISTIGNORE=history*:man*
    2  [2018/10/03 16:31:39] pwd
    3  [2018/10/03 16:32:18] ls
```

「history」、「man」コマンドの履歴は出てこなくなった。

## ■履歴を全消し

```
root@03c12f5ae24d:/# history -c
root@03c12f5ae24d:/# history
```

ただ、コンテナにログインしなおしたら、クリアしたはずの履歴が復活してた。
「```~/.bash_history```」に情報が残っているためみたい。「```-c```」はカレントコンソールの履歴はクリアするけど、
「```~/.bash_history```」の情報は消してくれず、再ログイン時に履歴が元に戻る挙動のよう。
こうすると良いみたい。↓

```
root@03c12f5ae24d:/# history -c && history -w
root@03c12f5ae24d:/# history
root@03c12f5ae24d:/# exit
exit
koge@koge-W65-67SF:~$ sudo docker exec -it 03c12f5ae24d bash
root@03c12f5ae24d:/# history
    1  [2018/10/03 17:10:25] exit
```

## ■履歴のサイズを限界まで上げる

```
root@03c12f5ae24d:/# echo $HISTSIZE
1000
root@03c12f5ae24d:/# export HISTSIZE=10000
root@03c12f5ae24d:/# echo $HISTSIZE
10000
```

# まとめ
実験は終わったので、種々の ```export``` をコンテナでない本体の「```~/.bashrc```」に追記して終了。
仮想マシンのアーキテクチャの種類とその特徴まとめ

近年、コンテナ型の仮想化技術を利用したDockerが流行っていて、使ってみるだけならその仕組を理解していなくても大丈夫なくらいには簡単で便利です。しかし、そもそも仮想マシンとはどういうもので、その中でコンテナ型とはどういうものなのか、を把握しておくことは大事なのではないでしょうか。以下に、簡単に仮想マシンのアーキテクチャの種類とその特徴をまとめました。

## ホスト型
ホストOS上に仮想ハードウェアを入れ、その上でゲストOSを動かす方式。　

* 参考 : [1日5分のXen理解: 第1回 仮想マシンとは何か？](https://www.ibm.com/developerworks/jp/linux/library/itm-review1/index.html)
* 例 : User Mode Linux, VMware Workstation, VMWare Fusion
* メリット: 既存の環境の上で仮想マシンを構築できるため、導入が手軽にできる
* デメリット: ゲストOSからハードウェアへのアクセスには必ずホストOSを経由するため、オーバーヘッドが大きくなる

## ハイパーバイザー型
ハードウェア上にハイパーバイザーと呼ばれる仮想マシン管理ソフトウェアを用意し、その上でゲストOSを動かす方式。 ハイパーバイザーにどこまで機能をもたせるかによって、モノリシックカーネル型と、マイクロカーネル型に分けることができる。

* 参考 : [サーバーの仮想化とは？仕組み、メリット・デメリットをわかりやすく解説します](https://www.kagoya.jp/howto/rentalserver/virtualization/)、[正式リリース版で見るHyper-Vのアーキテクチャ](http://techtarget.itmedia.co.jp/tt/news/0807/07/news01.html)
* 例 : Xen, Linux KVM
* メリット: ホスト型に比べてホストOSがない分、オーバーヘッドが小さい
* デメリット: 専用のハードウェアを用意する必要があり手間がかかる

### モノリシックカーネル型
仮想マシンを実行するためのすべての機能をハイパーバイザーが担う方式。

* 例 : VMWare ESXi
* メリット:すべての処理をハイパーバイザーが担うのでコンテキストスイッチがなく処理が早い
* デメリット:アドレス空間の分離がなくセキュリティ上のリスクが高くなる

### マイクロカーネル型
仮想マシンの管理やデバイスドライバを、特別な権限をもった仮想マシン(親パーテーション)に任せ、ハイパーバイザーの機能を最小限にする方式である。

* 例 : Hyper-V 
* メリット: アドレス空間が分離され、セキュリティ上安全である。通常のOSのデバイスドライバがそのまま使える
* デメリット:ハイパーバイザーと親パーテーションでのコンテキストスイッチによるオーバーヘッドがある

## コンテナ型
OSレベルではなく、アプリケーションレベルでの仮想化をひとつのホストOS上で行う方式。

* 参考 : [【図解】コレ１枚で分かるコンテナ型仮想化とDocker](http://blogs.itmedia.co.jp/itsolutionjuku/2015/05/docker.html)
* 例 : Docker, LXC, OpenVZ
* メリット: ハイパーバイザー型よりさらにオーバーヘッドが小さい。メモリなどの資源が節約できる
* デメリット: コンテナ間の分離のレベルが低いのでセキュリティ上のリスクが高い
cifar10 で Test Time Augmentation (TTA) の実験

Deep Learning の、特に画像分類系のタスクでよく使用される、 Test Time Augmentation (TTA) という Augmentation の手法を友人 ([@hattan0523](https://twitter.com/hattan0523)) に聞いたので、実際変わるものかと思ってカジュアルに試してみました。
なんかコンペとかでは必須らしい。

※ 間違いなどご指摘歓迎です。

# Test Time Augmentation (TTA) とは

機械学習、特に Deep Learning では、大きなモデルを学習させるためにたくさんの訓練データが必要になります。
データが増えるほど精度が上がったり、複雑なモデルも学習できるようになることが知られています。
そこで、訓練用データを少し加工し別のデータとしてデータセットに加えることで、学習に使えるデータの量を増やす試みがよく行われており、 Data Augmentation と呼ばれます。
特に画像系のタスクでよく使われており、元の画像を回転したり反転したりした画像を新たなデータとすることで、データ量を2倍、3倍と増やすことが出来るという仕組みです。

TTA は、学習時ではなく、推論時にも Augmentation を行うことで、推論の精度を上げる手法です。

推論時のデータを加工することで、1つのデータを数種類作成します。
その数種類のデータに対して学習したモデルで推論を行い、結果の平均や多数決をとってそれを推論結果とすることで精度を上げます。バギングのようなイメージですね。
![tta.png](https://qiita-image-store.s3.amazonaws.com/0/49409/ddeb95fb-b4b1-b1c4-9552-81af967e2662.png)

# シンプルなタスクで実験

今回は cifar10 を使って、簡単な分類問題を試してみました。
TensorFlow を使っています。
単純化のため、augmentation は Horizontal Flip だけを足しています。

下記の4種類の実験を行ってみました。

1. Augmentation なし
2. Data Augmentation を追加
3. Test Time Augmentation を追加
4. Data Augmentation と Test Time Augmentation を追加

Data Augmentation は各バッチのデータごとに確率0.5で Flip を行うようにしました。
TTA は、二種類の画像(オリジナルと Horizontal Flip したもの)で、最終的に得られる確率(出力の softmax )が高い方の結果を採用するようにしました。どちらも同じ推論結果になった場合はもちろん影響ありません。

## 実装

[こちらの記事](https://qiita.com/cfiken/items/b477c7878828ebdb0387)で使ったものとだいたい同じモデルを使いました。 TensorFlow でモデルを書いていて、記事のCNNモデルクラスをそのまま使ったので、今回は Augmentation や TTA 自体は numpy で計算してます。

```py
# 画像を水平方向に Flip
def horizontal_flip(img: np.array, rate: float=0.5):
    if rate > np.random.rand():
        return img[:, ::-1, :]
    return img
```
効率を見るなら TTA も TensorFlow のオペレーションで書いたほうが良さそう。
もしくは Keras の ImageGenerator というものがあるそうで、次の記事などが参考になりそうです。
[Kerasでデータ拡張(Data Augmentation)後の画像を表示する](https://qiita.com/takurooo/items/c06365dd43914c253240)


その他の実装は https://github.com/cfiken/tta-try に置いてますが、ipynb 上でやってる上に結構雑なので参考にならないと思います。。


## 結果

![results.png](https://qiita-image-store.s3.amazonaws.com/0/49409/2adb2232-2c86-bbd1-7456-c927127f548c.png)

わかりやすい結果になってよかった。

Data Augmentation がある場合、ない場合それぞれに対して、TTA を入れるとだいたい 0.02 ほど精度が向上しています。
Horizontal Flip だけでこれなので、種類を増やせばもう少し上がることは期待できそうです。

# まとめ

精度を上げたいなら、トレーニング時の Data Augmentation だけじゃなく TTA も入れましょう。

# 参考

[Augmentation for Image Classification](https://towardsdatascience.com/augmentation-for-image-classification-24ffcbc38833)
VS-Codeの設定開発しやすくする

自分のメモを公開します。好きな方が理由に利用ください
# Install

- [ここ](https://code.visualstudio.com/docs?dv=osx)にダウンロードしてください

## List extensions

- [Vim mode](https://marketplace.visualstudio.com/items?itemName=vscodevim.vim)
- [Indent-Rainbow](https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow)
- [ESlint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
- [GitLens — Git supercharged](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
- [Atom Keymap](https://marketplace.visualstudio.com/items?itemName=ms-vscode.atom-keybindings)
- [highlight-matching-tag](https://marketplace.visualstudio.com/items?itemName=vincaslt.highlight-matching-tag)
- [file-icons](https://marketplace.visualstudio.com/items?itemName=file-icons.file-icons)
- [Ruby](https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby)
- [Slim](https://marketplace.visualstudio.com/items?itemName=sianglim.slim)
- [Sass](https://marketplace.visualstudio.com/items?itemName=robinbentley.sass-indented)

HTML

- [Auto Close Tag](https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-close-tag)
- [Auto Rename Tag](https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag)

## おすすめのユーザー設定

- この設定のままで使える

```settings.json
{
    "editor.rulers": [80, 120], //一行の文字限定の設定
    "files.autoSave": "onFocusChange",　//　自動でファイルを保存する
    "editor.tabSize": 2,　//名前通り
    "editor.renderWhitespace": "boundary",　// スペースの表示
    "markdown.preview.breaks": true,
    "editor.mouseWheelZoom": true,
    "workbench.activityBar.visible": true,
    "files.trimTrailingWhitespace": true,
    "files.insertFinalNewline": true,
    "editor.cursorBlinking": "phase",
    "editor.wordWrap": "on",
    "files.trimFinalNewlines": true,
    "editor.tabCompletion": true,
    "editor.formatOnPaste": false,
    "vim.startInInsertMode": true,
    "explorer.confirmDelete": false,
    "terminal.explorerKind": "external",
    "terminal.external.linuxExec": "iterm",
    "vim.useCtrlKeys": false,
    "vim.autoSwitchInputMethod.enable": true,
    "prettier.eslintIntegration": true,
    "prettier.arrowParens": "always",
    "prettier.proseWrap": "always",
    "prettier.requireConfig": true,
    "prettier.singleQuote": true,
    "ruby.format": "rubocop",
    "ruby.intellisense": "rubyLocate",
    "ruby.codeCompletion": "rcodetools",
    "explorer.confirmDragAndDrop": false,
    "gitlens.advanced.messages": {
        "suppressLineUncommittedWarning": true
    },
    "breadcrumbs.enabled": true,
    "editor.lineNumbers": "on",
    "auto-close-tag.SublimeText3Mode": true,
    "auto-close-tag.fullMode": true,
    "html.format.endWithNewline": true,
    "git.autofetch": true,
    "html.format.indentHandlebars": true,
    "html.format.indentInnerHtml": true,
}

```