OmniAICreator/Qiita-1.07M huggingface dataset:
Javaのソースで見つけた ...(点3つ) って何？から知る可変長引数

### きっかけ
Javaのソースで...(点3つ)の引数を見かけた。

```java:何だ...って？
    private static void printArgs(String description, Object... args) {
        for (Object object : args) {
            System.out.println(object);
        }
    }
```

### ...(点3つ)は可変長引数を表します。
可変長引数は、指定された型の引数を複数指定できます。

```java:引数を指定してみる
        // コレでもOK
        printArgs("1つ", "複数");
        // コレもOK
        printArgs("2つ", "複数", "指定");
        // コレもOK
        printArgs("3つ", "複数", "指定", true);
        // コレだってOK
        printArgs("なし");
```

```text:結果
1つ : 複数
2つ : 複数指定
3つ : 複数指定true
なし : 
```
### 可変長引数は、配列を定義したも同然です。
可変長引数のメソッドをコンパイルすると配列になります。

```java:コンパイル後
    public void methodName(String description, Object[] vars)
        メソッドの中身.
    }
```

### 可変長引数は、配列も指定できます。

```java:引数に配列も指定できます
// コレでもOK
methodName("配列", new int[]{1,2,3,4,5});
// コレすらOK
methodName("配列と1つ", new int[]{1,2,3,4,5}, "複数");
```

### 可変長引数は、使い方に決まりがあります。
**配列を引数にとるオーバーロードはダメ**
理由 : コンパイルしたら同じになるから

```java:配列を引数にとるオーバーロードはダメ
    public void methodName(String description, Object... vars)
        メソッドの中身.
    }
    public void methodName(String description, Object[] vars)
        メソッドの中身.
    }
```

**可変長引数は最期に指定しないとダメ**
理由:たぶん、どこまでが可変長引数に指定している値かわからなくなるから

```java:可変長引数は最期に指定しないとダメ
// argsでコンパイルエラーになり、Eclipseだとこんなメッセージが出ます。(ざっくり訳 : 可変長引数は最後に書いてね)
// 「The variable argument type Object of the method printArgs must be the last parameter」
    private static void printArgs2(Object... args, String description) {
        メソッドの中身.
    }
```

**可変長引数は１つしか指定できない**
理由:たぶん、どこからどこまで1つ目かわかんなくなるし、1つ目の可変長引数が最期に指定されていないことになるから

