OmniAICreator/Qiita-1.07M huggingface dataset:
課題問題の取り組みプロセス

http://tech-drill.in/questions/54 より

#ひな型

```rb
def input_book_info
  book = {}
  puts "本の名前を入力してください："
  book[:name] = gets.chomp
  puts "本の値段を入力してください："
  book[:price] = gets.to_i
  puts "出版社を入力してください："
  book[:company] = gets.chomp
  books << book
end

def show_book_info(books)
  unless books.empty?
    books.each do |book|
      put "番号:[#{index}], 本の名前: #{book[:name]}"
      index += 1
    end

    puts "詳細を見る本の番号を入力してください："
    input = gets.to_i
    book = books[input]

    puts "本の名前: #{book[:name]}\t|値段: #{book[:price]} 円\t|出版社: #{book[:company]}"
  else
    puts "本が登録されていません。"
end

def end_program
  puts "ご利用ありがとうございました"
  exit
end


books = []

while true do
  puts "登録された本の数：#{books.length}"
  puts "[0]:本の情報を入力する"
  puts "[1]:本の名前を一覧表示する"
  puts "[2]:プログラムを終了する"
  input = gets

  if input == 0
    input_book_info(books)
  elsif input == 1
    show_book_info(books)
  else
    end_program
  end
end
```
このひな型は間違っている箇所があって、このままではエラーが出る。

##getsをgets.to_iに
41行目の```input = gets```はこのままだと文字列として入力した値を受け取ってしまうのでgets.to_iに書き換えた。

##input_book_infoメソッドの引数
ひな型では1行目で定義されているinput_book_infoメソッドが引数を受け取っていなかったのでbooksを引数として受け取るように変更を加えた。

##変数indexを定義
17行目で```index += 1```とあるが、そもそも変数indexが定義されていないので、eachループ文の前でindex = 0と初期値を定義する。

##put →　puts
単純なタイプミスを修正。

##endの数が足りない
ここまでは順調だったが、このまま実行してみると
``` syntax error, unexpected end-of-input, expecting keyword_end```
というエラーが出た。syntax(構文)エラーでスクリプトが予期せぬ終わり方をしてるとのことなのでおそらくendが足りてないと予想。
どこで足りてないのかわからず（最後のwhile文周辺ばかりを見ていた）あまりに長時間苦戦したので解答をカンニング。unless文のendが足りていなかった。

#修正後のコード
```rb

def input_book_info(books)
  book = {}
  puts "本の名前を入力してください："
  book[:name] = gets.chomp
  puts "本の値段を入力してください："
  book[:price] = gets.to_i
  puts "出版社を入力してください："
  book[:company] = gets.chomp
  books << book
end

def show_book_info(books)
  unless books.empty?
    index = 0
    books.each do |book|
      puts "番号:[#{index}], 本の名前: #{book[:name]}"
      index += 1
    end

    puts "詳細を見る本の番号を入力してください："
    input = gets.to_i
    book = books[input]

    puts "本の名前: #{book[:name]}\t|値段: #{book[:price]} 円\t|出版社: #{book[:company]}"
  else
    puts "本が登録されていません。"
  end
end

def end_program
  puts "ご利用ありがとうございました"
  exit
end


books = []

while true do
  puts "登録された本の数：#{books.length}"
  puts "[0]:本の情報を入力する"
  puts "[1]:本の名前を一覧表示する"
  puts "[2]:プログラムを終了する"
  input = gets.to_i

  if input == 0
    input_book_info(books)
  elsif input == 1
    show_book_info(books)
  else
    end_program
  end
end
```
Lorem Picsumっていう便利なサービスの使い方

# 概要

[Lorem Picsum](https://picsum.photos/)って知ってます？

`https://picsum.photos/200/300`とか`https://picsum.photos/200`みたいにURL叩くと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117615/bf07d4d9-1eca-ab80-abfb-782b9d0ae426.png)

こんな画像を返してくれる便利サービス。

サービスサイトのモックとか、画像一覧っぽい雰囲気を醸し出したい時に便利なやつです:point_up:
公式のまんまですが、使い方まとめます。

# 使い方

**画像の（ 幅 / 高さ ）を指定**
`https://picsum.photos/200/300`

→幅 200px, 高さ 300pxの画像が表示されます。



**縦横同じ長さの画像の長さを指定**

`https://picsum.photos/200`

→縦横 200pxの画像が表示されます。


**アクセスするたびに、ランダムな画像を表示**

`https://picsum.photos/200/300/?random`

→URLの最後に`?random`をつければOK

**特定の画像を指定して表示**

`https://picsum.photos/200/300?image=0`

→URLの最後に`?image={番号}`を指定すればOK

