OmniAICreator/Qiita-1.07M huggingface dataset:
Spring Boot DBコネクションプール

Spring Boot（Spring Data JPA）でコネクションプールを設定する方法をまとめました。

#### ライブラリの自動選択

コネクションプールライブラリは以下の順序で選択される。（クラスパスにライブラリがあるか確認し、あればそのライブラリを選択し、なければ次のライブラリを確認する。）

1. [HikariCP](https://github.com/brettwooldridge/HikariCP)
2. [Tomcat JDBC Connection Pool](https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html)
3. [Commons DBCP2](https://commons.apache.org/proper/commons-dbcp/)

 `spring-boot-starter-jdbc` もしくは `spring-boot-starter-data-jpa` を利用している場合は、HikariCPが依存関係として解決されるため、何も設定していなければHikariCPが選択される。

#### ライブラリの指定方法

`application.properties`（もしくは`applications.yaml`）の `spring.datasource.type` プロパティに利用したいライブラリのDataSource（ `javax.sql.DataSource` 継承クラス）を指定することで変更ができる。

##### HikariCPの場合

設定可能な項目は[Configuration](https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby)を参照。

```yaml
spring:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost/test_db
    username: user
    password: password
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      maximum-pool-size: 20
      minimum-idle: 10
```

##### Tomcat JDBC Connection Poolの場合

設定可能な項目は[Common Attributes](https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#Common_Attributes)を参照。

```yaml
spring:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost/test_db
    username: user
    password: password
    type: org.apache.tomcat.jdbc.pool.DataSource
    tomcat:
      max-active: 20
      min-idle: 10
```

#### 参考

* https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-connect-to-production-database
* https://github.com/tokuhirom/java-handbook/blob/master/spring/hikaricp.md
PlantUML Web Serverから画像を出力する

# PlantUML Web Serverから画像を出力する

plantuml.comからUMLの編集と画像の出力ができるので、
Qiitaなどで説明用の画像を生成するのに便利につかわせてもらってます

以下のエンドポイントから画像と、対応した編集画面を呼び出せるようです

編集画面
http://www.plantuml.com/plantuml/uml/{固有値}

png, svg, txtで出力できる
http://www.plantuml.com/plantuml/{png,svg,txt}/{固有値}



- svg出力例

![svg出力例](http://www.plantuml.com/plantuml/svg/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000)


## ドキュメント
http://plantuml.com/
VSCodeでRailsテスト駆動開発している人向けExtension作った

テスト駆動開発するとき、テストファイルと実装ファイルを行き来したいですよね？

Atomには[rails-open-rspec](https://atom.io/packages/rails-open-rspec)という素晴らしいPackageがあります。
VSCodeにも[似たようなExtension](https://marketplace.visualstudio.com/items?itemName=sporto.rails-go-to-spec)はあるのですが、物足りなかったので自分で作りました。

![ezgif-4-1ed4a9656c.gif](https://qiita-image-store.s3.amazonaws.com/0/44356/f220e077-465f-2b9e-0635-b5c07331e324.gif)

## インストール
VSCodeのExtensionで`rails-rspec-file-toggle`と検索すれば出てきます。

## 挙動
`Rails Rspec File Toggle`を実行すると、テストファイルと実装ファイルを行き来します。
基本的には`app/{$0}/{$1}.rb`と`spec/{$0}/{$1}_spec.rb`を行き来します。
ただしrailsでありがちな
`app/controllers/{$0}_controller.rb`と`spec/requests/{$0}.rb`
のような行き来になったりする場合ように設定が出来るようになっています。

↓はデフォルト値です。

```json
"railsRspecFileToggle.convertDefinition": [
    {
        "app_directory": "controllers",
        "spec_directory": "requests",
        "app_suffix": "_controller",
        "spec_suffix": ""
    }
]
```

fast_specとかも対応してますよ。

```json
"railsRspecFileToggle.rspecDirectory": "fast_spec"
```

## 備考
僕が使わないのでペインには対応していません。
もし必要だったら言ってもらえれば開発するかもしれないです。
Outlook for Macのおすすめ利用方法3つ

<p>Macで使えるメールソフトには、標準搭載のあれば、Thunderbirdなどの無料メーラーもあります。</p>
<p>しかしながら、仕事などで多数の方とメールのやりとりをする時、やはりセキュリティーソフトとWindowsとの互換性が高い<a href="https://www.e-soft.net/products/detail/19">Outlook for Mac</a>が最強。</p>
<p>そこで今回は、MacでOutlookを使う3つの方法をご紹介します。</p>
![yjimage1.jpg](https://qiita-image-store.s3.amazonaws.com/0/217125/631ef22e-d4a4-536f-efcb-d3a02237b45e.jpeg)

<p>Outlook for Macは複数アカウントを設定でき、フォルダの管理も簡単。仕分けルールの設定も簡単ですので、定型タイトルで来るメールは楽で処理できます。セキュリティーソフトとの互換性も良く、スパムメールを見なくて済みます。</p>
<p>しかし、買わないと使えないのが難点ですが、スケジュール管理機能なども付いてるので、機能だけならメールソフト界の王様には間違いないです。</p>
<p>Outlook for Macは単体でも販売されていますが、他のOfficeソフトと一緒にセットで購入することもできます。</p>
<h2>Outlook 2016 for Macを単体で購入する場合</h2>
<p>Outlook 2016 for MacはMicrosoft公式サイトで15,984円で発売されて、二台のMacで利用可能。</p>
<p>しかし、Officeソフトをセットで導入すれば、もっと安い価格でOutlookだけでなく他のOfficeソフトも手に貼ります。</p>
<h2>Outlook 2016 for Macをセットで購入する場合</h2>
<p>Outlook 2016 for Macをセットで購入する場合、Microsoft Office Home and Business 2016 for Mac とOffice 365 Soloの二つの選択肢があります。</p>
<h3>Microsoft Office Home and Business 2016 for Mac</h3>
<p>Office Home & Business 2016 for Macを公式サイトから35,705円で購入できます。</p>
<p>永続ライセンスで、購入した後、最新Officeを使わないなら、追加料金がかかりません。</p>
<p>二台のMacでインストールできます。</p>
<p>Outlook 2016だけでなく、Word 2016、Excel 2016、PowerPoint 2016、Onenote 2016も利用可能。</p>
<p>即ち、35,705円＝Outlook 2016 + Word 2016 + Excel 2016 + PowerPoint 2016 + Onenote 2016</p>
<p>以上のアプリを別々に単体で購入すると、</p>
<p>Outlook 2016(15,984円)+Word 2016(15,984円)+ Excel 2016(15,984円)+ PowerPoint 2016(15,984円)+ Onenote 2016(15,984円)</p>
<p>79,920円かかります。</p>
<p>やはり、セットで購入するとお得でしょう。</p>
<p>Office Home & Business 2016 for Macと同じ永続ライセンスのOffice Student 2016 for Macでは、利用できるOfficeアプリはWord、Excel、PowerPoint、Onenote、Outlookだけで、Outlookが付属されません。</p>
<h3>Office 365 Solo</h3>
<p>Office 365 Soloはサブスクリプション型で、年間（或いは月間）で契約して、常に最新Officeへ無料でバージョンアップできます。</p>
<p>すべてのOfficeアプリが利用できます。一ライセンスにつき最大2台までインストールできます。永続ライセンスと違うのは、Windows PCでも使えます。</p>
<p>Windows PC × 2台<br>
Mac × 2台<br>
Windows PC × 1台 + Mac × 1台</p>
<p>Office 365 Soloを年間で契約すると12,744円で、月間契約が1,274円。</p>
<h2>まとめ</h2>
<p>以上で、MacでOutlookを使う3つの方法をご紹介しました。</p>
<p>Outlookだけでなく、他のOfficeアプリも利用したい方にとっては、単体購入よりセットで購入した方がお得。</p>
<p>MacでOutlookを長年間使う方にとって、永続ライセンスのMicrosoft Office Home and Business 2016 for Macがお得。</p>
<p>常に最新Officeを使いたい、Windows PCもお持ちの方には、Office 365 Soloがお得。</p>
riot.js tag each

### 
公式但し書きにあるようにeach={...}は動かない。 each=___"___{...}___"___とする。 riot.tagで困ったらとりあえず{}を"{}"にしてみる。

```js
riot.tag(`todo`
,`<ul><li each="{ item in items }">{ item }</li></ul>`
,function (opts){this.items = opts.items
})
riot.mount('todo',{items:[0,1,2,3]})
;
```
```html
<script src="//gnjo.github.io/riot.js"></script>
<todo></todo>
```
### この時のerrorは　replace... 
```
riot.js:2 Uncaught TypeError: Cannot read property 'replace' of undefined
    at l (VM5871 riot.js:2)
    at VM5871 riot.js:2
    at VM5871 riot.js:2
    at r (VM5871 riot.js:2)
    at Object.b.update (VM5871 riot.js:2)
    at Object.Ft (VM5871 riot.js:2)
    at vt (VM5871 riot.js:2)
    at Object.Kt (VM5871 riot.js:2)
    at Object.<anonymous> (VM5871 riot.js:2)
    at VM5871 riot.js:2
```
CentOS 7 cmake 3.11.0のソースファイルからのインストール

# 動作確認環境
- 仮想環境 VMware Workstation Player 14.1.1
- OS Windows 10 Pro 64bit

# 仮想環境
- OS CentOS 7.4 (1708) minimalインストール
- メモリ 2GB
- HDD 250GB

# ダウンロード・展開
最新バージョンの確認
[Download | CMake](https://cmake.org/download/)

`/usr/local/src`ディレクトリに移動する。

````
cd /usr/local/src
````
ソースファイルをダウンロードする。

````
wget https://cmake.org/files/v3.11/cmake-3.11.0.tar.gz
````

ダウンロードしたファイルを展開する。

````
tar zxvf cmake-3.11.0.tar.gz
````
# コンパイル・インストール
展開したディレクトリに移動する。

````
cd cmake-3.11.0
````

コンパイル・インストール

````
./bootstrap --prefix=/opt/cmake --no-system-libs
make
make install
````

# エラー対策
`./bootstrap`で`lib64`関連のエラーが発生した場合、共有ライブラリへの対策。
エラー内容。

````
/usr/local/src/cmake-3.11.0/Bootstrap.cmk/cmake: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /usr/local/src/cmake-3.11.0/Bootstrap.cmk/cmake)
/usr/local/src/cmake-3.11.0/Bootstrap.cmk/cmake: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /usr/local/src/cmake-3.11.0/Bootstrap.cmk/cmake)
````

`/etc/ld.so.conf`の編集

````
vi /etc/ld.so.conf
````
`/usr/local/lib64/`を追加し、更新コマンド`ldconfig`を実行する。

````
/usr/local/lib64/
````

この時点で`ldconfig`するとエラーが表示される。

````
ldconfig: /usr/local/lib64/libstdc++.so.6.0.24-gdb.py は ELF ファイルではありま せん - 先頭に誤ったマジックバイトを持っています。
````

対策を行う。（参照しないようにする）

````
mv /usr/local/lib64/libstdc++.so.6.0.24-gdb.py /usr/local/lib64/back.libstdc++.so.6.0.24-gdb.py
````

以上で`./bootstrap`が実行できる。

# 環境変数 PATH の設定
インストールしただけではcmakeが実行できないので、`/etc/bashrc`環境変数を設定する。

````
vi /etc/bashrc
````

`PATH=$PATH:/opt/cmake/bin`を追加し、コマンドを実行する。

````
PATH=$PATH:/opt/cmake/bin
source /etc/bashrc
````
# バージョン確認

````
cmake -version
````
以下のような内容が、表示される。

````
cmake version 3.11.0

CMake suite maintained and supported by Kitware (kitware.com/cmake).
````
# 参考
[MySQLのビルドに欠かせないCMakeを準備する：仕事で使える魔法のLAMP（45） - ＠IT](http://www.atmarkit.co.jp/ait/articles/1203/02/news117.html)
[CMakeインストールメモ(Hishidama's CMake install Memo)](http://www.ne.jp/asahi/hishidama/home/tech/cmake/install.html)
(

---
[目次](https://qiita.com/knutpb1205/items/3ece0cab588afdb13f02)
安全にウェブサイトのページをチェックする方法

便利なウェブサービスを見つけたので共有。

# urlscan.io

https://urlscan.io/

# 背景

怪しいURLへアクセスするときに、そのウェブサイトが○か×かを判断するために、実際にページを表示させてみたい時があります。

ただし、実際にアクセスするとウィルス感染の危険性がありますし、サンドボックスを用意するのも手間です。

そんなときには、urlscan.io を使いましょう。

# 使い方

![image.png](https://qiita-image-store.s3.amazonaws.com/0/248806/e810fcbe-369f-9046-69fb-bb16e048a500.png)

トップページのテキストボックスに確認したい、URLを入力してOKを押すだけ！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/248806/cd27042d-4c93-69a4-3b4e-d88e4d0119a9.png)

皆さんも使ってみてください。
Array(配列)で任意の要素を一番先頭に入れ替える方法

RailsのActiveRecordでテーブルから取り出したデータを並べ換えるのに苦労したのでメモする

ある条件を満たすユーザーだけまとめて取り扱いたい場合

```ruby:user.controller.rb
@user = User.where(status: 10)
```

みたいな感じでステータスが１０のユーザーだけ取り出す

この時、id順に@userに格納される

```ruby
pry(main)> @user = User.where(status: 10)
 #<User:0x00000000000
  id: 1,
  email: "email@example.com",
  name: "Test1",
  status: 10,

 #<User:0x00000000000
  id: 2,
  email: "email2@example.com",
  name: "Test2",
  status: 10,

 #<User:0x00000000000
  id: 3,
  email: "email3@example.com",
  name: "Test3",
  status: 10,

 #<User:0x00000000000
  id: 4,
  email: "email4@example.com",
  name: "Test4",
  status: 10,
```

要は@userの中には
Test1→Test2→Test3→Test4
の順番で要素が入っている

今回はこれを
Test3→Test1→Test2→Test4
にしたい！！！

以下やったこと

①.unshiftメソッドで先頭に挿入する
＊参考：https://ref.xaio.jp/ruby/classes/array/unshift

```ruby
pry(main)> @swap_user = User.find_by(id:3)
.
.
.
pry(main)> @user = User.where(status: 10).unshift(@swap_user)
 #<User:0x00000000000
  id: 3,
  email: "email3@example.com",
  name: "Test3",
  status: 10,

 #<User:0x00000000000
  id: 1,
  email: "email@example.com",
  name: "Test1",
  status: 10,

 #<User:0x00000000000
  id: 2,
  email: "email2@example.com",
  name: "Test2",
  status: 10,

 #<User:0x00000000000
  id: 3,
  email: "email3@example.com",
  name: "Test3",
  status: 10,

 #<User:0x00000000000
  id: 4,
  email: "email4@example.com",
  name: "Test4",
  status: 10,
```

このままだと１番最初にTest3を挿入しただけになってしまうので、.uniqメソッドを付け足す

Test3→Test1→Test2→Test3→Test4

②.uniqメソッドで被っている要素を削除
＊参考：https://ref.xaio.jp/ruby/classes/array/uniq

```ruby
pry(main)> @user = User.where(status: 10).unshift(@swap_user).uniq
 #<User:0x00000000000
  id: 3,
  email: "email3@example.com",
  name: "Test3",
  status: 10,

 #<User:0x00000000000
  id: 1,
  email: "email@example.com",
  name: "Test1",
  status: 10,

 #<User:0x00000000000
  id: 2,
  email: "email2@example.com",
  name: "Test2",
  status: 10,

 #<User:0x00000000000
  id: 4,
  email: "email4@example.com",
  name: "Test4",
  status: 10,
```

これで
Test3→Test1→Test2→Test4
になった！！！！
AWS CLI で AWS Batch にジョブを送信する (第１回)

AWS CLI を使って AWS Batch を実行するまでを解説します。
このドキュメントを読むためには AWS EC2、AWS S3 および docker に対する基本的な知識が必要です。
なお、ジョブのスケジュール設定については解説しません。

## 目次

全３回です。

1. はじめに                                    ← イマココ
2. [パラメータを使ってジョブを送信する](https://qiita.com/aokad/items/e08a9355e76a31711149)
3. [環境変数を使ってジョブを送信する](https://qiita.com/aokad/items/aed8034fb087a6bf99c3)

## AWS Batch とは

※正確な情報は[Amazon 公式ドキュメント](https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/what-is-batch.html)を参照してください。

AWS が用意したバッチジョブを実行するための仕組みです、と言ってしまえばおしまいですが、もう少し私なりに説明してみようと思います。

## バッチジョブ実行システム

以下のような状況を想像してください。
画像処理を行うシステムを作ろうとしています。

 - 元画像（入力データ）は複数あり、AWS S3 に置いてあります。
 - 入力データをいろいろな種類の画像処理システムで加工して AWS S3 に出力します。
 - 処理システムは EC2 インスタンス上の docker コンテナを想定しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/226829/0b89b995-b51c-9aa9-56bc-f0488385f428.png)

上の図（１）を見てください。「cat.A を S3 から取ってきて、グレイスケール化して、cat.A.gray として S3 に出力する」という実際の作業単位が 1 つのジョブです。
次に 「cat.B を S3 から取ってきて、グレイスケール化して、cat.B.gray として S3 に出力する」というのも 1 つのジョブです。この 2 つのジョブは入出力データのパスの違いを除くと「データを S3 から取ってきて、グレイスケール化してS3 に出力する」という作業は共通です。この「共通の部分」を定義しておき、入出力だけあとから指定できるようにしておけば、特別な作業なく cat.C も新たに処理できるよね、というのが AWS Batch の考え方です。プログラムの関数化やパッケージ化と同じ発想だと思います。

では実際に「共通の部分」には何が必要になるかを考えてみます。
まずは処理するためのライブラリ群が必要でしょう。AWS Batch においては docker イメージとして用意しておきます。
次にマシン環境が必要です。ジョブを実行するために必要な cpu や memory です。

AWS Batch に対して「共通の部分」そして「ジョブごとの違い」をどのように指定するかを次項で示します。

## AWS Batch の構成要素

AWS Batch は以下 4 つの要素から構成されます。簡単に説明します。

**ジョブごとに違う**

 - ジョブ ... 実際の作業単位。ジョブ定義に基づいて作成され、キューに送信される。

**共通**

 - ジョブ定義 ... ジョブの実行環境を定義したもの。例えば、docker イメージや実行に必要な vcpus, memory を定義する。
 - キュー ... ジョブを送信する対象であり、コンピュート環境に紐づけられ優先順位を持っている。
 - コンピュート環境 ... ジョブを実行するために 1 つ以上作成する EC2 インスタンスの定義。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/226829/c314e35b-4961-ec6b-be44-305dee5d3742.png)

図の解説

1. ジョブはキューに送信される。

2. ジョブはキューの優先度の高い順に実行される。
    - 優先度が同じジョブの数に応じて EC2 インスタンスが作成される
    - Queue-2 は優先度の高いジョブがあるため実行を保留している。

3. ジョブは docker コンテナで実行される。
    - どのような docker コンテナを作成するかはジョブ定義で定義されている
    - ジョブが複数あるとき、作成した EC2 インスタンスのスペック次第では docker コンテナを２つ立ち上げる。(※)

※実行できるジョブ数はどうやって決めているか
　AWS Batch 側で判断しているため推測ですが、ジョブ定義でジョブ実行に必要なスペックを指定しているため、立ち上げた EC2 インスタンスのスペックと照らし合わせて決めているようです。
　なお、スペックとはここでは vcpus と memory を指します。

実際の AWS CLI コマンドは次回、[パラメータを使ってジョブを送信する](https://qiita.com/aokad/items/e08a9355e76a31711149)で解説します。
エンジニアが知ってて損はないマーケティング - 基礎知識とロジック・ツリー

# はじめに

主に事業会社でエンジニアをやっていたり、自分でサービスやアプリを開発したエンジニアの方の中には、「PDCAサイクルを回しましょう」などといった言葉を一度は耳にしたことがあるかもしれません。

しかしながら、実際に蓋を開けてみると、

- ちゃんと回っているんだっけ？
- 効果でたんだっけ？
- なんか開発しかしていないんだけど...

みたいな疑問や不満がある方について具体的にサービス運営に携わっていく中で、少しエンジニアとしての境界性を越えているように感じるかもしれませんが、きちんと理解した上で開発を行うと新たな視点が生まれ、より開発自体を楽しむことができると思います。

当記事にはその中で基本的な知識を植え付けるための情報と、エンジニアの特性を活かしたスキルについてご紹介できればと思います。

# PDCAとは？

PDCAは、以下の工程の頭文字をとった言葉です。PDCAサイクルと言われる場合もあります。

1. Plan：計画を立てる
2. Do：実行する
3. Check：評価する
4. Action：改善する

P→D→C→Aの順番に継続的にこの工程を行ってサービスなどの品質を高めるための方式です。

# Plan：計画を立てる

以下のようなことを良く耳にしたことがあるかもしれません。

- コンテンツへの流入数が少ないけどSEOを改善したい
- 離脱が多いんだけどUIがイケていないのかも
- 今月数値が落ちているのがトレンドが原因です

確かに、数値を見るとそうなのかもしれませんが、そんなに簡単に解決できるものなのでしょうか？
また、その数値を改善することがサービスにとって一番良いことなのでしょうか？

PDCAを実行する前に、まずはサービスの軸となる目標と目的を明確化しましょう

## KGI（Key Goal Indicator）

最終目標が達成されているかを計測するための指標のことで、重要目標達成指標とも呼ばれます。
売上やCV数、流入数など様々ありますが、この数値が改善されることがサービスにとって一番良いということです。

ここでは、具体的な数値が指標となっていることが必要であり、
例えば「お客様の満足度を上げる」という目標は KGIとしては不明瞭であり適切ではありません。

## KPI(Key Performance Indicator)

KGIを達成に必要となるプロセスを具体化して落としこんだ指標のことで、主要業績評価指標とも呼ばれます。
もしかすると、耳にしたことがある方が多いのはこちらで、よく施策やプロジェクトの目標とされることも多いとおもいます。

こちらも、具体的な数値が指標となっていることが必要です。
落とし込みの方法については以下で具体的に説明します。

## OKR(Objective and Key Result)

KPIは、KGIをブレイクダウンすることで具体化させていきますが、
具体的にPDCAのDoを行う際に「そもそもの目標・目的はなんだったのか？」を数値だけでは見失ってしまうことが良く問題視されます。
例えば、教会を作るためにレンガを積んでいたはずが、いつのまにかレンガを積む作業そのものが目的となってしまうようなケースです。

こちらは、具体的な数値は必要となってはきませんが、ある課題についてあるべき姿を明確に示し、達成するためのプロセスを論理的に設定する必要があります。

例えば「お客様からのクレーム数が多い」といった課題に対して、「お客様からのクレーム数を減らす」という目標は、目の前の課題は一見解決されたように思われますが、サービスとしてクレーム数を減らすことがそもそもの目的とはずれてくる恐れがあります。

そのため、例えば「お客様からのクレーム数が多い」といった課題に対して、「顧客満足度No.1のサービスになる」といったありたい姿から「お客様からのクレーム数を減らす」といったプロセスを設定すれば、ストーリーとしてつながってくるかとおもいます。

# KGIからKPIの落とし込みについて

上記の基礎的な知識を踏まえたところで、実際にKGIとKPIの設定方法について解説していきます。

よくありがちなのは、

- KPIの指標を決める際に、どれくらいの数値を目指せばKGIが達成されるのかわからない
- KPIを達成すると直接KGIに影響あるのではなくて、もう少し間に改善されるKPIが潜んでいる気がする

このような悩みがあるときは、ぜひロジック・ツリーに落とし込んでみてください

## ロジック・ツリーとは

ある課題に対して、課題に潜む原因や解決方法をツリー状に分解することでシンプルに表現できるフレームワークのことです。

以下の例を使って説明します。
イメージとしては、ショッピングサイトを運営しているといった設定とします。

![ロジック・ツリー.png](https://qiita-image-store.s3.amazonaws.com/0/90598/b4ba5a4b-5a21-4066-f8a9-f6ec05494378.png)

1. まず、KGIは月の売上100万円とします。
2. 100万円の売上を達成するためには、月の購入数と1個あたりの金額によって決まります。
3. 購入金額はこの例では一律1万円の設定とします。そこから逆算すると月の購入数は100個必要ということになります。
4. 購入数100個を達成するには、ユーザーがショッピングサイトに訪問してくれる必要があり、購入してもらう必要があります。そのため、月のサイトへの訪問数を1000人と仮に設定した場合、10%の人が購入してくれる必要があり、これが購入率となります。

このように、ある課題に対して必要な要素を洗い出した上で、原因や解決方法を設定していきますが、課題に対して論理的に解決できることと繋がっているのかといった点が主なポイントとなります。

ロジック・ツリーは数値のような定量的なものを紐付けなくともよいので、
例えば、購入意欲や満足度などある程度定性的なものについても、状況やプロセスを整理するのに大変役に立つものかと思います。

# さいごに

次回は、もう少しユーザーに目を向けた際に用いる手法について触れようかとおもいます。
IBM Watson Car_Demo サンプルをやってみるその２

IBM Watson Car_Demo サンプルをやってみるその２

■ はじめに
　
　[前回](https://qiita.com/pooshikin/items/cf2d35272407855d3581)、Watsonの会話機能のチュートリアルを試してみました。
　今回、IBM Cloud上にチュートリアルのアプリをpushして動かしてみます。
　次に「car_workspace.json」の内容を調べてみます。
　具体的にはデータ構造を解析してみます。
　Microsoft ExcelのVBAを利用して、「car_workspace.json」を分解してみます。
　どういう観点で分解するのか？
　次回、英語を日本語へLanguage Translatorをやる前準備となります。

■　前提

　[IBM Watson Car_Demo サンプルをやってみるその１](https://qiita.com/pooshikin/items/cf2d35272407855d3581)を完了していること。

■ IBM Cloudにpushする

　前回からの続き、
　[ターミナル]cf login
![Watson_53.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/1556c691-ed2c-1122-5f57-7313b0a34967.jpeg)

　[ターミナル]cf push
　※ cf push がうまくいかない場合、cf push サービス名 --random-routeを試してみてください
![Watson_54.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/cf6cb234-04ad-d8ab-1e4d-7dba365a05cf.jpeg)

　IBM Cloudにログインしてダッシュボードから、Car_Demoの「watson-assistant-simple」の経路をクリックします。
![Watson_55.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/924c1ea4-6b0d-b848-aea8-bd6af34d139f.jpeg)

　Cloudへpushしたアプリでブラウザが表示されました。
![Watson_56.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/a10dc737-fd15-423c-d550-e90b19cdba48.jpeg)

　ここまでは、デモのとうりです。
　これからがポイントです。

　■ car_workspace.jsonを分解

　CloudのCar_Demoのワークスペースは下記のような構成になっています。
　これはかなりのヒントになります。
　![Watson_52.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/df1e638d-37ec-4ce9-cd2d-eab8ee534fe6.jpeg)

　つまり、car_workspace.jsonの内容はCloudのワークスペースと一致しているはず。
　Intents、Entities、Dialog、Content Catalogの内容で構成されています。

　試行錯誤した結果、ほぼ３つに分解すると理解しやすいようです。（正式ではありません）
　赤枠で囲んでいるエンティティになります。
　"Lnaguage"は"en"と設定されています。"ja"にすれば、日本語になるか試してみましたが、やはりIntentsとEntitiesのTextやValueを日本語化する必要がありそうです。
　※1 PlantUMLで書いてます。
![Watson_57.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/51ce66f5-23bf-94b4-bc15-f6090250c721.jpeg)
　※2 分解に使用した[Excelマクロ](https://github.com/cxc02374/IBM-Cloud/blob/master/car_workspace_json.xlsm),[car_workspace_json.pu](https://github.com/cxc02374/IBM-Cloud/blob/master/car_workspace_json.pu)はgitにあげましたのでご利用ください。

　★ 分解したIntentsの先頭部分
　　"text"があり、少し編集を加えればLanguage Translatorへ渡すインプットになりそうです。
![Watson_58.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/fc764f25-b3fc-17c9-06fe-da74feb58962.jpeg)

　★ 分解したEntitiesの先頭部分
　　"value"をLanguage Tranlatorで日本語化します。
![Watson_59.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/e1f8337a-ed6c-4209-963a-098220a7fe3f.jpeg)

　★ 分解したdialog_nodesの先頭部分
　　"values"をLanguage Tranlatorで日本語化します。
![Watson_60.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/25b4a0ce-b776-88cb-902c-da157090ed32.jpeg)

　■ まとめ
　
　Watsonのワークススペースは主に３つの部分からできている。
　Intents、Entities、Dialog_nodes。
　Language Translatorで日本語変換する部分は"text"と"Values"に当たりを付ける。
　というわけで、次回はこの「car_workspace.json」を日本語化します。

以上、おそまつ
Dockerをざっくり理解する

# 記事の目的

「Dockerってなんぞ？」っていう状態から、「Dockerはこういうツールで、こんなことができるよ！」って説明できるレベルまで理解してもらうことを目的としています。

# 初心者が陥りがちな勘違い

ググって独学してると一番最初に陥る勘違いとして代表的なのがこいつです。

```
Dockerって、VagrantとかVirtual Boxとかの仲間で、仮想環境を構築するツールでしょ？
```

この勘違いを引きずるとコンテナにbashでログインしてゴニョゴニョするみたいな使い方を想像してしまいがちですが、本来の使われ方としは違います。

# Dockerとは

https://www.docker.com/

```
Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications, whether on laptops, data center VMs, or the cloud.
```

Google翻訳

```
Dockerは、開発者やシステム管理者が、ラップトップ、データセンターのVM、クラウドなど、分散アプリケーションを構築、出荷、実行するためのオープンプラットフォームです。
```

つまり、仮想環境そのものでではなく、アプリケーションを構築(build)したり出荷(ship)したり実行(run)したりするためのプラットフォームです。

## イメージとは

Dockerを使う上で必要になってくるアプリケーションの雛形のことです。
[Docker Hub](https://hub.docker.com/)を見てみると、nginxとかrubyとかwordpressとかいろいろあります。
これらを利用して独自のイメージを作成することもできます。

### イメージの自作

DockerFileというものを用意して構築(build)することで独自のイメージを作成できます。
記事はいろいろ見つかると思うので、詳細は割愛とさせていただきます。

http://blog.flup.jp/2016/02/12/devenv_nginx_with_docker/

## コンテナとは

イメージを実行(run)することで作成されるプロセスです。

# 何ができるの？

コンテナ一つでは出来ることが限られますが、複数のコンテナを連携することで一つの大きなシステムを構築することができます。
その際に、一つ一つコマンドでやっていっても良いのですが、Docker Composeというツールが公式で用意されているので、そちらを使うことをおすすめします。

https://docs.docker.com/compose/overview/

ローカルの環境を汚さないという利点もあり、開発環境としてイメージを用意しておくことで新規参入のハードルを下げるなんてこともできます。
仮にコンテナが壊れた場合でも、そのコンテナを破棄してもう一度立ち上げ直すのも容易です。

## 例1

1. Webサイトをnginxイメージから作成しコンテナ名をwebとする
2. dbをMysqlイメージから作成しコンテナ名をmysqlとする
3. キャッシュdbをRedisイメージから作成しコンテナ名をredisとする
4. webとmysqlを接続しデータの読み書きを行う
5. webとredisを接続しセッションの管理を任せる

## 例2

https://qiita.com/y_hokkey/items/406b5a8c4bc15354d069
https://qiita.com/okamu_/items/1c8e5fde742ca165fa12
macOS High Sierraへのpyenv導入(2018年4月9日)

# 経緯
MacOSXにはもともとpython2.7系が入っている。
柔軟にpython2系と3系、anaconda等の環境を行き来したい。
自分はこれの上にanacondaとか入れてます。

# インストール
とりあえず今はbrewを使うのがもっとも簡便か。

```bash

$ brew update
$ brew install pyenv
$ which pyenv
/usr/local/bin/pyenv
$ pyenv root
/Users/(User_name)/.pyenv
$ export PATH=$(pyenv root)/shims:${PATH}
```

pyenvがどうやって複数のpythonのバージョンを管理しているか、またpathのexportの注意点なんかは[pyenvのGitHub](https://github.com/pyenv/pyenv)に詳しい。
MongoDBを用いたデータ作成の際に発生する translation エラーの対処方法

# エラー内容

```
translation missing: ja.mongoid.errors.messages.message_title: translation missing: ja.mongoid.errors.messages.invalid_value.message 
translation missing: ja.mongoid.errors.messages.summary_title: translation missing: ja.mongoid.errors.messages.invalid_value.summary 
translation missing: ja.mongoid.errors.messages.resolution_title: translation missing: ja.mongoid.errors.messages.invalid_value.resolution
```

# 開発環境

```Shell:CLI
$ ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]

$ bundle exec rails -v
Rails 5.1.4

$ mongo --version
MongoDB shell version v3.6.3
git version: 9586e557d54ef70f9ca4b43c26892cd55257e1a5
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
allocator: tcmalloc
modules: none
build environment:
    distmod: rhel70
    distarch: x86_64
    target_arch: x86_64

```

```ruby:Gemfile
gem 'mongoid', '~> 6.1.0'
```

# 対処方法

```ruby:config/application.rb
:
require 'i18n/backend/fallbacks'  # 追加
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)  # 追加
:
module MyApp
  class Application < Rails::Application
    :  
    config.i18n.fallbacks = { 'ja' => 'en' }  # 追加
```

```Shell:CLI
$ bundle exec rake unicorn:restart RAILS_ENV=development # 再起動
```

# 参考記事

* http://hivecolor.com/id/185
* https://coderwall.com/p/czn8xa/get-rid-of-the-mongoid-translation-missing-errors-mongoid-4-0-rails-4-0
Railsのinstance.first とか instance.last はソートもしてくれてしまう。

# lastとfirstメソッドは実はソートもしてくれていた。
モデルから生成したインスタンスの配列に限りますが、ソートしてくれてます

## 順番通り並ぶ配列も .last を実行すると逆順ソートになる

```rb:
[1] @todos.pluck(:name)
=> ["1番目のタスク", "2番目のタスク", "3番目のタスク"]

[2] @todos.last
=> #<id: xxx, name: "3番目のタスク">

[3] @todos.pluck(:name)
=> ["3番目のタスク", "2番目のタスク", "1番目のタスク"]
```

## 逆順ソートされた配列も .first をすれば元に戻る
```rb:
[4] @todos.first
=> #<id: xxx, name: "1番目のタスク">

[5] @todos.pluck(:name)
=> ["1番目のタスク", "2番目のタスク", "3番目のタスク"]
```

面白いですね。

##ちなみに以下のような、普通の配列だとこうなりません
```
todos = [1, 2, 3]
```

## どうやらソートしてるらしい。

```rb:
Person.first # returns the first object fetched by SELECT * FROM people ORDER BY people.id LIMIT 1
Person.where(["user_name = ?", user_name]).first
Person.where(["user_name = :u", { u: user_name }]).first
Person.order("created_on DESC").offset(5).first
Person.first(3) # returns the first three objects fetched by SELECT * FROM people ORDER BY people.id LIMIT 3
```

```rb:
# File activerecord/lib/active_record/relation/finder_methods.rb, line 118
def first(limit = nil)
  if limit
    find_nth_with_limit(0, limit)
  else
    find_nth 0
  end
end
```
Elasticsearch の検索結果を加工して Elasticsearch にインポートする

# はじめに

* Elasticsearch の検索クエリの実行結果を cURL と jq を使って加工して Elasticsearch にインポートする手順

# 検索クエリの実行

* 任意のクエリを実行して結果をファイルに保存する

```sh
curl -XGET 'http://localhost:9200/_search?size=1000' -o out.json
```

# 検索結果をインポート用のフォーマットに変換

* jq コマンドを使って検索結果を [Bulk API](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html) でインポートできるようなフォーマットに整形する

```sh
cat out.json | jq -c '.hits.hits[] | {"index": {"_index": ._index, "_type": ._type, "_id": ._id}}, ._source' > import.json
```

* 簡単に解説すると `.hits.hits[] |` でマッチしたドキュメントの配列をイテレーティブに処理対象とし ` {"index": {"_index": ._index, "_type": ._type, "_id": ._id}}, ._source` で個々のドキュメントごとにインポートする際のメタデータとデータ本体を改行区切りで出力している
* 結果として import.json は以下のようなファイルになる

```json
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }
{ "field1" : "value1" }
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } }
{ "field1" : "value1" }
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } }
{ "field1" : "value1" }
```

# 作成したファイルをインポートする

```sh
curl -XPOST http://localhost:9200/_bulk --data-binary @import.json
```

# 参考URL

* https://stackoverflow.com/questions/23798433/json-bulk-import-to-elasticstearch
* https://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html
レビューアメモ: シェルに渡すオプションはshebangではなくsetコマンドで指定しよう

## 3行まとめ

* シェルスクリプトを書く時は、1行目にshebang、2行目に`set`コマンドを指定すると良い。
* `set`コマンドでオプションを指定すると、shebang経由で起動した場合も、シェルにファイル名を指定して起動した場合も有効になる。
* shebangで指定したオプションは、シェルにファイル名を指定して起動した場合に有効にならない。

## 参考: shebangについて

シェルスクリプトや各種スクリプト言語のコードの1行目に書いてある以下の様な行を「shebang」（シェバン、シバンと呼ばれることが多い）と言います。

```
#!/bin/bash
```

shebangの詳細については『[シバン (Unix) - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_%28Unix%29)』などをどうぞ。

## 本題: shebangとsetの挙動の違い

シェル（`sh`、`bash`など）のオプションを指定する方法として、shebangで指定する方法、`set`コマンドで指定する方法があります。

shebangで指定する方法:

```
#!/bin/bash -u
```

`set`コマンドで指定する方法:

```
#!/bin/bash
set -u
```

なお、本記事の説明では、シェルとして`bash`、オプションとして`-u`を使用します。`-u`オプションは未定義の変数の参照をエラーとするオプションです。

### shebangで指定する方法（おすすめしない方法）

まずは、shebangでオプションを指定した場合の挙動について確認してみます。実験用のファイルは`shebang.sh`で、ファイルのパーミッション、内容は以下の通りです。

```
$ ls -l shebang.sh
-rwxrwxr-x 1 yuya yuya 42  4月  9 14:10 shebang.sh

$ cat shebang.sh
#!/bin/bash -u
echo ${UNDEFINED_VARIABLE}
```

shebangを経由して起動した場合、`-u`オプションが有効となり、未定義変数の参照がエラーとなっています。終了コードも「失敗」を意味する`1`（非ゼロ）となっています。

```
$ ./shebang.sh; echo $?
./shebang.sh: line 2: UNDEFINED_VARIABLE: unbound variable
1
```

一方、シェルの引数としてファイル名を指定して起動した場合、`-u`オプションが有効とならず、未定義変数の参照がエラーになりません。終了コードも「成功」を意味する`0`（ゼロ）となっています。

### `set`コマンドを使う方法（おすすめする方法）

次に、`set`コマンドを使ってオプションを指定した場合の挙動について確認してみます。実験用のファイルは`set.sh`で、ファイルのパーミッション、内容は以下の通りです。

```
$ ls -l set.sh
-rwxrwxr-x 1 yuya yuya 46  4月  9 14:11 set.sh

$ cat set.sh
#!/bin/bash
set -u
echo ${UNDEFINED_VARIABLE}
```

shebangを経由して起動した場合、`shebang.sh`と同様に、`-u`オプションが有効となり、未定義変数の参照がエラーとなっています。終了コードも「失敗」を意味する`1`（非ゼロ）となっています。

```
$ ./set.sh; echo $?
./set.sh: line 3: UNDEFINED_VARIABLE: unbound variable
1
```

また、シェルの引数としてファイル名を指定して起動した場合も、上記と同様、`-u`オプションが有効となり、未定義変数の参照がエラーとなっています。

```
$ /bin/bash set.sh; echo $?
set.sh: line 3: UNDEFINED_VARIABLE: unbound variable
1
```

このように、`set`コマンドを用いると、どちらの方法で起動された場合でも、意図したオプションを渡すことができます。

## 「レビューアメモ」について

コードレビューのレビューアとして何度かコメントした内容について、情報共有のために記事化したものです。
【SOQL】Salesforce開発者コンソール（Query）の使い方

# **はじめに**
Salesforce内開発者コンソールでのSOQLの記述をまとめました。

# **コンソール（Query）の基本**
まず、右上のユーザ名→開発者コンソールをクリックします。

コンソール画面で、
File　→　OpenResource　→　selectしたいオブジェクトを選択し、openをクリック
（取引先責任者だったらcontact、今回はcontactを指定）

また、openしたオブジェクトからselectしたい項目を複数指定して、左下のQueryをクリック。
（複数選択の仕方は、command押しながらクリック）

<img width="1356" alt="スクリーンショット 2018-04-09 14.11.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/240803/a2784651-1235-9d8e-a025-809513927ec1.png">

Queryをクリックすると、下のQueryEditorにクエリが表示されるので、Exacuteを押すとデータを見ることができる。

<img width="1362" alt="スクリーンショット 2018-04-09 14.14.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/240803/1cf7934d-c1fb-dd45-48b2-50989587f267.png">

直接最初からQueryEditorに書いてもOK。

# **件数制限**
ここからは、SalesforceのSOQLの記述について書いていきます。
10件だけ表示したい場合は

```SQL:
select Id,Name from Contact LIMIT 10
```

最後にLIMITを記述。

# **件数確認**

```SQL:
select count(Id) from contact
```


重複除外した件数はこんな感じ

```SQL:
SELECT COUNT_DISTINCT(Name) FROM Account
```


# **条件指定**

##String型

名前がテストの人を検索

```SQL:
select Id,Name from contact where Name = 'テスト'
```

名前にテストが含まれている人を検索

```SQL:
select Id,Name from contact where Name LIKE '%テスト%'
```

名前にテストが含まれていない人を検索

```SQL:
select Id,Name from contact where NOT (Name LIKE '%テスト%')
```


##Boolean型

true,falseは''で囲わない

```SQL:
SELECT Id, IsDeleted FROM Contact where IsDeleted = true
```


##Date型

< > <= >=　の記号も使える。

日付型も''で囲わない。yyyy-mm-ddで記述

```SQL:
SELECT Id, Birthdate FROM Contact where Birthdate = 1951-09-07
```

下記のように、todayやyesterdayでも指定できる。

```SQL:
SELECT Id, Birthdate FROM Contact where Birthdate = today
```
>詳細：SalesforceDevelopers「日付形式と日付リテラル」
>https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_dateformats.htm

##DateTime型

< > <= >=　の記号も使える。
またData型同様、todayやyesterdayでも指定できる。

```SQL:
SELECT Id, CreatedDate FROM Contact where createddate = 2018-01-30T00:00:00.000+0000
```

##LIKE句
```SQL:
select Id,Name from contact where Name like '田中%' 
```
##NOT LIKE句
```SQL:
select Id,Name from contact where (NOT Name like '田中%')
```


## **並び替え**
日付の順番、数字の順番に並び替える

- 昇順

```SQL:
SELECT Id, CreatedDate FROM Contact order by createddate
```

- 降順

```SQL:
SELECT Id, CreatedDate FROM Contact order by createddate desc
```

# **参照先の情報を取得**

参照項目の先の項目の値を取得したい時は、
参照項目名.参照先の項名目　と記述する。

カスタム項目の場合、__c を　 __r にかえる

```SQL:
SELECT Id,Account.Name FROM Contact
```




# **エラーになる場合**
- ロングテキストエリア、リッチテキストエリアの項目はWHERE句に指定できない
- 件数が多すぎるとエラーになる


# **最後に**
salesforceのSOQLは結構制限がありますが、
少し確認したい時など、とても便利に使えるのでもっと様々な機能を勉強して活用していきたいと思います！
直接ネットワークに接続されていない環境でyumとgitコマンドを通す方法

# プロキシサーバを介してyum,gitを叩く
WEB1,WEB2環境にミドルウェアをインストールしないといけないのに、以下みたいな構成だったので、yumとかgitが通らなかった。
手動でインストールする手もあるが、依存性とか怖いな・・・というときに使う設定方法。

```
                                                  +
                                                  |
                                                  |
                                                  |
                                                  |       Internet
+-----------+             +-----------+           |
|           |             |           |           |
|           |             |           |           |
|    WEB1   +-------+-----+   Proxy   <----------->
|           |       |     |           |           |
|           |       |     |           |           |
+-----------+       |     +-----------+           |
                    |                             |
                    |                             |
+-----------+       |                             |
|           |       |                             |
|           |       |                             |
|    WEB2   +-------+                             |
|           |                                     |
|           |                                     |
+-----------+                                     |
                                                  |
                                                  |
                                                  |
                                                  +
```

図はここで作成
[ASCIIFlow Infinity](http://asciiflow.com/ "ASCIIFlow Infinity")

## 外部ネットに直接つながっているサーバから、SSHトンネルを掘る
上記の図でいうとWEB1,WEB2から以下のコマンドを打つ

```bash
$ /usr/bin/ssh -NT -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -i /root/.ssh/id_rsa -D 10080 {hostname}(上記でいうとProxy)
```

このコマンドを打つと、Control + Cで止めるまで何も打てなくなるので、最後に　& を付けておくか、ターミナルを複製しておくとよいです。

## yumのconfに指定のProxyを利用して接続することを明示
以下の行を```yum.comf```に追加します。

```yum.conf
proxy=socks5h://localhost:10080 
```

## git側のプロキシ設定
gitはコマンドでプロキシの設定が完了する。楽ね:relaxed:

```bash
$ git config --global http.proxy http://proxy.example.com:8080
$ git config --global https.proxy http://proxy.example.com:8080
```

あとはgit clone とか　yum install とか打てはちゃんと通るようになってるはずです。
Gobox (ピュアGoで書かれたbusybox風の何か) を試す

# gobox とは

"Something like busybox in pure Go"
https://github.com/surma/gobox

「ピュアGoで書かれたbusybox風の何か」

# インストール

```
go get github.com/surma/gobox
```
$GOROOT/bin に実行ファイルができていました。

```
$ ls -lh ~/go/bin/gobox
-rwxrwxr-x 1 koba koba 7.3M Apr  9 05:33 /home/koba/go/bin/gobox
$ file ~/go/bin/gobox
/home/koba/go/bin/gobox: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, not stripped
```

strip したらサイズは4.7MBになりました。

```
$ cp ~/go/bin/gobox .
$ cp gobox gobox.unstripped
$ strip gobox
$ ls -lh gobox*
-rwxrwxr-x 1 koba koba 4.7M Apr  9 05:41 gobox
-rwxrwxr-x 1 koba koba 7.3M Apr  9 05:40 gobox.unstripped
```

```
$ ./gobox
`gobox` [options]
  -help
    	Show help
  -install string
    	Create symlinks for applets in given path
  -list
    	List applets

Version 0.3.1
List of compiled applets:

zcat, sh, mount, chroot, httpd, mknod, ps, umount, mkdir, grep, ls, rm, wget, kill, cat, head, gzip, gunzip, echo, shell, telnetd, gobox, 
```

使えるコマンドはまだこれだけ。でもなんか面白そう。
意地でもgolangだけでrootfsを作りたいときに。
Homebrew の PHP インストール方法が変わって imagick 入れるまで

Homebrewの homebrew/php が使えなくなった。

参考: https://brew.sh/2018/01/19/homebrew-1.5.0/

`php71`とかで始まるパッケージはすべて消失したので、`php@7.1`で入れる。こちらのページを参考に: http://rskull.hateblo.jp/entry/2018/04/06/164236

で、intlとかmcryptとかは最初から入ってたんだけど、 imagickを入れたかった。でも、`php71-imagick`はもうない。ので、`pecl` で入れる。

```
pecl install imagick
```

が、`php -v` 実行するとエラーが出る。

```
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/Cellar/php@7.1/7.1.16/lib/php/20160303/imagick.so' - dlopen(/usr/local/Cellar/php@7.1/7.1.16/lib/php/20160303/imagick.so, 9): image not found in Unknown on line 0
```

ライブラリがロードできてないとな。たしかに、`/usr/local/Cellar/php@7.1/7.1.16/lib/php/20160303/imagick.so`というファイルはなくて、実際探すとファイルは`/usr/local/lib/php/pecl/20160303/imagick.so`にある。homebrewとpeclの相性を解決しないといけない気がする。

で、`php.ini`を修正するんだけど、なんか`php.ini`を開くと、一番上に`imagick.so`が無理やり追加されててひどい。

```
extension="imagick.so"
[PHP]
```

ひどいので、この行を削除して`/usr/local/etc/php/7.1/conf.d/ext-imagick.ini` を作った。

```
[imagick]
extension="/usr/local/lib/php/pecl/20160303/imagick.so"
```

これで、`php -i`でチェックすると、ちゃんと入っている模様。

```
imagick

imagick module => enabled
imagick module version => 3.4.3
imagick classes => Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator, ImagickKernel
```

参考リンク: https://github.com/Homebrew/homebrew-core/issues/26108
ローカルで動くDB2アプリがIBM Cloudで動かなくてハマった話

ローカルで動いたNode.js × Db2 Warehouseのアプリケーションが、IBM Cloudにプッシュすると挙動が変わってハマったのでメモ

#状況
- NodejsでIBM Cloudのサービス「DB2 Warehouse」を利用している
- npmのパッケージ[ibm_db](https://www.npmjs.com/package/ibm_db)を利用している
- ローカルでテストするとエラーなく動く
- IBM Cloudにデプロイすると以下のエラーが発生する

`SQL0010N「string で始まるストリング定数に、終わりの区切り文字が ありません。」`


#クラウド上でエラーがでたコード
```javascript
var ibmdb = require('ibm_db');
 
ibmdb.open("DATABASE=<dbname>;HOSTNAME=<myhost>;UID=db2user;PWD=password;PORT=<dbport>;PROTOCOL=TCPIP", function (err,conn) {
  if (err) return console.log(err);
  
  conn.query('select 1 from sysibm.sysdummy1', function (err, data) {
    if (err) console.log(err);
    else console.log(data);
 
    conn.close(function () {
      console.log('done');
    });
  });
});
```

#対処方法
明確な原因は不明であるが、同パッケージで提供されている[prepareSync(sql)](https://www.npmjs.com/package/ibm_db#9-preparesyncsql)を利用すると正常に動いた。

```javascript
var ibmdb = require("ibm_db")
  , cn = "DATABASE=dbname;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=dbuser;PWD=xxx";
 
ibmdb.open(cn,function(err,conn){
  var stmt = conn.prepareSync("select * from employee where empid = ?");
 
  //Bind and Execute the statment asynchronously
  stmt.execute([142], function (err, result) {
    data = result.fetchAllSync();
    console.log(data);
    result.closeSync();
    stmt.closeSync();
 
    //Close the connection
    conn.close(function(err){});
  });
});
```
Python UTF-8のCSVファイル読み込み (UnicodeDecodeError対応)

PythonでCSV(UTF-8)を読み込みするとエラーが発生したときの対応。
encodingでUTF-8を指定した。[Python3 公式CODEC一覧](https://docs.python.jp/3/library/codecs.html)

UTF-8は指定なしで読み込めるらしいけど、環境によるのかな。
今度まじめに調べたら記事更新しよう。

---

[shiracamus](https://qiita.com/shiracamus)さんからコメントで教えて頂きました。
デフォルトはOS標準になるとのことです。

---

## 環境

* Windows10
* Python3.6.0

## 発生したエラー

```
UnicodeDecodeError: 'cp932' codec can't decode byte 0x86 in position 35: illegal multibyte sequence
```

## 正常に動作したコード

```python
import csv

with open('data.csv', encoding="utf_8") as file:
    reader = csv.reader(file)

    for row in reader:
        print(row)
```
※"utf_8" -> "utf-8"でも動く
※引数でファイルを開くモードはデフォルトがmode='r'(読み込み用)なので読み込み用途なら省略できます。
riot.js tagの存在タイミング

### on or one('mount',...) で図る。
codeMirrorのようなdocument.bodyに存在していなければフォーマットが崩れる場合、dom生成のタイミングは重要。

```html
<script src="//gnjo.github.io/riot.js"></script>
<h1>dom exist check</h1>
<test></test>
<script type="text/plain" name="cheat-sheet">
this.one this.on this.off this.trigger:
update updated before-mount mount
before-unmount unmount
</script>
```
```js

riot.tag(
 'test'
 ,`<h3 id={x} onclick={click}>{message}</h3>`
 , function(opts){
   message='click me'
   x='xxx'
   
   console.log('constructer',document.querySelector('#xxx')) // not join body
   this.one('mount',()=>{
    console.log('mount-ed',document.querySelector('#xxx')) //slave the body
   })
   click=function(ev){
    message = (document.querySelector('#xxx'))?'is':'not'
   }
});

//finally one;
riot.mount('test');

```
LINEAR16 ファイルを再生する方法

Google Speech API にてストリーミング音声処理を行う場合、 `LINEAR16` 形式のファイルで認識する。
このファイルには、 `.wav` ファイルのようにヘッダーに音声情報が乗っているわけではない為、
サンプルレート、エンコード タイプ、チャンネル数を指定する必要がある。

SoX を利用して再生する場合、 '.wav' ファイルならば何も気にせず `play ファイル名` を指定すれば良いが、 
`LINEAR16` は以下のようなコマンドを書く必要がある。

```
play -t raw --channels=1 --bits=16 --rate=44100 --encoding=signed-integer --endian=little audio_2018-04-09_10-31-57.raw
```

音声って難しい。

参考:
https://cloud.google.com/speech/docs/support#troubleshooting
【備忘録】id名やclass名を日本語で書いてみた結果

実際に使う場面が有るかどうかはさておき。。。
一応、こんなことも出来るのかというメモまでに。

>参考サイト
>[CSSのid,class名には日本語や記号が使用可能(すべてのブラウザで) | iwb.jp](https://iwb.jp/css-id-class-name-zenkaku-kigou/)


#【検証】id名やclass名に日本語を書いてみる
実際にどうなるか、CodePenにて書いてみたのがこちらです。
（CSSやJSをポチポチしながら、コードをご確認ください。）
<p data-height="265" data-theme-id="0" data-slug-hash="aYPJam" data-default-tab="html,result" data-user="kako3" data-embed-version="2" data-pen-title="【検証実験】id名やclass名に日本語（漢字やひらがな）を使ってみる" class="codepen">See the Pen <a href="https://codepen.io/kako3/pen/aYPJam/">【検証実験】id名やclass名に日本語（漢字やひらがな）を使ってみる</a> by kako3 (<a href="https://codepen.io/kako3">@kako3</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

本当に、つかえたー！というメモまでに。


#【おまけ】中国語(簡体字)も混ぜて書いてみる → 言語がまざってても大丈夫だった

中国語（簡体字）なんかも混ぜてかいてみた結果がコチラです。
折角なので、中国語と日本語を混ぜた変数名とかもかいてみました。
（CSSやJSをポチポチしながら、コードをご確認ください。）
<p data-height="265" data-theme-id="0" data-slug-hash="oqJqjV" data-default-tab="html,result" data-user="kako3" data-embed-version="2" data-pen-title="【検証実験】id名やclass名に日本語や中国語（簡体字）を混ぜて使ってみる" class="codepen">See the Pen <a href="https://codepen.io/kako3/pen/oqJqjV/">【検証実験】id名やclass名に日本語や中国語（簡体字）を混ぜて使ってみる</a> by kako3 (<a href="https://codepen.io/kako3">@kako3</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
コメントでのご指摘ありがとうございました m(_ _)m



---
2018/04/09：
「【おまけ】中国語(簡体字)も混ぜて書いてみる → 言語がまざってても大丈夫だった」を追記しました。
リストの要素をN個に限定する

マリオ3の動画を見ていた時に、画面上に最大1個しか出ない（新しいのが出たら古いのは消える）、移動床が出てきたので、最新のN個の要素だけのリストを返す関数を作ってみました。

```defs.py
#elementsはリスト、nは要素の個数
def limited_list(elements, n):
    list = []
    for element in elements:
        list.append(element)
    n = len(list) - n
    del list[0:n]
    return list

ls = [1,2,3,4,5,6]
print(limited_list(ls, 3)) 
```

実行結果

```
[4, 5, 6]
```
３分で分かるReactNativeへのFlow導入

ReactNativeには最初から.flowConfigが存在している。
よって、Flowの導入は素早く終わる。
それでは始めよう

1. .flowConfigを開き、最下部のversion numberをチェック。（仮に0.61.0だとする）
2. ターミナルでyarn add --dev flow-bin@0.61.0 babel-preset-flow
3. .babelrcに

```
{
  "presets": ["react-native", "flow"]
}
```
を追加

終

最後に、使いやすくするための２つのスクリプトを追加しよう。
package.jsonを開き、

```
"scripts": {
  "flow": "flow",
  "flow-stop": "flow stop",
}
```

ただこのままではnode_module以下もFlowがチェックしてしまうので、.flowconfigに

```
[ignore]
.*/node_modules/.*
```
を付け足す

またimport {...} from 'react-native'の箇所でエラーが出るので、
1. flow-typedフォルダを作る
$ mkdir flow-typed
2. ファイルを加える
$ touch react-native.js
3. react-native.jsに以下を書き加える

```
declare module 'react-native'{declare module.exports: any;}
```

これで全てが完了した。
おめでとう。

一つ注意として、
class App extends Component {
と書くと
Componentには少なくとも一つの引数が必要だと怒られるので
class App extends Component<{}> {
と書こう

このままではImageを使うとエラーが出るので、

```
module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'
```
に以下のようにコードを足す

```
module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub'
module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'
```
未公開サイトにおけるTwitterカードのテスト方法

# 概要

例えば、公開前のサイトで確認のために会社のIPからのアクセスのみ許可している場合など、一般に公開していない状態でTwitterカードの表示テストを行いたい場合の対応方法について。

# Twitterカードの仕組み

TwitterのクローラーがWebページのmeta情報を取得して表示するようになっている。
[Cards markup — Twitter Developers](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/markup)
要は検索エンジンと同じような仕組み。

# Twitterカードのテストを行う方法

わざわざテストツイートをしなくても、公式でテスト用ツールを用意してくれている。
[Card Validator \| Twitter Developers](https://cards-dev.twitter.com/validator)

# 未公開サイトでテストを行う方法

TwitterのクローラーのIPを許可することによって、Twitterカードの表示が可能となる。
**※ 普通にURLをツイートすると第三者からもTwitterカードが確認できる状態になるため、注意すること**
厳密にやるなら、URLを推測されにくいものにしたり、テスト用のドメインに配置すべき。本番での最終確認は直前のほうが望ましい。

現在公開されているクローラーのIPは以下。

- 199.16.156.0/22
- 199.59.148.0/22

例えばnginxなら以下のような設定になる。

```nginx
location /hoge {
  allow xxx.xxx.xxx.xxx; # 会社IPとか
  allow 199.16.156.0/22; # Twitter crawler
  allow 199.59.148.0/22; # Twitter crawler
  deny all;
}
```

参考：[Troubleshooting cards — Twitter Developers](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/guides/troubleshooting-cards)

> Your web host may be blocking web crawler access to your site. You should contact your hosting provider and ask them to ensure they are not blocking Twitter access by either IP or ASNUM. Twitter’s aggregate outbound IP ranges are 199.16.156.0/22 and 199.59.148.0/22. Twitter’s ASNUM is AS13414.
HTML&CSS 親要素を基準に場所指定

# 自由に位置指定（position: absolute;）

<img width="301" alt="スクリーンショット 2018-04-09 12.44.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/240803/61858c27-8133-3aa3-d5ed-9416a69b27d2.png">

例えば「クッキーです」をクッキーの文字を中央に配置したい場合、
CSSのposition:  absolute;を適用させると好きな位置に表示することができます。

```html:position.html
<body>
  <div>
    <img src="https://4.bp.blogspot.com/-IPgMsDU3gEY/WlGniuLH4rI/AAAAAAABJcE/N6gtYqfooeIsJXz6pU_iBgLbc2uGdQSGACLcBGAs/s250/biscuit3.png">
    <div class="child">クッキーです</div>
  </div>
</body>
```

```css:position.css
.child {
  position: absolute;
  top: 119px;
  left: 80px;
}
```

<img width="267" alt="スクリーンショット 2018-04-09 12.50.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/240803/9ab47899-6f42-03b7-fb23-7db5246d4ad5.png">

サイトの左上を基準とし、top（上からの距離）とleft（左からの距離）を指定できます。

# 親要素を基準に位置指定（position: relative;）

例えばサイトの左上からだと指定しづらい場合、
基準としたい親要素にposition: relative;と指定すると、親要素の左上部分が基準位置となります。

```html:position.html
<body>
  <div>
    <img src="https://4.bp.blogspot.com/-IPgMsDU3gEY/WlGniuLH4rI/AAAAAAABJcE/N6gtYqfooeIsJXz6pU_iBgLbc2uGdQSGACLcBGAs/s250/biscuit3.png">
    <div class="child">クッキーです</div>
  </div>


  <div class="parent">
    <img src="https://4.bp.blogspot.com/-IPgMsDU3gEY/WlGniuLH4rI/AAAAAAABJcE/N6gtYqfooeIsJXz6pU_iBgLbc2uGdQSGACLcBGAs/s250/biscuit3.png">
    <div class="child2">クッキーです</div>
  </div>
</body>
```

```css:position.css
/*1つ目のクッキー*/
.child {
  position: absolute;
  top: 119px;
  left: 80px;
}

/*2つ目のクッキー*/
/*基準としたい親要素*/
.parent {
  position: relative;
}
.child2 {
  position: absolute;
  top: 119px;
  left: 80px;
}
```

・ 2つ目のクッキーのCSSが適用されていない場合
<img width="285" alt="スクリーンショット 2018-04-09 12.59.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/240803/f940445a-eb2a-d978-63f6-4268141f98ca.png">

↓

・ 2つ目のクッキーのCSSが適用された場合

<img width="279" alt="スクリーンショット 2018-04-09 13.07.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/240803/b54e4858-27ff-f163-65a0-c1f86460d1aa.png">
UiPath Studio のライセンス期限が切れた時の対処法

先日、UiPathを起動すると表示される、
"Welcome to UiPath Studio"のウィンドウで、
普段「Continue Free」の箇所が別の文字になっていました。
（なんて書かれていたかは忘れました；）

クリックをすると、
以下のような見慣れないウィンドウが開きました。

![更新.png](https://qiita-image-store.s3.amazonaws.com/0/234754/592a984d-ae98-0eb3-f1b9-0537ebd86f2e.png)

どうやらUiPathのライセンス期限が切れてしまった模様...??

ということで、今回は
ライセンス更新方法をご紹介します。
（といっても参考URLをご紹介するだけですが）

##ちょっと試してみてほしいこと
まずは登録したメールアドレスを入力し、
Activateをクリックしてみましょう。

私は一回これで使えるようになりました。
（理由は不明）

##ライセンス更新方法が書かれているサイト
[こちら](https://forum.uipath.com/t/community-edition/17454/4)に解決方法が記載されていました。

[UiPath](https://www.uipath.com/renew-community-license)のサイトから再度アドレス等を入力し、
更にDevice ID（画像にあるウィンドウで記載されている。もしくはUiPath StudioのHelp画面の右側からも確認できる。）を入力、
そしてRENEW COMMUNITY LICENSE のボタンをクリック。

その後先程のウィンドウの UiPath Studio にてメールアドレスを入力し、
Activate のボタンをクリック！

これで期限が伸び、
再度使用できるようになるはずです。



　



　



　

といっても、これがいつまで可能かは私もわからないです...
まぁ無料で使わせていただいている身ですので^^；

以上です！
JAVASilver資格の受験記録

#**受験にかかった費用**
受験費：28,728円
テキスト代：3540円　+　3776円

総費用：36044円

やっぱり資格って高いですね、、

#**書籍**
<img src="https://images-na.ssl-images-amazon.com/images/I/9158-tMCrJL.jpg" width=30%>　　<img src="https://www.seshop.com/static/images/product/18928/LL.jpg" width=30%>

私は上記2冊を使って勉強しました。
- 左（黒本）：難しい。隅々まで対策できる。黒本と言われているだけあり、実際に試験に出る問題もある。資格を取得するならこの本は必須だと思う。
- 右（白本）：簡単め。こちらから勉強を始めたので、スムーズに勉強を進めることができた。隅々までは対策できないので黒本を買う必要がある。


#**勉強期間**
約3ヶ月間。
正直ちゃんと勉強したのは最後の2週間くらいです。

#**感想**
最初は過去問を解いた時はほとんど不正解で心折れそうになりましたが、
各章を約5回ずつ解いたら基礎が身につきました。
でも、第9章のラムダ式なんかは最後までわからなかった、、
S3 の put event を sns に流そうとした時の Permissions error の解決方法

## 課題

```
Unable to validate the following destination configurations. Permissions on the destination topic do not allow S3 to publish notifications from this bucket. ( arn:aws:sns:ap-northeast-1:1234:sns_name)
```

などと出る

## 解決方法

下記のように SNS の Topic Policy を変更する。

```
"Condition": {
  "ArnLike": {
    "aws:SourceArn": "arn:aws:s3:*:*:HOGE_BUCKET"
  }
}
```

か

```
    {
      "Sid": "SendToSnsTopic",
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "arn:aws:sns:REGION:AWS_ACCOUNT_ID:S3_BUCKET_NAME"
    }
```
Qiita > Hexadecimal Triple Color Codes > #239の横の色付きボックス

### ハッシュ値の横の色付きボックス

`#239`

上記は以下の文字列を記載した場合のレンダリング。

```
`#239`
```

4桁では出ない。

`#3141`

`#2718`

3桁で出る。

`#314`

`#271`

2桁では出ない。

`#31`

`#27`

### link

Hexadecimal Triple Color Codes
http://www.december.com/html/spec/color3hex1.html

用途は不明。
2018年4月現在のQiita上でのみ有効。

[Scipy lecture notesのGitHub issueの記事](https://qiita.com/7of9/items/95b70d9174f4df1f6a78)を書いていて見つけた。

`#B00` `#00F` `#FFF` (xラえもん)

### esa.io

esa.ioでは色付きボックスは表示されない。
PHPからFTPSで接続したときのエラー対応

かなり特殊事例のため、主に自分用メモ。
PHPからFTPSで接続してデータ転送をするとき、コネクションは確立できるもののput時に下記エラーが出て転送できないときの対応。
ftp_put(): php_connect_nonb() failed: Operation in progress (115) 

## エラーパターン
```ftp_conn_ng.php
$ftpInfo = [
  "ftpServer" => aaa.bbb.com,
  "ftpPort"   => 21,
  "ftpUser"   => user,
  "ftpPass"   => pass
];

$data = [
  "local"  => "localdir/file.txt",
  "remote" => "remotedir"
];

$connection = ftp_ssl_connect($ftpInfo['ftpServer'],$ftpInfo['ftpPort']);
$login_result = ftp_login(
  $connection,
  $ftpInfo['ftpUser'],
  $ftpInfo['ftpPass']
);

if($login_result){
  ftp_pasv($connection, true);
  $result = ftp_put($connection, $data["remote"]."/".basename($data["local"]), $data["local"], FTP_BINARY);
}
ftp_close($connection);
```

## 修正版
ftp_set_optionでFTP_USEPASVADDRESSの値をfalseに変更

```ftp_conn_ok.php
$ftpInfo = [
  "ftpServer" => aaa.bbb.com,
  "ftpPort"   => 21,
  "ftpUser"   => user,
  "ftpPass"   => pass
];

$data = [
  "local"  => "localdir/file.txt",
  "remote" => "remotedir"
];

$connection = ftp_ssl_connect($ftpInfo['ftpServer'],$ftpInfo['ftpPort']);
$login_result = ftp_login(
  $connection,
  $ftpInfo['ftpUser'],
  $ftpInfo['ftpPass']
);

if($login_result){
  ftp_set_option($connection, FTP_USEPASVADDRESS, false); // ← 追加
  ftp_pasv($connection, true);
  $result = ftp_put($connection, $data["remote"]."/".basename($data["local"]), $data["local"], FTP_BINARY);
}
ftp_close($connection);
```

とりあえずこれで動くようにはなったものの、FTP_USEPASVADDRESSの意味がいまいち分からず。。
誰かご存知の方いましたら教えてください。