OmniAICreator/Qiita-1.07M huggingface dataset:
array_searchを条件式に使うときは、型に注意する

「あるディレクトリ内のファイル名を配列に入れ、指定のファイル名が存在しなければそのファイルを作成」
みたいなことをやっていた。

そのファイル名の存在判定にarray_searchを用いたが、当初意図していた通りに動いてくれなかったので、メモがてら投稿。

## そもそもarray_searchとは
公式より
http://php.net/manual/ja/function.array-search.php

> array_search — 指定した値を配列で検索し、見つかった場合に対応する最初のキーを返す
>
> mixed array_search ( mixed \$needle , array \$haystack [, bool \$strict = false ] )
>
> haystack において needle を検索します。

## 例
```php:ramen1.php
<?php
$ramen = ['shoyu', 'miso', 'tonkotsu'];

// 2が返る
echo array_search('tonkotsu', $ramen);
```

## if文の条件で使うときは注意が必要
```php:ramen2.php
<?php
$ramen = ['shoyu', 'miso', 'tonkotsu'];

if (array_search('tonkotsu', $ramen)) {
    echo 'yoshimuraya ';
}

if (array_search('shoyu', $ramen)) {
    echo 'tsuta ';
}

if (array_search('shio', $ramen)) {
    echo 'kaijin ';
}
```
`yoshimuraya tsuta `と出てきてほしいところだが、

```:出力結果
yoshimuraya 
```
これは`array_search('shoyu', $ramen) = 0`が`false`と同様の判定をされるため。

正しい結果を得るためにはこうする。

```php:ramen2_1.php
<?php
$ramen = ['shoyu', 'miso', 'tonkotsu'];

if (array_search('tonkotsu', $ramen) !== false) {
    echo 'yoshimuraya ';
}

if (array_search('shoyu', $ramen) !== false) {
    echo 'tsuta ';
}

if (array_search('shio', $ramen) !== false) {
    echo 'kaijin ';
}
```
```:出力結果
yoshimuraya tsuta 
```

## まとめ
array_searchをif文の条件として用いる際は、面倒くさがらずに型判定すべきでした。
…気をつけよう。
Octave > (x.^2)の"." > ないとエラー > error: for A^b, A must be a square matrix. Use .^ for elementwise power.

```txt:動作環境
ideone > Octave (octave 4.0.3)
```


https://github.com/gradywright/spherepts/blob/master/code/getIcosNodes.m
にあるコード（下記）の"."はどういう意味なのか。

```matlab
x_l2=sqrt(sum(x.^2,2));
```

ideoneで試した。

https://ideone.com/H01Mnb

```matlab
x = [ 1 2 3 ];
(x.^2)
(x^2)
```

```txt:stderr
error: for A^b, A must be a square matrix. Use .^ for elementwise power.
```

ドットがないとエラーになるようだ。
React Native で "TransformError Couldn't find preset ..." で怒られるときの対処法

# 症状

`react-native start` でサーバを立ち上げると， `node_modules` 配下に含まれているライブラリが依存しているBabelのプリセットが反応して

```
TransformError Couldn't find preset "es2015"
```

```
TransformError Couldn't find preset "airbnb"
```

などとエラーになってしまう問題。

<h3>（備考） <code>.babelrc</code> の動作</h3>
親ディレクトリの `.babelrc` の設定を子の `.babelrc` で上書きし，最終的に生成された設定で子ディレクトリ内のトランスパイルを行う。

# 原因

npm と， React Native の方針の違いに起因する。

## npm の方針

ホスティングされるパッケージはすべて CommonJS と ES5 までの実装で動作するようにトランスパイル済みであることを想定している。つまり，そもそも

**「`node_modules`以下はトランスパイル対象にならない」**

ということを前提としている。ゆえに，公開されるパッケージが `.babelrc` を含んでいても，普通のプロジェクトではそのディレクトリがトランスパイル対象から除外されるため，トランスパイラに影響を及ぼすことは無い。

## React Native の方針

通常の JavaScript コードをネイティブコードに変換する必要があるため， `babel-preset-react-native` を用いて

**「`node_modules`以下もトランスパイル対象にする」**

という方針を採る。そのため， 依存パッケージがもし `.babelrc` を含んでいる場合，それに使用されているプリセットをすべて必要としてしまう。

# 対処法

## パッケージインストール後に `node_modules` 下の `.babelrc` をすべて削除する

現状これが最善の解決策。npm scripts に以下の設定を追記。

```json:package.json&#32;の例
{
  "scripts": {
    "clean-underlying-babelrc": "(find node_modules -type f -name .babelrc | grep -v /react-native/ | xargs rm) || true",
    "post-install": "npm run clean-underlying-babelrc",
  }
}
```

## ライブラリ作者に `.babelrc` を `.npmignore` の設定で除外するように求める

この対応をライブラリ作者全員がとってくれれば最善ではあるが，React Native 固有の事情であるため，拒否される場合もあるだろう。

```:.npmignore&#32;の例
/.*
/*
!/src/
!/es/
!/lib/
```

## 必要ないプリセットもすべてプロジェクトの `.babelrc` で記述する

一応動作はするが，新しく追加するパッケージがあるたびに，新しいプリセットに依存していないかどうかを確認する必要があるため，安定した解決策とは言えない。それに，なんとなく負けた気分…

```json:絶対にやりたくない
{
  "preset": ["react-native", "es2015", "stage-0", "stage-1", "stage-2", "stage-3", "stage-4", "env", "airbnb"]
}
```

# その他

React Native プロジェクトはデフォルトで `babel-preset-react-native` を使用するため，自分で `.babelrc` を置かなくてもトランスパイル可能であるが，**ホームディレクトリに `.babelrc` がある場合はそれを読んでしまう**ため，結局置いておくほうが無難。上に述べた対策を実施しつつ，

```json
{
  "preset": ["react-native"]
}
```

を書いておく。実際 ES.Next の使用をふんだんに使おうとすると

```json
{
  "preset": ["react-native", "env"]
}
```

というように， `babel-preset-env` などを追加せざるを得ない。
ImageMagick で１ページのみの pdf を分割した場合に、分割したファイル名を filename-0.png のようにする方法

# ImageMagick 7 で pdf を分割して画像にする
originalFilePath.pdf というファイルを解像度144dpi、一辺1000pxで画像化したい場合、以下のようなコマンドになります。

```
convert -density 144 -geometry 1000x -alpha Remove originalFilePath.pdf framedFilePath.png
```
* originalFilePath.pdf が複数ページの場合
    * framedFilePath-0.png, framedFilePath-1.png, framedFilePath-2.png... といったように、ファイル名の末尾に0から始まる連番が勝手に付与されます
* originalFilePath.pdf が単一ページの場合
    * framedFilePath.png というファイル名で出力されます
    * framedFilePath-0.png というファイル名で出力してくれない

