OmniAICreator/Qiita-1.07M huggingface dataset:
OpenCV 5.0.0をVisual Studio 2022から使用する時の手順

# 概要
OpenCV 5.0.0をVisual Studio 2022で使用する時の手順


# 環境
+ Windows 10(64Bit)
+ OpenCV 5.0.0
+ Visual Studio 2022


# 対象
+ Windowsマシン保持者
+ OpenCVをC++で触りたい人
+ PATHへの理解がある


# 記事を読んで出来る事
+ Visual Studio 2022を用いたOpenCVプログラミング


# 手順
## OpenCVの取得
https://github.com/opencv/opencv/releases
より、
https://github.com/opencv/opencv/releases/download/5.0.0-alpha/opencv-5.0.0-alpha-windows.exe
をDLする


## OpenCVの導入
ダブルクリックで導入出来るが、
+ opencv
  + build
  + source

の階層になっているうち、必要になるのは『build』フォルダのみなので『build』フォルダのみ展開してもよい
以降便宜上opencvのrootパスを『%OPENCV%』と記載する
環境変数として追加するのも可


## Visual Studio 2022設定
### プロジェクト設定
|設定内容|値|
|:-----------|:------------|
|開始方法|新しいプロジェクトの作成|
|言語|C++|
|プラットフォーム|Windows|
|テンプレート|空のプロジェクト|


### 構成
|設定内容|値|
|:-----------|:------------|
|ソリューション構成|Debug or Release|
|ソリューションプラットフォーム|x64|
|構成プロパティ/デバッグ：環境|PATH=%PATH%;%OPENCV%\build\x64\vc16\bin|
|構成プロパティ/VC++ ディレクトリ：外部インクルード ディレクトリ|%OPENCV%\build\include|
|構成プロパティ/VC++ ディレクトリ：ライブラリ ディレクトリ|%OPENCV%\build\x64\vc16\lib|
|構成プロパティ/リンカー/入力：追加の依存ファイル|opencv_world500d.lib or opencv_world500.lib|

### プログラム
```cpp:main.cpp
#include <opencv2/opencv.hpp>

using namespace cv;

int main()
{
	Mat image = Mat::zeros(100, 100, CV_8UC3);
	imshow("", image);
	waitKey(0);
}
```
小さなウインドウが表示されたら成功です。

以上です。
お疲れさまでした。
dieselのサンプル(sqlite)を動かしてみた


rustをポチポチ触り始めました。rustでデータベースを触りたかったのでdieselのサンプルをいじってみました。

リポジトリのexampleにはSQLiteの具体的な手順が書いてなくて多少苦労したので備忘録を兼ねて書きます。

~~サンプルソース自体の解説はしません~~Rustのことが全然分かっていないので解説できません。

# diesel