```java:可変長引数は１つしか指定できない
// args2でコンパイルエラーになり、Eclipseだとこんなメッセージが出ます。
// 「The variable argument type Object of the method printArgs must be the last parameter」
    private static void printArgs2(String description, String... args2, Object... args) {
        メソッドの中身.
    }

// こうするとコンパイルエラーにならない
    private static void printArgs2(String description, String[] args2, Object... args) {
        メソッドの中身.
    }
```
### おまけ
[JUnitで引数に配列や可変長引数をとるprivateメソッドをテストする方法 - Qiita](https://qiita.com/ponsuke0531/items/407449658e12c8b8d395)

### :sunny:可変長引数の説明をしてくれているサイト様:sunny:
- [Java可変長引数メモ(Hishidama's Java VarArgs Memo)](http://www.ne.jp/asahi/hishidama/home/tech/java/varargs.html)
- [【Java】可変長引数のパラメータを配列にするときの注意 - Qiita](https://qiita.com/7tsuno/items/0c9e52fb3b14e37dbc4c)
cssで複数カラムを横幅のmarginを0で間を開ける

# この記事の内容

複数カラムで繰り返しでitemを生成する場合、marginを左右につけて間を開けると思うがそうすると全体の左右にmarginが入り、他のパーツと横幅が変わってしまう。

# :nth-of-type

```
指定したパーツ cssを指定したいパーツ:nth-of-type(n)
```

で指定したパーツのなかでcssを指定したいパーツのn番目のものを指定できる。これで偶数を2n+0で指定してmargin-leftをつける。
NodeJSでAsync/AwaitしてREST API 叩いて json を処理する

# 今回すること

最新のJSでは async/await を使うことができます。
C#でも同じキーワードですでに実装されていますが、非同期処理を簡潔に記述するための言語仕様です。

今回は、  ```async/await``` を利用して よしなにREST API を叩くコードを書いていきます。

# 環境

Azure Functions

# コード

NodeJS で fetch を使うためには、パッケージを入れなければいけないです。

http://morizyun.github.io/javascript/node-js-npm-library-node-fetch.html

```shell
npm add node-fetch
```

```js
const fetch = require('node-fetch');

// Bitcoin のレートを json で取得することができるAPI
const URL = 'https://coincheck.com/api/rate/btc_jpy';

// 非同期で レート情報を取得する
const data = async () =>{
    const response = await fetch(URL);
    if(response.ok) return response.json();
    return;
}

// レート情報をよしなに調理するメソッド
const showBitcoinRate = async () => {
    const bitcoinData = await data();
    console.log(`ビットコインのレートは${bitcoinData.rate}`);
}

showBitcoinRate();
```
メモ　さくらvps初期設定 2018 centos7

# 概要


基本的にはサーバの設定はprovisioning toolで行いたいが、初期設定だけは手でやりたいみたいなこともある。
そのためのメモ。


追記 2018/02/01
[ansible化しました](https://github.com/tttreal/ansible_sakura_vps_setup)


# ユーザ作成

```sh
useradd xxx
usermod -G wheel xxx
visudo # で、”%wheel  ALL=(ALL)       NOPASSWD: ALL” を有効に（パスが必要なければ）
```

# ユーザxxxの.ssh設定
```sh
# root
su - xxx

# xxx
ssh-keygen -t rsa  # .ssh を作りたい
vim .ssh/authorized_keys  # 手元のid_rsa.pubの内容を貼り付け
chmod 600 !$

# とりあえずここまででssh疎通確認はできる
```

# sshセキュリティ設定
```sh
# sshd_configの設定
sudo vim /etc/ssh/sshd_config  # やることは３つ。Port変更, PermitRootLogin => no, PasswordAuthentication => no
sudo systemctl restart sshd.service

# firewalldの設定
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
sudo vim !$/ssh.xml  # 変更したポートに合わせる
sudo systemctl reload firewalld

# ssh 疎通確認
```


# yum update
```
sudo yum -y update  # OSも最新になるはず
sudo reboot
```


# 参考

* さくらのVPS-サーバの初期設定ガイド

https://help.sakura.ad.jp/hc/ja/articles/206208181--%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEVPS-%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A%E3%82%AC%E3%82%A4%E3%83%89
※Centos6

* CentOS7のfirewalldでsshのポート番号を変更する方法

https://qiita.com/DQNEO/items/5780d81b2e0af4cc1544
[wget] 情報処理技術者試験の過去問を一括ダウンロードする

IPAの情報処理技術者試験、2018年春期の受付が始まりましたね。
受験予定のみなさん、手続きは済みましたか？僕はエンベデッドシステムスペシャリストを受けます。
過去問がたくさん公開されてて有難いのですが、いっこずつ手動でダウンロードするのは、ちょっと面倒です。
そこで今回は、wgetを使って一括ダウンロードしたいと思います。

#情報処理技術者試験 過去問題

[IPA 情報処理技術者試験センター Webサイト](https://www.jitec.ipa.go.jp/)
トップページ右側にあるリンクから、「過去問題」のページにアクセスできます。

そこからさらに、→「平成00年度〇期試験…」→「問題/解答/講評」と２階層リンクを辿ると、過去問(解答・講評)のPDFファイルがあることが分かります。

#PDFファイル名のフォーマット
`(西暦4桁)h(平成2桁)(h:春/a:秋)_(試験区分)_(時間区分)_(qs:問題/ans:解答/cmnt:講評).pdf`
という形式になっているようです。

例えば「2017年度春期のエンベデッドシステムスペシャリスト(ES)午後IIの問題」は、
`2017h29h_es_pm2_qs.pdf` ですね。

高度共通午前Iは、試験区分の部分が`_koudo_`となっているようです。

#wget
とりあえず今回は、午前Iを除くエンベデットシステムの問題・解答・講評をまとめてwgetすることにします。
`$wget (URL) -r -np -l 2 -w 1 -A '*_es_*.pdf'`

これでOK、楽ちんです。

###コマンド解説
`wget` : WebサーバからファイルをダウンロードするUNIX/Linuxコマンド。詳細は `$wget --help`
`(URL)`: ここに「過去問題」ページのURLを入れる
`-r`   : 再帰的にダウンロードする
`-np`  : 親ディレクトリを取得対象にしない
`-l 2` : 再帰ダウンロードする深さを2階層に指定
`-w 1` : サーバへの負荷軽減のため、ダウンロード毎に1秒待つ
`-A '*_es_*.pdf'`: ダウンロードするファイル名をフィルタ。*はワイルドカード

#さいごに
* IPA 試験センターのWebサイトおよび過去問については、サイト内の利用条件を守って利用しましょう。
* Qiitaの練習を兼ねた投稿でした。もし内容に問題や間違い等あれば、ご指摘頂けたら嬉しいです。
* 試験がんばろうぜ！
raspi zero wを使う上で使ったコマンド集 (備忘録)

# raspi zero wを使う上で色々と設定が必要な際に使ったコマンド集
ラズパイ公式サイトのドキュメントより

# セキュリティ
- セキュリティのためにユーザを追加
    - sudo useradd -m blabla -G sudo
- ユーザの削除時にホームフォルダーも同時に削除
    - sudo deluser -remove-home blabla
- パスワードの変更
    - sudo passwd blabla
- sudo使用時にパスワードを入力させる(raspiが外部インターネットにさらされている時にクラッカーが何らかの方法で接続した時に**sudo**コマンドをパスワードなしでは使えないようにするため)
    - sudo nano /etc/sudoers.d/010_pi-nopasswd に
        - pi ALL=(ALL) PASSWD: ALL と設定
- ユーザの許可と否定の設定を行う
    - 許可
        - AllowUsers edward andrew charles anne
    - 否定
        - DenyUsers harry william
    -  設定を適用
        -  sudo systemctl restart ssh or reboot
-  firewallの設定 (iptableでも良いが設定が難しいので設定が簡単なufwを使う)
    -  ufwのインストール
        -  sudo apt-get install ufw
    -  ufwの有効化
        -  sudo ufw enable
    -  ufwの無効化
        -  sudo ufw disable
    -  ufwのポートアクセスの許可（番号は適切に）
        -  sudo ufw allow 22
    -  ufwのポートアクセスの無効化
        -  sudo ufw deny 22
    -  ufwのポートアクセスの無効化(ポート指定)
        -  sudo ufw deny 22/tcp
    -  ufwのポートアクセスの許可(番号を知らなくてもできる)
        -  sudo ufw allow ssh
    -  ある30秒以内にに6回以上あるipアドレスから接続を試されたら自動的にその接続を拒否する
        -  sudo ufw limit ssh/tcp
    -  指定の秒数内に6回指定のipアドレスから接続の試みがされた時それの接続を拒否する
        -  sudo ufw deny from 192.168.2.1 port 30
-  外部に意図的に通信の出入り口を開けることにより生じる脅威を遮るためにfail2banをインストールする これにより攻撃者からのブルートフォースアタックなどをされているのをログファイルを自動で見て異常があれば伝えてくれたり自動でファイヤーウォールを更新してくれるスグレモノ
    -  fail2banのインストール
        -  sudo apt-get install fail2ban
    -  fail2banは**/etc/fail2banというファイルを作る
    -  設定ファイルは**jail.conf**である
    -  **jail.conf**は**jail.local**というファイルとしてコピーする必要がある
    -  **jail.local**を実際に設定していく
    -  ssh接続を許可するために設定ファイルに書き込む


```jail.confのコピー
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
```
```jail.localへsshの許可を設定
sudo nano /etc/fail2ban/jail.local

[sshd]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 6
```
sshの接続設定は**sshd.conf**に記述されている

```sshd.conf
\etc\fail2ban\filters.d\sshd.conf
```

sshのサービスの有効化の二つ目の方法 (初めらへんに書いてあるのが一つ目の方法)

```有効化
sudo systemctl enable ssh
```
```サービスの起動
sudo systemctl start ssh
```

# 参考
- https://www.raspberrypi.org/documentation/configuration/security.md
感覚でCoffeeScriptを書いていてハマったこと　インデントに注意！！！

#背景
Railsでwebアプリを作っていてCoffeeScriptを使う必要が出てきた。
全くドキュメントを読まずにcoffeeを感覚で書いていた時に、基本的な知識がないために落とし穴にハマり、抜け出すのに1日を無駄にしてしまった。
そこで、この記事では普通のJavascriptとCoffeeScriptの引っ掛かりやすい違いをまとめた。(あまりに基礎的な話です。)

#インデントに注意！！！
**CoffeeScriptではインデントでブロックを表現する！！！**（基礎の基礎の基礎です）
Javascriptやrubyなどのほとんどの言語ではインデントはコードを見やすくするためのものであり、めちゃくちゃにインデントしても（または全くしなくても）問題ない。
しかし、CoffeeScriptではブロックをインデント表現するため、めちゃくちゃに書くと動かない...(泣)

このことを知らず、1日を無駄にした...

しかし、この仕組みによって、連想配列などが以下の例のように楽に書けるというメリットもある。

```coffee:sample.coffee
menu =
    "curry":
        "price": 350
        "cal": 500
    "tonkatsu":
        "sprice": 600
        "cal": 800
```

これをJavascriptで書くと、

```js:sample.js
var h;

menu = {
    "curry": {
        "sprice": 600,
        "cal": 800
    },
    "tonkatsu": {
        "sprice": 600,
        "cal": 800
    }
};
```
CoffeeScriptならカンマ（,）も必要ない！！！

#CoffeeScriptの便利なところ
上記のような連想配列が簡単に書けること以下にも便利な点がたくさんあるが、その中でも、複数行文字列のクオテーションやヒアドキュメントのクオテーションが簡単になった点が特に便利だと感じた。

CoffeeScriptでは複数行文字列以下のように普通に簡単に書ける！！！

```
"Hello,
World"

↓

Hello, World
```

また、改行付きの文字列も以下のように"""で囲めば改行コードなしで書ける！！！

```
"""Dear Coffeescript
you are very convenient 
programming language!!!"""

↓

Dear Coffeescript
you are very convenient 
programming language!!! 
```

#感想
ドキュメントを読むことの大切さを痛感しました。
railsなどを使っていると、基礎的なこと（javascriptやSQL文、データベースについてなど）を理解していなくても、全然アプリを作れてしまうが、少しでも凝ったことをしようと基礎的な知識が重要になってくることを痛感した。
coffeescriptを使っていれば、自然とほかの言語を使うときにも、インデントのきれいなコードを書けるようになることに期待！
Pythonのrequestsを利用してファイルダウンロードする方法

## 1. はじめに

PythonのHTTPクライアントライブラリである`requests`を利用して、普通のファイルダウンロードを行う方法について説明したいと思います。`Rest API(json形式)`によるファイルダウンロードについては次回説明する予定です。
なお、アップロードについては「[Pythonのrequestsを利用してmultipart/form-dataのFormにファイルアップロードする方法](https://qiita.com/5zm/items/92cde9e043813e02eb68)」を参照ください。

## 2. ソースコード

```python:fileDownloadDemo.py
# -*- coding: utf-8 -*-
import requests
import os
from datetime import datetime

# ★ポイント1
# ex) set DOWNLOAD_SAVE_DIR=C:/Temp/flaskDownloadSaveDir
DOWNLOAD_SAVE_DIR = os.getenv("DOWNLOAD_SAVE_DIR")

# main
if __name__ == "__main__":

    # ★ポイント2
    url = 'http://localhost:3000/report3/0000001'
    response = requests.get(url)

    # ★ポイント3
    contentType = response.headers['Content-Type']
    contentDisposition = response.headers['Content-Disposition']
    ATTRIBUTE = 'filename='
    fileName = contentDisposition[contentDisposition.find(ATTRIBUTE) + len(ATTRIBUTE):]
        
    # ★ポイント4
    saveFileName = datetime.now().strftime("%Y%m%d_%H%M%S_") + fileName
    saveFilePath = os.path.join(DOWNLOAD_SAVE_DIR, saveFileName)
    with open(saveFilePath, 'wb') as saveFile:
        saveFile.write(response.content)
```

**★ポイント1**

サンプルではダウンロードしたファイルを保存するディレクトリを環境変数から取得できるようにしました。

**★ポイント2**

`requests`の`get()`でファイルダウンロードのURLにアクセスします。特別なことはありません。なお、サンプルではHTTPのGETメソッドでアクセスするAPIにしています。

**★ポイント3**

`requests`の`headers`を利用してHTTPレスポンスヘッダからContentTypeや添付ファイルのファイル名を取得します。
なお、サンプルのAPIは「[Flaskでファイルダウンロードを実現する３つの方法](https://qiita.com/5zm/items/760000cf63b176be544c)」で紹介している内容を前提としています。

**（注意）**
サンプルのファイルダウンロードAPIでは`Content-Disposition`ヘッダで添付ファイル名を指定する仕様としています。
`Content-Disposition`ヘッダは必須ではないので、APIによっては付与されていない場合もあるので注意してください。付与されていない場合はContentTypeから拡張子を類推してファイル名を決める必要があります。

**★ポイント4**

`requests`のHTTPレスポンスの`content`を利用してダウンロードファイルのデータにアクセスし、バイナリデータをファイルとして保存します。普通のファイル保存の処理です。
サンプルでは★ポイント1で取得したディレクトリに、年月日時分秒のプレフィックスを付与して保存しています。

## 3. さいごに

今回は`requests`を利用して普通のファイルダウンロードを行う方法について説明しました。
次回は`requests`で`Rest API(json形式)`によるファイルダウンロードを行う方法について説明する予定です。
Ubuntu に 最新の NodeJS を導入する方法 バージョンが変わっても通用する方法を書きます。

# 書くこと

- Ubuntu に最新の NodeJS を導入する方法

# 書く理由

- 各ウェブサイトに導入するためのコマンドは乗っていても、バージョンが古すぎたりと使えないものが多かった
- 最新を導入するときにどのコマンドを打てばいいかの調べ方を書いたほうが有意義ではないのか

# 調べ方

NodeJS の公式サイトにコマンドは乗っている。
Ubuntu だけでなく、各種OS向けのが乗っている

## リンク

https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions

## 2018.1 時点での導入コマンド

```shell
curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
sudo apt-get install -y nodejs
```
【Git基礎】git mergeとgit rebaseではコンフリクト時のHEAD側ブランチが逆

# はじめに

Gitのmergeとrebaseの基本的なお話です

# サンプル Git treeとコード

前提 Git tree

```tree
* <176d8be> (master) hello master
| * <f7edd2a> (HEAD -> feature) print feature
|/  
* <5e9878f> first commit
```

初期コミットからmasterブランチとfeatureブランチが枝分かれ

```app.py(HEAD->feature)
def main():
    # main prints Hello feature
    print("Hello feature")

if __name__ == "__main__":
    main()
```

```app.py(master)
def main():
    # main prints Hello master
    print("Hello master")

if __name__ == "__main__":
    main()
```

# コンフリクト発生

HEADをfeatureブランチとして`merge master`、`rebase master`それぞれのコンフリクト状態を見る 

## git merge

`git merge master`だとmasterがチャレンジャー

```
$ git checkout feature
$ git merge master
```

![スクリーンショット 2018-01-15 22.16.07.png](https://qiita-image-store.s3.amazonaws.com/0/91562/1bd48aed-5b4f-ba5c-f1b7-6d705a51088a.png)

HEAD(現在の変更)はずっとfeature

mergeコンフリクト解消後のGit tree

```
*   <07ad829>  (HEAD -> feature) merge master into feature
|\  
| * <176d8be>  (master) hello master
* | <f7edd2a>  print feature
|/  
* <5e9878f>  first commit
```

mergeでは既存のコミット達は消えない(破壊しない)


## git rebase

`git rebase master`だとfeatureがチャレンジャー

```
$ git checkout feature
$ git rebase master
```

![スクリーンショット 2018-01-15 22.15.35.png](https://qiita-image-store.s3.amazonaws.com/0/91562/ff66485a-4e61-c755-bd47-07129731e5de.png)

上スクショのようにrebase中はmasterがHEADとなる

rebaseコンフリクト解消後のGit tree

```
* <37f6e7e>  (HEAD -> feature) print feature
* <176d8be>  (master) hello master
* <5e9878f>  first commit
```

rebaseではかつてのコミット(`f7edd2a`)は消えmasterにそのまま乗る新しいコミットを作る

rebaseが完了するとHEADはfeatureに戻る

# おわりに

* ちなみに英語では現在の変更(HEAD)は *ours* 、入力側の変更(チャレンジャー)は *theirs* という

* コンフリクト解消は本記事のスクショ用にも使ったVisual Studio Codeが便利
Excelで生存時間解析


生存時間解析用のツールはいくつも存在するが，無料かつExcelで簡単に使えるツールが無いようなので作ってみた。

#始めに
アドインファイルは以下のリンクからダウンロード可能。使い方や仕様については説明書を参考にしてください。
・[SAアドイン.xlam](https://drive.google.com/uc?export=download&id=1CcRzF7PfAJ-WQRTLGgADgH7nJUp4N0RL)
・[SAアドイン説明書.txt](https://drive.google.com/uc?export=download&id=12wbguBkSex_4_waXzTq1gZFeRxo80Jn3)


他の解析ツールと比較しても解析精度は遜色ない思いますが，個人で作成したものなので保証はできません。使用は自己責任でお願いします。

#機能
このアドインでは以下の3機能を実装しています。
・抽出
・カプラン＝マイヤー法，ログランク検定（KM＆LR)
・Cox比例ハザードモデルの係数回帰推定（Cox）

#動作環境
Windows版 Excel 2016

ExcelのバージョンによってVBAの仕様が異なるため，古いバージョンでは正常に動作しない可能性があります。Excel for Mac (ver 15.41) ではうまく動作しませんでした。

#スクリーンショット

**・抽出機能**
<img src="https://qiita-image-store.s3.amazonaws.com/0/231104/e8d43324-4b22-5333-89ca-815ab620c5c2.jpeg" width=50%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/231104/d3ee3da6-6caa-eeba-b45e-577299a6c385.jpeg" width=50%>


**・KM＆LR**
<img src="https://qiita-image-store.s3.amazonaws.com/0/231104/6229bcb7-8843-7c43-0524-79d4ed7eff4c.jpeg" width=50%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/231104/605410b6-38e3-bfba-2b92-578378520186.jpeg" width=50%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/231104/b08d4429-f646-525e-dff6-aa5a05727d02.jpeg" width=50%>

**・Cox**
<img src="https://qiita-image-store.s3.amazonaws.com/0/231104/2cc14baf-cd36-df89-a1a5-de0c1e432050.jpeg" width=50%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/231104/97d4109f-3107-41ce-4626-8d20b19481fb.jpeg" width=50%>

#参考
・Cox比例ハザードモデル (医学統計学シリーズ) 中村 剛，丹後 俊郎
・[統計学入門](http://www.snap-tck.com/room04/c01/stat/stat0001.html)
・BellCurve 「エクセル統計」
IDCFオブジェクトストレージ AWS CLI エラー 【The authorization mechanism you have provided (AWS4-HMAC-SHA256) is not supported.】

## 現象
### IDCFオブジェクトストレージ向けの AWS CLI S3　コマンドがエラーを吐く

```
$ aws --endpoint-url https://ds.jp-east.idcfcloud.com s3 ls
An error occurred (InvalidRequest) when calling the ListBuckets operation: The authorization mechanism you have provided (AWS4-HMAC-SHA256) is not supported.
```

## 原因
リクエスト認証には、v2とv4があり最新のawsの認証はデフォルトでv4になっている。
しかし、IDCFオブジェクトストレージの認証はv2になっており、v4認証でアクセスするとエラーとなる。

## 対策

[リクエスト認証での署名バージョンの指定](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingAWSSDK.html#specify-signature-version)が可能なので、v4からv2に変更する。

```
$ aws configure set default.s3.signature_version s3
```

ちなみにv4を指定する場合はこう

```
$ aws configure set default.s3.signature_version s3v4
```

## 参考リンク

[http://docs.openio.io/master/source/user-guide/awscli.html](http://docs.openio.io/master/source/user-guide/awscli.html)
面接などで聞かれた技術系の質問と復習

## 背景
色々な企業で面接受けていると、技術的な基礎知識を質問されることがあります
初見で答えられない問題があるのは仕方ないですが「2回目は答えられるようにしよう」という気持ちでまとめてみます（随時追加予定）

というか、「これくらい知っておこう」的なメッセージでもあると思うので笑
これに限らず、失敗したことはなるべくその場で学び直していきたいですね

これから技術系で就職活動する方の参考になれば幸いです
Web系に偏っている気がしますがご愛敬ｗ

## 質問と解答

### 1. HTTPステータスコードとその意味を出来るだけ答えてください
**※HTTPステータスコード**
HTTPにおいてWebサーバからのレスポンスの意味を表現する3桁の数字からなるコード

細かいところは[Wiki](https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89)に結構まとまってまるので割愛
[参考](https://www.marineroad.com/staff-blog/12476.html)によるとザックリ知っておくべきは以下

#### **A)ステータスコードの番号の意味**

|ステータスコード  |意味  |詳細   |
|---  |---  |---  |
|1xx  |**Informational 情報** |リクエストは受け取られた。処理は継続される|
|2xx  |**Success 成功** |  リクエストは受け取られ、理解され、受理された|
|3xx  |**Redirection リダイレクション** |  リクエストを完了させるために、追加的な処理が必要|
|4xx  |**Client Error クライアントエラー** |  クライアントからのリクエストに誤りがあった|
|5xx  |**Server Error サーバエラー** | サーバがリクエストの処理に失敗した|

#### **B)よく出るもの**
|ステータスコード  |詳細 |
|---  |---  |
|200 OK|  リクエストは成功し、レスポンスとともに要求に応じた情報が返される。ブラウザでページが正しく表示された場合は、ほとんどがこのステータスコードを返している|
|301 Moved Permanently|**恒久的に**移動した。リクエストしたリソースが恒久的に移動されているときに返される。Location:ヘッダに移動先のURLが示されている。|
|302 Found|発見した。301と違ってリクエストしたリソースが**一時的に**移動されているときに返される。Location:ヘッダに移動先のURLが示されている。
|400 Bad Request| リクエストが不正である。定義されていないメソッドを使うなど、クライアントのリクエストがおかしい場合に返される。|
|401 Unauthorized| 認証が必要である。Basic認証やDigest認証などを行うときに使用される。たいていのブラウザはこのステータスを受け取ると、認証ダイアログを表示|
|403 Forbidden| 禁止されている。リソースにアクセスすることを拒否された。リクエストはしたが処理できないという意味。アクセス権がない場合や、ホストがアクセス禁止処分を受けた場合などに返される。|
|404 Not Found| 未検出。リソースが見つからなかった。単に、アクセス権がない場合などにも使用される。|
|500 Internal Server Error| サーバ内部エラー。サーバ内部にエラーが発生した場合に返される|
|503 Service Unavailable| サービス利用不可。サービスが一時的に過負荷やメンテナンスで使用不可能である|


### 2. SQLのINNER JOIN と (LEFT/RIGHT) OUTER JOIN の違い
[SQL素人でも分かるテーブル結合(inner joinとouter join)](https://qiita.com/naoki_mochizuki/items/3fda1ad6594c11d7b43c)
上記の投稿がものすごく分かりやすいので一読しておきましょう

ザックリいうと条件に適合しないカラムを残すかどうかの違いです

### 3. SQLインジェクションとは？またその対応
[Wiki](https://ja.wikipedia.org/wiki/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)
SQLインジェクションとは、アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法

対応策としては[プリペアードステートメント](http://php.net/manual/ja/pdo.prepared-statements.php)を使用し、入力値を適切にエスケープするなど
何故GPUでSIMTが流行ったか (仮)

とりあえず、拙い知識で書いてみます。色々簡略化していたり、理解が怪しかったりしますが、ご勘弁を。

# 4-way SIMD時代
初期のGPUは、色処理のRGBA及び座標処理のXYZWを意識して、4-way SIMDユニットで構成されていました。

しかし、RGBやXYZだけの処理が多かったり、RGBAやXYZWの処理でもA (透明度) 要素やクォータニオンのW要素だけ別処理の必要なことが多々あり、非効率でした。

# 3-way SIMD + スカラ時代
4-way SIMDの4番目の要素が例外的に扱われやすいなら、4番目の要素を独立させてスカラ扱いしちゃえば良いと考えたのが、この3-way SIMDユニット + スカラユニットです。

これで問題が解決されたかに見えましたが、高度なシェーダーがスカラ演算を多用するようになり、スカラ演算の連続で3-way SIMDユニットが無駄になり非効率でした。

# VLIW時代 (Radeon R600/2007年～)
スカラ演算の連続もCPUのように複数の演算ユニットに流し込みたいが、CPUのように命令スケジューラを大きくしないで演算ユニットを詰め込みたいと考えたのが、このVLIW方式です。

しかし、VLIWは命令の静的スケジューリングしかできないため、レイテンシ不定の命令で演算ユニットが活かせない状態になり非効率でした。

# アウトオブオーダー+SIMT時代 (NVIDIA G80/2006年～)
命令の静的スケジューリングが動的レイテンシ変化に弱いなら、アウトオブオーダー方式で命令の動的スケジューリングすれば良いのですが、それだけでは命令スケジューラが大きすぎます。それなら、一つの命令スケジューラで複数のスレッドを制御すれば良いじゃないと考えたのがSIMT方式です。

それでも、やっぱり命令スケジューラは大きくて非効率でした。

# アウトオブオーダー+制御コード+SIMT時代 (NVIDIA Kepler/2012年～)
巨大な命令スケジューラが非効率なら、動的スケジューリングの一部を事前計算して静的に与えれば良いじゃないと考えたのが、制御コード方式です。最新です。

# アウトオブオーダー+512-bit SIMD時代 (Xeon Phi KNL/2016年～)
巨大な命令スケジューラを幾つも持つのが非効率なら、SIMDの要素数を増やして同時処理すれば良いと考えたのが512-bit SIMD方式です。そもそもSIMDの効率が悪かったのは、rgbaやxyzwを同一視して扱うからでした。それならば、 Packedデータ ([xyzw, xyzw, ...]) を転置してPlanerデータ ([[x, x, ...], [y, y, ...], [z, z, ...], [w, w, ...]]) で処理しちゃえば、要素数の多いSIMDでも効率的に扱えるはずです。アウトオブオーダーでスカラー演算もばっちり? # XXX: MesaのOpenSWRのコード未読

# 後書き
メモリ周りを無視しすぎ、ハイパースレッドもどきについて無視してるなど、色々問題ある記事ですが、何かの参考になれば幸いです。

Xeon PhiよりNVIDIA GPUの方が汎用に思えますね。特にPlaner処理は、グラフ処理やテーブルルックアップの多い3Dでどれだけ役立つやら…。

(追記) 後書きに少し追加。

# 参考文献
https://pc.watch.impress.co.jp/docs/2007/0518/kaigai359.htm
https://pc.watch.impress.co.jp/docs/column/kaigai/383968.html
https://github.com/NervanaSystems/maxas/wiki/Control-Codes
https://news.mynavi.jp/article/20160830-bifrost/
NodeJSでHttps/GETでJsonを取得して利用する

# やること

- Json を返す Https な API を叩く
- 返ってきたJsonをパースしてJSから利用する

# 具体的になにやるの？

Bitcoin のレート情報を取得できるAPIがあるのでそれを利用して現在のレート情報を取得します。

## 取引所 API 概要
https://coincheck.com/ja/documents/exchange/api#order-rate

### 返り値
```js
{
  "rate": "60000"
}
```

# コード

```js
const https = require('https');
// Bitcoin のレートを json で取得することができるAPI
const URL = "https://coincheck.com/api/rate/btc_jpy";

https.get(URL, function (res) {
    var body = '';
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        body += chunk;
    });
    res.on('data', function (chunk) {
        // body の値を json としてパースしている
        res = JSON.parse(body);
        console.log(`現在のレートは${res.rate}円/Bitcoinだよ！！`);
    })
  }).on('error', function (e) {
    console.log(e.message);
});
```

# 実行結果
![2018-01-15_22-43-09[1].png](https://qiita-image-store.s3.amazonaws.com/0/143354/011a48c9-6235-66fe-f390-1bcfbf89c821.png)
Emacs 25.3 が Windows 7 でコンパイルに失敗する時の対処

２ヶ月くらい解決方法が見つけられなかったのでメモを残す。

参照:
https://groups.google.com/forum/#!topic/gnu.emacs.help/i6IsVfzaNJU
https://msdn.microsoft.com/en-us/library/windows/desktop/dd319121
http://proglab.blog.fc2.com/blog-entry-55.html

## 以下のエラーが出てコンパイルが失敗する。

```
.\temacs --batch --load loadup bootstrap
make[1]: *** [Makefile:737: bootstrap-emacs.exe] error 127
```

# 対応

Uniscribe Library(usp10) を gdi32 より前に置く必要がある。
 
```shell
*** configure.orig	2018-01-13 10:55:18.977321400 +0000
--- configure	2018-01-13 10:56:06.619805100 +0000
***************
*** 11193,11208 ****
    ac_config_files="$ac_config_files nt/emacs.rc nt/emacsclient.rc"
  
    if test "${opsys}" = "cygwin"; then
!     W32_LIBS="$W32_LIBS -lkernel32 -luser32 -lgdi32 -lole32 -lcomdlg32"
!     W32_LIBS="$W32_LIBS -lusp10 -lcomctl32 -lwinspool"
      # Tell the linker that emacs.res is an object (which we compile from
      # the rc file), not a linker script.
      W32_RES_LINK="-Wl,emacs.res"
    else
      UPDATE_MANIFEST=update-game-score.exe.manifest
      W32_OBJ="$W32_OBJ w32.o w32console.o w32heap.o w32inevt.o w32proc.o"
!     W32_LIBS="$W32_LIBS -lwinmm -lgdi32 -lcomdlg32"
!     W32_LIBS="$W32_LIBS -lmpr -lwinspool -lole32 -lcomctl32 -lusp10"
      W32_RES_LINK="\$(EMACSRES)"
      CLIENTRES="emacsclient.res"
      CLIENTW="emacsclientw\$(EXEEXT)"
--- 11193,11208 ----
    ac_config_files="$ac_config_files nt/emacs.rc nt/emacsclient.rc"
  
    if test "${opsys}" = "cygwin"; then
!     W32_LIBS="$W32_LIBS -lkernel32 -luser32 -lusp10 -lgdi32 -lole32 -lcomdlg32"
!     W32_LIBS="$W32_LIBS -lcomctl32 -lwinspool"
      # Tell the linker that emacs.res is an object (which we compile from
      # the rc file), not a linker script.
      W32_RES_LINK="-Wl,emacs.res"
    else
      UPDATE_MANIFEST=update-game-score.exe.manifest
      W32_OBJ="$W32_OBJ w32.o w32console.o w32heap.o w32inevt.o w32proc.o"
!     W32_LIBS="$W32_LIBS -lwinmm -lusp10 -lgdi32 -lcomdlg32"
!     W32_LIBS="$W32_LIBS -lmpr -lwinspool -lole32 -lcomctl32"
      W32_RES_LINK="\$(EMACSRES)"
      CLIENTRES="emacsclient.res"
      CLIENTW="emacsclientw\$(EXEEXT)"
```
Swiftで動作している条件式をC#に移植したらハマった話

# はじめに
普段はSwiftでiOSアプリ開発してるのですが、Swiftで動作している条件式をC#に移植したら、想定外の動作となりハマりました。。。 
以下、実際にハマったコードの再現コードを元に検証していきます。

## Swiftのコード

```floatValue_6_2_OK.swift
let floatValue: Float = Float("6.2")! // 文字列からFloat値を取得
if floatValue < 6.2 {
    print("\(floatValue)は6.2未満")
} else {
    print("\(floatValue)は6.2以上")
}
```
このコードの実行結果は`6.2は6.2以上`となり、想定通りです。

## C#のコード

```floatValue_6_2_NG.cs
float floatValue = float.Parse("6.2"); // 文字列からFloat値を取得
if (floatValue < 6.2) {
    System.Console.WriteLine($"{floatValue}は6.2未満");
} else {
    System.Console.WriteLine($"{floatValue}は6.2以上");
}
```
このコードの実行結果は`6.2は6.2未満`となり、想定通り。。。じゃない！  
なんでこうなったのか調べると、条件部分の`floatValue < 6.2`の型解決？の動作がSwiftとC＃で異っていることが原因でした。  

||floatValue変数|floatValue<br/>条件部分|6.2|備考|
|:-:|:-:|:-:|:-:|:--|
|Swift|Float|Float|Float|数値リテラルの型が、変数の型から推論されてFloat型に決まる|
|C#|float|double|double|変数の型が、数値リテラルのdouble型に合わせてキャストされる|
※ double型にキャストした6.2は`6.19999980926514`なので、C#のコードの実行結果とも合致します。

このため以下のようにコードを修正（条件部分の`6.2`を`6.2f`に修正）して実行すると、

```floatValue_6_2_OK.cs
float floatValue = float.Parse("6.2"); // 文字列からFloat値を取得
if (floatValue < 6.2f) {
    System.Console.WriteLine($"{floatValue}は6.2未満");
} else {
    System.Console.WriteLine($"{floatValue}は6.2以上");
}
```
このコードの実行結果は`6.2は6.2以上`となり、めでたく想定通りとなりました！！
最終的にC#的には、`fの付け忘れ`ということなんだと思いますが、Swiftだとfをつけなきゃいけないっていう認識がないのでハマりました。。。

## 最後にもうちょっとだけ実験

```floatValue_6_2_doubleValue_6_2_cast_result.swift
let floatValue: Float = Float("6.2")!
let doubleValue: Double = Double("6.2")!
print("floatValue=\(floatValue)")
print("doubleValue=\(doubleValue)")
print("floatValue_cast_double=\(Double(floatValue))")
print("doubleValue_cast_float=\(Float(doubleValue))")
```

```floatValue_6_2_doubleValue_6_2_cast_result.cs
float floatValue = float.Parse("6.2");
double doubleValue = double.Parse("6.2");
System.Console.WriteLine($"floatValue={floatValue}");
System.Console.WriteLine($"doubleValue={doubleValue}");
System.Console.WriteLine($"floatValue_cast_double={(double)floatValue}");
System.Console.WriteLine($"doubleValue_cast_float={(float)doubleValue}");
```

このSwiftとC#のコードの結果は両方とも以下になりました。

```:実行結果
floatValue=6.2
doubleValue=6.2
floatValue_cast_double=6.19999980926514
doubleValue_cast_float=6.2
```
精度の高いDoubleへキャストした場合に誤差が発生するみたいです。
なぜなんだろう？
TypeScriptメモ

ElectronNETで開発をすすめる上で、フロントエンド側のプラットホームにはTypeScriptを使用する。

このページはTypeScriptに関するメモ（リンク集）です。


## 参考メモ

- [TypeScript の tsconfig.json を 考える](https://azriton.github.io/2017/09/07/TypeScript%E3%81%AEtsconfig.json%E3%82%92%E8%80%83%E3%81%88%E3%82%8B/)
- [TypeScript の tsconfig.json を 考える - コンパイル・オプション編](https://azriton.github.io/2017/09/10/TypeScript%E3%81%AEtsconfig.json%E3%82%92%E8%80%83%E3%81%88%E3%82%8B-%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%83%BB%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E7%B7%A8/)
- [tsconfig.json で指定できる全 compilerOptions をまとめた (TypeScript v2.5 版)](http://neos21.hatenablog.com/entry/2017/10/24/080000)

## Qiita

Qiitaの「TypeScript」タグを抜粋

### 入門編リンク集

- [TypeScript超入門：とりあえず動く環境を作る](https://qiita.com/ringtail003/items/40c7e74b72ce5a371c46)
    - 環境構築／HelloWorld
- [TypeScript超入門(2)：構文を理解する](https://qiita.com/ringtail003/items/7ccf992f18b768e0e633)
    - 言語解説（型、クラス、制御構文）
- [TypeScript超入門(3)：モジュール](https://qiita.com/ringtail003/items/f7ed257c86e5522f6e59#_reference-ab7313e028e29e2733d5)
    - モジュール

### 非同期

- [TypeScriptのasync/await (PromiseとかVisual Studio Codeとか…)](https://qiita.com/takao_mofumofu/items/f7063445c2020d6c8af0)

### ドキュメント

- [TypeScriptのドキュメントが一瞬で作れるんだ、そうTypeDocならね](https://qiita.com/Mic-U/items/961ce4e0c2a1def1dbd3)


## 参照リンク
- [Electron.NET予定地](https://qiita.com/katachi/items/6bba28d3b382e11e2535)
metabaseでec2上のDBに接続してみた

## 概要
https://qiita.com/acro5piano/items/0920550d297651b04387
記事を見て面白そうだと思い、簡単に触ってみました。

## インストール
1. 公式サイトからダウンロード
https://www.metabase.com/start/
いろんなやり方はありますがmacアプリで実行しました。
インストールして完了です。簡単です。　　

1. SSHトンネルを作成
DBの接続先がAWSのEC2に構築しています。
EC2にはsshの秘密鍵認証で接続します。
※sshの鍵認証は現在対応出来ていないっぽい？？
https://github.com/metabase/metabase/issues/5153
コマンド参考：https://github.com/metabase/metabase/blob/master/docs/administration-guide/01-managing-databases.md

```
## ターミナルから実行
ssh -Nf -L input-port:internal-server-name:port-on-server username@bastion-host.domain.com
## こんな感じで実行しました
ssh -i ~/.ssh/id_rsa -Nf -L 3304:localhost:3306 xxxxx@xx.xxx.xxx.xx
```

3.metabase設定
<img width="794" alt="Monosnap 2018-01-15 21-51-12.png" src="https://qiita-image-store.s3.amazonaws.com/0/226008/525fad92-11da-8980-d5a0-f0f39fd85f71.png">


これから色々触って見たいと思います
Atomのパッケージ入門のために調べたこと

#　概要
Atomのパッケージを作りたくなったので、どうやったらいいんだろうか。を調べた。



# 基礎知識

- パッケージの雛形とやらが作れるらしい
- 主に実装はJavascript
- Chromeの拡張と同じように主要なファイル構成は決まっている

# パッケージの雛形を作る

コマンドパレットを表示（Macの場合：cmd-shift-p）してPackage Generator: Generate Packageを実行すると、生成するパッケージのパスの入力（デフォルトでは~/github/my-package）を求められる。


# 主要なファイル

- package.json: パッケージの説明や依存ライブラリなどを定義
- lib/my-package.js: パッケージのエントリポイント
- keymaps/my-package.json: パッケージのショートカットキーを定義 => 被ったりすると結構厄介
- menus/my-package.json: メニューバーやコンテキストメニュー（右クリックで表示するメニュー）の表示内容を定義

# 作るための豆知識

- エントリポイントに設定しているメインのスクリプト（lib/my-package.js）にconfigを定義することで、ユーザ設定が有効となる


# 参考記事

* [10分で学ぶ！Atomパッケージ自作入門](https://qiita.com/akisame338/items/034476debbd0ae251c0f)
* [Atom Documentation > Atom Flight Manual > Chapter 3: Hacking Atom > Package: Word Count](http://flight-manual.atom.io/hacking-atom/sections/package-word-count/)
* [Atomパッケージを作ってみよう - Technology of DeNA](https://engineer.dena.jp/2016/12/dena-engineer-advent-calendar-2016-2-atom-package.html)
* [自作のAtomパッケージでユーザー設定を有効にする | 開発 / note.nkmk.me](https://note.nkmk.me/dev-atom-package-user-setting/)
* [Atom Documentation > Essential Classes: Config](https://atom.io/docs/api/v1.23.1/Config)
* [Atom Documentation > Essential Classes: NotificationManager](https://atom.io/docs/api/v1.23.1/NotificationManager)
* [Atomのコード読みまくったので、git-grepの結果へジャンプできる拡張を作ってみた](http://mizchi.hatenablog.com/entry/2014/05/11/102450)

# ToDo

- [ ] とりあえず簡単なやつ作ってみる
- [ ] 任意のline-numberに飛んでみる
- [ ] 検索の結果をatomに渡す
- [ ] 検索の結果の行ナンバーを渡す
- [ ] 検索結果部分を選択して表示させる
Hanamiで使用するテンプレートエンジンを変更する

`hanami`で使用するテンプレートエンジンを`slim`に変更する方法のメモ。


※ `slim`以外でも、[こちら](http://hanamirb.org/guides/1.1/views/templates/)に記載されているものであれば同じ方法で変更できるかと思います。

# バージョン

- Hanami 1.1.0

# プロジェクトを新規作成するとき

`hanami new`コマンドを実行する際に、`--template=slim`オプションを追加します。

```
$ hanami new [project_name] --template=slim
```

上記のオプションを付与すると、予め`gem 'slim'`が記述された`Gemfile`が作成されます。
また、デフォルトのテンプレートエンジン（`hanami generate`で作成されるテンプレートファイル）が`slim`になります。


# プロジェクト作成後に変更するとき

`Gemfile`に下記を追加し、`bundle install`すれば使えるようになります。

```ruby:Gemfile
gem 'slim'
```

デフォルトのテンプレートエンジンを`slim`に変更するには、`.hanamirc`の`template=erb`を`template=slim`に変更します。

```diff:.hanamirc
-template=erb
+template=slim
```
nvidia-docker2にしたらnvidia-docker-composeが使えなくなった

自分用のメモです

docker環境を更新したら、
https://github.com/eywalker/nvidia-docker-compose/issues/22
これと同じように、

```bash:

urllib.error.URLError: <urlopen error [Errno 111] Connection refused>
```

とか言われちゃった人に

nvidia-docker2の更新が大分前なので今更感がありますが、自分が詰まったのでメモとして残します

# tl;dr

nvidia-docker-composeは使わない
docker-composeのデフォルトランタイムを以下のようにして変更して使う

```json:/etc/docker/daemon.json

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": [ ]
        }
    }
}
```

参考: https://github.com/eywalker/nvidia-docker-compose/issues/23

# 症状

nvidia-docker-composeを使用したところ、

```bash:

urllib.error.URLError: <urlopen error [Errno 111] Connection refused>
```

と言われる。
docker、nvidia-docker、docker-compose、nvidia-docker-composeの再インストールやアップデートを試してみてもきちんと改善されない。

```bash

nvidia-docker run --rm nvidia/cuda nvidia-smi
```

はきちんと起動する。

# 原因

原因はnvidia-docker2になって、nvidia-docker-pulgin( https://github.com/NVIDIA/nvidia-docker/wiki/nvidia-docker-plugin )が削除された(?)こと。これにより起動しているはずのdocker daemonにアクセスすることができなくなっていた。
nvidia-dockerではこれまでlocalhost:3476にデーモンが走っているはずだった。cudaがインストールされていない環境でも一切の変更なしにコンテナが立ち上がるために大きな実装の変更があったようだ

# 対策

実はnvidia-docker-composeのページ( https://github.com/eywalker/nvidia-docker-compose )にすべて記載されている。nvidia-docker-composeはもう必要なくなり、docker-composeのデフォルトのランタイムを変更してしまえばいいようだ( https://github.com/eywalker/nvidia-docker-compose/issues/23 )。

# その他

初投稿です。
ローカル環境では成功するビルドが Netlify ではコケる時に、Netlify の Node の Version が古いことに気付き、これもうちょっと良いやつにしたなぁ…と思った人向けの記事


ローカル環境では成功するビルドが Netlify ではコケる時に、Netlify の Node の Version が古いことに気付き、これもうちょっと良いやつにしたなぁ…と思った人は、
次のコマンドを叩くと良いです。

````
$ node -v  > .nvmrc
````

.nvmrc が出来るので add して push して終わり
raspi zero w 初期設定 (備忘録)

あくまで自分用なので余裕ができたら詳しく解説しようと思います.
# raspi zero w の初期設定
- ユーザパスワードの変更
- host nameの変更
- キーボードレイアウトの変更
- sshの有効
 - 有効にする前に色々とセキュリティ面を考慮する必要あり
- rasbianのアップデート

#####上記は全て**raspi-config**にて設定


#参考
- https://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573
- http://blue-black.ink/?page_id=1788
ProcessingでTwitter Streaming API

# TwitterのStreaming API を Processing から使う

[サンプルコード](https://github.com/progfay/Twitter_StreamingAPI)

## Status

[Status - twitter4j](http://twitter4j.org/javadoc/twitter4j/Status.html)

## User

[User - twitter4j](http://twitter4j.org/javadoc/twitter4j/User.html)

- `status.getUser()` から取得可能


## StatusListener

[StatusListener - twitter4j](http://twitter4j.org/javadoc/twitter4j/StatusListener.html)

- `onStatus(Status status)` … 検索文字列を含むツイートの投稿を検出された際に実行される
カスタムのadbコマンドを追加する

# はじめに
Android開発をしていると、よく画面のスクリーンショットを撮ったり、アプリの挙動を録画したい事があります。今までは、適当な場所に`adb-screen-shot.sh`や`adb-record.sh`を置いて、パスを通して、`adb-screen-shot.sh`、`adb-record.sh`という風に使っていました。
これを`adb snap`でスクリーンショットを撮ったり、`adb record`で画面を録画できたらいいなと思いました。


# 方法
~/.zshrcを編集します。

```shell
vim ~/.zshrc
```

↓を追加します。

```sh
adb() {
    if [[ $@ == "snap" ]]; then
        command /your/path/to/adb-screenshot.sh
    elif [[ $@ == "record" ]]; then
        command /your/path/to/adb-screen-record.sh
    else
        command adb "$@"
    fi
}
```

これで、`adb snap`でスクリーンショットを撮ったり、 `adb record`で画面を録画したりできます。
javascript encodeURIComponentのハイフンと波ダッシュ文字化け問題の回避策

#事件は現場(ブラウザ側)でおきる
Android版Chromeでbase64変換を行ってCGIにデータ送信を行っていたところ、登録されている文字列に「?(3F)」が混じっていた。
PHP側の問題かはたまたMariaDB側の問題かと調査していたところ、Javascriptの問題だと判明したのだった。

#ハイフンと波ダッシュ問題とは
shift_jisとUnicodeの変換テーブルに一部文字が定義されていないため不可逆な変換を起こす厄介な問題。
Unicodeコンソーシアム-Shift-JIS to Unicode
ftp://ftp.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFTJIS.TXT

|文字|UTF-16|UTF-8|依存OS|SJIS (unicode.org)|
|---|------|------|----|----|
|−|2212|E28892|BSD/Linux|817C|
|－|FF0D|EFBC8D|Windows|未定義|
|〜|301C|E3809C|BSD/Linux|8160|
|～|FF5E|EFBD9E|Windows|未定義|
「ハイフンと波ダッシュ問題」は専らSJISベースのPHPやPerlなどCGI側の問題だと思っていたけど、UTF-16なJavascriptでも発生するもようだ。

今回の件はAndroidでのみ発生？

|文字|UTF-16|UTF-8|encodeURIComponent()|
|---|------|------|----|
|−|2212|E28892|%3F|
|－|FF0D|EFBC8D|%EF%BC%8D|
|〜|301C|E3809C|%3F|
|～|FF5E|EFBD9E|%EF%BD%9E|

#犯人と解決策
Android上の日本語入力は「記号」に表示されている「～」や「－」が問題の文字コードのものを使っている場合がある。(IMEによって異なるかもしれない)

[MDN-Base64 encoding and decoding](https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding)
こちらのbase64エンコーダを使うと、**encodeURIComponent()**がそれらの文字を真っ先に「?(3F)」に変換してしまい、化けた状態でbase64化してしまうので、予め駄目な文字を変換してあげると幸せになる。

```javascript:修正前
function b64EncodeUnicode(str) {
    // first we use encodeURIComponent to get percent-encoded UTF-8,
    // then we convert the percent encodings into raw bytes which
    // can be fed into btoa.
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
        function toSolidBytes(match, p1) {
            return String.fromCharCode('0x' + p1);
    }));
}
```

```javascript:修正後
function b64EncodeUnicode(str) {
    // first we use encodeURIComponent to get percent-encoded UTF-8,
    // then we convert the percent encodings into raw bytes which
    // can be fed into btoa.
    str = str.replace(/\u301c/g, '\uff5e')
            .replace(/\u2212/g, '\uff0d');
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
        function toSolidBytes(match, p1) {
            return String.fromCharCode('0x' + p1);
    }));
}
```

#その他参考にさせていただいたサイト
[波ダッシュ、全角チルダ問題まとめ](https://qiita.com/kasei-san/items/3ce2249f0a1c1af1cbd2)
[ASH-Unicode対応 文字コード表](http://ash.jp/code/unitbl21.htm)
[fudist-Shift_JISのダメ文字](https://sites.google.com/site/fudist/Home/grep/sjis-damemoji-jp)
[UNIRITA-Oracleデータベースで、波ダッシュの文字化けはなぜ起きるのか？](http://www.unirita.co.jp/blog/data-utilization/data-linkage/20141021.html)
新卒１年目エンジニアがFLOCSSと出会った話

# FLOCSSとは
CSS設計思想の一つで、他にはOOCSSやSMACSSなどがあり、これらに加えてBEMなどの要素を取り込んでいることが特徴です。
FLOCSSに限った話ではないのですが、設計に記述ルールを設けることでコードの保守性が高くなったり、他人にわかりやすくなったりといろいろメリットがあります。

# FLOCSSを使うことになった経緯
新卒でWebのフロントエンジニアとしてCSSを触るようになり、最初は簡単なページのサイトのコーディングからはじめました。ページが出来上がっていくに連れてどんどん装飾されていくのがとても面白かったんですが、それと同時に要素同士で干渉したりCSSで打ち消さなければいけないことが増えたりととってもカオスな状態にぶち当たったからです。そんな中CSSをググっていると「CSS設計」というものを知り、設計について勉強することにしました。

CSS設計思想ってなんやねん！という状態の僕が描く混沌としたコードに「秩序」ができました。
めでたし、めでたし！（当然まだ終わらない）

数ある中でもFLOCSSを選んだ理由は
・当時部品系とレイアウトのスタイルの区別が出来ていなくて、どう区別すればいいかわからなかった
・Componentの考え方はあったのでOOCSSがとっつき易かったが、それ以外の秩序がなかったから
・~~「FLOCSS」という名前がかっこよかったから~~

# FLOCSSの特徴
## ディレクトリ構造
ディレクトリ内容を以下に示します。

```
    foundation/
    layout/
    object/
        ├─ component/
        ├─ project/
        └─ utility/
```

## Foundation
リセットCSSやノーマライズCSSのような、ブラウザのデフォルトスタイルを初期化するための記述場所。いろんな種類・流派があるみたいなので「リセットCSS」などでググってみると自分にあったものが見つかると思います。

## Layout
コンテンツの大部分を構成するようなページ内で単一の存在となるスタイルの格納場所。mainの領域やheader・footerなどを宣言します。先頭に「.l-〇〇」をつけますが、idで指定することもあります。
>例： l-header, l-footer　など


## Object
OOCSSのコンセプトが元になっていて、主にページ内でビジュアル部分を担当しています。Objectは役割別に分割されたComponent、Project、Utilityを内包しています。

## Component
このレイヤーはプロジェクト内で複数回使われる部品（Component）のことで、OOCSSでいう構造の部分を担っています。固有の値を持つことはせず、再利用できるようにします。「.c-〇〇」のプレフィックスをつける。
>例： c-btn, c-label,　c-grid　など

## Project
プロジェクト内で使い回すスタイルですが、Componentと違うのはそのプロジェクト固有であることが異なっているところです。「.p-〇〇」のプレフィックスをつける。
> 例： p-menuList, p-placeBox など

## Utility
汎用クラスのことで、基本的に単一の機能をもち!importantをつけることが一般的です。「.u-〇〇」のプレフィックスをつける。

> 例： u-db, u-taC など

##FLOCSSでよかったこと
・コンポーネントの構造と装飾が分割されていて再利用しやすい
・全体のレイアウトに関するスタイルがあるので、マークアップの構造がわかりやすくなる
・明確な命名規則やプレフィックスがあることによってエディタが予測して該当するクラス名を提示してくれるのでコーディングが楽になる。
・ユーティリティ最高

# まとめ
FLOCSSはOOCSSとSMACSS、BEMの影響を受けているのでコンポーネントの管理からレイアウトの指定までトータルに出来るのが、いいなと思っています。
今回CSSアーキテクチャの一つとしてFLOCSSを紹介しましたが、たくさんあるので最初はどれから始めればいいかわからないこともあると思います。僕もその一人なんですが、どれにするかはおいといて「とりあえずやってみる」ことが大事だと思ってます。やってみるとこの設計思想が向いているパターンやその思想で対応仕切れないことが見えてくると思うので、サンプルでもいいので何かの思想に基づいて作ってみるといいと思います。

拙い記事ではありますが、ここまで読んでいただきありがとうございます！

# （追記）これからやりたいこと
最近はAtomic DesignやReact.jsに興味があるのでその方向で何か作ってみようと思ってます。
Ankoでのid設定

# 目的
Ankoでidを設定する方法をまとめる

# 背景
JavaでAndroidアプリ開発中のレイアウト作成にXMLを用いている場合が多いと思います。
しかし、Kotlinで開発する場合は[Anko](https://github.com/Kotlin/anko)というUI構築のためのDSLが使えます。
ちなみに、このAnkoは[Jetbrains](https://www.jetbrains.com)製です。
そしてこのAnkoを使う際にXMLのようにidを設定してコードでfindしたりsetOnClickListenerしたりすると思います。
(AnkoでonClickの処理とかも書けますが...)
でも何も考えずAnkoでXMLのようにidを設定しようとするとエラーが吐かれます。
XMLのように新しくidを追加するときに一工夫必要。
そしてAnkoのid設定について書かれている記事があまりなかった(特に日本語)のでここにまとめようと思いました。

# (何もしない状態での)現実
![image.png](https://qiita-image-store.s3.amazonaws.com/0/134733/f2f30b04-8d0e-7319-a703-10c5af770e59.png)

エラー吐かれまくり(´・ω・｀)

# (この記事に書いてあることをした)現実
![image.png](https://qiita-image-store.s3.amazonaws.com/0/134733/94671fa1-1385-c594-d361-6928f3bff27c.png)

やった(´・ω・｀)

# 確認環境
- AndroidStudio 3.1 Canary 8
- Kotlin 1.2.10
- Anko 0.10.3
- macOS High Sierra 10.13.2

古すぎたりしなければバージョンの違いは特に関係ないと思います。

# 設定方法
方法は3つくらいあります。

## 設定方法1：idを設定しない
idを設定しなければidの設定で困ることはないという極論

ごめんなさい、何も解決していません。

## 設定方法2：idに任意の数値をセットする
そもそもこのidがIntを求めているのでそのままInt型の任意の数値を渡せてあげれば動きます。

だからAndroidアプリを開発する際に、
1はActivity1のEditTextで、2はActivity2のEditTextで...みたいな感じでどこかにメモを残しておきながらやるとなんとかなります。
実際にやるときは10*はEditTextで20*はButtonでみたいな感じで分けると分かりやすくなりそうです。

でもこんな方法、、、僕は嫌だ！

## 設定方法3：values/ids.xmlを用意してidの名前を登録する
この方法が一番理想的だと思います。
Androidビューでプロジェクトを見たときにres/values下に「New」→「Values resource file」で名前をids.xmlにして作成します。
そこに下記のように設定することで新規idを追加できます。
`type="id"`は固定で`name=""`の部分に任意の文字列をセットすればその名前のidを生成できます。

```xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="Hoge" type="id"/>
</resources>
```

これでAnkoでid追加をするときに `R.id.Hoge` とすることで呼び出せるようになります。
補完もちゃんと出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/134733/97864a05-b329-aef0-7586-acf7ff9f96da.png)

# 最後に
この方法が見つからなくて一時期Anko使わないでおこうと思ったくらいなので、Ankoを諦めていたけどこの記事を見てもう一度やってみようと思ってくれる人が一人でもいれば幸いです。
他にもこんな方法がある等あれば教えて欲しいです！
Kotlin楽しい。

# 参考元
https://academy.realm.io/posts/getting-started-with-kotlin-and-anko/
Railsで定数を参照するときは完全修飾名を使った方が良い

# 発端
とある機能を開発していたところ、以下のエラーが出てwebsocketサーバーが起動しなくなりました。  

```ruby
NameError: uninitialized constant Concerns::XXXable
```

エラーの発生箇所は、とあるController内の `include Concerns::XXXable` でした。  
`Concerns::XXXable` 自体は定義してあり、そのあたりの修正もしていなかったため困惑しましたが、どうやら調べていくと[querly](https://github.com/soutaro/querly)というgemをインストールしてから発生していることがわかりました。  
なぜgemをインストールしただけでエラーが発生するようになったか、調査に結構時間がかかったので原因と対策をまとめました。

# 結論

## 原因: gem内でトップレベルにConcernsというnamespaceが切られていたこと

ざっくり説明すると、querly内のトップレベルのnamespaceに[Concerns](https://github.com/soutaro/querly/blob/v0.8.1/lib/querly/concerns/backtrace_formatter.rb)というnamespaceが切られていたため、その中で `Concerns::XXXable` を探そうとして、上記エラーが発生していました。  

**※すでに当該コードは下記PRで修正されています。**

[https://github.com/soutaro/querly/pull/34:embed:cite]

## 対策: 定数を参照するときは完全修飾名を使うようにする

標題の通り、 `Site::Concerns::XXXable` のように完全修飾名を使うことで予期せぬバグは発生しなくなります。  
そもそも `Concerns::Site::XXXable` の方が良くないか？っていう話はいったん置いておきます。

# 詳しい原因

原因を詳しく説明すると、こんな感じです。  

うちのアプリのwebsocketサーバーは、起動時に `Rails.application.eager_load!` を実行していました。  
Rails.application.egaer_load!を実行すると

1. autoload_pathsを先頭から探索
2. const_missingが発生したmoduleからトップレベルの名前空間につくまで順に親を探索

の順に定数を探索しにいきます。

querlyをインストールしていない状態で `include Concerns::XXXable` をしているControllerを読み込むと

1. Concernsが見つからない
2. autload_pathsを探索してもConcerns::XXXableが見つからない
3. 上記Controller内から順に親namespaceを探索し、Site::Concerns::XXXableが見つかる

という風にちゃんと読み込めます。  

一方、querlyをインストールしている状態で `include Concerns::XXXable` をしているControllerを読み込むと
Rails起動時にquerlyが読み込まれquerlyのConcernsが読み込まれてしまうため、
上記2の段階でquerlyのConcernsを参照してしまい、定数が見つからないというエラーが発生していました。

（全然わかりやすく説明できない...）

トップレベルにConcernsみたいなnamespaceが切られているgemをインストールしていなくても、`Concerns::XXXable` を読み込みにいく前に自分でConcerns(Rails標準のapp/controller/concernsなど)を読み込んでしまうと同様のエラーがおきました。 

# まとめ 
定数を参照するときは完全修飾名を使うようにしよう！という話でした。  
説明がぜんぜんうまくできませんでした...！
個人開発ならHerokuよりDokkuを使おう

皆さん個人開発してますか？
個人開発の時にせっかく作ったならリリースして誰かに見てもらいたい・使ってもらいたいですよね。でもあまりお金はかけられない。
静的サイトなら`github.io`や`firebase hosting`がありますが、Webアプリケーションだと使えません。

ちょっと前まではHerokuがデファクトな選択肢でしたが、スリープしたりで不便だったりします。

そんな方に[Dokku](https://github.com/dokku/dokku)がオススメです。
DokkuはOSSのPaaSで、シェルスクリプトを実行するだけでインストールができるHerokuライクなアプリケーションです。

自分は[Vultr](https://www.vultr.com/)という激安VPSにインストールしています。

## 実際どうなのか？
インストール方法や基本操作等は以下が参考になるので割愛します。
- [Getting Started with Dokku](http://dokku.viewdocs.io/dokku/getting-started/installation/)
- [DockerでミニHeroku！「Dokku」をさくらのクラウドで試す](https://knowledge.sakura.ad.jp/2356/)

使ってみた感覚としては、個人開発やステージング環境なら全然使えるものだと感じました。
DBがプラグインじゃないと使えなかったり(だいたいベータ)、CUIクライアントが微妙でたまにリモートホストにSSHしてコマンド叩いたりといった部分もあります。

しかし自分のドメインを設定できるのでサブドメイン生成でわかりやすいURLになったり、アプリケーションのスケールやDockerfileでのデプロイにも対応しています。

## 便利ポイント
Dokkuの一押しポイントが、[dokku-letsencrypt](https://github.com/dokku/dokku-letsencrypt)プラグインです。
`dokku config:set --global DOKKU_LETSENCRYPT_EMAIL=your@email.tld`
`dokku letsencrypt myapp`
の二行のコマンドでアプリケーションのHTTPS化ができます。

コミュニティプラグインでは、Slack通知やWeb Hookプラグインもあるので他のサービスとの連携もできます。

公開鍵を登録すれば自分以外のユーザーも追加することができるので、ステージング環境などに活用できると思います。

## まとめ
OSSのPaaSは[Cloud Foundry](https://www.cloudfoundry.org/)が有名ですが、DokkuはWebフロントエンドが無く機能も絞られている分インストールが簡単ですぐに動かすことができます。

個人開発では、アプリケーション開発以外のところでつまずいたりしてサービス公開まで行かずに萎えたりするのでDokkuで超高速サービスデプロイをしていきましょう。
SAP Cloud PlatformでFioriアプリ開発(アプリ開発編)

#**はじめに**
SAP Cloud Platform（SAP CP）のトライアルシリーズです。

以下のSAPブログの記事を参考にFioriアプリの開発を行います。

[SAPクラウド演習1. ノンプログラミングでアプリを作ってみよう！Part 1](https://blogs.sap.com/?p=121240)
[SAPクラウド演習1. ノンプログラミングでアプリを作ってみよう！Part 2](https://blogs.sap.com/?p=121327)

今回は上記リンクのPart２(アプリ開発編)について。

Part１(環境設定編)の実施結果については[こちら](https://qiita.com/mahko2/items/a2702f5c00c8770f18ee)を参照。


この記事は2015年2月時点の情報のため、
記事との差分を中心に記述します(2018年1月時点)。

#**手順**
*※ここからは、参照元の記事の項番とリンクした内容で記載します*

##**[Part2](https://blogs.sap.com/?p=121327)**
####**1. OData の確認**

http://services.odata.org のリンク先はこんな感じ↓
![スクリーンショット (447).png](https://qiita-image-store.s3.amazonaws.com/0/22526/34b7567e-569c-50d5-572b-df002b34ce52.png)

####**2. アプリ開発（ノンプログラミング）**
テンプレート選択の画面は、「All Categories」を選択すると「SAP Fiori Master-Detail Application」が選択できます

![スクリーンショット (453)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/60bff5fb-96c9-dd2b-2b72-784bfa226f4c.jpeg)

Data Connection 画面でエラー発生
![スクリーンショット (469)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/504f97a2-ce98-c8f5-3b92-b0c722e76e39.jpeg)

version3がサポートされていないようです。
[The Data Services Request version '3.0' is not supported in Fiori Application](https://stackoverflow.com/questions/41804433/the-data-services-request-version-3-0-is-not-supported-in-fiori-application)

これで正しいのかは怪しいですが、version2を指定してみました
記事：/V3/OData/OData.svc/
今回：/V2/OData/OData.svc/

![スクリーンショット (470)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/65d5c963-16b7-f471-2c52-287d8b088a44.jpeg)

設定画面の項目が記事とは異なりますが、Finishまで進めていきます
![スクリーンショット (471).png](https://qiita-image-store.s3.amazonaws.com/0/22526/dfa25cbc-c1e7-26e3-c6e0-3ea1b2ee77af.png)

![スクリーンショット (472).png](https://qiita-image-store.s3.amazonaws.com/0/22526/6e6300a2-1a2c-d5db-c441-2448735c0c25.png)

![スクリーンショット (473).png](https://qiita-image-store.s3.amazonaws.com/0/22526/1b23b264-f144-10ab-8884-6c31cd73993a.png)


####**3. テスト**
ファイルが生成されています。
![スクリーンショット (474).png](https://qiita-image-store.s3.amazonaws.com/0/22526/29c8b45e-d625-aa49-3513-5c6c122e7e7c.png)

実行するとFiori画面が出力されました。
![スクリーンショット (475).png](https://qiita-image-store.s3.amazonaws.com/0/22526/aa253cda-94a4-1bdb-6a0f-29359807d7f5.png)


####**4. 画面拡張（オプション）**
####**4. アプリをクラウドで公開**
*※項番4が重複していますが、リンク元にそろえておきます*

項目追加は行いませんでしたが、追加は可能なようです。
![スクリーンショット (477)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/6d542e06-6b79-09c5-1dea-7534f118dd15.jpeg)


####**5. デモ**
スマホから確認
![IMG_6577.PNG](https://qiita-image-store.s3.amazonaws.com/0/22526/e21bb707-f616-8ad0-8f3e-295e39f0fea7.png)


#**まとめ**
ODataのバージョン違いがあったため、記事とは異なる結果となりましたが、Fioriアプリの開発は可能でした。
項目追加もできそうなので、検証に利用できそうです。
SDKとAPIについて

#SDKとAPIの違いについて
データ連携の際にSDKとAPIについて触れる機会があったのでその違いについてのメモ
厳密ではないです。ふわっとしてます。
Javaを自分がやってたのでJava視点で見ます

##まずは。
APIとSDKは**全然違うもの**です。
自分も調べていくうちにSDKとAPIの関係性とか調べ始めて何が何だか分かんなくなった。

##SDK
SDKはソフトウェア開発キット（Software Development kit）でJavaのみんなが使えるクラスみたいなもの。（APIとか言われてるけど今回は混乱するのでクラスで行きます。厳密ではないです。すいません）
↓こんなやつよね
<img width="965" alt="Date__Java_Platform_SE_7__.png" src="https://qiita-image-store.s3.amazonaws.com/0/178136/b83451b2-a1fe-a93b-9abd-2bf35dea57d4.png">
https://docs.oracle.com/javase/jp/7/api/

##API
APIはApplication Programing Interfaceの略でつまりは**通信（HTTPとか）のルール**。
「特定のURL送ると特定のデータ返しますぜ」ってやつ。
例)HTTP1.0では
`GET ファイル名 HTTP/1.0(改行)(改行)`
という形でWebサーバーに送ればWebページの情報が取れますよと。

##なんでAPIとSDKが混乱するのか
サービスによってはAPIやSDKを公開しているところがある。
もう一度言っておくとSDKはあくまで**クラス**でAPIは**ルール**。

だからそのサービスの情報を取りたかったらAPI（ルール・URL）で取ればいい。
でも、そのAPIを書くのって大変。
**そこで企業側でAPIを簡単にしてくれるクラスを作ったよ＝SDK**

だからSDKはJava自体にも備わっているクラス（JavaでいうAPI。上のAPIとは違うよ）と同じで会社独自で作ったやつ。それを使うとクラスのメソッドの中に定義されているAPI（URL）が動きますよ。

**SDKを使ってAPIを送ってますよ。SDKもAPIもやってることは同じですよ。SDKなら簡単にできますよ**
やってることが同じだから混乱するのか。
自動裁定取引アプリ「Bit Arbitrager(ver. 2.1)」がリリース！

#Bit Arbitrager について
Bit Arbitragerはビットコインの自動裁定取引を誰でも簡単にする事が出来るようにしたアプリです。
基本的な機能の説明は [**こちら**](https://qiita.com/bit_arbitrager/items/5bf219bece76dd3c4cab) から！

#主な新機能

主な新機能を雑な写真とともに解説していきます。

#### - 操作画面の一新
![IMG_3143.JPG](https://qiita-image-store.s3.amazonaws.com/0/227601/82d45dcb-ba63-0441-b28f-efccf75b08e5.jpeg)

テストモードと本番モードのページを融合させ、配置を少し変えました。


#### - 反対売買基準の抜本的な見直し
前バージョンまでは資産を各取引所にバランス良く分配しておく必要がありましたが、この見直しによって、大きなズレにも対応できるようになりました。


#### - 取引に使いたくない資産を設定可能に。
![IMG_3145.JPG](https://qiita-image-store.s3.amazonaws.com/0/227601/841744de-6f91-5b1c-e1d1-31fd5c31aa01.jpeg)
画像左側にある「使わないJPY」「使わないBTC」に値を設定する事で、その分が取引に使われないようになります。


#### - 設定値が確実に損になる組み合わせだと警告を出す機能を追加
![IMG_3148.JPG](https://qiita-image-store.s3.amazonaws.com/0/227601/37b3c996-40a8-2ac5-1cfe-8a83fd4fb21a.jpeg)
画像のように、損になる可能性のある設定をした場合に警告を出すようになります。


#### - 設定値の説明文を補足
![IMG_3144.JPG](https://qiita-image-store.s3.amazonaws.com/0/227601/220ac186-3f23-51d7-b6ce-3280fe24772c.jpeg)
自動裁定取引の損益は、設定値によって大きく左右されます。その設定値の意味の理解を深めて頂くために、説明文を補足しました。画像のように、左側で見ている項目の説明が右側に表示されます。


以上です。
よりアプリを快適に利用して頂くためにアップデートを重ねていく予定ですので、応援よろしくお願いします！
[**ダウンロード**](https://www.app-kobo.com/post/%E8%87%AA%E5%8B%95%E8%A3%81%E5%AE%9A%E5%8F%96%E5%BC%95%E3%82%A2%E3%83%97%E3%83%AA%E3%80%8Cbit-arbitrager%E3%80%8D%E6%9B%B4%E6%96%B0%E5%B1%A5%E6%AD%B4%E3%83%9A%E3%83%BC%E3%82%B8) ← クリックしてダウンロードページへ！