OmniAICreator/Qiita-1.07M huggingface dataset:
Unity2017にAdmobメディエーションでAppLovinSDKをいれたら、UnityEditor上でエラーがでる

## エラー「Exception: JNI: Init'd AndroidJavaClass with null ptr!」

```

Exception: JNI: Init'd AndroidJavaClass with null ptr!
UnityEngine.AndroidJavaClass..ctor (System.IntPtr jclass) (at /Users/builduser/buildslave/unity/build/Runtime/Export/AndroidJavaImpl.cs:622)
UnityEngine.AndroidJavaObject.get_JavaLangClass () (at /Users/builduser/buildslave/unity/build/Runtime/Export/AndroidJavaImpl.cs:600)
UnityEngine.AndroidJavaObject.FindClass (System.String name) (at /Users/builduser/buildslave/unity/build/Runtime/Export/AndroidJavaImpl.cs:591)
UnityEngine.AndroidJavaClass._AndroidJavaClass (System.String className) (at /Users/builduser/buildslave/unity/build/Runtime/Export/AndroidJavaImpl.cs:611)
UnityEngine.AndroidJavaClass..ctor (System.String className) (at /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/AndroidJavaBindings.gen.cs:92)
AppLovin.getDefaultPlugin () (at Assets/Plugins/AppLovin/AppLovin.cs:106)
AppLovin.SetSdkKey (System.String sdkKey) (at Assets/Plugins/AppLovin/AppLovin.cs:560)
GameSceneSingleton.RequestRewardBasedVideo () (at Assets/Scripts/Common/GameSceneSingleton.cs:232)
GameManager.Awake () (at Assets/Scripts/Common/GameManager.cs:371)

```

原因は、unitypackageで入れている、applovinの初期化が原因でした。

```
AppLovin.SetSdkKey(Constant.SDK_APPLOVIN_API_KEY);
AppLovin.InitializeSdk();
```

この部分

## 下記のように、UnityEditor上は何も処理しないように分岐するとエラーがなくなりました。


```

#if UNITY_EDITOR
// Do not process with unityEditor

#elif UNITY_ANDROID
// AppLovin
AppLovin.SetSdkKey(Constant.SDK_APPLOVIN_API_KEY);
AppLovin.InitializeSdk();


#elif UNITY_IOS
#endif

```
[Rails] Carrierwave で S3 にファイルをアップロードしようとしたときにハマった(ArgumentError: wrong number of arguments)

Rails5 で Carrierwave 使って S3 にファイルをアップロードしようとしたら、モデルを保存する際に決まったエラーが出てハマった。

```
> model = Model.new([画像やらなんやら])
> model.save
 => ArgumentError: wrong number of arguments (given 3, expected 1)
```

Carrierwaveの中身を見たりしたけどよくわからず、設定を見直すことに。

`config/initializers/carrierwave.rb` の設定は、ネットからパクったやつなんでちゃんと見てなかったけど、こんな行があった。

```
  config.cache_storage = :fog   
```

キャッシュも fog を通して S3 に上げますよ。っていう設定らしい。

ここで原因に気づきました。テストでファイルのアップロードを試していたのですが、テスト環境では S3 ではなくローカルに保存するよう設定を書いていた。。。

```
(app/uploader以下のuploaderクラスのファイル)

if Rails.env.development?
  storage :file
elsif Rails.env.test?
  storage :file
else
  storage :fog
end
```

結局、development と test 環境では ローカル にファイルを保存するって書いてんのに、キャッシュは fog で S3 にとるぜ、っていう設定になっているためでした。

対策としては、`config/initializers/carrierwave.rb` の設定を環境ごとにちゃんと分けるコト。(あたりまえのことかもしれませんが...)

```
if Rails.env.development?                                                                                                                   
  CarrierWave.configure do |config|
  　# developmentのもろもろの設定
  end 
elsif Rails.env.test?
  CarrierWave.configure do |config|
    # testのもろもろの設定
  end 
else
  CarrierWave.configure do |config|
    # productionのもろもろの設定
    config.cache_storage = :fog # fogを使う環境だけに適用！
  end 
end
```

こっちに storage の設定も一緒に書いた方がいいかもしれないとも思った。

コピペで済ませようとしたせいで起きた初歩的なミスでした。
[RHEL7.0] nmcliでipv4.addressesを省略指定できない

nmcliは文言を省略しても勝手に補完してくれるが、今回今更ながらRHEL7.0を設定した時の備忘録。

**■現象**
RHEL7.0（アップデートせずメディアインストールの状態）でIPを設定しようとした際、以下のエラーが出て設定できなった。
　`# nmcli c mod ens192 ipv4.address 192.168.1.1/24`
　`Error: invalid property 'address': 'address' is ambiguous (addresses x address-labels).`

**■対応策**
メッセージの通り「ipv4.addresses」が「ipv4.address-labels」の判断ができないため、以下にする必要がある。
　`# nmcli c mod ens192 ipv4.addresses 192.168.1.1/24`

※nmcli c show \<Connection Name\> で見ても「ipv4.address-labels」の項目がないので少し謎。

**■補足**
1. RHEL7.1以降では「ipv4.address-labels」がないので、今回問題だったコマンドは正常に設定される。（省略できる）
2. RHEL7.1以降では「ipv4.gateway」が追加されたため、DefaultGateway含む設定は以下のようになる。（末尾.254がGWアドレス）
[ RHEL7.0 ]
　`# nmcli c mod ens192 ipv4.addresses "192.168.1.1/24 192.168.1.254"`
[ RHEL7.1以降 ]
　`# nmcli c mod ens192 ipv4.addresses 192.168.1.1/24 ipv4.gateway 192.168.1.254`
3. 未確認だがCentOS7.0.1406でも同現象になると思われる。
awsで`yum install sqlite-devel`できない

`gem install sqlite3 -- --with-sqlite3-dir=/opt/local`を実行しようとしたら以下のようなエラーメッセージが。。。

```
Building native extensions with: '--with-sqlite3-dir=/opt/local'
This could take a while...
ERROR:  Error installing sqlite3:
	ERROR: Failed to build gem native extension.

    current directory: /home/test_user/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/ext/sqlite3
/home/test_user/.rbenv/versions/2.4.0/bin/ruby -r ./siteconf20171006-4484-7fx7vj.rb extconf.rb --with-sqlite3-dir=/opt/local
checking for sqlite3.h... no
sqlite3.h is missing. Try 'brew install sqlite3',
'yum install sqlite-devel' or 'apt-get install libsqlite3-dev'
and check your shared library search path (the
location where your sqlite3 shared library is located).
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/home/test_user/.rbenv/versions/2.4.0/bin/$(RUBY_BASE_NAME)
	--with-sqlite3-config
	--without-sqlite3-config
	--with-pkg-config
	--without-pkg-config
	--with-sqlite3-dir
	--with-sqlite3-include
	--without-sqlite3-include=${sqlite3-dir}/include
	--with-sqlite3-lib
	--without-sqlite3-lib=${sqlite3-dir}/lib

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /home/test_user/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/extensions/x86_64-linux/2.4.0-static/sqlite3-1.3.13/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /home/test_user/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13 for inspection.
Results logged to /home/test_user/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/extensions/x86_64-linux/2.4.0-static/sqlite3-1.3.13/gem_make.out
```

`yum install sqlite-devel`を実行したところ

```
Loaded plugins: priorities, update-motd, upgrade-helper
You need to be root to perform this command.
```

と怒られたので[How Can I Enable Root SSH Access in An Amazon EC2 Instance?](https://stackoverflow.com/a/6633241)を参考に`sudo su`を実行して`yum install sqlite-devel`を実行。問題解決！
Cognos レポートの縦棒グラフでY軸の最大値を固定する

#概要
Cognos BIで縦棒グラフのY軸を完全に固定したいという要件がある時があります。
例えば、下の様な棒グラフで、Y軸の最大値を「30,000,000」に固定したいという要件です。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b1796e1e-f1d2-d1c7-0065-d38eeb48c712.png)

#内容
Cognos BI 10.2.2で普通にクラスター棒グラフを置き、「主軸」のプロパティで「軸の範囲」を最大値：30,000,000で固定してみます。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/51fc8f85-c757-6d58-27bd-68c9f7d1565a.png)

残念ながら、「30,000,000」を超える値(個人装備)が存在する場合、Y軸のスケールは「30,000,000」を超えて「40,000,000」まで勝手に延ばされてしまいます。
これはCognos 10 BIのグラフの仕様上の動作です。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9233d283-f779-444b-7da0-75ae0e3bb736.png)

基本的にこれはどうしようも無いのですが、どうしてもY軸を固定したい場合、Cognos 8時代の古いグラフを使用する事で可能です。

Report Authoringの「ツール」メニューから「オプション」を選択します。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5bbd0593-781e-ac1a-10b1-926ae2e275d5.png)

