OmniAICreator/Qiita-1.07M huggingface dataset:
SolidityのMapping nullの扱いについて

## 問題
Solidityでnullは使えないらしい。
mappingの「指定されたkeyに対して、何も登録されていない」や「key自体が存在しない」という条件を作る時に困った。


##解決方法
**状態変数の初期値**を利用する。
初期値は型によって異なる。それぞれ、以下のようになっている。


|    型   |       初期値 |
|:-----------------:|:------------------:|
| uint             |             0 |
| string          |            "" |
| address             |              0x0 |
| bytes               |                0x |


例えば、uint型の状態変数を使うのであれば、
uint型の変数==0
を確認すれば良い。






以下、試しにuint型の状態変数==0 を使って、mappingが空の時とそうじゃないときで分岐を作ってみる。




```solidity:zombie.sol

pragma solidity ^0.4.13;

contract ZombieContract{


    struct Zombie {
        uint zombieId;
        string zombieName;
    }
    
    mapping (address => Zombie) addressToZombie;
    

    function setZombie(uint _zombieId, string _zombieName) {
        addressToZombie[msg.sender].zombieId = _zombieId;
        addressToZombie[msg.sender].zombieName = _zombieName;
    }

    
    function getZombie() constant returns (uint, string) {
        //mappingに登録されている場合
        if (addressToZombie[msg.sender].zombieId != 0){
            return (addressToZombie[msg.sender].zombieId, addressToZombie[msg.sender].zombieName);
        } else{
　　　 　　　　　　　　　　　//mappingが空の場合
            return(111, "you don have Zombie");
        }
        
    }

}

```



###実行結果 

setZomibe(1, "myZombie")を実行後にgetZombie()を実行した場合



```
{
	"0": "uint256: 1",
	"1": "string: myZombie"
}

```



mappingが空の時に、getZombie()を実行した場合

```
{
	"0": "uint256: 111",
	"1": "string: you don have Zombie"
}

```


条件分岐できた。



参考
https://forum.ethereum.org/discussion/7313/check-null-values-in-map-solidity
【React Router】画面遷移時に#を用いて特定の要素に移動させる方法

## はじめに

React Routerで#をうまく使いこなしたい！という人に向けた記事です。
例えば、アンカータグで#を使う場面として、画面遷移時に特定の要素(例: fugaページのidがpiyoの要素)に移動させたい！という時が考えられます。そんな時は以下のように記述すると上手くいきますよね。

```hoge.html
<a href="/fuga#piyo"> fugaページのidがpiyoの要素に移動</a>
```

```fuga.html
<div id="piyo">piyo</div>
```

このように書くと、fugaページ内のidがpiyoの要素が一番上にくるように画面遷移するのは周知の事実だと思います。

今回、React Routerで同じ動きをするために、安直に以下のように記述してみましたが、上手くいきませんでした。

```hoge.jsx
import {Link} from 'react-router-dom';

省略

<Link to="/fuga#piyo">
	fugaページのidがpiyoの要素に移動できない例
</Link>
```

これだとfugaページに遷移するだけで、idがpiyoの要素には移動しません。<a href="https://github.com/ReactTraining/react-router/issues/394">react-routerのGitHubのissue</a>でもこの問題は議論されていたようですね。

## react-router-hash-link

画面遷移と同時にどうしてもidがpiyoの要素に移動させたい。そんな時は<a href="https://github.com/rafrex/react-router-hash-link">react-router-hash-link</a>が便利です。
最初に以下のコマンドでreact-router-hash-linkをインストールします。

```react-router-hash-linkをインストール
yarn add react-router-hash-link
```

以下のデモページで挙動を確認することができます。
http://react-router-hash-link.rafrex.com/

`react-router-hash-link`の`<HashLink>`を利用すれば上記の問題は解決します。以下のように実装すればOKです。

```hoge.jsx
import {HashLink} from 'react-router-hash-link';

省略

<HashLink to="/fuga#piyo">
	fugaページのidがpiyoの要素に移動できる例
</HashLink>
```

このように、`react-router-hash-link`の`<HashLink>`を用いれば簡単に`<a href="/fuga#piyo">`のような実装ができます。

他にも同様のライブラリがあるみたいです。
https://github.com/1000ch/react-router-hashlink/blob/master/src/index.js
こちらも試したいと思っています。

## 最後に

React Routerはまだまだ未完成の部分が多いですね。積極的にライブラリを探すか又はライブラリを作成していきたいと思います。
少しでも役に立ったという方は`いいね`お願いします（^人^）
【Xcode】ボタンの同時タップを禁止する方法

## isExclusiveTouchで同時タップを禁止

`UIButton` を同時にタップすると思わぬ不具合が発生する場合があります。

