OmniAICreator/Qiita-1.07M huggingface dataset:
PHPUnit 6.5.5 の Phar が PHP 7.0.10 で動かない件

```sh
wget https://phar.phpunit.de/phpunit-6.5.phar

docker run --rm php:7.0.10 php --version
# PHP 7.0.10 (cli) (built: Aug 31 2016 00:20:34) ( NTS )
# Copyright (c) 1997-2016 The PHP Group
# Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

docker run --rm -v $PWD:/app -w /app php:7.0.10 php phpunit-6.5.phar --version
# Fatal error: Cannot use PHPUnit\Framework\MockObject\Stub as Stub because the name is already in use in phar:///app/phpunit-6.5.phar/phpunit-mock-objects/Builder/InvocationMocker.php on line 16                                                                                       
```

名前空間 `PHPUnit\Framework\MockObject\Builder` で `Stub` クラスを定義しているにも関わらず、同じ名前空間の `InvocationMocker.php` で `use PHPUnit\Framework\MockObject\Stub as Stub` しているため、名前が競合することが原因。

なお、順番が逆なら動くので、Composer とかで PHPUnit を入れている場合は動くかもしれない（未確認）。Phar 版の場合はスタブコードで require されているので確実に動かない。

これは PHP のバグらしく、PHP 7.0.13 で修正されている。