「詳細」タブで「古いグラフ作成ツールを使用」をチェックします。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f54b877e-e026-fd8f-0c7a-fbf7ddb0913c.png)

この状態で「グラフを挿入」しようとすると、以下のようにグラフ一覧でCognos 8時代のグラフが表示されます。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/71391a54-c84b-0f11-1593-5f405ac86aa6.png)

Y1軸のプロパティで、「最大値」を「30,000,000」に指定します。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b8a62bf1-2c12-53ce-614b-0c52e62005ba.png)

レポート実行します。
Y軸の最大値が「30,000,000」に固定されていますね。
「個人装備」の棒も、30,000,000を超えているのがわかる表示になっています。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/4988dd42-fbb0-1ffb-40cb-cfc6f352cb6c.png)

Y軸の最大値を「20,000,000」とした場合です。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/ef6b4d6e-2328-fbd0-ac04-c64134254d03.png)

とまあ、このように、時によってはCognos 8 時代のグラフの方が、望む動きをする時があります。

レポートの実装を考える時に、Cognos 10でのグラフの機能で実装できない場合、Cognos 8時代のグラフを使ってみる、というのも選択肢にあるという事を覚えておいてもらえればと思います。
Node.jsでの配列と連想配列について調べた

# 色々やってみたのでメモ

最近先輩が口を開くたびにNode.jsの話をしてくるので自分も勉強して良さを知りたい

## 配列

配列の中身は型が違ってもいいすごい

```.js
let a = [1,2,"3"]

for(x in a){
    console.log(x)
}
/* output
0
1
2
*/
```

`for(変数 in array)`の変数にはindexがはいるそうなので配列の要素を取得したいときは

```js
for(let i = 0,len = a.length;i < len;i++){
    let x = a[i];
    if(typeof x === "number"){
        console.log(x);        
    } else {
        console.log(x + ":" + typeof x)
    }
}
/*
1
2
3:string
*/
```

みたいな感じでやりましょう!
数値の型は`int`だと思ってて実行してから`number`ってことに気づきました..

`console.log()`で出力すると改行されるので,しない場合は`process.stdout.write()`にするといい

配列の要素を追加するには`a.push(XXX)`とかで追加します。
`a += '4'`とかやっても末尾に加わらないので！(いけると思ってやった..)
ちなみに+=で追加すると下みたいな感じになります

```js
a += "4"
for(x in a){
    console.log(a[x])
}
/*
1
,
2
,
3
4
*/
```

ちゃんと追加するときは↓

```js
a.push("4")
console.log(...a)
// 1 2 '3' '4'
```

`...a`で配列の要素展開できるのホント素敵

例えば

```js
var b = ['5',6]
a = [...a,...b]
console.log(...a)
// 1 2 '3' '4' '5' 6
```

とか言うこともできるのですごい楽に配列同士を結合できたりする

## 連想配列

そういえばCしかやってない友達に連想配列って言っても伝わらなかった、かなｓ..かなｃ

```js
let b = {
    a : 1,
    b : 2,
    c : 3
}

for(x in c){
    console.log("c[" + x + "] = " + c[x])
}
/*
c[a] = 1
c[b] = 2
c[c] = 3
*/
```

連想配列の場合も`for(変数 in obj)`で変数には`key`が入るので`value`を取得するには`b[変数]` みたいにする必要があります。
ちなみに`console.log(...b)`とかやると怒られました

連想配列の要素を追加するときは`c['d'] = 4`のような感じで追加します。

配列操作は今回pushしか書いてませんけど、当然ながら末尾に追加する以外にももっとたくさんできることがあるので是非是非調べてみてください。

おわり

オブジェクト指向を何かしら制作しながらちゃんと学びたいんだけど何作るのが一番理解深まるかなぁ
SmartGit > 一時的に過去のコミットに戻る | その後、最新のコミットに戻る

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

以下の手順のようだ。

### 過去のコミットに戻る

@ Log for . ウィンドウ

1. Commitsペインの右側のFilterにハッシュ値(6桁で良い?)を入力
    - 該当コミットを表示
2. CommitsペインのMessage内の該当コミットをダブルクリック
    - Check Outダイアログが表示される
3. Don't create local branch (just work read-only)を選択し[Checkout]
    - 該当のコミットの状態になる
    - メイン画面のRepositoriesペインにおいて「リポジトリ名 (該当ハッシュ値: コミットメッセージ)」という表示になる


### コードを確認

チェックしたいソースを確認する。

### 最新のコミットに戻る

@ Log for . ウィンドウ

Branchesペインにおいて HEAD(該当ハッシュ値)がチェックされた状態。

1. BranchesペインにおいてLocal Branchesの「master= origin」をダブルクリック
    - Check Outダイアログが表示される
2. [Checkout]を選択
3. Log for .ウィンドウを閉じる
    - メイン画面のRepositoriesペインにおいて「リポジトリ名 (master)」という表示になる
Laravel5.7: トップページを作る

現状ではトップページ用のビューには`welcome.blade.php`が使われていますが、新たに自作します。