[Diesel](http://diesel.rs/)は「A safe, extensible ORM and Query Builder for Rust」らしいです。

rustのORMの中では一番流行っているようなのでこれを選びました。

# 環境

ubuntu16.04
SQLite 3.11.0
rustup 1.5.0
rustc 1.21.0-nightly
cargo 0.22.0-nightly
diesel 0.15.0

rustcはnightlyでなくても良いかもしれません。

# 準備

sqlite3をインストールしておいてください。

diesel_cliをインストールしてdieselコマンドを使えるようにします。postgresqlやmysqlが入っていない場合エラーになるので、以下のようにオプションでsqliteだけをターゲットにしましょう。

```bash
$ cargo install diesel_cli --no-default-features --features sqlite
```

# プロジェクトを作る

```bash
$ cargo new diesel_sample
$ cd diesel_sample
```

# 依存

```Cargo.toml
[package]
name = "diesel_sample"
version = "0.1.0"
authors = ["techno"]

[dependencies]
diesel = { version = "0.15.0", features = ["sqlite"] }
diesel_codegen = { version = "0.15.0", features = ["sqlite"] }
dotenv = "0.9.0"
```

# データベースを作る

```bash
$ echo DATABASE_URL=./sample.db > .env
$ diesel setup
```

dieselは.envに書かれたURLを元にデータベースに接続するので、データベースのURL(今回はデータベースファイルのパス)を.envに出力後`diesel setup`を打ちます。

最初`DATABASE_URL="./sample.db"`と書いたためにエラーを吐かれてしばらくハマりました。

# マイグレーション

```bash
$ diesel migration generate create_posts
```

`migrations`ディレクトリにマイグレーション用のSQLファイルが生成されます。テーブル定義を書いていきます。

```up.sql
CREATE TABLE posts (
  id INTEGER NOT NULL PRIMARY KEY,
  title VARCHAR NOT NULL,
  body TEXT NOT NULL,
  published BOOLEAN NOT NULL DEFAULT 0
)
```

```down.sql
DROP TABLE posts
```

Postgresのサンプルでは`up.sql`の`id`の型は`SERIAL`なのですがSQLiteは違うので注意です。

```bash
$ diesel migration run
```

# 書く！

あとはdieselのサンプルコードを写していけばいいのですが2017年7月31日のmasterブランチでの変更がリリースされているものに反映されていないため[0.15.xブランチのサンプル](https://github.com/diesel-rs/diesel/blob/0.15.x/examples/sqlite/getting_started_step_1/src/lib.rs)でないと動かないので注意です。

具体的には[このコミット](https://github.com/diesel-rs/diesel/commit/4057a34f51e017ba2246f9036dac8d325351156f)で`src/lib.rs`の`use diesel::sqlite::SqliteConnection;`が消えています。

そのうちmasterのサンプルソースでも動くようになると思います。

# 動かす

```bash
$ cargo run --bin show_posts
```

のように実行します。

`sqlite3`を起動して`select * from posts;`などで確認しながらサンプルを進めていくと楽しいかもしれません。

# ドキュメント

`filter`や`select`、`join`、`execute`などの関数は[diesel::prelude](http://docs.diesel.rs/diesel/prelude/index.html)にある○○Dsl

検索時などに使う`eq`や`gt`などは[diesel::expression\_methods::global\_expression\_methods::ExpressionMethods](http://docs.diesel.rs/diesel/expression_methods/global_expression_methods/trait.ExpressionMethods.html)

associationは[diesel::associations](http://docs.diesel.rs/diesel/associations/index.html)

`count`や`exists`、`max`、`mix`は[diesel::expression::dsl](http://docs.diesel.rs/diesel/expression/dsl/index.html)

`insert`、`update`、`delete`は[diesel](http://docs.diesel.rs/diesel/index.html)の下の方に

にそれぞれあります。
[小技] tmuxウィンドウのラベルを自動で命名する

複数のtmuxウィンドウで作業をしている時に、各ウィンドウの区別をつけるため、作業始めにウィンドウに名前をつけておくのだが、面倒なので自動化する。

# ソースコード

```zsh:.zshrc
add-zsh-hook precmd precmd_tmux_win

precmd_tmux_win() {
  [ -n "$TMUX" ] && \
      tmux rename-window "$(basename $(git rev-parse --show-toplevel 2>/dev/null || echo "${PWD/#$HOME/~}"))"
}
```

# 挙動

作業ディレクトリが変更されると以下の命名規則に従ってウィンドウをリネーム

* Git管理下のディレクトリであれば、レポジトリ名(厳密にはGitルートのディレクトリ名)を表示
* Git管理下のディレクトリでなければディレクトリ名を表示
* 手動で命名したラベルも上書きしてしまいます。

# TODO

* ~~`ghq look` でディレクトリ移動した際に発火しないですね。何か対策考える。~~ **解決**

# 追記

もうあった!!!

* [tmuxのwindow名をカレントディレクトリにする](http://qiita.com/usobuku/items/fce0f69586d82f963cbb)
factorio HeadlessServerに関する各種スクリプト

# 概要
自分が利用しているfactorioのHeadlessServerに関する各種スクリプトメモ。
ゲームバージョン: 0.15.31

# サーバーを起動する
サーバー設定ファイルと最新のマップデータを読み込んで起動するスクリプト。
マップデータが無いと起動に失敗するので、事前にマップデータを生成しておくこと。

```bash:start.sh
#!/bin/sh
cd `dirname $0`

# Player connection port (UDP)
PORT=34197

# RCON connection port (TCP)
RCON_PORT=34197
RCON_PW=changeme

bin/x64/factorio --start-server-load-latest --port ${PORT} --rcon-port ${RCON_PORT} --rcon-password ${RCON_PW} --server-settings data/server-settings.json
```

# マップデータを生成する
マップ生成設定ファイルを読み込んでマップデータを生成するスクリプト。

```bash:map_gen.sh
#!/bin/sh
cd `dirname $0`

bin/x64/factorio --create saves/world --map-gen-settings data/map-gen-settings.json
```

# サーバー上のデータをクリーニングする
マップデータやプレイヤー情報などをきれいさっぱり消すスクリプト。取り扱いに注意。

```bash:reset.sh
#!/bin/sh
cd `dirname $0`

rm -f achievements.dat
rm -f player-data.json
rm -f *.log
rm -f saves/*
#rm -f mods/*
rm -fr temp
```
Macにpython環境を作る


Mac上にpyenvとvirtualenvを使って、バージョンや導入ライブラリを切り替え可能なpythonの開発環境を構築する。



##pyenvのインストール
homebrewでpyenvとvirtualenvをインストールする。
（[こちら](http://qiita.com/shizuma/items/027167c6257f1c9d2a6f)を参考にさせていただきました。）

```bash:pyenv・virtualenvインストール
$ brew install pyenv
$ brew install pyenv-virtualenv
```

.bash_profileにパスを通しておく。

```bash:.bash_profile
PYENV_ROOT=~/.pyenv
export PATH=$PATH:$PYENV_ROOT/bin
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

##pythonのインストール
pyenvでpythonをインストールする。

```bash:pythonインストール
$ pyenv install 3.6.2
```

ここでエラーになる場合は、以下のコマンドを実行してみる。

```bash:pythonインストールエラーの時にやってみるコマンド
$ xcode-select --install
```
これで再度、pythonのインストールをためしてみる。
ダメならGoogle先生に聞いてください・・・（汗

##pythonのバージョンを切り替える
macの場合pythonの2.7がインストールさてているので、これをインストールした3.6.2に切り替えてみる。

```bash:pythonのバージョン確認から切り替えまで
$ pyenv versions
* system
  3.6.2
$ pyenv global 3.6.2
$ pyenv versions
  system
* 3.6.2 (set by ・・・・)
$ python -V
Python 3.6.2
```

##試しに環境を作る
試しに環境を構築する。

```bash:virtualenvで環境を作る
$ mkdir project1
$ cd project1
$ pyenv virtualenv 3.6.2 project1
$ pyenv local project1
(project1) $
```
環境が変わると、プロンプトの前に環境が表示されるようになる。
(project1）の部分。何もないときはsystemが選択されている。

作ったディレクトリから移動すると、環境が変わる事が確認できる。

```bash:環境変化確認 
(project1) $ cd ..
$ cd project1
(project1) $
```

##参考
[Pythonの環境構築 on Mac ( pyenv, virtualenv, anaconda, ipython notebook )](http://qiita.com/shizuma/items/027167c6257f1c9d2a6f)
YouTubeをWEBページに埋め込むためのベストプラクティス

YouTubeの動画をWEBページに埋め込むことはいくつかのメリットがあります。

  - 文字を尽くすことなく手軽に情報を伝えることができる
  - 文字ばかりのページよりも見栄えが良くなる

しかし、埋め込みには以下のような難しい点があります。

  - いかにしてレスポンシブにするか
  - たくさん動画を埋め込んだ場合のページの読み込み速度をどうやって改善するか

この記事では、以上の点を解決しつつ、YouTubeの動画をきれいに埋め込むための自分のベストプラクティスについて紹介します。

<!--more-->

## TL;DR

- [fitVids.js](http://fitvidsjs.com/)を使ってレスポンシブに埋め込む
- [blazy](https://github.com/dinbror/blazy/)を使って遅延読み込みを実現する
- その2つを組み合わせて使うとYouTube動画の埋め込みとしてはベスト

## 使い方

まず、以下のように[fitVids.js](http://fitvidsjs.com/)と[blazy](https://github.com/dinbror/blazy/)の読み込みと初期化を実施します。

```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fitvids/1.2.0/jquery.fitvids.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/blazy/1.8.2/blazy.min.js"></script>
<script>
  var bLazy = new Blazy({
    success: function(element) {
      $("div#" + element.parentNode.id).fitVids();
    }
  });
</script>
```

この2つを組み合わせて使うためには、[blazy](https://github.com/dinbror/blazy/)を初期化して遅延読み込みの際の処理を記述する際に、[fitVids.js](http://fitvidsjs.com/)を使って埋め込み動画のサイズの調整処理を加えるということが必要です。

また、以下のように動画埋め込みのためのHTMLを記述します。

```html
<div id="youtube-Y2VF8tmLFHw-wrapper">
  <iframe
    class="b-lazy"
    data-src="https://www.youtube.com/embed/Y2VF8tmLFHw?autohide=1&fs=1"
    frameborder="0"
    allowfullscreen>
  </iframe>
</div>
```

ここで大事なのは、`iframe`の親に一意のIDを割り当てる必要があるということです。
ここではYouTube動画のIDを使用して一意のIDを実現しています（同じ動画を複数埋め込みたい場合はより工夫する必要があります）。

埋め込みのオプションは用途によって変更してください。

## サンプル

最近個人のブログを作成しており、そこにサンプルを載せているのでよかったら見てください

+ https://iwataka.netlify.com/tech/youtube-embed-best-practice/

## まとめ

> [fitVids.js](http://fitvidsjs.com/)と[blazy](https://github.com/dinbror/blazy/)を使うとベストなYouTube埋め込みができる

ちなみに、Vimeoなどの他のサイトの動画や、ChromeやiPhone版Safari以外の他のWEBブラウザについてはまだ試していないのですが、おそらく期待通りに動くと思います。
初心者のためのBlenderトラブル解決法

Blenderのよくあるトラブルのうち、初期に遭遇したもの、しそうなものをまとめました。
ページ内検索を駆使して、自分のトラブルを解決してみてください。また、解決しない場合はコメントを残していってください。
ショートカットキーは標準のWindowsのものしか載せません。（要望があれば他OSも考えます）
#急に画面が真っ暗・暗い・重い・カクつく
解決方法：Shift+Zを押す
原因：レンダーモードになってしまった可能性があります。Shift+Zで切り替えましょう。レンダーというのは「（明るさなどを考慮して）細かい処理を行うこと」です。暗くなったのは光源がないから、重くなったのは細かい処理を行っているからだと考えられます。

#視界が大きく動く
解決方法：近くのオブジェクトにマウスをかざして、Alt+Fを押してください。
原因：視界の回転の中心が遠くに行ってしまっていると考えられます。視界の回転の中心を合わせる方法はたくさんありますが、Alt+Fはマウスをかざした位置に移動します。その他、テンキーの「.（ピリオド）」は選択したオブジェクトを中心に、Alt+Hは3Dカーソルを中心してくれます。

#レンダリングすると、面が黒くなる・レンダリングで面がモザイクっぽい
解決方法：黒くなった面を選んで、重複した面を削除する。
原因：面が近すぎたり、重なっているために起きていると考えられます。該当の面を選択したあと、移動させてみるなど、して確認してみましょう。重なっている場合、面を削除したり、頂点の結合（W → R）をしたりしてみてください。

#急に消えた・消えたけど戻せない・編集モードでしかポリゴンが見えない
解決方法：Alt+H
原因：編集モードで選択していたポリゴンをHキーで隠してしまった可能性があります。Alt+Hで隠れたポリゴンが復活するので試してみてください。また、単純に消してしまった場合は、Ctrl+Zで戻せますので、慌てずに試してみてください。

#カメラの視点を選ぶと、変・カメラビューの輪郭が点線で移動できない
解決方法：カメラを選択して、Ctrl+テンキーの0
原因：カメラ以外のオブジェクトがカメラとして指定されている可能性があります。Ctrl+0で選択中のオブジェクトをカメラに指定できますので、カメラをカメラとして指定しましょう。

解決しない場合は、コメントを残していってください。Twitterの@secang0にリプを送ったほうが反応は早いかもしれません。お気軽にどうぞ。
raspberrypiにOpenFlow環境をインストールする

# Raspberrypi3の起動後のセットアップ
```
$ sudo apt-get -y update
$ sudo apt-get -y install ibus-mozc fonts-takao
$ sudo apt-get -y upgrade
$ sudo apt-get -y dist-upgrade
```
#openvswitchのインストール
```
$ sudo apt-get -y install libssl-dev libcap-ng-dev autoconf libtool
$ sudo apt-get -y install libpcap-dev
$ sudo apt-get -y install raspberrypi-kernel-headers
$ cd ~/Downloads
$ git clone https://github.com/openvswitch/ovs
$ cd ovs
$ ./boot.sh
$ ./configure --with-linux=/lib/modules/`uname -r`/build
$ make
$ sudo make modules_install
$ sudo modprobe openvswitch
$ sudo make install
$ sudo ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema
$ sudo mkdir -p /usr/local/var/run/openvswitch/
$ sudo ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach
$ sudo ovs-vsctl --no-wait init
$ sudo ovs-vswitchd --pidfile --detach
```
#pipのインストールとバージョンアップ
```
$ sudo apt-get install python-pip
$ sudo pip install --upgrade pip
```
#ryuのインストール
```
$ sudo apt-get -y install python-dev
$ sudo apt-get -y install libevent-dev
$ sudo apt-get -y install python-lzma
$ sudo pip install gevent
$ sudo pip install webob
$ sudo pip install routes
$ sudo pip install ryu
```
#rc.localの追加
このままでは、rebootとすると、OpenvSwitchの設定が消えてしまうので、サーバー、デーモンの設定を行う。
/etc/rc.localに下記の内容を追加する

```
/usr/local/sbin/ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach
/usr/local/bin/ovs-vsctl --no-wait init
/usr/local/sbin/ovs-vswitchd --pidfile --detach
```
追記する箇所は最終行のexit 0の前にすること。
HAProxyで複数のSSL証明書に対応する

HAProxyで複数のSSL証明書に対応する方法をググったけどあんまり情報が無かったのでメモ。

HAProxyでSSL接続を終端させるときは

```haproxy.cfg
frontend app
 bind *:443 ssl crt /etc/haproxy/ssl/hoge.pem
```

みたいな感じで、SSL接続に使いたいpemファイルのパスを書いておく。

複数のSSL証明書に対応する場合は

```haproxy.cfg
frontend app
 bind *:443 ssl crt /etc/haproxy/ssl/hoge.pem crt /etc/haproxy/ssl/hoge2.pem
```

と、単純にpemファイルのパスを並べていく感じの例をよく見るけど、これだとSSL証明書の数が多くなってきたときに可読性があまりにも悪い。
なんか方法ないかなーと思っていたら、普通に[公式ドキュメント](http://cbonte.github.io/haproxy-dconv/1.6/configuration.html#5.1-crt)に書いてあった。
>If a directory name is used instead of a PEM file, then all files found in
that directory will be loaded in alphabetic order unless their name ends with
'.issuer', '.ocsp' or '.sctl' (reserved extensions). This directive may be
specified multiple times in order to load certificates from multiple files or
directories. The certificates will be presented to clients who provide a
valid TLS Server Name Indication field matching one of their CN or alt
subjects.  Wildcards are supported, where a wildcard character '*' is used
instead of the first hostname component (eg: *.example.org matches
www.example.org but not www.sub.example.org).

要はpemファイルのパスじゃなくて、pemファイルがあるディレクトリのパスを指定すればいいっぽい。

```haproxy.cfg
frontend app
 bind *:443 ssl crt /etc/haproxy/ssl
```

こんな感じでディレクトリを指定すると、末尾が「.issuer」「.ocsp」「.sctl」以外のファイルをアルファベット順にロードしていって、対応するSSL証明書を使ってくれるとの事。
注意点としては、 「.issuer」「.ocsp」「.sctl」以外のファイルは全部ロードしてしまうので、ディレクトリの中に関係ないファイルが混ざっているとhaproxyが起動に失敗する。


後、クライアントやSSLのライブラリがSNIに対応していない場合には
>If no SNI is provided by the client or if the SSL library does not support
TLS extensions, or if the client provides an SNI hostname which does not
match any certificate, then the first loaded certificate will be presented.
This means that when loading certificates from a directory, it is highly
recommended to load the default one first as a file or to ensure that it will
always be the first one in the directory.

との事。
この場合は最初にロードしたSSL証明書が使われてしまうので、デフォルトとして使いたいSSL証明書はディレクトリではなくファイルパスを明示的に指定する、またはその証明書が最初にロードされるようにしておく（アルファベット順に並べたときに先頭になるようなファイル名にする）。

まあ、ファイル名に気を付けて運用するのはめんどくさいので、ファイルパスを指定しておくのが正解だと思います。

```haproxy.cfg
frontend app
 bind *:443 ssl crt /etc/haproxy/ssl/hoge.pem crt /etc/haproxy/ssl/
```

こんな感じかな？
Anaconda Promptの起動について調べる

# 概要
Anaconda Promptの起動について調べた内容です。
ショートカットやcmd.exeの使い方までで、activate.batの中身は別の記事にします。

## Anaconda Prompt
### プロパティ
 
![1.png](https://qiita-image-store.s3.amazonaws.com/0/34777/24c233ec-b72e-b35c-4f19-0390f395d726.png)


### アイコンの変更

![2.png](https://qiita-image-store.s3.amazonaws.com/0/34777/f15d1730-bd2d-8606-2a82-0f8e8e4b6431.png)


### リンク先

|プロパティ|値|
|:---|:---|
|リンク先|```%windir%\system32\cmd.exe "/K" C:\Users\XXXXXX\Anaconda3\Scripts\activate.bat C:\Users\XXXXXX\Anaconda3```|

cmd.exeのショートカットで、"activate.bat"に"Anaconda3のパス"を引数として渡して実行しています。
このケースでいえば以下でも同じです。
```%windir%\system32\cmd.exe "/K" %USERPROFILE%\Anaconda3\Scripts\activate.bat %USERPROFILE%\Anaconda3```

また、"/K" を付加して、.batを実行後もコマンドプロンプトが終了しないようにしています。


[Cmd - DOS コマンド一覧 - Programming Field][5]
> ```/K <command>```
> ```<command>``` で指定した内容を実行します。実行をした後、「このコマンドを実行したcmd.exe」は終了せず、引き続きプロンプトを表示します。Windows上でバッチ ファイルのショートカットを作成する際、cmd.exe /K を使用すると「バッチ ファイルの実行」→「コマンド プロンプト」を連続で行えます。これは、**特定の環境(常駐プログラムや環境変数など)でコマンド プロンプトを表示させたい時に便利です**

なお、「Ruby コマンドプロンプトを開く」でも類似の起動方法でした。

```
C:\Windows\System32\cmd.exe /E:ON /K C:\Ruby22-x64\bin\setrbvars.bat
```

### 作業フォルダ

|プロパティ|値|
|:---|:---|
|作業フォルダ|``` C:\Users\XXXXXX```|

起動したあとのカレントフォルダになります。
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/34777/9b41bdc0-ef88-bc7c-9de9-02b0538ee5fe.png)

``` C:\Users\XXXXXX``` → ```%USERPROFILE%``` に変更しても同じです。

空欄にすると、ショートカットを実行したフォルダがカレントフォルダになるため、
起動時のカレントフォルダにしたいフォルダにAnaconda Promptのショートカットをコピーしておいて、
作業フォルダ欄を空欄にするといいです。


### アイコンの変更

|プロパティ|値|
|:---|:---|
|このファイルのアイコンを検索|%USERPROFILE%\Anaconda3\Menu\Iconleak-Atrous-Console.ico|

[Console Icon _ Atrous Iconset _ IconLeak][6]のアイコンに変更しています。

activate.batの中身については、別の記事にします。



#参考
[Console Icon _ Atrous Iconset _ IconLeak][6]
[6]:http://www.iconarchive.com/show/atrous-icons-by-iconleak/console-icon.html

[Cmd - DOS コマンド一覧 - Programming Field][5]
[5]:https://pf-j.sakura.ne.jp/program/dos/doscmd/cmd.htm
【Terraria】Visual Studioでデバッグする

#はじめに
この記事はTerrariaというゲームのMod開発にてVisual Studioでデバッグする方法について、簡潔に説明します。
Mod開発はtModLoaderの使用を前提としています。

Mod開発についてはSkyrimでのMod開発の経験はありますが、TerrariaでのMod開発だけでなく、ゲーム開発でのことについてもまだまだ初心者ですので、わからないことも多いながらの状況です。誤った情報やなどがあるかもしれませんので、その点ご了承ください。

#はじめの一歩
はじめてMod開発に手を付ける場合、Mod Skeleton Generatorを利用すると便利です。
詳しくはこちらをどうぞ。
https://github.com/blushiemagic/tModLoader/wiki/Basic-tModLoader-Modding-Guide

説明の通りに入力して、TutorialMod.zip をダウンロードして、Terrariaの所定の場所に解凍したファイルを配置します。

そのままプロジェクトファイルを開いて、そのまま直ぐにデバッグ実行してみます。
はい、これだけで動きます。

適当にブレークポイントを設定すれば、その時点でのゲーム上の情報の確認なども行えます。

やってみると驚くほど簡単なんですね。

#いくつか基本的な注意点
日本語化ツールで、exeを生成している場合、その日本語化したTerrariaで実行する場合は、プロジェクトのプロパティ設定で、デバッグ時の外部プログラムの開始に、そのファイルを指定してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156225/97aa5e6d-acf3-0dbb-76bb-9888d0d4a4e1.png)

C# 6 でのコードを記述する場合、`build.txt`に以下の項目を追加してください。

```
languageVersion = 6
```

その他いくつか指定した方がよいであろう設定がありますが、今後おいおいと説明していきたいと思います。

以上
Visual Studio でエンコードを指定して保存

初歩的な事ですが、ある時シフトJISになっていたのでUTF-8で明示的に保存し直そうと思ったらちょっと手間取ったので、備忘録のため。

Visual Studio 2015 では次のようにわかりやすくメニューにありましたが・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156225/bafdb1f2-c96b-1c40-13c8-0702858e4991.png)

Visual Studio 2017 では、名前を付けて保存での、保存時のボタン変更をしてからです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156225/3fa75d3c-1361-3108-ac83-6c562c4993f1.png)

こういうのが以外に見つからなくてハマったりします。

以上
Vimの:terminalを試したいのでソースからbuildした(windows)

# :terminal
何かと話題のvimの:terminal。
ここ一月くらいでvimのmasterへどんどんpushされていっています。

きっと今vimの:terminalに特に興味があるのは、
windows環境でvimを使っている人ではないでしょうか。

私も職場がwindows環境で、日頃はKaoriyaさんのバイナリにお世話になっています。
というわけで、執筆時点で最新のリポジトリからbuildして:terminalを使ってみました。

きっと、:terminalをいち早く試してみたいという方は沢山おられると思いますので、
簡単に手順をまとめておきました。

# environment
* windows10 64bit
* msys2 20161025
* vim 8.0.0862

# step
まず、今回実施した手順は以下の通り。

1. msys2のインストール
2. MinGwのインストール
3. vimのソースコードの入手
4. build
5. packageの作成

# 1. msys2のインストール
これはofficialからインストーラが公開されているので、インストーラからインストールして下さい。

[msys2 official](http://www.msys2.org)

特に今回注意した点はありません。
インストール後に`pacman -Su`を実施して必要なpackageをインストールしておけばOK。
インストール後に立ち上がるプロセスでは警告が出たりしますが、もう一度起動してやればできます。

# 2. MinGWのインストール
次にmsys2のシェルからMingGWをインストールします。

`pacman -S mingw-w64-x86_64-toolchain`
※ 32bit環境の場合は`x86_64`を`i686`にします。

どれをインストールするかを聞かれますが、確認が面倒なので私は`default:All`のまま全てインストールしました。

# 3. vimのソースコードの入手
buildに向けてソースコードの用意をします。
githubの[vim/vim](https://github.com/vim/vim)から`git clone`するか、
ダウンロードするなりしてローカルにリポジトリの内容一式を持ってきます。

# 4. build
それではいよいよ用意したソースコードをbuildします。
buildは`vim/src`ディレクトリで行って下さい。

```
$ cd path/to/vim/src

$mingw32-make -f Make_ming.mak GUI=yes ARCH=x86-64 TERMINAL=yes clean
$mingw32-make -f Make_ming.mak GUI=yes ARCH=x86-64 TERMINAL=yes
```
※ 今回buildしたverはdefaultで`TERMINAL=no`となっているので上記の様にしてenableにして下さい。
※ これも32bit環境の場合は`x86-64`を`i686`にします。(実際は内部で自動検出されるので、ARCH=自体が省略可能です)
※ CUI版も必要な場合は別途`GUI=no`にてbuildします。

これでエラーなくbuildされると、カレントに`gvim.exe(vim.exe)`が作成されます。
あとは次のstepで必要なファイルとpackagingすれば使えるようになります。

# 5. packageの作成
最後に、依存ライブラリや必要なファイルと一緒にpackageにします。
結果的に以下のような構成となりました。
iconv関連の依存ライブラリは:terminalとは直接関係ありません。

```
2017/08/05  17:17    <DIR>          .
2017/08/05  17:17    <DIR>          ..
2017/08/05  13:57         3,151,872 gvim.exe # buildしてできた実行体
2017/08/05  15:46                44 gvimrc   # gui向けの設定ファイル
2017/03/06  14:30         1,056,753 libiconv-2.dll      # 以下3ファイルはmsys2のbinから(iconvオプション向け)
2017/02/21  17:26           133,779 libintl-8.dll       
2017/07/13  16:35            57,379 libwinpthread-1.dll 
2017/08/05  13:45    <DIR>          vim80 # ここへはvim/runtimeの内容を全てコピーする
2017/08/05  15:46               101 vimrc # gui/gui共通の設定ファイル        
2017/06/01  11:08           901,632 winpty-agent.exe  # 以下2ファイルはGit/usr/binから     
2017/06/01  11:08           830,976 winpty.dll
```
それぞれコメントに従って必要なファイルを持ってきてもらえればよいです。
winpty関連のファイルは今回はGitに同梱されているCygwin環境から持ってきました。

# vimが端末になったぞ!!
というわけで:terminalが使えるようになりました。
実用はKaoriya-vimへの依存が強い今はまだ無理かなーという感じですが、
早くいろんなシチュエーションで使ってみたいですね!!

![20170805_vim_term.png](https://qiita-image-store.s3.amazonaws.com/0/143910/baaccfff-04f5-5e5d-f2e1-8e1475a710d6.png)

# reference
vimのbuildについて以下のページを参考にさせて頂きました。

* [vim/Gvimのビルドと実行環境の作成](https://sites.google.com/site/fudist/Home/vim-nihongo-ban/mingwvim)
Sysprepを使わずにプロファイルコピーする方法（Windows10 1703対応）

## プロファイルコピーとは
Windowsイメージのキッティングをする際の重要な工程の一つが、カスタマイズしたユーザ設定をDefaultプロファイルにコピーする作業（以下この作業を「プロファイルコピー」と呼ぶことにします）だと思います。

## Sysprepは嫌だ 
通常プロファイルコピーを行う際には、[こちらのドキュメント](https://msdn.microsoft.com/ja-jp/library/hh825135.aspx)で説明されているように、監査モードでカスタマイズを行った後に、`CopyProfile=True`を指定した応答ファイルを使用してSysprepを実行する、という作業を行うのですが、はっきり言ってこの手順は**とても面倒**で、**できればやりたくない**です。

Sysprepは時間のかかる処理なので、どこか一箇所でも設定漏れやミスがあるとその度にSysprepをやり直す羽目になり大変**つらい**です。原因不明のエラーで処理に失敗して**再起不能**に陥ることも珍しくありません。

そこで、**Sysprepは使用せず**に、任意のユーザープロファイルをプロファイルコピーする方法を紹介します。

## 注意
以下に紹介する手法はWindowsで公式にサポートされているものではありません。
実施した結果なにが起きたとしても自己責任でお願いします。
検証はWindows 10 Pro (1703)で行っています。他のバージョンではうまくいかないかもしれません。

## 手順
### 任意のユーザーでカスタマイズを行う
キッティング作業用のPCにWindowsを普通にインストールし、アプリケーションの追加やシステム設定変更などお好みのカスタマイズを行います。
カスタマイズに使うユーザーは監査モードやビルトインAdministratorではなく、ローカル管理者ユーザを一つ作成して行うのがいいでしょう。
ここでは例として「work」というユーザを作成して、壁紙を薄紫色に変えてみました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/177762/64e746a4-084b-e513-04c5-34e5bec1e9e4.png" width=40%>

### プロファイルフォルダをコピーする
カスタマイズが終わったら、カスタマイズ用ユーザーからログオフして、ビルトインAdministratorアカウントでログインします。

`C:\Users`フォルダを開き、既存の`Default`フォルダを削除orリネームします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/177762/48a47407-325e-6801-40df-60dcd658cd01.png)

カスタマイズユーザー名のフォルダ(ここでは`C:\Users\work`)をまるっとコピーし、フォルダ名を`Default`に変えます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/177762/a2571dfd-9ea0-549c-933f-63f0d68fa852.png)

### レジストリを編集する
まだ終わりではありません。ユーザ固有の情報を持っているレジストリを削除する必要があります。
コマンドプロンプトを開き、以下のコマンドを実行します。

```dos
reg.exe load HKU\def C:\Users\Default\NTUSER.DAT
```

実行後にレジストリエディタを開くと、`HKEY_USERS\def`というキーがあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/177762/53cc8323-3f73-ed4f-ac5a-0dc692a66e3a.png)

このキー内の以下のサブキーを全て削除してください。
・ `HKEY_USERS\def\Software\Microsoft\SystemCertificates`
・ `HKEY_USERS\def\Software\Microsoft\Windows\CurrentVersion\DeviceAccess`
・ `HKEY_USERS\def\Software\Microsoft\Windows\Roaming\OpenWith`
・ `HKEY_USERS\def\Software\Microsoft\Windows\Shell\Associations`
・ `HKEY_USERS\def\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts`
・ `HKEY_USERS\def\Software\Microsoft\Active Setup\Installed Components\{89820200-ECBD-11cf-8B85-00AA005B4340}`
※アクセス権を変更してからでないと消せないかもしれません。適宜対応してください

レジストリの編集が終わったら以下のコマンド実行してレジストリをアンロードします

```dos
reg.exe unload HKU\def
```

## 完了
これで完了です。
新規にユーザを作成してログインしてみると、壁紙が薄紫色になっており、カスタマイズが反映されていることが確認できると思います。
実質的に必要な作業はファイルコピーとレジストリ編集のみなので簡単です。バッチ処理化することも難しくないでしょう。

## 次回予告
次はこのカスタマイズしたDefaultプロファイルから、「固定ユーザープロファイル」を作成する方法を書く予定です。
(8/18) 書きました
[固定ユーザープロファイルを作成する方法（Windows10 1703対応）](http://qiita.com/mkht/items/23bfc6cb7e9644960730)
[クイズ]javascriptと仲良くなるための一歩　第１６話「プロトタイプ継承　delete」

#問題

##第一問

```js
var map = {x:1}        //=> undefined
map                    //=> Object {x: 1}
map.toString           //=> function toString() { [native code] }
map['toString'] = 1    //=> 1
map.toString           //=> ?
delete map["toString"] //=> true
map.toString           //=> ?
```

##第二問

```js
var map = {x:1}        //=> undefined
map                    //=> Object {x: 1}
map.toString()         //=> "[object Object]"
map['toString'] = 1
map.toString()         //=> ?
delete map["toString"] //=> true
map.toString()         //=> ?
```


:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:



#答え

##第一問

```js
var map = {x:1}        //=> undefined
map                    //=> Object {x: 1}
map.toString           //=> function toString() { [native code] }
map['toString'] = 1    //=> 1
map.toString           //=> 1
delete map["toString"] //=> true
map.toString           //=> function toString() { [native code] }
```

##第二問

```js
var map = {x:1}        //=> undefined
map                    //=> Object {x: 1}
map.toString()         //=> "[object Object]"
map['toString'] = 1
map.toString()         //=> Uncaught TypeError: map.toString is not a function
                       //   at <anonymous>:1:5
delete map["toString"] //=> true
map.toString()         //=> "[object Object]"
```
オフラインリアルタイムどう書く E16 の実装例


問題 : http://nabetani.sakura.ne.jp/hena/orde16nontri/
実装リンク集 : http://qiita.com/Nabetani/items/3525da55601bdf55316e

```ruby:ruby
def impl( s )
  sb = s.to_s(2)
  pos = ( sb=~/(000|111)/ )
  return s unless pos
  impl(
    case $1
    when "000"
      sb.sub( /000.*/ ){ |m,| "001"+"0"*(m.size-3) }.to_i(2)
    when "111"
      sb.sub( /111.*/ ){ |m,| "1"*m.size }.to_i(2) + 1
    end
    )
end

def solve(src)
  impl( src.to_i+1 ).to_s
end

if $0==__FILE__
  DATA.map{ |line|
    num, src, expected = line.split(/\s+/)
    actual = solve( src )
    okay = expected==actual
    p [ (okay ? "ok" : "**NG**" ), num, src, actual, expected ]
    okay
  }.all?.tap{ |x| p( x ? "everythin is okay" : "something wrong")  }
end

__END__
0 1441  1444
40  1072693248  1227133513
```

いつも通りテストデータの大半は省略。

000 があったら、その桁以降を 0010000...0 に置換
111 があったら、その桁以降を 1111111...1 に置換して 1 を足して繰り上げる。

この処理を再帰的に行うと~~悲惨連数~~非三連数が出来上がるという仕組み。

簡単すぎたかな。
オフラインリアルタイムどう書くE15の問題をRubyで解く

問題はこちら
http://nabetani.sakura.ne.jp/hena/orde16nontri/

```rb
def solve(q)
  a = q+1
  while true
    b = a.to_s(2)
    p0 = b.index('000')
    p1 = b.index('111')
    return a if p0.nil? && p1.nil? 
    if p0
      b[p0+2] = '1'
      (p0+3..(b.size-1)).each{|i| b[i]='0'}
    else
      if p1 == 0
        b = '1' + '0' * b.size
        a = b.to_i(2)
      else
        b[p1-1] = '1'
        (p1..(b.size-1)).each{|i| b[i]='0'}
      end
    end
    a = b.to_i(2)
  end
end

DATA.readlines.each do |line|
  no,q,a,a2 = line.strip.split(/\s+/)
  ans = solve(q.to_i)
  print no + "\t" + ans.to_s
  puts ans == a.to_i ? ' o' : ' x'
end
__END__
0	1441	1444	10110100100
1	1	2	10
2	2	3	11
3	3	4	100
4	7	9	1001
5	43690	43691	1010101010101011
6	349525	349526	1010101010101010110
7	209715	209716	110011001100110100
8	209919	210066	110011010010010010
9	209664	209700	110011001100100100
10	65536	74898	10010010010010010
11	1048575	1198372	100100100100100100100
12	14	18	10010
13	13	18	10010
14	27	36	100100
15	44	45	101101
16	136	146	10010010
17	383	402	110010010
18	649	658	1010010010
19	1227	1228	10011001100
20	2693	2706	101010010010
21	4943	4946	1001101010010
22	9152	9362	10010010010010
23	8336	9362	10010010010010
24	36993	37449	1001001001001001
25	81868	84260	10100100100100100
26	73287	74898	10010010010010010
27	305901	305956	1001010101100100100
28	555516	599186	10010010010010010010
29	691590	692809	10101001001001001001
30	3112217	3295524	1100100100100100100100
31	5235890	5392676	10100100100100100100100
32	6804756	6890642	11010010010010010010010
33	13653246	13781284	110100100100100100100100
34	20099429	20099657	1001100101011001001001001
35	107304545	107304548	110011001010101011001100100
36	227978622	227978642	1101100101101010110110010010
37	380810157	380810386	10110101100101011010010010010
38	268435455	306783378	10010010010010010010010010010
39	536870912	613566756	100100100100100100100100100100
40	1072693248	1227133513	1001001001001001001001001001001
```
CapybaraでスクレイピングしてきたのをNokogiriに渡す。

```ruby:main.rb
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, {:js_errors => false, :timeout => 100 })
end
session = Capybara::Session.new(:poltergeist)
session.visit URI.escape("URL")

page = Nokogiri::HTML.parse(session.html)
```
非三連数


\# 問題名間違えてた…

2進変換さえできれば、あとはやるだけな気がします.

…と思ったけど、他の方の答案見ていて、メインループ内にwhileを書くのはまずいと思いましたので、直しました。記念でPythonも。

```rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/hena/orde16nontri/
#http://qiita.com/Nabetani/items/3525da55601bdf55316e

W=3
def q(n)
	s=''.dup
	n.times{|i|s<<((i%W==W-1)?'1':'0')}
	s
end

while gets
	s='0'+($_.to_i+1).to_s(2)
	if idx=s.index('0'+'1'*W)
		s=s[0...idx]+'1'+q(s.size-(idx+1))
	end
	if idx=s.index('0'*W)
		s=s[0..idx+1]+'1'+q(s.size-(idx+3))
	end
	p s.to_i(2)
	STDOUT.flush
end
```

```py
#!/usr/bin/env python
#http://nabetani.sakura.ne.jp/hena/orde16nontri/
#http://qiita.com/Nabetani/items/3525da55601bdf55316e

import sys
if sys.version_info[0]>=3: raw_input=input

W=3
q=lambda n:''.join('1' if i%W==W-1 else '0' for i in range(n))

try:
	while True:
		s='0'+bin(int(raw_input())+1)[2:]
		try:
			idx=s.index('0'+'1'*W)
			s=s[0:idx]+'1'+q(len(s)-(idx+1))
		except ValueError:
			pass
		try:
			idx=s.index('0'*W)
			s=s[0:idx+W-1]+'1'+q(len(s)-(idx+W))
		except ValueError:
			pass
		print(int(s,2))
		sys.stdout.flush()
except EOFError:
	pass
```

以下は古い答案。

```rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/hena/orde16nontri/
#http://qiita.com/Nabetani/items/3525da55601bdf55316e

while gets
	s=($_.to_i+1).to_s(2)
	while idx=s.index('111')
		while idx>=0
			break if s[idx]=='0'
			idx-=1
		end
		if idx==-1
			s='1'+'0'*s.size
		else
			s[idx]='1'
			(idx+1...s.size).each{|i|s[i]='0'}
		end
	end
	while idx=s.index('000')
		s[idx+2]='1'
		(idx+3...s.size).each{|i|s[i]='0'}
	end
	p s.to_i(2)
	STDOUT.flush
end
```
オフラインリアルタイムどう書くE16の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/62497 )を行っています。

問題は「非三連数」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde16nontri/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
Rails migration decimalカラムをデフォルトで作成すると小数点以下が0桁になるから気をつけよう

# decimalをデフォルトで作成すると小数点以下が入力できない
例えば重さを保存するカラムを作る場合はmigrationファイルにこんな感じで書きますよね？

```rb
class CreateHoges < ActiveRecord::Migration[5.1]
  def change
    create_table :hoges do |t|
      t.decimal :weight
    end
  end
end
```

しかし、設定値なしでdecimalカラムを作成する場合

```sql
`weight` decimal(10,0) DEFAULT NULL
```
で作成されてしまうんです。

# 面倒臭がらずに許容桁数を指定しましょう
桁数の指定optionは以下の通りです。

|option|value|
|:--|:--|
|precision|全体の桁数|
|scale|小数点以下の桁数|

以下のように書いた場合は全体で6桁、小数点以下2桁です。

```rb
class CreateHoges < ActiveRecord::Migration[5.1]
  def change
    create_table :hoges do |t|
      t.decimal :weight, precision: 6, scale: 2
    end
  end
end
```

# 注意点
- precisionは全体の桁数です。
- precisionは整数の桁数ではないです。
railsでテーブルを作成する

# 最新記事はこちら

https://airteamlab.jp/posts/1987/

今後上記ページにて記事を更新していきます。

# table作成の流れ

* ```rails g model テーブル名 カラム名:型```をコマンドに打つ→マイグレーションファイルの作成（カラムが複数の場合、間にコンマは要らない）
* ```rails db:migrate```をうち、マイグレーションファイルをDBに反映させる

# マイグレーションファイルとは

マイグレーションファイルとはactive recordを介してDBを操作するファイルのこと。

## migration fileでテーブル作成時にnull制約などオプション設定

https://www.javadrive.jp/rails/model/index9.html

https://noknow.info/it/ruby/rails/how_to_make_migration_file_about_create_table_method?lang=ja

# ```rails db:migrate```で行われている事

```rails db:migrate```で行なわれているのはschema_migrationsテーブルと現在のdb/migrateフォルダを比較し、未実行のものを実行する。db/migrateに入っているものは基本全て反映される。（一部だけ指定するコマンドもある）

# ```rails g model テーブル名 カラム名:型```で行なわれていること

* app/modelフォルダにモデルを記述したファイルの作成
* db/migrateにマイグレーションファイルの作成

```ruby:例
rails g model Author name:string age:integer
```


## 指定できる型

https://qiita.com/s_tatsuki/items/900d662a905c7e36b3d4#%E6%8C%87%E5%AE%9A%E3%81%A7%E3%81%8D%E3%82%8B%E5%9E%8B

## modelの命名規則

modelの「モデル名とテーブル名の規約」
https://railsdoc.com/model

## 注意

>コントローラ名には複数形を使い、モデル名には単数形を用いるという慣習を頭に入れておいてください。コントローラはUsersでモデルはUserです。

# modelを編集し、カラムを後から変更する

```ruby:post.rb
class Post < ApplicationRecord
  def change
    add_column :posts, :content, :text
  end
end
```
上記のように

add_column :テーブル名, :カラム名, :型

でカラムを追加できる。
docker上でgolangのHello World

TLDR
---
* golangでHello Worldをやる
* dockerが使える環境であることが前提

golangイメージの起動とHello World実行
---
```
$ docker pull golang:1.8.3-alpine3.6
$ docker run -it golang:1.8.3-alpine3.6

# apk --no-cache add vim=8.0.0595-r0
# vim main.go
package main
 
import "fmt"

func main() {
        fmt.Printf("Hello World\n")
}

# go run main.go
Hello World

# go build main.go
# ls -l main*
-rwxr-xr-x    1 root     root       1560062 Aug  5 06:14 main
-rw-r--r--    1 root     root            81 Aug  5 06:13 main.go

# ./main
Hello World

# exit
```

作成したイメージを保存する（コミットする）
---
```
$ docker ps -a | grep golang:1.8.3-alpine3.6
1e9306728b3e        golang:1.8.3-alpine3.6   "/bin/sh"                5 minutes ago       Exited (0) 50 seconds ago                         infallible_hamilton

$ docker commit infallible_hamilton tsujimitsu:golang
sha256:215c40c37af81fac9bbc4daa030ce965d2dd3e940729589f0d79778770aaee67

$ docker image ls | grep golang
tsujimitsu                golang              215c40c37af8        13 seconds ago      285 MB
```

コミットしたイメージファイルを起動する
---
```
$ docker run -it tsujimitsu:golang
# ./main
Hello World
```

付録（Dockerfile）
---
```
$ vim Dockerfile
FROM golang:1.8.3-alpine3.6

MAINTAINER tsujimitsu

RUN apk --no-cache add vim=8.0.0595-r0

$ docker build -t tsujimitsu/golang:1.8.3 ./
$ docker image ls | grep tsujimitsu/golang
tsujimitsu/golang         1.8.3               ff0c5cdf4a51        29 seconds ago      284 MB

$ docker run -it tsujimitsu/golang:1.8.3
# go version
go version go1.8.3 linux/amd64

# vim a.out
# exit
```
slackにmust-readを入れる

slackでtodo管理ができたら嬉しいのでmust-readというのを入れてみた。

## 手順１
slackにmust-readを入れる。
slack左下のAPPの右にある+をクリックして、「must-read」を検索→sign in to install→サインインしてインストール！

## 手順２
使いたいチャンネルにmust-readを招待。
`/invite @must-read`
注意：ダイレクトメッセージでは使えない

## 手順３
書き込む
`@must-read お買い物お願い @○○（お願いしたい人）`
GitHubのプロフィール画像をダウンロードする

# 前提条件
- GitHubのアカウントを持っていること
- GitHubのユーザー名がわかっていること

# プロフィール画像のURL
```
https://avatars.githubusercontent.com/{ユーザー名}?s={サイズ}
```
サイズは、画像の一辺の長さ(ピクセル単位)です。
これを省略すると460pxになるようです。

## 初期設定のプロフィール画像
```
https://github.com/identicons/{ユーザー名}.png
```
ちなみに「identicon」というそうです。
【PHP】mb_strpos,mb_striposの検証

仕事で、文字列の中に、特定の文字列があるか調べる必要がありました。
正規表現を書くのも面倒だと思ってPHPマニュアルを漁っていたら、便利な’mb_strpos()’関数がありました。
簡単に’mb_strpos()’関数と、それとよく似た’mb_stripos()’関数を検証します。

mb_strpos
http://php.net/manual/ja/function.mb-strpos.php

mb_stripos
http://php.net/manual/ja/function.mb-stripos.php

## TD;DR

`mb_stripos()`関数は、細かい条件で検索可能なので、特に理由がない場合はこっちを使おう。

## mb_strpos()関数
「文字列A」の中に「文字列B」が存在するかどうか検索し、最初に見つかった位置を数値で返します。(先頭は0から始まります)
見つからなかった場合はfalseが返されます。

詳しい検証は、ソースコードを見ていきましょう。

```php
<?php
$keyword_uppercase = 'XYZ';
$keyword_lowercase = 'xyz';

$text1 = 'abcXYZ';
$text2 = 'abcXYZabcXYZ';

// mb_strposの挙動

// 大文字は文字は含まれていると判定される
if (mb_strpos($text1, $keyword_uppercase) === false) {
    echo $keyword_uppercase . "は含まれていません" . "\n";
} else {
    echo $keyword_uppercase . "は含まれています" . "\n";
    echo mb_strpos($text1, $keyword_uppercase) . "文字目" . "\n";
}

// 小文字は含まれていないと判定される
if (mb_strpos($text1, $keyword_lowercase) === false) {
    echo $keyword_lowercase . "は含まれていません" . "\n";
} else {
    echo $keyword_lowercase . "は含まれています" . "\n";
    echo mb_strpos($text1, $keyword_lowercase) . "文字目" . "\n";
}

// 検索対象の文字列の中に、キーワードが複数含まれていても最初にマッチングした位置を返す
if (mb_strpos($text2, $keyword_uppercase) === false) {
    echo $keyword_uppercase . "は含まれていません" . "\n";
} else {
    echo $keyword_uppercase . "は含まれています" . "\n";
    echo mb_strpos($text1, $keyword_uppercase) . "文字目" . "\n";
}
```

実行結果

```bash
XYZは含まれています
3文字目
xyzは含まれていません
XYZは含まれています
3文字目
```

## mb_stripos()関数

ここで不便なのが、小文字にマッチングしないことです。
SQL文の文字列をマッチングさせようとしても、
’SELECT * FROM table;’
’select * from table’
どちらも有効なクエリなため、’mb_strpos()’関数だと抜け漏れが発生します。
そこで便利なのが’mb_stripos()’関数です。
こちらは、大文字小文字の区別無しに文字列の有無を判定します。

こちらも検証のソースコードを見ていきましょう。

```php
<?php
$keyword_uppercase = 'XYZ';
$keyword_lowercase = 'xyz';

$text1 = 'abcXYZ';

// mb_striposの挙動

// 大文字は文字は含まれていると判定される
if (mb_stripos($text1, $keyword_uppercase) === false) {
    echo $keyword_uppercase . "は含まれていません" . "\n";
} else {
    echo $keyword_uppercase . "は含まれています" . "\n";
    echo mb_stripos($text1, $keyword_uppercase) . "文字目" . "\n";
}

// 小文字も文字は含まれていると判定される
if (mb_stripos($text1, $keyword_lowercase) === false) {
    echo $keyword_lowercase . "は含まれていません" . "\n";
} else {
    echo $keyword_lowercase . "は含まれています" . "\n";
    echo mb_stripos($text1, $keyword_lowercase) . "文字目" . "\n";
}
```

実行結果

```bash
XYZは含まれています
3文字目
xyzは含まれています
3文字目
```

これだったら、大文字小文字区別なくマッチング判定できますね。

## mb_strpos()関数の戻り値の誤判定

最後に’mb_strpos()’関数の誤判定について検証します。

‘mb_strpos()’関数の戻り値がfalseかどうか判定する場合、「==」演算子ではなく、必ず「===」演算子を使って判定してください。「==」演算子を使って判定した場合、0とfalseが同じ値だと判定されてしまうため、’mb_strpos()’関数が0を返した場合に誤判定が生じます。

```php
<?php
// mbstrposの誤判定
$keyword2 = 'DEF';

$text2 = 'DEFghi';

// 含まれていないと判定される
// mb_strposの戻り値が'0'の場合、誤判定するため
// mb_strposの判定は'==='で行うこと
if (mb_strpos($text2, $keyword2) == false) {
    echo $keyword2 . "は含まれていません" . "\n";
    echo mb_strpos($text2, $keyword2) . "文字目" . "\n";
} else {
    echo $keyword2 . "は含まれています" . "\n";
}
```

実行結果

```bash
DEFは含まれていません
0文字目
```

‘DEF’は含まれているはずなのに、含まれない判定になってしまいます。
スクリプト実行時のカレントディレクトリをスクリプトと同階層にする

# 概要
スクリプトファイルをどこから実行しても、スクリプトファイルと同階層をカレントディレクトリとしたい時がある。
けっこう書くことが多いくせに、毎回調べてる感じがするので書いて覚える。

# Windows(cmd)の場合
```bat:Sample.cmd
cd /d %~dp0
...
```

# Linux(sh)の場合
```bash:Sample.sh
#!/bin/sh
cd `dirname $0`
...
```
Appleのアプリ審査から届いたクラッシュログにメソッド名を表示させる手順

#はじめに
Appleのアプリ審査でクラッシュが報告されたときに、クラッシュログを添付してもらえます。しかし、どのメソッドでクラッシュしているかそのログだけ見ていても、よく分かりません。
シンボリケーションという手続きを踏むと、どのメソッド・行で問題が起きたか知ることができます。

この手続きを普段あまりしない人に向けて、コピペで済むように、その手順を示します。

#環境
Xcode 8.3.3

#1. Resolution Centerのcrashlog-(長い識別子).txtをDLする
この.txtのリンクを右クリックし、「リンク先を保存する」を選択してダウンロードします。操作しやすいように、ファイル名を`crashlog.crash`に変更しておきます。

そして、今回の作業用に新規作成したフォルダ(例えば、`WorkingFolder`)をデスクトップ上に作ります。その中に上のcrashファイルを格納します。

#2. dSYMsを取り出す
XcodeのOrganizer(上のメニューの右端にあるWindowの中から選択できる)から、クラッシュログが報告されたアーカイブを選択し、右クリックで"Show in Finder"を選ぶと、`(特定のファイル名).xcarchive`が表示されます。

このファイルを右クリックして「パッケージの内容を表示」を選択すると、dSYMsフォルダがあるので、このdSYMsフォルダを#1のフォルダ(`WorkingFolder`)の中にコピーします。

#3. ターミナルからシンボリケートを実行する
Terminal.appを起動します。取っつきにくいですが、下のコマンドをコピペしていければ大丈夫です。

まず、`cd`と打ってから、スペースキーを押して、macOSのFinder上にある#1のフォルダ(`WorkingFolder`)をドラッグドロップします。パスが入ります。

こんな形になっているはずです。

```
cd /Users/(ユーザ名)/Desktop/WorkingFolder
```

実行したいので、リターンキーを押します。
カレントになっているディレクトリが変わったので $の左側の表示が変わったと思います。成功です。

同様に、次のコマンドをコピペして、リターンキーを押して実行します。

```
export DEVELOPER_DIR= `xcode-select -p`
```

反応がないように見えますが、内部で効いているので大丈夫です。
最後に、次を実行します。長いので、スクロールして全部コピペします。

```
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash ./crashlog.crash ./dSYM >> symbolicate.crash
```

最後にリターンキーを押して実行します。

#4. シンボリートされたクラッシュログが作成される
フォルダにsymbolicate.crashが作成されます。直後は0MBの表示になっていて不安になるかもしれませんが、少し待つと、symbolicate.crashがちゃんと完成します。
シンボリケーションの作業はこれで完了です。

うまくいかない場合は、まずファイル名やパスの指定が間違っていないか確認してみましょう。

#見るべき場所
クラッシュログは情報が豊富ですが、クラッシュした箇所を特定したい場合、まず注目するのはCrashedになっているThreadです。
直近のメソッドが最上位に来ているので、そのメソッドに注目します。
メソッドの右には(ソースファイル名:行数)が併記されているので、どの行で落ちたのかが読み取れます。

Exception Typeの種類、Crashedになっているスタックに並んだ見覚えのないメソッドについては、ネットで検索して意味を読み取るのが早いです。内部的に実行されているメソッドは、書いた覚えのないメソッドとして別名で登場するのでクラッシュログだけで読解するのは、類似のケースを経験をしていないと困難です。

#感想
審査提出はプロジェクトの終盤の、忙しいときが多いと思います。dSYMsを把握しているAppleさん側でシンボリケートまで済ませてログを送ってくれたらもっと楽なのにな・・・という横着な気持ちになりました。
ただ、暗号を解読する手順のようでワクワクする面もありますね。
tar.xzファイルの圧縮・解凍方法

今までLinuxで圧縮ファイルといえばtar.gz(gzip圧縮のtarファイル)をよく扱ってきたが、あるファイルがtar.xz圧縮だったため解凍方法を調べることになった。

# tar.xzファイルを解凍する
tarは圧縮形式を自動判別するので、他形式の解凍と同じオプションでOK。

```bash:Shell
tar -xf {tar.xzファイル}
```

# tar.xzファイルに圧縮する
tar.gzと比べて圧縮後のファイルサイズは小さくなるが、圧縮に時間がかかる。

```bash:Shell
tar -Jcf {圧縮後のファイル} {圧縮対象のファイル}
```
ある日Kerasが動かなくなったとき（2017/8/5)


# 環境
- Windows 10
- AnacondaによるPython環境

# エラー内容
　今までKerasを実行できていたが、ある日以下のようなエラーが出たとき。
__packages\tensorflow\contrib\rnn\python\ops\_gru_ops.dll not found__

エラー詳細

```

>>> import keras
Using TensorFlow backend.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Clémence\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\__init__.py", line 3, in <module>
    from . import activations
  File "C:\Users\Clémence\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\activations.py", line 6, in <module>
    from .engine import Layer
  File "C:\Users\Clémence\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\engine\__init__.py", line 8, in <module>
    from .training import Model
  File "C:\Users\Clémence\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\engine\training.py", line 24, in <module>
    from .. import callbacks as cbks
  File "C:\Users\Clémence\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\callbacks.py", line 26, in <module>
    from tensorflow.contrib.tensorboard.plugins import projector
  File "C:\Users\Clémence\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\contrib\__init__.py", line 26, in <module>
    from tensorflow.contrib import crf
  File "C:\Users\Clémence\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\contrib\crf\__init__.py", line 32, in <module>
    from tensorflow.contrib.crf.python.ops.crf import _lengths_to_masks
  File "C:\Users\Clémence\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\contrib\crf\python\ops\crf.py", line 44, in <module>
    from tensorflow.contrib.rnn.python.ops import core_rnn_cell
  File "C:\Users\Clémence\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\contrib\rnn\__init__.py", line 80, in <module>
    from tensorflow.contrib.rnn.python.ops.gru_ops import *
  File "C:\Users\Clémence\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\contrib\rnn\python\ops\gru_ops.py", line 32, in <module>
    resource_loader.get_path_to_datafile("_gru_ops.so"))
  File "C:\Users\Clémence\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\contrib\util\loader.py", line 55, in load_op_library
    ret = load_library.load_op_library(path)
  File "C:\Users\Clémence\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\framework\load_library.py", line 64, in load_op_library
    None, None, error_msg, error_code)
tensorflow.python.framework.errors_impl.NotFoundError: C:\Users\Clémence\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\contrib\rnn\python\ops\_gru_ops.dll not found

```

# 対応方法

↓によると、理由はよくわからないが環境を作り直せばなおる。
https://stackoverflow.com/questions/44424068/python-keras-installation-on-windows-10-gru-ops-dll-not-found
お手軽なHEIFファイルの作成・表示方法

# HEIFファイルの作成
あらかじめ[FFmpeg][ffmpeg]+[libx265][x265]と[GPAC][gpac]をインストールしておく。

```
$ brew install ffmpeg --with-x265
$ brew install gpac
```

ソース画像ファイル`{source}`から生のHEVCビットストリームへエンコードし、続いてHEIFファイル形式に格納する。

```
$ ffmpeg -i {source} -vcodec -pix_fmt yuv420p -codec:v libx265 ¥
  -crf 15 -preset placebo -x265-params info=0 -f hevc temp.hvc -y

$ MP4Box -add-image temp.hvc -ab heic -new output.heic
```

上記コマンド中の`-crf`で画質とファイサイズのトレードオフを制御する。値が小さいほど高画質だがファイルサイズが大きくなり、値が大きいほどファイサイズが小さくなるが画質は劣化する。

[ffmpeg]: https://www.ffmpeg.org/
[x265]: http://x265.org/
[gpac]: https://gpac.wp.imt.fr/


# HEIFファイルの表示

Nokiaによる[JavaScript実装][nokia-js]を利用すると、既存のWebブラウザ上でHEIFファイルを画像表示できる。商用利用時は[ライセンス条項][nokia-license]に留意のこと。

```html
<!DOCTYPE html>
<html>
<head>
  <script src="js/libde265-selector.js"></script>
  <script src="js/heif-api.js"></script>
  <script src="js/heif-extension.js"></script>
  <script src="js/hevc-decoder.js"></script>
  <script src="js/image-provider.js"></script>
</head>
<body>
  <img src="output.heic" />
</body>
</html>
```

技術的には、JavaScriptによりHEIFファイル解析とHEVCデコード([libde265][libde265])を行い、img要素から置き換えたcanvas要素にデコード画像が描画される。

[nokia-js]: https://github.com/nokiatech/heif/tree/gh-pages/js
[nokia-license]: https://github.com/nokiatech/heif/blob/gh-pages/license.txt
[libde265]: http://www.libde265.org/
Kerasがscipyのせいでインストールできないとき[Windows] 


# 環境
- Windows 10 64bit
- AnacondaによるPython環境

# 内容
- kerasをインストールしようとして以下のようなエラーがでたときの対応方法
 - 自動でscipyがインストールされるはずが失敗

```
>pip install -U keras

（中略）
Collecting theano (from keras)
Collecting scipy>=0.14 (from theano->keras)
  Using cached scipy-0.19.1.tar.gz
Requirement already up-to-date: numpy>=1.9.1 in c:\users\(ユーザ名)\anaconda3\envs\tensorflow\lib\site-packages (from theano->keras)
Building wheels for collected packages: scipy
  Running setup.py bdist_wheel for scipy ... error
（中略）
    ----------------------------------------
Command "C:\Users\(ユーザ名)\Anaconda3\envs\tensorflow\python.exe -u -c "import setuptools, tokenize;__file__='r:\\temp\\user\\pip-build-0eij39zu\\scipy\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record r:\temp\user\pip-7tr0bkup-record\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in r:\temp\user\pip-build-0eij39zu\scipy\

```

# 対応方法
- conda の機能を利用してscipyをインストールする
 - コマンドプロンプトは管理者権限で実行のこと

```
: condaの機能でscipyをインストール
conda install scipy
: そのあとでkeras/tensorflowをインストール
pip install keras
pip install tensorflow

```
Windows Updateが何回実行しても消えない時の対処法

# Windows Updateがいつまでたっても消えない
ふと気づいたら毎日Windows Updateの通知が出てくるようになってしまった。
シャットダウンや再起動が「更新してシャットダウン」「更新して再起動」になっているからそれを実行するも、画面に更新中と出ないまま通常通りシャットダウン/再起動がされて、再び起動すると同じ更新内容のWindows Updateの通知が来る。
Windows Updateの履歴を見ても同じ内容の更新がいくつも並び全て成功しているが、また同じ更新を実行しようとする。

# 対策
[How to temporarily prevent a driver update from reinstalling in Windows 10](https://support.microsoft.com/en-us/help/3073930/how-to-temporarily-prevent-a-driver-update-from-reinstalling-in-window)
このページの真ん中辺りにある、「Download the "Show or hide updates" troubleshooter package now.」のリンクをクリックしてtroubleshooterをダウンロードする。

troubleshooterを実行し、"Hide updates"から該当の更新を表示させないようにする。

# 原因
更新内容か、更新対象のドライバーに問題があるようだけど詳しくは分からないです。
Rust: error: could not exec the linker `cc`: No such file or directory

下記のようにRustをインストール、
いつものようにHello Worldを書いてコンパイルしてみたらエラーが出た。

動作環境はUbuntu16.04

```bash:command
curl https://sh.rustup.rs -sSf | sh
```

```rust:hello.rs
fn main() {
    println!("Hello World!");
}
```

```bash:command
rustc hello.rs
```
```bash:response
error: could not exec the linker `cc`: No such file or directory (os error 2)
```

以下のコマンドを実行してみたところ、エラーが解消しコンパイルできた

```bash:command
sudo apt-get update
sudo apt-get install build-essential 
```
virtualenvやcondaで作成した仮想環境をIntelliJ IDEA(PyCharm)のプロジェクトに反映させる(メモ)

## 問題：仮想環境でインストールしたパッケージの参照が取れない
![Kobito.kTIjwv.png](https://qiita-image-store.s3.amazonaws.com/0/7885/5fd9356b-f368-4b93-f258-52f46daa8c5a.png "Kobito.kTIjwv.png")

## 解決
`command` + `;` にて、Project Structureを開き、左上の`+`からPython SDK > Add Localを選択

![Kobito.ykUxyG.png](https://qiita-image-store.s3.amazonaws.com/0/7885/f506a980-49b0-5059-3471-131a3d376e3a.png "Kobito.ykUxyG.png")

仮想環境のbin/pythonのパスを設定。
私の環境だと `/Users/user_name/anaconda/envs/machine_learning_env/bin/python`

![Kobito.JGuG84.png](https://qiita-image-store.s3.amazonaws.com/0/7885/5d068aeb-9624-f4fc-8a9a-c3138a8ea9ff.png "Kobito.JGuG84.png")

追加後、applyにてパスを解決できるようになる。

うまくいかないときは、`.idea/`のディレクトリごと削除して、プロジェクトを作り直すのが早い（かも）

参考：https://www.jetbrains.com/help/idea/adding-existing-virtual-environment.html
“Not enough information to infer parameter T” with Kotlin and Android"



## findViewByIdしたら、エラーになった

以下はエラー

`val profileImageVIew = findViewById(R.id.profile_image_view) as ImageView`

下記に修正

`val profileImageVIew = findViewById<ImageView>(R.id.profile_image_view)`

## 原因

API level 26 だと上記の書き方じゃないといけないらしい
sshコマンド

ssh接続するためのコマンドです。


##コマンド構文
```bash
ssh [option] (user@)host [command]
```

###ssh
sshプロトコルを利用して、リモートホストにログイン、もしくはコマンドを実行するためのコマンドです。
認証の主要な方式として、パスワード認証と公開鍵認証の2つがあります。
公開鍵認証の場合は、サーバー側に公開鍵を置く必要がありますが、パスワードの入力なしでログインすることができます。

###option

| option | 説明 |
|:------------|:--|
| -l \<user> | ログインユーザーを指定する。`user@host`としたときと同じ。 |
| -i \<file> | ログインに使用する秘密鍵ファイルを指定する。 |
| -p \<port> | ポート番号を指定する。 |

###host
リモートのホストを指定します。
`user@host`とすることでログインするユーザーを指定することができ、オプションで`-l user`としたときと同じ意味になります。

```bash
#hostにuserというユーザー名でログイン

ssh user@host

#もしくは

ssh -l user host
```

パスワード認証の場合は、この後パスワードの入力を求められます。

###command
リモートホスト上で実行するコマンドを指定することができます。
commandを指定しないことでリモートにログインできます。

```bash
#リモートホスト上でpwdコマンドを実行
ssh user@host pwd
```
commandを指定して実行した場合は、コマンド実行後に接続は切れます。(ログイン状態は保持されません)