- [PHP :: Bug #66773 :: Autoload with Opcache allows importing conflicting class name to namespace](https://bugs.php.net/bug.php?id=66773)

なので 7.0.13 以降だと発生しない。

```sh
docker run --rm -v $PWD:/app -w /app php:7.0.13 php phpunit-6.5.phar --version
# PHPUnit 6.5.5 by Sebastian Bergmann and contributors.
```

ワークアラウンドとして、CLI で OPcache を有効にすれば動作する。

```sh
docker run --rm -v $PWD:/app -w /app php:7.0.10 \
  php -d zend_extension=opcache.so -d opcache.enable_cli=1 phpunit-6.5.phar --version
# PHPUnit 6.5.5 by Sebastian Bergmann and contributors.
```

あるいは PHPUnit 6.4.4 なら発生しない。

```sh
wget https://phar.phpunit.de/phpunit-6.4.4.phar

docker run --rm -v $PWD:/app -w /app php:7.0.10 php phpunit-6.4.4.phar --version
# PHPUnit 6.4.4 by Sebastian Bergmann and contributors.
```
Vue.jsハンズオン前準備

# 事前環境構築

vue.js dev toolのインストール
https://goo.gl/Pd1y2B

macの方向け homebrew インストール
https://goo.gl/hrhrHq

macの方向け node.jsインストール

> brew install node

macの方向け git インストール
> brew install git

windowsの方向け node.jsインストール
https://goo.gl/DVHBYo


# ハンズオン資料
## todo チュートリアル
>git clone https://github.com/kosuke-tanihata-coconala/vue-study-coconala.git

## 管理画面　チュートリアル
>git clone https://github.com/kosuke-tanihata-coconala/vue-component-study.git
こんにちは。後discordBotのためのおすすめ3つ

```ruby:test.rb
p "Hello! World!"
sleep(10)
p "..."
sleep(1)
p "暇ぁ"
```

はい。こんなつまんないよりも、メインの方を話しましょう。

DiscordBotを作るときの僕のおすすめは、
[Pythn, JavaScript, Ruby]
ですね。

[ここ](https://wpqpqw.github.com)へ行って、Discord_XXX_Kit.sh というのがありますよね?
(XXX= Ruby, JavaScript, Python)
**注意:Mac専用です**
これを実行すると、brewとその他いろいろがインストールされます。
*もしかしたら、いろいろ重くなる?*

これを終えたら、
`~/Desktop/DiscordBot/`
の中にある、3つを起動する前に.
DiscordBotを作ってください。
[ここで作ろなー](https://discordapp.com/developers/applications/me)
そしたら、どこかのサーバーに入れて、起動して、PingPongでもして楽しみましょう!

余談
(これが初めてだったり。)
qiita初心者です. いろいろ教えてください!
SpreadSheetで同じ数字を特定の回数繰り返し入力し、場合を網羅したい

全ての場合を網羅するために、同じ数字や文字を特定回数繰り返したい場合があります。
そんな時に使えるのが `REPT` 関数です。
`CONCATENATE` と `TRANSPOSE` と組み合わせればより強力に動作します。

## 0.1刻みで0-1の場合を3つの変数で組み合わせたい

![0.1刻みで0-1の場合を3つの変数で組み合せた.png](https://qiita-image-store.s3.amazonaws.com/0/68146/3cf3d2ae-3395-8ab6-c2fe-2868c52e6ca4.png "0.1刻みで0-1の場合を3つの変数で組み合せた.png")

```
# 左の列
=transpose(split(CONCATENATE(rept("0,",121),rept("0.1,",121),rept("0.2,",121),rept("0.3,",121), rept("0.4,",121), rept("0.5,",121), rept("0.6,",121), rept("0.7,",121), rept("0.8,",121), rept("0.9,",121), rept("1,",121)),","))

# 真ん中の列
=transpose(split(rept(CONCATENATE(rept("0,",11),rept("0.1,",11),rept("0.2,",11),rept("0.3,",11), rept("0.4,",11), rept("0.5,",11), rept("0.6,",11), rept("0.7,",11), rept("0.8,",11), rept("0.9,",11), rept("1,",11)),10),","))

# 右の列
=transpose(split(rept("0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,",100),","))
```

これの右側（D1）に

```
=arrayformula(A1:A*0.1+B1:B*0.3+C1:C*0.5)
```

みたいなものを記載すれば `x*0.1+y*0.3+z*0.5` の最大値とその時の組み合わせが簡単にもとめられます

## 最後に
マーケティングでよく使うと思いますが、作りながら学校の宿題でも出そうだなぁと思いました。
学校の宿題の参考にもなれば幸いです
Qiitaライクのknowledgeをdocker-composeで楽々導入って記事をQiitaであげる暴挙

# Qiitaいいよ。Qiita。
Qiitaで情報を貯めよう！ってお堅い会社で話をしても誰も理解してくれません。
そんな奴らは、テンプレートだけ立派なスカスカwordを、いつリンク切れが起きるか分からないファイルサーバーに貯めて恐怖に怯えろ！
・・・って心で思っても、何も解決しません。
まずは使ってみないとなかなか理解してもらえないもんです。
とはいっても使うかどうかわからないのにQiita:Teamを導入できるわけなく、最終的にQiitaライクのknowledgeにたどり着きました。
Markdownいいよ。Markdown。

# knowledge構築
## インストール
docker-composeを使用して一発で構築します。
下記のdocker-compose.ymlを使用しましょう。
https://github.com/support-project/docker-knowledge

ちょっとだけ変更して、**koda/docker-knowledge**のタグに**japanese**を追加します。

```yaml
version: '2'
services:
    app:
        image: koda/docker-knowledge:japanese
        #build: .
        volumes:
            - ./volumes/knowledge:/root/.knowledge
        ports:
            - 8080:8080
        restart: always
        depends_on:
            - "db"
    db:
        image: postgres:9
        environment:
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=admin123
            - POSTGRES_DB=knowledge_production
        volumes:
            #- ./volumes/initdb:/docker-entrypoint-initdb.d
            - ./volumes/postgres/data:/var/lib/postgresql/data
        restart: always
```

## 起動
docker-compose用にディレクトリを作成して、上記のyamlを配置します。
こんな感じ。

```sh
$ pwd
/○○○/docker-compose/knowledge
$ ls
docker-compose.yml
```
そして起動します。

```sh
$ docker-compose up -d
```
docker-composeの使い方は勉強してね。

# 起動後のカスタマイズ
起動したコンテナに入ります。

```sh
$ docker-compose exec app bash
```

`/tomcat/webapps`へ移動し、ROOT.warからknowledge.warをコピーします。リネームでもいいかも。

```sh
$ cp ROOT.war knowledge.war
```
なぜこんなメンドイことをしいるかというと、ルートディレクトリでのアクセスを避け、サブディレクトリ下に配置したい為なんです。
この後出てくるnginxの設定で全てが明かされます。
ROOT.warは消すか、移動させてください。

tomcatを `/tomcat/bin/catalina.sh stop`した後、`/tomcat/bin/catalina.sh run`し再起動させます。
stop、runの度にコンテナから抜けるので、再度コンテナに入りなおします。

これで準備OK。次は管理者でログインしてldap、postgresを設定します。

## 管理者でログイン
[ホスト名]:8080/knowledge/ へアクセスするとログイン画面が出てくるので下記情報でログインします。
オンプレ上でなければポート転送するか、nginxでリバースプロキシしてあげましょう。

- id
 - admin
- pass
 - admin123

## ldapの設定
システム設定からldap設定を選択します。
ldapconfig2にADやldapの設定をしましょう。
これでldapユーザーでログイン出来るので記事をじゃんじゃん投稿しちゃいましょう。

## データベースをPostgresへ変更
システム設定からデータベース接続先を選択します。
以下の設定をしましょう。docker-compose.ymlの内容と合わせます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211866/49e6482f-591e-8bef-5e73-8aa476db9555.png)

これでOK！

## その他の設定
お好みで変更しましょう！

# Nginx設定
Nginxを使用していない方は無視してください。
リバースプロキシでNginxを使用している場合は、以下の設定をしましょう。
この設定をするために、tomcatでサブディレクリに配置したわけです。

```
    location /knowledge {
        proxy_pass http://xx.xx.xx.xx:8080/knowledge;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect http:// https://;
    }
```

ポイントはwebsocketを使っているから、こんな呪文を入れましょう。

```
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
```

# 最後に
dockerを使うと非常に簡単に環境構築できますね。
環境を汚さないのもGoodです！

まずは自分で記事を貯めてから社内公開ですね。
それまでは頑張って投稿しまくります。
Qiitaと違って、オンラインエディタがちょっと非力なのが残念です。
しかし、コピペで画像を張れるのは非常に便利です。
スライドショーも出来るのでなかなかいいコンテンツが投稿できそうです！
app.cfgの環境変数が反映されない問題

```
appcfg.py -A f-staging update . -E ENV: 'develop'
```

こうしても`os.GetEnv("ENV")`では取得出来ない。

```
appcfg.py -A f-staging update . -E ENV:'develop'
```

こうしないとダメ。
変数名の後のコロンの後はスペースあけるとダメ
Snippet: routesのconstraintsでホスト名を使う

[Rails GuidesのAdvanced Constraints](http://guides.rubyonrails.org/routing.html#advanced-constraints) ではremote_ipを使っているが同様にしてホスト名でフィルタする。

```rb
class AdminHost
  def initialize
    @admin_hosts = []
    @admin_hosts = ENV['ADMIN_HOSTS'].split(',') if ENV['ADMIN_HOSTS']
  end

  def matches?(request)
    uri = URI.parse(request.original_url)
    @admin_hosts.include? uri.host
  end
end

Rails.application.routes.draw do
  constraints AdminHost.new do
    resources :admin
  end
end

```
Confluence shortcuts

##一般

| 内容 | ショートカットキー|
|:-----------|------------:|
| ダッシュボードに移動| G D|
|最近閲覧したページを表示 | G R |
| サイドバーを表示/ 非表示     | [|
| 通知を表示 | G N        |
| このページをウォッチする| W |
| コメントの追加| M|
| ページの作成 | C|
| ページやブログの編集  | E|

##編集時

| 内容 | ショートカットキー|
|:-----------|------------:|
| リンクの挿入  | Ctrl+K|
| ファイル/画像を挿入する  | Ctrl+M|
| 箇条書き  | Ctrl + Shift + 8|
| Numbered list  | Ctrl + Shift + 7|
| 前に表の行を挿入する  | Alt + Shift + ↑|
| 後に表の行を挿入する  | Alt + shift + ↓|
| 後に列を挿入する  | Alt + Shift + →|
| 前に列を挿入する | Alt + Shift + ←|
chromeでabsoluteな要素にclipすると子要素ごと切り抜かれる件

## この話は一体

親要素が`position: absolute;`になってる小要素をclipすると親要素ごと抜けちゃうchromeのバグについて
[Chrome bug with css clip on nested divs
](https://stackoverflow.com/questions/41164802/chrome-bug-with-css-clip-on-nested-divs)でもあげられてるやつです。
ちなみに執筆時点でのchromeのバージョンは63.0.3239.132です。

## 現象

[再現コード](https://jsfiddle.net/nazomikan/fx6cfcd2/)

```haml:html構造
.outer
  .parent
     .child
```

こんなDOMに対してこんなcss(scss)書く

```scss
.outer {
  position: relative;
  width: 500px;
  height: 300px;
  background: pink;
}

.parent {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 200px;
  background: skyblue;

  .child {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    top: 0;
    background: orange;
    clip: rect(0, 100px, 200px, 0);
  }
}
```

※ 一番外側(.outer)がピンクで次(.parent)がスカイブルーで最後(.child)がオレンジに設定しています

### in FireFox

<img width="499" alt="スクリーンショット 2018-01-23 20.21.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/12806/8b5bbdb5-452a-90ca-8bf6-3a6028196317.png">

.child(オレンジ部分)が切り抜かれて.parent(スカイブルー部分)が露出しています。

### in Chrome

![スクリーンショット 2018-01-23 20.23.01.png](https://qiita-image-store.s3.amazonaws.com/0/12806/a6949cf4-b34c-b707-64b4-e0192c63b71f.png)

.parent(スカイブルー部分)ごと切り抜かれて大外の.outer(ピンク部分)が露出しています

## バグが治るまでの対応

stackoverflowでは.parentと.childを親子関係から兄弟関係にしてabsoluteで重ねて抜けってかいてるけどDOM構造変えたくなかったので色々ためしたところ、borderとかbox-shadowとか境界的なプロパティを.parentに設定したら抜けなくなったのでなるべく副作用の少ない透明なbox-shadowをつけることにしました。

[Fixコード](https://jsfiddle.net/nazomikan/5xd4nbbz/)

```scss:修正スタイル
.parent {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 200px;
  background: skyblue;
  box-shadow: 0 0 0 rgba(0,0,0,0); // <-- これ
  .child {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    top: 0;
    background: orange;
    clip: rect(0, 100px, 200px, 0);
  }
}
```

### in Chrome

![スクリーンショット 2018-01-23 20.28.42.png](https://qiita-image-store.s3.amazonaws.com/0/12806/bfe0c7ed-ae02-046c-1887-24ff1778dc58.png)


## まとめ

ぶっちゃけ親子構造変えていいなら謎コード残らないほうがよいのでstackoverflow的にsiblingにすると良いと思います。
それしたくない場合は境界系のスタイル(borderとかbox-shadow)でお茶濁してchromeが治すのまちましょう。
Kerasのモデルでtfdbgを使う時の罠

# 学習中にnanやinfが出た時

どこでそれらが発生したかを追いかけるのにtfdbgという機能が使えます。基本的な使い方は[公式のドキュメント](https://www.tensorflow.org/versions/master/programmers_guide/debugger)か、[tfdbg を使って Keras の nan や inf を潰す](https://qiita.com/keisuke-nakata/items/5d6918678e8099b565d0)などを見ればおおよそ分かるかと思います。わりと理解しやすいデバッガだと思います。

# 明らかに関係ない所で見つかるinf

Kerasのモデルでtfdbgを利用する際、ある条件を満たすと `has_inf_or_nan` で明らかに不必要な `inf` が見つかります。
初見だとそこに問題があるのかと思って悩まされます。

例えばこんなモデル

```
inputs = Input(shape=(5,))
sqrts = Lambda(lambda x: K.sqrt(x))(inputs)
outputs = Activation('softmax')(sqrts)
model = Model(inputs, outputs)
```

Kerasで書いたことのある人なら分かると思いますが、Trainableな重みは1つも無い構造です。なので `fit` しようが何しようアウトプットはインプットにしか依存しません。

しかしこのモデルに対してtfdbgを用い、`run -f has_inf_or_nan` を実行すると `inf` を見つけて来てストップします。
このモデルであれば明らかに `inf` なんか入るわけ無いだろと分かるわけですが、大体の人は`nan`や`inf`が発生しているモデルに対してデバッグするためにtfdbgを使うわけですから、`inf`が見つかった箇所付近を重点的にチェックすると思います。

しかし残念ながらこの `inf` は本来の原因とは一切関係ありません。
実は[ここ](https://github.com/keras-team/keras/blob/master/keras/backend/tensorflow_backend.py#L1447)にあるように`K.sqrt`の実装の中に`inf`が登場します。そのため現状では`keras.backend.sqrt`をネットワーク内に含んでいるだけで`has_inf_or_nan`が常にヒットします。

`has_inf_or_nan`は学習中のどこかで発生する`inf`や`nan`を見つけやすくしてくれるはずなのに、こいつのせいでrunは毎回止まるのでいくらなんでも邪魔すぎます。
なのでIssueにして本家の意見を聞いてみました。

https://github.com/keras-team/keras/issues/9161

結果的には、まだ解決はしてないのですが少なくともこの事実を知っていないと意味のない`inf`発生源にずっと悩まされる人がたくさん出てきそうなので記事にしてみました。Issueに進展があったら追記します。


【追記 2018/01/24】
上記のIssueにKerasの作者から直々に返信をいただけました！
現状既に解決している問題のために敢えてそのような実装になっているようなので `K.sqrt()` ではなく、`import tensorflow as tf`のようにTensorflowを読み込んだ上で`tf.sqrt()`を直に使って問題無さそうという事でした。

という事で解決😋
総当たりデシジョンテーブルの簡単な作り方


![デシジョンテーブルサンプル.JPG](https://qiita-image-store.s3.amazonaws.com/0/80589/86673c1a-3c2f-b298-ae81-1728587ba1fd.jpeg)

1. 左端に全部Yの列を書く
2. 下2行の総当たりパターンを書く(A)
3. (A)より上の行はYで埋める
3. (A)をコピーして、右隣に貼り付ける(B)
4. (B)の1行上をNで埋める
5. その他の行はYで埋める
6. 今度は下3行(C)をコピーして、右隣に貼り付ける(D)
7. 同様に、貼り付けた領域の1行上をNで埋める
8. 残りはYで埋める
9. 以下、全部Nの列ができるまで繰り返し
Elasticsearch on Windows




## Installation Steps

Windowsにはインストーラーがあるので、それを実行する。
[Install Elasticsearch with Windows MSI Installer \| Elasticsearch Reference \[6\.1\] \| Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/windows.html)


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/efb0284d-ac02-0f0c-31cf-8a3cd37c27d1.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/2e943a8e-5663-d020-834c-1310401ce395.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/6cd99418-bd7c-ea31-7125-1e495b845f48.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/c5a4758e-13cb-0a6a-86e5-63cb6410a83f.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/d069f3b9-d30f-367b-99dd-d973fbe3087b.png)



[Elasticsearch Reference [6.1] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/6.1/index.html)

[Elasticsearch Clients | Elastic](https://www.elastic.co/guide/en/elasticsearch/client/index.html)



curl --noproxy localhost -XPUT localhost:9200/_bulk --data-binary @eq_data.json



# Zipの場合は以下

###  1. Download and unzip Elasticsearch

[Download Elasticsearch Free • Get Started Now | Elastic](https://www.elastic.co/downloads/elasticsearch)

### 2. Run bin/elasticsearch (or bin\elasticsearch.bat on Windows)

Run bin/elasticsearch (or bin\elasticsearch.bat on Windows)

またはサービス単位だと以下
```
elasticsearch-service.bat install
```

````
elasticsearch-service.bat manager
````

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/211af291-cf30-9cd6-ff19-093883d40936.png)


```
elasticsearch-service.bat start
```



### 3. Run curl http://localhost:9200/ or Invoke-RestMethod http://localhost:9200 with PowerShell


http://localhost:9200/

以下のような応答が画面にあれば動いている
```
{
  "name" : "aEeGsGI",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "PyCzi5ewTGuNsnQck0MPrg",
  "version" : {
    "number" : "6.1.2",
    "build_hash" : "5b1fea5",
    "build_date" : "2018-01-10T02:35:59.208Z",
    "build_snapshot" : false,
    "lucene_version" : "7.1.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
```


### 4. Dive into the getting started guide and video.

[Getting Started \| Elasticsearch Reference \[6\.1\] \| Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html)

[Elasticsearch: Getting Started \| Elastic](https://www.elastic.co/webinars/getting-started-elasticsearch)




localhost:5601
jAlbum > IIS設定


https://jalbum.net/forum/ann.jspa?annID=177


1. Open IIS Manager
 2. Display properties for the IIS Server
 3. Click MIME Types and then add the JSON extension:
•File name extension: .json
•MIME type: application/json
4. Go back to the properties for IIS Server
•Click on Handler Mappings
•Add a script map
•Request path: *.json
•Executable: C:\WINDOWS\system32\inetsrv\asp.dll
•Name: JSON
AWS AthenaにJDBC接続する（JDBC42.jar）

# 概要
athenaにJDBC接続しようとしましたがうまく動作しませんでした。（環境によると思います）
調べてみたらathenaに利用するJDBCドライバーが新しくなった模様、公式のドキュメントがまだ更新されていないようなので記載

# 環境
Windows7 64bit

# 既存のドライバで接続
https://s3.amazonaws.com/athena-downloads-archive/drivers/AthenaJDBC41-1.0.1.jar
ぐぐるといっぱい出てくるので割愛しますが、ドライバを落としてURL・ID/PASS・s3_staging_dirを設定

接続には成功しますが、クエリを投げるとエラーに

```
DEBUG - Using AWS accessId and SecretKey
DEBUG - --------------> Type Info
ERROR - Failed to run query: com.amazonaws.athena.jdbc.shaded.com.amazonaws.services.athena.model.AmazonAthenaException: No Such Method (Service: AmazonAthena; Status Code: 400; Error Code: UnknownOperationException; Request ID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)
```

# 新しいドライバでの接続
https://s3.amazonaws.com/athena-downloads/drivers/JDBC/AthenaJDBC42.jar
基本的に従来の設定と一緒ですが、URLとオプション名称が変わっているので注意

## SQL WorkBench/J
1. Manage Drivers > Create a New entry
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/218363/b31531ba-97f8-7e3a-697e-47036be5eb0d.png)
2. driverに↑で作成したdriverを選択し、usernameにaccess key、passwordにsecret keyを入力
3. Extended Propertiesをクリックし`S3OutputLocation`を設定
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/218363/c174d775-bff8-3da1-eed8-a70d8ba87504.png)

## DBeaver
1. Database > Driver Manager > New
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/218363/b6b947ef-0b4e-3364-2ef1-245dde6c14a2.png)
2. New Connection Wizard > athena JDBC

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/218363/c5fc1844-e14c-b1fe-315c-51ee09c25ac2.png)
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/218363/97446d94-9cff-29cf-fad5-caf6a7f0beb4.png)

# 備考
マニュアル
https://s3.amazonaws.com/athena-downloads/drivers/JDBC/docs/Simba+Athena+JDBC+Driver+Install+and+Configuration+Guide.pdf
kotlinメモ

#kotlin備忘録

##by lazy
by lazyは始めて呼び出されるときに引数に渡されたものが実行される

```kotlin

fun lazy(){
  var firstName = "first"
  var familyName = "family"
  val fullName : String by lazy{
    firstName + " " + familyName
  }

  firstName = "変えたよ"
  familyName = "ふぁみりー"

  println(fullName) //変えたよ ファミリー

  firstName = "もう一回変えたよ"

  println(fullName) //変えたよ ファミリー

}
```

## lateinit

```kotlin

lateinit var hoge : String
```
初期化を後にできる
初期化する前に読み込むとクラッシュ
音声ファイルを解析して波形を出力 - js

# 説明

音声ファイルを解析して波形をブラウザに出力してみたいと思います。音声ファイルは、どこにあってもいいけれど（自分のサーバーの中とか）httpもしくはhttps通信が出来る環境でなければいけません。

実装自体は`wavesurfer.js`という素晴らしいフレームワークを用いて比較的簡単に実装をすることができます。比較的...いや本当に簡単です！。

# 環境

- https
- http
- javascript
- wavesurfer.js
- Google Chrome


# 実行

実際に実行してみるとこのようになります。波形の色を代えたり再生位置を直感的に操作したりすることができます。

<img width="743" alt="Screen Shot 2018-01-23 at 19.19.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/314cd2f7-f38c-30a0-1502-81835f6330c2.png">


# たったこれだけ

たった6行で音声ファイルを解析して波形を出力することが出来るようになります。

```javascript
var wavesurfer = WaveSurfer.create({
  container: '#waveform',
  waveColor: 'black',
  progressColor: 'purple'
});
wavesurfer.load('https://ia902606.us.archive.org/35/items/shortpoetry_047_librivox/song_cjrg_teasdale_64kb.mp3');
```

# 実装

サウンド素材、CDNが消えない限りコピペで動くはず。もし自分で`wavesurfer.js`を使いたければクローンとかして自分でパスを指定してください。

```html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/wavesurfer.js/1.2.3/wavesurfer.min.js"></script>

<div id="waveform"> </div>

<div style="text-align: center">
  <button class="btn btn-primary" onclick="wavesurfer.playPause()">
    <i class="glyphicon glyphicon-play"></i>Play</button>
</div>

<script language="JavaScript">

var wavesurfer = WaveSurfer.create({
  container: '#waveform',
  waveColor: 'black',
  progressColor: 'purple'
});

wavesurfer.load('https://ia902606.us.archive.org/35/items/shortpoetry_047_librivox/song_cjrg_teasdale_64kb.mp3');

</script>
</body>
</html>
```
PHP で (a == 1 && a == 2 && a == 3) を常に真（true）にできますか？

## 表題の[例のアレ](https://qiita.com/aimof/items/bb786c112f7dcc3be6c9)を PHP でチャレンジ

## TL;DR

```sample.php
<?php

const a = true;

if(a == 1 && a == 2 && a == 3){
    echo 'True';
}else{
    echo 'False';
}
```

チートっぽいですが、ヨーダ記法のつもりで見ればアリかしら？<ruby><rd>カタカタ</rd><rt>型くるしいこと</rt></ruby>言わずに楽しんでみました。


### PoC（概念実証）はこちら
https://paiza.io/projects/Glc22w7HAgajRiUGLGPv9w

### 所感

[マストドンのタイムラインで盛り上がってる](https://qiitadon.com/@Morichan/99388555853917247)なと思ったら、[StackOverflow](https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true/48399280#48399280) から始まったみたいですね。[自分も Qiitadon にトゥートしていた](https://qiitadon.com/@KEINOS/99391475416576256)ので Qiita にも掲載。
Laravel 5.5 Blade @appendの使い方

Laravel5.5初心者。
bladeの@appendの使い方メモです。

# @sectionの閉じ部分を@appendにすればいい。

```php:index.blade.php
@extends('layouts.default')

@section('content')
content!<br>
@endsection

@section('content')
  contentに追記<br>
@append
```
## 結果
```
content!
contentに追記
```

# element的な他のビューでも同様。
適当にincludeするビュー

```php:test.blade.php
@section('content')
includeしたblade内からcontentを追記
@append
```

レイアウト

```php:index.blade.php
@extends('layouts.default')

@section('content')
content!<br>
@endsection

@section('content')
  contentに追記<br>
@append

@include('test')
```

## 結果
```
content!
contentに追記
includeしたblade内からcontentを追記
```

こういう細かい所含めて体系的にまとまってるドキュメントはないだろうか。。
どうにも情報が細切れで散らばっている感がある。
xlwings.Name 簡易リファレンス

# はじめに

これは xlwings 0.11.5 [本家xlwings.Names](http://docs.xlwings.org/en/stable/api.html#names) [本家xlwings.Name](http://docs.xlwings.org/en/stable/api.html#name) の簡易日本語リファレンスである。

# xlwings.Names

Names は名前付き範囲名とフィルターを管理する。(テーブルは含まない)
[VBA:Names](https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/names-object-excel) に相当する。

```python
nms = xw.books.active.names                        # アクティブブックの全範囲名管理インスタンスを返す
nms = xw.sheets.active.names                       # アクティブシートの範囲名管理インスタンスを返す

nms['範囲名'] = 'シート名!絶対アドレス'              # 範囲名を登録する
nms['範囲名']                                      # Nameインスタンスを返す
nms('範囲名')                                      # Nameインスタンスを返す
nms(1)                                             # Nameインスタンスを返す
nms.add('範囲名', refers_to='シート名!絶対アドレス') # 新規範囲名を登録する
nms.count                                          # Nameインスタンス数を返す

nms.api                                            # ネイティブインスタンスを返す
```

| 範囲名命名規則            | 範囲      |
|-------------------------|-----------|
| 範囲名                   | ブック単位 |
| シート名!範囲名           | シート単位 |
| シート名!_FilterDatabase | シート単位 |

文字ケース区別無しで扱われる

# xlwings.Name

Name は単一の範囲名を管理する。
[VBA:Name](https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/name-object-excel) に相当する。

```python
nm.delete()        # 範囲名を削除する
nm.name            # RW 範囲名を返す
nm.refers_to       # RW シート名!絶対アドレス を返す
nm.refers_to_range # xw.Range で返す

nm.api             # ネイティブインスタンスを返す
```
gradleファイルをherokuにデプロイ

#備忘録


## build.gradle
jvmのバージョンは明記

```groovy:build.gradle
sourceCompatibility = 1.8
compileKotlin {
	kotlinOptions.jvmTarget = "1.8"
}
```

最後にこれを追加した

```groovy:build.gradle
task stage(type: Copy, dependsOn: [clean, build]) {
    from jar.archivePath
    into project.rootDir 
    rename {
        'app.jar'
    }
}
stage.mustRunAfter(clean)

clean << {
    project.file('app.jar').delete()
}
```

## heroku
herokuに登録後
コマンドラインでherokuにログインしたあと以下を実行(プロジェクト内で）

```
$ heroku login
$ heroku config:set GRADLE_TASK="build"
```

herokuのポートに合わせるためにソースコードに以下を記述

```kotlin:main.kt
fun getHerokuAssignedPort(): Int {
    val processBuilder = ProcessBuilder()
    return if (processBuilder.environment()["PORT"] != null) {
        Integer.parseInt(processBuilder.environment()["PORT"])
    } else 4567
//return default port if heroku-port isn't set (i.e. on localhost)
}
```

## ビルド
`./gradlew build `
でビルドした後jarファイルがbuild/libsの中にあることを確認

## デプロイ

Procfileに以下を記述

```:Procfile
web: java $JAVA_OPTS -jar build/libs/{ファイル名}.jar  -Dserver.port=$PORT
```


herokuにデプロイ
エラーは覚悟で・・・

```
git add ./
git commit -m "first app"
git push heroku master"
```

herokuのマイページからlogを確認
`crashed`とか書いてなかったらいけてるはず


* これで無理だった場合

` mv build/libs/*.jar ./`
でプロジェクトのホームディレクトリに移動して

```:Procfile
web: java $JAVA_OPTS -jar {ファイル名}.jar  -Dserver.port=$PORT
```
に変更する

これで無理ならひたすらエラーをコピって検索に尽きる・・・

## おまけ

```
$ heroku local
```
でローカル実行

## まとめ
確実に実行できるjarファイルを用意してからherokuにdeploy!!そしてenjoy!!
RestSharpの基本的な使い方

#注意
※かなりにわか知識です。

#RestSharpとは？
簡単にウェブリクエストとかができるクライアントライブラリ
.NETだとNugetで簡単にインストールできる。
[Nugetページはこちら](https://www.nuget.org/packages/RestSharp/)

.NET3.5以前だとHttpRequest
.NET4.0だとWebClient
.NET4.5以降だとHttpClient
とかを使ってやることができる。

##WebClientやHttpClientだと何がダメ？
上記クラスはMicrosoft純正なので安定感がある？が

- WebClientは1リクエストで複数ファイル送れない
    - 普通に致命的
- HttpClient
    - マルチパートファイルがリクエストの際にエンコードされてしまう
    - ※回避方法は[こちら](https://qiita.com/kawaidainfinity/items/4aee443bd77a9888cc9c)で書きました。

#簡単な例

```C#:Program.cs
// クライアント＆リクエストの作成
var client = new RestClient();
var request = new RestRequest();

// URLの設定
client.BaseUrl = new Uri("リクエスト先のURLをここに指定する");

// メソッド、パラメータの指定
request.Method = Method.POST;
request.AddParameter("パラメータ名", "パラメータの値", ParameterType.GetOrPost);
// ParameterTypeはいろいろあるが、GETとPOSTで特に指定なく
// stringパラメータを設定する場合は、GetOrPost

// ファイルをアップロードする場合
request.AddFile("ファイルパラメータ名", "ファイルパス", "ContentType");
// ContentTypeは拡張子などから適切なものを選ぶ

// リクエスト送信
var response = client.Execute(request);

// レスポンスがファイルなどで、復元したい場合
File.WriteAllBytes("出力先のパス", response.RawBytes);

// レスポンスのステータスコードが欲しいなどの場合
bool isOK = response.StatusCode == HttpStatusCode.OK;
// ステータスコード以外にも様々な情報がresponseに入っているので適宜


```

#まとめ
WebClientやHttpClientを使って頑張って書いたソースが無になりました。
[読書メモ]プログラムはなぜ動くのか

# ソースコードが実行可能ファイルになるまで
プログラムは、人間が読み書き可能な言語で書かれています。
これをソースコードと言います。

しかしコンピュータがプログラムを実行可能にするためには、コンピュータが読み取り可能なマシン語（ネイティブコード）にプログラムを変換する必要があります。
この作業をコンパイルと言います。

コンパイルを行うコンパイラは言語ごとに存在しています。
しかし、その言語ごとのコンパイラが最終的に作成するネイティブコードは同じものになります。（マシン語は言語の差異によりません。）

ちなみに、Javaの場合は、コンパイルを行うとJavaバイトコードが作成されます。
そのJavaバイトコードを、JavaVMが自分の乗っているマシンのマシン語に翻訳するという仕組みになっています。

しかし、このままではまだ実行可能なファイルにはなりません。
作成されたオブジェクトファイル（ネイティブコードに変換されたソースコード）とそれが参照しているライブラリなどへの参照を全てリンクする必要があります。
この作業をリンク、リンカーが行います。
# プログラムが実行されるまで
プログラムはハードディスクに格納されています。
それをメモリにロードすることで、CPUが実行できるようになります。

# プログラムが実行されるときに確保されるメモリ領域
以下の２種類がある。
1. スタック
2. ヒープ

## スタック領域
一つの関数が呼び出されると確保され、終了すると解放される。
## ヒープ領域
オブジェクトの生成時に確保される。
プログラマが明示的に取得と解放を記述する必要がある。
WebdriverIO で React の Transition をテストするのに

E2Eテストのフレームワークである WebdriverIO と React の Transition の組み合わせに関する小ネタです。

## TL;DR

WebdriverIO でトランジションを含む処理をテストする場合は `browser.waitForVisible` だけでなく、`setTimeout` を使ったさらなる待機が必要になることがある。

## 問題

"#!" を使った擬似的なルーティングを使った React の SPA があります。
このアプリにはリンクのためのボタンがあり、ボタンを押すと、state の変更を通して画面を更新し、history.push で URL を変更します。このページ遷移にはトランジションが介在します。

このボタンのE2Eテストを WebdriverIO で書いた際に、URL の変更が検知されずテストが失敗しました。

## 原因

ボタンのハンドラにおける処理は

1. フェードアウト。正確にはその引き金となる state の変更
1. setTimeout による遅延
1. 内部 state の変更
1. フェードイン
1. UI 調整のための state 変更
1. URL 変更

のようにいくぶん込み入っており、それぞれの処理はトランジションやsetStateのコールバックの連結による非同期処理で順序づけられています。

で、私は当初 `waitForVisible` を使えば、処理が終わるまで待つはずだと素朴に考えてテストコードを書いたのですが、事はそれほど単純ではありませんでした。

というのも、URL変更は徐々に増えていく opacity が **1 になるまで**実行されません。 一方、waitForVisible は opacity が **0 でなくなった段階で**次に進めるのでで、（画面更新のスケジューラにもよりそうですが） URL　変更前に assert が走ってしまうわけです。

## 対策

みんな大好き `setTimeout` で処理を遅延させること。条件によっては待ち時間は0でも効きます（この説明はややこしくなるので省略）。

結局、修正後のテストコードは以下のようになりました。

```js:Page.js
class Page {
  open() {
    browser.url('/');
  }

  clickNextLink() {
    browser.click('a.next-link');
  }
  
  async waitPageTransition() {
    const $main = browser.element('.main');
    $main.waitForVisible(1000, true) // 消えるのを待つ
    await delay(0);
    $main.waitForVisible(1000); // 現れるのを待つ
    await delay(500); // <- さらに待つ！
  }
}

function delay(duration) {
  return new Promise((resolve) => setTimeout(resolve, duration));
}
```

```js:page.test.js
describe('Page', () => {
  describe('after clicking link', () => {
    beforeEach(async () => {
      page.open();
      page.clickNextLink();

      await page.waitPageTransition(); // <- ここがポイント!
    });

    it('changes hash', () => {
      expect(page.url).toEqual('/#!/page/2');
    });
  });
});
```

## 感想

やはりE2Eテストははまりどころが多いです。
フルスタックの AngularJS に比べて React は実例が少ないので、もっとノウハウを集めていきたいです。
ubuntu16.04のpython3にwxpythonをインストールする

#python3だとwxPythonのビルドを通すためにいろいろパッケージが必要

ubuntu16.04でwxPythonをpython2.7で使うときには
apt-getですぐに入ったので問題がなかったのですが、python3で使おうと思ったら
`pip install wxPython`でインストールすると、必要なパッケージが多くて大変でした。
いろいろ試してみたら、簡単な方法がありましたので記しておきます。

#ビルド済みwhlパッケージのインストール
すでにビルド済みのパッケージの置いてある場所
~~https://wxpython.org/Phoenix/snapshot-builds/~~

**2018年9月現在**
**linuxのビルド済みパッケージの場所が変わったようです。**
**https://extras.wxpython.org/wxPython4/extras/**


上のURLのlinux->gtk2->ubuntu16.04とたどっていき
**wxPython-4.0.0a3.dev3059+4a5c5d9-cp35-cp35m-linux_x86_64.whl**
をインストールしたら一発で使えるようになりました。
cp35という表記がpython3.5に対応しています。

コマンドで書くと

```
pip install https://wxpython.org/Phoenix/snapshot-builds/linux/gtk2/ubuntu-16.04/wxPython-4.0.0a3.dev3059+4a5c5d9-cp35-cp35m-linux_x86_64.whl
```


です.（ファイル名は変わるので、/snapshot-builds/のディレクトリかたどってください。）

同じディレクトリをみるとubuntu14.04、Fedora、CentOS、Debianのパッケージもあるみたいです。

#追記 pip経由でインストールする場合(ubuntu18.04の場合)

ubuntu18.04にwxPython4.03をpip経由でインストールする場合に必要なパッケージがわかりました。
[ここ](https://github.com/wxWidgets/Phoenix/issues/412)に書かれていました。

必要とされるパッケージ

```
apt-get install -y libgtk2.0-dev libgtk-3-dev \
	libjpeg-dev libtiff-dev \
	libsdl1.2-dev libgstreamer-plugins-base1.0-dev \
	libnotify-dev freeglut3 freeglut3-dev libsm-dev \
	libwebkitgtk-dev libwebkitgtk-3.0-dev
```

これがインストール完了したら

```
pip3 install wxPython
```

でインストールできました。参考までに。
pip3経由だとビルドすることになりますが、恐ろしいぐらい時間がかかりますのでご注意ください。

- ビルドにかかる時間の参考情報（試してみた範囲）
    - Panasonic CF-R5で約半日
    - Panasonic CF-N10で２時間程度
Slack APIとAdvanced REST client（Chrome拡張機能）でチャンネルへの投稿を試す

SlackAPIを使った投稿を試してみたくてやってみた。
簡単そうに見えた（結果的には簡単だった）けど、ものわかりの悪い私は無駄に時間かかってしまったのでメモ。

基本的には下記ページの通り。わかりやすくて感謝。
[Slack API 推奨Tokenについて](https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21)

不特定多数の人に使ってもらうアプリにするとかだったら、ユーザ各自に認証してもらう必要があるので、上記ページの「1. RedirectとResponseを利用した方法」が必要になるが、ひとまず試してみるだけということで上記ページに従う。

### ■ 私が悩んだ（つまづいた）ところ。 

- チャンネルに自分の名前で投稿したい場合の権限は「メッセージをユーザーとして送信します chat:write:user」
- **「chat:write:user」はAPI名ではない。**チャンネルに自分の名前で投稿したい場合のAPIは「chat.postMessage」
- リダイレクトURLの設定は不要（上述の「1. RedirectとResponseを利用した方法」になると必要）
- APIの公式リファレンスはここ→ https://api.slack.com/methods
- API公式リファレンス（例：https://api.slack.com/methods/chat.postMessage） に「Tester」ってタブがあるけど、これで試すには非推奨のLegacyTokenを作る必要がある。（それでも動いたっていうのが試せるから、作って試す価値はあった。超簡単だし。）

### ■ ところでHTTPリクエストどうやって試すん？
Google Chrome拡張機能の**[Advanced REST client](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo/details?hl=ja-JP)**を使った。

- methodは**POST**
- パラメータ設定は**Variablesではなく、Bodyで設定**する
- Body content typeはapplication/x-www-form-urlencoded　（公式APIリファレンス参照）

上記設定できておらず、ずっと
`{ "ok": false, "error": "not_authed" }`
ってなって無駄に時間かかってしまった。。。
知らない間にAWS SDKのコールバック地獄から解放されてた (for JavaScript)

# はじめに

今までJavaScriptでaws-sdkを扱う場合は
↓こんな感じでコールバック関数を渡していました。

```javascript:もともと
s3.listBuckets((err, data) => {
  if (err) {
    console.error(err);
  } else {
    console.log(data);
  }
});
```

簡単な処理の場合はこの書き方で良いと思うのですが
処理を手続き的に書く際にとても苦労します・・・

```javascript:いわゆるコールバック地獄
dynamoDB.getItem({/*省略*/}, (err, data) => {
  if (err) {
    console.error(err); // エラーもネストの数だけハンドリングが必要
  } else {
    s3.getObject({/*省略*/}, (err, data) => {
      if (err) {
        console.error(err);
      } else {
        console.log(data);
      }
    });
  }
});
```

これを回避するためにasync/awaitを使おうとすると
すべてのApi呼び出しをPromiseでラップする関数を定義する必要がありました。

```javascript:ラップした例
// これはこれでコールバック地獄
// しかも使用するApiの数だけ用意する・・・
function getItem(opts) {
  return new Promise((resolve, reject) => {
    dynamoDB.getItem(opts, (err, data) => {
      if (err) reject(err);
      else     resolve(data);
    });
  });
}

// メイン処理
// ここはきれいに書ける
async function hoge() {
  try {
    const res1 = await getItem({/*省略*/});
    const res2 = await getObject({/*省略*/});
    console.log(res2);
  } catch(err) {
    console.error(err); // エラーもまとめてハンドリングできる
  }
}
```

これを回避するためにオレオレPromisifyなども作ったりしました。

# コールバック地獄にも終わりが!

最近だと↓こう記述できるとのこと

```javascript:今どき
async function hoge() {
  try {
    const res1 = await dynamoDB.getItem({/*省略*/}).promise();
    const res2 = await s3.getObject({/*省略*/}).promise();
    console.log(res2);
  } catch(err) {
    console.error(err);
  }
}
```

見ての通りApi呼び出し後の戻り値から
そのまま**Promise**が返却できるらしいのです。

この`promise()`関数は`AWS.Request`の実装なので
例に限らずほぼ全てのAPIで使用可能だと思われます。(※ 確認したわけではありません)

# まとめ
調べてみると2016年のLambdaがNode.v4対応した頃には実装されていたようですが、
公式のサンプルもコールバックを渡すプログラムになってたりするので
このpromiseの存在を知らない人もまだいるのではないでしょうか？(まさか僕だけ・・・？

ぜひPromiseを使ってシンプルな非同期処理を書いてきましょう！

# 参考記事
https://qiita.com/toshihirock/items/4e4231c04332c209e31d


# 追加
気がつくと公式にページが追加されてたのでリンクしておきます

- [JavaScript Promises の使用](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/using-promises.html)
npmインストールでエラーが出たら


```js

module.js:339
    throw err;
    ^
Error: Cannot find module 'semver'
```

- 上記のようなエラーが出たとき、macPCでhomebrewを使っている場合は、次のようにすれば解決できる場合が多いです。

```bash
sudo rm -rf /usr/local/lib/node_modules
sudo rm -rf ~/.npm
brew uninstall --force node
brew uninstall --ignore-dependencies node
brew uninstall --force node
brew install node
```
Tortoise SVN でクリーンアップに失敗する場合

SVNのUpdateを行った際に困ったためメモしておく。


##Please execute the 'Cleanup' command
Update等の操作を行った際に以下のエラーが出ることがある。

```java:Cleanupエラー
Error:Previous operation has not finished; run 'cleanup' if it was interrupted
Error:Please execute the 'Cleanup' command
```

1行目のエラーのみの場合は、通常Cleanupを行えばエラーが出なくなるが、2行目のエラーも併せて出てくる場合、Cleanupを何度行っても同じエラーが出続けて何もできなくなった。。。
ちなみにUpdate対象となったファイルはJARファイルで、ローカルで更新をしていた。

ググってみたところ、SVNのDBに問題が起こっているらしいとのこと。
https://qiita.com/ftcb_cml/items/d648231094517588b421

sqliteさえあればデータ削除でいけるとのことだが、仕事先ではsqliteは使用しておらず勝手なインストールもできないため、この方法は断念した。

上記に「ロック」というキーワードが出てきていたので、クリーンアップ時の選択オプションを見直すとそれらしい選択項目を発見。
「Break locks」
試しにチェックをつけて実行したところ、Cleanupが正常終了した。
Tortoise SVN のサイトの記述を確認したところ以下の通りだった。
チェックすると、作業コピーデータベースからすべての書き込みロックを強制解除します。多くの場合、作業をクリーンアップするために必要です。
https://tortoisesvn.net/docs/nightly/TortoiseSVN_ja/tsvn-dug-cleanup.html

##上記から原因と対策を推測
恐らくだが、JARのようなマージ不可能なファイルに対して、ローカル更新あり、SVNサーバ更新ありの状態となった場合は、このような事象が発生する。
このため、事象発生時はCleanupコマンドのオプション「Break locks」を指定して実行する必要がある。

##注意
ちなみに、「Break locks」を指定してCleanupが正常終了した際のJARファイルは、SVNサーバ上のファイルで更新されており、ローカル更新が破棄されていた。
この時はローカルの更新内容は不要であったため問題がなかったが、ローカルの更新を優先したい、もしくは手動でマージしたい（ファイルがExcel等のマージできるものに限る）場合は、バックアップを取ってから実行したほうが良いと思う。
Chart.jsで円グラフのlegend(横とかにつくラベル)の横幅が調整できない問題


# どうやら、改行はサポートしてくれないらしい。

<img width="1070" alt="スクリーンショット 2018-01-23 17.02.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/186784/3e7caecf-06b9-cfac-849e-bc07d200fd2b.png">

ふざけんな！！！

## 日本語できちんとラベルを付けると、グラフが。。。笑

![スクリーンショット 2018-01-23 17.03.50.png](https://qiita-image-store.s3.amazonaws.com/0/186784/37f87306-5ea2-a287-e11a-85d7b37eb23f.png)

かわいいっすね。

## 文字サイズを無理やり調整すればいいのでは？

```editor.js
var label_array = [
'ラベル1',
'ラベル2'.
'ラベル3ラベル33ラベル33ラベル33ラベル33ラベル3'
];

var stringLength = 0;
label_array.forEach(function(value){
            stringLength = value.length > stringLength ? value.length : stringLength ;
});
var labelWidth = 200;
var fontSize = labelWidth / stringLength;

fontSize = fontSize > 16 ? 16 : fontSize;

...

legend: {
	position: 'right',
	fullWidth:false,
	labels : {
		boxWidth : 20,
		fontSize : fontSize,
	}
},
```

それっぽくなった
HSL色空間とHSY色空間の変換式

#概要
この記事では、HSL色空間とHSY色空間の変換式とその利点について解説します。
この 2つは 色相 H と 彩度 S が等しい色空間です。つまり、色相 H と 彩度 S が一定のとき、輝度 L と コントラスト Y を変換・逆変換する式を説明するわけです。
## 注意事項
- この記事でのHSY色空間の「彩度 S」は、HSV（またはHSB）色空間の 彩度 S ではありません。HSL色空間の 彩度 S です。HSV（またはHSB）色空間の変換式が知りたい方は、[こちらをご覧ください](https://ja.osdn.net/projects/hsy-color/wiki/HSY色空間について)。
- 色相 H の値域は、0 ≦ H < 360 とします。彩度 S と 輝度 L、コントラスト Y の値域は、0 ≦ x ≦ 1 とします。
- コントラスト Y の導出に必要な RGB 各色の重み係数は、Pr = 0.298912、Pg = 0.586611、Pb = 0.114478 とします [[2](https://ofo.jp/osakana/cgtips/grayscale.phtml)]。[Wikipedia](https://ja.wikipedia.org/wiki/グレースケール)に重み係数についての記述があるため、必要ならばご参照ください。

# 変換式

## 純色の コントラスト Yp の導出

変換式は、輝度 L または コントラスト Y の値と、彩度 S、色相 H の **純色の コントラスト Yp** を用います。まずは、純色のコントラストについて説明します。

--------

純色（*Pure Color*）とは、各色相において、最も彩度が高い色のことです[[4](https://ja.wikipedia.org/wiki/純色)]。HSL色空間では、**彩度 S = 1**、**輝度 L = 0.5** の色を指します。
純色の コントラスト Yp は、色相 H によって一意に決まり、重み係数 Pmax と Pmid、変数 a （全て後述）を用いて、以下の式で導出します。

    Yp(H) = Pmax + Pmid × a

純色の コントラスト Yp は以下の図のように変化します。
![graph2.png](https://qiita-image-store.s3.amazonaws.com/0/231330/ca688a5e-56a6-cf5b-fa1b-d108df967587.png)
上図の通り、色相 H = 60（黄色：`#FFFF00`）のときが最も大きく、色相 H = 240（青色：`#0000FF`）のときが最も小さな値を取ります。

重み係数 Pmax と Pmid は色相ごとの RGB の変化によって決まります。色相の変化に応じて、RGB は以下の図のように変化します。
![graph1.png](https://qiita-image-store.s3.amazonaws.com/0/231330/9053a910-2362-3b24-7c5a-0021e5580e65.png)

例えば、120 ≦ H < 180 （緑～シアン）の区間では RGB の内、最大となるのは 緑 G、二番目に大きな値となるのは 青 B です。なので、重み係数 Pmax = Pg = 0.586611、Pmid = Pb = 0.114478 となります。

変数 a は、二番目に大きな値が、増加する区間か減少する区間かによって導出式が異なります。値域は 0  ≦ a ≦ 1 です。導出式は、剰余 mod を用いて以下の式となります。

増加区間（0 ≦ H < 60、120 ≦ H < 180、240 ≦ H < 300）のとき

    a = (H mod 60) / 60

減少区間（60 ≦ H < 120、180 ≦ H < 240、300 ≦ H < 360）のとき

    a = 1 - (H mod 60) / 60

## HSL⇔HSY変換式
HSL→HSY変換式は、`変数 C = 2 × S (0.5 - Yp)` を用いて、以下の式となります（変数 C は計算を見やすくするために導入しています）。

L > 0.5 のとき

    Y = L × (1 + C) - C

L ≦ 0.5 のとき

    Y = L × (1 - C)

--------

逆の、HSY→HSL変換式は、以下の式となります。

Y > (1 - C) / 2 のとき

    L = (Y + C) / (1 + C)

Y ≦ (1 - C) / 2 のとき

    L = Y / (1 - C)

# メリット
## コントラストのメリットとデメリット
コントラストのメリットは、背景色と文字色のコントラストの差によって可読性が分かるところです。コントラストの差が小さいほど文字が読みにくく、大きいほど読みやすくなります [[5](http://www.asahi-net.or.jp/~gx4s-kmgi/page04.html)]。コントラスト差がおよそ0.5以上なら、十分見やすいと言えます。差が最大となるのは、白（Y = 1）と黒（Y = 0）のときです。
コントラストのデメリットは、色相 H = 60（黄色：`#FFFF00`）近辺のときは、低い値の変化が少なく、色相 H = 240（青色：`#0000FF`）近辺のときは、高い値の変化が少なくなることです [[1](1)]。これらは、純色のコントラストが極端な値（黄色の場合はおよそ0.9、青紫のはおよそ0.1）を取ることが理由です。

## HSL⇔HSY 変換のメリット
色彩デザインにおいて、色相と彩度は画面の雰囲気を決める重要な要素です。これらを一定に保ったまま、画面の明るさや暗さを調整することができます。一度RGBに変換し直して計算するよりずっと簡単です。どのように動くかは、[こちらのページから](http://ra2ly0.web.fc2.com/70-25-5.html)実際にお試しください。
#おわりに
この変換式は、私が（間を開けつつも）半年ほど要して作ったものです。ネットで調べても望みのものがでてこなかったので作成しました。自分が発見したものを、ひょっとすると他の人も求めているかもしれないと思い投稿しました。コメントやいいねをいただけましたら幸いです。質問や訂正も受けつけております。

#追記
[変換式をJavascriptにしました。](https://qiita.com/lookman/items/490463244fc01dc1d48e)

# 参考文献
[1][https://ja.osdn.net/projects/hsy-color/wiki/HSY色空間について]
[2][https://ofo.jp/osakana/cgtips/grayscale.phtml]
[3][https://ja.wikipedia.org/wiki/グレースケール]
[4][https://ja.wikipedia.org/wiki/純色]
[5][http://www.asahi-net.or.jp/~gx4s-kmgi/page04.html]
はじめてのSpring AOP

# はじめに
はじめてSpring AOPを触ったので導入手順をまとめた。

# 実装手順
## 1. 依存を追加
### mavenの場合
```
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
```
### gradleの場合
```
compile('org.springframework.boot:spring-boot-starter-aop')
```

## 2. Adviceするクラスを作成
差し込みたい処理（adviceMethod）に対して、アノテーションを付与する。
アノテーションがAdviceの種類で、アノテーションのvalueが差し込む対象となる。

```
@Aspect
@Component
public class SampleAdvice {

    @Before("execution(* com.example.app.controller.*.*(..))")
    public void adviceMethod() {
        System.out.println("adviceMethod : before");
    }
}
```
この場合はcom.example.app.controllerパッケージに属するクラスの関数に対して、adviceMethod()の処理を差し込む。
アノテーションは＠Beforeなので、対処の関数の実行前にadviceMethod()が実行される。

## 3. 完成
めっちゃ簡単でした＼(^o^)／

# 参考資料
Adviceアノテーションの種類や、valueの指定は下記の記事を参考にしました。
https://qiita.com/NagaokaKenichi/items/386af61b6866d60964e8
FFmpegのAPIを使うための初歩の初歩（初期化）

FFmpegのAPIを使うために、絶対に知っておかなくてはいけないことがあります。
それは「初期化の仕方」です。
これを勘違いしていたために、私は数日を無駄にしました．．．

# 初期化

使用するAPIごとに初期化関数が違います。
※「FFmpeg全体の初期化関数」はありません！
もうめんどくさいので、全部呼び出しちゃいましょう。

```C
av_register_all();
avcodec_register_all();
avfilter_register_all();
```

ポイントは「これらを呼ばなくてもエラーにならない」です。
いざファイルフォーマットやコーデックを使用しようとして指定すると「そんなフォーマット（コーデック）ないよ」と言われてしまい、ちゃんとFFmpegがビルドできていないんじゃないかとか、間違った方向に行ってしまいます。

## av_register_all

libavformatを使用する際に呼び出す初期化関数です。
（libavformatは、ファイルフォーマット（コンテナ）やMux／Demux（MP4、AVI等）の指定をするときに使用します）
利用可能な全てのファイルフォーマットおよびコーデックを自動的に登録してくれるのですが、もちろん初期化を呼ばずに自分で必要なものだけ登録することも可能です。
でも大変なので、呼んでしまいましょう。

## avcodec_register_all

libavcodecを使用する際に呼び出す初期化関数です。
（libavcodecは、映像／音声などのエンコード／デコード（H.264、AAC等）の指定をするときに使用します）
利用可能な全てのコーデック、パーサ、ビットストリームフィルタを自動的に登録してくれるのですが、もちろん初期化を呼ばずに自分で必要なものだけ登録することも可能です。
でも大変なので、呼んでしまいましょう。

## avfilter_register_all

libavfilterを使用する際に呼び出す初期化関数です。
（libavfilterは、映像／音声のフィルタリング（リサイズ等）の指定をするときに使用します）
利用可能な全ての組込みフィルタを自動的に登録してくれるのですが、もちろん初期化を呼ばずに自分で必要なものだけ登録することも可能です。
でも大変なので、呼んでしまいましょう。

※使わないことが多いので、確実に使わないのであれば初期化も呼ぶ必要ありません

# まとめ

大量に情報はあふれているのに、重要な情報がうまく見つけられないのが悲しい．．．
Excel HyperLink関数でジャンプできる目次を作る

# 同一ブック内の別シートに飛ばす場合
```:C2セル
=HYPERLINK("#'"&B2&"'!A1","リンク")
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/9a6de777-1587-b12d-8220-021b26ecafbf.png)

# 別ブックに飛ばす場合
```:D2セル
=HYPERLINK("["&B2&"]#'"&C2&"'!A1","リンク")
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/2011f301-1324-e0ca-5149-883daf89fd41.png)

## 注意点
ファイル名に「#」が含まれているとHYPERLINK関数は認識してくれない
(現状2017/04/03回避策なし)
[参考](https://support.microsoft.com/ja-jp/help/202261/you-cannot-use-a-pound-character-in-a-file-name-for-a-hyperlink-in-an)
ls > -c > { with -lt: ctimeで(降順に)ソート | with -t: nameで(昇順に)ソート | otherwise: ctimeで(降順に)ソート(ctimeは表示しない) } | link: explainshell.com > オプション説明の表示

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.9を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

ls -cのオプションがある。

man lsは以下の通り。

`
      -c     with -lt: sort by, and show, ctime (time of last modification of file status information) with -l:  show
              ctime and sort by name otherwise: sort by ctime
`

上記には三つのオプションが書かれている (-ltc, -lc, lc)。

sort byのソートが昇順、降順で混在しているようだ。

### with -lt (-ltc)

ctimeで「降順」にソートされているようだ (16:09や16:08に注目)。

```bash
$ ls -clt FNL\:2017-1* | head -n 3
-rw-rw-r-- 1 7of9 7of9 48783064 Jan 23 16:09 FNL:2017-12-23_00
-rw-rw-r-- 1 7of9 7of9 48783064 Jan 23 16:09 FNL:2017-12-22_18
-rw-rw-r-- 1 7of9 7of9 48783064 Jan 23 16:09 FNL:2017-12-22_12
$ ls -clt FNL\:2017-1* | tail -n 3
-rw-rw-r-- 1 7of9 7of9 48783064 Jan 23 16:08 FNL:2017-11-17_12
-rw-rw-r-- 1 7of9 7of9 48783064 Jan 23 16:08 FNL:2017-11-17_06
-rw-rw-r-- 1 7of9 7of9 48783064 Jan 23 16:08 FNL:2017-11-17_00
```

### with -l (-lc)

nameで「昇順」にソートされているようだ (FNL:2017-11-17_00やFNL:2017-12-23_00に注目)。

```bash
$ ls -cl FNL\:2017-1* | head -n 3
-rw-rw-r-- 1 7of9 7of9 48783064 Jan 23 16:08 FNL:2017-11-17_00
-rw-rw-r-- 1 7of9 7of9 48783064 Jan 23 16:08 FNL:2017-11-17_06
-rw-rw-r-- 1 7of9 7of9 48783064 Jan 23 16:08 FNL:2017-11-17_12
$ ls -cl FNL\:2017-1* | tail -n 3
-rw-rw-r-- 1 7of9 7of9 48783064 Jan 23 16:09 FNL:2017-12-22_12
-rw-rw-r-- 1 7of9 7of9 48783064 Jan 23 16:09 FNL:2017-12-22_18
-rw-rw-r-- 1 7of9 7of9 48783064 Jan 23 16:09 FNL:2017-12-23_00
```

### otherwise (-c)

ctimeで「降順」にソートされ、ctimeは表示されない。

```bash
$ ls -c FNL\:2017-1* | head -n 3
FNL:2017-12-23_00
FNL:2017-12-22_18
FNL:2017-12-22_12
$ ls -c FNL\:2017-1* | tail -n 3
FNL:2017-11-17_12
FNL:2017-11-17_06
FNL:2017-11-17_00
```

### 備考

`ls -c`と`-l`と`-t`を使用する場合、「昇順」と「降順」のどちらなのか理解をしていないと反対のファイルを処理してしまうかもしれない。

そういうスクリプトを書くと、後々のメンテナンス時に「昇順」と「降順」のどちらなのかを調べる羽目になるだろう。

### リンク

https://explainshell.com/explain?cmd=ls+-ltc

> 
list directory contents
...
-t     sort by modification time, newest first
...
-c ...

`-t`のオプション説明を見ると「降順(newest first)」というのが分かる。`-c`オプションの説明だけではそれは不明瞭だ。

偶然見つけたexplainshell.comのように、関連情報だけがまとまって表示されると分かりやすい。
bash-it

# bash-it
bashを簡単にカスタマイズしてくれるライブラリ😇
https://github.com/Bash-it/bash-it

## git clone
```
git clone --depth=1 https://github.com/Bash-it/bash-it.git ~/.bash_it
```

## Installation
インストールシェルを実行

```
$ ~/.bash_it/install.sh
```

既存の.bash_profileをバックアップするかを聞かれるので **y** を入力

```
$ ~/.bash_it/install.sh
Installing bash-it
Would you like to keep your .bash_profile and append bash-it templates at the end? [y/N] y
Your original .bash_profile has been backed up to .bash_profile.bak
Bash-it template has been added to your .bash_profile

Enabling sane defaults
bash-it enabled with priority 350.
system enabled with priority 350.
base enabled with priority 250.
alias-completion enabled with priority 365.
general enabled with priority 150.

Installation finished successfully! Enjoy bash-it!
To start using it, open a new tab or 'source /Users/ysakui/.bash_profile'.

To show the available aliases/completions/plugins, type one of the following:
  bash-it show aliases
  bash-it show completions
  bash-it show plugins

To avoid issues and to keep your shell lean, please enable only features you really want to use.
Enabling everything can lead to issues.
```

#alias設定
aliasの一覧表示

```
bash-it show aliases
```

aliasの有効化/無効化

```
to enable an alias, do:
$ bash-it enable alias  <alias name> [alias name]... -or- $ bash-it enable alias all

to disable an alias, do:
$ bash-it disable alias <alias name> [alias name]... -or- $ bash-it disable alias all
```

#completion設定
completionの一覧表示

```
bash-it show completions
```

completionの有効化/無効化

```
to enable a completion, do:
$ bash-it enable completion  <completion name> [completion name]... -or- $ bash-it enable completion all

to disable a completion, do:
$ bash-it disable completion <completion name> [completion name]... -or- $ bash-it disable completion all
```

#plugin設定
pluginの一覧表示

```
bash-it show plugins
```

pluginの有効化/無効化

```
to enable a plugin, do:
$ bash-it enable plugin  <plugin name> [plugin name]... -or- $ bash-it enable plugin all

to disable a plugin, do:
$ bash-it disable plugin <plugin name> [plugin name]... -or- $ bash-it disable plugin all
```

#theme設定
theme一覧
https://github.com/Bash-it/bash-it/wiki/Themes

themeのプレビュー

```
BASH_PREVIEW=true reload
```

themeの変更

```
$ vim ~/.bash_profile

# Lock and Load a custom theme file
# location /.bash_it/themes/
export BASH_IT_THEME='bobby'

$ reload
```
デフォルトのPlay FrameworkでDockerfileだけでDockerイメージを作る

デフォルトのPlay FrameworkでDockerfileだけでDockerイメージを作る健忘録。
sbt-native-packagerとかsbt-dockerとかの設定とsbt実行が面倒くさかった人向け。開発時は、特にDocker使ってないけど、アプリケーションデプロイのときにだけDockerを使う人には良さそうなやり方です。 JDK 1.8.0_144、Play Framework 2.6.11、 sbt 1.1.0 で検証済み。

まずはPlayFrameworkプロジェクトの作成。JDKとsbtは入っている前提。

```sh
cd ~/workspace/testapp
sbt new playframework/play-scala-seed.g8
```

でプロジェクト作成。作成時の入力は、

```
name [play-scala-seed]: testapp
organization [com.example]: org.soichiro
play_version [2.6.11]: 2.6.11
sbt_version [1.0.4]: 1.0.4
scalatestplusplay_version [3.1.2]: 3.1.2
```

以上でプロジェクトを作ったとする。

```sh
vim Dockerfile
```

で以上のファイルを作成。

```dockerfile
FROM openjdk:8u151-jre-stretch

ENV PROJECT_NAME testapp

ENV VERSION 1.0-SNAPSHOT

ENV SECRET QUStej67ubRe

RUN mkdir /usr/src/app

WORKDIR /usr/src/app

COPY target/universal/${PROJECT_NAME}-${VERSION}.zip ./

RUN unzip ${PROJECT_NAME}-${VERSION}.zip

WORKDIR /usr/src/app/${PROJECT_NAME}-${VERSION}

RUN chmod a+x bin/${PROJECT_NAME}

CMD rm -rf RUNNING_PID && bin/${PROJECT_NAME} -Dapplication.secret=${SECRET}

EXPOSE 9000 9000
```

シークレットや環境変数、オプションなどは適宜調整してのこと。
これを使ってデプロイ用パッケージの作成とDockerのビルドを行う。

```sh
sbt dist && docker build -t your_account_name/testapp .
```

以上でパッケージの作成とDockerのビルドは完了する。

```
Successfully tagged your_account_name/testapp:latest
```

とイメージができればOK。

```sh
docker images
```

でも確認する。

```sh
docker run -d --name testapp -p 9000:9000 your_account_name/testapp
```

以上で起動して、 http://localhost:9000/ で動作確認をして問題なければOK。

```sh
docker exec -it testapp /bin/bash
```

で logs/application.log のログの確認などできるが、 `docker logs ${コンテナID}` とかで見たほうが楽。別途ログを保存したいとかある時は別な方法を設定のこと。

```sh
docker stop testapp
```

で終了可能。

```sh
docker start testapp
```

で再起動できる。以上、ミドルウェアの利用やデプロイでDocker便利です。最高。
1台のサーバに複数のまたは旧いmysqlを入れたい場合の選択肢の備忘録

備忘録です。
以下のような選択肢がある気がします。

・工夫して複数いれる１（パッケージとソースと入れてわけて設定）
http://bokuibi.blogspot.jp/2012/04/mysql-for.html
もしくは両方ソースから場所変えて入れるなど

ちなみに[旧いパッケージが転がっていて](http://ftp.iij.ad.jp/pub/db/mysql/Downloads/)もOS的にサポート終わってて準備が不可能だったりすると準備可能なOSにソースアーカイブからmakeして入れないといけなかったりします。

・工夫して複数いれる２（kamipoさん作のmysqlbuild）
http://blog.kamipo.net/entry/20111208/1323356185
https://github.com/kamipo/mysql-build
昔勉強会でエゴサーチしてると言ってたのでエラーでたらブログかいたり呟いたりすると本人が登場してくれそう
5.0いれてみたけど`ncurses-devel`というパッケージを入れないとビルド時にエラーでました。
http://d.hatena.ne.jp/rx7/20081031/p3
（ちゃんと入りましたので移行とバージョンアップ検証に手軽でいいですね。ありがとうございます。）

・mysqlsandboxで頑張ってみる（mysqlの中の人のnippondanjiさんより試験環境としておすすめ）
http://mysqlsandbox.net/
http://nippondanji.blogspot.jp/2010/07/mysql.html

・mysqld_multiで頑張る
http://sawara.me/mysql/1398/
パッケージで入れてるやつ同じバージョン(違うバージョンは無理)でポートとデータディレクトリと起動スクリプトほかを設定ファイルでセクション区切ってパラメータ変えてつかうやつですね。

・virtualboxとvagrantで頑張る
ローカルPCでテスト用でVM２つ入れるやつですね。
https://qiita.com/keita_watari/items/54833f7ccb05fbc4a18f

・コンテナで頑張る
最近だとdocker入れればコンテナからホストへのポートフォワーディングのポートを変えればいけそう。
ただし公式サポートはEOL迎えてないバージョンだけみたいですね。
個人的な注意点はデータディレクトリのvolumeはホストにマウントしないとコンテナ消すと消えるけどそのマウントポイントはNFSやCIFS的な共有ストレージは無理な挙動だったこととbinlog_format=ROWだとバイナリログの肥大化が早めでディスクフルでコンテナが止まることなどです。あとコンテナは普通のパッケージで入れるのとだいぶ勝手が違うので慣れてないとバージョンアップ用のクラスタ別に立てずにそのまま上げて詰んだりしそうです。コンテナは基本BGデプロイ（新旧挿げ替える運用）っぽいです。
https://hub.docker.com/_/mysql/

まあこんなかんじで。
ホスト1台にMySQLサーバ同居さすのには、
メモリの食い合いやCPUリソースの食い合いや
ポートとデータディレクトリとログと起動スクリプトとプロンプトなど色々な位置を変えたり
気にするところは多いのでもし万が一縮退する先もサービス利用するのは結構手間暇かかるかと。