# 親記事
[Laravel 5.7で基本的なCRUDを作る - Qiita](http://qiita.com/sutara79/items/ef30fcdfb7afcb2188ea)


# トップページのビューを作る
下記の内容でファイルを新規作成します。
:page_facing_up: [resources/views/top.blade.php](https://github.com/sutara79/demo-laravel-crud/blob/5.7/resources/views/top.blade.php)

# 使用するビューを変更する
```diff:routes/web.php
  Route::get('/', function () {
-     return view('welcome');
+     return view('top');
  });
```

# 表示を確認する
ブラウザでトップページを開いて、下のように表示されれば成功です。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/27816/a57321fe-c5e2-4408-fe63-7546fc0c495a.png)
Kerasメモ：時系列データのone-hotラベルをto_categoricalで生成

#動機
翻訳やチャットボットで盛り上がっている[seq2seq](https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf)をKerasで作ろうと思いました。

教師データとして入出力文章のペア(コーパス)を用意したら、コーパス内に登場する単語の一覧を取得し、一単語につき一つのラベルを与えてインデックス化します。
(今回は英語コーパスで取り組んだので、単語の分かち書きなどについては特に取り組んでいません。)

これを用いれば、単語の集まりである文章はラベルの集まりに変換できるので、seq2seqはラベルのシーケンスを入力し、ラベルのシーケンスを出力させるようなネットワーク構造になります。

すなわち、用意した語彙の中で、時刻毎にどのラベルを出力するべきかを学習する(クラス数が膨大な)他クラス分類問題になるのですが、このときKerasでは教師データの出力ラベルをone-hot vectorにする必要があります。
(Chainerなどでも一緒かな？)
one-hot vectorとは、例えばラベルが0~9の10通りであのとき、

```
label  0 1 2 3 4 5 6 7 8 9
1:    [0,1,0,0,0,0,0,0,0,0]
5:    [0,0,0,0,0,1,0,0,0,0]
```

といったように、ラベルのところだけ1で他は全て0という、クラス数の分だけの次元数を持つベクトルです。

これを作るためにKerasでは便利な関数[to_categorical](https://keras.io/utils/#to_categorical)があるのですが、何も考えずに使ったら思った通りには動かなかったので、そのためのメモ。

#to_categorical():ラベルをone hot vector化

```Python
from keras.utils import to_categorical
import numpy as np

data_num = 13
seq_len = 7
num_classes = 5

label = np.random.randint(5, size=[data_num, seq_len])
one_hot_label = to_categorical(label, num_classes=num_classes)

print(label.shape)          #(13, 7)
print(one_hot_label.shape)  #(91, 5)  ...(13, 7, 5)ではない
```

例として、

データ数(data_num): 13
シーケンス長(seq_len): 7
クラス数(num_classes): 5

としました。
num_classesは指定しない場合、クラス数を勝手に数えてくれるようなので、必ずしも必要ではないようです。
が、クラス数を明記した方が安全かなと思ったので書きました。

本当であれば、長さ5のベクトルが7つ集まってシーケンスとなり、13シーケンスあるので次元は(13, 7, 5)になって欲しかったのですが、長さ91のひとつながりのシーケンスになってしまいました。

というわけで、[numpy.reshape](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.reshape.html)で所用のサイズにします。

```Python
from keras.utils import to_categorical
import numpy as np

data_num = 13
seq_len = 7
num_classes = 5

label = np.random.randint(num_classes, size=[data_num, seq_len])
one_hot_label = to_categorical(label,num_classes=num_classes).reshape(data_num, seq_len, num_classes)

print(label.shape)          #(13, 7)
print(one_hot_label.shape)  #(13, 7, 5)
```

結局はnumpyの話になってしまいしたが...
applyをtraitで実装する

traitでapplyを実装して、初期化処理を共通化したくなりました。 :airplane: 

要件としては、`Identifier[_]`を継承したIDクラスを引数なしで`apply`すると値が自動生成されてほしい。

以下のようにすると、できた気がする :angel: 

```scala
trait Identifier[+A] {
  def value: A
}

trait StringIdentifierCompanion[A <: Identifier[_]] {
  def prefix: String
  def apply(value: String): A
  def apply(): A = this.apply(this.generateId)
  def generateId: String = s"${prefix}-${UUID.randomUUID.toString}" // WIP
}

final case class UserId(value: String) extends Identifier[String]

case object UserId extends StringIdentifierCompanion[UserId] {
  override def prefix: String = "USER"
}
```

StringIdentifierCompanionのtraitで`def apply(value: String): A`が定義されていますが、UserIdのコンパニオンオブジェクトなので、メソッドが自動生成され、わざわざ定義しなくても動く。
ruby の個人的メモ

- メソッド
    - require ･･･別のファイルを取り込む
        - require hello と記載すると、hello.rb の内容を読み込む。
- 配列
 - ARGV ･･･ ARGV[0] は一つ目の引数 
- 擬似変数
 - \_\_FILE__ ･･･実行中のスクリプトファイル名
fish shellのPATH設定


たまにしかやらないのですが、毎回忘れるのでメモします。

# 結論
## 一時的な設定

`set`コマンドと`-x`オプションを使います。
`/usr/local/bin`を追加するには、次のコマンドを実行します。

```
set -x PATH /usr/local/bin $PATH
```

## 永続的な設定

二つの方法があります。

### 方法1 設定ファイルを使う
他のshellと似た方法です。
`/usr/local/bin`と`/usr/sbin`を追加するには、`~/.config/fish/config.fish`に

```
set PATH /usr/local/bin /usr/sbin $PATH
```
と書きます。
セッションを起動するたびに環境変数が設定されます。

### 方法2 fish_user_pathsユニバーサル変数に設定

fish shellではユニバーサル変数という、すべてのセッションで共通の変数を設定できます。
PATHを設定するときは、`fish_user_paths`変数を使います。

`/usr/local/bin`を追加するには、次のコマンドを実行します。

```
set -U fish_user_paths /usr/local/bin $fish_user_paths
```

個人的に「なんとなくfish shellっぽい」という理由で、この方法を好んで使っています。

消すときは、次のように`/usr/local/bin`を取り除いた文字列を`fish_user_paths`変数に設定しなおします。

```
set -U fish_user_paths (string match -v /usr/local/bin $fish_user_paths)
```

# 説明

[fish: Tutorial](https://fishshell.com/docs/current/tutorial.html#path)に書いてあります。

> `$PATH`
> 
> `$PATH` is an environment variable containing the directories in which fish searches for commands. Unlike other shells, `$PATH` is a list, not a colon-delimited string.
> 
> To prepend /usr/local/bin and /usr/sbin to $PATH, you can write:
>
> ```
> > set PATH /usr/local/bin /usr/sbin $PATH
> ```
>You can do so directly in config.fish, like you might do in other shells with .profile. See this example.
> 
> A faster way is to modify the `$fish_user_paths` universal variable, which is automatically prepended to `$PATH`. For example, to permanently add /usr/local/bin to your `$PATH`, you could write:

> ```
> > set -U fish_user_paths /usr/local/bin $fish_user_paths
> ```
> The advantage is that you don't have to go mucking around in files: just run this once at the command line, and it will affect the current session and all future instances too. (Note: you should NOT add this line to config.fish. If you do, the variable will get longer each time you run fish!)

# 参考
- [[ fish shell ] 今年からfish shell使ってるので初期設定ファイルを貼っておきます - Qiita](https://qiita.com/kickbase/items/0e16dea0dde5db7da0ed)
- [Fish Shellはじめました – bulblub](https://www.bulblub.com/2013/05/30/starting_fish-shell/)
- [fishでPATHを通したり消したり - Qiita](https://qiita.com/patorash/items/246b8ee11ee8e7e27148)
- [Rustをインストール - macOS & fish-shellの場合 - Qiita](https://qiita.com/ledsun/items/9af5cb594b4f9b6c5523)
PhpStorm、ToolsからDeploymentが消える

#いつの間にか消えてた
これじゃあサーバにアップロードができないよう・・・
![スクリーンショット 2017-10-06 11.01.07.png](https://qiita-image-store.s3.amazonaws.com/0/116531/2b9ffc73-0723-0ae2-d4cc-a0b0df7c7760.png)

#絶対変なとこ触ってないけど勝手に消えた！
でも大丈夫。ホストへの接続はPlugInがやっているそうです。
PlugInの設定は
**Preferences>Plugins>Remote Hosts Access**にチェックを入れるだけ。
再起動して・・・・

![スクリーンショット 2017-10-06 11.09.40.png](https://qiita-image-store.s3.amazonaws.com/0/116531/93abf3ff-663b-8587-4824-a6d833160c20.png)
uploading-0]()

#出てきた!
![スクリーンショット 2017-10-06 11.10.54.png](https://qiita-image-store.s3.amazonaws.com/0/116531/c1d9e08e-152e-d7bb-7af9-d2fb931cae0e.png)


よかった！
Azure Search の検索候補 (オートコンプリート) を試してみる


検索サービスのオートコンプリートって便利だけど自前で作るのはなにかと大変。そんな時に便利なのがAzure Searchの Suggestions だ。これについて日本語のよいドキュメントが見当たらなかったのでポイントを解説する。  概要レベルの内容は [ここ](https://blogs.msdn.microsoft.com/windowsazurej/2015/02/02/azure-search-5/)を参考にしていただきたい。

![image](https://qiita-image-store.s3.amazonaws.com/0/33998/73ea4eed-d55c-997c-b959-9de9fff0acaf.png)


今回はAzure Blob Storage にPDF、DOCX等、様々なドキュメントを放り込んでインデックスを作成した。やり方は[こちら](https://docs.microsoft.com/ja-jp/azure/search/search-howto-indexing-azure-blob-storage)。


下記画面の通りインデックスの作成は定期的に実行できる。またデータの削除をインデックスに反映させるためにはTrack deletionsのチェックが必要だ。なお、執筆時点(2017/10/5)ではAdvanced optionsの設定が動かなかった（開いてボタンを押すだけでインデックスが作成されなくなってしまった）ので開発チームにフィードバックしておいた。試していないがおそらくAPI経由であれば設定できるのではないかと思う。
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/6f581734-9cfd-09bb-8f45-70043a2321a1.png)

ちなみにAdvanced optionsを指定すればエラーを無視することができる。例えば今回は比較的大きなサイズのドキュメントを対象にしているのだが、以下のようなエラーが発生してしまった。エラーを無視できなければこのエラーが発生したタイミングでインデックスの作成が停止してしまう。Azure Search のLimitationについては[こちら](https://docs.microsoft.com/en-us/azure/search/search-limits-quotas-capacity)に詳しく記載されているので参考にしていただきたい。
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/1f973596-f4e1-bc62-85d7-5fbd7f8a0352.png)


Suggestionsの対象となるフィールドにSEARCHABLEの設定をする。

Azure Search 
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/35392045-2775-8320-aa56-f0b22a52257e.png)




日本語を扱うときに重要なのがAnalyzerの設定だ。デフォルトはStandard LuceneにAnalyzerになっているので日本語検索が必要あればLucene JapaneaseかMicrosoft Japaneaseの設定をおこなう。Luceneには[便利なクエリ](https://docs.microsoft.com/ja-jp/rest/api/searchservice/lucene-query-syntax-in-azure-search)が多いので私はLuceneを選択した。
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/fbe0fe54-bfb6-37e9-7e1f-b25423acd394.png)




対象のフィールドにSuggesterの設定を行う。
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/10afd13c-3266-b412-a182-a2f38feef940.png)


 あとはVisual Studioを使ってNuGetでAzure Searchのモジュールをインストールしたうえでコーディングすれば値を取得できるはずだ。
  
  ![image](https://qiita-image-store.s3.amazonaws.com/0/33998/f7f79318-a0e5-8154-3af1-5fade69487b8.png) 
  
```csharp
SearchServiceClient serviceClient = new SearchServiceClient(searchServiceName, new SearchCredentials(adminApiKey));
ISearchIndexClient indexClient = serviceClient.Indexes.GetClient(indexName);
DocumentSuggestResult suggestions = indexClient.Documents.Suggest(searchText, suggesterName);

foreach(SuggestResult r in suggestions.Results)
{
    Console.WriteLine(r.Text);
}
```
C++ Builder | git > 削除や追加したコンポーネントのgitコミットを探す > git log -S "E_status0" someFile.dfm

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
  - Git-Shell上にて実行
```

ソースコード(.cpp)を読んでいると、過去に削除したコンポーネントを参照している部分が見つかった。
コンポーネントの削除履歴をどう見つけるか?

参考: [How do I “git blame” a deleted line?](https://stackoverflow.com/questions/4404444/how-do-i-git-blame-a-deleted-line)

C++ Builderの場合、コンポーネントの変更(削除や追加)は.dfmファイルで追えるだろう。

以下を実行してみた。

```
$ git log -S "E_status0" someFile.dfm
```

コミットのハッシュ値が表示された。
そのハッシュ値の7桁までをbitbucketで入力して、コミット時の状況が把握できた。
ClojureScriptでページ内URL操作（pushState, popState）

# はじめに

pushState popStateとはReactを利用したサイトのように，ページ内遷移しか発生しなくとも，URLを書き換え履歴に追加し，ブラウザバックに対応することができる仕組みです．

javascriptやjQueryではやり方が多々紹介されているのですが，cljsで行う際に若干詰まったので一言備忘録を残しておきます(ほぼjsからの変換そのままです)．

# cljsでpushState, popState

```clj
(def data (atom {}))

...

;; pushState
(-> js/window .-history (.pushState #js {:data (pr-str data)} nil (str "/url"))))

;; popState
(set! (.-onpopstate js/window)
        #(when-not  (nil? (aget  % "state"))
           (when-let [d (cljs.reader/read-string (aget % "state" "data"))]
             (swap! data d))))
```
HighSierraにしてpyenvからpython入れようとしたら失敗した”The Python ssl extension was not compiled. Missing the OpenSSL lib?”

High Sierraにしてpyenvからpython入れようとしたら失敗した

pyenvは普通にhomebrewで入れた

```
$ pyenv install 3.6.3
Downloading Python-3.6.3.tar.xz...
-> https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz
Installing Python-3.6.3...
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (OS X 10.13 using python-build 20160602)

Inspect or clean up the working tree at /var/folders/j5/7gjxgk7n6cx681n7_0hx6ylw0000gn/T/python-build.20171006102601.12194
Results logged to /var/folders/j5/7gjxgk7n6cx681n7_0hx6ylw0000gn/T/python-build.20171006102601.12194.log

Last 10 log lines:
			upgrade) ensurepip="--upgrade" ;; \
			install|*) ensurepip="" ;; \
		esac; \
		 ./python.exe -E -m ensurepip \
			$ensurepip --root=/ ; \
	fi
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-9.0.1 setuptools-28.8.0
```

エラーメッセージに
[https://github.com/pyenv/pyenv/wiki/Common-build-problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems)

ここを見ろとあったので，言われたようにやったら入った

```
$ CFLAGS="-I$(brew --prefix openssl)/include" LDFLAGS="-L$(brew --prefix openssl)/lib" pyenv install -v 3.6.3
```

はい

```
$ pyenv versions
* system (set by /Users/so/.pyenv/version)
  3.6.3
```
Laravel5.7: Laravelをインストールする

# 親記事
[Laravel5.7で基本的なCRUDを作る](https://qiita.com/sutara79/items/ef30fcdfb7afcb2188ea)


# Laravelをインストールする
「Laravelインストーラ」ではなく、Composerの`create-project`コマンドでインストールします。
:link: readouble.com: [Laravelのインストール](https://readouble.com/laravel/5.7/ja/installation.html#installing-laravel)

下記を実行すると、現在の場所に`5.7`というフォルダが作られ、その中にLaravelがインストールされます。
指定するフォルダ名は自由です。

```text:PowerShell
> composer create-project --prefer-dist laravel/laravel 5.7
```


# 動作確認をする
下記を実行し、ブラウザで`http://127.0.0.1:8000`へアクセスしてください。

```text:PowerShell
> php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
```

下のように表示されれば成功です。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/27816/c9963b15-6079-1080-5e5c-7d1c072d7fdd.png)

上のコマンドの内部では、PHPの組み込みサーバーを使っています。
:link: PHP公式ドキュメント: [ビルトインウェブサーバー](https://secure.php.net/manual/ja/features.commandline.webserver.php)

XAMPPのApacheでページを処理する正式な方法は、[次の章](https://qiita.com/sutara79/items/e2986209ae54923fc3a6)で紹介します。

- - -
# (余談) Laravelインストーラを使う場合
公式ドキュメントではLaravelインストーラを利用する方法が最初に紹介されており、私も以前はインストーラを使っていました。
しかし、依存している`symfony/console`の要求バージョンが、他のパッケージ(phpDocumentor2.9)での要求バージョンと異なり、どちらか一方を削除しなければならないため、私はLaravelインストーラの方を削除しました。

## 通常の導入方法
```text:PowerShell
# 新規にLaravelインストーラを追加する場合
> composer global require laravel/installer

# すでにLaravelインストーラが存在する場合は、更新を確認する
> composer global outdated laravel/installer
(中略)
versions : * v1.4.1
latest   : v2.0.1 (最新版がある!!)

# 古い場合は更新する
> composer global update laravel/installer

# Laravelアプリを新規作成する
> laravel new basic-crud
```

## 遭遇した問題
v1.xのLaravelインストーラでは問題ありませんでした。
v2.xに更新しようとすると、下記のように`symfony/console`はv3.xまたはv4.xにしろと警告されます。

```text:PowerShell
> composer global update laravel/installer
(中略)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Conclusion: don't install laravel/installer v2.0.1
    - Conclusion: remove symfony/console v2.8.34
    - Installation request for laravel/installer 2.*
    - Conclusion: don't install symfony/console v2.8.34
    - laravel/installer v2.0.0 requires symfony/console ~3.0|~4.0
```

いったんv1.xのLaravelインストーラを削除して新規にv2.xのLaravelインストーラを入れようとするものの、ダメでした。
`symfony/console`が他のパッケージで使われていないかを[whyコマンド](https://getcomposer.org/doc/03-cli.md#depends-why-)で確認すると、私の環境ではphpDocumentorが古い`symfony/console`に依存していました。

```text:PowerShell
> composer global why symfony/console
Changed current directory to C:/Users/Owner/AppData/Roaming/Composer
cilex/console-service-provider  1.0.0   requires  symfony/console (~2.1)
laravel/installer               v1.4.1  requires  symfony/console (~2.3|~3.0)
phpdocumentor/phpdocumentor     v2.9.0  requires  symfony/console (~2.3)
```

古いLaravelインストーラとphpDocumentorを削除すると、最新版のLaravelインストーラを導入できました。
しかし、私としてはphpDocumentorはグローバルで使いたいので、Laravelインストーラの方を諦めることにしました。
Node.jsで、存在するはずのmoduleがrequireでエラーになることについて

引っかかる人多そうなのと、備忘録として

##環境
Mac(OS X)

##問題
**初めてのJavaScriptだー**
```$ npm -g install モジュール名```
でmoduleをインストール。よっしゃサンプルプログラムを動かすでーと意気込んでいると

>Error: Cannot find module 'モジュール名'

あの、、、、、
なんでかrequireのところでエラー起こるんですけど、、、、


##原因
調べたところ、こんなものを見つけた。
http://phiary.me/npm-node-js-require-module-memo/
require で探すモジュールのパスは global.module.pathsから見れるらしい。

```
$node
>global.module.paths
[ 'e:/Users/hoge/Documents/work/node_modules',
  'e:/Users/hoge/Documents/node_modules',
  'e:/Users/hoge/node_modules',
  'e:/Users/node_modules',
  'e:/node_modules' ]

（上記の表示内容はphiaryさんのをまるっと持ってきました）
```

（ちなみに対話型の画面は.exitで抜けられます。←quit()連打して少し詰まった）

つまるところ、せっかく-gをつけてグローバルに使えるようにしたのにnode自体がそれどこ？状態な訳だ。
Win環境の時は散々気にしてたPATHが通っていないということだった。


##解決法
**ということでPATHを通そう**

https://qiita.com/hikaruna/items/abdadca27f12c0e4eb78
ここを参考に
```$ echo $NODE_PATH```
と入力してみると、なんも返ってこなかった。やっぱり、、、


```$ export NODE_PATH=`npm root -g` ```
と入力すると、**うまく動いた！**
（なお、これはnodeのPATHなので全体のPATHとは違うらしい。）

Mac使ってるとPATHいい感じに通してくれること多いから忘れがちになるよね(
Aws Lambda をローカルで実行する (Python3)

必要なソフトのインストール

```bash
sudo pip install python-lambda-local
```

イベントの定義

```json:event.json
{
  "key1": "おはよう",
  "key2": "こんにちは",
  "key3": "テスト",
  "key4": "Hello",
  "key5": "Good Afternoon"
}
```

プログラム

```py3:lambda_function.py
# -*- coding: utf-8 -*-
#
#	lambda_function.py
#
#					Oct/6/2017
#
# --------------------------------------------------------------------
import sys
import json
 
# --------------------------------------------------------------------
def lambda_handler(event, context):
	sys.stderr.write("*** lambda_handler *** start ***\n")
	print("Received event: " + json.dumps(event, indent=2))
	print("AAA value1 = " + event['key1'])
	print("BBB value2 = " + event['key2'])
	print("CCC value3 = " + event['key3'])
	print("DDD value4 = " + event['key4'])
	print("EEE value5 = " + event['key5'])
	sys.stderr.write("*** lambda_handler *** end ***\n")
#
	return event['key1']  # Echo back the first key value
	#raise Exception('Something went wrong')
# --------------------------------------------------------------------
```

実行コマンド

```bash
python-lambda-local -f lambda_handler lambda_function.py event.json
```

実行結果

```text
$ python-lambda-local -f lambda_handler lambda_function.py event.json
[root - INFO - 2017-10-06 10:15:38,666] Event: {'key1': 'おはよう', 'key2': 'こんにちは', 'key3': 'テスト', 'key4': 'Hello', 'key5': 'Good Afternoon'}
[root - INFO - 2017-10-06 10:15:38,667] START RequestId: 2218d928-ed76-4d6e-b290-dc597505fd4d
*** lambda_handler *** start ***
Received event: {
  "key1": "\u304a\u306f\u3088\u3046",
  "key2": "\u3053\u3093\u306b\u3061\u306f",
  "key3": "\u30c6\u30b9\u30c8",
  "key4": "Hello",
  "key5": "Good Afternoon"
}
AAA value1 = おはよう
BBB value2 = こんにちは
CCC value3 = テスト
DDD value4 = Hello
EEE value5 = Good Afternoon
*** lambda_handler *** end ***
[root - INFO - 2017-10-06 10:15:38,667] END RequestId: 2218d928-ed76-4d6e-b290-dc597505fd4d
[root - INFO - 2017-10-06 10:15:38,667] RESULT:
おはよう
[root - INFO - 2017-10-06 10:15:38,667] REPORT RequestId: 2218d928-ed76-4d6e-b290-dc597505fd4d	Duration: 0.35 ms
$ 
```

次の環境で動作を確認しました。

```text
$ uname -a
Linux iwata 5.14.7-arch1-1 #1 SMP PREEMPT Wed, 22 Sep 2021 21:35:11 +0000 x86_64 GNU/Linux
$ python --version
Python 3.9.7
$ python-lambda-local --version
python-lambda-local 0.1.12
```
サイト公開前にユーザビリティテストをすることに

社内向けポータルサイトのリニューアル作業実施中。もうすぐ公開だと思っていたら、公開前にユーザビリティテストを実施することになった。

# ここまでの流れ
社内向けポータルサイトのリニューアル前後がぜんぜん違うものになるので、社員が不自由なく使えるのか心配だという意見が上がった。
社内向けポータルサイトのリニューアルはUIの改善をメインに実施していた。もともとあった社内向けポータルサイト内のコンテンツを整理整頓して配置し直して、デザインを新しくしただけだったが、今まで無秩序に配置されていたコンテンツを、使う人の状況を想像してグループ分けして配置をし直したため、見た目が全く違う形になっていた。ここまでは特にUXデザインの手法等は使用していなかった。
ここで一緒にリニューアル作業を行っていた部内から「社員が不自由なく使えるのか心配」という意見が出て、その不安を解消できないか相談が来た。そこで、すでに新しいサイトの動くものができており、社員が不自由なく使用できるか知りたいということだったので、UXデザイン手法のユーザビリティテストを勧めた。ペルソナ作りたいとも言われたけど、ペルソナの説明をすると面倒と感じたらしく、ユーザビリティテストで納得してもらえた。

# まず初めに
はじめに一緒に作業をするメンバーにユーザビリティテストについて少し説明。参考にわかりやすそうなサイトを共有。
https://wacul-ai.com/blog/site-improvement/method/usability-test/

そして全体の作業を確認した。

# テスト作業手順を確認
|作業|作業内容|
|:--|:--|
|目的決め|今回のテストの目的を具体的に決める。|
|仮説立て|問題ありそうな箇所を内部レビューして仮説を立てる。|
|タスクを設計|仮説を検証するためのタスクを設計。日常業務により近い状況を想定する。|
|シナリオ作成|タスクを実施してもらうためのシナリオを考える。|
|質問作成|テストをしてもらう人に聞きたい質問事項を考える。|
|人・場所・モノの準備|テストで使用する機材、サービス、場所を用意と、テストしてもらう人の条件を決めて、リクルートする。|
|パイロットテスト|テストを通しで行う。結果をブラッシュアップして、本番へ。|
|本番テスト|テストを実施。|
|結果を分析、改善に向けて計画 | ユーザーが言った言葉を鵜呑みにせず、言葉の原因を探して、改善案にする。|


次回作業へ。
Macでhostsを追加・編集する方法

ローカル環境でIPにVirtualHost割り当てたい時の二つの方法

> 以下では`127.0.0.1`というIPに`hoge.com`というバーチャルホストを割り当てたい時というものを想定して説明します。

## hostsファイルを直接編集

```
// vimでhostsファイルを直接編集
$ vi /etc/hosts

// vimが立ち上がったら、以下を最終行に挿入
127.0.0.1 hoge.com
```

## Hosts.prefpaneを使う

Hostsをシステム環境設定から追加・編集が出来るようになるアプリケーション。
[こちら](https://github.com/downloads/specialunderwear/Hosts.prefpane/Hosts-1.2.pkg)からダウンロードしてください。
ダウンロードして展開し、システム環境設定を開くと以下のように一番下にHostsが加わっている。
![スクリーンショット 2017-10-06 9.55.36.png](https://qiita-image-store.s3.amazonaws.com/0/19716/2c777546-770c-6088-b24f-c2f8b495298f.png)

使い方は、左下の鍵マークをクリックし、編集出来るようにしてから`IP`と`使用したいhostname`を埋める。
![スクリーンショット 2017-10-06 9.59.20.png](https://qiita-image-store.s3.amazonaws.com/0/19716/f448a8fb-0a57-171d-e957-919f9c86289e.png)
postgresでcopyとupdateを使ってレコード移動をする方法

# 概要

postgresのcopyとupdateを使って、フィールドが同じテーブル間でレコードを移動する方法です。
postgres9.5からはON CONFLICTを使ってupsertが簡単にできるようになりましたが、
それ以前のバージョンでは、copyやupdateなどを使って、insertとupdateに分けてレコードの移動をする必要があります。

# 手順

### psqlでインポート元のDBにログイン
```sh
psql -h ホスト名 -U ユーザー名 -d インポート元DB名
```

### insertしたいレコードをCSVでエクスポート
```sql
\copy (SELECT * FROM table_name WHERE created_at > '2017/10/05 00:00:00') TO 'pg_out_insert.csv' WITH CSV HEADER
```

### updateしたいレコードをCSVでエクスポート
```sql
\copy (SELECT * FROM table_name WHERE updated_at > '2017/10/05 00:00:00' AND created_at < '2017/10/05 00:00:00') TO 'pg_out_update.csv' WITH CSV HEADER
```

insertしたいレコードとupdateしたいレコードとを分けてエクスポートしておきます。

### psqlでインポート先のDBにログイン
```sh
psql -h ホスト名 -U ユーザー名 -d インポート先DB名
```

### insertを実行
```sql
\copy table_name FROM 'pg_out_insert.csv' WITH CSV HEADER
```

### updateを実行
```sql
-- 一時テーブルを作成
-- データは空でフィールドをコピー
CREATE TEMP TABLE temp_table_name AS
TABLE table_name
WITH NO DATA;

-- 一時テーブルにCSVからインポート
\copy temp_table_name FROM 'pg_out_update.csv' WITH CSV HEADER

-- UPDATEを実行
UPDATE table_name a
SET
(id, hospital_id, ward_type, bed_division, number_of_wards, number_of_beds, division, application_division, created_at, updated_at, acceptance_code)
=
(b.id, b.hospital_id, b.ward_type, b.bed_division, b.number_of_wards, b.number_of_beds, b.division, b.application_division, b.created_at, b.updated_at, b.acceptance_code)
FROM temp_table_name b
WHERE a.id = b.id;

-- セッションが切れれば一時テーブルは自動で削除される
```

# 補足

- `\copy`メタコマンドと`COPY`コマンドでは、読み込まれるファイルの場所に違いがあります。`\copy`ではpsqlを実行しているクライアント上のファイルが、`COPY`ではログインしているDBサーバー上のファイルが読み込まれます。

- やはりけっこう面倒なので、ON CONFLICTが使える環境にした方が良いです。
functionとアロー関数でthisの参照先が違う

基本的なことなのに知らなかった・・・。15分くらいはまった。

```js
const user = {
  name: 'abc',
  getNameArrow: () => {
    return this.name
  },
  getNameFunction: function () {
    return this.name
  }
}

console.log(user.getNameArrow()) // undefined
console.log(user.getNameFunction()) // abc
```

ちなみにこれは意図通りだった。

```js
const user = {
  name: 'abc',
  getNameMethod () {
    return this.name
  }
}

console.log(user.getNameMethod()) // abc
```

Class構文が一番自然か。

```js

class User {
  constructor () {
    this.name = 'abc'
  }

  getNameMethod () {
    return this.name
  }
}

const user = new User()
console.log(user.getNameMethod()) // abc
```


参考

https://stackoverflow.com/questions/44751996/sequelize-v4-instance-methods-not-working
Python3 MeCabモジュールのImportErrorの対処

# 状況

* https://qiita.com/grachro/items/4fbc9bf8174c5abb7bdd
* https://qiita.com/piruty_joy/items/5ae2c2ba660796112207

いくつかの記事を参考にしてPythonからMeCabを利用するためのパッケージをインストールしたところ。

```bash
$ mecab-config --version
0.996

$ python -V
Python 3.6.1

$ pip freeze | grep mecab
mecab-python3==0.7
```

## エラー内容

PythonからMeCabモジュールを使おうとして下記のようなImportErrorが出た:cry:

```text
ImportError: libmecab.so.2: cannot open shared object file: No such file or directory
```

## やったこと

共有ライブラリの探索パスを追加

```bash
$ mecab-config --libs-only-L | sudo tee /etc/ld.so.conf.d/mecab.conf
$ sudo ldconfig
```


なおったか試す

```bash
$ cat <<EOL | python
import MeCab
m = MeCab.Tagger ("-Ochasen")
print(m.parse ("今日もしないとね"))
EOL
```

出力結果

```text
今日	キョウ	今日	名詞-副詞可能
も	モ	も	助詞-係助詞
し	シ	する	動詞-自立	サ変・スル	未然形
ない	ナイ	ない	助動詞	特殊・ナイ	基本形
と	ト	と	助詞-接続助詞
ね	ネ	ね	助詞-終助詞
EOS
```

うまくいったぽい:smiley:
jqコマンドでjsonを扱う

json形式のデータを扱うことが出来るコマンド。

# 導入(Mac)
brewでインストールする。
homebrewを導入していない時は入れる。

```
$ brew install jq
```

#使い方
例えばlivedoor天気情報APIから

```
$ curl 'http://weather.livedoor.com/forecast/webservice/json/v1?city=130010' | jq
```

こんな風に叩くと

```
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7934    0  7934    0     0  45091      0 --:--:-- --:--:-- --:--:-- 45597
{
  "pinpointLocations": [
    {
      "link": "http://weather.livedoor.com/area/forecast/1310100",
      "name": "千代田区"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/1310200",
      "name": "中央区"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/1310300",
      "name": "港区"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/1310400",
      "name": "新宿区"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/1310500",
      "name": "文京区"
    },
.
・
・
```

という感じに表示出来る。

その他の使い方

https://stedolan.github.io/jq/manual/
Ruby のメソッドが取れる引数のパターンを列挙する

メソッドが取れる引数のパターンをざっくり列挙するスクリプトを書いてみました。

```rb
arg_types = %w(req opt=2 keyreq: key:4 *rest **keyrest &block)

1.upto(arg_types.size) do |c|
  puts
  puts "--------------- arg types num #{c} ---------------"
  arg_types.permutation(c).each do |l|
    code = "def func(#{l.join(', ')}) end"
    begin
      eval(code)
      puts code
    rescue SyntaxError
    end
  end
end
```

実行結果

```
--------------- arg types num 1 ---------------
def func(req) end
def func(opt=2) end
def func(keyreq:) end
def func(key:4) end
def func(*rest) end
def func(**keyrest) end
def func(&block) end

--------------- arg types num 2 ---------------
def func(req, opt=2) end
def func(req, keyreq:) end
def func(req, key:4) end
def func(req, *rest) end
def func(req, **keyrest) end
.
.
.
--------------- arg types num 7 ---------------
def func(req, opt=2, *rest, keyreq:, key:4, **keyrest, &block) end
def func(req, opt=2, *rest, key:4, keyreq:, **keyrest, &block) end
def func(opt=2, *rest, req, keyreq:, key:4, **keyrest, &block) end
def func(opt=2, *rest, req, key:4, keyreq:, **keyrest, &block) end
```

抜けてるパターンもあるのですが、大体のパターンがわかります。
電磁気学

[トップページ](c6dc94cdd8997164e730)

# 電磁気学まとめ

## 静電気

- 電荷　：物体が持っている電気のことを電荷という
- 電気量：電荷が持っている電気の量を電気量という。単位にＣ（クーロン）を使う。
- 原子の構造
  - 原子核
     - 陽子　：これが正の電荷を持つ。電気量は $1.6 \times 10^{-19}$
     - 中性子
  - 電子：これが負の電荷を持つ。電気量は $-1.6 \times 10^{-19}$

- 静電誘導：**導体**に帯電体を近づけたときに電子が移動し、帯電体の近くに帯電体と反対の電荷があらわれること
- 静電分極：**不導体**に帯電体を近づけたときに電子が原子の許す範囲で移動することで、電荷の分布がずれること

## クーロンの法則

```math
r[m] 離れている２つの点電荷 q_1 と q_2 の間に働く静電気力は \\
F = k \frac{q_1q_2}{r^2} 　　kは比例定数: 9.0 \times 10^9 [\frac{Nm^2}{c^2}]
```

## 電場

電荷を置くとその電荷に力が働く場所のことを**電場**という。
$電場は、E[N/C] と表す。$
$E[N/C] の電場に q[C] の電荷を置くと、qE[N]の力を受ける => F = qE$

- +1Cの「点電荷」を電場Eに置いたときを考えると $F = E$ となる。  
  __***すなわち「1Cの点電荷」が受ける力と方向は「電場E」と等しい。***__

- 一様な電場
  - どこも電場の大きさは E なので点電荷に働く力は => $F = qE$
- 点電荷が作る電場
  - +Q[C]の点電荷と+1Cの点電荷が距離r[m]離れているとすると  
    両者に働く静電気力は**クーロンの法則**から => $F = k\frac{Q}{r^2}$  
    したがって+Q[C]の点電荷によって、+1Cの「点電荷」は $F = k\frac{Q}{r^2}$ の力が働く。  
    => +Q[C]点電荷が作る電場は $E = k\frac{Q}{r^2}$

- [電位を参照]
  - $V = Ed　=>　E = \frac{V}{d}[V/m]$

## ガウスの法則

- 電気力線
  - $電場の大きさが E[N/C] のところは、1m^2 辺りにE本の電気力線を書く$

- $電荷 +Q[C] から r[m] 離れたところの電場の大きさは E = k \frac{Q}{r^2}$ 
  $=> 1m^2辺り　k \frac{Q}{r^2} [本]　の電気力線が出ている$ 
  $電荷 +Q[C] から r[m] 離れたところは半径rの球であり、その面積は S = 4 \pi r^2[m^2]$ 
  $したがって、電荷 +Q[C] から r[m] 離れたところの電気力線数は k \frac{Q}{r^2} \times 4 \pi r^2 = 4 \pi kQ [本]$

## 電位

重力と同じように、電気も高いところ => 低いところに静電気力が働いている。
この電気的な高さのことを**電位**といいＶ（ボルト）で表す。
電位は **「基準点からその点まで、＋１Ｃの点電荷をゆっくりと動かしたとき、外力がした仕事」** と定義されている。
=> $V（ボルト） = \frac{J}{C} （ジュール毎クーロン）$ ※+1C辺りの仕事量がV

$V[V]の電位のところにq[C]を運ぶのに外力する仕事は　　W = qV[J]$
$V[V]の電位のところにあるq[C]の電荷のもつ静電気力による位置エネルギーは　　U = qV[J]$

- 一様な電場  
  「1Cの点電荷」は「電場E」と等しいEの力を受ける。これをd[m]動かしたときの仕事は $W = Ed[J]$  
  よって $V = Ed[V]$
- 点電荷が作る電場  
  +Q[C]点電荷が距離r[m]のところに作る電場は $E = k\frac{Q}{r^2}$  
  これをr[m]動かしたときの仕事は $W = k\frac{Q}{r^2} \times r = k\frac{Q}{r}$  
  よって $V = k\frac{Q}{r}[V]$

## 電流

1秒間に導線を移動する電気量 => $A（アンペア） = \frac{C}{s}$
t[s]秒間にQ[C]の電荷が通るときの電流は => $I = \frac{Q}{s}[A]$ => $Q = It[C]$

$電子の電気量-e[C]、動く速さをv[\frac{m}{s}]、導線1m^3辺りの電子の数をn[個]、動線の断面積をS[m^2]とすると$
$導線を流れる電流I[A] = envS となる$
$=> 1秒間で移動する部分の体積は　v \times 1 \times S = vS[m^3]$
$=> 上記体積中にある電子の数は　n \times vS = nvS[個]$
$=> 上記体積中にある電子の電気量は　|-e| \times nvS = envS[C] => これは1秒間に移動する電気量である$
数式サンプル

[トップページ](c6dc94cdd8997164e730)

# 数式

- 参考
  - [Qiitaの数式チートシート](https://qiita.com/PlanetMeron/items/63ac58898541cbe81ada#%E5%92%8C%E7%B7%8F%E5%92%8C%E3%82%B7%E3%82%B0%E3%83%9E%CF%83)
  - [Qiitaでの様々な数式の書き方](https://qiita.com/ttabata/items/92a4a72b042e6a2dbbad)

## 指定方法

- コードブロック"math"で指定する

```text
　```math
　```  
```

- **$（インライン）** または **$$（段落）** で囲む
    
```
$ \frac{a}{b} $
$$ \frac{a}{b} $$
```

- サンプル

```math

\begin{align}

& m \frac{d^2x}{dt^2} = \vec{F} \\
& a

\end{align}

```

$$
\begin{array}{l}
m \frac{d^2x}{dt^2} = \vec{F}
\end{array}
$$

運動方程式： $ m \frac{d^2x}{dt^2} = \vec{F} $

## 記述

- 分数 
  \frac{a}{b} => $ \frac{a}{b} $

- ベクトル
  \vec{F} => $ \vec{F} $

- イコール揃え

> \`\`\`math
> \begin{align}
> f(x) &= x^2+3x+2 \\
> &= (x+1)(x+2)
> \end{align}
> \`\`\`
    
```math
\begin{align}
f(x) &= x^2+3x+2 \\
&= (x+1)(x+2)
\end{align}
```

## 一覧

|内容|記述|表示|
|:--|:--|:--:|
|分数|\frac{a}{b}|$ \frac{a}{b} $|
|ベクトル|\vec{F}|$ \vec{F} $|
|ドット|\cdot|$ a \cdot b $|
|累乗|x^2　e^x|$ x^2　e^x$|
|n乗根|\sqrt{x}　\sqrt[n]{x}|$ \sqrt{x}　\sqrt[n]{x} $|
|対数|\log_2 x|$$ \log_2 x $$|
|三角関数|\sin x　\cos x　\tan x|$ \sin x　\cos x　\tan x $|
|和|\sum_{k=1}^{n} k|$$ \sum_{k=1}^{n} k $$|
|極限|\lim_{x \to \infty} f(x)|$$ \lim_{x \to \infty} f(x) $$|
|積分|\int_a^b f(x) dx|$ \int_a^b f(x) dx $|
|角度|\angle A|$ \angle A $|


## ギリシャ文字

|出力|TEXTEX|読み方|
|:--:|:--:|:--|
|$ \alpha $|\alpha|アルファ|
|$ \beta $|\beta|ベータ|
|$ \gamma $|\gamma|ガンマ|
|$ \delta $|\delta|デルタ|
|$ \varepsilon $|\varepsilon|バーイプシロン|
|$ \eta $|\eta|エタ|
|$ \theta $|\theta|シータ|
|$ \lambda $|\lambda|ラムダ|
|$ \mu $|\mu|ミュー|
|$ \pi $|\pi|パイ|
|$ \rho $|\rho|ロー|
|$ \phi $|\phi|ファイ|
|$ \omega $|\omega|オメガ|
|$ \Sigma $|\Sigma|シグマ|
|$ \Delta $|\Delta|デルタ|
失敗: rgburke/grv をubuntuでビルド

## 参考

* [GRV - ターミナル上のGitリポジトリビューワー MOONGIFT](http://www.moongift.jp/2017/10/grv-%e3%82%bf%e3%83%bc%e3%83%9f%e3%83%8a%e3%83%ab%e4%b8%8a%e3%81%aegit%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e3%83%93%e3%83%a5%e3%83%bc%e3%83%af%e3%83%bc/)
* [rgburke/grv: GRV is a terminal interface for viewing git repositories](https://github.com/rgburke/grv)

## ビルド

* ubuntu 17.04

```rb
mkdir ~/go
export GOPATH=$HOME/go

apt install -y \
 cmake libncursesw5-dev libcurl4-openssl-dev libreadline-dev \
 libssh2-1-dev zlib1g-dev libhttp-parser-dev

go get -d github.com/rgburke/grv/cmd/grv
cd $GOPATH/src/github.com/rgburke/grv

make install
```

```sh:エラー
go/src/gopkg.in/libgit2/git2go.v25/vendor/libgit2/src/netops.c:239: `http_parser_parse_url' に対する定義されていない参照です
collect2: error: ld returned 1 exit status

Makefile:16: ターゲット 'grv' のレシピで失敗しました
make: *** [grv] エラー 2
```
VuexのMutationとActionの切り分け

Vuexを勉強してたらMutationとActionで処理の切り分けをどうしようか、というところで悩んだので自分なりの考えを書きます。

# MutationとActionの違い
そもそもMutationは同期処理でなければならなず、Actionは非同期処理も可能という違いがあります。
これは、Mutationで複数の状態の変更が非同期に行われた場合に挙動が予測不能になるのを防ぐという意図があるようです。
Actionでは、Mutationに対してcommitを行うことで間接的に状態を変更しますが、Actionを呼び出すためのdispatchメソッドはPromiseを返すため、処理の順序を制御することが可能になります。

# 同期処理はどっちに書く？
非同期処理はActionに書かなければないですが、同期処理はどちらに書くべきか？
ここで、Actionに渡されたtextが"Yes"ならcount+1、"No"ならcount-1、それ以外はそのままというStateについて考えてみます。

```js
new Vuex.Store({
    state: {
        count: 0
    },
    mutations: {
        plus (state, num) {
            state.count += num;
        },
    },
    actions: {
        vote (context, text) {
            if (text === 'Yes') {
                context.commit('plus', 1);
            } else if (text === 'No') {
                context.commit('plus', -1);
            }
        },
    },
}
```

このように、MutationはStateの変更にとどめておき、Actionで処理を行うというようにしたほうが各処理の責務が明確になっていい気がする。
(そもそも、文字列の条件分岐はComponentのほうでやったほうがいいんじゃないの、というのは置いといて)

でも、その変更処理がstateの状態に依存する変更ならMutationで処理を行いたい。
例えば、0～9までカウントアップして、9の次はまた0に戻るような処理を書く場合。

```js
new Vuex.Store({
    state: {
        count: 0
    },
    mutations: {
        countup (state, num) {
            state.count = (state.count + num) % 10;
        },
    },
    actions: {
        increment (context) {
            context.commit('countup', 1);
        },
    },
}
```
できるだけ、stateを直接参照するのもMutationの内側に閉じ込めてしまいたい。


# Componentから直接commit
Vuexでは公式でComponentからMutationを直接commitすることを許可しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/115996/d57ac617-0853-0459-d0c6-6fc14d2778e2.png)
ただ、この図にはComponentから直接commitするルートがないんですよね。
もともとはたぶん図のほうで、Componentからの操作はActionに限定させたいという思想があったのだと思います。
ただ、それだと単純な状態の操作を作るときにコードが冗長になる(commitするだけのActionが乱立する)ので、これが許可されたのではないかと思います。
なので、できるだけAction経由で呼び出したほうがいいのではないかと思います。

# mutation-types.js
Componentに対して公開するのをActionに限定するという考えを進めていくと、mutation-types.js(Mutationのタイプを定数化して外出しにするためのjs)は、action-types.jsにしたほうがよいのではないかと思えてきます。
もちろん、commitもdispatchも文字列で呼び出すことからMutationのタイプも定数で定義したほうがいいと思いますが、外に出すのはActionのほうではないかと。

# 結論
あくまで個人的な意見ですが

- Mutationは状態の変更のみを行う(privateな(Actionだけから呼ばれる)セッター)
- Actionは処理の公開や複雑な処理を行う(publicなメソッド)

というイメージです。
どうもJavaの考えに引きずられてる感じはありますね。

# 参考
[Vuex 公式](https://vuex.vuejs.org/ja/)
SRE本まとめ（11章 オンコール対応）

自分の理解を深めるためにまとめてみました。[10章](https://qiita.com/bassbone/items/96369d819000eb8ea01d)の続きです。

## 11章 オンコール対応

### イントロダクション
オンコール対応はサービスを安定運用させるために必要であり、SREチームもオンコール対応を行う。しかし、SREチームが異なるのは、問題に対するアプローチにおいてエンジニアリングの活用に非常に重きをおいていることである。オンコールエンジニアはユーザとの取り決めで要求が厳しい場合は5分以内、通常であれば30分以内に対応することが求められている。（サービスの可用性と大きな関係性がある。）多くのチームはプライマリ＆セカンダリの体制でやっている。

### バランス
量はオンコール相当に費やす時間の割合、質はオンコールシフト中に生じたインシデント数で計算される。マネージャーは量と質の観点で持続可能な状態を保つ責任を持つ。時間としては全体の25％以下になるようにすべき。チームとしては少人数でマルチサイト対応にできればベター。夜間シフトの観点とエンジニアが本番環境に接点を持たせる観点から。過去の経験から1つの障害の対応に要する時間は6時間のため12時間シフトの場合は1回のシフトで2件までであり、その中におさまるようにコントロールすべき。忘れがちだが、時間外のサポートに対する報酬もきちんとすべき。障害に直面したときは理性的かつ集中して慎重な認識のもとに対応しないといけない。経験則から直感的に対処しがちであるが誤った判断をしてしまう恐れがある。インシデントが発生した際には振り返りも重要であり、再発しないようにする。オンコールエンジニアの過負荷を避けるためには、インシデントに対するアラートを極力1：1に調整したり、アプリ開発者と連携してアプリケーションの品質をコントロールしたり、場合によってはオンコール対応をアプリ開発者に任せるという策もある。逆に低負荷であることも問題であり、稀に発生するオンコールに対処できなくなってしまうため、障害訓練などのトレーニングを意図的に行う必要がある。

（[12章](https://qiita.com/bassbone/items/3ed4fe9aba370e8a439c)に続く）
jsdoでMK-80 その7

#概要
jsdoでMK-80やってみた。
アセンブルして、メモリーへロードするまで、自動化した。
サイコロやってみた。乱数のアルゴリズムを変更した。

#サンプルコード
求めておいた乱数をテーブルから、引くようにした。

```
keyinput　   EQU　0216H
showsegdata  EQU  01C0H
led0         EQU  83F4H  
led3         EQU  83F7H
ORG 8200H

start:
    mvi a, 00h
    sta led0

start1:
    lda point
    inr a
    cpi 0fh
    jnc  jmp
start2:    
    sta point
    mvi b, 00h
    mov c, a
    lxi H, table
    dad b
    mov a, M
    sta led3
    call showsegdata
    call keyinput
    jmp start1
jmp:
    mvi a, 00h
    jmp start2
    
table:
    db 1, 3, 3, 5
    db 4, 2, 6, 4
    db 2, 1, 3, 6
    db 2, 6, 3, 3
point:
    db 2
```

#成果物

http://jsdo.it/ohisama1/2iYX

#使い方
run click
run2 click
8 2 0 0 adrset
run

以上
GPSカー　シュミレータ その6

#概要
GPSで自動走行する、コンテストがある。
実機を借りて、アプリから操作する部門がある。
実機は無いので、シュミレータを作ってみた。
大会要項が変更になったため、対応した。
androidアプリの方をリリースした。配布します。

#写真

![log.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/f4c0bb99-e19f-664b-5767-f78be66b327a.jpeg)


#実行環境
android 4.2.2

#配布物
[play](https://play.google.com/store/apps/details?id=com.ohisamallc.ohiapp145&hl=ja)

以上
round-robin に誤認識された bond0 を active-backup に修正する

## 現象

/etc/network/interfaces に `bond_mode active-backup` と正しく記述しても
なぜか`round-robin`になる問題に遭遇した。

> Oct  6 06:29:01.273 JST: %SW_MATM-4-MACFLAP_NOTIF: Host xxxx.xxxx.xxxx in vlan 99 is flapping between port Ge1/0/9 and port Po1

L3SWにて上記メッセージが「約10分に1回」出力されている。

```
grep ^Bonding /proc/net/bonding/bond?
```

* kernel 4.4.44-1-pve (proxmox4) だと発生しなかった。
* kernel 4.10.17-3-pve (proxmox5:最新)で発生。

```rb:/etc/network/interfaces抜粋
auto bond0
iface bond0 inet manual
	slaves eth0 eth1
	bond_miimon 100
	bond_mode active-backup
```

* [Multiple NIC issue. | Proxmox Support Forum](https://forum.proxmox.com/threads/multiple-nic-issue.34953/)

## 参考

* [bonding: Sysfs Support [LWN.net]](https://lwn.net/Articles/142330/)
* [How to manage linux bonding without ifenslave using sysfs - Backdrift Backdrift](https://backdrift.org/manage-linux-bonding-without-ifenslave-using-sysfs)

## 対応

```sh:/root/fix_bonding_mode.sh
#!/bin/sh

# round-robin に誤認識された bond0 を active-backup に修正する
grep "round-robin" /proc/net/bonding/bond0 > /dev/null
if [ $? -eq 0 ];then
        /sbin/ifdown bond0
        echo "active-backup" > /sys/class/net/bond0/bonding/mode
        /sbin/ifup bond0
fi
```

```sh:crontab
@reboot sh /root/fix_bonding_mode.sh
```

なお `/sbin/ifconfig bond0 down` だと  `/sys/class/net/bond0/bonding/mode`に書き込めないため `ifdown` を使うこと。
UNETでプレイヤー以外のオブジェクトにCommand権限を持たせる

UNETで通信するゲームを作る際に、プレイヤー以外のオブジェクトでCommand関数を実行しようとした時に、`Trying to send command for object without authority.`と出たときの解決法。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125635/c8d5a642-0168-b2cd-5b9d-50f83f92070b.png)


### 結論
結論からいうとプレイヤー以外のオブジェクトの権限を持たせるためには、`NetworkServer.SpawnWithClientAuthority`を使って権限と共にSpawnさせる必要があります。

### 手順
1. 権限を持たせたいオブジェクトのプレハブにNetworkIdentityをアタッチし、LocalPlayerAuthorityにチェックを入れる
2. そのプレハブをNetworkManagerのSpawnable Prefabに登録する。
3. 権限をもったオブジェクトのコンポーネントから先ほどのプレハブをSpawnさせる。たとえばPlayerオブジェクトがWeaponManagerというコンポーネントを持っていたとすれば、下記のスクリプトで権限を持った武器オブジェクトを生成することができます。

  ``` csharp
  using UnityEngine;
  using UnityEngine.Networking;

  public class PlayerInventoryManager : NetworkBehaviour
  {
    [SerializeField] private GameObject weaponPrefab;
    
    void Start()
    {
      CmdSpawnWeapon();
    }
  
    [Command]
    void CmdSpawnWeapon()
    {
        var go = Instantiate(weaponPrefab, transform.position, Quaternion.identity);
        NetworkServer.SpawnWithClientAuthority(go, connectionToClient);
    }
  }
  ```

### 権限を持たせられないやり方
- NetworkIdentityのLocalPlayerAuthorityにチェックを入れたオブジェクトを最初からシーンに配置する
- 普通にSpawnする（サーバー側だと権限があるが、クラアント側だと権限がない）

`NetworkIdentity.AssignClientAuthority`を使えば他のやり方でオブジェクトに権限を持たせることができるのかもしれません
kerasでOne-hotのラベルを作成する

# はじめに
kerasで分類を行う際，教師ラベルはOne-hotベクトル(1-of-k表現)にしなければならないので，簡単にOne-hotベクトルを作成する方法を備忘録としてまとめます．

# One-hot
1つだけHigh(1)で他はLow(0)で表現されるビット列のこと．([Wikipedia](https://ja.wikipedia.org/wiki/One-hot))
例) 2を3次元のOne-hotで表現する場合は(0, 0, 1)となる．

# 作り方
## 環境
- Python 3.6.0 :: Anaconda custom (64-bit)
- keras 2.0.4 (backend: Tensorflow)
- Tensorflow 1.1.0

## コード
```python
import numpy as np
from keras.utils import np_utils
# Using TensorFlow backend.

y = np.array([0, 1, 0, 2, 0, 1, 0, 2])  # 元のラベル
# array([0, 1, 0, 2, 0, 1, 0, 2])

one_hot_y = np_utils.to_categorical(y)  # One-hotにしたラベル
# array([[ 1.,  0.,  0.],
#        [ 0.,  1.,  0.],
#        [ 1.,  0.,  0.],
#        [ 0.,  0.,  1.],
#        [ 1.,  0.,  0.],
#        [ 0.,  1.,  0.],
#        [ 1.,  0.,  0.],
#        [ 0.,  0.,  1.]])

```
以上です．
最大値に合わせてその次元数のOne-hotを作成してくれるのがいいですね．


# おわりに
- 一行で済むので楽ですね．
- 今後も自分の備忘録的なものになっていきそうな予感…．