# ImageMagick 7 で pdf を分割し、ページ数によらず必ず filename-x.png というファイル名で出力する
* -scene オプションというものを使います。
  * [document](https://www.imagemagick.org/script/command-line-options.php#scene)
  * 連番の最初の値を指定するオプション
* 実際のコマンドは以下

```
convert -density 144 -geometry 1000x -alpha Remove originalFilePath.pdf framedFilePath-%d.png
```

* これによって、ページ数によらず、ファイル名のフォーマットが統一されるので、後々参照しやすくなります
Octave > デバッグ出力 > 変数名を書けばいい

```txt:動作環境
ideone > Octave (octave 4.0.3)
```

変数の中身を表示するには。

https://www.gnu.org/software/octave/doc/v4.0.3/Terminal-Output.html
> Since Octave normally prints the value of an expression as soon as it has been evaluated, the simplest of all I/O functions is a simple expression.

https://ideone.com/Ar4H1t

```matlab
x = [ 1 2 3 ];
x
```

```txt:run
Success	#stdin #stdout #stderr 0.23s 405568KB
x =

   1   2   3


```
onlineTool > MATLAB > Execute MATLAB/Octave Online | ideone

MATLABのコードをnumpyなどに移植するにはMATLABを知らないといけない。

実行環境としてオンラインのものを探してみた。

### codingground

https://www.tutorialspoint.com/execute_matlab_online.php

### ideone
(追記 2017/11/11 MATLABにありOctaveにない関数なども有る。 [link > Numerical instructions in Matlab (M), Octave (O) or both ones  > 関数有無の比較](https://qiita.com/7of9/items/c884e727bf7ec7dc983b))


MATLABとOctaveのコードは互換性があるのだろうか?

そうだとするとideoneでOctaveを選択してもいいのかもしれない。

https://ideone.com/

codinggroundのコードを試した。
https://ideone.com/AZEUml

### 備考

MathWorksのMATLAB Onlineはライセンスが必要。
rails5でreact-rails(use asset pipeline)でhallo worldまで

初めてrails+reactを触るので、インストールしてみるも少しハマったのでメモ
[react-rails#use-with-asset-pipeline](https://github.com/reactjs/react-rails#use-with-asset-pipeline) にちゃんと載ってます。

# 参考にさせていただきました。感謝
 - https://github.com/reactjs/react-rails
 - [react-railsを使ってReactのTutorialをやってみる](https://qiita.com/joe-re/items/96f12dda4a62470d1d7c)

# gem install

```rb
# config/routes.rb
gem 'react-rails'
```

`bundle install`

# react install
`rails g react:install`

# react componentの生成(Topのところはなんでもいい)
`rails g react:component Top`

## 中身書き換え

- before

```js
// app/assets/javascripts/components/top.js.jsx
var Top = createReactClass({
  render: function() {
    return <div />;
  }
});
```

- after

```ts
// app/assets/javascripts/components/top.js.jsx
class Top extends React.Component {
  render() {
    return <h1>{this.props.title}</h1>
  }
}
```

# controllerの作成
`rails g controller top index`

## 中身書き換え

- before

```html+erb
<!-- app/views/top/index.html.erb -->
<h1>Top#index</h1>
<p>Find me in app/views/top/index.html.erb</p>
```

- after

```html+erb
<!-- app/views/top/index.html.erb -->
<%= react_component("Top", {title: "Hello World"}) %>
```

# routes書き換え

```rb
Rails.application.routes.draw do
  root 'top#index'

  get 'top/index'

  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```

# environments書き換え(やらなくても動く)

この辺の話 -> [react-rails#reactjs-versions](https://github.com/reactjs/react-rails#reactjs-versions)

```rb
# config/environments/development.rb
MyApp::Application.configure do
  config.react.variant = :development
end

# config/environments/production.rb
MyApp::Application.configure do
  config.react.variant = :production
end
```

# やっとこさ起動
`rails s`

http://localhost:3000

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147882/1f8a1be7-3755-2f31-99df-a82309d0f0f9.png)
Toolbarのタイトルのセット方法について

setSupportActionBarについてちょっとハマったのでメモします
動的にタイトルを変えたいときに以下だと反映できません。

NG

```kotlin:onCreate内
setSupportActionBar(toolbar)
toolbar.setTitle("test")
```

ただ以下だと大丈夫です。

OK

```kotlin:onCreate内
toolbar.setTitle("test")
setSupportActionBar(toolbar)
```

OK

```kotlin:onCreate内
setSupportActionBar(toolbar)
supportActionBar?.setTitle("test")
```

# なぜ？
setSupportActionBar()でToolbarWidgetWrapperがnewされます。
そのタイミングで以下のように**タイトルがあればmTitleSetがtrueになります。
あとからセットするため、最初はmTitleSetはfalseになります。このフラグが後から効いてきます。**

```java:ToolbarWidgetWrapper.java
    public ToolbarWidgetWrapper(Toolbar toolbar, boolean style,
            int defaultNavigationContentDescription, int defaultNavigationIcon) {
        mToolbar = toolbar;
        mTitle = toolbar.getTitle();
...
        mTitleSet = mTitle != null;
```

setSupportActionBar()を呼んだ後、onCreate内でtoolbarにタイトルをセットしていたとしても`Activity#onPostCreate()`から呼ばれる一連の流れで、toolbarのsetTitle()が呼ばれます。

〜一連の流れ〜

```java:Activity.java
    @CallSuper
    protected void onPostCreate(@Nullable Bundle savedInstanceState) {
        if (!isChild()) {
            mTitleReady = true;
            onTitleChanged(getTitle(), getTitleColor());
        }
        mCalled = true;
    }
```

```java:AppCompatActivity.java
    @Override
    protected void onTitleChanged(CharSequence title, int color) {
        super.onTitleChanged(title, color);
        getDelegate().setTitle(title);
    }
```

```java:AppCompatDelegateImplV9.java
    @Override
    void onTitleChanged(CharSequence title) {
        ...
            peekSupportActionBar().setWindowTitle(title);
        ...
    }
```

ToobarWidgetWrapperで **mTitleSetがfalseであればtoolbarへActivityのタイトルのセットがされます。**

ToolbarのsetTitleではなく**ToobarWidgetWrapper**のsetTitleを呼ぶことで、mTitleSetがtrueになるので、これを阻止できます。つまり`getSupportActionBar().setTitle("test")`であれば阻止できます。

```java:ToobarWidgetWrapper.java
    @Override
    public void setWindowTitle(CharSequence title) {
        // "Real" title always trumps window title.
        if (!mTitleSet) {
            setTitleInt(title);
        }
    }

...
    @Override
    public void setTitle(CharSequence title) {
        mTitleSet = true;
        setTitleInt(title);
    }

    private void setTitleInt(CharSequence title) {
        mTitle = title;
        if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) {
            mToolbar.setTitle(title);
        }
    }
```
Vagrant 2.0.1でUbuntu 16.04を使う

[Vagrant 1.9系の頃](https://qiita.com/it__ssei/items/40f74d0a60e30754ba6d)からガラッと変わってたので、必要最低限をメモしておく。

# 前提
virtual boxインストール済み(5.2.0)
vagrantインストール済み(2.0.1)
sshが使える(Windowsなら[PowerShellチームのOpenSSH](https://github.com/PowerShell/Win32-OpenSSH/releases)あたりをどうぞ)

# UbuntuのVM作成
```shell-session
vagrant init ubuntu/xenial64
vagrant up
```

試した際、特にエラーは出なかった。

# 参考
https://app.vagrantup.com/ubuntu/boxes/xenial64
InfluxDB 1.3.7 のデータを Chronograf で描画してみた

## きっかけ

InfluxDBのWebUIに http://localhost:8083 でアクセスできない。
InfluxDB 1.3 から WebUIがなくなり 代わりに Chronograf を使ってねとのこと。 

参考: [why InfluxDB web admin interface doesn't work with 1.1 release? - Stack Overflow](https://stackoverflow.com/questions/40892363/why-influxdb-web-admin-interface-doesnt-work-with-1-1-release)


## downloadページ

![スクリーンショット_2017-11-08_11-23-02.png](https://qiita-image-store.s3.amazonaws.com/0/25728/115c1a05-c607-72f1-26d0-44d29e795f98.png)

[download](https://portal.influxdata.com/downloads)ページに4つツールが見えるが、InfluxDBとChronografを今回使うこととする。

## 起動

* 参考: [TICK-docker/docker-compose.yml at master · influxdata/TICK-docker](https://github.com/influxdata/TICK-docker/blob/master/0.12/docker-compose.yml)

```rb:docker-compose.yml
influxdb:
  image: influxdb:alpine
  ports:
    - "8086:8086"
  volumes:
    - ./data:/var/lib/influxdb
    - ./influxdb.conf:/etc/influxdb/influxdb.conf

chronograf:
  image: chronograf:alpine
  ports:
    - "8888:8888"
  links:
    - influxdb
```

```sh:起動
docker-compose up -d
```

## データーを追加してみる

```sh:
# mydb というデーターベースを作成
curl -X POST 'http://localhost:8086/query' -d \
 'q=CREATE DATABASE mydb'

# mydb の cpu_load_short テーブルに値をINSERT

curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary \
 'cpu_load_short,host=server01,region=us-west value=0.64 1510107624000000000'

curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary \
 'cpu_load_short,host=server01,region=us-west value=0.34 1510108511000000000'


# 値が入ったことをSELECTで確認
curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode \
 "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
```

* [InfluxData | Documentation | Querying Data with the HTTP API](https://docs.influxdata.com/influxdb/v1.3/guides/querying_data/)
* [InfluxData | Documentation | Writing Data with the HTTP API](https://docs.influxdata.com/influxdb/v1.3/guides/writing_data/)


## Chronograf にアクセス

* http://localhost:8888 にアクセス。そのまま`Add Source`を押下。
    * 他の端末からアクセスした場合は、URLのlocalhostを適宜修正。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/467296b5-5d57-01ee-35a7-36748acf9d6c.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8a4412f8-b14d-6a09-501d-ac17f38bad48.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b3a1969a-4d78-bbb4-31a4-cbe779ada835.png)
諸事情でパイプが入力できないときに、パイプを使う方法

# ソースコード
```
#!/bin/sh
: <<__For_copy
|
\
_
@
'
"
&
`
__For_copy

set -u
${1} | ${2}
```

# 使い方
'''
sh pype.sh '実行したいコマンド' 'パイプ実行したいコマンド'
'''

# アドバイス
本当はパイプを入力できるようにするのが好ましいのですが、面倒なことが往々にしてあると思います。
とりあえず入力に困りそうなキーをForCopyの中に入れておくと何気に助かります。

使うときは、自前のサーバーなどでSAMBAを使うなり、Wgetなどで取得できるようにしておくと組織でも簡単に共有できます。

複数のパイプに対応したい場合は、

```
${1} | ${2} | ${3} ...
```

のように引数を増やすと使えます。
&&や||もこれで作れるので、やりたいように作り変えてください。

# キーボード変更について
英語キーボードを使っているなら

```
sudo loadkeys us
```

# 感謝
http://d.hatena.ne.jp/matoken/20090905/1252164012
SmartGit > Compact Change Display > 変更のあった行近辺だけの表示

```
Windows 7 Pro (64bit)
SmartGit 17.1.1 #11182
```

SmartGitのバージョンが17.1.1になり、新機能としてCompact Change Displayが追加された。

http://www.syntevo.com/smartgit/whatsnew
(備考: 上記のリンクは数ヵ月後には内容が変わっているだろう。情報の継続保持という点から、whatsnewというページに情報を掲載するのはお薦めではない）。

### 機能について

差分を表示するときに以下の選択をできるとのこと。

- 全部の行を表示する (Compact Change Display: OFF)
- 変更点近傍の行だけを表示する (Compact Change Display: ON)


### 使用について

Compact Change Displayをどこで設定できるか分かりにくかった。

https://smartgit.userecho.com/forums/1-general/topics/104-allow-to-collapse-unchanged-blocks-of-code-in-diff-view/
によると

> Christopher Kline 4 months ago
> Found it -- "Compact Change Display" in the Changes menu, starting in version 17.1 preview 10.

「Log for .」ウィンドウにおいてChangesメニュー以下に選択できるようになっていた。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/908e9377-1142-5149-de1c-7ff5b349c055.png)
 
「File Compare」ウィンドウは編集可能のため、Compact Change Displayの設定はできないとのこと。
この点がUIとして分かりにくかった。
SConsからのVisualStudioビルドで管理者権限を要求させる方法

## 前提条件

* Python3.6
* SCons-3.0.0
* VisualStudio2015

## やり方

SConsからVisualStudioビルドする際に権限昇格を必須にするには下記のように `/MANIFESTUAC` を指定します。

```Python:SConstruct
env = Environment()
env.Append(
    LINKFLAGS = [
        '/MANIFEST:embed',
        "/MANIFESTUAC:level='requireAdministrator' uiAccess='false'",
        ],
    )
env.Default(env.Command(None, env.Program('main.cpp'), '$SOURCE.abspath'))
```

これで `scons` を実行すれば権限昇格ダイアログがポップアップします。

`/MANIFESTUAC` の記述はそのままマニフェストファイルのXMLアトリビュートとして展開されるようで、
空白やシングルクオートが入っていないとコンパイルは成功するもののダイアログが出なくてハマりました。

どんな風に記述されているかは、`/MANIFEST:embed` を `/MANIFEST` に変えることで main.exe.manifest が出力されるので
そちらで確認してください。ちなみに `/MANIFEST` を入れ忘れると `/MANIFESTUAC` も無視されるので注意してください（これもハマった）

## 参考
- [/MANIFESTUAC (UAC 情報をマニフェストに組み込む)](https://msdn.microsoft.com/ja-jp/library/bb384691.aspx?f=255&MSPPError=-2147217396)
SQLNET.AUTHENTICATION_SERVICESをnoneに設定してOS認証を無効化してみる(Oracle Database)

sqlnet.ora の SQLNET.AUTHENTICATION_SERVICES を none に
セットすると、OS認証を無効化することができるんやで彡(ﾟ)(ﾟ)

さっそくやってみます。

# 設定前(デフォルト)

```sql
$ id -a
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba)
$ cat $ORACLE_HOME/network/admin/sqlnet.ora
★sqlnet.oraが無い
cat: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/sqlnet.ora: No such file or directory
$ sqlplus /nolog

SQL*Plus: Release 12.1.0.2.0 Production on Wed Nov 8 10:53:41 2017

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

SQL> CONNECT /AS SYSDBA
Connected. ★OS認証でログインできる。
```

# 設定後(SQLNET.AUTHENTICATION_SERVICESをnoneにセット)

```sql
$ id -a
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba)
$ cat $ORACLE_HOME/network/admin/sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES=(none)
$ sqlplus /nolog

SQL*Plus: Release 12.1.0.2.0 Production on Wed Nov 8 10:59:17 2017

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

SQL> CONNECT /AS SYSDBA
ERROR: ★OS認証ではログインできない。
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。


SQL> CONNECT SYS/xxxxxxxx AS SYSDBA ★
Connected. ★パスワード認証ではログインできる。
```
OS認証ではログインできなくなったやで彡(^)(^)

# マニュアル
マニュアルは下記、AUTHENTICATION_SERVICESのデフォルト値はallなんやで彡(ﾟ)(ﾟ)

> Oracle Database Net Servicesリファレンス 12cリリース1 (12.1) B71289-04
> 5 sqlnet.oraファイルのパラメータ
> SQLNET.AUTHENTICATION_SERVICES
> https://docs.oracle.com/cd/E57425_01/121/NETRF/sqlnet.htm#BIIDAFFD
Ubuntu に最新のNode.jsをインストールしてみた。

Qiita の下記投稿「Ubuntuに最新のNode.jsを難なくインストールする」を参考にやってみました。環境は Ubuntu 16.04LTS です。

リンク
[Ubuntuに最新のNode.jsを難なくインストールする](https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)

この投稿で最初の手順
>sudo apt-get install -y nodejs npm

は古いNode.jsがすでに入っていたので省略しました。よって「n package を導入」からです。
>sudo npm cache clean
>sudo npm install n -g

これは問題なし。次の手順「最後に n package を使って node をインストール」です。
  >sudo n stable
  >sudo ln -sf /usr/local/bin/node /usr/bin/node

ここで、n stable は安定版（この時点では8.9.0LTS)になるかと思っていましたが、9.0.0がインストールされました。n コマンドで具体的なバージョン番号を指定したほうがよさそうです。（自分は9.0.0でもかまわなったので、やってませんが）

ln -sf /usr/local/bin/node /usr/bin/node ですが、Node.js のインストール先は、/usr/local/bin/node にはならず、自分の場合は /usr/local/n/versions/node/9.0.0 になっていました。

よって、このコマンドをそのまま実行しても機能しませんでした。

さらに、nodejs というのが node コマンドの別名になっていていました。（自分の環境だけかもしれませんが）

最後の古いNode.js を削除する手順を行わないと、古いバージョンと新しいバージョンがバッティングするので必ず行ったほうがよさそうです。
>sudo apt-get purge -y nodejs npm

この後に、３つのシンボリックリンク /usr/bin/node, /usr/local/bin/node, /usr/bin/nodejs を
>/usr/local/n/versions/node/9.0.0/bin/node

に変更しました。これでどれが使われても安心です。
`
user@ubuntu:~$ node -v
v9.0.0
`
特定ファイルにある文字列が含まれてる時のコミットハッシュを調べる

よく分からないけどコンフリクトの解消に失敗したかなにかでデグレてしまった。
コミットログもあんまり当てにならなく、「そういえばxxxって書いたはずだよな〜」とかいう頭の片隅でかろうじて残ってる記憶から探す。

## 結果

```bash
git log -n 20 --pretty=%H <filename> | \
  xargs -I@ sh -c '\
    git --no-pager show @ <filename> | \
    grep {ある文字列} > /dev/null && echo @ \
  '
# d5eac88c920e2b70299242a7f05a1aa6cbb88773
# 7cdba476c3a1e1e23f40e9681495ae10b6540c12
# 0a11d08b974720091336f42e273251aacceaf734
```

## メモ

- `--pretty=%H`とすることで表示をハッシュだけにできる
- `xargs`でパイプとか使いたい場合は、`sh -c`を使う
- `git --no-pager`を使うと`cat`みたいな感じで表示できる（デフォルトが`less`みたいな時）
freetds + SQLServer で絵文字をSELECT, INSERTする

# 今回起こった現象について
こんな現象が起こったので、
・nvarcharのカラムに対して絵文字をINSERTするとエラーが出てないのにデータは登録されない。
・テーブルに登録済みの絵文字データをSELECTで取得してPHPで出力すると、??と表示され文字化けしてしまう。

# 実行環境

・PHP: 5.6.27
・CentOS: 6.8
・freetds: v0.91
・Microsoft SQL Azure（Azure上で動くSQL Server） 12.0.2000.8

・データベースの照合順序
Japanese_XJIS_100_CI_AI

・テーブル
SQL Serverは下記のテーブル"Comments"にデータ登録、データ取得の操作を実行する。
・ID int PK
・Text nvarchar(1024)

# データを取得する時
カラム"Text"のデータをバイナリデータとして取得する。

```sql
SELECT
 ID,
 CONVERT(varbinary(MAX), Text)
FROM
 Comments
```

次にPHP側で、バイナリデータをUTF-16LE→UTF-8に変換する処理を実行する。

```php
foreach ($result as $row)
{
    // 文字コードを"UTF-16LE"から"UTF-8"の変換
    $text = mb_convert_encoding($row['Text'], 'UTF-8', 'UTF-16LE');
}
```


# データを登録する時
はじめにPHPで文字列をbinary文字列に変換する。
mb_convert_encodingで、UTF-8からUTF-16LEに変換をかけることで、4バイト文字のデータを保持する。

```php
$text = mb_convert_encoding($text, 'UTF-16LE','UTF-8');
$text = bin2hex($text);
$text = '0x' . $text;
```

実際にデータを登録する時は下記のSQLを実行する。
カラム"Text"はvarchar型だけど、varbinaryのデータをINSERTすると

```sql
INSERT
 Comments(ID, Text)
VALUES
　(1, CONVERT(varbinary(MAX), N'{$textのバイナリ文字列}', 1));
```
python3でslackbotの作成(その5:Heroku設定編)

#前回
[その4:send,react編](https://qiita.com/thimi0412/items/1709e2d856dfabcbaf40)
前回はmessageのsendとreactを実装しました。
これで一通りのことはできると思います。
今までは以下のコマンドでbotを起動していました。

```
python3 run.py
```
今回はHerokuを使ってbotの常駐化をして行きましょう。

#Herokuについて
PaaSと呼ばれるサービスでまぁ簡単にいってしまうとサーバとかデータベースとかの諸々の部分をインターネット介して使うことができます。
今回でいうといちいちコマンドライン上でコマンドを打たなくともbotが常に起動してくれるようにします。
[Heroku](https://www.heroku.com/home)
とりあえず上記のサイトでユーザーの登録をしましょう。
※登録手順は省略します。

#Appの新規作成と設定
<img width="182" alt="スクリーンショット 2017-10-31 16.42.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/db34c1ef-9aea-5f1d-617e-a164a4abb4a5.png">
Creat new appを押しましょう。

<img width="647" alt="スクリーンショット 2017-10-31 17.01.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/e9a16860-8717-0ba3-68ea-13ec4a6b31e6.png">
App nameを入力したらCreate appを押しましょう。

アプリケーションの作成ができたので設定をして行きましょう。
Settingsをいじって行きます。
<img width="605" alt="スクリーンショット 2017-11-08 10.19.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/1c6b92cb-f4b5-18f0-4e68-f53e8b1368ee.png">
Buildpacksを追加します今回はpythonを選択してください。

<img width="797" alt="スクリーンショット 2017-11-08 10.22.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/b5765df2-3428-a06a-ec67-e3f1363086e8.png">
Config Variablesでは環境変数の設定を行いますVALUEにはslackで取得したAPI_TOKENをコピペしましょう。

環境変数を設定したいので以下のコマンドで環境変数を設定しましょう。
もちろんAPI TOKENは先ほどConfig Variablesで設定したものと同じです。

```
$ export SLACKBOT_API=<API TOKEN>
```
#今回はここまで
次回はHerokuへデプロイするためのファイルの作成を行い完成を目指します。
BigQuery でランダムサンプリング

備忘録代わりに自分がよく使う BigQuery を利用したランダムサンプリング方法を書いておく。間違ってたら誰かに訂正してもらおうという魂胆。

# 単純なランダムサンプル

発想: 再現可能なランダムな数字を適当に作って並べ替える、あるいは MOD を取る。

## x% サンプリング

```sql
SELECT
  id,
  date
FROM table.YYYYMMDD
WHERE FARM_FINGERPRINT(CONCAT(id, date)) % 100 = 0;
```

## サンプルサイズを固定したサンプリング

```sql
SELECT
  id,
  date,
  FARM_FINGERPRINT(CONCAT(id, date)) hash
FROM table.YYYYMMDD
ORDER BY hash DESC
LIMIT $sample_size;
```

# 重み付けランダムサンプル

発想: [Reservoir sampling](https://en.wikipedia.org/wiki/Reservoir_sampling) を使う。再現可能なランダムな数値を 1 / weight 乗する (rand(0,1)^(1/weight))。 

## サンプルサイズを固定した重み付けサンプリング、復元なし

```sql
SELECT
  id,
  date,
  weight,
  POW(FARM_FINGERPRINT(CONCAT(id, date)) / POW(2, 64),
    1 / weight) AS hash
FROM table.YYYYMMDD
WHERE weight > 0
ORDER BY hash DESC
LIMIT $sample_size;
```

## サンプルサイズを固定した重み付けサンプリング、復元あり

発想: サンプルの対象となるそれぞれの観測要素をサンプルサイズ個複製する。

```sql
WITH numbers AS (
  SELECT * FROM UNNEST(GENERATE_ARRAY(1, $sample_size)) num
)

SELECT
  id,
  num,
  date,
  weight,
  POW(FARM_FINGERPRINT(FORMAT('%s%d%s', id, num, date)) / POW(2, 64),
    1 / weight) AS hash
FROM table.YYYYMMDD table, numbers
WHERE weight > 0
ORDER BY hash
LIMIT $sample_size;
```

以上。
GCP - Cloud VPN Fortigate (Static)

# Cloud VPN 

FortigateとGCP Cloud VPNの接続を検証

・ドキュメント
https://cloud.google.com/compute/docs/vpn/creating-vpns#configuring_firewall_rules
https://cloud.google.com/compute/docs/cloudrouter
https://cloud.google.com/compute/docs/vpn/advanced
https://cloud.google.com/files/CloudVPNGuide-UsingCloudVPNwithFortinetFortiGate300C.pdf


## GCP
### 構成
![alt](https://cloud.google.com/compute/images/vpn/image04.png?hl=ja)
### 設定

- スタティック経路
- IKEv2
- フェーズ1 AES256-SHA256
- フェーズ2 AES265-SHA1
- DH-Group14

## パラメータ

ネットワーク設定情報

|項目|内容|
|:---------|---------:|
|拠点側ネットワークアドレス|10.1.0.0 255255.0.0|
|GCP側ネットワークアドレス|10.100.0.0 255255.0.0|
|拠点側グローバルIPアドレス|xxx.xxx.xxx.xxx|
|GCP側グローバルIPアドレス|xxx.xxx.xxx.xxx|
|IKEバージョン|v2|
|Pre-Shared Key|XXXXXXXXXXXXXX(任意の文字列)|

IKE Phase 1 情報

|項目|内容|
|:---------|---------:|
|Encription|AES-256|
|Authentication|SHA-256|
|DH Group|14|

IKE Phase 2 情報

|項目|内容|
|:---------|---------:|
|Encription|AES-256|
|Authentication|SHA-1|
|DH Group|14|

## Fortigate Config

### IPSEC
```
config vpn ipsec phase1-interface
 edit vpn-<<ID>>-0
   set interface "wan1"
   set ike-version 2
   set dpd enable
   set local-gw <<Local-Global-IP-0>>
   set dhgrp 14
   set proposal aes256-sha256
   set keylife 28800
   set remote-gw <<Remote-Global-IP-0>>
   set psksecret <<Secret-Key-0>>
   set dpd-retryinterval 10
 next
end

config vpn ipsec phase2-interface
 edit "vpn-<<ID>>-0"
  set phase1name "vpn-<<ID>>-0"
  set proposal aes256-sha1
  set dhgrp 14
  set pfs enable
  set keylifeseconds 3600
  set auto-negotiate enable
 next
end
```

### FW 
```
config firewall policy
 edit 100
  set srcintf "vpn-<<ID>>-0"
  set dstintf internal
   set srcaddr all
   set dstaddr all
  set action accept
  set schedule always
   set service ALL
  next
end

config firewall policy
 edit 101
  set srcintf internal
  set dstintf "vpn-<<ID>>-0"
   set srcaddr all
   set dstaddr all
  set action accept
  set schedule always
   set service ALL
  next
end
```

### Static
```
config router static
    edit 1999
        set device "vpn-<<ID>>-0"
        set dst <<GCP-Network-Address>> <<GCP-Network-Subnet>>
    next
end
```
【備忘録】Postgresql ストアドプロシージャ一覧

#作成済みプロシージャ一覧の取得方法。

- psqlにて対象DBに接続
- \df [プロシージャ名]<br> (pg_a* のようにワイルドカード使用可） 
- プロシージャのソースも併せて取得<br> \df+ [プロシージャ名]

### 参考
[postgresqlスキルアップノート](http://dbnote.web.fc2.com/note_func_info.html)
ディレクター・プロジェクトマネジャー・プロダクトマネージャーの違い

自分用のメモ書き

## プロダクトマネージャーとプロジェクトマネジャーの違い

* プロダクトマネージャーは何を作るか、なぜ作るかに責任を持つ
* ユーザー課題の解決
* ビジネスモデル、4P整合性
* 技術的実現性
**プロジェクト自体を企画する人**

* プロジェクトマネジャーはいつまでに作るか、どう作るかに責任を待つ
* 品質
* リリーススケジュール
* 開発コスト
**プロジェクトの実行に責任を持つ人**

http://tannomizuki.hatenablog.com/entry/2015/08/15/092259

* 会社のリソースによっては兼務もあるけど、役割は違うので理想は分けた方が良さそう

## ディレクターとプロジェクトマネジャーの違い
https://liginc.co.jp/347990

* ディレクターとプロジェクトマネジャーはプロジェクトを実行する役割は同じ。責任を持つレイヤーが違う。

* ディレクターはコンセプト策定、ワイヤフレーム作成、クオリティチェックやクライアントとの折衝、詳細スケジュールの作成など具体的タスクになる

* プロジェクトマネジャーは予算管理、ファシリテーション、マイルストーンの管理、契約周りを担当

* プロジェクトマネジャーは社内のリソース調整、ディレクターは具体的なタスクを各エンジニアやデザイナーに依頼する役割
[Apple] macOS High Sierra私的環境設定記録

久しぶりにMacを買いました。
MavericksからHigh Sierraへ、かなーりバージョン飛んでも浦島感が薄いのはさすがです。<ディス>Windowsならこうはいかない</ディス>

これは、新しいMacを使い始める上での私的な環境設定の記録です。
お目汚し失礼します。


# JapaneseIMのデフォルトスペース入力を半角にする

ことえり時代は`defaults`コマンドでできたのですが、今はそういうのないそうですね。

参照 → [macOS Sierraで日本語入力時に常にスペースを半角に](https://qiita.com/on0z/items/a9b4033cc088627b1728)

参照先の情報に従って、plistファイルを変更します。

```xml
--- KeySetting_Default.plist.bak	2017-10-22 12:54:34.000000000 +0900
+++ KeySetting_Default.plist	2017-10-22 13:00:39.000000000 +0900
@@ -11,12 +11,16 @@
 			<key>&apos; &apos;</key>
 			<dict>
 				<key>command</key>
-				<string>contextual_space</string>
+				<string>direct_input</string>
+				<key>character</key>
+				<string> </string>
 			</dict>
 			<key>shift+&apos; &apos;</key>
 			<dict>
 				<key>command</key>
-				<string>contextual_space_reverse</string>
+				<string>direct_input</string>
+				<key>character</key>
+				<string>　</string>
 			</dict>
 			<key>delete:</key>
 			<dict>
```

Xcodeがあれば、Xcodeを使って編集するのが簡単かもしれません。

変更前:
<img width="517" alt="Screen Shot 2017-10-22 at 12.58.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/59475/d49a94a8-b42a-7857-b56a-e770a73e79bf.png">

変更後:
<img width="500" alt="Screen Shot 2017-10-22 at 13.06.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/59475/0d440964-7534-9d48-73dc-d71b5f65f2fc.png">

# システム設定いろいろ

* Display
    * ResolutionをScaledにして画面を広く
* Keyboard
    * キーリピート間隔とリピート待ちを最小に
* Sharing
    * コンピュータ名を変更

他にもやることあったような気がしたのですがなかったです。

   
# Terminalの設定関係

## シェルをzshにする

```shell-session
chsh -s /bin/zsh
```

## 日本語周り

半角全角両方ある文字幅を全角にする -> [Unicode East Asian Ambiguous characters to wide]をオンにする。

## 見た目周り

[Antialias Text]をオンにする


# ソフトウェアのインストール

インストールしたものたちです。

* XCode
* Firefox
* Firefox Developer Edition
* Google Chrome
* Google Chrome Canary
* Dash for macOS

## XCode Developer Tools

コマンドラインツールを入れます。

```shell-session
xcode-select --install
```


# Homebrewのインストール


`~/opt/brew`にインストールしました。

```shell-session
mkdir opt
cd opt
git clone https://github.com/Homebrew/brew.git
```

~/.zprofileにパスを追加します。

```zsh:~/.zprofile
path=(
    ${HOME}/opt/brew/bin(N-/)
    ${path}
)

typeset -U path
```


# Homebrewからインストール

Homebrewからインストールしたものたちです。

* tmux
* cask/java (Oracle Java 9)
* cask/netbeans-java-se (NetBeans Java SE用)
* cask/visual-studio-code (Visual Studio Code)
* mysql
* cask/sequel-pro (Sequel Pro)
* cask/alfred
* php/php70

## Nodeのインストール

```shell-session
brew install nodenv
```

```shell-session
nodenv install 8.8.0
```

nodenvの初期化を~/.zprofileで行います。

```zsh:~/.zprofile
eval $(nodenv init -)
```


## Emacsのインストール

```shell-session
brew install emacs
```

Emacs 25.3.1が入りました。
機械学習論文読みメモ_101


[Learning from Simulated and Unsupervised Images through Adversarial Training](https://arxiv.org/abs/1612.07828), CVPR2017
シミュレーションにより人工的な画像を生成しそれを学習に用いる事ができる。
しかし現実との画像のギャップにより、パフォーマンスには限界がある。
本論ではその問題へ対処するための手法として現実の教師なし画像と組み合わせる事で
学習性能を向上させる手法を提案する。
提案手法は人工的に作成した画像を入力として用いたGANを用いて、
現実と見分けがつかないような画像を生成する。
加えてGANで画像を生成するにあたって、
元の入力からの差分が大きくなりすぎないようにするself-reguralizationなどの
新たな制約を加える事で性能を向上させた。

[Subspace Outlier Detection in Linear Time with Randomized Hashing](http://ieeexplore.ieee.org/document/7837870/?reload=true)
異常検知のアルゴリズムは基本的にすべてのデータ点を評価するためその計算コストが高いのが問題であった。
また部分空間法に基づく手法では部分空間毎の評価もさらに必要になってしまう。
本論ではそれに対して、データ量に対して線形オーダーで、かつ領域使用量が一定であるような手法を提案する。
この手法はrandomized hashingを用いてデータ点の評価を行う。

[mixup: Beyond Empirical Risk Minimization](https://arxiv.org/abs/1710.09412)
大型のdeep netは強力だが，memorizationやadversarial examlpesに対する脆弱性のなどの
問題がある．
本論ではこの問題に対してmixupを提案する．
mixupの手法は与えられている訓練データとそのラベルのペアに関して，凸結合を行って
生成したサンプルも用いる．
このサンプルを用いる事で，モデルに対して線形性を課す事が可能になる．
線形性が課されると，特に外挿を行う際に不必要な非線形的なオシレーションを
防ぎ，ロバスト性を向上させる事が出来る．
この事は敵対的サンプルに対する頑健性向上にも役立つ．
MW_WP_FORMで「利用規約に同意」カスタマイズ

mw wp formで「利用規約に同意」のチェックボックスを作った時のメモ。

##やりたいこと
固定ページから「個人情報保護方針」を読み込む
利用規約のチェックボックスを作る
バリデーションで必須に
エラーメッセージの文言変更
条件分岐「利用規約にチェックが入っていなければ、エラーページで利用規約を表示する」


###1.固定ページから「個人情報保護方針」を読み込む・チェックボックスの作成
```
<div id="frame-privarypolicy"></div>
<p id="privacy-check">[mwform_checkbox name="利用規約" children="同意する"]</p>

...(</body>直前)
<script>
$(function() {
  $.ajax({
    url: '/privacypolicy',
    cache: false,
    success: function(html) {
      $(html).find('#privacypolicy').each(function() {
        $('#frame-privarypolicy').html($(this).html());
        return false;
      });
    }
  });
});
</script>
```
固定ページをそのまま読み込むと、headerなどの余計なものも入ってしまうので、id(#privacypolicy)だけを取り出して読み込んでいる。


###バリデーションで必須に
![スクリーンショット 2017-11-08 08.57.38.png](https://qiita-image-store.s3.amazonaws.com/0/56312/6ec34af7-faed-06a4-1155-a0822a140d80.png)

###エラーメッセージの文言変更
functions.phpに記載

```
function add_mwform_validation_rule( $Validation, $data ) {
$Validation->set_rule( '利用規約', 'required', array(
        'message' => '個人情報保護方針を読み、同意してください。'
    ) );
   return $Validation;
  }
add_filter( 'mwform_validation_mw-wp-form-xxxx', 'add_mwform_validation_rule', 10, 2 );
```

###条件分岐「利用規約にチェックが入っていなければ、エラーページで利用規約を表示する」
![スクリーンショット 2017-11-08 09.05.46.png](https://qiita-image-store.s3.amazonaws.com/0/56312/aa3d0154-5ec9-5bd1-0a88-15aa29d55153.png)

エラー画面（xxx/error）で、「利用規約」にチェックが入っていなければ、個人情報を再表示。デフォルトはstyle.cssでdisplay:noneにしておく。
```
if($("#privacy-check input:checked").val()) {
   }
   else {
     $('#frame-privarypolicy').css('display', 'block');
   }
```
JDK8u151 から 暗号化設定変更（無制限の暗号化を利用する場合）

https://www.java.com/ja/download/faq/release_changes.xml
より、

1. プログラム内部で、Security.setProperty("crypto.policy", "unlimited");を記述。
+ java.securityファイルに、crypto.policy=unlimited を記載する。
+ US_export_policy.ja と local_policy.jar を従来通り配置する。

一番簡単なのは、ポリシーファイルの配置作業がなくなり、テキストファイルのみの修正で対応できる 2. かな。

これから記述するプログラムは、JCEフレームワークの呼び出し前に、１．の設定をルーチン化する方がいい。

覚え書きでした。

追記：
OpenJDKには AES-256が含まれていますので、上記設定は不要です。
vue-cli 2.9.1 でのpug + sass環境構築

いろいろ最初に組み込まれて手順が減ってきていて、最近はこのぐらいで終わるようです。
vue事態のインストールなどは、他を参考ください。

* プロジェクトの構築(設定はすべてデフォルト)  

```
$ vue init webpack vue-pug-sass
```  

設定はすべてデフォルトでOKなのでエンターキーを連打で！

* npmのインストール  

```
$ cd vue-pug-sass
$ npm install
$ npm install pug-html-loader --save-dev
$ npm install node-sass --save-dev
$ npm install sass-loader --save-dev
```

追加するモジュールはこの3つだけでOK!あとは書くだけで利用出来ます。

* 初期コンポーネントの置き換え

```vue
<template lang="pug">
.hello
  h1 {{ msg }}
  h2 Essential Links
  ul
    li
      a(href='https://vuejs.org', target='_blank') Core Docs
    li
      a(href='https://forum.vuejs.org', target='_blank') Forum
    li
      a(href='https://chat.vuejs.org', target='_blank') Community Chat
    li
      a(href='https://twitter.com/vuejs', target='_blank') Twitter
    br
    li
      a(href='http://vuejs-templates.github.io/webpack/', target='_blank') Docs for This Template
  h2 Ecosystem
  ul
    li
      a(href='http://router.vuejs.org/', target='_blank') vue-router
    li
      a(href='http://vuex.vuejs.org/', target='_blank') vuex
    li
      a(href='http://vue-loader.vuejs.org/', target='_blank') vue-loader
    li
      a(href='https://github.com/vuejs/awesome-vue', target='_blank') awesome-vue
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  }
}
</script>

<style lang="scss">
$msg-color: #42b983;

h1, h2 {
  font-weight: normal;
}

ul {
  list-style-type: none;
  padding: 0;
}

li {
  display: inline-block;
  margin: 0 10px;
}

a {
  color: $msg-color;
}
</style>
``` 

./src/components/HelloWorld.vue をpugとsassで書いた物です。
sassは変数を使って正しくコンパイルされているか確認しています。

```
$ npm run dev
```

デフォルトのページがpugとsassで書かれていてもしっかりと動いているのを確認してください。
【MAC】VoiceOver を止める


# Voiceoverを止めるには
command+F5を押したときに、Voiceoverが動いてしまい止めるのに苛ついたのでメモ。

「システム環境設定」ー「アクセシビリティ」ー「VoiceOver」で「VoiceOverを有効にする」のチェックを外すと止まる。

<img width="668" alt="スクリーンショット 2017-11-08 7.54.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/211107/cdde6a3f-dcf3-2099-a3e8-9eafa2f71f51.png">


# command+F5 で動かないようにする
「システム環境設定」「キーボード」「ショートカット」「アクセシビリティ」で「VoiceOverの入／切」からチェックを外せばいい。

<img width="676" alt="スクリーンショット 2017-11-08 7.50.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/211107/8aae0023-b253-9120-17e6-d1c48a379817.png">
IEでログインできない！

# 事象

ローカル環境で開発していたときはログイン出来ていたが、テスト環境に移した際にIEでログイン出来なくなっていた。(他のブラウザでは共にログイン出来ていました。)

# 原因

テスト環境のドメインにアンダースコアが入っていたため、セッションクッキーが扱えず、ログインできなかった。

https://support.microsoft.com/ja-jp/help/316112/prb-session-variables-do-not-persist-between-requests-after-you-instal

**サーバー名にアンダースコア ("_") など、その他の文字が含まれている場合、Internet Explorer は Cookie をブロックします。**

※実際のドメインを作るときはアンダースコアは使えないので本番で起こることはないが、開発環境では可能

ローカル環境でのIEのリクエストヘッダには以下が入っていたが、開発環境でのIEのリクエストヘッダにはCookieが入っていないかった。

```
Cookie: csrf_cookie_name=212d672d201b8d7f5d314db3c3935ef0; PHPSESSID=arevftlbii40n8vnoq1drq0aoc
```

ブラウザのゾーン設定かとも思いましたが違いました。
スナップショットテストを使いPublicなAPIをテストする


ライブラリを書いていると、公開するAPIのスキーマをテストしたいことがあります。

例えば、以下のような非常に小さなライブラリ。

```js
const hello = 'hello'

module.exports = name => {
  return `${hello} ${name}`
}

module.exports.first = 1
module.exports.noop = () => {}
```

ここで、公開されているAPIは、module.exportsで公開した`Function`と`first`と`noop`です。
しかし、APIを変更する必要が出て、firstを以下のようにnumberからfunctionへと変更したとします。

```js
module.exports.first = () => 1
```

もちろんそれぞれにユニットテストを書くのは重要ですが、スキーマがあると安心です。
jestをインストールし、以下のようなコードを用意します。

```
yarn add --dev jest
```

```js
test('public API snapshot', () => {
  const api = require('.')
  const schema = Object.keys(api).reduce(
    (acc, k) => ({ ...acc, [k]: typeof api[k] }),
    { 'module.exports': typeof api }
  )
  expect(schema).toMatchSnapshot()
})
```

これで、`module.exports`によって公開されたスキーマのスナップショットを取ることができます。
例えば、上記のように`number`から`function`へと公開するAPIが変わったら以下のようにFailします。

![スクリーンショット 2017-11-08 07.01.22.png](https://qiita-image-store.s3.amazonaws.com/0/15319/5e7f3644-095e-13fc-554f-82906235406b.png)


もちろん、新しいAPIを公開したときもFailします。

```js
module.exports.second = () => 2
```

![スクリーンショット 2017-11-08 07.11.12.png](https://qiita-image-store.s3.amazonaws.com/0/15319/61959ae5-171c-4e77-24b2-a0adc0c713ed.png)


これによって、カバレッジを見るまでもなく、テストすべき関数がひと目でわかります。また、バージョニングの指標の一つになるでしょう。(コミットメッセージによるセマンティックリリースはあくまで人間の手よる手動管理という認識です)


## 終わりに
荒削りですが、以上です。
何か議論があればコメント欄またはTwitterまでお願いします。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">PublicなAPIのスキーマのスナップショットテスト。ちょっと面白いかも知れない。 <a href="https://t.co/i9vPAKJ9fz">pic.twitter.com/i9vPAKJ9fz</a></p>&mdash; あかめ@無職.js (@akameco) <a href="https://twitter.com/akameco/status/928021633926807552?ref_src=twsrc%5Etfw">November 7, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
raspberry pi 3 でstretch その7

#概要
raspberry pi 3 でstretchやってみた。
tensorflowやってみた。

#環境
Raspberry Pi 3 model B v1.2 element14
2017-09-07-raspbian-stretch
tensorflow1.3

#インストール

https://github.com/ohisama/rpi-tensorflow

#設定
sudo nano /etc/dphys-swapfile

```
conf_swapsize=1024
```

#サンプルコード

```
from tensorflow.contrib.keras.python.keras.applications.resnet50 import ResNet50
from tensorflow.contrib.keras.python.keras.preprocessing import image
from tensorflow.contrib.keras.python.keras.applications.imagenet_utils import preprocess_input, decode_predictions
import numpy as np

model = ResNet50(weights = 'imagenet')
img_path = 'p1m.jpg'
img = image.load_img(img_path, target_size = (224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis = 0)
x = preprocess_input(x)
preds = model.predict(x)
print ('Predicted:', decode_predictions(preds))



```

以上。
[Ruby]機械学習②：パーセプトロン

##Ruby
###実装
```ruby
class Perceptron 

  def and(x1,x2)
    w1,w2,theta = 0.5, 0.5, -0.7
    tmp = x1 * w1 + x2 * w2 + theta
    if tmp <= 0
      0
    else
      1
    end  
  end

  def nand(x1,x2)
    w1,w2,theta = -0.5, -0.5, 0.7
    tmp = x1 * w1 + x2 * w2 + theta
    if tmp <= 0
      0
    else
      1
    end  
  end

  def or(x1,x2)
    w1,w2,theta = 0.5, 0.5, 0.0
    tmp = x1 * w1 + x2 * w2 + theta
    if tmp <= 0
      0
    else
      1
    end  
  end

  def xor(x1,x2)
    s1 = self.nand(x1,x2)
    s2 = self.or(x1,x2)
    y = self.and(s1,s2)
  end

end
```


## Ruby with Numpy
###実装
```ruby
require 'numpy'

class Nperceptron

  attr_reader :np

  def initialize
    @np = Numpy
  end

  def and(x1,x2)
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.7
    tmp = (np.sum(x * w) + b).to_f
    if tmp <= 0
      0
    else
      1
    end
  end

  def nand(x1,x2)
    x = np.array([x1,x2])
    w = np.array([-0.5,-0.5])
    b = 0.7
    tmp = (np.sum(x * w) + b).to_f
    if tmp <= 0
      0
    else
      1
    end
  end

  def or(x1,x2)
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = 0.0
    tmp = (np.sum(x * w) + b).to_f
    if tmp <= 0
      0
    else
      1
    end
  end

  def xor(x1,x2)
    s1 = self.nand(x1,x2)
    s2 = self.or(x1,x2)
    y = self.and(s1,s2)
  end

end
```

###考察
・本筋とは関係ないけれど、`@np.sum(x * w) + b`がrubyのクラスではObjectでありFloatではなかったので、`to_f`する必要があった。
(`numpy`や`pycall`のgemのバージョンが変わることで変わるかもしれないけど、参考までに)

```ruby
 def what_is_class
  np_array =  np.array([0.5,0.5])
  sum = np.sum(np_array * np_array)

  puts "np: #{np.class}"            #=> Module
  puts "np_array: #{np_array.class}"  #=> <class 'numpy.ndarray'>
  puts "sum: #{sum.class}"            #=> Object
end
```
ScalaでRustっぽく書きたい 〜try!編〜



## 途中で失敗したら強制的に例外を吐きたい

```rust
use std::io;
use std::fs::File;
use std::io::Read;

fn main() {
    println!("Hello, world!");
    println!("{:?}", foo());
}


fn foo() -> Result<String, io::Error> {
    println!("-- 1");
    let mut f = File::open("username.txt")?;
    println!("-- 2");
    let mut s = String::new();
    f.read_to_string(&mut s)?;
    Ok(s)
```

これはRustのコードで、ファイルが存在しなければ `-- 2` は出力されずに、そこで作業が終了し強制的に `Err(Error { repr: Os { code: 2, message: "No such file or directory" } })
` が返るコードです。

今回はこれの早期リターンの部分をScalaで書いてみたいと思います。

## scalamacros によってマクロを作る

[sbt-example](https://github.com/scalamacros/sbt-example) や [sbt-example-newstyle](https://github.com/scalamacros/sbt-example-newstyle) を参考にして、一つマクロを組んでみます。

```scala

package examples

import scala.language.experimental.macros
import scala.reflect.macros.blackbox.Context


object Macros {
  def guardimpl[T](c: Context)(defn: c.Expr[Option[T]]) = {
    import c.universe._
    c.Expr[T](
      q""" if ($defn.isEmpty) { return None } else { $defn.get } """)
  }
  def guard[T](defn: Option[T]): T = macro guardimpl[T]
}

```

Rustでは元々`?` が `try!` マクロでした。しかし、Scalaでは `try`が予約されていて使えなかったので、`guard`にしました。

使い方はこんな感じです。

```scala

package foo

import examples.Macros._


object Hello extends App {
  val user = User("tarou")
  println(user.yourName("tarou"))
  println(user.yourName("jirou"))
}


case class User(name: String) {


  def yourName(name: String): Option[String] = {

    val ret: String = guard[String] {
      if (this.name == name) Some(this.name) else None
    }

    println(s"your name is ${ret}")
    Some(ret)

  }

}

```

結果は

```
your name is tarou
Some(tarou)
None
```

となります。`jirou` の場合は名前が間違っているため名前を呼ばれることはありません。
guardは、成功するとOption型をアンラップして中身を返すため、値をそのまま使う事ができます。

macro内でreturnを使っているため、`defn` が None だった場合は、早期リターンでNoneが返ります。macroを改造してEitherや単純にExceptionを返してあげても面白いかもしれません。
1ラインでプレミアムフライデーを求めてみた

とある業務システムでプレミアムフライデーに自動で割引を付けたいとのことで
今更ながらプレミアムフライデーを求める式を考えてみた。

巷によくあるのは、ループでぐるぐるするタイプが多い。
ソース読んでわかりやすいし、あとあとメンテも楽だろうけど
でもそれだと、SQLやEXCELでわざわざストアドやマクロ書かないといけなくてちょっと使いにくい。

曜日はプログラムでは数値で表される、7進数だと考えると
カレンダーは曜日を表すとこんな感じに並べられている。
```　　　3 4 5 6
0 1 2 3 4 5 6
0 1 2 3 4 5 6
0 1 2 3 4 5 6
0 1 2 3 4
```
プレミアムフライデーを赤字にしてみるとこうなる
```　　　3 4 5 6
0 1 2 3 4 5 6
0 1 2 3 4 5 6```
``0 1 2 3 4 ``<font color="red">5</font>`` 6``
```0 1 2 3 4
```
こうすると、``月末から7日マイナス``して、
そこに``金曜日マイナス月末の曜日``を足せば良さげに見える。

するとこんな式ができる
``月末日 - 7 + (目標曜日 - 月末の曜日)``

もし金曜日をあらわすのが 5 だったら
``5 - 月末の曜日(4) = 1``
なので、``月末 マイナス 7日 + 1 ``すればいい

だがしかし、一見すると上手くいくように見えるが
別の世界線ではプレミアムウェンズデーかもしれない
その場合、水曜日を表すのが 3 だとすれば？

``3 - 月末の曜日(4) = -1``

この場合月末に マイナス7 すると ``月末 - 8 ``となって最終水曜日ではなくなり、おかしなことになる。
```　　　3 4 5 6
0 1 2 3 4 5 6
0 1 2 3 4 5 6```
``0 1 2 ``<font color="red">3</font>`` 4 5 6``
```0 1 2 3 4
```

つまり計算結果がマイナス7日を超えてしまうのが原因なのだ
ならば常に``7で割った余り``を求めればいいのでは？
**ピコーン**
じゃあ、**剰余** 使ってみるか！

``月末日 + ((目標曜日 - 月末の曜日 - 7) MOD 7)``

```SQL```
mysql> SELECT DATE_ADD(LAST_DAY(CURRENT_DATE()), INTERVAL MOD(4 - WEEKDAY(LAST_DAY(CURRENT_DATE())) - 7, 7) DAY);
+----------------------------------------------------------------------------------------------------+
| DATE_ADD(LAST_DAY(CURRENT_DATE()), INTERVAL MOD(4 - WEEKDAY(LAST_DAY(CURRENT_DATE())) - 7, 7) DAY) |
+----------------------------------------------------------------------------------------------------+
| 2017-11-24                                                                                         |
+----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
```

おおお！行けてるっぽいぞ！

【追記】
この式は**負の剰余**を使うため、PerlやPythonなど一部言語では使用できないとのこと。
Aloneというフレームワークのグラフ描画機能を流用してSVGでグラフを描画する

# はじめに

Webサイトでグラフを表示する必要があり、色々と悩んでいたらAloneというフレームワークのグラフ描画機能を使ってできることがわかったので、その方法をメモしておきます。

# ダウンロード

公式サイトから最新版をダウンロードします。（執筆時現在、3.3）

[Alone - Application Framework for Embedded Systems](http://www.ruby-alone.org)

# 必要なファイルの取り出し

ダウンロードしたファイルを解凍するとたくさんファイルが出てきますが、必要なのは以下の3つです。

- lib/al_main.rb
- lib/al_graph_base.rb
- lib/al_graph.rb

# ファイルの変更

上記のファイルを作成するスクリプトと同じフォルダにコピーして以下のとおり修正します。
内容は「require」を「load」に変えて、名称の後ろに「.rb」を追記する。

```rb:al_graph.rb
#require 'al_graph_base'
load 'al_graph_base.rb'
```

```rb:al_graph_base.rb
#require 'al_graph_base'
load 'al_main.rb'
```

Webアプリケーション用スクリプトの起動を抑止するために、477行目をコメントアウト。

```rb:al_main.rb
  #_start()
```

# グラフの描画

```rb:graph.rb
#!/usr/local/bin/ruby

load 'al_graph.rb'

puts <<EOF
Content-type: image/svg+xml

EOF

ydata1 = [ 5, 3, 6, 3, 2, 5, 6 ]

graph = AlGraph.new
graph.add_data_line(ydata1)

graph.draw
```

上記のスクリプトを実行するとSVGが出力されます。

```
$ ruby graph.rb
```

# HTMLの作成

Aloneのファイルと上記のスクリプトをサーバに移し、スクリプトに実行権限を付与し、以下のHTMLを作成して生成されるSVGを読み込みます。

```html:sample.html
<html>
  <head>
    <title>Graph sample</title>
  </head>
  <body>
    <img src="graph.rb" />
  </body>
</html>
```

ブラウザを起動して、ファイルにアクセスすると...

![スクリーンショット 2017-11-08 4.10.43.png](https://qiita-image-store.s3.amazonaws.com/0/114240/25731f1c-69ae-764e-84ba-ea5365381e77.png)

できた！

あとはラベルを調整したり、背景色を変更したり...まだまだやることいっぱいですね。
VCCWで自作テーマを作るための準備

## はじめに

VCCWとはWordpressを仮想環境上に構築するためのツールです。VCCCWはVagrantを利用して仮想環境を構築するのですが、Vagrantfileで設定を記述すればホストOS(ローカル環境)とゲストOS(仮想環境)のファイルを同期することができます。
これはどういうことかというと、ローカル環境のファイルを修正すると仮想環境にssh接続することなしに即座に仮想環境上に存在する同期設定されたファイルにも同じ修正が加わるということです。
VCCWではホストOSとゲストOSのファイル同期の設定がすでにデフォルトでされているため、ローカルのファイルをいじることが仮想環境上のファイルをいじることに直結します。ですので、sshで接続する仮想環境においてもFTPやgitなどを利用することなく直接ファイル編集をすることができます。

今回はこの同期機能を活用した、自作テーマを作成するための準備について説明します。今回は自作テーマでHelloWorldがWordPress上に表示できることをゴールにします。

## 自作テーマ作成準備手順

vccwをインストールしたディレクトリに移動します。
vccwのディレクトリに移動するとwordpressというディレクトリがあるのがあるのですが、このwordpressディレクトリが仮想環境の/var/www/htmlと同期されています。

```bash
$ cd /path/to/vccw
```

wordpressのテーマディレクトリに移動します。

```bash
$ cd /path/to/vccw/wordpress/wp-content/themes
```

ここに新しくディレクトリを作成します。このディレクトリに自作テーマを作成していきます。

```bash
$ mkdir sample
```

自作テーマをwordpress上で使えるようにするために最低限必要なものが`index.php`と`style.css`です。
`index.php`と`style.css`を先ほど作成したディレクトリの下に作成します。

```index.php
<html lang="ja">
  <head>
    <title>Sample</title>
  </head>
  <body>
     <h1>
        HelloWorld
     </h1>
  </body>
</html>
```

style.cssは空でも問題ないですが、テーマの情報を表示させたい場合はコメントを追加することでWordPressから確認できるようになります。
色々と記述できる情報はあるのですが、以下のような内容が含まれていれば十分だと思います。

```style.css
/*
Theme Name: SampleTheme
Description: サンプルテーマ
Author: SampleUser
Author URI: http://●●●.com
Version: 1.0
*/
```

実際に仮想環境上にもディレクトリとファイルができていることを確認してみます。

```bash
$ cd /path/to/vvcw
$ vagrant ssh
$ cd /var/www/html/wp-content/themes/sample
$ ls
index.php  style.css
```

次に、http://vccw.test/ もしくは http://192.168.33.10/ にアクセスをして管理画面にログインします(デフォルトはユーザ名・パスワード共にadmin)。
「外観」 -> 「テーマ」から確認すると自作テーマが表示されていることがわかります。

![スクリーンショット 2017-11-08 2.43.37.png](https://qiita-image-store.s3.amazonaws.com/0/140792/4e63a4ad-72ef-a998-bab4-03fb9a6d5445.png)



自作テーマを有効化して、トップ画面が以下のように表示されていればOKです。

![スクリーンショット 2017-11-08 2.39.51.png](https://qiita-image-store.s3.amazonaws.com/0/140792/fe7ec215-01be-574f-7240-bfe5b2a3b09d.png)
[iOS11.1]prepareToPlayを無理やり実行させる

```swift
let c = MPMusicPlayerController.systemMusicPlayer
var d = MPMusicPlayerStoreQueueDescriptor(storeIDs: ["500044854"])
c.setQueue(with: d)
c.prepareToPlay { (error) in //A
  print(error)
  c.play()
}
c.prepareToPlay() //B
```

preparePlay(A)後にprepareToPlay(B)を呼ぶと、Aがキャンセルされるが即時再生される。
この時isPreparedToPlayはfalseだが大体は正常に再生された。（iOS11.1/iPhoneX)

キャッシュを強制的に呼び起こしてる…？


```swift
let c = MPMusicPlayerController.systemMusicPlayer
var d = MPMusicPlayerStoreQueueDescriptor(storeIDs: ["500044854"])
c.setQueue(with: d)
c.play()
c.prepareToPlay { (error) in
  print(error)
  c.play()
}
```

これも即座に再生された。
エラーはnotfoundが返される。キャッシュが無い場合の挙動は不明。

AppleMusicのキャッシュ消したいんだけどどうすればいいんだろ…。
[iOS11.1]prepareToPlayが返ってこない


```
let c = MPMusicPlayerController.systemMusicPlayer
var d = MPMusicPlayerStoreQueueDescriptor(storeIDs: ["500044854"])
c.setQueue(with: d)
c.prepareToPlay { (error) in
  print(error)
  c.play()
}
```
iOS10の時はcompletionHandlerがちゃんと返ってきた気がするけど、iOS11.1で返ってこない…。
Shazamがすぐ再生されるので使い方が間違っているのかな…。

# 追記

何度か繰り返していたら動くようになった。
ストリーミングまで時間がかかるのかな…？だとしても時間かかりすぎだと思う。

# 追記２

なんでも良いので再生中の状態でprepareToPlayを呼ぶと成功しやすい感じがする。
再生していない状態からだと再生に時間がかる

# 追記3
AppleMusic未加入端末iOS11.0.3ではすぐに`Error Domain=MPErrorDomain Code=4 "(null)"`が返ってきた

# 追記4

AppleMusic加入端末iOS11.0.3ではすぐに再生されたが、ライブラリ内の違う曲が再生された。
また
`MPMusicPlayerController: Server is not running, deferring check-in`
というログが吐かれた。
error: nil
isPreparedToPlay: false

二回目の実行で該当の曲が流れた。
error: nil
isPreparedToPlay: true
Laravelで環境変数をJavascriptで使う

JSファイルで使いたい環境変数が`APP_ENV`だった場合。
`.env`ファイルに`MIX_`プレフィックスを付けた環境変数を記述する。

```php
#.envファイル
MIX_APP_ENV=local
```

JSファイル内で`process.env`オブジェクトを使って以下のように記述出来る

```javascript
//index.js
if(process.env.MIX_APP_ENV === 'local'){
    console.log('ローカル環境');
}
```
参考
https://readouble.com/laravel/5.4/ja/mix.html

環境によってJSの記述を変える必要が出てきてしまって困っていたので助かった。
以上。
Machine Learning with Go 読書記録

## Machine Learning With Go とは
<img src="https://www.packtpub.com/sites/default/files/B05151_Cover.png" width=40%>

 - [Pachyderm](http://www.pachyderm.io/aboutus.html) の [Daniel Whitenack](https://twitter.com/dwhitena) 氏 が執筆
 - 2017/09 に [Packt](https://www.packtpub.com/big-data-and-business-intelligence/machine-learning-go) から出版
 - 氏は、GopherCon, JuliaCon, PyCon, ODSC, Spark Summitなどにおいても講演実績があり、Jypyter notebook 用の Go kernel maintainer の一人でもある. [gopher notes](https://github.com/gopherdata/gophernotes)
 - [twitter](https://twitter.com/dwhitena) や [gophers.slack.com](https://invite.slack.golangbridge.org/) #data-science で、質問に対応してくれている.
 - 書籍掲載コードのリポジトリ [Machine-Learning-With-Go](https://github.com/PacktPublishing/Machine-Learning-With-Go)
 - GoCon2017 でも[言及されたらしい](https://twitter.com/deeeet/status/926978061571989504).

（自分の参加している勉強会で、プレゼンするよといった手前、しっかり読んでおかないと）

[gophernotes 環境を作るよ](https://qiita.com/ysaito8015@github/items/a84deae71bdb2f188884)

## 目次

1. Gathering and Organizing Data
 - データ収集やデータ整理について
2. Matrices, Probability, and Statistics
 - 行列、確率、統計について
3. Evaluation and Validation
 - 評価とバリデーションについて
4. Regression
 - 線形回帰について
5. Classification
 - クラス分類について
6. Clustering
 - クラスタリングについて
7. Time Series and Anomaly Detection
 - 時系列データと、異常検知について
8. Neural Networks and Deep Learning
 - ニューラルネットワークと深層学習
9. Deploying and Distributing Analyses and Models
 - デプロイと分散処理とモデルについて
10. Algorithms/Techniques Related to Machine Learning 
 - 機械学習に関連するアルゴリズムとテクニックについて

(2017/11/08 読みながら、随時章ごとの記事を立てていきます.)