OmniAICreator/Qiita-1.07M huggingface dataset:
Apollo Server でモックサーバー立てる

Apollo Serverの`mocks` オプションが地味に便利だったのでそれを紹介します。

## シンプルな実装例
とりあえず動かせる最小の書き方。

事前に `yarn add apollo-server` しておきます。

```js:server.js
const { ApolloServer, gql } = require('apollo-server');

const typeDefs = gql`
  type Query {
    hello: String
    number: Int
  }
`;

const server = new ApolloServer({
  typeDefs,
  mocks: true
});

server.listen().then(({ url }) => {
  console.log(`🚀 Server ready at ${url}`);
});
```

これで `node server.js` で実行すると動く。ちなみにブラウザで開くとgraphiql的なもの([playground](https://github.com/prismagraphql/graphql-playground))が表示される。便利。

![スクリーンショット 2018-07-01 16.52.46.png](https://qiita-image-store.s3.amazonaws.com/0/150569/3dad6de9-0286-b126-fb3e-3c4f2ea5db49.png)


mocksをbooleanの値渡すとapollo-serverが定義している適当な値を勝手に入れてデータ返してくれる。例えばStringだったら`"Hello World"`という文字列が入るみたいで、Intだったらランダムな数字が返ってくる。

本当に型さえあってれば中身がどうでもいいならこれでもう十分かもしれない。

## モックデータを自分で定義する
ある程度自分で定義したい場合は `mocks` プロパティにbool値でなくオブジェクトを入れてあげる。
この時オブジェクトは「この型の場合、こういう値」という指定の仕方をする。

例えばPrimitiveデータに対してはこんな感じ。

```js
const mocks = {
  Int: 6,
  String: 'whatsup'
};

const server = new ApolloServer({
  typeDefs,
  mocks
});
```

関数にすることもできる。
↓ 例えばランダムな数字を返したい場合以下のように書く。

```js
const mocks = {
  Int: () => Math.floor(Math.random() * 100),
};
```

オブジェクトに対して個別にモックデータ書く場合はこう書く。(ちなみにランダムなそれっぽい値を出すために[casual](https://github.com/boo1ean/casual) というライブラリを使っています)

```js
const typeDefs = gql`
  type Query {
    person: Person
  }

  type Person {
    name: String
    age: Int
  }
`;

const mocks = {
  Person: () => ({
    name: casual.name,
    age: () => casual.integer(0, 120)
  })
};
```

![スクリーンショット 2018-07-02 20.39.26.png](https://qiita-image-store.s3.amazonaws.com/0/150569/46f8ad74-7e17-e202-4fef-a09e05000e99.png)


ちなみにgraphql-toolsの`addMockFunctionsToSchema`と何が違うんだと聞かれると、特に違いはなく、というかapollo-serverの内部で`addMockFunctionsToSchema`を使っているみたいです。(コードはパッと見あたりをつけられなかったが[ドキュメントの下の方](https://www.apollographql.com/docs/apollo-server/v2/features/mocking.html#API)に書いてある)
ただapollo-server単体でplayground付きのモックサーバーがサッと作れるのはお手軽でいいなと思いました。

## 感想
* 便利。
* 本題と完全に逸れるけどcasualってライブラリ地味に便利。この発想はありそうでなかった。
インターフェイス

#インターフェイス
インタエーフェイとは、オブジェクトを外部とつなぐための機能で、身の回りにある工業製品に対して使われている「インターフェイス」と同じ意味です。
オブジェクト指向におけるインターフェイスもまったくおなしで、カプセル化されたオブジェクトにアクセスするためのインターフェイスという概念が存在します。
#インターフェイスの宣言
```C#
[修飾子] interface インターフェイス名
{
.......メンバの宣言
}
```
インターフェイスのメンバーを宣言する際には、修飾子を除いた宣言部分のみ記述します。
#インターフェイスの継承
インターフェイスを継承する構文は、クラスを継承する場合と同じです。インターフェイスは多重継承することができます。継承したい型が複数ある場合は、「,」（カンマ）で区切ります。
##インターフェイスを継承したクラスの構文
```C#
[修飾子] class クラス名:[基本クラス名], [各インターフェイス...]
```
インターフェイスの多重継承を使ったModel Baseクラスの宣言
```C#
class ModelBase : ViewModelBase, IDataErrorInfo, IProPertyChanged
{
     //メンバの実装
}
```
manコマンドの存在を知る

未経験からのRailsエンジニアとして就職を目指すため、[Fjord Boot Camp](https://bootcamp.fjord.jp/practices/2)を始め、[Webデザイナーの為の「本当は怖くない」“黒い画面”入門 ](http://fjord.jp/articles/548.html)のチュートリアルを読みながら、よく使うコマンドを学習。

`$ man　コマンド名`

コマンドのマニュアルを見るド基本すぎるコマンドだが、私はその存在を知らなかった。

手始めにマニュアルのマニュアルを表示。

![スクリーンショット 2018-07-02 20.21.13.png](https://qiita-image-store.s3.amazonaws.com/0/267695/3c9bdc34-e7c6-c306-86a6-a726d97a0dd1.png)

SYNOPSIS：辞書的に訳すとすると「概要」だが「書式」とするらしい、 []内は省略可能
DESCRIPTION：こちらは素直に「説明」

違う画面になると焦るが、「q」で終了、「/」のあとに文字列を入れると検索できる。
コピペ用VBAコード

##### 前提条件
ここに記載のプロシージャが必要です。
https://qiita.com/hayakawa_qiita/items/f783e42e4bcece87c1c0

```vb

'------------------------------------------------------
' ホットキー設定
'------------------------------------------------------
Public Sub StartOriginalHotkey()
    Application.OnKey "^%h", "ActionCtrlAltH"
    Application.OnKey "^%j", "ActionCtrlAltJ"
    Application.OnKey "^%;", "ActionCtrlAltSemicolon"
End Sub
Public Sub StopOriginalHotkey()
    Application.OnKey "^%h"
    Application.OnKey "^%j"
    Application.OnKey "^%;"
End Sub
Public Sub ActionCtrlAltH()
    Dim sheet As Worksheet
    Set sheet = Workbooks("～～.xlsx").Sheets("Sheet1")
    sheet.Shapes("わく").Copy
    ActiveSheet.Paste
End Sub
Public Sub ActionCtrlAltJ()
    Dim sheet As Worksheet
    Set sheet = Workbooks("～～.xlsx").Sheets("Sheet1")
    sheet.Shapes("こねくた").Copy
    ActiveSheet.Paste
End Sub
Public Sub ActionCtrlAltSemicolon()
    'rowIdx = ActiveCell.row
    'Rows(ActiveCell.row & ":" & ActiveCell.row + 3).Insert
End Sub


'------------------------------------------------------
' SQLログからSQL文組み立て
'------------------------------------------------------
Public Function HereSql(preparing As String, parameters As String)

    Dim sql As String
    sql = preparing
    Dim param As Variant
    For Each param In Split(parameters, ",")
        sql = Replace(sql, "?", toSqlValue(CStr(param)), , 1)
    Next
    HereSql = sql

End Function
Private Function toSqlValue(param As String)
    Dim sqlValue As String
    Dim dataValue As String
    Dim dataType As String
    
    Dim ms As Object
    Set ms = RegExp(Trim(param), "(.+)\((.+)\)$")
    Dim m As Object
    For Each m In ms
        dataValue = m.submatches(0)
        dataType = m.submatches(1)
    Next
    
    If dataType = "String" Then
        sqlValue = "'" & dataValue & "'"
    ElseIf dataType = "Date" Then
    
    Else
        sqlValue = dataValue
    End If
    toSqlValue = sqlValue
End Function

'------------------------------------------------------
' DB処理
'------------------------------------------------------
Private Sub ExexuteDBTask()

    Dim cn As Object
    Set cn = GetDBConnection("なんらかの接続文字列")

    Dim rs As Variant
    Set rs = CreateObject("ADODB.Recordset")
    
    Dim sql As String
    sql = "SELECT ～ "
    rs.Open sql, cn

    Dim recordCount As Long
    Do Until rs.EOF

        'なんらかのしょり

        recordCount = recordCount + 1
        
        rs.moveNext
    Loop

End Sub

```
Dockerでstraceを使う

## straceインストール

straceをてきとうにインストールする

```
FROM python:3.6-alpine

RUN apk update && apk add strace
```
## 実行

普通に実行すると `Operation not permitted`言われます。

```
$ docker run --rm xxxxx strace -c flask --version
strace: ptrace(PTRACE_TRACEME, ...): Operation not permitted
```

`-cap-add sys_ptrace`オプションを追加して [ptrace(2)](http://man7.org/linux/man-pages/man2/ptrace.2.html)できるようにしてあげます。

```
$ docker run --rm --cap-add sys_ptrace xxxxx strace -c flask --version
```

## 参考

[How-to Debug a Running Docker Container from a Separate Container](https://medium.com/@rothgar/how-to-debug-a-running-docker-container-from-a-separate-container-983f11740dc6)

[Docker privileged オプションについて](https://qiita.com/muddydixon/items/d2982ab0846002bf3ea8)
RustでSingletonパターン

# はじめに
[ここ(stack overflow | How do I create a global, mutable singleton?)](https://stackoverflow.com/questions/27791532/how-do-i-create-a-global-mutable-singleton)から引用してます。

引用元では生ポインタ使ってますが、Rustっぽくないので、Optionで代用してます。

# 標準ライブラリのみでやる
標準ライブラリ以外の方法は上記参照

``` Rust
use std::sync::{Arc, Mutex, Once, ONCE_INIT};
use std::time::Duration;
use std::{mem, thread};

#[derive(Clone)]
struct SingletonReader {
    // 同時アクセスのための参照及びミューテックス
    inner: Arc<Mutex<u8>>,
}

fn singleton() -> Box<SingletonReader> {
    // 生ポインタ遣うのあんまり好きじゃないので、Optionで代用。
    static mut SINGLETON: Option<Box<SingletonReader>>=None;
    static ONCE: Once = ONCE_INIT;

    unsafe {
        ONCE.call_once(|| {
            // Singletonを作成する。ここは1回しか通らないらしい。なおStable
            let singleton = SingletonReader {
                inner: Arc::new(Mutex::new(0)),
            };

            // ヒープ領域に置いとく
            SINGLETON = Some(Box::new(singleton));
        });

        // ヒープにあるオブジェクトの参照をコピーして使う
        SINGLETON.clone().unwrap()
    }
}

fn main() {
    // スレッドで使う。
    let threads: Vec<_> = (0..=10)
        .map(|i| {
            thread::spawn(move || {
                thread::sleep(Duration::from_millis(i * 10));
                let s = singleton();
                let mut data = s.inner.lock().unwrap();
                *data += i as u8;
            })
        })
        .collect();

    //　値の変化を確認
    for _ in 0u8..20 {
        thread::sleep(Duration::from_millis(5));

        let s = singleton();
        let data = s.inner.lock().unwrap();
        println!("It is: {}", *data);
    }
    // 全体のスレッドが終わるまで待つ（多分大体終わってるはずだけど、念のためみたい）
    for thread in threads.into_iter() {
        thread.join().unwrap();
    }
}
```

おわり
[Rails5]rails,deviseを日本語化する為に。そして躓いた事。

Rails,deviseを日本語化する為に
[Rails で I18n を使って日本語化](https://qiita.com/yutackall/items/0ff97132f31e5bacbf00)
[Railsで日本語化対応にする方法](https://qiita.com/kusu_tweet/items/b534c808ac1ee0382f05)
[railsの日本語化 deviseの日本語化]
(https://qiita.com/shizuma/items/a52fd0ef5b60d61fa330)
を参考にすすめていく。
すると/config/application.rbをデフォルトだと、:de でコメントアウトされているので、:jaに変更してアンコメント
```/config/application.rb
 config.i18n.default_locale = :ja
```
と書いてるが、ファイルを見るとそもそもない。だから新たに書き込んでサーバー起動するとエラーが。エラー内容は、config/application.rb:10:in <top (required)>': undefined local variable or method `config' for main:Object (NameError)

#解決方法
下のような位置に書くと解決しました。

```
module ScoutMe
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.
    
    #Railsを日本語化する為に
      config.i18n.default_locale = :ja 
      config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
  end
end
```
iOS 11, macOS Hight Sierra で The operation couldn't be completed. Protocol error が出る場合の対処

# サイト構成
WordPress のサイトで、Apache の上段に ALB (ELB も同様？) を置く構成です。

![AWS Networking.png](https://qiita-image-store.s3.amazonaws.com/0/26206/40c22d3b-fa54-614d-60f6-1cd811f22f12.png)

(ELB ですが ALB です:innocent:)

# 問題

構成自体は結構ありがちな構成になりそうですが、ALB にて SSL を有効にすると iOS 11, macOS Hight Sierra の Safari でのみ一部画像が読み込めなかったりそもそもページが表示されなかったりしました。
Chrome, Android, iOS 10 等の他のブラウザでは特に問題がありませんでした。

macOS Safari の場合は

```
"The operation couldn't be completed. Protocol error" (NSPOSIXErrorDomain:100)
```

iOS 11 の場合はインスペクタ経由で確認すると同様のエラーが確認できました。

# 解決方法

調べてみるとどうやら Apache から出力された Upgrade header がプロキシ経由でブラウザに届くと失敗したりコネクションを破棄したりしてしまうようです。

参考
<https://help.poralix.com/articles/iphone-does-not-open-https-site-safari-nsposixerrordomain>

解決方法としては、Upgrade header を送らないようにすればいいだけのようなので、ALB の場合 AWS Console の属性に HTTP/2 という項目があるのでそこを無効にすると解決しました。

![7C8F67F9A4EE787770DEF3AF821626AF.png](https://qiita-image-store.s3.amazonaws.com/0/26206/64bfecd1-f8c9-a41c-c35e-bfa37ab43fdb.png)
Microsoft Flow で SharePoint のリストアイテムを HTTP要求(REST)で更新する

FlowのSharePointアクションに「SharePoint - SharePoint に HTTP 要求を送信します」が追加されてました。
以前から有る「項目の更新」では、更新先リストをアクション毎に指定しなければならず、ステージングや同構成のリスト個々にフローを設定していました。
RESTのURIのリスト名を変数化すれば、更新先を手軽に変更できます。
エクセルなどからデータを投入する場合に、テスト用リストでフローを設計し、リスト名のみ変更して本番リストへ投入する案件があったので、使ってみました。

参照は簡単にできるので割愛しますが、データ更新に少しはまったのでメモ。

##前準備
###ListItemEntityTypeFullName を確認
http://<site url>/_api/web/lists/GetByTitle('`更新するリスト名`')で、更新するリストの情報を確認し、ListItemEntityTypeFullName の値をコピーしFlowの変数を設定。

###リストタイトル
リストのタイトルもFlowの変数を設定。

##アクションの設定
「SharePoint - SharePoint に HTTP 要求を送信します」アクションを追加し、以下のように設定する。

- 方法：POST
- URI：_api/web/lists/getbytitle('@{variables('ListTItle')}')/Items(1)
    - リストタイトルの変数
- ヘッダー
    - "Accept": "application/json; odata=verbose"
    - "Content-Type": "application/json; odata=verbose"
    - "X-HTTP-Method": "MERGE"
    - "IF-MATCH": "*"

X-HTTP-Methodは更新の場合 "MERGE" 削除は "DELETE"など

ボディには、以下の用に設定するメタデータのtypeの値は `ListItemEntityTypeFullName`変数を追加。
`{"__metadata":{"type":"@{variables('ListItemEntityTypeFullName')}"},"Title":"Hoge1"} `

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64173/961b05a8-0ea8-de58-989f-874dcf65d868.png)


[SharePoint REST エンドポイントを使用して基本的な操作を完了する](https://docs.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/complete-basic-operations-using-sharepoint-rest-endpoints)
ひらがな、カタカナの濁音/半濁音を清音にする

以下でできたのでメモ

```python:
import unicodedata

ba = 'ば'
unicodedata.normalize("NFKD", ba)[0]

pa = 'ぱ'
unicodedata.normalize("NFKD", pa)[0]

ha = 'は'
unicodedata.normalize("NFKD", ha)[0]
```
上記3つ、すべて `は` で返ってくる
なお、Python2の場合はunicordにする必要がある
mysql5.7の初期パスワード取得

CraftCMSの3系入れようと思ったので思いきってphp7系とかMySQL5.7とか色々新しいものを入れてみた時に発生した問題

```bash
[root@localhost etc]# service mysqld start
Starting mysqld:                                           [  OK  ]
[root@localhost etc]# mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@localhost etc]# mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@localhost etc]# mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```

パスワードなに。

調べてみるとランダムで文字列が発行されてるんだって。

```bash

[root@localhost etc]# grep 'temporary password' /var/log/mysqld.log
2018-07-02T09:34:08.764457Z 1 [Note] A temporary password is generated for root@localhost: [ここに出る]
```
PID-Analyzer

#インストール

実に食わず嫌いなのだが、brew試してみた。（正直、過去Mac OS Xのパッケージ管理システムでイイ思い出無い・・・）

- homebrew のインストール

```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
サクッと完了。おおスゲー。

- Python3 のインストール

```bash
$ brew install python3
```
サクッと完了。すげー楽チンだ。

- PID-Analyzerのインストール

```bash
$ sudo mkdir /usr/local/src
$ sudo chown -R myname:staff /usr/local/src
$ cd /usr/local/src
$ git clone https://github.com/Plasmatree/PID-Analyzer.git
$ cd PID-Analyzer
$ sudo pip3 install -r requirements.txt
```
numpyのバージョンガーって怒られた。
仕方ないので、

```
$ pip3 install pandas
```
とかして単品でモジュール入れてみる。実にモジュールバージョンの依存関係がややこしそうだ。
なにpandasこのインストール、コア４つとも100%振り切れてるやん。クッソ重たいんですけど。って数表および時系列データを操作するためのデータ構造と演算を提供するとか、凄そうなんですけど。

```
$ pip3 install matplotlib
```
圧縮アーカイブされてるモジュールで50MBとかエライ巨大なんですけど。しかもライラリが足りないとか言われるし。

```
$ brew install freetype
$ brew install pkg-config
```
まだ足らない

```
$ pip3 install scipy
 error: library dfftpack has Fortran sources but no Fortran compiler found
```
うげ、フォートランがないって怒られた。
http://gcc.gnu.org/wiki/GFortranBinaries#MacOS
こちらからインストールして再度実行。

```
$ pip3 install scipy
```
うげぇ、これもやたら重いし。

ああ、pythonのデフォルト環境2.7だったorz。PID-Analyzer.pyの１行目、python3に変えて実行。やっと実行できた・・・あれ？こんどはBlackbox_decode.exeが無いって怒られる。
https://github.com/cleanflight/blackbox-tools/releases
からダウンロードして入れる。


```bash
$ ./PID-Analyzer.py --blackbox_decode ./blackbox_decode 
INFO 2018-07-02 00:13:53,160 PID-Analyzer.py:982: Decoding with '/usr/local/src/PID-Analyzer/blackbox_decode'
INFO 2018-07-02 00:13:53,160 PID-Analyzer.py:984: PID-Analyzer 0.52
INFO 2018-07-02 00:13:53,161 PID-Analyzer.py:985: Hello Pilot!
INFO 2018-07-02 00:13:53,161 PID-Analyzer.py:999: Interactive mode: Enter log file, or type close when done.
Blackbox log file path (type or drop here): 
```

実行、やっと動いたっぽい・・・疲れた・・・で試してみた。おっとその前にexeじゃ無くてmac版のコマンドを同一パスから実行するよう書き換えw

```bash
$ ./PID-Analyzer.py --log LOG00002.BFL 
```

ほほぅ〜、おもしろい！！。スゲーイケてない感じのグラフが出てる。多分。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/207772/c88a8d8c-acff-15c1-853e-a2a88b205d90.png)
Excel で名前から姓名を分割する方法


## 例

A2 に `山田 太郎` と半角スペースで区切られた名前が格納されている。

(半角スペースで区切られていなければ判別できないので、セルの修正作業が必要。)

## 苗字

B2 に苗字を切り出す場合は、下記の数式を入れる

```
=LEFT(A2,FIND(" ",A2,1)-1) 
```

## 名前

C3 に名前を入れる場合は、下記の数式を入れる

```
=RIGHT(A2, LEN(A1)-FIND(" ", A2))
```
Cognos レポートでPDF形式とExcel形式でデータが異なる

#PDF形式とExcel形式のデータ差異
Cognos AnalyticsやCognos 10 BIで、同じレポートをPDF形式でダウンロードした時と、Excel形式でダウンロードした時に、ダウンロードされるデータに差異がある様に見える事があります。

例えば、こんなレポートを作成してみます。
リストに製品毎に数量を一桁丸めたものと、元データを配置しています。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/9b279a73-34a4-b9fd-1c53-1adfed2eb977.jpeg)

これをPDF形式でダウンロードしてみます。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/736c63ed-9847-8140-c22c-f9141b1ef2b9.jpeg)

Excel形式でダウンロードしてみます。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/6ce3b34e-1b51-26f1-9932-d6a3d89d305e.jpeg)

枠で囲っている箇所が、最小桁が「5」のため、丸めの対象になった行ですが、赤枠で囲った行の「数量(丸め)」の値が、PDF形式とExcel形式で異なる事がわかります。

#原因と対策
原因は、Cognosのデフォルトの丸め規則と、Excelの丸め規則が異なるためです。

Cognosのデフォルトの丸め規則は五捨五入で、これがPDF形式の出力では採用され、Excelの丸め規則は四捨五入のため、Excel形式ではこちらが採用されるため、出力データに差異がある状態になります。

解消するためには、丸めが五捨五入という特定の要件が無ければ、一般的な四捨五入に合わせるのがてっとり早いです。やり方は、こちらの記事をご参照下さい。
**Cognos の丸めのデフォルト「五捨五入」の動作「四捨五入」にする**
https://qiita.com/shinyama/items/7d9e9b6e9a4db87ee1aa

#結果
PDF形式の出力データもExcel形式と同じになります。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/ea016df0-0c02-689d-fe97-4dbdf0a50fe1.jpeg)
ActiveRecordのsumメソッド

微妙に想定と違ったのでメモ
https://apidock.com/rails/ActiveRecord/Calculations/sum

```rb
Post.limit(3).sum(:review_count)
```

これが

```sql
SELECT SUM(`posts`.`review_count`) FROM `posts` LIMIT 3

```

こうなる(SUM (カラムの総和) の結果 (1件) に対してLIMITが走る)


rubyのsumメソッドで無理やり対処

```rb
Post.limit(3).pluck(:view_count).sum
```

https://stackoverflow.com/questions/43955310/rails-sum-on-associationrelation-attribute-is-incorrect-if-association-has-limit
Pythonで作ったDiscordBotをGoogleComputeEngine上のdockerで動かす

# はじめに

この記事は、DiscordBotをDockerfile化してGoogleComputeEngine上のDebian9に乗せ、
動かすための手順をまとめたものです。DiscordBotの作り方は説明していません。

前回はDiscordBotを作成し、GCPのDebianに普通にpythonをインストールして実行しました。
それの続きです。
[Discord Botを作ってGoogleComputeEngineに配置](https://qiita.com/amama-nagigi/items/4d09eab14a6f9f88ac3a)

# 作業の流れ

1. Botを起動するためのDockerfileの作成
2. GCP上のDebian9にdockerをインストール
3. Dockerfileとソース一式をDebian9に配置して実行

## Dockerfileの作成

こんなかんじのディレクトリ構成にしようと思います。
`src`以下にはDiscordBotが置いてあります。DiscordBotを使用するためのDiscord側の設定などは割愛します。

```
<root>
│  Dockerfile
│  README.md
└─src
    │  config.ini
    │  main.py
    └─img
            daijobu.jpg
            sonance.png
            sonano.png
```

main.pyを実行するDockerfileを作ります。

```dockerfile
FROM python:3.6

# 必要なライブラリをインストール
RUN pip install discord
RUN pip install jaconv

# ソースをコンテナ内にコピー
COPY ./src/ ./src/

# 作業フォルダを設定しコマンド実行
WORKDIR ./src/
CMD ["python", "main.py"]
```

## Debian9にdockerをインストール

GCP上に作成したDebian9にdockerをインストールします。
公式サイトの手順を参考に、以下を順番に実行。

```bash
$ sudo apt-get update
$ sudo apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
```

## コンテナの配置と実行

無事にdockerのインストールが終わったら、コンテナを配置して実行してみましょう。
今回は`/home/amama/docker/wobbuffetbot`にファイル一式を置きます。私はWinSCPでコピっちゃいました。
ファイルを置いたらファイルを置いたディレクトリに移動し、以下のコマンドでDockerfileをビルド。名前は`amama/wobbuffetbot`にします。最後の`.`はDockerfileがあるディレクトリ（カレントディレクトリ）です。

```bash
$ sudo docker build -t amama/wobbuffetbot .
(中略)
Successfully built fe2a3b8411c5
Successfully tagged amama/wobbuffetbot:latest
$ 
```

無事ビルドが終わったら、イメージの一覧を見てみましょう。
イメージ`amama/wobbuffetbot`が出来ています。

```bash
$ sudo docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
amama/wobbuffetbot   latest              fe2a3b8411c5        3 minutes ago       926MB
python               3.6                 bb8fb36e5fd8        4 days ago          912MB
```

起動してみましょう。
コンテナの名前は適当に`bot`とします。

```bash
$ sudo docker run -d --name bot amama/wobbuffetbot
4605c2c15e9931b306cb8d81229a53b6e63e4429a84d49de9b9414941e375a29
$ 
```

実行できました。
Discordで何か発言すれば、結果が返ってきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174324/1b6c3ad2-5876-afa1-1255-db38d2e6f84d.png)

# おわりに
一式、[GitHub](https://github.com/amama-nagigi/WobbuffetBot)に上げました。よろしければどうぞ。

これまでは手動でpythonのコマンド叩いて起動したり、終わったらKillする必要がありましたが、
コンテナ化によってデプロイがだいぶ楽になりました。
ボイスチャンネルに入れるBotも作ってみたいけど、何が出来るのか調べてみないとよくわかりませんね。。。
[Matter.js]Renderで生成されるcanvasにidをつけたい

前回の記事:[「JavaScript用物理エンジン、Matter.jsをとりあえず動かす」](https://qiita.com/nilfeli/items/cd0638dd95a28174afb3)

↑の続きです。前回よりちょっとカスタマイズして図形を描画してみました。


# キャンパスのサイズとかカスタマイズしたい

## index.html
```html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>さんぷる</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>

<body>
    <!-- canvasはmatter.jsの前に書くこと -->
    <canvas id="world"></canvas>
    
    <!-- matter.jsはダウンロードしなくてもこのリンクでOK -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.10.0/matter.min.js"></script>
    <script src="main.js"></script>

    <button id="add" class="normal">ボタン</button>
</body>
</html>

```

## main.js
```javascript

// 使用モジュール
var Engine = Matter.Engine,
    Render = Matter.Render,
    World = Matter.World,
    Bodies = Matter.Bodies;

// エンジン生成
var engine = Engine.create(),
        world = engine.world;

// canvasのサイズ
var winWidth = 800;
var winHeight = 450;

// レンダリング対象のキャンバス
var canvas = document.getElementById('world');

// レンダリング設定
var render = Render.create({
    canvas: canvas,
    engine: engine,
    options: {
        width: winWidth,
        height: winHeight,
        background: '#FFF',
        wireframes: false,
        showAngleIndicator: false
    }
});


// 地面
var ground = Bodies.rectangle(winWidth/2, winHeight, winWidth, 10, { isStatic: true });
var wallL = Bodies.rectangle(0, winHeight/2, 10, winHeight, { isStatic: true });
var wallR = Bodies.rectangle(winWidth, winHeight/2, 10, winHeight, { isStatic: true });
World.add(engine.world, [ground, wallL, wallR]);

// エンジンの実行
Engine.run(engine);
// 描画実行
Render.run(render);

// ボタンを押したときに箱を増やす
$(document).on('click', '#add',function() {
    var pos = Math.random();
    var hoge = Bodies.rectangle((winWidth*pos) ,0, 30, 30);
    World.add(engine.world, [hoge]);
});

```

上記の２つのファイルを作って適当なブラウザで開けば、ボタンを押したときにcanvasにカラフルな四角が降ってくるというだけの簡単なサンプル。壁と床はcanvasサイズに合わせて変わるので、winWidthとwinHeightだけ変更すればお好きなサイズで表示できます。

必要なファイルはこの２つだけというシンプルさ。本当はcssもちゃんと書いていて、Githubにあげようと思ったのですがパスワード忘れたので諦めました。時間があったらやります。
箱の色はエンジンの方で設定してるらしい。カスタマイズはできないのかな？後々試します。

## 注意点
renderの書き方がちょっと曲者で、公式のドキュメントにまともなサンプルが載ってない。さらに、公式で説明しているやり方はbody直下にcanvasを生成する方法だけで、上記のサンプルのようにあらかじめ作成したcanvasに割り当てるという方法を見つけるのに苦労した。
ポイントは、

- renderにcanvasの指定をすること
- HTML側でmatter.jsの読み込む前にcanvasを設置すること

の２つ。
このやり方を理解するのにずいぶん時間がかかってしまった。

## 参考
- [物理エンジン「Matter.js」でCanvasアニメーションの質感をアップさせる](https://sterfield.co.jp/designer/物理エンジン「matter-js」でcanvasアニメーションの質感を/)
- [Matter.js— The Missing Tutorial](https://blog.alexandergottlieb.com/matter-js-the-missing-tutorial-70aafc06b167)
MySQLのデータベース毎に別ファイルとしてmysqldumpするスクリプト


MAMPのMySQLのデータベース数が増えてきたので整理する前にデータベース毎にmysqldumpしてダンプファイルを保存しておきたいなぁと思ったんですが、データベース数が70以上もあったんで、手作業でデータベース毎にダンプってのも面倒でスクリプト組みました。

ついでなんで tarで固めてGoogleDriveにバックアップするようにしました。

```export.sh
#!/bin/bash
# バックアップ先フォルダ
BACKUP_FOLDER=/Volumes/GoogleDrive/マイドライブ/MAMP_DB_Backup
DATABASES=$(mysql -uroot -N -s -e"show databases WHERE \`Database\` NOT IN ('information_schema', 'performance_schema', 'mysql');")
for DATABASE in $DATABASES; do
        echo "[export $DATABASE ]"
        cd /tmp/
        mysqldump -u root -proot -S /Applications/MAMP/tmp/mysql/mysql.sock $DATABASE > $DATABASE.sql
        tar czvf $DATABASE.tgz $DATABASE.sql
        cp -f $DATABASE.tgz $BACKUP_FOLDER
        rm -f $DATABASE.*
done;
```
Kerasで学習済のモデルをTensorflowのSavedModelに簡単に変換する

# 変換する理由

Google Cloud ML Engine上で予測させるため

# やり方

```python:convert.py
import argparse

from keras import backend as K
from keras.applications import mobilenetv2
from keras.layers import DepthwiseConv2D
from keras.models import load_model
import tensorflow as tf
from tensorflow import saved_model


def run(args):
  sess = K.get_session()
  model = None
  if args.base == 'mobilenet':
    model = load_model(args.model, custom_objects={
        'relu6': mobilenetv2.mobilenet_v2.relu6,
        'DepthwiseConv2D': DepthwiseConv2D})
  else:
    model = load_model(args.model)

  saved_model.simple_save(sess,
                          args.output,
                          inputs={'input': model.input},
                          outputs={'output': model.output})


if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('--model', type=str, default='model.h5')
  parser.add_argument('--base', type=str, default='mobilenet')
  parser.add_argument('--output', type=str, default='output')
  args = parser.parse_args()
  run(args)

```

注意するのは、keras2.2.0からrelu6がmobilenetv2に移動してて、DepthwiseConv2Dがlayersに移動している点。

あとはフォルダ内のファイルをGCSに入れてから、以下のコマンドを実行するだけ。
GCPとAPIの有効化は実施済とします。

```bash:deploy.sh
MODEL=$1
VERSION=$2
BUCKET=$3
gcloud ml-engine models create $MODEL
gcloud ml-engine versions create $VERSION --model $MODEL --origin BUCKET --runtime-version 1.8
```

これだけ。

# 備考

Google Cloud ML Engineへのリクエストサイズ制限は1.5MBまで。（GAEでもあったなこれ。。）
224x224だと軽く超えるので128x128がくらいが限界っぽい。

# 感想

`tf.saved_model.simple_save`だけで変換できるってすごくない？？？
ubuntu 16.04でPython3.7を使う

# はじめに

Python 3.7がリリースされました。

ubuntu 18.04は、リポジトリに追加されたそうですが、ubuntu 16.04では追加されていません。
なので、ソースからインストールした手順をまとめておきます。

## 前提

今は無き純正cloud9上で作業をしています。
テンプレートはblankを選択しています。
OSはubuntu 16.04

元々pythonは以下がインストールされています。

|コマンド|バージョン|
|---|---|
|python2.7|2.7.6|
|python3|3.6.3|
|python3.4|3.4.3|
|python3.6|3.6.3|

## インストール

```bash
curl -O https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
tar xvfz Python-3.7.0.tgz
cd Python-3.7.0/
./configure --prefix=/usr/local/python370 --with-ensurepip
make
sudo make install
```

--prefix=はインストール先指定
--with-ensurepipはpipも一緒にインストールという意味です。

## pipenvインストール

これは、どのバージョンでも構いません。
デフォルトでインストールしてあるpython3.6でインストールしています。

```bash
sudo pip3 install pipenv
```

## pipenv環境設定

```bash
mkdir python37
cd python37
pipenv --python /usr/local/python370/bin/python3 install
pipenv shell
python --version
```

これで無事に環境作成ができました！！

※今回は、試しに使ってみるためにpython37というディレクトリを作成しましたが、本来はプロジェクトごとにちゃんとした名前のディレクトリを作成しましょう！
Tonyu System 2であほげーを作ろう - その６ Twitterにスコアを投稿

## 記事一覧

[第1回 設定とタイトル](https://qiita.com/hoge1e3/items/388bdb47f3d56ed0789f)
[第2回 メイン画面](https://qiita.com/hoge1e3/items/1a471a00b38576430f7e)
[第3回 ターゲットと敵と](https://qiita.com/hoge1e3/items/c5d8379db1304a2897fd/)
[第4回 スコア・時間など](https://qiita.com/hoge1e3/items/e2ab8fbe03469e933022)
[第5回 ゲームを公開する](https://qiita.com/hoge1e3/items/f7bd844fd9743073190e)
[第6回 Twitterにスコアを投稿](https://qiita.com/hoge1e3/items/821e5dd1f163d3d9f3c3/)
[第7回 サウンド関係](https://qiita.com/hoge1e3/items/a5b1726f6c95bbb4e852)
[第8回 物理エンジンなど](https://qiita.com/hoge1e3/items/b2a0df1d5aaba773310f)

## はじめに

作ったゲームを多くの人に遊んでもらうには，イマドキはやっぱりSNSで告知することでしょうか．[あほげー](http://ahoge.info)の作品の多くは，ゲーム終了時にゲーム結果をTwitterに投稿できるものが多いようです．ハッシュタグ[#ahoge](https://twitter.com/hashtag/ahoge?src=hash) で探すと，ときどきゲームアプリからのツイートが見られます．

ということで，Tonyu2で作ったゲームからもTwitterに投稿する機能を追加してみましょう．

[今回のプログラムを開く！](https://edit.tonyu.jp/index.html?fromPrjB=ahgtmpl0.06.zip)

追加したのは主にMainの部分の，メインループが終わってクリア＆ゲームオーバーになったところです．

~~~JS:Main
//前略
switch($state) {
    case "gameover":
    new Label{text="ゲームオーバー",x=230,y=200,size=50};
    // ★Tweetするメッセージ
    $mesg=$theme+"を"+$score+"個集めたところで"+$subTheme+"に阻まれて無念のリタイア．";
    break;
    case "clear":
    // ★Tweetするメッセージ
    $mesg=$time+"秒かけて"+$theme+"を見事"+$score+"個集めきった．";
    new Label{text="クリア",x=230,y=200,size=50};
    break;
}
new Button{
    text="Title",
    top=300,
    onClick=goTitle,
};
// ★Tweetボタン
new Button{
    text="Tweet",
    top=350,
    onClick=tweet
};
\goTitle() {
    new FadeEffect{type="out",page=Title};
}
// ★Tweetするメソッド
\tweet() {
    $WebPage.openShareTweet($mesg, $url, "tonyu2,ahoge");
}
~~~

まず，クリアまたはゲームオーバーにより，Tweetする内容を変数`$mesg`に入れます．
さらに，Titleボタンの下にTweetボタンを新たに設置しています．Tweetボタンが押されたときにはtweetメソッドが呼ばれます．

tweetメソッド内では[$WebPage.openShareTweet](https://edit.tonyu.jp/doc/$WebPage.html)メソッドを実行しています．これは，メッセージとURL，ハッシュタグを指定してツイート用ページを呼び出すものです．

なお，$urlの内容は，Setting クラスで設定しています．この設定がないと，今開いているページがURLとして指定されたものとみなします．

~~~JS
//---ゲームに関連する情報を定義しておきましょう
$no=26;
$theme="<<第"+$no+"回のテーマ>>";
// ストーリーや，タイトルは
// テーマによっては文脈にさっぱりあわないかもしれないので，
// テーマが発表されたらちゃんと直してね！
$title=$theme+"をゲットせよ！";
$author="hoge1e3";
$subTheme="<<テーマに関連する何か>>";
$story="あなたは"+$theme+"が好きなので，\n"+
$theme+"を集めよう!\n"+
$subTheme+"は集めるなよ！";
//----その他，ゲーム画面を開いたときに初期化したいことはここで
//★追加
$url="https://www.tonyu.jp/project/viewProject.cgi?mainkey=759";

//-----タイトルに移動
loadPage(Title);
~~~

こんな感じでTweet機能を簡単に追加できます．

第26回あほげーまで，あと2週間を切りました．テーマが発表されたら，[今回のプログラム](https://edit.tonyu.jp/index.html?fromPrjB=ahgtmpl0.06.zip)をさくっと開いて，お好きなようにアレンジしてみてください．

時間があれば[まだ続く](https://qiita.com/hoge1e3/items/a5b1726f6c95bbb4e852)かもしれません...
DeployGateのアプリ配信を操作するアプリをDeployGateで配信した話

今年もやります！ [あら便利カレンダー2018](https://benri2018.rnd.cloudpack.jp/)
あら便利カレンダー誕生秘話は[こちら](https://qiita.com/shinichi-takahashi/items/cea235795f904ccea207#あら便利カレンダー誕生秘話)

これは[cloudpack あら便利カレンダー 2018](https://benri2018.rnd.cloudpack.jp/) 1日目の記事です。

この記事について
1. DeployGateでお客さんにアプリを配信してた
2. お客さんも配信メンバー追加したいと言われた
3. 有料プランならできるけど、、
4. APIつかえば出来た
5. アプリにしてDeployGateで配信した

という話。

# DeployGateについて
アプリを配信するサービス。同じようなサービスにCrashlyticsとかあります。
詳しい説明は今回割愛。
開発中のアプリの確認に、DeployGateのテスターにお客さんを招待し確認してもらっていました。

# お客さんから自分たちもテスターを追加したいって要望が
DeployGateでは有料プランにすれば出来る。

有料プランのDeployGateにはグループという機能があってそこにメンバーを追加する際にオーナーもしくはテスターを選択できる。オーナーとして追加した場合はメンバーの招待やアプリ配信が出来るようになります。

無料アカウントで利用する場合は、自分以外すべてテスターとしての追加になるので、
この機能は有料プランのみ利用可能な機能です。

# APIを利用することで簡単にユーザーが追加出来ることがわかる
ガッツリ使うのであれば有料でも全く問題なかったのですが、
自分以外でユーザーを追加出来るようにしたいだけ、かつ有料プランを使うための交渉などいろいろ面倒だなーとDeployGateのサイトをあさっているとDeployGate APIなるものを発見。
https://docs.deploygate.com/reference

これが結構充実の内容で

* ユーザーの追加・削除
* アプリのアップロード

などが出来てやりたいこととしては必要十分でした。

# APIを叩くためのアプリをionicでつくってDeployGateで配信した
追加したいテスターのメールアドレス or アカウント名を入力して、テスター追加のAPIを叩くだけのアプリをionicで作って開発中のアプリとは別に管理者にあたるお客様だけにDeployGateで配信しました。

__アプリの画面__
![IMG_0104.PNG](https://qiita-image-store.s3.amazonaws.com/0/35271/6ce7fc37-e1c1-c913-761a-f35ab9d9941d.png)
__ionicを使えば数時間で配信できちゃう！__
__しかも要望に応えるために専用アプリ作りましたよ！ってなんかプレミアム感あるぅぅ！__

というわけでionicとDeployGateを使えばアプリを数時間で作って配信できちゃうよ、という話でした。
本格的に運用するのであればDeployGateの有料プランは魅力的なので、無料で使い始めて規模が大きくなれば有料で利用したいと思います！！

## 注釈:
APIの用途として今回のような形が規約違反にあたらないか、DeployGateのサイトで公開されている利用規約、ガイドラインを確認し現時点（2018年7月2日）では規約違反に該当しそうな記述は見当たりませんでしたが、**利用される場合は必ずDeployGateの規約を確認いただいてから自己責任にてご利用ください。**
またTwitter、問い合わせでも違反にあたらないか確認をしていますので、返答があった際はこちらに記載させていただきます。

~追記~
TwitterからDeployGate公式のアカウントより返答いただき、現状のポリシーでは違反にはならないとコメントもらいました！
またそのときに「配布ページ」という便利な機能を紹介いただきそちらも記事にまとめましたので、あわせてご覧ください。
配布ページについての記事 => [DeployGateの配布ページを使ってリンク共有のみでアプリ配信する](https://qiita.com/bobu_web/items/38478a5d5a30b246cfc8)

# 少しこぼれ話
ionicのWebView上でJavaScriptから実行されたリクエストのホストは `localhost` となるため 
今回ionicからDeployGateのAPIを叩く際の `CORS` の制限に引っかかりました。
`CORS` 制限を回避するため、`Angular` の `HttpClient` を利用するのではなく `ionic-native` プラグインとして公開されているネイティブ上で実行されるHTTPクライアントを利用することで回避しました。
https://ionicframework.com/docs/native/http/

ちょっと特殊な利用方法ですが、選択肢として知っておいてもよいかと思います。

以上です！
モジュールをファイルに書き込んでみる(前半)

（この記事は、「[fukuoka.ex x ザキ研 Advent Calendar 2017](https://adventar.org/calendars/2873)」の16日目です）
昨日は @hisaway さんの[「Elixirで2次元のリスト加算関数をつくる」](https://qiita.com/hisaway/private/78caa3115d107319e83e)でしたね。

#はじめに
今回はモジュールをファイルに書き込んでいこうと思います。
また、今回と次回の二回に分けてモジュールの勉強をしていきます。

#簡単な計算をしてみる
まずはdefmoduleを使って足し算、引き算、掛け算、割り算ができるファイルを作って実行していこうと思います。
ex1.exという名前で以下のファイルを作成しました。

```elixir:ex1.ex
defmodule Math do
  def sum(a, b) do
    a + b
  end
  def reminder(a, b) do
    a - b
  end
  def product(a, b) do
    a * b
  end
  def quotient(a, b) do
    a / b
  end
end
```
このファイルはelixircを使ってコンパイルできます。
コンパイルを行うとElixir.Math.beamというファイルが生成されました。

```
$ elixirc ex1.ex
```

iexを開始し実行していくと、足し算、引き算、掛け算、割り算とそれぞれの計算を行うことができました。
定義したモジュールは使えるようになっていました。iexが開始された時に同じディレクトリにあるバイトコードファイルは自動的に読み込まれるようです。

```elixir
iex> Math.sum(1,2)
3
iex> Math.reminder(1,2)
-1
iex> Math.product(1,2)
2
iex> Math.quotient(1,2)
0.5
```

#スクリプトモードでの計算
先ほどとは違い.exではなく.exsでファイルを作成しました。
こうすることでコンパイル不要でスクリプティングに使われます。

```elixir:ex2.exs
defmodule Math2 do
  def sum(a, b) do
    a + b
  end
  def reminder(a, b) do
    a - b
  end
  def product(a, b) do
    a * b
  end
  def quotient(a, b) do
    a / b
  end
end

IO.puts Math2.sum(1, 2)
IO.puts Math2.reminder(1, 2)
IO.puts Math2.product(1, 2)
IO.puts Math2.quotient(1, 2)
```

結果は問題なくそれぞれ表示されました。
バイトコードファイルは作られず、メモリ内でコンパイル、実行が行われます。

```
$ elixir ex2.exs
3
-1
2
0.5
```

#まとめ
今回は基本的なファイルの作成やコンパイルなどをしてきました。
これからもう少し複雑なものも作っていきたいと思います。
次回は後半としてプライベート関数の定義などをしていきます。

明日は@zuminさんの「RubyMineにElixir Pluginを導入してみた」です。お楽しみに。
Railsのformのsubmitでbootstrapのモーダルを閉じる


formのsubmit部分にdata: { dismiss: "modal"}を追加する。

```haml:html.haml
= f.submit "小説を追加する", class: "btn btn-primary px-5 mx-auto d-block", data: { dismiss: "modal"}
```




##!!!追記!!!
上記の方法だと。submitできていなかった。

この辺を参考にすれば良いかも？
https://qiita.com/magic_xyz/items/01f38814ea8b0907ba49
Elixirで2次元のリスト加算関数をつくる

(この記事は、「[fukuoka.ex x ザキ研 Advent Calendar 2017](https://adventar.org/calendars/2873)」の15日目です）

昨日は@piacere_exさんの「[関数型でデータサイエンス#3：インプットしたデータを集約する①](https://qiita.com/piacere_ex/items/ef434011d154dc73f0cd)」でした．

# 追記 2019/02/24
現在，リストの操作は再帰ではなく，Enum.map/reduceを推奨しています．
また，下記の実装内容については，「[Elixir]再帰/逐次アクセスをEnum.Map/Reduceに書き換え(本編)](https://qiita.com/hisaway/items/f69b48bd7611ed9b5be2)」の方が参考になると思います．

## map/reduceのメリット

- 可読性がよくなる
- パイプライン演算子が使いやすい
    - 副次的な効果としてパイプライン演算子を使うために関数の設計規則が自然と統一される
- 並列プログラミング処理系「Hastega」の恩恵を受けられる(予定)
    - [ZEAM開発ログ: Elixir マクロ + LLVM で超並列プログラミング処理系を研究開発中](https://qiita.com/zacky1972/items/cc88260a3c93c9f71317)

---

#はじめに
　前回の記事「[Elixirで再帰呼び出しを使ってリストの加算関数をつくる](https://qiita.com/hisaway/items/647f33fbdcff21dae5a4)」では，2つの1次元リストを加算する関数について説明しました。

- 関数にはガード句を使って呼び出し条件が設定できる
- 関数の引数にリストのパターンマッチングを適用することで、呼び出し条件を設定できる

この記事では，1次元リストの拡張、2次元リストの加算関数について説明します．
前回の記事に引き続き、ガード句とパターンマッチングを使用します．
忘れた方は、[前回の記事](https://qiita.com/hisaway/items/647f33fbdcff21dae5a4)に再度目を通しておきましょう。

# 2次元リスト
## 挙動の確認
関数を作る前に2次元リストの挙動を確認してみましょう。

```elixir:iex
iex(1)> list = [ [1,2], [3,4] ]
[[1, 2], [3, 4]]
iex(2)> hd list
[1, 2]
iex(3)> teal = tl list
[[3, 4]]
iex(4)> tl teal
[]
```

## 関数の呼び出し条件
2次元リストの加算関数は「ガード句」と「パターンマッチング」のどちらも使います。
引数に使用したリストのパターンマッチングはそのままです。上記で確認した挙動から、リストの`head`がリストであれば、2次元リストだと判断することができます。

```elixir:add_list2d.ex
defmodule Test do
  def add([a | tla], [b | tlb]) when is_list(a) do
      inspect [add(a,b)|add(tla, tlb)], charlists: :as_lists
  end
end
```
 
## 確認
実際に，動かしてみましょう．

```elixir:add_list2d_test
iex(1)> list2a = [ [1, 2], [3, 4] ]
[[1, 2], [3, 4]]
iex(2)> list2b = [ [5, 5], [5, 5] ]
[[5, 5], [5, 5]]
iex(3)> Test.add(list2a, list2b)
"[[6, 7] | \"[[8, 9]]\"]"

```
`inspect~ , charlist: :as_lists`はリスト内の数値を正しく表示するために使用しています．
`inspect`なしだと，`iex`の仕様か，表示がおかしくなることがあります．

```elixir:iex
iex(1)> Test.add([ [1, 2], [3, 4]], [ [5, 5], [5, 5] ])
[[6, 7], '\b\t']
iex(2)> Test.add([ [1, 2], [3, 4]], [ [5, 5], [1, 2] ])
[[6, 7], [4, 6]]
```

# まとめ
標準のリスト表示が納得いきませんが，2次元リストの加算関数を実装しました． 
要点をまとましょう．

- ガード句とパターンマッチングは併用できる
- 2次元リストだと表示が上手くいかないことがあるので注意

明日は @Takeshi-Kogu さんの「[モジュールをファイルに書き込んでみる（前半）](https://qiita.com/Takeshi-Kogu/items/6a49c71918a7cfd614d4)」 です。お楽しみに！
Androidの各種SdkVersionについての備忘録

新規アプリのリリースは2018年8月から、既存アプリのアップデートは2018年10月からtargetSdkVersionを26以上にする必要がある([*1](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html))とのことでその対応の際に調べたことの備忘録。
今までbuild.gradle周りの理解がふんわりし過ぎていたので、一歩前進した。

## 調べたこと
### minSdkVersion
アプリを実行することができる最小のAPIレベルの指定。
このSdkVersionより上のAndroidでは動きますよ、ということ。
端末のSdkVersionがこれより低い場合、アプリはそもそもインストールできない。

### targetSdkVersion
アプリがターゲットとするAPIレベルの指定。設定しない場合は、minSdkVersionとイコールになる。
targetSdkVersionの指定が必要な理由は、AndroidがAPIレベルごとに動作や外観を変更される可能性があるためである。
targetSdkVersionを指定することで、仮にAndroidのAPIレベルがtargetSdkVersionよりも大きい場合でも、開発者が想定した動作・外観でアプリが動く。
AndroidのAPIレベルがtargetSdkVersionよりも低い場合は、AndroidのAPIレベルでの動作・外観が優先される。

### buildToolsVersion
SDKビルドツールのバージョンの指定。アプリビルドの際のコンパイラのバージョンのこと。
コンパイラのバージョンなので、後述のcompileSdkVersionを上げた時は一緒に上げる必要がある。
Android Studio 3.0.0以降は必須ではなくなっていて、指定しない場合は使用しているpluginが必要とする内で一番高いバージョンが使われる。

### compileSdkVersion
アプリをコンパイルする際のAPIバージョン。このAPIバージョンまでの機能をアプリ内で利用することができる。
例えばcompileSdkVersionを20に設定した上で、APIレベル21の機能を使おうとするとコンパイルエラーが起きる。
ちなみにcompileSdkVersionを21に設定していたとしても、APIレベル21の機能を使わない限りはAPIレベルが21未満の端末上でもアプリは動作する。
なので```minSdkVersin <= compileSdkVersion```かつ```compileSdkVersionの機能をアプリ内で使う```場合は下記のように条件分岐で対応すると良いっぽい。

```java:Fragment.java

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.L) {
  // ここはLollipop（Android 5.0）以降で実行される。
} else {
  // こっちはKitKat（Android 4.4）以前。
}
```

## 終わりに
以上の関係を踏まえると、

```
minSdkVersion <= targetSdkVersion <= compileSdkVersion <= buildToolsVersion
```

ということになる？
(IBM, Watson studio)を使って、データを3次元プロットしてみる

#目的
ノンプログラミングで、データを3次元空間にプロットしてみたい！
Watson Studioを使って、行ってみます。

#前回の続き、あやめのデータを使って可視化したいと思います。
[☆誰でもできる　IBMのWatson studioで機械学習(Machine Learning)をやってみた](https://qiita.com/koichi_hiphopdream/items/2644c3d426cffc80843f)
↑前回の内容

前回のキャンバスのまま続けていきたいと思います。
左側のGraphsから、Plotを選択。他にもGraphのモジュールがあるので目的によって選択するモジュールを変える事ができます。
![キャプチャfs.PNG](https://qiita-image-store.s3.amazonaws.com/0/267677/4a1b8556-10ed-f684-5bc1-618063205030.png)

あやめのデータには4種類の特徴量がありましたが、3次元のグラフまでしかできないので、前回の識別で重要度が高かった3つの特徴量を使いました。3-D graphをクリックしてデータを選択しました。もちろん2次元でもできます。
![キャプチャgs.PNG](https://qiita-image-store.s3.amazonaws.com/0/267677/d848496e-bab5-02b4-7f4c-8fc7ea9f9b4a.png)

Saveを押してRunで実行します。すると、右側にアウトプットの結果が出てくるのでクリックしてみます。
![キャプチャccs.PNG](https://qiita-image-store.s3.amazonaws.com/0/267677/cc5b6fbe-c8bb-1cdd-7685-acf32e6c4d80.png)

これが、作成されたグラフです。このままでは、どれがどのあやめのデータか分かりません。
##3次元グラフ
![キャプチャscscs.PNG](https://qiita-image-store.s3.amazonaws.com/0/267677/06beb184-da0b-9122-8789-9c713d56b4c0.png)

なので、OVERLAYをクリックして、Colorの部分にあやめの種類を選びます。
![キャプチャfafafa.PNG](https://qiita-image-store.s3.amazonaws.com/0/267677/d2896fff-04a0-dc0d-1d3f-0614bedba8c0.png)

もう一度、Runを押すと種類ごとに色がつきました。
##3次元グラフ色つき
![キャプチャfasf.PNG](https://qiita-image-store.s3.amazonaws.com/0/267677/6d4710cd-01f7-c7f4-2248-5330fd4b7bff.png)
【docker ps】コンテナ情報出力



##コンテナ情報出力（起動中のコンテナのみ）
現在起動中のコンテナの一覧が出力されます。

```shell
$docker ps
```

##すべてのコンテナ情報出力
ステータスに関係なく、すべてのコンテナの一覧が出力されます。

```shell
$docker ps -a
```
`-a` もしくは `--all` 。
他のオプションと組み合わせて使用することもできます。

```shell
$docker ps -aq
# 停止中のコンテナも含めた、すべてのコンテナのIDのみを表示
```

##ID情報のみ出力する

```shell
$docker ps -q
```
`-q` もしくは `--quiet` 。
起動しているコンテナのみ表示されます。


##出力情報をフィルタリングする
出力する情報をフィルタリングすることができます。

```shell
$docker ps -f "name=my_docker"
```
`-f` もしくは `--filter` 。
`NAMES` が `my_docker` に一致するか、`NAMES` に `my_docker` が含まれているコンテナが出力されます。

##出力情報をフォーマットする

```shell
$docker ps --format "table {{.Names}}"
```

`--format` 。
`table` を付けることで、出力結果にヘッダーが含まれます。
`\t` でタブを入れることができるため、テーブル形式に成形できます。
表示したい項目に該当する言葉(Placeholder)を `{{Placeholder}}` のようにカッコで囲みます。

| 項目 | Placeholder | 備考 |
|:-:|:-:|:-------|
|CONTAINER ID|.ID| |
|IMAGE|.Image| |
|COMMAND|.Command| |
|CREATED|.CreatedAt|日付として表示|
|CREATED|.RunningFor|何日前から起動しているのかを表示|
|PORTS|.Ports| |
|STATUS|.Status| |
|NAMES|.Names| |
|LABELS|.Labels|コンテナに設定されているすべてのラベルを表示|
|MOUNTS|.Mounts| |
|NETWORKS|.Networks| |




###参考
https://docs.docker.com/engine/reference/commandline/ps/#options
FileZillaで接続できない(解決)

##狙い
対応を残すための備忘録。

#環境
###PC
Windows7Pro
64bit


###FileZilla Client
Version:          3.34.0

Build information:
  Compiled for:   x86_64-w64-mingw32
  Compiled on:    x86_64-pc-linux-gnu
  Build date:     2018-06-15
  Compiled with:  x86_64-w64-mingw32-gcc (GCC) 6.3.0 20170516
  Compiler flags: -g -O2 -Wall

Linked against:
  wxWidgets:      3.0.5
  SQLite:         3.22.0
  GnuTLS:         3.5.18

Operating system:
  Name:           Windows 7 (build 7601, Service Pack 1), 64-bit edition
  Version:        6.1
  Platform:       64-bit system
  CPU features:   sse sse2 sse3 ssse3 sse4.1 sse4.2 avx avx2 aes pclmulqdq rdrnd bmi2 bmi2 adx
  Settings dir:   C:\Users\fujiijyunpei\AppData\Roaming\FileZilla\


###Log
2018-07-02 16:19:06 9048 1 状態: XXX.XX.XXX.XXX に接続中...
2018-07-02 16:19:06 9048 1 レスポンス: fzSftp started, protocol_version=8
2018-07-02 16:19:06 9048 1 コマンド: open "skadmin@XXX.XX.XXX.XXX" 22
2018-07-02 16:19:26 9048 1 エラー: 非アクティブになってから 20 秒後に接続がタイムアウトになりました
2018-07-02 16:19:27 9048 1 エラー: サーバーに接続できませんでした
2018-07-02 16:19:27 9048 1 状態: 再試行を待機中...
2018-07-02 16:19:32 9048 1 状態: XXX.XX.XXX.XXX に接続中...
2018-07-02 16:19:32 9048 1 レスポンス: fzSftp started, protocol_version=8
2018-07-02 16:19:32 9048 1 コマンド: open "hogehoge@XXX.XX.XXX.XXX" 22
2018-07-02 16:19:52 9048 1 エラー: 非アクティブになってから 20 秒後に接続がタイムアウトになりました
2018-07-02 16:19:52 9048 1 エラー: サーバーに接続できませんでした

##対応Log
・TimeOutの時間を20秒から300秒に変更。
→効果なし
・パスワード形式なので秘密鍵は必要ない・・・はず
・デフォルトのローカルディレクトリを半角英数文字のみに変更
→効果なし
・中間のFTPサーバーがダウンしてた模様…
→そりゃつながらないよね・・・。
再起動にて対応。

#その他リンク
####FTP/FTPS/SFTPとは！違いについて
https://www.nkshopping.biz/index.php?FTP%E3%81%A8%E3%81%AF
ComposerのインストールからLaravelプロジェクトの作成及び実行まで

## はじめに
Composerとやらをインストールしてみる
Laravelのプロジェクトを実行してみる

## 環境
macOS High Sierra 10.13.5
php 7.1.16
Composer 1.6.5
Laravel Framework 5.6.26

## Composerのダウンロード
Composer公式 https://getcomposer.org/download/

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

これらをターミナルで実行する

## Composerの移動

```
mv composer.phar /usr/local/bin/composer
```

ダウンロードした`composer.phar`を移動する

## バージョン確認
```
composer -v
```

ダウンロードしたComposerのバージョンを確認する

以下が表示されればOK

![スクリーンショット 2018-07-02 15.46.42.png](https://qiita-image-store.s3.amazonaws.com/0/237604/6110d0f1-bde3-e42f-8d37-af494b36e0d9.png)

#### 余談

```
composer self-update
```

アップデート確認

## Laravelプロジェクトの作成

Laravel公式 https://laravel.com/docs/5.4/installation#installation

```
composer create-project laravel/laravel --prefer-dist laravel_sample
```

laravel_sampleというプロジェクトを作成する

```
php artisan --version
```

バージョン確認

## プロジェクトの実行

```
php artisan serve
```

Laravelプロジェクトの実行

```
http://localhost:8000
```

上のURLにアクセスする

![スクリーンショット 2018-07-02 16.05.19.png](https://qiita-image-store.s3.amazonaws.com/0/237604/df9641a1-1960-774a-6236-d0d9abd49baf.png)

上の画面が表示されれば成功！！！

## 終わりに
無事にLaravelプロジェクトを実行できました！！！
やったね〜〜
Spring BootプロジェクトをIntelliJ(Spring Initializr)を利用して作成する

[Spring Boot + MySQLでシンプルなWeb REST APIサーバを実装する - Qiita](https://qiita.com/YutaKase6/items/007f6b7d12d342c1330c)

# Outline
Spring Bootプロジェクトを作成する。
Build toolはgradleを利用する。
![ij.jpeg](https://qiita-image-store.s3.amazonaws.com/0/90526/aa0ab6a0-dbad-6551-0232-01a72bbfabaf.jpeg)


# Steps
## 1. Create New Project
<img width="512" src="https://qiita-image-store.s3.amazonaws.com/0/90526/eda0f1bd-b125-b1bf-14cf-9d39e763df83.png">

## 2. Spring Initializr
<img width="512" src="https://qiita-image-store.s3.amazonaws.com/0/90526/0c0bc776-cdc4-643d-75b7-6d2100184bb7.png">

## 3. Build tool
今回はGradleを選択。
<img width="512" src="https://qiita-image-store.s3.amazonaws.com/0/90526/eecdf5d9-fe71-eaa1-497e-2eeeb8ca7856.png">

## 4. Dependencies
MySQLを利用したWebAPIなので以下の依存を追加する。

- Lombok
- Web
- JPA
- MySQL

<img width="512" src="https://qiita-image-store.s3.amazonaws.com/0/90526/0f53cf69-842a-cea0-2954-e8acc3ce02c6.png">

Lombokは便利なので利用する。
依存は後からでも追加可能なので軽い気持ちで。

## 5. Done
完成。
Spring BootのGradleプロジェクトの雛形が生成される。

# おまけ
## Lombok
LombokをIntelliJ上で有効化するためにプラグインの設定が必要

### 1. Install Lombok plugin
lombokと検索。
<img width="512" src="https://qiita-image-store.s3.amazonaws.com/0/90526/df81cc3d-1d9e-4e47-fd83-d0576fb81c08.png">

### 2. Annotation processing
再起動後、Annotation processingを有効化すれば、Lombokが利用可能になる。
 <img width="512" src="https://qiita-image-store.s3.amazonaws.com/0/90526/f94cd727-4785-b2d2-442a-a30a458fc32f.png">
Azure Sphere の開発用ボード

ここで買える
https://www.seeedstudio.com/MT3620-Development-Board-for-Azure-Sphere-p-3052.html#
ちなみに今なら
**送料無料!**
~~商品自体は5ドルだし~~ 
日本円で2000円くらいしてもおかしくない送料が無料だし
買うなら今しかない！
ちなみに5個まで買えて~~合計25ドル~~ 

搭載されているMCUはMediatekのMT3620
詳細はここ
https://www.mediatek.com/products/azureSphere/mt3620

おそらくAzureのDevice Provisioning Serviceを使って
いわゆるZTP(zero touch provisioning)が可能かと思われる。

追記
5ドルは手付金との指摘を受けました。
確認したところ確かにそのようです。
失礼しました。
react navigationで同じscreenに再移動　個人メモ

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)routeAからrouteAへ違うパラメータで遷移したい時、
例えば、home, detailsという二つの画面があり、detailsにあるアイテムをクリックすると、detailsに遷移するときなどだ。(同じ画面を異なるparamsで使いまわしたい時)
navigation.navigateは使うことができない。

navigateion.pushを使おう。
公式に書いてある。
https://reactnavigation.org/docs/en/navigating.html
esp8266 Arduino の WebClient::status()の値

esp8266 Arduinoで tcpでデータを受信、処理するプログラムを作成していて、
送信が中断した場合に、状況を検出する方法がわからなかったので、調査した。

# WebClient::status() メソッド

WebClientクラスの status()メソッドがlwIPの tcp_pcb構造体の state の値を返す。
stateの値は lwip/tcp.h で enum tcp_state で定義されている。

```c:tcp.h

enum tcp_state {
  CLOSED      = 0,
  LISTEN      = 1,
  SYN_SENT    = 2,
  SYN_RCVD    = 3,
  ESTABLISHED = 4,
  FIN_WAIT_1  = 5,
  FIN_WAIT_2  = 6,
  CLOSE_WAIT  = 7,
  CLOSING     = 8,
  LAST_ACK    = 9,
  TIME_WAIT   = 10
};
```

[WebClient::status()](https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/WiFiClient.cpp#L289) ->[CleintContext::state()](https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/include/ClientContext.h#L315)->[enum tcp_state](https://github.com/esp8266/Arduino/blob/master/tools/sdk/lwip/include/lwip/tcp.h#L127)

# プログラム実行時の`state`の値

tcpでデータを受信するプログラムで、stateの値を表示させてみた所、
通常は 4: ESTABLISHEDで、送信を中断すると 0:CLOSEDに変化した。

closedかどうかを調べるだけであれば、 [`WebClient::connected()`](https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/WiFiClient.cpp#L281) の方が便利。

# `WebClient::operator bool`には注意

 [`WebClient::operator bool`](https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/WiFiClient.cpp#L296)は `connected()`を返すので、これを使ってもよさそうだ
... と思ったが、実際に使うと動作が変。　

調べると、connected()が返るのは 2.4.1以降らしい。 2.4.0までは 以下のようになっている。

```cpp:WiFiClient.cpp
WiFiClient::operator bool()
{
    return _client != 0;
}
```
参考:[(bool)WiFiClient needs to return ::connected() since ClientContext is… · esp8266/Arduino@a2e7c7d](https://github.com/esp8266/Arduino/commit/a2e7c7d0166c0ded47509fda1ec6542beb1e67ce)
AutoItでIEの画面を開く/開いている画面を操作する

# AutoItでIEを開く/開いている画面を操作する

## 概要
AutoItを使って、IEを起動して指定サイトを操作する方法と、元々起動してあるIEの指定サイトを操作する方法について記載する。


## IEを起動して操作する方法

```
#include <IE.au3>

; IEのオブジェクトを作成
$oIE = _IECreate("https://www.google.co.jp/")

; IEの起動時間待機する
_IELoadWait($oIE)


```


## 元々起動してあるIEを操作する方法

```
#include <IE.au3>

; 開いているIEのオブジェクトを取得(urlが一致するIEのオブジェクトを取得している)
$oIE = _IEAttach("https://www.google.co.jp/", "url")

; 指定したタイトルのウィンドウをアクティブに
WinActivate("Google")
```


## 利用例
起動済みのIEからグーグルで検索してみる例


```
#include <IE.au3>

; 起動しているIEのサイトから検索する場合
$oIE = _IEAttach("https://www.google.co.jp/", "url")
WinActivate("Google")


; 検索キーワードを入力する
$keyword = "Qiita"
$oInputBox = _IEGetObjById($oIE, "lst-ib")
$oInputBox.value = $keyword
$oSendButton = _IEGetObjByName($oIE, "btnK")

; 検索ボタンをクリック
_IEAction($oSendButton , "click")

```
NEologd 辞書 を Windows 用 MeCab に導入して Python で使う方法

# 1. MeCab for Python 3 (Windows) のインストール

まずは[Windows で pip で mecab-python をいれる](https://qiita.com/yukinoi/items/990b6933d9f21ba0fb43)を参考しながら、MeCab for Python 3 (Windows) をインストールしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267887/2cba77bf-be5c-2881-4365-be1a0f0c0e5e.png)

わたしがインストールした Python は 3.6.5 (64-bit) なので、コンパイル済みの MeCab 64bit も必要です、上記のリンク先からダウンロードできます。64-bit の Python を利用する場合はきっと忘れないように。

インストールされた MeCab は（デフォルトの場合）`C:\Program Files\MeCab\` にあります。辞書は `C:\Program Files\MeCab\dic\` にあります。

# 2. NEologd 辞書のインストール

## 2.1. Windows Subsystem for Linux のインストール

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267887/8ae8d6e7-6d16-a81c-5c08-5a96e53a02e7.png)

NEologd 辞書をビルドするため、WSL（Windows Subsystem for Linux）が必要です。[マイクロソフトのウェイブサイト](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)に登載する手順を従って、WSL をインストールしてください。

## 2.2. Ubuntu Linux のインストール

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267887/d9704cc7-95ff-f0c5-92c5-f766680eb323.png)

Microsoft Store から、Ubuntu をインストールしてください。

## 2.3. NEologd for Linux のインストール

Ubuntu Linux を起動して、[ubuntu 18.04 に mecab をインストール](https://qiita.com/ekzemplaro/items/c98c7f6698f130b55d53)を参考しながら、mecab-ipadic-neologd をダウンロードして、ビルドしてください。

## 2.4. NEologd を Windows に

インストールされた NEologd 辞書は `/usr/lib/mecab/dic/mecab-ipadic-neologd/` にあります。このディレクトリにあるファイルをすべて `C:\Program Files\MeCab\dic\ipadic-neologd\` にコピーしてください。

最後に、`C:\Program Files\MeCab\etc\mecabrc` をオープンして、

```
dicdir =  $(rcpath)\..\dic\ipadic
```

を

```
dicdir =  $(rcpath)\..\dic\ipadic-neologd
```

に書き換えてください。これで終わりです。

# 3. テスト

NEologd の結果は以下のよう：

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267887/8ef0a513-5bb4-a2a5-0e8e-db8f79e8d4bb.png)

デフォルトの ipadic の結果は以下のよう：

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267887/c6045269-80e3-7cad-2c36-c9057ef519aa.png)

とてもよくなりました！うれしい！

# 4. 一時的な辞書変更

参考：[Mecabのシステム辞書・ユーザ辞書の利用方法について](https://qiita.com/hiro0217/items/cfcf801023c0b5e8b1c6)

`MeCab.Tagger()` を呼び出す時は辞書のディレクトリをパラメータとして入れると、一時的な辞書変更ができます。例えば：

```
MeCab.Tagger("-d ..\dic\ipadic-neologd")
```

または

```
MeCab.Tagger("-d ..\dic\ipadic")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267887/e7a02fee-3746-2977-d892-7e82e38db657.png)

つまり、`C:\Program Files\MeCab\etc\mecabrc` を編集しなくてもいいです。