[特定の画像を見つけやすくするページを作ったので、よかったらみてみてください](https://codepen.io/ksyunnnn/full/GQQyKe/)

# 以上
【C言語】分布数え上げソートの簡単な実装方法

#分布数え上げソートとは
ソートする配列の値範囲が既知の場合，分布数え上げソート (カウンティングソート)
 が最速となる。
具体的な仕組みは以下参照
・[分布数え上げソート [Counting Sort]](https://www.codereading.com/algo_and_ds/algo/counting_sort.html)
・[C言語アルゴリズム-分布数え上げソート](http://capm-network.com/?tag=C%E8%A8%80%E8%AA%9E%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0-%E5%88%86%E5%B8%83%E6%95%B0%E3%81%88%E4%B8%8A%E3%81%92%E3%82%BD%E3%83%BC%E3%83%88)

#単純な実装方法
・配列data[n]を昇順でソート
・配列data[]の値範囲は0~max
のとき

```main.c
#define REP(i,n) for(int i=0;i<n;i++)

int main() {
	...
	int tmp[max+1], arg = 0; //ソート用の配列と変数
	REP(i,max+1) tmp[i] = 0; //配列tmp[]を0で初期化
	REP(i,n) tmp[data[i]]++; //数え上げ
	REP(i,max+1) REP(j,tmp[i]) data[arg++] = i; //小さい順に格納
	...
}
```

#少し複雑に
・配列data[]のtop~end番目の要素だけを昇順でソート
・top~end番目の要素値の範囲はmin~max
のとき

```main.c
#define FOR(i,a,b) for(int i=a;i<b;i++)

int main() {
	...
	int arg = top, tmp[max-min+1]; //ソート用の配列と変数
	FOR(i,0,max-min+1) tmp[i] = 0; //配列tmp[]を0で初期化
	FOR(i,top,end+1) tmp[data[i] - min]++; //数え上げ
	FOR(i,0,max-min+1) FOR(j,0,tmp[i]) data[arg++] = i + min; //小さい順に格納
	...
}
```
Pugで変数に入ってるHTMLをそのまま出力する

`!=`を使います。

```pug
- var div = '<div>fooo</div>'

body
  != div

// <body><div>fooo</div></body>
//
// `= div`との違い
// <body>&lt;div&gt;fooo&lt;/div&gt;</body>
```

SSRで生成したコードを埋め込む時とかに。
Firebase RTDB で同じパスに対する Listen 時の注意

使用したライブラリは以下のバージョン。

```
implementation "com.google.firebase:firebase-core:11.8.0"
implementation "com.google.firebase:firebase-database:11.8.0"
```

## 概要

データベース(のパス)に読み取りアクセス権がない場合、登録したリスナの `onCancelled()` が呼ばれるが、orderBy を指定してリスナを設定したあと、同じパスに orderBy を指定せずに別のリスナを設定すると、orderBy を指定したリスナには `onCancelled()` がコールバックされるが、指定しないリスナの `onCancelled()` は呼ばれない。

- [firebase/firebase-android-sdk#28: onCancel not called on permission error](https://github.com/firebase/firebase-android-sdk/issues/28)

バグのようだったので、いずれ直るかもしれません。

## 検証

ログを出力するだけの `LogValueEventListener`、`LogChildEventListener` を用意し、以下のようなコードを書いてみる。

```kotlin
val ref = FirebaseDatabase.getInstance().getReference("test")
ref.orderByKey().addListenerForSingleValueEvent(LogValueEventListener("single-order"))
ref.addListenerForSingleValueEvent(LogValueEventListener("single"))
ref.orderByKey().addValueEventListener(LogValueEventListener("value-order"))
ref.addValueEventListener(LogValueEventListener("value"))
ref.orderByKey().addChildEventListener(LogChildEventListener("child-order"))
ref.addChildEventListener(LogChildEventListener("child"))
```

同じパスに6つのリスナを登録しているが、`onCancelled()` が呼ばれたのは `orderByKey()` を指定した3つのみ。`orderByKey()` を指定しなかったリスナの `onCancelled()` は呼ばれなかった。

先頭を `orderByKey()` なしにしてみる。(2行めと3行めを入れ替え)

```kotlin
val ref = FirebaseDatabase.getInstance().getReference("test")
ref.addListenerForSingleValueEvent(LogValueEventListener("single"))
ref.orderByKey().addListenerForSingleValueEvent(LogValueEventListener("single-order"))
ref.orderByKey().addValueEventListener(LogValueEventListener("value-order"))
ref.addValueEventListener(LogValueEventListener("value"))
ref.orderByKey().addChildEventListener(LogChildEventListener("child-order"))
ref.addChildEventListener(LogChildEventListener("child"))
```

この場合はすべてのリスナで `onCancelled()` が呼ばれた。

## あとからパーミッションがなくなった場合

`addValueEventListener()` または `addChildEventListener()` で登録したリスナに対しては、`onDataChanged()` などのイベントが通知された後で、パーミッションがなくなった場合も `onCancelled()` が呼ばれる。

しかし `addListenerForSingleValueEvent()` はワンショットなので、 `onDataChanged()` が呼ばれた後は `onCancelled()` は呼ばれない。

最初に登録したリスナが orderBy ありの `addListenerForSingleValueEvent()` で、その他が orderBy なしだけの場合、

```kotlin
val ref = FirebaseDatabase.getInstance().getReference("test")
ref.orderByKey().addListenerForSingleValueEvent(LogValueEventListener("single-order"))
ref.addValueEventListener(LogValueEventListener("value"))
ref.addChildEventListener(LogChildEventListener("child"))
```

いずれのリスナの `onCancelled()` も呼ばれず、パーミッションエラーになったことに気づくことができなかった。

## その後

パーミッションエラーになった後、さらにリスナを登録した場合、もう orderBy ありだろうがなしだろうが何も通知されなくなってしまった。

登録済みのリスナをすべて `removeEventListener()` で解除したらこの現象は直った。

しかし、`addListenerForSingleValueEvent()` で登録したリスナは解除する方法がないので、復旧できない。この場合はアプリを終了するしかない気がする。
TypeScriptでJSONファイルを型付きで読み込む

こんな感じのjsonファイルを読み込みたい。

```json:dummy.json
{
  "foo": "foo",
  "bar": 123
}
```

## 自動で型定義

`typescript@^2.9.1`(2018.5.31~)からは`tsconfig.json`で`resolveJsonModule`と`moduleResolution`を設定すれば型の付いたJSONを直接インポートできるようになりました。

```json:tsconfig.json
{
  "compilerOptions": {
    "moduleResolution": "node",
    "resolveJsonModule": true
  }
}
```

```ts
import dummy from './dummy.json'

console.log(dummy.foo); 
```

## 自分で型定義

型を付けるための`*.d.ts`を作ります。名前は`types/json/index.d.ts`にしました。（なんでもいい）
そして中身はこんな感じにします。

```typescript:types/json/index.d.ts
declare module '*/test-data.json' {
  interface TestData {
    foo: string;
    bar: number;
  }

  const value: TestData;
  export = value;
}
```

`*/data-test.json`としてるのは`./data-test.json`や`../data-test.json`みたいな`import`にもマッチさせるためです。

後は、これを読み込むだけ。

```ts
import dataTest = require('./data-test.json');
```

別に`any`で構わないなら`value: Foo`としてる部分を`value: any`にすればOKです。
call() vs delegatecall() vs callcode()

# call()とdelegatecall()(およびcallcode())の違い


いずれも別のコントラクトの関数の処理を実行するための関数

- <コントラクトアドレス>.call(): 呼び出し先コントラクトのコンテキストで関数の処理を実行する。関数内の状態参照や状態変更は呼び出し先コントラクトの状態を参照したり更新したりする。
- <コントラクトアドレス>.delegatecall()および<コントラクトアドレス>.callcode(): 呼び出し元コントラクトのコンテキストで関数の処理を実行する。関数内の状態参照や状態変更は呼び出し元コントラクトの状態を参照したり更新したりする。

# delegatecall()とcallcode()の違い

関数内のmsg.senderとmsg.valueが違う。

delegatecall()で実行される関数内のmsg.senderはdelegatecall()が含まれる関数の呼び出し元コントラクトであるのに対し、callcode()で実行される関数内のmsg.senderは、callcode()が含まれる関数のコントラクトである。

# わかりづらいので例示

以下のようにCallerCaller -> Caller -> Calleeと呼び出すパターンで、CallerからCalleeの呼び出しでcall()とdelegatecall()とcallcode()を使い分けてみる。

```
contract CallerCaller {
    Caller caller;
    function CallerCaller(address _caller) public {
        caller = Caller(_caller);
    }
    function setByCall(uint256 _v) public {
        caller.setByCall(_v);
    }
    function setByCallcode(uint256 _v) public {
        caller.setByCallcode(_v);
    }
    function setByDelegateCall(uint256 _v) public {
        caller.setByDelegateCall(_v);
    }
}

contract Caller {
    uint256 public v;
    address callee;
    function Caller(address _callee) public {
        callee = _callee;
    }
    
    function setByCall(uint256 _v) public {
        require(callee.call(bytes4(keccak256("set(uint256)")), _v));
    }
    function setByCallcode(uint256 _v) public {
        require(callee.callcode(bytes4(keccak256("set(uint256)")), _v));
    }
    function setByDelegateCall(uint256 _v) public {
        require(callee.delegatecall(bytes4(keccak256("set(uint256)")), _v));
    }
}

contract Callee {
    uint256 public v;
    event SenderIs(address);
    function set(uint256 _v) public {
        v = _v;
        SenderIs(msg.sender);
    }
}
```

- setByCall(42) -> Calleeのvが42にセットされ、SenderIsイベントに含まれるアドレスはCallerのもの。
- setByDelegateCall(43) -> Callerのvが43にセットされ、SendierIsイベントに含まれるアドレスはCallerCallerのもの
- setByCallCode(44) -> Callerのvが44にセットされ、SendierIsイベントに含まれるアドレスはCallerのもの

# delegatecallはなんのためにあるのか

delegatecallはライブラリを実現するためにある。コントラクトとしてインストールされたライブラリを使う際にライブラリ利用側の状態を参照・変更するため。

# callcode

msg.senderの問題があり非推奨。

# 参考ページ
https://ethereum.stackexchange.com/questions/3667/difference-between-call-callcode-and-delegatecall
ノリでfish使ってみたらええやん

君らお似合いやん、それハッピーやん。

以前からfishは良いよみたいな話は目にも耳にもしてたんで乗り換えを決意した話。

## 今まで使ってたshell環境
- macではzsh(oh-my-zsh)を使用
- 少々functionを書いている程度

つまり、全然使いこなせてないしoh-my-zshはもう古いとかなんとか。

### 導入前の印象はこんな感じ

- インストールが楽
- いじらなくてもある程度すぐに使える
- 補完性能が高い(予測変換的なの)
- シンタックスハイライトが働く(存在しないコマンドが赤くなる)
- 金魚可愛い

## 事前準備
HomeBrewを入れてない方はまず入れときましょー
https://brew.sh/index_ja.html

## インストール

``` bash
$ brew install fish
```

## 補完
下記のように`$ cd /u`まで打つと予測でグレーでガイドしてくれる
この状態で`→`キー押すとグレーの表示部分が自動で補完される。
(コマンド履歴があれば履歴、なければサジェストで補完)
初期状態でここまでしてくれるのは非常にありがたい
<img width="168" alt="スクリーンショット 2018-02-19 17.58.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/110716/c0206c71-0581-ab28-c3bb-a4720dfd702c.png">

## シンタックスハイライト
下記はtouchコマンドとtouchコマンドをtypoしたもの。
見てわかる通りtypoした方は赤くなり、そんなコマンドないと教えてくれている。
<img width="172" alt="スクリーンショット 2018-02-20 13.04.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/110716/7726c5ac-8812-fb21-6351-afd2844a4802.png">


## 設定
下記のコマンドでなんとブラウザが立ち上がりテーマ、プロンプト、コマンド履歴など各種設定ができる。(つよい)


``` bash
$ fish_config
```
<img width="1012" alt="スクリーンショット 2018-02-19 17.20.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/110716/6f1be3e7-fe46-2728-9901-c57d5bad0d92.png">
### 良い点
- カラー、プロンプトなど目視しながら変更できるので非常に分かりやすい
- vimとか絶対触りたくないマンでも設定いじれる

## 金魚
よくみたら全然可愛くなかった。金魚というより鯉的な感じ。
配色のせいで出目金的な感じに空目していた。
<img width="258" alt="スクリーンショット 2018-02-20 13.11.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/110716/9fd9a856-fdad-5b5c-6a81-3be93255a8fc.png">

## 軽く触ってみての感想
- 最初からかなり使いやすい。ユーザーフレンドリーとは聞いていたが初期でここまで使えるのはすごい。
- 補完の灰色表示は見たことが無かったので感動した。
- bashからshell変えたいけど設定よくわからんし、どれにしたらいいかわかんないって人には良い。
- linuxコマンドとか慣れていない初心者程使いやすいのではないかと思う。

## 注意点
パイプの書き方などが違うためbashで書かれたsrcriptの実行は正常に行われないと思っておいたほうが良い。
私は既存のscript動かす時だけはbashに切り替えて使ってます。

## その他
しばらくはお魚と一緒に開発していこうと思います。
オススメの設定やテーマなどありましたらぜひ教えていただければと思います。
pixiv小説をクロールしてみる

こんにちは。
先日ふと、pixiv小説をデータセットに使いたいと思いクローラーを作れないかなと思って作ってみました。

apiは[two/pixiv.py](https://github.com/two/pixiv.py)を利用します。
リポジトリをクローンしたのち作業はpixiv/で行います。



プログラムは指定したidから順番に1つづつ減らしていって取得しています。

- id
- 本文
- タグ

をsqliteに突っ込んでます。
errorが帰ってきたらerror文をみてapi制限エラーだったらsleepするようにしてます。

以下コードです。

``` crawl.py
# -*- coding: utf-8 -*-
from pixiv.auth import OAuthHandler
from pixiv.api import PixivAPI, AppPixivAPI
from pixiv.cursor import Cursor, AppCursor
from pixiv.utils import PixivDownload

import sys
import sqlite3
import time

import json

auth = OAuthHandler()
auth.login('id', 'pass')

aapi = AppPixivAPI(auth)
con = sqlite3.connect("novel.db")
cur = con.cursor()
cur.execute("""CREATE TABLE IF NOT EXISTS Novel(id int PRIMARY KEY,tag varchar(10000), text varchar(10000));""")

cnt=200000
while(True):
    try:
        novel=aapi.novel_text(novel_id=cnt)
        tagstr=''
        try:
            series_prev=novel.series_prev.id
            sprev=aapi.novel_text(novel_id=int(series_prev))
            for tag in sprev.series_next.tags:
                tagstr+=tag['name']+','
        except:
            pass

        try:
            series_next=novel.series_next.id
            snext=aapi.novel_text(novel_id=int(series_next))
            for tag in snext.series_prev.tags:
                tagstr+=tag['name']+',' 
        except:
            pass
        if(tagstr==''):
            cnt-=1
            continue
        con.execute("insert or replace INTO Novel VALUES(?,?,?)", (cnt,tagstr,novel.novel_text))
        sys.stdout.write("\r%d Download." % cnt)
        sys.stdout.flush()
        con.commit()
        cnt-=1
    except  Exception as e:
        try:
            if('該当作品は削除されたか、存在しない作品IDです。'==str(e.args[0]['error']['user_message']) or '該当作品の公開レベルにより閲覧できません。'==str(e.args[0]['error']['user_message'])or '公開制限エラーです。'==str(e.args[0]['error']['user_message'])):
                sys.stdout.write("\r%d Download." % cnt)
                sys.stdout.flush()
                cnt-=1
                continue
            elif('閲覧制限エラーです。'==str(e.args[0]['error']['user_message'])):
                novel=aapi.search_novel(word=str(cnt))[0]
                id=str(novel.id)
                tagstr=''
                for tag in novel.tags:
                    tagstr+=tag['name']+','
                con.execute("insert or replace INTO Novel VALUES(?,?,?)", (cnt,tagstr,aapi.novel_text(novel_id=id).novel_text))
                sys.stdout.write("\r%d Download." % cnt)
                sys.stdout.flush()
                con.commit()
                cnt-=1
                continue
            elif('Rate Limit'==str(e.args[0]['error']['message'])):
                print('sleep600')
                time.sleep(600)

        except Exception as e2:
            print(e2.args)
        print(e.args)
        cnt-=1
```
Ansible 2.5以降のNWモジュールのPersistent Connect


#Persistent Connect(2.4以前)について

Ansible 2.4以前のNWモジュールにはPersistent Connectという機能があり、
初回でSSHセッションを確立したらその後のPlaybook内の後続タスクや別Playbookにおいても
SSHセッションが引き継がれるので、セッション確立のオーバーヘッドが削減できてNW機器側にも負荷
かけずにNW機器へのコマンド投入ができる。

参照：akira6592さんのPersistentConnectionについて解説記事
[Ansible ネットワークモジュールの Persistent Connections 利用方法と注意点](https://qiita.com/akira6592/items/1cff739ee22e97baad61)

###2.4のPersistent Connectの問題について

2.4以前のPersistent Connectに関しては同一機器に対して、別々に実行するPlaybookでの同時実行に
問題があり、同一セッション上で処理を流すためステートの一貫性が崩れて処理エラーを起こす不具合があった。


[issueのページ](https://github.com/ansible/ansible/issues/31574)

#####概要
Playbook実行プロセスAおよびBが同一機器に対して、ほぼ同タイミングで実行していた。

> A) configure session 123 [global->conf]
    A) int eth 1/1 [conf->int eth 1/1]
    B) configure session 123 [int eth 1/1->conf]
    A) lacp priority 32768 [incorrect command for conf]
    B) int eth 1/2 [conf->int eth 1/2]
    A) abort [int eth 1/2 -> ?]
    B) lacp priority 32768 [incorrect command for ?]