それを防止するために、UIButtonの同時タップを禁止する[isExclusiveTouch](https://developer.apple.com/documentation/uikit/uiview/1622453-exclusivetouch "isExclusiveTouch")という設定があります。 `exclusive` は `排他的な` という意味なので、`isExclusiveTouch` は`タップを排他的にする設定` という意味です（デフォルトは `false` です）。

下記のプログラムのように、同時タップしてほしくないボタンの `isExclusiveTouch` を `true` にすると、ボタンの同時タップができなくなるので安心です。

```Swift
 buttonA.isExclusiveTouch = true
 buttonB.isExclusiveTouch = true
```

## Outlet Collectionでほぼ自動

しかし、ボタンが増えると、すべてのボタンに `isExclusiveTouch` を設定するのは大変です。そんなときに便利なのが `Outlet Collection` です。

`Outlet Collection` をつくる方法は簡単です。

通常の `Outlet` をつくるように、controlキーを押しながらボタンをクリックして、ストーリーボードからソースファイルにぐいっとドラッグします。するとポップアップ画面が表示されるので、 `connection` を `Outlet Collection` に変更して `name` に名前を入力して、 `connect` ボタンをクリックします。

<img width="1440" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/91127b88-5eda-2185-7ba4-40b3e85a2348.png">


あとは、 `Outlet Collection` に追加したいボタンをcontrolキーを押しながらクリックして、さきほど作成した `Outlet Collection` のところまでドラッグします。そうすると、ひとつの `Outlet Collection` に複数のボタンが登録されます。

<img width="1512" alt="02.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/d9149be8-15c2-6b1d-eb02-c6accde96144.png">


ソースファイルでは、 `Outlet Collection` は下記のようになります。

```Swift
@IBOutlet var exclusiveButtons: [UIButton]!
```

`UIButton` の部分が `[UIButton]` になっているところからわかるように、 `Outlet Collection` はアウトレットの配列です。配列であれば `for-in` がつかえるので、下記のようなコードでいっきに `isExclusiveTouch`を `true` に変更できます。

```Swift
        for button in exclusiveButtons {
            button.isExclusiveTouch = true
        }
```

<img width="1512" alt="03.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/096288af-c79e-acbe-4e74-f3f253a77cbe.png">

`viewDidLoad` などで上の処理を実行すれば、 `Outlet Collection` に追加しているボタンの同時タップを禁止することができます。

## デフォルト設定すれば全自動

**[shtnkgm](https://qiita.com/shtnkgm "shtnkgm")さんにコメントをいただいて追記しました。ありがとうございます！**

以下のように書くと `UIButton` 全体にデフォルト値として適用が可能だそうです。つぎに紹介する `exclusiveAllTouches` メソッドも便利ですが、たとえば `viewDidLoad` よりあとに動的に追加されたボタンへも反映できるそうです。

なにこれ素敵！

```Swift
UIButton.appearance().isExclusiveTouch = true
```


## 再帰メソッドをつかえば全自動

`Outlet Collection` も便利ですが、ボタンを追加したときに設定し忘れるかもしれません。そんなときに便利な方法をこちらの記事で紹介していました。

[UIButtonなどの同時タップを禁止する再帰メソッド](https://qiita.com/YusukeHosonuma/items/8d5ed9fa4bd4fd172bf2 "UIButtonなどの同時タップを禁止する再帰メソッド")

`viewDidLoad` などで `exclusiveAllTouches` メソッドを呼び出せば、再帰的にすべてのボタンを検索して `isExclusiveTouch` を `true` にしてくれます。とてもいいですね。

```Swift
 extension UIViewController {
 
     func exclusiveAllTouches() {
         self.applyAllViews { $0.isExclusiveTouch = true }
     }
 
     func applyAllViews(apply: (UIView) -> ()) {
         apply(self.view)
         self.applyAllSubviews(self.view, apply: apply)
     }
 
     private func applyAllSubviews(view: UIView, apply: (UIView) -> ()) {
         let subviews = view.subviews as [UIView]
         subviews.map { (view: UIView) -> () in // Swiftのmapって戻り値なくても大丈夫なのね（ちょっと不気味
             apply(view)
             self.applyAllSubviews(view, apply: apply)
         }
     }
 }
```
puma-devでlocalhostでの開発を楽にする

# 開発時にlocalhostの管理は煩雑になる問題

railsの開発時や、最近ではReactJsでの開発時などでも開発用サーバーを立ち上げて開発することが多くなりました。そのたびにlocalhost:8080や、localhost:4200、localhost:3000...もうどれがどれだかわかりません！

そんな悩みを解決するのが、puma-dev です。

# [Puma-dev](https://github.com/puma/puma-dev)

ざっくりとしたイメージとしては、`***.dev`といったURLを作成し、httpまたはhttpsにて任意のホストへプロキシしてくれるようなものです。よくIoT開発で使われる[beebotte](https://beebotte.com/)や[ngrok](https://ngrok.com/)とは違い外部へpublishするものではありません。

# インストール

macであればbrewでかんたんにインストールできます

```
brew install puma/puma/puma-dev
```

# puma-devの実行

```
puma-dev -install
```

これだけです。これによって、ポート80と443が開きます。もちろん、すでに80や443が開いている場合は止めておいてください。

# puma-devの停止

```
puma-dev -stop
```

止めたくなったら -stop をつけて停止させます。

# 証明書のインストール

SSLでの接続を行う場合は、証明書をインストールする必要があります。

```:Macの場合
open /Users/<UserName>/Library/Application\ Support/io.puma.dev/cert.pem
```

証明書をインストールしようとすると確認画面が表示されるので、必ず <span style="color:red;">**ログインではなくシステム(重要)**</span> にインストールしてください。その後、再起動させます。

# `***.dev` を作る

## IPが異なる場合

```
echo 192.168.1.2:8080 > ~/.puma-dev/hoge
```

--> http://hoge.dev と https://hoge.dev に即時アクセスできる

## IPがlocalhostの場合

```
echo 127.0.0.1:8080 > ~/.puma-dev/hoge
```

--> http://hoge.dev と https://hoge.dev に即時アクセスできる

# トラブルシュート
* SSL証明書エラーがでる
    * 再起動していない
    * 証明書がシステムにインストールされていない
    * 証明書が「常に信頼」になっていない
* ブラウザを再起動させたのに表示されない
    * マシン本体を再起動していない
* puma-devがインストールできない
    * 他のプロセスで80や443が使われている(sudo lsof -i:80, sudo lsof -i:443 で確認)
* brewがないと言われる
    * [Homebrew — macOS 用パッケージマネージャー](https://brew.sh/index_ja.html "Homebrew — macOS 用パッケージマネージャー")

# 参考

- [puma &amp; puma-dev にRails開発環境をより良く。pow代替＆簡単・安全・安定 - Qiita](https://qiita.com/cyborg__ninja/items/7bfbc9e9f1669e3eed02 "puma &amp; puma-dev にRails開発環境をより良く。pow代替＆簡単・安全・安定 - Qiita")
- [puma-devを使ってRailsの開発サーバーをhttps対応にする - Qiita](https://qiita.com/pi_chan/items/6860b2520ed1089e7741)
- [puma/puma-dev: A tool to manage rack apps in development with puma](https://github.com/puma/puma-dev "puma/puma-dev: A tool to manage rack apps in development with puma")
- [macOS Sierra no longer trusts the puma-dev certificate · Issue #84 · puma/puma-dev](https://github.com/puma/puma-dev/issues/84#issuecomment-252339375 "macOS Sierra no longer trusts the puma-dev certificate · Issue #84 · puma/puma-dev")
俺のグラフィカルキャラクターユーザーインターフェース(GCUI)だZAW🐘

# Zaw

まずZawは知っての通りzshで選択肢を絞り込んでいくためのツールだ。
Zawを乱用することでCUIを限りなくGUIにしていくことができる。
そうすればGUIの脳みそがとろけるような（思考コスト控えめ）インターフェースと
CUIのキャラクターベースだからこその柔軟性を合わせた最強の環境となる。

---

# 俺のZaw🐘紹介

---

## Package Manager

brew, brew-cask, masコマンドと連携して
MacにCUIアプリ、GUIアプリ（App Store含む）をインストールしたり、
gemやpipコマンドとも連携してrubyやpythonのライブラリやツールも管理する。

https://github.com/GeneralD/zaw-src-package-managers

---

#### Homebrew, Cask, Mac App Store

![apps.gif](https://qiita-image-store.s3.amazonaws.com/0/14940/1cc9f10c-466c-5303-a5e5-2be0be5434ba.gif)

---

#### Ruby Gem

![gem.gif](https://qiita-image-store.s3.amazonaws.com/0/14940/5328c471-ecdc-7ed3-6d28-45d88ae32802.gif)


---

#### Python PyPI

![pip.gif](https://qiita-image-store.s3.amazonaws.com/0/14940/b65cf846-576a-989d-7c96-85335b8fb3bd.gif)

---

## Unity Launcher

Zawを使ってUnityのバージョンインストールと起動をする。
UnrealのEpic Game Launcherなるものに感化されて、これをUnityにもと思い作った。

https://github.com/GeneralD/zaw-src-unity-launcher

---

#### Unity Installer, Unity Launcher

![unity.gif](https://qiita-image-store.s3.amazonaws.com/0/14940/164c3dca-445f-2f25-8d3d-f52bb8a23b92.gif)

---

## Git
gitのリポジトリ管理もZawで行なっている。

- [ベアリポジトリを扱うzaw-ghq](https://github.com/GeneralD/zaw-src-ghq)

- [自分のGithubリポジトリを一覧、クローンするzaw-github](https://github.com/GeneralD/zaw-src-github)

- [github内でスターをつけたものを一覧、クローンするzaw-github-starred](https://github.com/GeneralD/zaw-src-github)

- [自分のBitbucketのリポジトリを一覧、クローンするzaw-bitbucket](https://github.com/GeneralD/zaw-src-bitbucket)

を紹介する。

---

#### GHQ

![ghq.gif](https://qiita-image-store.s3.amazonaws.com/0/14940/df9c219d-c35d-6e01-7ce1-ac6e645b4ff5.gif)

---

#### Github

![github.gif](https://qiita-image-store.s3.amazonaws.com/0/14940/40e217c9-67df-a17f-f5d4-c3a8ade31de2.gif)

---

#### Github Starred

![ghs.gif](https://qiita-image-store.s3.amazonaws.com/0/14940/226fc98d-450d-756e-14cc-35f358a74628.gif)

---

#### Bitbucket

![bitbucket.gif](https://qiita-image-store.s3.amazonaws.com/0/14940/9886f39b-666a-6f8f-8bac-51f1e0266df7.gif)

---

## Nerd Font

CUIをGUI化するにはNerd-Fontの力を借りることがある。
ちなみにこれまで紹介してきたZawはNerd-Font系を利用していないと正しく表示されない。
そんなNerd-Fontのアスキーコードを探すときに使うZawを紹介。

https://github.com/GeneralD/zaw-src-nerd-icon

---

#### Nerd-Font

![nerdfont.gif](https://qiita-image-store.s3.amazonaws.com/0/14940/e178fb37-f365-4fb2-4587-d47c0e9c6ef0.gif)

---

# 終わりに

いかがだっただろうか？
もしあなたがCUI操作が苦手だったとしたら、なおさら使ってみてほしい。
CUIに対する考え方が変わるかも知れないからだ。

まだまだZawには有用なプラグインが少ないので、これを機に自分にとって必要な拡張を作ってみてはどうだろうか？
webpackでYAMLをloadする

# やること

YAMLで記述して、変数として読み込む

# 手順

[yaml-loader](https://www.npmjs.com/package/yaml-loader)を使う。

```bash
$ yarn add yaml-loader
# $ npm i -S yaml-loader
```

READMEにかかれているconfigは古いので以下のようにconfigのrulesに追加する。

```js
{
  test: /\.(yml|yaml)$/,
  use: [
    {
      loader: require.resolve('json-loader')
    },
    {
      loader: require.resolve('yaml-loader')
    }
  ]
}
```

requireする。

```js
const contents = require('./contents.yml')
```
Laravel Homesteadの日本時間設定をする


アプリでJSTの場合。
MySQLなんかもデフォルトだとシステムのタイムゾーンに依存しているので、Carbonを使わなくてもDBをJSTに統一する場合は設定をした方がいいかも。

[Carbon](https://github.com/briannesbitt/carbon)はphpのdatetimeのラッパーですが、アプリ側でtimestampを押す時や、現在時刻との比較など便利です。

それはある日、tinkerでCarbonを使ってみた時。

```
>>> Carbon\Carbon::now()
=> Carbon\Carbon @1517950563 {#836
     date: 2018-02-07 05:56:03.330975 Asia/Tokyo (+09:00),
   }
```

よくよくみたら一週間くらいズレているやんけ！(2018-02-15 確認)

右のAsia/Tokyoはアプリ側(config/app.php)なんですが、Homestead側がダメっぽいです。

Homestead環境だとNTPサーバが正しく設定されてないようです。

```bash

$ date
Tue Feb  6 20:57:59 UTC 2018
```

## localtime設定

ジャポンにする。

```
$ sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime
```
## NTP設定

ジパングにする。

```
$ sudo ntpdate -v ntp.nict.jp
The program 'ntpdate' is currently not installed. You can install it by typing:
sudo apt install ntpdate
```

初期装備だとntpdateが入っていないらしい。

```
$ sudo apt install ntpdate
```


```
$ sudo ntpdate -v ntp.nict.jp
15 Feb 13:12:57 ntpdate[3191]: no servers can be used, exiting
```

exitingがexistingに空目するし、excitingにも見える。
なんか直ってたっぽい。


```
$ date
Thu Feb 15 13:13:08 JST 2018
```

tinkerで確認する。

```
>>> Carbon\Carbon::now()
=> Carbon\Carbon @1518671225 {#814
     date: 2018-02-15 14:07:05.316495 Asia/Tokyo (+09:00),
   }
```

ひとあんしん。

Eloquentで取ってくるレコードも変わってくるので重要。
アプリ周りのエラーにつながるのでHomestead初期装備のままだとあかんということか。
ggplotで平行座標、散布図行列を描く

#はじめに
データの可視化について
* 平行座標プロット
* 散布図行列  
が便利だよ、ということなので使ってみる。

##平衡座標プロット
キモはID列をつくって、groupで行ごとにプロットさせることらしい。
また、必要に応じて変数を正規化する。

```r:parallel_plot.r
library("tidyverse")

ggplot(iris %>% 
         sample_n(15) %>% #数が多いので一部のみ抽出
         mutate(ID = 1:n()) %>% #ID割り振り
         mutate_if(is.numeric,scale) %>%  #正規化
        gather(key,value,c(1,1:4)), #long styleに変換
        aes(key,value,group=ID,colour=Species))+ 
    geom_line() +
    geom_point(size=2,shape=1) #軸との交点を見やすくするオプション
```
![parallel.jpeg](https://qiita-image-store.s3.amazonaws.com/0/80212/c5c83483-9209-4d94-99fa-826133aa5fa8.jpeg)

##散布図行列
GGallayを使って一発

```r:scatter_plot_matrix.r
library("ggplot2")
library("GGally")

ggpairs(iris,aes_string(colour="Species")
```
![sanpu.jpeg](https://qiita-image-store.s3.amazonaws.com/0/80212/30340e1f-dc9a-127c-4244-7b4343ccb162.jpeg)

##参考サイト
・[ 統計はデータと人間のインターフェース ~統計数理研究所 中野純司先生インタビュー〜]
(http://www.datascientist.or.jp/dssjournal/2016/10/24/interview_08/)
・[How to plot parallel coordinates with multiple categorical variables in R]
(https://stackoverflow.com/questions/44351127/how-to-plot-parallel-coordinates-with-multiple-categorical-variables-in-r)
・[【Rメモ】多変数の関係性を視覚化する関数（パッケージ）まとめ]
(https://qiita.com/h_kobayashi1125/items/46bc28a26f888d03cee3)
「Jupyter Notebookを用いた文芸的インフラ運用のススメ」を docker-compose で試す

# 目的

国立情報学研究所(NII)の Jupyter Notebookを用いた文芸的インフラ運用のススメを試してみるために、NII の公開している Docker コンテナをお手軽に起動する。
また、個人的にちょっと使いにくく感じている部分を修正する。

参考: [Jupyter notebook を用いた文芸的インフラ運用のススメ](https://www.slideshare.net/nobu758/jupyter-notebook-63167604) 

# 作業端末
ここからの作業は、以下の環境を想定する。
作業端末では以下のツールが動作する。
* docker サーバー
* docker-compose
* jupyter notebook 接続用のWeb ブラウザー
* openssl    

# 必要なファイルの作成

参参考: [jupyter-for-infrastructure](https://github.com/yacchin1205/jupyter-for-infrastructure)

この作業は作業端末のdockerユーザーで行う。

## 作業ディレクトリの作成
```
LC_DIR=/opt/docker/jupyter-LC
sudo mkdir -p ${LC_DIR}/{conf,notebooks,notebooks/.ansible}
cd ${LC_DIR}
```

## Ansible の設定

Ansible の設定ファイルを作成する。
ここでは最低限の設定を行っているので [ここ](http://docs.ansible.com/ansible/intro_configuration.html)を参考に
必要に応じて変更する。

```
cat <<EOF |sudo tee ${LC_DIR}/conf/ansible.cfg
[defaults]
forks = 3
remote_user = ansible
private_key_file = /notebooks/.ansible/ansible_id_ed25519
ansible_ssh_user = ansible
inventory = /notebooks/.ansible/inventory
EOF
```

## Inventory ファイルの作成

Ansible の対象サーバーを指定する inventory ファイルの雛形を作成しておく。

```
echo "[TARGETS]" | sudo tee ${LC_DIR}/notebooks/.ansible/inventory
```

## 公開鍵の生成

Ansible の ssh 接続で利用する公開鍵を作成する。

```
sudo ssh-keygen -f ${LC_DIR}/notebooks/.ansible/ansible_id_ed25519 -t ed25519 -N ""
```

## Jupyter Notebook の設定

Jupyter-LC の設定のままではパスワードを平文で記述する必要があるため、パスワードをハッシュで渡せるように変更する。

```
cat <<EOF |sudo tee ${LC_DIR}/conf/jupyter_notebook_config.py
import os
c.NotebookApp.ip = '*'
c.MultiKernelManager.kernel_manager_class = 'lc_wrapper.LCWrapperKernelManager'
c.KernelManager.shutdown_wait_time = 10.0

if 'PASSWORD' in os.environ:
    c.NotebookApp.password = os.environ['PASSWORD']
EOF
```

## docker-composeの設定

Jupyter-LC 用の docker-compose.yml を作成する。

```
cat <<EOF |sudo tee ${LC_DIR}/docker-compose.yml
version: '2'
services:
  notebook:
    image: niicloudoperation/notebook
    environment:
      TZ: Asia/Tokyo
    ports:
      - 127.0.0.1:8888:8888
    volumes:
      - ./notebooks:/notebooks
      - ./conf/jupyter_notebook_config.py:/home/bit_kun/.jupyter/jupyter_notebook_config.py
      - ./conf/ansible.cfg:/etc/ansible/ansible.cfg
    environment:
      - PASSWORD=sha1:3703d242f3a6:04ef6e0984039af6fc1d9ec054e583898cedd500
    restart: always
EOF
```

## 権限の設定

[Jupyter-LC_dockerのDockerfile](https://github.com/NII-cloud-operation/Jupyter-LC_docker/blob/master/Dockerfile)では
uid=1000 gid=100 となっているので、ディレクトリの所有者とグループを設定する。

```
sudo chown 1000:100 -R $LC_DIR
```

## Jupyter Notebook コンテナの起動

ここまでの作業でコンテナを起動する準備が整ったので、docker-compose で起動する。

```
cd $LC_DIR
docker-compose up -d
```

jupyter notebook コンテナの起動後は、Webブラウザでhttp://localhost:8888/ を開く。
上記の設定例ではパスワードを聞かれたら「PASSWORD」と入力する。

# おまけ

パスワードのハッシュ値は Jupyter Notebook のセルに次のように記述して実行すれば得られる。
この値を docker-compose ファイルの PASSWORD に設定して、コンテナを再起動する。

```
from notebook.auth import passwd
print(passwd())
```
Swift4でデバイス判断(iPadなの？iPhoneなの？どっちがタイプよ？

UIDeviceクラスのUIUserInterfaceIdiomを使って判別します。
・UIDevice
https://developer.apple.com/documentation/uikit/uidevice#//apple_ref/c/tdef/UIUserInterfaceIdiom
・UIUserInterfaceIdiom
https://developer.apple.com/documentation/uikit/uiuserinterfaceidiom

```swift
if UIDevice.current.userInterfaceIdiom == .phone {
    print("iPhone")
} else if UIDevice.current.userInterfaceIdiom == .pad {
    print("iPad")
} else {
    print("もしかしてAppleTV？CarPlay?")
}
```
Tableauのバックグラウンドに、日本の航空写真や白地図を表示する。

#はじめに
Tableauの地図に、いろいろな地図を表示してみました。
[地理院地図](https://maps.gsi.go.jp/development/ichiran.html)の地図を使いました。ありがとうございます。

#環境
- Tableau Desktop 10.5 Windows 日本語 で確認

#手順
- tmsファイルを作成する
[ナレッジベース](http://kb.tableau.com/articles/howto/creating-a-custom-map-connection?lang=ja-jp)のとおりに、tmsファイルを作成する
（注）Tableauとしては、テストもサポートも行わないそうです。
サーバのurlは、[地理院地図のサイト](https://maps.gsi.go.jp/development/ichiran.html)を参考にします。
portは、httpは80、httpsは443です。

- 作成したtmsファイルを、マップソースフォルダに配置する
Windows版では以下のディレクトリでした。
C:\Users\\<ユーザ>\Documents\マイ Tableau リポジトリ\マップ ソース

- Tableau Desktopを起動する
- [マップ] > [バックグラウンド マップ] から、作成したtmsファイルを選択する

##今回作成したtmsの一部
###基本的な地図
```xml
<?xml version="1.0" encoding="utf-8"?>
<mapsource inline="true" version="8.1">
<connection class="OpenStreetMap" port="443" server="https://cyberjapandata.gsi.go.jp" url-format="/xyz/pale/{Z}/{X}/{Y}.png" />
<layers>
<layer display-name='Base' name='base' show-ui='false' type='features' request-string='/' />
</layers>
</mapsource>
```

###白地図のtms
```xml
<?xml version="1.0" encoding="utf-8"?>
<mapsource inline="true" version="8.1">
<connection class="OpenStreetMap" port="443" server="https://cyberjapandata.gsi.go.jp" url-format="/xyz/blank/{Z}/{X}/{Y}.png" />
<layers>
<layer display-name='Base' name='base' show-ui='false' type='features' request-string='/' />
</layers>
</mapsource>
```
###航空写真のtms
```xml
<?xml version="1.0" encoding="utf-8"?>
<mapsource inline="true" version="8.1">
<connection class="OpenStreetMap" port="443" server="https://cyberjapandata.gsi.go.jp" url-format="/xyz/seamlessphoto/{Z}/{X}/{Y}.jpg" />
<layers>
<layer display-name='Base' name='base' show-ui='false' type='features' request-string='/' />
</layers>
</mapsource>
```
##このような感じになりました。

![map2.png](https://qiita-image-store.s3.amazonaws.com/0/155165/e6ef49a3-0724-3535-2687-f58751568e56.png)

![map1.png](https://qiita-image-store.s3.amazonaws.com/0/155165/57296c39-0037-a005-1de3-3b2c58f801f4.png)

##少しはまった点
- {z}{x}{y}が、国土地理院では小文字ですが、tmsでは大文字にする必要がありました。
OpenLayersだと小文字のままで良かったため、少しはまりました。

#終わりに
BIなので、肝心なのはデータ分析ですね・・・
CentOS6.9 vsftpdの設定ではまったのでメモ

※SELinuxの無効化を前提

以下のURLを参考にvsftpdをインストール
https://www.server-world.info/query?os=CentOS_6&p=ftp

yum -y install vsftpd
vi /etc/vsftpd/vsftpd.conf
\================================================
/etc/vsftpd/vsftpd.conf
\# 12行目：匿名ログイン禁止
anonymous_enable=NO
\# 81,82行目：コメント解除 ( アスキーモードでの転送を許可 )
ascii_upload_enable=YES
ascii_download_enable=YES
\# 96,97行目：コメント解除 ( chroot有効 )
chroot_local_user=YES
chroot_list_enable=YES
\# 99行目：コメント解除 ( chroot リストファイル指定 )
chroot_list_file=/etc/vsftpd/chroot_list
\# 105行目：コメント解除 ( ディレクトリごと一括での転送有効 )
ls_recurse_enable=YES
\# 最終行へ追記
\# ルートディレクトリ指定 (指定しない場合はホームディレクトリがルートディレクトリとなる)
local_root=public_html
\# ローカルタイムを使う
use_localtime=YES
\================================================
\# /etc/rc.d/init.d/vsftpd start 
Starting vsftpd for vsftpd: [  OK  ]
\# chkconfig vsftpd on

vi /etc/vsftpd/vsftpd.conf
\# 最終行に追記：PASVポートを固定
pasv_enable=YES
pasv_min_port=21000
pasv_max_port=21010
\# /etc/init.d/vsftpd restart 
\# iptables -I INPUT 5 -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT 
\# iptables -I INPUT 5 -p tcp -m state --state NEW -m tcp --dport 21000:21010 -j ACCEPT 

\#ftpusersからrootを除外
vi /etc/vsftpd/ftpusers
\================================================
\# root
\================================================

\#vsftpdを再起動
\# /etc/init.d/vsftpd restart
特定バケットの読み取り権限のみを与えるIAMポリシーを作りたい

S3の決められたバケットのみ読み込めるIAMユーザが必要になったので、ポリシーを作った。

```json:s3-my-bucket-ro.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::my-bucket"
        }
    ]
}
```

与える権限は以下の３つで良さそう:

- GetObject
    - オブジェクトをダウンロードしたりできるやつ
    - リソース指定はオブジェクト単位
- ListBucket
    - 指定したリソースのオブジェクトを読み込めるやつ
    - リソース指定はバケット単位

これを権限の通った場所から投げればOK

```shell
PROFILE=default
POLICY=s3-my-bucket-ro
aws --profile ${PROFILE} iam create-policy \
  --policy-name ${POLICY} \
  --policy-document file://${POLICY}.json
```
Cordovaのチュートリアルをやってみる 第十一回

# 使用したもの(環境)
 1. cordova
 1. visualStudioCode
 1. windows10
 1. Android
 

---

# チュートリアルを訳しながらやってみる
チュートリアルのページは下記。

[Module 12: Using the Location API](http://ccoenraets.github.io/cordova-tutorial/hardware-acceleration.html)

前回のチュートリアル。

[Cordovaのチュートリアルをやってみる 第十回](https://qiita.com/tokky_se/items/8b4b7b9530501a364a3a)

環境構築については別途まとめてあるので下記参照。

[cordova&VSCodeで環境を構築するまでの右往左往メモ。](https://qiita.com/tokky_se/items/346429d234c91bece11d)

---


# Module 12: Using the Location API
ロケーションAPIの利用

In this section, we add the ability to tag an employee with his/her location information.   
このセクションでは、従業員の位置情報をタグ付けする機能追加します。

In this sample application, we display the raw information (longitude/latitude) in an alert.   
このサンプルアプリケーションでは、生の情報(緯度/経度)をアラートで表示します。

In a real-life application, we would typically save the location in the database as part of the employee information and show it on a map.
実際のアプリケーションでは、通常、従業員情報の一部としてデータベース内の位置情報を保存し、マップ上で表示します。

以下のコードはデバイス上でCordovaアプリケーションとしてアプリケーションを実行する際に機能します。
また、ページがhttp://プロトコルで提供されている場合は、Desktop上のChromeで同機能が提供されます。
Firefoxの場合、プロトコルにかかわらず提供されます。

1\. geolocatonプラグインをプロジェクトに追加します。

```console 
cordova plugin add cordova-plugin-geolocation
```

2\. index.htmlのemployee-tplテンプレートに下記を追加します。

```html 
<li class="table-view-cell media">
  <a hre="#" class="push-right add-location-btn">
      <span class="media-object pull-left"></span>
      <div class="media-body">
          Add location
      </div>
  </a>
</li>
```

3\. EmployeeViewのinitializeメソッドでAdd Locationのクリックイベントを登録します。

```js 
this.$el.on('click', '.add-location-btn', this.addLocation);
```

4\. EmployeeViewにaddLocation event handlerを定義します。

```js 
this.addLocation = function(event) {
  event.preventDefault();
  navigator.geolocation.getCurrentPosition(
      function(position) {
          alert(position.coords.latitude + ',' + position.coords.longitude);
      },
      function() {
          alert('Error getting location');
      });
  return false;
};
```

5\. アプリケーションをテストします。  
位置情報をマスクした画像貼ってもあんまり意味ないので画像は割愛。
ちなみに、ChromeでもFireFoxでもfile:///からのアクセスで動作しました。


---

# 参考URL

[Module 12: Using the Location API](http://ccoenraets.github.io/cordova-tutorial/hardware-acceleration.html)

[Cordovaのチュートリアルをやってみる 第十回](https://qiita.com/tokky_se/items/8b4b7b9530501a364a3a)

[cordova&VSCodeで環境を構築するまでの右往左往メモ。](https://qiita.com/tokky_se/items/346429d234c91bece11d)
オリジナルの型定義ファイルの置き方

## 手順

1. 適当に型定義ファイルをおく
    - 今回はtsconfig.jsonからみて `app/assets/javascripts/types/custom/index.d.ts`という場所に型定義ファイルを追加した
    -  `app/assets/javascripts/types/index.d.ts`のように、types直下に型定義ファイルをおくと下記設定ではresolveできないので注意
1. `tsconfig.json`の`compilerOptions.typeRoots`を編集する
1. おわり

```javascript:tsconfig.json
{
  "compilerOptions": {
    // "traceResolution": true,      // 各種名前解決の様子をログに残してくれる. 様子を追うときに利用した
    "typeRoots": [
      "node_modules/@types",         // デフォルトではここだけ読む.忘れず書き添える
      "app/assets/javascripts/types" // ここを読むように変更
    ]
  },
}
```



これだけで(グローバルに使いたい)オリジナルの型定義を一箇所にまとめて書けるようになった.

```typescript:app/assets/javascripts/types/index.d.ts
declare var gon: any
type id = string | number
```

みたいなものを書いておける。

## 疑問
しかしこのことを調べると、`typeRoots`ではなく`baseUrl`, `paths`を使うみたいな記述が多く、その使い分けをちょっとよく分かっていない。
STFで端末が認識されないときの対処

## 環境

**STF:** v3.2.0 をちょっとカスタマイズしてビルドしたもの
**OS:** Mac OSX 10.9.5

## 状況

認識されなかったのは [DIGNO®︎ E](http://www.kyocera.co.jp/prdct/telecom/consumer/lineup/503kc/)。
STFのログに何も出てこないので、そもそも認識されてないぽい。
Consoleで `adb devices` `adb shell` などするときちんと繋がるし、USBデバッグなどの設定も問題ないのに。
手元で再現確認すると

**認識されるけどすぐ通信が切れている**

```
IMP/device:plugins:service 11420 [DIGNO] Agent connection ended, attempting to relaunch
INF/provider 11411 [*] Lost device "DIGNO" (device)
INF/device:plugins:service 11420 [DIGNO] Launching service
INF/provider 11411 [*] Shutting down device worker "DIGNO"
IMP/device:plugins:service 11420 [DIGNO] Service connection ended, attempting to relaunch
INF/device:plugins:service 11420 [DIGNO] Launching service
INF/provider 11411 [*] Cleaning up device worker "DIGNO"
WRN/device:plugins:touch 11420 [DIGNO] Shell keeping minitouch running ended unexpectedly
INF/provider 11411 [*] Gracefully killing device worker "DIGNO"
INF/device:plugins:touch 11420 [DIGNO] Disconnecting from minitouch service
FTL/util:lifecycle 11420 [DIGNO] Forward shell ended; we shall share its fate
FTL/util:lifecycle 11420 [DIGNO] Shutting down due to fatal error
INF/provider 11411 [*] Device worker "DIGNO" has retired
```

**なんかWARNING出てる**

```
WRN/device:plugins:data 11540 [DIGNO] Unable to find device data { serial: 'DIGNO',
  platform: 'Android',
      略
     network: 'LTE' } }
```

て感じ。

## STF の Issue

ログの一部だったり "stf device not connect" などでぐぐると何件かIssueが出てきます。
回答としては

* USBケーブルはきちんとしたのを使って
* minicap (画面キャプチャしてるっぽい)が対応してない端末もあるよ
* public-ipオプションの使い方が正しくないかも

て感じ。
 
## 電源の問題…？

* adbコマンド単体なら使えるので、ケーブルが切れているわけではなかった
* 利用できるようになったので、minicapも一応動く様子
* public-ipも他の端末なら問題なく使えてるし、関係なさそう…

手元環境では一瞬認識されるところまではいったので、駄目元でACアダプタ付きのUSBハブ経由で端末を接続してみたところ、無事STFの画面から利用できるようになりました。
（しかしこれが効いたのかは不明ですが…）

## 本番環境で対処

1. ACアダプタ付きUSBハブで接続
2. STFを再起動
3. 端末が認識されたところで普通のUSBケーブルに差し替え
4. つながった！

ACアダプタ付きUSBハブは別途使うあてがあったので（差し替えてやっぱり認識されないようなら追加で買おうかと思っていましたが）上記で。

## まとめ

いまいちすっきりしませんね…。
他のKYOCERA端末もSTFと（minicapと…？）相性が悪いようなので、その度に上記対処をするのもなぁ…という感じです。せめてSTFの再起動が不要だと良いのですが。
チームの docker-compose.yml をローカルでだけ上書きしたい

というケースがあるかもしれません。
僕の場合は、検証のために一時的に環境変数を書き換えたい (AWS のクレデンシャルを変えたいとか) 場合などがありました。

Docker Compose はデフォルトでは、`docker-compose.yml` と `docker-compose.override.yml` という2つのファイルを読み込むようになっています。
ここでさらに `-f` オプションを使うと、任意の名前の Compose ファイルを読み込ませることが可能です。

- [Share Compose configurations between files and projects | Docker Documentation](https://docs.docker.com/compose/extends/#example-use-case)
- [サービスの拡張と Compose ファイル — Docker-docs-ja 17.06.Beta ドキュメント](http://docs.docker.jp/compose/extends.html)

これを使えば、ローカルでだけ設定を上書きすることができそうです。
ためしに任意の名前の Compose ファイルを作る方法で対応してみます。

```yaml

# docker-compose.yml

version: '2'
services:
  app:
    build: ./docker/app/
    environment:
      RAILS_ENV: development
      AWS_ACCESS_KEY_ID: xxxxx
      AWS_SECRET_ACCESS_KEY: xxxxx
# ...(以下省略)...
```

```yaml
# docker-compose.local.yml

services:
  app:
    environment:
      AWS_ACCESS_KEY_ID: yyyyy
      AWS_SECRET_ACCESS_KEY: yyyyy
```

AWS のクレデンシャルを上書きしてみました。
`-f` オプションをつけて docker-compose up すれば OK です。

```
$ docker-compose -f docker-compose.yml -f docker-compose.local.yml up -d
```

ただし、`ports` や `external_links` のような複数の値を持つ設定は両方の値を連結するため、上書きにはなりません。

- https://docs.docker.com/compose/extends/#adding-and-overriding-configuration

### おまけ: ローカル用の設定を Git に入れたくない場合

ローカル用の Compose ファイル名を決めておき .gitignore ファイルに入れておくのが良いですが、様々な理由により .gitignore ファイルに入れたくないケースがあるかもしれません。
その場合は .git/info/exclude ファイルに書くことができます。

- [Git - gitignore Documentation](https://git-scm.com/docs/gitignore)

ドキュメンテーションされているとおりですが、gitignore は以下のファイルから除外するファイル・ディレクトリを決定します。

- .gitignore ファイル
- .git/info/exclude ファイル
- `core.excludesFile` に定義されたファイル
	- `$ git config --get core.excludesFile` で確認できます。`~/.gitignore` とか `~/.gitignore_global` とかになっていることが多い気がします

ただし .git/info/exclude を使いすぎると「チームの中で自分の環境だけがおかしい」が起こりやすくなるので、なるべく使わないのが無難です。
Triangle

前回、**sortというジャンルと何の関係があるんだ？**という疑問がありましたが、本問はまさに sort 
の問題でした。

## [1st][a]

<table>
    <tr><th>Correctness</th><th>Performance</th><th>Task Score</th></tr>
    <tr>
        <td>100%</td>
        <td>100%</td>
        <td>100%</td>
    </tr>
</table>

```php:Triangle-1.php
function solution($A) {
    $ans = 0;
    $N = count($A);
    if($N < 3) { return 0; }

    rsort($A);

    for($i = 2; $i < $N; $i++) {
        if($A[$i-2] + $A[$i-1] > $A[$i]) {
            if($A[$i-1] + $A[$i] > $A[$i-2]) {
                if($A[$i] + $A[$i-2] > $A[$i-1]) {
                    $ans = 1;
                }
            }
        }
    }
    return $ans;
}
```

```php:TestTriangle-1.php
use PHPUnit\Framework\TestCase;
include 'Triangle-1.php';

define('MAX_LENGTH', 10);

class TriangleTest extends TestCase {

    public function testExpectOne_1() {
        $array = array(10, 2, 5, 1, 8, 20);
        $ans = solution($array);
        $this->assertEquals(1, $ans);
    }

    public function testExpectOne_2() {
        $array = array(10, 5, 8);
        $ans = solution($array);
        $this->assertEquals(1, $ans);
    }

    public function testExpectZero_1() {
        $array = array(10, 50, 5, 1);
        $ans = solution($array);
        $this->assertEquals(0, $ans);
    }

    public function testExpectZero_2() {
        $array = array(10, 50);
        $ans = solution($array);
        $this->assertEquals(0, $ans);
    }

    public function testRandomArray() {
        $key = 0;
        $array = array();
        for($i = 0; $i < MAX_LENGTH; $i++) {
            $array[] = mt_rand();
        }
        // ランダムにマイナス化
        for($i = 0; $i < MAX_LENGTH; $i++, $key = mt_rand(0, MAX_LENGTH-1)) {
            $array[$key] = -($array[$key]);
        }
        $ans = solution($array);
        $this->assertEquals(0, $ans);
    }
}
```

本問で肝要なのは、いかに `O(N * log(N))` の計算量で済ませるか。
単純に発想すれば、３重ループで解決できそうやけど、それでは `O(N^3)` なので、発想の転換が必要。

参考にしたのは、[このサイト][b]。答えの考え方が書いてあったから、これで答えが分かった。
辺 a, b, c があるとき、a + b > c, b + c > a, c + a > b をすべて満たすと三角形が成立する。
言い換えれば、ある３つの値が与えられたとき、その中の最大値が残りの２つの値の和より大きい場合、
三角形は成立し得ない。
例えば、10, 8, 20 という３つの値において、最大値である 20 は、残りの２つの値の和（10 + 8 = 18）
より大きい。これは、a + b > c を満たさない。ゆえに三角形は成立し得ない。

これを３つの値でなく、N個の値のときに適用する。
本問は、**「三角形を成立させる３辺は存在するか？存在すれば１、しなければ０を返せ」**
というだけで、**「その３辺はどれか答えよ。」**ではないので、成立条件を満たすか否かだけを
判定すればいいんです。（後者も簡単に実現できます。）

ゆえに、**降順に並べ、先頭から３つの値について、成立条件を満たすかを順次判定する**プログラムを
作成すれば良いわけです。

それが以下の部分です。

```php
    rsort($A);

    for($i = 2; $i < $N; $i++) {
        if($A[$i-2] + $A[$i-1] > $A[$i]) {
            if($A[$i-1] + $A[$i] > $A[$i-2]) {
                if($A[$i] + $A[$i-2] > $A[$i-1]) {
                    $ans = 1;
                }
            }
        }
    }
```

`rsort` はキーを振り直すので、元のキーは保持されません。

こんな感じでした。


閑話休題ですが、今回、テストプログラムを充実させました。
大した改変ではないですが、テストごとの成否が分かるようにしました。
あと、`testRandomArray()` だけは、よく失敗します。作ってから気づいたのですが、
`assertEquals(1, ...)`なんてよく言えたもんだ、と思いますね。ランダム値なので、結果予測不能で、
これをテストするなんてナンセンス。

<!-- 以下、参考 URL -->
[a]: https://app.codility.com/demo/results/trainingDJJ3JK-7MH/
[b]: https://qiita.com/juubee/items/c3a5bed8c1c564ce3709
クレジットカード決済プロセスのメモ

クレジットカードとかの決済トランザクションを扱う時に、どのデータがどういうデータなのか分からなくなってしまうので、整理のためメモ。
なんとなくまとめただけなので、間違ってたらごめんなさい。

## 決済のプロセス

1. オーソリゼーション
カード会員が加盟店で決済を行うこと。

2. クリアリング
加盟店がカードによる決済データをカード会社に送り、集計する。

3. セツルメント
クリアリングによってまとめた決済額をカード会社が加盟店へ支払う。

## 参考
- [カード決済業務のすべて_読書メモ](https://gist.github.com/gushernobindsme/9e80606cbf01117b143a7ae8d97c5483)
- [クレジットカード取引の決済の流れと国内外の機関について
](https://quick-1.net/%E3%82%AF%E3%83%AC%E3%82%B8%E3%83%83%E3%83%88%E3%82%AB%E3%83%BC%E3%83%89%E5%8F%96%E5%BC%95%E3%81%AE%E6%B1%BA%E6%B8%88/)
画像ファイルがHEIFやWebPかどうかをImageMagickに依存せずに判定する方法

# 要求
POSTでアップロードされた画像データのフォーマットをサーバサイド(Go言語)で判定していきたい。
一応ImageMagick の Go言語バインディングは存在するが、本番環境にImageMagickあまり入れたくない。
https://github.com/gographics/imagick

なので、それぞれの画像形式のバイナリフォーマットの仕様を見て、ヘッダ部分で特定可能な部分を泥臭く一致するかチェックして実装してみた。

# 結果
## WebP

[WebP Container Specification](https://developers.google.com/speed/webp/docs/riff_container)
-> 1-4バイト目が "RIFF", 9-12 "WEBP" のASCII文字列があればWebPとなす。

以下の様なコードにしました。

```golang
var (
	webpStartBytes = []byte{0x52, 0x49, 0x46, 0x46} // 'R' 'I' 'F' 'F'
	webpFormatChar = []byte{0x57, 0x45, 0x42, 0x50} // 'W' 'E' 'B' 'P'
)

func isWebp(imageBytes []byte) bool {
	if len(imageBytes) < 12 {
		return false
	}
	// 最初の4バイトをチェック
	if !simpleByteRangeEqual(imageBytes, webpStartBytes, len(webpStartBytes)) {
		return false
	}
	// 9から12バイトをチェック
	if !simpleByteRangeEqual(imageBytes[8:12], webpFormatChar, 4) {
		return false
	}
	return true
}

func simpleByteRangeEqual(bytes1, bytes2 []byte, checkLength int) bool {
	for index := 0; index < checkLength; index++ {
		if bytes1[index] != bytes2[index] {
			return false
		}
	}
	return true
}

```

## HEIF
自分がしょぼいのかどうもはっきりとしたヘッダ部分のフォーマットがわからなかった。
探した資料は以下。

- http://nokiatech.github.io/heif/
- http://phenix.int-evry.fr/jct/doc_end_user/current_document.php?id=10265
- https://mpeg.chiariglione.org/standards/mpeg-h/image-file-format
- https://mpeg.chiariglione.org/standards/mpeg-h
- https://mpeg.chiariglione.org/meetings/111

とりあえずすぐ実装したかったので、以下のサンプル画像を`hexdump -C`とバイナリエディタ[0xED](http://www.suavetech.com/0xed/)で眺めてみた。
http://nokiatech.github.io/heif/examples.html

hexdump の結果の一部。

```

00000000  00 00 00 1c 66 74 79 70  6d 69 66 31 00 00 00 00  |....ftypmif1....|
00000010  6d 69 66 31 68 65 69 63  68 65 76 63 00 00 01 31  |mif1heichevc...1|
00000020  6d 65 74 61 00 00 00 00  00 00 00 21 68 64 6c 72  |meta.......!hdlr|
00000030  00 00 00 00 00 00 00 00  70 69 63 74 00 00 00 00  |........pict....|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 0e 70 69 74  |.............pit|
00000050  6d 00 00 00 00 4e 21 00  00 00 22 69 6c 6f 63 00  |m....N!..."iloc.|
00000060  00 00 00 44 40 00 01 4e  21 00 00 00 00 01 55 00  |...D@..N!.....U.|
00000070  01 00 00 00 00 00 00 94  25 00 00 00 2f 69 69 6e  |........%.../iin|
00000080  66 02 00 00 00 00 00 00  01 00 00 00 1f 69 6e 66  |f............inf|
00000090  65 02 00 00 00 4e 21 00  00 68 76 63 31 48 45 56  |e....N!..hvc1HEV|
000000a0  43 20 49 6d 61 67 65 00  00 00 00 a5 69 70 72 70  |C Image.....iprp|

```

`mif1heichevc` とか `hvc1HEV Image` とか、フォーマットに関するヘッダぽいASCII文字列がいることがわかる。
一旦これをベタに一致するかどうかで判定してしまおう……

```golang
var heifHeaderChar = []byte{0x6d, 0x69, 0x66, 0x31, 0x68, 0x65, 0x69, 0x63, 0x68, 0x65, 0x76, 0x63} // "mif1heichevc"

func isHeif(imageBytes []byte) bool {
	// mif1heichevc in 17-28 byte
	if len(imageBytes) < 28 {
		return false
	}
	if simpleByteRangeEqual(imageBytes[16:28], heifHeaderChar, 12) {
		return true
	}
	return false
}
```

とりあえずこれで様子見ていて、問題あれば改善していく予定。
Linuxでネットワークインタフェースの活動状況を調べる by Golang

#/sys/class/net/eth0/statistics/
`/sys/class/net/eth0/statistics/`には各種のネットワークのカウンタがあります。

```
$ ls /sys/class/net/eth0/statistics/
collisions     rx_errors         rx_packets         tx_errors
multicast      rx_fifo_errors    tx_aborted_errors  tx_fifo_errors
rx_bytes       rx_frame_errors   tx_bytes           tx_heartbeat_errors
rx_compressed  rx_length_errors  tx_carrier_errors  tx_packets
rx_crc_errors  rx_missed_errors  tx_compressed      tx_window_errors
rx_dropped     rx_over_errors    tx_dropped
```

送信、受信の累計のバイト数もわかります。

```
$ cat /sys/class/net/eth0/statistics/rx_bytes 
42799020
$ cat /sys/class/net/eth0/statistics/tx_bytes 
732878
```
これを利用して、ネットワークインタフェースの活動状況をダンプするプログラムをgolangで書きました。

#Golangのサンプルプログラム

gistに貼りました。
https://gist.github.com/tetsu-koba/f298882cc0ded389d11d1f30e7a89726

```
$ go build
$ ./net_activity 
Usage: ./net_activity eth0
```
ネットワークインタフェース名を引数に指定して実行します。

```
$ ./net_activity eth0
t=1518663877, tx=12391555, rx=530245513, tx/s=0.0 KB/s, rx/s=1.9 KB/s
t=1518663879, tx=12391633, rx=530247972, tx/s=0.0 KB/s, rx/s=1.2 KB/s
t=1518663881, tx=12392447, rx=530254973, tx/s=0.4 KB/s, rx/s=3.4 KB/s
t=1518663883, tx=12392533, rx=530258811, tx/s=0.0 KB/s, rx/s=1.9 KB/s
t=1518663885, tx=12393015, rx=530261346, tx/s=0.2 KB/s, rx/s=1.2 KB/s
t=1518663887, tx=12393101, rx=530263002, tx/s=0.0 KB/s, rx/s=0.8 KB/s
t=1518663889, tx=12393101, rx=530267283, tx/s=0.0 KB/s, rx/s=2.1 KB/s
t=1518663891, tx=12393179, rx=530269833, tx/s=0.0 KB/s, rx/s=1.2 KB/s
^C
```

#これをNanoPi NEOで動かすには

以下のようにARM用にビルドするだけでNano Pi NEOで動きました。同じバイナリをラズパイでも動かすことができるはずです。

```
$ GOARCH=arm GOARM=7 go build
$ file ./net_activity
./net_activity: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped
```

#関連

[Golangで周期的に実行するときのパターン](https://qiita.com/tetsu_koba/items/1599408f537cb513b250)
curlで異なるFQDNにhttpsアクセスする方法

# やりたいこと
curlを使って、`test.example.com(10.0.0.2)` というサーバーに対して `https://www.example.com` 　としてアクセスしたい

# 回答 1

/etc/hostsかきかえる(よくある)

でも、書き換えたの忘れてあとでハマるのでオススメではないです。

# 回答 2

--resolve オプションを利用する。

例：
```
curl -H 'Host:www.example.com' --resolve 'www.excample.com:443:10.0.0.2'  https://www.example.com/
```

# 敗北した方法

ホストヘッダのみ書き換える
```
curl -H 'Host:www.example.com'  https://test.example.com/
```

バーチャルホストにアクセスする場合に有効ですが、HTTPの処理の前にTLSの処理があるので証明書不一致でエラーになります。
Gitで新規(Untracked)なファイルをadd patch(-p)する方法

表題の通りのことがしたい。っておもったんだが。

# はじめに
普通にやると以下のようになる。

```shell
$ git add -p someNewFile.txt
No changes.
```

# 解決方法
事前に `git add -N` しておくと良いらしい。

```shell
$ git add -N soneNewFile.txt
$ git add -p someNewFile.txt
```

ちなみに、1行に2つのオプションを繋げて指定してもうまくいかない。参考にした以下のStackOverflowの回答にあるように、事前にまとめて`git add -N .`しておいた方が使い勝手はいいかもしれない。

# `git add -N`とは

git-addのmanより引用。(読みやすいように多少整形)

>       -N, --intent-to-add
>           Record only the fact that the path will be added later.
>           An entry for the path is placed in the index with no content.
>           This is useful for, among other things,
>           showing the unstaged content of such files with git diff
>           and committing them with git commit -a.

つまり、gitの管理上にあるということにしておくオプションということみたい。ステージングの手前。
"Untracked files" から "Changes not staged for commit" になって、"new file"として扱われる。なので、diffなどをすることができるようになる。

元に戻したいときは `git reset`すれば元に戻る。


# 参考
https://stackoverflow.com/questions/14491727/git-add-patch-to-include-new-files
Goで環境変数を扱う - godotenv -> envconf

Goで環境変数を扱うのに [godotenv](https://github.com/joho/godotenv) を利用するのはよく拝見しますが、 [envconfig](https://github.com/kelseyhightower/envconfig) でもう少し使いやすくする方法を紹介します

## 準備

まずは以下をインストール

```
$ go get github.com/joho/godotenv
$ go get github.com/kelseyhightower/envconfig
```

## 使用例

```
env-sample
├── .env
├── env
│   ├── app.go
│   └── env.go
└── main.go

```

```
# .env
MY_NAME=hoge
```

```env/env.go
package env

import (
	"github.com/joho/godotenv"
	"github.com/kelseyhightower/envconfig"
)

func Load(filename ...string) error {
	return godotenv.Load(filename...)
}

func process(prefix string, spec interface{}) interface{} {
	if err := envconfig.Process(prefix, spec); err != nil {
		panic(err)
	}
	return spec
}
```

```env/app.go
package env

type envApp struct {
	Name string `default:"name"`
	PassWord string `default:"pass"`
}
var app *envApp

func App() *envApp {
	if app == nil {
		app = process("my", &envApp{}).(*envApp)
	}
	return app
}
```

```main.go
package main

import (
	"github.com/satooon/env-sample/env"
	"fmt"
)

func main() {
	if err := env.Load(); err != nil {
		panic(err)
	}
	fmt.Printf("%#v\n", env.App())
}
```

```
$ go run main.go
&env.envApp{Name:"hoge", PassWord:"pass"}
```

アノテーションでデフォルト値やRequired設定もできるので便利
WordpressでLaravelのBladeが使えるBladerunnerプラグインを使ってみる

## 利用のきっかけ
WordpressでLaravel Mix等を簡単に導入できる、Wordplateというボイラープレートがありお勧めプラグインとして、WordpressでLaravelのBladeが使えるBladerunnerというのが紹介されていたので試しに使ってみた。
[Wordplate Plugins](https://wordplate.github.io/docs/plugins)
[ekandreas/bladerunner](https://github.com/ekandreas/bladerunner)

issueを見るにsage9というボイラープレートの開発版時のBlade対応から必要な部分を持ってきたりしたものらしい
[sage9](https://roots.io/sage/)

## インストール
Bedrock等のComposer管理下のWordpress環境であれば、Composerでインストール可能。
composer.jsonの"type"が"wordpress-plugin"なので、プラグインの配置場所に配置してくれる。

```
composer require ekandreas/bladerunner
```

## 利用方法

テーマのルートディレクトリからみて、bladerunner関数でパスを指定してBladeテンプレートを読み込めば使える。
第2引数でビューにデータを渡すことも可能

index.php

```php
<?php
    bladerunner('views.index',["test"=>"abc"]);
```

views/index.blade.php

```php
<p>blade {{$test}}</p>
```

GitHubのReadmeのController exampleのように、コントローラを使うことも可能。クラスなので別のクラスを継承やトレイト利用などもできる

## 感想

WordpressでシンプルにLaravel Bladeを使えるので少しテストで使ってみる。
一例としてPHPの開始・終了タグを使うよりも多少シンプルに書ける。

```php
<body <?php body_class( $class ); ?>>
<body @php(body_class( $class ))>
```
digdagコマンドを準備する(Mac)

## 概要
digdagコマンドを使う事になったので、ローカル環境を整備する。

## Javaのインストール状況を確認する
digdagを使うにはjavaがインストールされていないとダメなようです。

下記のようなエラーが出る場合は、Javaのインストールが必要。

```sh:ターミナル
$ java -version
No Java runtime present, requesting install.
```

<img width="432" alt="java.png" src="https://qiita-image-store.s3.amazonaws.com/0/142279/954c514e-8730-b9b0-7ed6-f9dec2d8d8cb.png">

下記リンクから「jdk-8u161-macosx-x64.dmg」をダウンロードしてインストールする。
※ [Oracle JavaSDK 8](http://www.oracle.com/technetwork/java/javase/downloads/index.html)

```sh:ターミナル
$ java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
```

## digdagコマンドインストール

```sh:ターミナル
$ curl -o ~/bin/digdag --create-dirs -L "https://dl.digdag.io/digdag-latest"
$ chmod +x ~/bin/digdag
$ echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
```

コマンドの存在確認

```sh:ターミナル
$ which digdag
/Users/hoge/bin/digdag
```

バージョン確認

```sh:ターミナル
$ digdag --version
0.9.24
```

## 参考サイト
- [Digdag Docs - Getting started](http://docs.digdag.io/getting_started.html)
- [Digdagの導入手順](http://morizyun.github.io/digdag/installation.html)
- [Re:dash のPostgreSQL へ CSVファイルを Digdag * Embulk 経由で登録する](https://qiita.com/tbuchi888/items/558360806e5461243aaa)
Laravel Migration コマンドまとめ


マイグレーション実行

````
$ php artisan migrate
````


マイグレーション実行(対話OFF)

````
$ php artisan migrate --force
````

直前に実行したひとまとまりのマイグレーションをロールバック

````
$ php artisan migrate:rollback
````

全部ロールバックしてからマイグレーションし直す

````
$ php artisan migrate:refresh
````

一旦全てのテーブルを削除してマイグレーションし直す

````
$ php artisan migrate:fresh
````

実行時に発行されるクエリを表示するのみで、実際にマイグレーションはしない

````
$ php artisan migrate --pretend
$ php artisan migrate:rollback --pretend
````

マイグレーション状況を出力

````
$ php artisan migrate:status
````
python3でUnicodeDecodeErrorが出た時の応対

# はじめに
開発サーバーでpythonバッチを実行したら以下のUnicodeDecodeErrorが出たのでその時の対処法をまとめました
<img width="1081" alt="スクリーンショット 2018-02-14 18.52.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/211139/6543d666-514a-295c-2d15-7ebff587c3f3.png">

# 参考にしまくったもの
- [Python 3の各種エンコーディングについて](https://qiita.com/methane/items/6e294ef5a1fad4afa843)

- [Python3でUnicodeDecodeErrorに遭遇したときのTODOリスト](https://qiita.com/narupo/items/c6ea890c485fecee440a)

- [私がPython3でUnicodeEncodeErrorなのはどう考えてもデフォルト文字コードが悪い！](http://lab.knightstyle.info/%E7%A7%81%E3%81%8Cpython3%E3%81%A7unicodeencodeerror%E3%81%AA%E3%81%AE%E3%81%AF%E3%81%A9%E3%81%86%E8%80%83%E3%81%88%E3%81%A6%E3%82%82%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E6%96%87%E5%AD%97/)

# 対応方法

1. まず[Python3でUnicodeDecodeErrorに遭遇したときのTODOリスト](https://qiita.com/narupo/items/c6ea890c485fecee440a)を見て深呼吸して落ち着きブツブツつぶやきます
2. 次にサーバー環境の環境言語を見ます。
<img width="858" alt="スクリーンショット 2018-02-14 18.50.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/211139/fb0c3894-3ab7-005f-6d90-f79cb6db3099.png">

```python3
import sys
print(sys.stdout.encoding)
```
ANSIなのです。これまでのローカルでは `utf8`がデフォルトでした
3.エラー元をみる
<img width="593" alt="スクリーンショット 2018-02-15 11.27.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/211139/9307cfc0-0797-d023-eea5-6619bd3fb430.png">
opneでtextを開いているが、文字コードを指定してないので、デフォルト(ANSI)に変わっていたようだ。

4. codecsを導入してutf-8デコードを行う

pythonの標準エンコードクラスである[codecs](https://docs.python.jp/3/library/codecs.html)をimportしてきてopenする際にutf-8でデコードします

これで解決です！
![スクリーンショット 2018-02-15 11.32.31.png](https://qiita-image-store.s3.amazonaws.com/0/211139/ea76e3f0-6137-34c3-e39d-60922771290a.png)

# 最後に
参考にさせていただきましたサイトさんの方々、ありがとうございました。おかげさまでうまくいきました。
The "XamlCTask" task failed unexpectedly.


#内容
以下のようなエラーが出た時の対処法
![スクリーンショット 2018-02-15 11.40.06.png](https://qiita-image-store.s3.amazonaws.com/0/72559/786a263d-798e-ec98-2956-21fddf0e9dc1.png "スクリーンショット 2018-02-15 11.40.06.png")

#手順
##Xamarin.Formsをインストールする
既に入ってる場合はバージョンが違う可能性があるので、一度アンインストールしバージョンを確認した上で再度インストールを行う

共有プロジェクトを右クリック->`add`->`add NuGet Packages...`
![スクリーンショット 2018-02-15 11.40.27.png](https://qiita-image-store.s3.amazonaws.com/0/72559/2c59a8c7-f808-81c1-2081-d842c13d4292.png "スクリーンショット 2018-02-15 11.40.27.png")

`Xamarin.Forms`で検索し、インストール。右下でバージョンが指定可能
![スクリーンショット 2018-02-15 11.40.48.png](https://qiita-image-store.s3.amazonaws.com/0/72559/1ce075e8-7e3f-fa13-8ab6-7ba2ffad392f.png "スクリーンショット 2018-02-15 11.40.48.png")


##エラーが出る
インストール完了後、buildを試してみるとまた以下のようなエラーが出る
![スクリーンショット 2018-02-15 11.41.44.png](https://qiita-image-store.s3.amazonaws.com/0/72559/5a746027-bcb2-376b-4e51-b96c7957a193.png "スクリーンショット 2018-02-15 11.41.44.png")

```
/Users/frog/Downloads/VoiceRecognitionSample-master/packages/Xamarin.Forms.2.5.0.122203/build/portable-win+net45+wp80+win81+wpa81/Xamarin.Forms.targets(3,3): Error MSB4062: The "Xamarin.Forms.Build.Tasks.GetTasksAbi" task could not be loaded from the assembly /Users/frog/Downloads/VoiceRecognitionSample-master/packages/Xamarin.Forms.2.5.0.122203/build/portable-win+net45+wp80+win81+wpa81/Xamarin.Forms.Build.Tasks.dll.&nbsp;&nbsp;Confirm that the &lt;UsingTask&gt; declaration is correct, that the assembly and all its dependencies are available, and that the task contains a public class that implements Microsoft.Build.Framework.ITask. (MSB4062) (VoiceRecognitionSample)
```

調べてみた
![スクリーンショット 2018-02-15 11.56.29.png](https://qiita-image-store.s3.amazonaws.com/0/72559/1b360376-4b95-aabd-c63e-6f431f89bbb6.png "スクリーンショット 2018-02-15 11.56.29.png")
[ERROR WITH LATEST NUGET v2.5.0.77 "Xamarin.Forms.Build.Tasks.GetTasksAbi" task could not be loaded](https://forums.xamarin.com/discussion/106784/error-with-latest-nuget-v2-5-0-77-xamarin-forms-build-tasks-gettasksabi-task-could-not-be-loaded)

OK


VisualStudioを再起動で解決


以上
windows7+virtualboxでssh/config

# 準備
- virtualbox
- teraterm
- yVM（tinycore linux）⇒
https://cloudarchitectblog.wordpress.com/2015/11/11/yvm-an-ultra-small-vm-with-vm-tools-installed/

# teratermでyVMへsshログイン
ssh/configを作成

# 感想
1vCPU,48MB RAMでもssh使うくらいなら充分
teratermで鍵変えたりとか面倒で、軽いlinuxを探して
to_query でハッシュからクエリ文字列を作成する際は、辞書順に置き換わることに注意する

# to_query とは？
ハッシュからいい感じにクエリ文字列を生成してくれるメソッド。
`active_support/core_ext` を require すると使える。

# 注意点

```ruby
require 'active_support'
require 'active_support/core_ext'

hoge = {}
hoge[:b] = 1
hoge[:a] = 2
hoge #=> {:b=>1, :a=>2}  この時点では、(Ruby1.9以降ならば登録順が保持されている)
hoge.to_query #=> "a=2&b=1"   key による辞書順に変わる！
```

ということで、ハッシュは Ruby1.9 より順序が保証されるようになったのだが、to_query ではハッシュの key で辞書順に直した形で文字列化されるので注意が必要。

# 参考
https://github.com/rails/rails/issues/10529
↑ここでめっちゃ議論されている。
`hughdavenport`氏 「配列の場合とハッシュの場合で挙動が違うのはバグだろ！！」
`rafaelfranca`氏 「確かに修正の必要性は認めるが、ドキュメントと矛盾していないのでこれはバグではない。メーリスでやれ。」
PhpStormでpush内容を確認する方法


関西PHP勉強会で教えてもらった。

![Screen Shot 2018-02-15 at 11.39.18.png](https://qiita-image-store.s3.amazonaws.com/0/109241/8481ed32-c2f9-f624-b0d5-210376b8e571.png "Screen Shot 2018-02-15 at 11.39.18.png")

⬆️（shift）+ `⌘` + K でもよい。