→Bの「configure session 123」で、同一セッションなのでconfモードにステートが戻ってしまい、
    　Aの後続の「 lacp priority 32768」でコマンド実行が失敗してしまった。

→2.4以前では同一機器に対する複数Playbookの同時実行は担保されない仕組みとなっているので、
　上位側でシリアライズする機構の実装が必須となる。

#Persistent Connect(2.5以後)について

Ansible blogにて以下のアナウンスがあり、
2.5以降はplaybookごとにSSHコネクションが切断される仕様となる方針となった。
2.4で抱えていた問題を改修したため、複数Playbookでの同一機器への処理実行に関してはSSHコネクションの再利用性がなくなり、
セッション確立のオーバーヘッドおよびNW機器側へのコネクションの切断・接続の負荷がかかる仕様となっている。

以下、[Ansible blog記事](https://www.ansible.com/blog/coming-soon-networking-features-in-ansible-2.5)の原文

>    Additional SSH behavior improvements have also been included. With Ansible 2.3 and 
    2.4, the persistent SSH connection remained open for 30 seconds after
    the playbook completed. In Ansible 2.5, this socket is shut down
    immediately at the end of a playbook run. This removes the possibility
    that the socket could be exploited or misused by another program or process.



 
###当該のバグチケットおよびコミットログ
本方針になる過程には二つのコミットがあった。

socketファイルをPlaybookの実行プロセスIDごとに生成する改修のコミット
https://github.com/ansible/ansible/pull/33518

Playbookが終わるたびにPersistent Connectionを切るコミット
https://github.com/ansible/ansible/pull/32825
DockerToolbox on Windows上で【Windows以外のOSで構築された】docker imageがうまく動かない

# DockerToolbox on Windows上で【Windows以外のOSで構築された】docker imageがうまく動かない

## Issue
WSL上でDockerfile書いてdocker imageをつくって他のDockerToolboxを利用しているWindowsメンバーに渡したところrunできなかった
errorはなんとなく"\r"が悪いと書いてある

## Solution
DockerToolbox同梱のGitBashがdefaultでのinstallとなっているためWindowsでのUnix改行コードをうまく扱えていない様子
ゆえにgitの設定変更に加えてPJ全体の改行コードを一括返還する
- `git config --global core.autoCRLF false`
- `find . -type f -print0 | xargs -0 sed -i -e "s/\r//g"`

## Backgronud
c.f.
https://qiita.com/yokoh9/items/1ec8099696ade0c1f36e
laravel-dynamodb の find() は強い整合性での Read しかできない

## はじめに

強い整合性／結果整合性って何？という人は[AWS 公式 FAQ](https://aws.amazon.com/jp/dynamodb/faqs/)の「Amazon DynamoDB の整合性モデルとは何ですか?」を参照。

## 本題

2018/02/20現在、[laravel-dynamodb](https://github.com/baopham/laravel-dynamodb)における `find()` は強い整合性での Read しかできない。

https://github.com/baopham/laravel-dynamodb/blob/master/src/DynamoDbQueryBuilder.php#L425

`$query` の `'ConsistentRead'` が `true` で決め打ちになっている。

## `get()` の場合は？

指定した条件によって内部で `find()` が使われない限りは結果整合性での Read になるよう？（ちょっと自信なし）

https://github.com/baopham/laravel-dynamodb/blob/master/src/DynamoDbQueryBuilder.php#L584
golang　バリデート（validator.v9）

golang バリデート

[gopkg.in/go-playground/validator.v9](https://github.com/go-playground/validator)

バリデーションライブラリ利用してバリデート


###パッケージを取得

```
>go get gopkg.in/go-playground/validator.v9
```

####利用ソースファイルでパッケージのimport

```golang:main.go

import "gopkg.in/go-playground/validator.v9"

//
type DataUser struct {
  LoginID string `validate:"required,email"`
  Password string `validate:"required"`
}

```

| Tag | 説明 | 利用 |
|:-----------|:------------|:------------|
| required   | 必須        | --       |
| email   | メールアドレス　| --       |
| len   | 長さ　<br>数値であれば値、文字列であれば文字列長、Slice・配列・マップであれば要素数　| len=10      |
| min   | 最小値　<br>数値であれば値、文字列であれば文字列長、Slice・配列・マップであれば要素数　| min=1     |
| max   | 最大値　<br>数値であれば値、文字列であれば文字列長、Slice・配列・マップであれば要素数　| max=10    |
| minmax   | 最大・最小　| min=1,max=10       |
| lt   | より小さい　| lt=10       |
| lte   | 以下　| lte=10       |
| gt   | より大きい　| gt=10      |
| gte   | 以上　|  gte=10      |
| eq   | イコール　| eq=10       |
| ne   | Notイコール　| ne=10       |
| eqfield   | 他フィールドと同じ　| eqfield=ConfirmPassword       |


[公式ドキュメント](https://godoc.org/gopkg.in/go-playground/validator.v9)
schema.rbを更新する方法

ローカル環境で作業中、モデルを弄ってブラウザを更新してもモデルの更新が反映されない現象に遭遇。

#　原因
DBスキーマ（db/schema.rb）の更新が必要。

# スキーマの更新方法
`rake`で以下のコマンドを実行する。

```shell:CLI
$ bundle exec rake db:schema:dump RAILS_ENV=development
```

# 参考記事
[db/schema.rb は自動更新されない - 独学メモ](http://d.hatena.ne.jp/akiko74/20120819/1345359587)
Pandas データフレーム。列名Xの列中で重複する行を除いたデータフレームを作る方法。

Pandas データフレームから、「列名が"text"の列で重複するデータを除く」という条件でデータフレームを作る方法。

Aのように否定の論理演算子の~を使うとうまくいくが、Bのようにやろうとするとうまく行かない。
頻用しそうな操作にも関わらず、Bでやると失敗するため、メモ。

A: df[~df["text"].duplicated()]　

B: df[df["text"].drop_duplicates()]

参考サイト
https://note.nkmk.me/python-pandas-duplicated-drop-duplicates/
golang　共通のテンプレート利用

#golangで共通テンプレートを利用する方法

下記のようなHTML共通部分は別のテンプレートにしたい

```header.html
<!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>

  <div>
    maincontents
  </div>

</body>
</html>
```

ヘッダーテンプレート、フッターテンプレート、メイン部テンプレートを分割

```header.html
{{define "header"}}
<!DOCTYPE html>
<html lang="ja">
<head>
<body>
{{end}}
```

```footer.html
{{define "footer"}}
</body>
</html>
{{end}}
```

`{{define "header"}}`・・・でテンプレートをDefineする


```main.html
{{template "header" .}}
  <div>
    maincontents
  </div>
{{template "footer" .}}
```

メイン部でDefineしたテンプレートを呼び出し



```go:main.go
tmpl, err := template.ParseFiles("./main.html","./header.html", "./footer.html")
```
悪魔の呪文集

# 悪魔の呪文集
頭を使わず削除や停止をするコマンド集です。


## MySQL
実行中のプロセスを全て消し去る

```sql
$ select concat('KILL ',id,';') from information_schema.processlist where user='root'
```



## Docker
### 全てのコンテナを削除する

```bash
$ sudo docker rm -f  $(sudo docker ps -a -q)
```

### 全てのイメージを削除

```bash
$ sudo docker rmi -f $(sudo docker images -q)
```

## プロセス
バックグラウンドで動作している `node` の全プロセスを停止する

```bash
$ pkill node
# or
$ kill $(ps -ef | grep "node" | cut -d " " -f4)
```
TensorFlowのStatefulな変数でキューを作る

TensorFlowの`tf.Variable`型は主にネットワークの重みやバイアスを保持しておくために利用されますが、これを使ってデータ構造のキュー(Queue, 待ち行列)を作ることもできます。このような使い方があることは、PixelCNNの生成過程を高速化したRamachandran氏の[Fast PixelCNN++](https://github.com/PrajitR/fast-pixel-cnn)のコードを読んでいて知りました。変数は初期化かOptimizerによる更新以外では値を変えるものではないと思っていた僕には目から鱗でした。

以下が、自分で試してみたコードになります。TensorFlowはバージョン1.5を使いました。`delay`関数で長さ3のキューと、それの先頭から要素をポップするオペレータを定義しています。

```python


import tensorflow as tf
import numpy as np

def delay(x, n=3):
    queue = tf.Variable(initial_value=np.zeros(n, dtype=np.float32), name='queue')
    head, tail = queue[0], queue[1:]
    pushed = tf.concat([tail, x], 0)
    assigned =  queue.assign(pushed)
    with tf.control_dependencies([assigned]):
        return assigned, tf.identity(head)

x = tf.placeholder(name='input', shape=(1), dtype=tf.float32)
queue, pop = delay(x)

sess = tf.Session()
sess.run(tf.global_variables_initializer())
```
```python
sess.run(queue, feed_dict={x: np.array([1.0], dtype=np.float32)})
```
> array([ 0.,  0.,  1.], dtype=float32)

```python
sess.run(queue, feed_dict={x: np.array([2.0], dtype=np.float32)})
```
> array([ 0.,  1.,  2.], dtype=float32)

```python
sess.run(queue, feed_dict={x: np.array([3.0], dtype=np.float32)})
```
> array([ 1.,  2.,  3.], dtype=float32)

```python
sess.run(pop, feed_dict={x:np.array([0.0], dtype=np.float32)})
```
> 1.0

```python
sess.run(pop, feed_dict={x:np.array([0.0], dtype=np.float32)})
```
> 2.0

```python
sess.run(pop, feed_dict={x:np.array([0.0], dtype=np.float32)})
```
> 3.0

`tf.control_dependencies`を使って、ポップしたときにキューが更新されるようにしている点が少しトリッキーかもしれません。同じ入力に対して結果が異なることがあり扱いには注意が必要ですが、使い所によっては便利だと思います。`tf.FIFOQueue`というのもあり、そちらは並列処理での用途が念頭に置かれているようです。
StrongParameterに#to_hashしたら警告が出たよ

ネストしたStrongParameterを整形したかったので `params[:hoge].to_hash`したらなんか警告が出ました

## 環境
* OSX
* Ruby 2.3.1
* Rails 5.0.4
* puma 3.9.1

## 警告文曰く
```rb

pry > params[:hoge].to_hash
DEPRECATION WARNING: #to_hash unexpectedly ignores parameter filtering, and will change to enforce it in Rails 5.1. Enable `raise_on_unfiltered_parameters` to respect parameter filtering, which is the default in new applications. For the existing deprecated behaviour, call #to_unsafe_h instead. (called from map at (pry):11)
```
あーね。
StrongParameterのフィルタリングをシカトしてる推奨されないやり方だから別メソッドで対応しなさいと。
Rails5.1だと別メソッドが提供されてるからそっち使ってちょということでした

```rb

pry > params[:hoge].to_unsafe_h
```

上記の`to_unsafe_h`メソッドで解決
まあ警告文みたらわかるけど、備忘録としてメモ。

## 追記2019/3/19

Rails5.2からStrongParameterに対して`to_hash`を行うとデフォルトでエラーになるようになりました。

そのため、以下の手続きが必要です。

```rb
# permitしたパラメータに対してto_hashを行う
params.permit(:hoge).to_hash
```

paramsに対してmapなど使いたい時に是非。
Vuexでのaction, mutationの引数指定での注意点

Vuexで削除(`destroy`)のActionを定義し、こんな感じで実行した場合

```js
// 正しくない呼び出し方
this.$store.dispatch('destroy', id, index)
```

actionメソッドの第２引数までしか使用できず、第３引数はundefinedになってしまいます。

※この部分：　``destroy ({ commit, state },　id, index) {``


```js
const actions = {
  // 引数定義が正しくない
  destroy ({ commit, state }, id, index) {
    return new Promise((resolve, reject) => {
      Bank.delete(id, data => {
        if ( data.error === null ) {
          commit(types.REMOVE_BANK, index)
          resolve(data)
        } else {
          commit(types.REQUEST_ERROR, data.error)
          reject(data.error)
        }
      }).catch((error) => {
        commit(types.REQUEST_ERROR, error)
        reject(error)
      })
    })
  },
},

const mutations = {
  [types.RECEIVE_BANKS] (state, banks) {
    state.banks = banks
  },
  [types.REMOVE_BANK] (state, index) {
    state.banks.splice(index, 1)
  },
}
```

以下のように修正する


```js
this.$store.dispatch('destroy', {id: id, index: index})
```

```js
const actions = {
  destroy ({ commit, state }, { id, index }) {
    return new Promise((resolve, reject) => {
      Bank.delete(id, data => {
        if ( data.error === null ) {
          commit(types.REMOVE_BANK, index)
          resolve(data)
        } else {
          commit(types.REQUEST_ERROR, data.error)
          reject(data.error)
        }
      }).catch((error) => {
        commit(types.REQUEST_ERROR, error)
        reject(error)
      })
    })
  },
}
```

```js
const mutations = {
  [types.RECEIVE_BANKS] (state, banks) {
    state.banks = banks
  },
  [types.REMOVE_BANK] (state, index) {
    state.banks.splice(index, 1)
  },
}
```

mutationも同様です。

```js
const actions = {
  destroy ({ commit, state }, { id, index }) {
    commit(types.REMOVE_BANK, {id: id, index: index})
  }
}
const mutations = {
  [types.REMOVE_BANK] (state, { id, index }) {
    state.banks.splice(index, 1)
  },
}
```
Elasticsearchのindex sortingをdate型で試してみる

# 環境

- Elasticsearch 6.2.0
- Ubuntu 17.04
- 1000万イベントをbulkで追加
- mapping
    - date: date
    - date2: date
    - name: keyword
    - code: long
- index.setting
    - sort: date
    - order: asc

# 検索

- index sortingなしと比べて、同ソート順だと効果がある
    - search sort:asc
        - 40 ms -> 10 ms に短縮
- 逆順では見られない
    - search sort:desc
        - 40 ms -> 40 ms で変わらず

# その他数値

- インデックス化にかかる時間
    - それほど変わらず
- ヒープ
    - sortingしてる方が20MBほど大きい
- ディスクサイズ
    - あまり変わらず
【#HTTF】競プロの3Dビジュアライザーを作った話

2018年02月17日に[Hack To The Future ](https://future-contest-2018-qual.contest.atcoder.jp/) (#HTTF)というマラソン形式の競技プログラミングコンテストの予選が開かれました。
参加していただいた皆さんありがとうございます。


今回、この#HTTF向けにビジュアライザーをつくりました。

# ビジュアライザー
問題が「山型足し算」という縦・横・高さの解が求められるものだったため、ビジュアライザーも3次元の方が見やすいなと思い、こんな感じで作ってみました。
ピラミッドを積み上げて正解データに近づけてね。赤が正解と合致したところ、白が足りないところ、青が多すぎるところだよ、という感じです。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/26383/489b2b58-5dc0-9cd8-2b31-8f2251d5b5ea.png)

青と白（過剰・不足分）だとの描画モードもあります。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/26383/a52681f2-09f3-773e-e923-687711cda20e.png)

## 構成要素
Webで3Dということで、Three.jsというWebGLが手軽に扱えるようになるライブラリを使っています。  というかほぼThree.jsママ。
5年ぶりくらいにThree.jsを触ったのですが、メソッド名で検索したときに日本語ドキュメントと日本語のブログが沢山出てきて感動しました。ホントありがたい。

配置したオブジェクトも、赤・白・青の直方体、カメラ、ライト、座標の文字、補助線くらい。

## 軽量化
予想される回答は 100*100*20000くらいのモデルなのですが、構築開始直後はボクセルで表現しようとしてメモリ不足でブラウザが落ちました。2億個のMeshをIntel HD Graphicsで描画できるわけ無いです。

いろいろ調べた結果、[こちら](https://ics.media/tutorial-three/geometry_merge.html)の記事を参考にしまして、最終的には赤・白・青ごとにGeometryで固めて描画しました。2億Meshが3つまで減りました。すごい。

あとはデータを入れ替えるごとの初期化処理の見直しや[メモリ解放](https://github.com/mrdoob/three.js/issues/5175)等で動作の軽量化を図っています。
とはいえ頑張ればまだ軽量化できる気がする。


# 参加者の反応
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ビジュアライザが3Dでグリグリできてすごい <a href="https://twitter.com/hashtag/HTTF?src=hash&amp;ref_src=twsrc%5Etfw">#HTTF</a></p>&mdash; odan (@odan3240) <a href="https://twitter.com/odan3240/status/964751435630919681?ref_src=twsrc%5Etfw">2018年2月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ビジュアライザでいくつかテストして全部形一緒なことに気付いてからは割と早かった</p>&mdash; ㅤ (@my316g) <a href="https://twitter.com/my316g/status/964877124996759553?ref_src=twsrc%5Etfw">2018年2月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/HTTF?src=hash&amp;ref_src=twsrc%5Etfw">#HTTF</a> ビジュアライザのおかげで「丸み」がすごく良く分かりました</p>&mdash; fal_rnd@崖 (@fal_rnd) <a href="https://twitter.com/fal_rnd/status/964875703412903938?ref_src=twsrc%5Etfw">2018年2月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

思ってた以上に好評だったようでホッとしました。

とはいえ、いくつかのバグ報告や描画が重たいという意見も頂いたので今後に活かしたいところです。

# 次回

2018/03/03（土）に、同コンテストHack To The Futureの本選が開催される予定です。
えっ… 来週末ですか。ビジュアライザーの実装間に合うかな…。
Pepper で簡単なロボアプリを作る


# Pepper 開発ツールのインストール

Choregraphe（コレグラフ）はドラッグ&ドロップのみで簡単なロボアプリ開発が可能なデスクトップパッケージです。
プラットフォームは、Windows、Mac、Linuxが用意されている。

下記のURLよりGUI開発ツール Choregraphe 2.5.5(Latest)をダウンロードして、インストールします。
https://developer.softbankrobotics.com/jp-ja/downloads/pepper

途中でライセンスキーの入力を求められるので、上記URLに記載されている無償ライセンスキーをコピー＆ペーストして入力してください。

Choregrapheのインストールが無事に完了すれば、起動して、以下のような画面が表示されます。
![Choregraphe-01.png](https://qiita-image-store.s3.amazonaws.com/0/239292/c48a9220-d2b3-fbe3-3ee9-15acdf29e056.png)

画面右上の「ロボットビュー」に表示されている仮想ロボットがPepperと異なる場合は、メニューから「編集」→「設定」を選び、「バーチャルロボット」タブをクリックするとロボットのモデルが表示されるので、リストの中から「Pepper Y20(V16)」選択すればOKです。
![Choregraphe-02.png](https://qiita-image-store.s3.amazonaws.com/0/239292/c69fa672-9667-e11b-53ef-8559d9c5a7a6.png)

# Pepperの接続
１PC（コレグラフ）に１台のペッパーが接続できます。
![Choregraphe-05.png](https://qiita-image-store.s3.amazonaws.com/0/239292/5a73e6a8-6d78-3831-86da-6129eedf9e4a.png)
※Pepperの胸のボタンを一度押すと名前と接続IPアドレスを教えてくれます。

# Choregrapheで開発してみる
Choregraphe画面中央の一番大きなエリア「フローダイアグラム」パネルで、命令の基本単位となる「ボックス」を並べて、アプリを構築していきます。

「フローダイアグラム」パネルに、左下の「ボックスライブラリ」パネルに格納されている、ボックスをドラッグ＆ドロップで「フローダイアグラム」に貼り付ける。ボックスの左右両側に並んでいる小さな四角は入出力ポートで、マウスをクリックしながらドラッグするとポート同士を線でつなぎます。
まずはPepperに何かしゃべらせたいときは、「Set Language」ボックスと「Say」ボックスを使用します。
「Set Language」ボックスをドラッグし、左下のスパナの絵をクリックして、言語を「Japanese」に変更。そして「Say」ボックスをドラッグしし、左下のスパナの絵をクリックして、「Text」ボックスにセリフを入力する。たったこれだけなので、慣れれば1分もかからない。
![Choregraphe-06.png](https://qiita-image-store.s3.amazonaws.com/0/239292/124c5cd5-26dc-1616-fcc6-6f2505108af9.png)
※注意“~”は使うことができない。ひらがな、漢字、カタカナでニュアンスが変わる。

最後は「再生」で接続されているPepperに転送して、本体の音声合成機能でしゃべらせる。
![Choregraphe-07.png](https://qiita-image-store.s3.amazonaws.com/0/239292/2554a218-39c8-fd26-954f-0eae3451e703.png)
Tensorflow + Keras で定義域外の数値が返ってきた件

# 注意
解決はしてません。が、こういう事もあり得るんだという認識の情報共有です。

# 学習中にどうしても解決できないnanがでた
こんなネットワークを学習してました。（かなり簡略化しています。）

```
from keras.models import Model
from keras.layers import Dense, Activation, Input
import keras.backend as K

inputs = Input(shape=(5, ))
mid_layer = Dense(2)(inputs)
tanh = Activation('tanh')(mid_layer)
outputs = K.sqrt(0.5 * (1.0 + tanh) + K.epsilon())
model = Model(inputs, outputs)
```

ミソになるのは`outputs`の行です。計算の内容はともかく、`-1.0 < tanh(x) < 1.0`が満たされるのであれば`0.0 < 0.5 * (1.0 + tanh) < 1.0`になるのは自明かと思います。`K.epsilon()` を足しているのは $\sqrt x$ が原点で学習できないため微小量を足して避けていました。（ https://qiita.com/Mco7777/items/2bae29e6e0793f9c376b#sqrt ）

ところがこれでも学習中、しかも学習がかなり進んだ時に時折計算結果にnanが紛れ込み相当悩みました。

結論、nanが出た直前のモデルを保存しておいて1つずつ追った所上記コードの`tanh`の出力がなんと`-1.0000002`となっていました。Pythonで小数を扱う時に厳密に一致しない事は知っていますが、それはもう少し小さいオーダー（少なくとも`K.epsilon() = 1e-7`よりは誤差の範囲）での話だと思います。

さらに直前のレイヤーの出力をnumpyのtanhに放り込んでみましたがやはりどれだけ大きくても、極端な話`np.tanh(np.inf)`でも1.0なのでTensorflowのtanhの計算ロジックに定義域外の数値が入り込むロジックが僅かながらの可能性ながらあるんだと思います。

※ tfdbgを使おうとも思ったのですが、ネットワークが大きくデバッグモードだと1エポックの学習にとんでもなく時間がかかってしまった事と、Tensorの名前が`~~~/Adam/Add_2/~~~`と`~~~/Adam/add_2/~~~`という大文字小文字が食い違ってNot Foundみたいな謎エラーが発生したので諦めました… 後者についてはtfdbgのソースコードを追ってログ等出して調べてみたのですが、最小の構成での再現方法がどうしても分からなかったので（無駄に大きくなったモデルでは出たが、構成は同じはずのユニット数が小さいモデルだと発生させられなかった）、詳しい方いたら教えてもらえると嬉しいです。

# 考察

とにもかくにも、こういう可能性があると「知っている」か「知っていない」かで発見までの時間は大きく変わってくると思うので、頭の片隅に置いておくといつか役に立つかもしれません。私は1ヶ月以上悩みました。（本業で書いているコードではないという事もありますが）

原因も調べようと思ったのですが、結果的に調べきれませんでした。Tensorflowのソースコードでは活性化関数の処理が `gen_math_ops` とかいうgit上には存在しないモジュールに投げられています。ローカルにインストールしたディレクトリの中を探すと定義しているファイルが存在しているので、インストール時に自動生成されるような仕組みになっているんだと思うのですが、それのせいで正直tanhの計算がどういうロジックになっているのかが追いきれませんでした。
多分generateされる元となるソースコードがあると思うのですがもし知っている方いたら教えてください。
【JavaScript】Ajax（非同期通信）でAPIと通信する（要jQuery）


# Ajax（非同期）を使ってAPIと通信したい

ボタンを押すたびに非同期でAPIに値を送信したいときあるかもしれません。~~ぼくはいまのところないです。~~
したいときあるかなーと思って書いてみたので残しておきます。

例によってPOST送信するAPIはこれ→[【PHP】とりあえずAPIのスタブをパパっと作る - Qiita](https://qiita.com/sola-msr/items/609677e6e57e7f126487)
# AjaxでPOSTする実装
お前いつもjQueryつかってんなていわれるかもしれませんが許してください。

```post.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>AjaxAPI</title>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script type="text/javascript">

        function sendPostToApiByAjax()
        {
            $.ajax({
                type:     "POST",
                url:      "https://*******************/api.php",
                // username: "*****", // Basic認証用ユーザー名
                // password: "*****", // Basic認証用パスワード
                data: {
                    name : 'ajaxAPI' // リクエストパラメータ
                },
                xhrFields: {
                    withCredentials: true
                },

            }).done(function(data) {

                console.log('Successful communication with API!');

                console.log('ReturnParameter:' + data['name']);

            }).fail(function(data) {
                console.log('Ajax fail (communication error)');
            });
        }

        </script>
    </head>
    <body>
        <button type="button" name="post" onclick="sendPostToApiByAjax();">非同期POST</button>
    </body>
</html>
```

[スタブAPI](https://qiita.com/sola-msr/items/609677e6e57e7f126487) に対してPOSTした際に吐き出されるlogはこんな感じ↓

```log.txt
【→API】RequestParameter:ajaxAPI'
【←API】ReturnParameter :{"name":"ajaxAPI_RECEIVED","date":"2018-02-19 13:41:26"}
----------
```

# おわり
- クロスドメイン問題やらがむずかしいすね。
- [スタブAPI](https://qiita.com/sola-msr/items/609677e6e57e7f126487) には`Access-Control-Allow-Origin`を記述してます。
- なにかご指摘あればお願いいたします。

# 参考
- [クロスドメイン問題と Access-Control-Allow-Origin ヘッダ : まだプログラマーですが何か？](http://dotnsf.blog.jp/archives/1063051117.html)
- [Access-Control-Allow-Originエラーの対処法(PHP+JQuery )](https://www.crunchtimer.jp/blog/technology/jquery/330/)
- [PhoneGapアプリでBasic認証を使ったサーバ通信を行う方法 | ADC - Adobe Developer Connection](https://www.adobe.com/jp/devnet/phonegap/articles/phonegap_external_host.html)

などなど
IBM Cloud Configuration error

IBM Cloud (Bluemix)で アプリケーションを作ろうの補足

ログインで失敗した場合

問題
![Ex-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/309b7e00-caa5-1d48-265b-ec78db0c9fe4.jpeg)

loginを試みるが、認証中です...の後、失敗。英語のメッセージで何が問題なのか不明？
何を言っているかというと大体下記の内容
「config.jsonを保存できません...（要求された操作は、ユーザーマップセクションが開いているファイルでは実行できません）。」

原因
これは、一部のウイルス対策ソフトウェアまたはマルウェア対策ソフトウェアが実行されているときに発生します。 
たとえば、一部のバージョンのMicrosoft Security Essentialsでこの問題が発生する可能性があります。

問題の解決
ウィルスバスターの場合は、config.jsonの保存されるディレクトリをウィルススキャン対象外から除外します。


![Ex-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/4d19852d-73be-4708-af85-caec04615bed.jpeg)

設定を選択

![Ex-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/25d02907-ab00-77f7-7932-086b7b202ea5.jpeg)

例外設定を選択

![Ex-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/037107dd-f4ed-9daf-b686-ec9c61bbe999.jpeg)

c:\ユーザ\アカウント\\.blumixディレクトリをウィルススキャンの除外登録します。

![Ex-6.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/bef1b74c-8042-5cf9-c0e9-a8440f468971.jpeg)

無事ログインできました。
ansibleでサーバの構成情報を取得する

#目的
複数のLinuxサーバからOS周りの構成情報を一気に収集する。

#コマンド
```
ansible all -m setup -i hosts.lst --tree /tmp/ansible_facts
```

```hosts.lst
192.168.56.101
192.168.56.102
192.168.56.103
```

/tmp/ansible_facts配下に、IPアドレス名でJson形式のファイルが出力される。
PHPで３つ以上の値が全て等しいかどうか判定するときの簡単な書き方

値が2つであれば == や === で比較すればいいけれど、3つ以上となるとグッとハードルが上がる気がします。

2つの関数を使って、簡単に比較ができるので、紹介します。


# 全ての値をまずは配列に
値がバラバラのところにある場合、一旦全て配列に入れてしまいます。

`$numbers = [1,1,3,4,5];`

# 2つの関数を使う 
```php:sample.php 
$numbers = [1,1,3,4,5];

if (count(array_unique($numbers)) == 1) {
// 等しい
    return true;
} else {
// 等しくない
    return false;
}
//結果 false
```

#解説

`count`は、変数に含まれる要素を数える関数です。
`array_unique`は、配列から重複した値を削除する関数です。

つまり、array_uniqueで、重複された値が削除され、countで1になれば全ての値が等しいという結果になります。

経緯を書くとこんな感じ。

```php:sample.php 
$numbers = [1,1,3,4,5];
// array_unique($numbers); → $numbers = [1,3,4,5];
// count($numbers); → 4 

if (count(array_unique($numbers)) == 1) {
// 等しい
    return true;
} else {
// 等しくない
    return false;
}
//結果 false
```
冒険に出てみた（RubyでHTML、CSS、JSを 統一してみた）

#旅立ち（なぜ旅立たなければいけないのか？）
かつて人間は、"一つ"の言葉を使っていたという。
しかし、その傲慢さ故に”バベルの塔”を建築し...。
時はながれ現在、Webページを作成するのにHTML、CSS、JSと異なる３つの言語を使うことになった。

旅にでる必要なんてなかった。~~（時間があった、暇だなー）~~
若ハゲのいたり、そうだ！旅に出てみよう！

# 冒険の目的
はたしてHTML、CSS、JSをRubyで統一的に記述することが可能であるか？

# Jabverwockとは
Webページを構成するためのRubyのコードです。
HTML、CSS、JSをそれぞれClassとして表現してみました。

GitHub: [Jabverwock](https://github.com/object-kazu/Jabverwock/)にまとめています（まとめ中）。

Jabverwockを使ったもっとも簡単なコードは以下のようになります。

```ruby:test.rb

require 'jabverwock'

class Test
 include Jabverwock

 doc = DOCTYPE.new
 doc.pressConfig(name: n, dist: ~/path/)
 doc.press
 
end

Test.new

```

```shell-session

$ ruby test.rb

```

```html:n.html


<!DOCTYPE html>

```
# CSSはウォーミングアップ

CSSはクラスとして実装しています。


```ruby

    heading = HEADING.new(1).contentIs "Home page"
    heading.css.color("green")
```

または

```ruby
    heading = HEADING.new(1).contentIs "Home page"
    c = CSS.new.font_size(10)
    heading.addCss = c

```

# JSは難攻不落の化物だ

JSもクラスとして実装。
ゴニョゴニョ感がすごく、開発した本人もわからん orz.
「JSとは何か？」まで遡ってスクラッチで書き直す覺悟が必要かと。

```ruby
#sample.rb

	...
	
    html = HTML.new

    header = HEAD.new
    title = TITLE.new.contentIs "hello world"
    header.addChild title
    
    header.js.doc.write("hello!")
    
    body = BODY.new
    body.js.doc.write("new world")
    
    html.addChild header
    html.addChild body

	...

```

```html
<- ~/path/result.html ->

<html>
    <head>
	<title>hello world</title>
    </head>
    <body>
	<script>
	 document.write('hello!');
	 document.write('new world');
	</script>
    </body>
</html>

```
# 真珠(Opal)の装備を手にしたが。。。
JabverwockのコードからOpalを読み込むことができます。

```ruby
      oo = JW_CSS_OPAL_JS.new
      oo.readOpalFile testPath
      oo.pressTo(name: 'read_OPal_file_indexPressed2.html', dist: myPATH)
```

しかし、”豚（Jabverwock）に真珠”感が否めません。

# Sinatra with Jabverwock
生成したHTMLは以下のように表示させます。

```ruby:app.rb
require 'sinatra'
require 'sinatra/reloader'
require 'jabverwock'

get '/' do
  pp = P.new.contentIs "jabverwock come!"
  title = "indexPressed"
  pp.pressTo(name: "#{title}.erb", dist: "./views/")
  erb :indexPressed
end

```

```http:localhost:4567
　＜ｐ＞jabverwock come!＜／ｐ＞

```

#エンディング（結論と言うより反省）
- そこそこ統一はできそうだ。・・・が、Never Ending Story:alien:
- Sinatraから使用した場合、遅いことを確認。
- HTML,CSS,Jsの知識は必要だ。
- Jsの表現方法は改善したい。
- そもそもいちいちnewとか書きたくない

# Monster（課題・意見）募集
- 最低限こういうHTML、CSS、JSが表現できないと使えない
- JSの実装はこうあるべき
- こういうコードでないとメリットがない
- これができればメリットがある

などなど募集しております。
CentOS7初期設定

EC2でCentOS7を立てる時のメモ書き

## ホスト名
```shell
sudo hostnamectl set-hostname ホスト名
```
## タイムゾーン
```shell
sudo timedatectl set-timezone Asia/Tokyo
```

## パッケージ更新

```shell
sudo yum update -y
```

## Locale設定

```shell
sudo localectl set-locale LANG=ja_JP.utf8
```


## gitインストール

```shell
sudo yum install -y git
```

## dockerインストール

```shell
sudo yum remove docker \
     docker-common \
     docker-selinux \
     docker-engine
    
sudo yum install -y yum-utils \
     device-mapper-persistent-data \
     lvm2

sudo yum-config-manager \
     --add-repo \
     https://download.docker.com/linux/centos/docker-ce.repo

sudo yum install docker-ce
```

## seliunx 停止
```shell
sudo setenforce 0
sudo sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
```
Ctrl+Cで抜けられるCLIツールの雛形 (golang)

- `Ctrl+C` したら (`signal.Notify`)
- メインの処理をキャンセルして (`context.WithCancel`)
- メインの処理の終了を待って (`sync.WaitGroup`)
- 後片付けをしてから終了する (`exitChan`)

<br />

```go
package main

import (
	"context"
	"flag"
	"log"
	"os"
	"os/signal"
	"sync"
	"syscall"
)

var (
	f = flag.String("f", "default value", "explain for f")
)

func main() {

	logger := log.New(os.Stdout, "[cli-tool]", log.Ldate)

	ctx, cancel := context.WithCancel(context.Background())
	var wg sync.WaitGroup

	//
	// main code here
	//

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()

			for {
				select {
				case <-ctx.Done():
					return
				default:
					logger.Println("something done !")
				}
			}

		}()
	}

	//
	// signal handling
	//

	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan,
		syscall.SIGHUP,
		syscall.SIGINT,
		syscall.SIGTERM,
		syscall.SIGQUIT)

	exitChan := make(chan struct{}, 1)
	go func() {
		<-sigChan

		cancel()
		wg.Wait()

		//
		// clean up code here
		//

		exitChan <- struct{}{}
	}()

	<-exitChan
}
```
SpringWebMVCでのリクエストからレスポンスまでのざっくりした流れを理解する

Springを使う上で、処理の流れをある程度理解できていないと色々困ることが多かったので、自身のメモも兼ねてソースを読んだ内容をまとめておきます。

# DispatcherServlet
すべてのリクエストがこのServletの処理を実行します。
処理の流れを追いかけるには、doServiceメソッドからソースを眺めていけばいいと思います。

このServletが後続の処理（Controllerなど）を呼び出したり、JSPなどを利用してレスポンスを生成するために、
以下のようなBeanが必要となります。

* HandlerMapping
* HandlerAdaptor
* HandlerExceptionResolver
* ViewResolver
* LocaleResolver
* ThemeResolver
* MultipartResolver
* FlashMapManager

大まかな処理の流れとしては、以下のようになります。
1. HandlerMappingを利用して、リクエストから後続の処理を取得する。
2. HandlerAdapterを利用して、1で取得した処理を実行する。
3-1. 処理2を実行した結果、例外が発生しなかった場合は、ViewResolverを利用して、2の処理結果からViewを取得し、描画処理を実行する。
3-2. 処理2を実行した結果、例外が発生した場合は、HandlerExceptionResolverで発生した例外を処理するメソッドを取得し実行する。

# HandlerMapping
getHandleメソッドでリクエストから後続の処理を取得し、HandlerExecutionChainを返却します。
HandlerExecutionChainはhandler(後続のControllerメソッド)だけでなく、複数のInterceptorも含めて保持することができます。
DispatcherServletはこのHandlerExecutionChainを利用して、Interceptorやhandlerを実行しています。

このインターフェースの実装でよく利用するクラスが、RequestMappingHanlderMappingクラスです。
このクラスはControllerクラスの`@RequestMapping`の内容をもとに、リクエストと処理を結びつけます。

# HandlerAdapter
HandlerMappingで取得したhandlerを実行するためのAdatpterクラスです。
handler実行前、実行後にいい感じに処理を行います。（ざっくり）

このインターフェースの実装でよく利用するクラスが、RequestMappingHandlerAdapterクラスです。
リクエストパラメータをオブジェクトに格納したり、Validationを行ったり、handlerの戻り値からModelAndViewを生成したりしてくれます。
（厳密には、HandlerMethodArgumentResolverやHandlerMethodReturnValueHandlerに処理を委譲していますが。）

# HandlerExceptionResolver
例外が発生した場合、その例外と後続処理を結びつけます。

このインターフェースの実装でよく利用するクラスが、ExceptionHandlerExceptionResolverクラスです。
ContollerやControllerAdviceで`@ExceptionHandler`を付与したメソッドは、このクラスから実行されます。
ちなみに中身を確認するとわかりますが、ControllerとControllerAdviceに同じ例外を処理する`@ExceptionHandler`がある場合は、Controller側が優先されます。

# ViewResolver
ViewNameからViewクラスを取得することができます。

このインターフェースの実装でよく利用するクラスが、InternalResourceViewResolverクラスです。
このクラスはViewNameからJSPを描画するためのJstlViewを取得することができます。
また、ViewNameに"redirect:"というprefixが設定されている場合は、リダイレクト処理を行うためのRedirectViewを生成したりします。

# LocaleResolver
リクエストからLocaleを取得することができるそうです。
利用したことがないので詳しいことはわかりませんが、SessionLocaleResolverを利用すれば、SessionにLocaleの情報を保持できるので、利用者ごとのLocaleを管理することができそうです。

# ThemeResolver
リクエストからThemeを取得することができるそうです。
そもそもSpringのThemeというものを利用したことがないので、詳しくはわかっておりません。。

# MultipartResolver
multipart/form-dataリクエストからMultipartFileを生成するためのインターフェースです。
ファイルアップロードなどの機能が必要な場合には、このResolverをBean定義する必要があります。

# FlashMapManager
FlashScopeを管理するためのインターフェースです。FlashScopeはリダイレクト先まで値を保持するためのスコープです。
通常はSessionFlashMapManagerを利用し、Sessionを利用してFlashScopeを実現しています。
仕組みについてはこちらにさらっと書いていますので、よろしければご参照ください。
[SpringMVCでRedirectAttributesを使用せずにリダイレクト先に値を渡す](https://qiita.com/d-yosh/items/98acd27a396042b0c139)
2つのデータフレームを何となく近い時間同士でJOINする

###前置き
R wizard な皆様でしたら一瞬で書けるようなコードかもしれませんが、ここらへんのアルゴリズムなんて情報処理の授業で聞いて20年経過していてすっかり忘却していて数時間かかってしまいました、、のコードです。

###目的
行動情報のDF(ma.df_eff)と位置情報のDF(gps.df)があり、それぞれ全く別の粒度で日時を文字列で持っている場合に、JOIN（片方のDFにもう片方のカラムを結合）させます。

###おススメ(NN法を使用)
RANNというライブラリはANN("nn"とありますがニューラルネット一派ではなくn近傍)をC++実装したライブラリをRに移植したものです。nn2()を使用すると近傍ソートが高速に行えるのと、INPUT/OUTPUTをそれぞれベクトルで渡せます。

```R:
library(RANN)

#基準時間を決めておきます
base_datetime <- as.POSIXct(min(ma.df_eff$startDate))

#比べるベクトル（elapsed_time、経過時間）を作成
ma.df_eff$elapsed_time <- as.numeric(difftime(as.POSIXct(ma.df_eff$startDate),base_datetime,units = "secs"))
gps.df$elapsed_time <- as.numeric(difftime(as.POSIXct(gps.df$startDate),base_datetime,units = "secs"))

#近傍の算出
nearest <- nn2(gps.df$elapsed_time, ma.df_eff$elapsed_time, k=1)

#近傍値の挿入
ma.df_eff$latitude <- gps.df$latitude[nearest[['nn.idx']]]
ma.df_eff$longitude <- gps.df$longitude[nearest[['nn.idx']]]
```

###いまいち版(which.minをループ)
とりあえず書いたけどコレジャナイとモヤっていたコードです。多分DFが数万行同士とかになった瞬間に爆死します。

```R:近傍を探すところのみ抜粋
ma.df_eff$latitude2 <- 0
ma.df_eff$longitude2 <- 0

for(i in 1:nrow(ma.df_eff)){
  ma.df_eff$latitude2[i]  <- gps.df$latitude[which.min(abs(ma.df_eff$elapsed_time[i]-gps.df$elapsed_time))]
  ma.df_eff$longitude2[i] <- gps.df$longitude[which.min(abs(ma.df_eff$elapsed_time[i]-gps.df$elapsed_time))]
}
```
データサイエンティストとして面接を受けてみた

３社受けてみたのでその結果と経緯をつらつらと書いていきたい。
因みにコンサル系の会社で３年程分析、博士として応用数理の研究をしていた。

# 1社目　Webメディア系の会社
３社の中で唯一コーディング試験があった。コーディングは無事クリアーし、履歴書・職務経歴書・コーディング能力（R）を問われた。
面接で聞かれた事

1. Python能力
コーディング試験はRのサンプルデータで予測モデルとその学習などを行えだったので、Pythonを確認がてらなのか聞かれた。ただし聞かれた事はスクレイピング系統と２と３系の違いがメインとDjangoの質問ばかりだった。

2. 会社でやりたい事
どうゆう風にやっていきたいかや仕事の進め方を聞かれた。

3. SQL関係の話
いくつか確認された。

恐らくこの会社はまだデータ分析で何かよりも開発が中心という事もありDjangoの話がメインだったのとどちらかというとweb系のとりあえず実装がメインでモデリングをメインではなくとりあえず何か分析関連で実装を進めてるのが多いイメージだった。


# 2社目　通信系の事業会社

1. マネジメント能力
どれぐらい過去に部下を持ったかや複数の部署との交渉をどうまとめたかを主に聞かれた。

2. 企画力
実装よりもどういった企画を行ってきて、どうゆう利益に繋がってきたかを確認された。


他にもいろいろ聞かれたが、自分で分析出来なくなりそうだったため辞退した。

# 3社目　コンサル系の会社

1. 実装と統計知識
過去にどんな分析でプロジェクトを改善さしてきたのかを聞かれた。

2. 交渉力及び提案力
どういった企画を行ってきて、どうゆう提案をクライアントにし、どう利益に繋がってきたかを確認された。面白かったのはアナリストとデータサイエンティストはどう違うかと聞かれた。

3. フェルミ推定
コンサルはやっぱり好きらしくやっぱり聞かれた。
一応受けた感じではあったが、落ちてしまった。こればかりは仕方ない。

データサイエンティストとして各会社によって欲しい色は異なるようだった。Web系はやはりエンジニアに強く機械学習エンジニアが欲しく、事業会社は企画に強いタイプが欲しく、コンサル系は良くも悪くも玉石混交ではあったが、データサイエンティストとしてのアドホックな分析ができるかどうかの地頭を見られていたようだった。

１社目に行こうか悩んだが、フリーでお話を途中で頂いたため辞退し、今に至る。
sympy で 多項式の係数を取り出す

===========================


$$
f = 2 x^3 + x + 5
$$
のような多項式があって、$x^n$ の係数を知りたい。

## coef

方法1: coef メソッド

```python
import sympy

sympy.var('x')
f = 2*x**3 + x + 5

f.coeff(x, 3) # => 2; x^3 の係数 2 を得る
```

## polynomial

方法2: Polynomial manipulation tools 使う

http://docs.sympy.org/latest/modules/polys/reference.html


```python

import sympy

sympy.var('x')
f = 2*x**3 + x + 5

poly = sympy.poly(f)

poly.coeffs() # => [2, 1, 5] 
poly.all_coeffs() # => [2, 0, 1, 5]  x**2 の係数も出る
poly.degree() # => 3 次数
```
mysqlでdatabaseを立ち上げたり消したりする

コンソールで

'mysql -u root'

でmysqlを起動する。

'mysql> show databases;'

で全てのdatabaseを確認

'mysql> drop データベース名;'

で削除ができる。この時;を忘れないこと。

railsで立ち上げているので、

立ち上げたいファイルのディレクトリで

'rake db:create'

で作成。
PHPで固定長ファイルを作る


PHPで固定長ファイルを作るときのメモ。
まずは、各項目を固定長で作る方法。

### sprintf()を利用する

まずは定番sprintf()。便利ですが応用範囲が狭い。

```php
    $num = 123;
    //00000123
    echo sprintf("%08d", $num)."<br>";
```

### str_pad()を利用する

基本的にはstr_pad()を利用することになるかと。

#### 数字

0埋め。埋める方向をLEFT, RIGHT, BOTHなど指定できる。

```php
	$num = 123;
    //00000123
    echo str_pad($num, 8, '0', STR_PAD_LEFT)."<br>";
    //12300000
    echo str_pad($num, 8, '0', STR_PAD_RIGHT)."<br>";
    //00123000
    echo str_pad($num, 8, '0', STR_PAD_BOTH)."<br>";

```

#### 英数字

str_pad()というくらないので普通の文字でも同じ。

```php
    $str = "hoge";
    //xxxxhoge
    echo str_pad($str, 8, 'x', STR_PAD_LEFT)."<br>";
    //hogexxxx
    echo str_pad($str, 8, 'x', STR_PAD_RIGHT)."<br>";
    //xxhogexx
    echo str_pad($str, 8, 'x', STR_PAD_BOTH)."<br>";
```

#### 日本語（バイトを合わせる）

鬼門の日本語。普通にstr_pad()にかけるとバイト数換算で計算される（当然）。

```php
    $mb_str = "ほげ";
    //xxほげ
    echo str_pad($mb_str, 8, 'x', STR_PAD_LEFT)."<br>";
```

#### 日本語（字数を合わせる）

日本語（全角）における文字数を合わせる場合はstr_pad()では不可能。str_repeat()+"文字列"で長めに文字列を生成しておいてmb_substr()で必要な文字列を頭から、あるいはお尻から切り取ることで擬似的にstr_padを実現する。

```php
    //んんんんんんほげ
    echo mb_substr(str_repeat("ん",8).$mb_str,-8)."<br>";
    //ほげんんんんんん
    echo mb_substr($mb_str.str_repeat("ん",8),0,8)."<br>";
```

### 出力する

CSV出力だとfputcsv()とかを使うのだろうけど、デリミタやエンクロージャはいらないので普通に書き込む。
めんどいのでここではfile_put_contents()を利用している。

```php
    //ファイル出力
    //大きなファイルの場合はcursorとかchunkとかを利用
    for($i=0; $i<10; $i++){
        $row = str_pad($num, 8, '0', STR_PAD_LEFT).
               str_pad($str, 8, 'x', STR_PAD_LEFT).
               mb_substr(str_repeat("ん",8).$mb_str,-8).
               "\n";
               
        file_put_contents("test.txt",$row,FILE_APPEND);
    }
```