OmniAICreator/Qiita-1.07M huggingface dataset:
データフレームを列の型でソートする

#こんなデータフレームを

| int|lgl  |chr |lgl.1 |lgl.2 | int.1|chr.1 |lgl.3 |chr.2 |chr.3 |
|---:|:----|:---|:-----|:-----|-----:|:-----|:-----|:-----|:-----|
|   1|TRUE |chr |TRUE  |TRUE  |     1|chr   |TRUE  |chr   |chr   |
|   1|TRUE |chr |TRUE  |TRUE  |     1|chr   |TRUE  |chr   |chr   |
|   1|TRUE |chr |TRUE  |TRUE  |     1|chr   |TRUE  |chr   |chr   |
|   1|TRUE |chr |TRUE  |TRUE  |     1|chr   |TRUE  |chr   |chr   |
|   1|TRUE |chr |TRUE  |TRUE  |     1|chr   |TRUE  |chr   |chr   |

#こうしたい

|chr |chr.1 |lgl  |lgl.1 |lgl.2 |lgl.3 | int| int.1| int.2| int.3|
|:---|:-----|:----|:-----|:-----|:-----|---:|-----:|-----:|-----:|
|chr |chr   |TRUE |TRUE  |TRUE  |TRUE  |   1|     1|     1|     1|
|chr |chr   |TRUE |TRUE  |TRUE  |TRUE  |   1|     1|     1|     1|
|chr |chr   |TRUE |TRUE  |TRUE  |TRUE  |   1|     1|     1|     1|
|chr |chr   |TRUE |TRUE  |TRUE  |TRUE  |   1|     1|     1|     1|
|chr |chr   |TRUE |TRUE  |TRUE  |TRUE  |   1|     1|     1|     1|

#テストデータの用意

```r

nr <- 5 #テストデータ(data.frame)の行数

d0 <- data.frame( #テストデータの基本構成要素
  int = rep(1, nr), #integer
  chr = rep('chr', nr), #character
  lgl = rep(TRUE, nr), #logical
  stringsAsFactors = FALSE #characterがfactorに変換されることを防ぐ
)
set.seed(123) #乱数の固定
d1 <- d0[sample.int(length(d0), 10, replace = TRUE)] #d0を基に10列のデータフレームを作成

d1 #テストデータ
```

| int|lgl  |chr |lgl.1 |lgl.2 | int.1|chr.1 |lgl.3 |chr.2 |chr.3 |
|---:|:----|:---|:-----|:-----|-----:|:-----|:-----|:-----|:-----|
|   1|TRUE |chr |TRUE  |TRUE  |     1|chr   |TRUE  |chr   |chr   |
|   1|TRUE |chr |TRUE  |TRUE  |     1|chr   |TRUE  |chr   |chr   |
|   1|TRUE |chr |TRUE  |TRUE  |     1|chr   |TRUE  |chr   |chr   |
|   1|TRUE |chr |TRUE  |TRUE  |     1|chr   |TRUE  |chr   |chr   |
|   1|TRUE |chr |TRUE  |TRUE  |     1|chr   |TRUE  |chr   |chr   |


#列の型順にソート

```r

classes <- sapply(d1, class) #各列の型を入手
d2 <- d1[order(classes)] #ソート

d2
```


|chr |chr.1 |lgl  |lgl.1 |lgl.2 |lgl.3 | int| int.1| int.2| int.3|
|:---|:-----|:----|:-----|:-----|:-----|---:|-----:|-----:|-----:|
|chr |chr   |TRUE |TRUE  |TRUE  |TRUE  |   1|     1|     1|     1|
|chr |chr   |TRUE |TRUE  |TRUE  |TRUE  |   1|     1|     1|     1|
|chr |chr   |TRUE |TRUE  |TRUE  |TRUE  |   1|     1|     1|     1|
|chr |chr   |TRUE |TRUE  |TRUE  |TRUE  |   1|     1|     1|     1|
|chr |chr   |TRUE |TRUE  |TRUE  |TRUE  |   1|     1|     1|     1|


パイプラインでやるなら

```r
library(dplyr)

d1 %>%
  `[`(order(sapply(., class)))


```
CentOS 6.x系でホスト名の変更

検証でCentOS 6系の仮想マシンをクローンから作成したときにど忘れしていたのでメモ

## 環境
|OS・ミドルウェア|バージョン|
|:--------|:---------|
|OS|CentOS release 6.7 (Final)|

## 実行コマンド

```shell-session
## networkファイルを開く
# vi /etc/sysconfig/network

## HOSTNAMEの値を編集する
HOSTNAME=example.local

## 編集したら:wqで保存

## networkを再起動する
# service network restart
```
python ライブラリの基本使い方

機械学習を勉強し始めました。pythonを使ったことないので、色々調べながらメモしています。
## Pandas:
1.Load Json:

 ```python
blogs = pd.read_json('file_name', orient = 'colummn')
blogs
```

2.Filter

```python
filter = blogs[blogs['tags'] > 0]
filter
```

3.Unique Column Value


```python
blogs._columName_.value_counts()
blogs._columName_.value_counts().count()
```
herokuのpostgresをローカルにRestoreする


https://devcenter.heroku.com/articles/heroku-postgres-import-export#export

## herokuのpostgresデータをダウンロード

`.dump`ファイルとしてダウンロード。

![Screen Shot 2017-11-14 at 18.49.57.png](https://qiita-image-store.s3.amazonaws.com/0/109241/814d1de9-5f18-c225-b04a-ed03c0ef4a2b.png "Screen Shot 2017-11-14 at 18.49.57.png")

実際はアプリ名を入れて

```
heroku pg:backups:capture --app [appのname]
heroku pg:backups:download --app [appのname]
```

## ローカルにRestore

![Screen Shot 2017-11-14 at 18.50.09.png](https://qiita-image-store.s3.amazonaws.com/0/109241/c116b80e-108f-c6f7-0e3c-4c82bec49207.png "Screen Shot 2017-11-14 at 18.50.09.png")

以下、コマンドを実行。
-h とかは.envファイルに書いてあるローカルDBの情報に置き換える。
（今回はVagrantを使用しているのでVagrant内で実行）

```
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d mydb latest.dump
```
-今話題の記事を読んで気になった- 「WebP画像形式」とは??

[リニューアルした日経電子版が高速すぎてヤバイ件](https://note.mu/konpyu/n/n9fd5b81f6305)
皆さんお読みになりましたか？
社内では**Fastlyすごーい！！！**って話が大きく感じましたが
フロントに関係しそうな最後の方に出てくるWebPについてちょっとまとめてみました。

---

## WebPについて
### 【WebP画像形式とは】
![WebP_Logo.png](https://qiita-image-store.s3.amazonaws.com/0/42808/f822be43-1d81-b35c-8813-3723afb01445.png)

米Googleが開発している静止画フォーマット。
**ウェッピー**って読むらしいですよ。可愛いですよね。
ファイルの拡張子は `.webp`
採用することでWebサイトの表示速度短縮やトラフィック量の節約が期待できます。

#### PNG/GIF/JPEG画像形式と比べてのメリット

- JPEGと比較してファイルサイズが25-34％小さくなる（非可逆圧縮モード）
- PNGと比較してファイルサイズが28％小さくなる（可逆圧縮モード）
- JPEGとは異なり、非可逆圧縮でもアルファチャンネルを扱える
- エンコードは PNG よりも時間がかかるけど、デコードは PNG よりも高速

#### 対応ブラウザ (2018/10/18 現在)
- WebP lossy support
    - Google Chrome (desktop) 17+
    - Google Chrome for Android version 25+
    - Opera 11.10+
    - Native web browser, Android 4.0+ (ICS)
- WebP lossy, lossless & alpha support
    - Google Chrome (desktop) 23+
    - Google Chrome for Android version 25+
    - Opera 12.10+
    - Native web browser, Android 4.2+ (JB-MR1)
    - Pale Moon 26+
- WebP Animation support
    - Google Chrome (desktop and Android) 32+
    - Opera 19+

### 【HTMLに埋め込むには】
img要素にWebPファイルを指定することもできるけど、そうするとChromeでしか画像を表示できません。
#### 対応ブラウザーにはWebP画像を表示させ、未対応ブラウザーにはフォールバック用画像を表示させたい!!!
そんなときは、`picture` 要素を使います。(初めて知った)

```html
<picture>
  <source type="image/webp" srcset="sample.webp" />
  <img src="sample.png" width="400" height="400" alt="サンプル画像" />
</picture>
```

`picture`要素のなかに`img`要素を含めます。
alt 属性や width 属性・height 属性は`img` 要素にのみ記述します。

そうするとWebP画像対応ブラウザーでは`source`要素に指定した画像が優先され
`img`要素内の src 属性が srcset 属性の内容に差し替わるようになります。

`picture`要素自体のブラウザ対応はIE以外は基本的にOKみたいです。
(2018/10/18 現在)
<img width="1273" alt="スクリーンショット 2018-10-18 15.00.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/42808/f3b838b5-c59c-99ef-c0a1-78864c0c88bf.png">

今後EdgeでもWebP画像が対応してきたらもっと利用が広がっていくのかなって思いました。

---
## WebPファイルを作るには
### 【GulpやGruntのプラグインを使う】
- [grunt-webp](https://github.com/somerandomdude/grunt-webp)
- [gulp-webp](https://github.com/sindresorhus/gulp-webp)

### 【フォトショのプラグインもあるよ】
- [WebP Format](http://telegraphics.com.au/sw/product/WebPFormat#webpformat)

### 【GUIで変換出来るツール】
株式会社ICSさんではGUIの変換ツールを作っていたそうです！！
>「せめて手軽にWebPを作れるツールが欲しい」と思い、デスクトップアプリケーション「WebP画像を作る君」(英語名は「WebP Converter」)を開発し公開しました。

[WebP画像を作成できるアプリ「WebP画像を作る君」を公開](https://ics.media/entry/11711)
(本記事はこちらのサイトを参考文献とされていただき書き上げました。)

いつかこういうの作れるようなエンジニアになりたいです...

---
## 参考文献
- [WebP, the Other Image Format](https://www.afasterweb.com/2016/09/30/webp-the-other-image-format/)
- [WebP画像を作成できるアプリ「WebP画像を作る君」を公開](https://ics.media/entry/11711)
RaspberryPiに5inchディスプレイの設定


Raspberry Piの[5inchディスプレイ](https://www.amazon.co.jp/Elecrow-5インチHDMIディスプレイモニター-800x480解像度タッチスクリーン-Raspberry-Banana/dp/B013JECYF2)が手に入ったので，接続したら，  

デフォルトでは，解像度が異なるので，以下のように一部がブラックスクリーンになってますので、
これを解消します。  

![IMG_0771.JPG](https://qiita-image-store.s3.amazonaws.com/0/152224/8f34cf5d-dcd0-9567-91c4-f576dec3bbd6.jpeg "IMG_0771.JPG")


## 設定ファイルの変更
`/boot/config.txt`を編集すれば．  

```bash
# 5inch HDMI LCD with Touch Panel XPT2046
# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (here we are forcing 800x480!)
hdmi_group=2
hdmi_mode=87
hdmi_cvt=800 600 60 6 0 0 0

# 5inch HDMI LCD with Touch Panel XPT2046(SPI, IRQ=GPIO25, CE1)
# SPI --- タッチパネル用に有効にする．
dtparam=spi=on
dtoverlay=ads7846,penirq=25,speed=10000,penirq_pull=2,xohms=150
```

この設定で，Raspberry Piを再起動すると，以下のように全画面出力されます．

![IMG_0769.JPG](https://qiita-image-store.s3.amazonaws.com/0/152224/fe1a8a8b-f057-8efa-34f2-9b098a5ca4b7.jpeg "IMG_0769.JPG")


## 参考文献
[Raspberry Pi Config | Adafruit 5" and 7" 800x480 TFT HDMI Backpack](https://learn.adafruit.com/adafruit-5-800x480-tft-hdmi-monitor-touchscreen-backpack/raspberry-pi-config)  
[Raspberry Pi 3に HDMI接続の 800x480 5インチ TFT液晶を接続して使用する方法 (ラズパイ３に 5インチ HDMI液晶を接続してタッチパネル機能を有効にする方法、ダウンスケーリングして擬似的に広くする方法。)](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_tft_lcd_5inch_hdmi_touch_xpt2046/)
Google Play Storeでアカウントをアクティベーションするまで


小ネタです。

## 事象

Google Developerの管理者に自分のメールアドレスを送り、招待してもらってコンソールにはアクセスできたものの、apkのアップロードに失敗する事案が発生しました。
具体的には、「変更を保存に失敗しました」という警告が表示されます。

## 回避法

コンソール画面から

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/25250/d6543143-3123-68c8-8327-90e7400a03cf.png "Untitled.png")

1. 新しいアカウントを作成を押下する。

![Untitled1.png](https://qiita-image-store.s3.amazonaws.com/0/25250/87e94c4e-c336-8df3-32f1-ba202871f4b0.png "Untitled1.png")

本人確認を求められるので、パスワードを入力します。

これで一旦は、apkがアップロード出来るようになりました。
PlistBuddyでInfo.plistのVersionやBuildを更新する

毎回同じような作業をくりかえすのが面倒なのでスクリプト書いてみた。

## "Build Phases" にスクリプトを追加
プロジェクト設定の"Build Phases"に、以下のようなスクリプトを追加する。
"Build Phases"の先頭で実行するように順序を変えておかないと、ビルド後に更新されることになるので要注意。

```bash
#!/bin/bash

PATH=/usr/libexec:$PATH

if [ $ACTION = "build" ]; then
 exit 0
fi

buildNumber=$(PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${INFOPLIST_FILE}"

versionNumber=$(PlistBuddy -c "Print CFBundleShortVersionString" "${INFOPLIST_FILE}")
versionNumber=$(($versionNumber + 1))
PlistBuddy -c "Set :CFBundleShortVersionString $versionNumber" "${INFOPLIST_FILE}"
```
URLSessionの共有は道半ば

[先日書いた](https://qiita.com/akoto/items/7e10d22c350cfcca55a7)URLSessionの問題は一部解決した。

Storyboardに紐づいたViewControllerクラスに`URLSessionDownloadDelegate`を追加する形であれば問題が起きなかった。

```swift
import UIKit

class ViewController: UIViewController, URLSessionDownloadDelegate {
}
```

しかし、これではViewControllerに縛られてしまう。複数のViewControllerでデータのダウンロード処理部分を共有したい。そのためには独立したクラスで`URLSession`を扱えば、共有できるのではないかと考えている。

`class aViewCtrl <-> class sharedURLSession <-> class bViewCtrl`

非同期処理、並列処理の扱いは難しい。参考2を読み解くことが解決の糸口に感じる。

---

参考

1. [[Swift3.0] URLSessionによるファイルダウンロードと進捗プログレスバーの表示 | JoyPlotドキュメント](http://joyplot.com/documents/2016/09/30/swift-urlsession-progressbar/)

2. [RLSessionDownloadTask でちょっと大きめなデータでも寝ている間にダウンロード - Qiita](https://qiita.com/codelynx/items/f4ff935058addaa9c5d7)
Amazon Echo を日本語でセットアップする。


本日からalexa.amazon.co.jpの運用が開始されたっぽいです。
とりあえず手持ちのUS版Echo dotが使えるかを試してみました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">co.jpでもAlexaきましたやん。 <a href="https://t.co/JzPb4PQGlb">pic.twitter.com/JzPb4PQGlb</a></p>&mdash; Yayane Kiyohide (@takustaqu) <a href="https://twitter.com/takustaqu/status/930359494332227584?ref_src=twsrc%5Etfw">2017年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


-----

### セットアップ方法

結論から言うとUS版でも普通にセットアップ出来ます。何のことないです。Webからは以前同様のセットアップを行えばOKです。
![https://d26dzxoao6i3hh.cloudfront.net/items/442l2u450k3k2P320d1T/Screen%20Shot%202017-11-14%20at%2018.29.00.png?v=53d94b4f](https://d26dzxoao6i3hh.cloudfront.net/items/442l2u450k3k2P320d1T/Screen%20Shot%202017-11-14%20at%2018.29.00.png?v=53d94b4f)
Set up a new deviceを選び、既にセットアップ済のEchoであれば白ドットボタンを長押してオレンジになるまで待ち、指示通りにAPモード化したAlexaに接続するだけです。

既にAppもあるようですがまだ当方では未確認です。とりあえずこれでそのまま日本語になります。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">手持ちのEcho dotも日本語が使えることを確認。 <a href="https://t.co/5HTT8hcygY">pic.twitter.com/5HTT8hcygY</a></p>&mdash; Yayane Kiyohide (@takustaqu) <a href="https://twitter.com/takustaqu/status/930360036534001665?ref_src=twsrc%5Etfw">2017年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


----

### 遊んでみた。

Amazonでの商品購入を自動化しようと思うと面倒なので、自動購入は室内の他のデバイスからの音声コマンドでやっちゃおうかなとか。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">CLIで簡単にAmazonの注文が出来るようになった。便利。これでオレオレダッシュボタンが作れる。 <a href="https://t.co/MA9IQ5uDCi">pic.twitter.com/MA9IQ5uDCi</a></p>&mdash; Yayane Kiyohide (@takustaqu) <a href="https://twitter.com/takustaqu/status/930362122034331648?ref_src=twsrc%5Etfw">2017年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


ピカチュウと戯れたりとか

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Alexaのピカチュウスキル、不思議な中毒性がある。 <a href="https://t.co/BA2Ijs7Vnc">pic.twitter.com/BA2Ijs7Vnc</a></p>&mdash; Yayane Kiyohide (@takustaqu) <a href="https://twitter.com/takustaqu/status/930364469946937344?ref_src=twsrc%5Etfw">2017年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


ミクにトラウマ植え付けられたりとか。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Alexa期待のスキルと名高いHey Mikuは、こんにちわを繰り返す感じでカーニバルダヨを思い出した。 <a href="https://t.co/OingkLimbt">pic.twitter.com/OingkLimbt</a></p>&mdash; Yayane Kiyohide (@takustaqu) <a href="https://twitter.com/takustaqu/status/930365395617247232?ref_src=twsrc%5Etfw">2017年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


**楽しいし、便利。**
safeLayoutGuide と、LaunchImages 4inch端末互換表示について

LaunchImages で、4inch端末のスクリーンショットのみを指定すると、iPhone6,iPhone6Plus,iPhoneX等で、4inch端末互換表示ができる。iPhone6,iPhone6Plusの場合、単に画面が拡大されて表示されるだけだが、iPhoneXの場合は、上下に黒いバーがはいった上で互換表示される。この表示は、XCode8以前でビルドされたアプリの表示と同じ。

しかし、safeLayoutGuideには、互換表示ではない場合と同じ値がセットされる模様。互換表示の場合、safeAreaという概念が必要でないにも関わらず、値がセットされる。
Spring Data JPA にて QueryDSL のコンパイルを実行すると「エラー: 不適合な型: Class<CAP#1>」のコンパイルエラーが発生した話

# 概要
下記のようなクラス構成にした際、QueryDSL にて生成されたソースがコンパイルエラーを起こしました。

```Employee.java
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Getter
public abstract class Employee<T extends EmployeeWorkTime> extends AbstractEmployee {

    @Transient
    protected T EmployeeWorkTime employeeWorkTime;
}

````

```CompanyEmployee.java
@Getter
@MappedSuperclass
public abstract class CompanyEmployee<T extends EmployeeWorkTime> extends Employee<T>  {

    protected abstract T createEmployeeWorkTime(int workTime);

}

```
``` RegularEmployee.java
@Entity
@DiscriminatorValue("REGULAR")
@Getter
public class RegularEmployee extends CompanyEmployee {

    @Override
    protected RegularWorkTime createEmployeeWorkTime(int workTime) {
        return new RegularWorkTime(workTime);
    }
}
```

- 出力されたコンパイルエラーのログ


>    :generateQueryDSL
/Users/user/Documents/workspace/Project/src/main/generated/project/domain/employee/QRegularEmployee.java:74: エラー: 不適合な型: Class<CAP#1>をClass<? extends CompanyEmployee<? extends EmployeeWorkTime>>に変換できません:
        this._super = new project.domain.employee.QCompanyEmployee(type, metadata, inits);
                                                                                   ^
  CAP#1が新しい型変数の場合:
    CAP#1は? extends CompanyEmployeeのキャプチャからCompanyEmployeeを拡張します
注意:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。
注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。
注意:一部のメッセージは簡略化されています。-Xdiags:verboseで再コンパイルして完全な出力を取得してください

# 原因と回避策
警告にて出力されているとおり、型安全が確保されていないために発生しておりました。
RegularEmployee クラスにて継承しているクラスへの型パラメーターを指定することで正常なソースファイルが QueryDSL にて出力され、コンパイルエラーを含む問題が解消致しました。

``` RegularEmployee.java
@Entity
@DiscriminatorValue("REGULAR")
@Getter
public class RegularEmployee extends CompanyEmployee<RegularWorkTime> {

    @Override
    protected RegularWorkTime createEmployeeWorkTime(int workTime) {
        return new RegularWorkTime(workTime);
    }
}
```

警告を放置せず、きちんと型安全で書きましょう、というシクリでしょうか。
GitHubへのいろんなリンク

GitHubでコメントなどを記述するときに、ほかのIssueやPRにリンクを張る方法のメモ

##\#[番号]
PRやIssueの番号がわかる場合はそのまま指定で行ける

##\#を入力
\#を入力するだけで、候補が出てくるので、選べばいいという話もある

##URLをコピー
PRのコメントに直接リンクを張る場合は、
コメントのxx days agoというリンクを押す。
とんだ先のそのURLを張ればそこに飛ぶURLがはれる

##ソースの一部をハイライト
ソースを表示した画面で、行番号をクリックするとハイライトされる
その状態のURLをコピーして貼り付ければ、ハイライトされたソースにリンクされる
シフトを押して行番号を選択することで、複数行のハイライトも可能
Cakephp3のTestでメールを送りたくない


`Cake\Mailer\Mailer` などでメール送信を行っている際にTestで実メールを送らない方法を調べた。mb_send_mailとか使ってる場合は当てはまらない。


## mock化する場合

* https://qiita.com/ran/items/85e39821f856deb537a4
* https://qiita.com/kazumeat/items/2e7dd2d4962bed44715c

正攻法だがちょっと大変


## EmailTransportをDebugTransportにする

```php

class HogeTest extends IntegrationTestCase
{
    public function setUp()
    {
        parent::setUp();

        // 一度dropしないと設定できない
        // config/app.phpでEmailやEmailTransportの設定を確認して使用中のものを引数で渡す
        \Cake\Mailer\Email::dropTransport('default');
        \Cake\Mailer\Email::setConfigTransport('default', [
            'className' => 'Debug',
        ]);
    }

    // ... 
}
```

`setUp()` に書けばクラス全体、個別testメソッドに書けばそこだけ反映される。 `tests/bootstrap.php` にも書ける。cakephp-3.3.16 で確認。


### 参考

* https://api.cakephp.org/3.3/source-class-Cake.Mailer.Transport.DebugTransport.html#22-43
* https://book.cakephp.org/3.0/ja/core-libraries/email.html
ionicでcordova pluginをそのまま使う（non-native）

## あらすじ

https://github.com/pwlin/cordova-plugin-file-opener2 の`showOpenWithDialog()`を使いたかったが
ionic-native化されてるやつ（ https://ionicframework.com/docs/native/file-opener/ ）にはメソッドが無かった :scream: ので調べた

## やり方

`declare const cordova;` を書くだけ
イカのように使う :octopus: 

```
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { File } from '@ionic-native/file';

declare const cordova;

@IonicPage()
@Component({
  selector: 'page-hoge',
  templateUrl: 'hoge.html',
})
export class HogePage {

  constructor(private navCtrl: NavController, private navParams: NavParams, private file: File) {
  }

  openFile() {
    const filename = this.file.dataDirectory + 'hoge.pdf';
    const mimeType = 'application/pdf';
    cordova.plugins.fileOpener2.showOpenWithDialog(filename, mimeType)
  }

}
```

## まとめ

バッドノウハウ（笑）
PKCS#12形式証明書に関するコマンド

普段、SSL証明書のインストールをLinuxサーバ上で行うことが多く、証明書はPEMエンコーディングのものを使用しています。
IIS(Windows Serverに搭載)上にSSL証明書「PKCS12(pfx)形式」をインストールする機会があったので、メモを残します。

##コマンド
pkcs12(pfx)形式ファイルの情報表示。
```
openssl pkcs12 -in example.com.pfx -info
```
pkcs12(pfx)形式ファイルの情報表示。(鍵情報は表示しない。)
```
openssl pkcs12 -in example.com.pfx -noout -info
```
pkcs12(pfx)形式ファイルから秘密鍵情報を取り出す。(共通鍵暗号方式による秘密鍵ファイルの暗号化を行う。暗号化アルゴリズムはAES256)
```
openssl pkcs12 -in example.com.pfx -out example.com.key -nocerts -aes256
openssl rsa -in example.com.key -out example.com-nopass.key
```
pkcs12(pfx)形式ファイルからサーバ証明書情報を取り出す。
```
openssl pkcs12 -in example.com.pfx -clcerts -nokeys -out example.com.crt
```
pkcs12(pfx)x形式ファイルから中間CA証明書情報を取り出す。
```
openssl pkcs12 -in example.com.pfx -cacerts -nokeys -out example.com.chain.crt
```
サーバ証明書、秘密鍵をpkcs12(pfx)形式の証明書に変換。
```
openssl pkcs12 -export -inkey example.com.key -in example.com.crt -out example.com.pfx
```
サーバ証明書、秘密鍵、中間CA証明書をpkcs12(pfx)形式の証明書に変換。
```
openssl pkcs12 -export -inkey example.com.key -in example.com.crt -certfile example.com.chain.crt -out example.com.pfx
```
Bashで先頭の文字が数字型か文字型なのかの確認

引数に当てられた文字列の先頭が、数字(0〜9)なのか文字列(a〜z)であるかの確認。
たまに必要になる。
１文字目が数字だと不都合なので、数字だった場合は`S_`をつけるスクリプトになります。

###head_string_chk.sh
```
#!/bin/bash
set -eu
#set -x


echo "引数１　：　${1}"
echo "１文字目：　${1: 0:1}" #1文字目を表示する。
NUMERIC_CHECK=`echo "${1: 0:1}" |sed 's/[0-9]//g'`
if [ ! -n "$NUMERIC_CHECK" ]; then
     #   "Numeric"
     STR="S_${1}"
else
     STR="${1}"
fi

echo ${STR}
```

```
【文字列パターン】
MacBook-Pro-2:Documents usr$ bash head_string_chk.sh hogehoge
引数１　：　hogehoge
１文字目：　h
hogehoge


【数字パターン】
MacBook-Pro-2:Documents usr$ bash head_string_chk.sh 20181114_ajitama.txt
引数１　：　20181114_ajitama.txt
１文字目：　2
S_20181114_ajitama.txt

```
Rails serverの挙動を理解するためのActionDispatch


ActionDispatchの挙動についてあんま理解してなかったので
routes.rbみたいなのだけ自分で作って、サーバー起動させるスクリプトを書いて見ました。
とは言いつつ、ただの基本で

ActionDispatchは
RoR中の

```ruby
- Railties
- ActionPack
	- **ActionDispatch**
	- ActionController
	- AbstractController
- ActiveModel
- ActiveRecord
- ActionView
- ActiveSupport
- ActionMailer
```

ActionPackの一部であり、
 ルーティングのためのDSLとも言えるし、Rackミドルウェアとも言える
Rails アプリケーションがあれば consoleで確認してみればいいと思うのだけれども

```rb

> Rails.application.class
=> YOURAPPLICATION::Application

> Rails.application.app
 @app=
	#<ActionDispatch:: .....
あった!! ミドルウェアそうにある

> Rails.application.middleware
=> #<ActionDispatch::MiddlewareStack....
色々ある

> Rails.application.endpoint
=> #<ActionDispatch....
> Rails.application.routes
=> #<ActionDispatch::Routing::RouteSet...
```

よくよく調べると、HTTPやらjourney, middleware, Request, Routingなどなどあった
また、

```
- rake routesの出力は ActionDispatch::Routing::RoutesInspector
- config/routes.rbで使ったり、最終的に呼び出すメソッドが生えてるのが ActionDispatch::Routing::Mapper
- ルーティングがマッチするとコントローラに処理を渡したり、drawメソッドを提供してくれる ActionDispatch::Routing::RouteSet
```

だったりと、それぞれ分かれていて、内容が深かった。

結果的に ruby routes.rbでサーバーを立てて 3001 portで起動できるサーバーを書いたのでそちらのソースは以下
最後のRack::Handler.defaultなどはrackを理解しないと読み解けないと思うので、時間があればRackミドルウェアのcallまで
run Hoge.new からどうやってたどり着くのかというのをやって見るのも面白いかもしれない。

routes.rb

```ruby
require 'action_dispatch'
header = { 'Content-Type' => 'text/html' }
routes = ActionDispatch::Routing::RouteSet.new
routes.draw do
  get 'hoge', to: -> env{ [200, header, ['hoge']] }
  get 'fugafuga', to: -> env{ [200, header, ['fugafuga']] }
  root to: -> env{ [200, header, ['Hello World!!']] }
end
Rack::Handler.default.run routes, Port: 3001
```


### おまけ

Railsの routes.rbで非常にroutingが増えて来たら、

conifig/Initializers/routing_draw.rbに

```ruby
class ActionDispatch::Routing::Mapper
  def draw(routes_name)
    instance_eval(File.read(Rails.root.join("config/routes/#{routes_name}.rb")))
  end
end
```

```ruby
Rails.application.routes.draw do
  resources :...
  resources :...
  resources :...
  resources :...
  resources :...

  draw :user
end
```

こうすると、config/routes/user.rbを探しに行き、そこに書いてあるroutingの記述をroutes.rbにマッピングしてくれるので、
routingが読みやすく追加しやすくなる。即出でそこまで新しくないが、大きな開発には必須かなと。
Rails 4がではじめたときは実装されていたが、その後removeされた跡があるので見ておくといいかもです。
https://github.com/rails/rails/commit/5e7d6bba79393de0279917f93b82f3b7b176f4b5


以上です。
N予備校の先生に謝らないといけないこと

# はじめに
環境構築からして自分の手元には半分くらい別の何かを入れている話です。
せっかく準備してくれている教材に背中を向けるような行為について懺悔いたします。

## 環境の詳細
### ホストOS
Windows10も使うのですが、最近の私のメインOSはfedoraさんです。
驚いたのはWin側でのvagrant稼働時にsshの設定が必要なかったこと。Visual Studio経由でGithubにつなぐと自動的にSSHでinした形跡が残るので、そのおかげなのかSSHする環境が整っていて、何もいじらずにvagrant sshできました。
Windows10ならBash on windowsを使うとubuntuなりOpen SUSEなりを使えるようになりますが、Windows10限定であったりWindows10自体を開発者設定に切り替えたりする必要があるので、Windows7の人のほうが多いことも考えると、いろいろと面倒がかかりますね。

### nodebrewではなくnvm
幾つか環境組み立てた中で、自身はnodebrewよりnvmを採用しました。
一応、nvmはシェルスクリプトで作られているため、Bash以外だとうまく動かないという話を聞きます。
先にVagrant+vboxでubuntu作るので、nodebrewをwindowsで使うのがめんどいとかそういうことは考える必要はないでしょうが、インストール時にinstall-binaryではなくinstallとした場合、ソースコードからビルドしようとする部分が曲者だったりします。
ubuntuなら一応コンパイルは動作しますが、node本体のビルドはpcのパワー次第ですが30分以上かかるレベルなので非常に手間がかかります。ctrl+cで止めてしまえばいいんでしょうが……
自分としてはnvmが単純に自分が今まで使ってきて手になじんでいるからというのもあるのですが、一度nodebrewでbinary入れ忘れでやらかしている経験もあるので、nvm環境でnode動かしていきます。

ちなみに講義だとver6.11.x(開始時のLTS)ですが、手元のverは現行LTSの8.9.xです。
nodeのver違いは、C++アドオンでがっちがちに固めているモジュールを使うとき、例えばVSCodeをソースからビルドするようなケースでもない限りは、そこまでひどい問題にはならないかという自己責任の判断です。

### vagrantで入れたのはubuntuではなくdebian
このあたりは趣味が入りすぎているところはあります。
一応ubuntuもdebian系なので互換性はあります。

もっとも、fedora稼働の場合だとデフォルトでLinuxを動かしている状態なので、ある程度講義内容をそのままスタンドアロンに実行できるのですが、システム的なソフトウェアをパッケージインストールする場合、該当するパッケージやリポジトリ設定やエトセトラに差が存在するので、この差を埋めなければいけません。
例えばPostgresqlの導入について、debian系は``` # apt install postgresql```とぽちるだけでワンタッチ全入れ+自動設定してくれますが、RH系は必要なパッケージが複数あってさらにいくつかの準備設定が必要になります。
その点でハマりどころがあったりしました。

### vagrantのポートフォワーディング
何らかの都合でホスト側が8000番をふさいでしまった場合にゲスト側がポートを使えない系のエラーを吐かれたことがあったので、単純なポート対象ではなく、vagrant内のローカルipを通すように(ip=192.168.xx.xx的な)しました。これにより、ホストで8000使ってもゲストのipにポート8000が通せるようになります。

以下はだいたい設定の全文。
vagrant initで吐き出されたファイルを少し弄っただけです。

```rb:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "debian/contrib-stretch64"
  config.vm.box_check_update = false

  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.synced_folder "./workspace", "/home/vagrant/workspace"

  config.vm.provider "virtualbox" do |vb|
     vb.memory = "1024"
  end
end
```

仮想OSのサーバーに接続する場合は、この設定の場合だとブラウザに"192.168.33.10"と入れ、ポート番号を付け加える必要があります。

### SSHの鍵設定について
状況によってinするOSがホストだったりゲストだったりするため、githubに登録しているSSHの鍵設定をそれぞれに対応させているのですが、この鍵について講義ではRSAにて行うよう書かれているところ、ECDSAだったりEd25519だったりします。
なぜそんな設定にしたのかというと、[GitHubユーザーのSSH鍵6万個を調べてみた](http://d.hatena.ne.jp/hnw/20140705)という記事を見かけたからです。
現状は確かにRSAの2048bitでも問題なさそうですが、3072bit以上にするか楕円曲線のECDSAを使うか、エドワーズ曲線と呼ばれるものにしておかないと、2030年問題にぶつかるそうです。
授業の生放送で取り上げていただいてありがとうございました。

## 締めに
自分、授業受ける必要あるのかと突っ込みを受けそう……いえ、こういう形でやっていくことで、予習と復習を同時に行って確実に自分のものにしていくという学習ができるのだと考えます。
いろいろと申し訳ないお話ではありましたが、回り道をしながらでも追い付いていけるようにとゆるゆる頑張ります。
買ったばかりのMac(High Sierra)でVSCode＋golang+delve環境構築

# 2017年11月14日現在の覚え書き
# 全体の流れ
OSアップデート　→　Homebrewインストール　→　gvmインストール →　go1.9インストール　→　VSCodeインストール　→　Delveインストール

# OSアップデート
- AppStoreアプリから、macOS High Sierra（10.13.1）まで。2017.11.14現在
- 再起動なども

# hombrew のインストール
- terminalで以下を実行する
- https://brew.sh/index_ja.html

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

# gvm インストール
## terminalで実行する
- 参考:　https://github.com/moovweb/gvm

```
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
```

- terminal起動し直して、gvmが問題なくインストールされたかチェック

```
$ gvm version
```

- インストール出来るgoのバージョン一覧バージョン一覧

```
$ gvm listall
```

- goインストール

```
$ gvm install go1.9.2 -B
```

```
$ gvm use go1.9.2 --default
```

- ターミナル再起動後もgvmを使ってくれるように設定スクリプトに追記（もしされていなかったら）

```
$ cat ~/.gvm/scripts/gvm >> ~/.bash_profile
```

## $GOPATHセットアップ
適当なフォルダを作ってそこを$GOPATHに設定する方法。設定したら、今後、このフォルダ以下でGO関連の作業を全てやろうね。別プロジェクトや別バージョンGo使う場合はまた同じ作業しましょう。

- 適当なGOPATH用フォルダを作る

```
$ mkdir mygo
$ cd mygo
$ pwd
/Users/user/Documents/mygo
```

- ローカルpkgset(by gvm)を作る

```
$ gvm pkgset create --local
```

- pkgset一覧を見る

```
$ gvm pkgset list
gvm go package sets (go1.9.2)
  L /Users/user/Documents/mygo
=>  global
    local
```

- pkgset をlocalに切り替え

```
$ gvm pkgset use --local
Now using version go1.9.2 in local package set
Local GOPATH is now /Users/user/Documents/mygo/.gvm_local
```

- $GOPATH見るとこんな感じ

```
$ echo $GOPATH
/Users/user/Documents/mygo:/Users/user/Documents/mygo/.gvm_local/pkgsets/go1.9.2/mygo:/Users/user/.gvm/pkgsets/go1.9.2/global
```

- aliasを作って再起動後に手動で切り替え出来るように(~/.bashrc_profileに追記)

```
alias mygo='cd ~/Documents/mygo; gvm pkgset use --local; echo $GOPATH'
```


# VSCode インストール
- https://code.visualstudio.com/ からアプリ本体（zip）をダウンロードして手元で展開＆アプリフォルダにインストール

## VSCodeの　go extension　インストール
- VSCode起動してextension一覧から「go」検索
- lukehoban.goのやつ。Gopher君が目印。クリックしてインストール

## VSCodeでGoファイルを作って書こうとすると色々インストールして良いか聞いてくるので「install all」選択選択
- 適当にファイル作ってgoプログラム書いて、問題なければF5キーでデバッグ開始
- でも、デバッガ入れてないのでここでは成功しません

# delve(デバッガ)のインストール
- homebrew使う

```
$ brew install go-delve/delve/delve
```

- 以下のようなエラーはインストールスクリプト中のsudoに失敗している
- (参考：https://qiita.com/paveg/items/74468bca969c7739dfd7)

```
(色々なメッセージ)
==> Generating dlv-cert
==> openssl req -new -newkey rsa:2048 -x509 -days 3650 -nodes -config dlv-cert.c
==> [SUDO] Installing dlv-cert as root
==> sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.
Last 15 lines from /Users/user/Library/Logs/Homebrew/delve/02.sudo:
2017-11-10 18:02:06 +0900
sudo
security
add-trusted-cert
-d
-r
trustRoot
-k
/Library/Keychains/System.keychain
dlv-cert.cer
(色々なメッセージ)
```

- 一度sudoで適当なコマンド実行してsudo用パスワードを覚えさせてから上記のコマンドを再実行するか、以下のスクリプトを直に実行

```
$ cd ~/Library/Caches/Homebrew/
$ tar xf delve-*.gz
$ cd delve-1.0.0-rc.2/
$ sh scripts/gencert.sh
 (sudo パスワード聞かれて入力して完了)
```

- delveが問題なくインストールされているか確認

```
$ dlv version
```

# 再度、VSCodeでデバッグ開始
- 問題なく実行できることを確認したらおしまい。お疲れ様でした
- デバッグでなく、ビルド（コンパイル）したいなら以下を参考
- (https://qiita.com/koara-local/items/8642d847831b6268d23e)
Visual Studio | WPF > JSON > デシリアライズ > Newtonsoft.JSON使用 > List<T>型オブジェクト

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

### 参考

https://www.newtonsoft.com/json/help/html/SerializingJSON.htm

### 処理概要

`List<Person>`型のデシリアライズを行う。

### IDE

NugetにてNewtonsoft.JSON v10.0.3をプロジェクトにインストールした。

### code 

```MainWindow.xaml
<Window x:Class="_171114_t1600_jsonWrite.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171114_t1600_jsonWrite"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Name="B_json" Height="30" Content="JSON" Click="B_json_Click"/>
    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// 以下を追加
using Newtonsoft.Json;

namespace _171114_t1600_jsonWrite
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void B_json_Click(object sender, RoutedEventArgs e)
        {
            // 1.  Serialize
            var prsnlst = new List<Person>();
            prsnlst.Add(new Person{ Name="Janeway", Gender="Female"});
            prsnlst.Add(new Person { Name = "Tuvok", Gender = "Male" });
            prsnlst.Add(new Person { Name = "Chakotay", Gender = "Male" });

            var json = JsonConvert.SerializeObject(prsnlst);
            Console.WriteLine($"{json}");

            // 2. Deserialize
            Console.WriteLine("-----");
            var dstlst = JsonConvert.DeserializeObject<List<Person>>(json);
            foreach (var elem in dstlst)
            {
                Console.WriteLine($"{elem.Name} is {elem.Gender}");
            }
        }
    }

    public class Person
    {
        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("gender")]
        public string Gender { get; set; }
    }
}
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8ccdae50-7e94-206e-0a30-d090472ac412.png)

### 補足

`JsonConvert.DeserializeObject<List<T>>()`が失敗する場合は`IEnumerable<T>`を使うと動く、という例がある。

https://stackoverflow.com/questions/28012335/json-net-deserializeobject-to-list-of-objects

(こちらの環境では`List<T>`で失敗しなかった)。
cron周り


#cronとanacron

違いは
https://www.glamenv-septzen.net/view/1319
http://enakai00.hatenablog.com/entry/20111004/1317718773
参照


#install

ちな

```
[root@remote ~]# cat /etc/redhat-release
CentOS release 6.8 (Final)
```

導入

```
$yum install crontabs

```


あっ
なんかcronie-noanacron的なもの

https://ninnin.in/diary/bibouroku/crontab-command-not-found/
参照


#crontabコマンド

crontab -e
→cron設定

crontab -l
→一覧みる
既存のテーブルにカラムを追加 - Laravel/MySQL/Postgresなど


# 追加方法

## Laravel
https://laravel.com/docs/5.4/migrations#columns

```
Schema::table('users', function (Blueprint $table) {
    $table->string('email');
});
```

## Postgres

```
ALTER TABLE users ADD email int;
```

## 追加位置を指定する

### MySQL
コマンドでできる
https://www.dbonline.jp/mysql/table/index20.html

### Postgres

コマンドではできない。
頑張ったらできないこともないらしいが大変そう。
http://kashi.way-nifty.com/jalan/2014/11/post-cbf4.html

# カラムを削除する

## Laravel
https://laravel.com/docs/5.4/migrations#columns のDropのところ
 
```
Schema::table('user', function (Blueprint $table) {
	$table->dropColumn('email');
});

```
UMLっぽい図でざっくり理解するEthereumの送金処理

## Ethereumとは
Ethereumとは、ブロックチェーン技術を利用した分散アプリケーションのためのプラットフォームです。
詳しくは、[こちら](https://book.ethereum-jp.net/what_is_ethereum/)を参照。読み進める上で視覚的に理解したいことを勉強ついでにメモしています。
馴染みのあるUMLを利用してイメージを掴んでいきます。


## Ethereum上の登場人物
### アカウント
アカウントと呼ばれるオブジェクトは、トランザクションを発行し、別のアカウントに送金したりスマートコントラクトを実行したりします。

主に、次の4つのフィールドを持ちます。（ドキュメントより引用）
- nonce：そのアカウントが送信した累積トランザクション数
- ether balance：そのアカウントが所有するether量
- contract code：コントラクト・コード（EOAの場合は空）
- storage：そのアカウントが保持する任意のデータ

### Externally Owned Account
Externally Owned Account（EOA）はWebサービスにおけるユーザのようなものです。ユーザによりコントロールされ、トランザクションの生成・送金などを実行します。
これをクラス図っぽいもので表してみます。
![スクリーンショット 2017-11-14 16.09.50.png](https://qiita-image-store.s3.amazonaws.com/0/29971/095d5bd3-88b8-ea47-c74c-a454a061b976.png "スクリーンショット 2017-11-14 16.09.50.png")
EOAの場合はコントラクトコードは空なので書いてません。振る舞いとしては、
- createTransaction() : トランザクションの生成
- transfer() : 他のEOAへの送金
- createContract() : コントラクトの生成
- execContract() : コントラクトにコードを実装させる
があります。
※型や引数や戻り値は私のイメージに近いものを適当に入れてあります。


### Contract
アカウントには、コントラクトもあります。
同様に、クラス図っぽいもので表してみましょう。

![スクリーンショット 2017-11-14 16.14.05.png](https://qiita-image-store.s3.amazonaws.com/0/29971/482098ad-f086-55e6-16fc-8a72a21df537.png "スクリーンショット 2017-11-14 16.14.05.png")

コントラクトは、コントラクトコードをプロパティとして持ち、自身のコントラクトコードを実行するメソッドがあります。

## トランザクション
ここまで何度か出てきている「トランザクション」についても同様にクラス図っぽいもので表してみます。トランザクションはアカウントによって生成されます。
![スクリーンショット 2017-11-14 16.18.22.png](https://qiita-image-store.s3.amazonaws.com/0/29971/0455be3e-de39-beb1-9c8f-ed2dbecb19a9.png "スクリーンショット 2017-11-14 16.18.22.png")


主に、下記のプロパティを持ちます。
- transferAmount: ether送金額
- toAddress: 送信先アドレス
- senderSignature: 送信アカウント署名
- data: 任意データ（トランザクションの相手先がコントラクトの場合に、コントラクトコードに引き渡すデータ）
- startGAS: STARTGAS値
- GASPrice: GASPRICE値

「GAS」は送金やスマートコントラクト実行に必要な手数料で、startGASとGASPriceによって計算されます。手数料はマイニングを行う「マイナー」に支払われます。


## トランザクション処理の流れ
内容は[こちらのページ](https://book.ethereum-jp.net/what_is_ethereum/ethereum_as_dapp_platform.html)の「トランザクションの流れ」のパートを御覧ください。
文字で読むだけだとなかなか理解できなかったのでシーケンス図っぽいものに落とし込んでみました。
ここでは、EOA→EOAの送金を図にしています。また、残高不足によるエラー時の処理の流れは省いてあります。正常系のみです。
![スクリーンショット 2017-11-14 16.23.21.png](https://qiita-image-store.s3.amazonaws.com/0/29971/5825038a-5c4b-0f5f-9d4c-003db177f343.png "スクリーンショット 2017-11-14 16.23.21.png")

大きく分けると次のような処理が行われています。
1. トランザクションの発行（1)
2. 正当性チェック、下準備（1.1~1.1.2)
3. 手数料計算(2)
4. 送金処理(3~7)

## まとめ
図にしてみるとだいぶイメージが掴めます。
コントラクトの実行の場合も大きな流れは変わらず、送金処理の部分がコントラクトコードの実行置き換わるという理解で良いかと思います。
間違っている箇所等ございましたらご指摘いただけると幸いです。
Kotlin, Retrofit2にて200や201が返ってきてるのにonFailureに入る

##はじめに
retrofit2でPOSTを送ることはよくあると思うのですが、リスポンスコードとして200や201が返ってきてるのに、onResponseではなく,onFailureに入っちゃうというエラーに遭遇したときの対処法です。
kotlin要素は薄いです。

## interfaceでリクエストの返り値をCall\<Void>にする
これだけです。

## これだけだと寂しいので具体例
もしJsonObjectをPostでAPIサーバーに送りたいってなったらinterfaceは、

```APIClient.kt
@Headers("Accept: application/json",
            "Content-Type: application/json")
    @POST("/api/sample")
    fun create_hoge(@Body body: JsonObject): Call<Void>
```
てな感じに書いたらいけます。

## Kotlinでは?
本題です。kotlinのときは,Call\<Unit>でいけるのか？というとそういうわけではなく、kotlinのときもCall\<Void>です。
UnitとVoidで扱いが違うというか用途はほぼ同じだと思うんですが、Javaの遺産を使うときにはVoidを意識的に使う必要があるみたいです。

##参考
https://github.com/square/retrofit/issues/1446
https://stackoverflow.com/questions/22654932/what-is-the-purpose-of-unit-returning-in-functions
Visual Studio | WPF > JSON > シリアライズ > Newtonsoft.JSON使用 > List<T>型オブジェクト

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

JSONの使い方を整理する。

### 参考

https://dev.classmethod.jp/etc/c-sharp-json/ by 加藤潤さん @ Developers.IO

情報感謝です。

上記掲載内容のうち、Newtonsoft.JSON (元Json.NET?)を使ってみる。

### IDE

NugetにてNewtonsoft.JSON v10.0.3をプロジェクトにインストールした。

### code

```MainWindow.xaml
<Window x:Class="_171114_t1600_jsonWrite.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171114_t1600_jsonWrite"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Name="B_json" Height="30" Content="JSON" Click="B_json_Click"/>
    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// 以下を追加
using Newtonsoft.Json;

namespace _171114_t1600_jsonWrite
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void B_json_Click(object sender, RoutedEventArgs e)
        {
            var prsnlst = new List<Person>();
            prsnlst.Add(new Person{ Name="Janeway", Gender="Female"});
            prsnlst.Add(new Person { Name = "Tuvok", Gender = "Male" });
            prsnlst.Add(new Person { Name = "Chakotay", Gender = "Male" });

            var json = JsonConvert.SerializeObject(prsnlst);
            Console.WriteLine($"{json}");
        }
    }

    public class Person
    {
        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("gender")]
        public string Gender { get; set; }
    }
}
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/504e7949-26fb-0cb1-9102-23a25066d10d.png)

### link

[Json.NET Documentation: Serializing and Deserializing JSON](https://www.newtonsoft.com/json/help/html/SerializingJSON.htm)
46歳から機械学習を学習する (2)

#HDDに録画セットした
　jack-low 先生に教えていただいたテレビ番組を HDD にセットした。

#本屋へ行ってきた (1)
　DeliciousBar 先生に教えていただいた「[人工知能は人間を超えるか ディープラーニングの先にあるもの](https://www.amazon.co.jp/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%AF%E4%BA%BA%E9%96%93%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%81%8B-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E5%85%88%E3%81%AB%E3%81%82%E3%82%8B%E3%82%82%E3%81%AE-%E8%A7%92%E5%B7%9DEPUB%E9%81%B8%E6%9B%B8-%E6%9D%BE%E5%B0%BE-%E8%B1%8A/dp/4040800206/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=1510571335&sr=1-41)」を帰宅途中に買って読んだ。
　筑波大学の落合陽一博士がいきなり世に出てきた感があったので、研究の歴史はそう無いのかと思っていた。
　しかし、日本には連綿と続く人工知能研究の歴史があり、研究者の層が厚いということを知って少々安心した。
　気がついたら午前3時で、翌朝遅刻しそうになった。

#本屋へ行ってきた (2)
　次の2冊を購入した。

- [プログラミングのための線形代数](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E7%B7%9A%E5%BD%A2%E4%BB%A3%E6%95%B0-%E5%B9%B3%E5%B2%A1-%E5%92%8C%E5%B9%B8/dp/4274065782/ref=sr_1_1?s=books&ie=UTF8&qid=1510644196&sr=1-1&keywords=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E7%B7%9A%E5%BD%A2%E4%BB%A3%E6%95%B0) ･･･ 数学：線形代数
- [みんなの Python](https://www.amazon.co.jp/%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AEPython-%E7%AC%AC4%E7%89%88-%E6%9F%B4%E7%94%B0-%E6%B7%B3/dp/479738946X/ref=sr_1_1?s=books&ie=UTF8&qid=1510644267&sr=1-1&keywords=%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AE%E3%83%91%E3%82%A4%E3%82%BD%E3%83%B3) ･･･ 言語：Python

　これなら読めるかなと思って即買いした。

#ノートPCへ Anaconda をインストール
　奇跡的に問題なくインストールできた。
　
#今回の結論
　早く週末にならないかな。
raspberry pi 3 でstretch その13

#概要
raspberry pi 3 でstretchやってみた。
dhcpサーバやってみた。

#環境
Raspberry Pi 3 model B v1.2 element14
2017-09-07-raspbian-stretch

#インストール
sudo aptitude install dnsmasq

#設定
sudo nano /etc/dnsmasq.conf
```
interface=eth0
dhcp-range=192.168.1.10,192.168.1.150,255.255.255.0,22h
```
#確認
同じHUBに、つないでIPアドレス確認。

以上。
Visual Studio | WPF > ファイルのsave, load > System.IO.File使用

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

### 関連

[System.IO.Fileクラス](https://msdn.microsoft.com/ja-jp/library/system.io.file(v=vs.110).aspx)

### 処理概要

- save
    - `List<string>`にてリスト化
    - WriteAllLines()にて書出し
- load
    - ReadAllLines()にて読込み
    - foearchで全項目表示
    - インデックスで特定項目表示

### code 

```MainWindow.xaml
<Window x:Class="_171114_t1200_fileWriteRead.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171114_t1200_fileWriteRead"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Name="B_fileIO" Width="100" Height="30" Content="file IO" Click="B_fileIO_Click"/>
    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _171114_t1200_fileWriteRead
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();            
        }

        private readonly string kFilename = "test_171114.txt";

        private void fileWrite()
        {
            var datlst = new List<string>();
            for (int loop = 0; loop < 10; loop++)
            {
                datlst.Add("3.141592, 2.7182");
            }
            System.IO.File.WriteAllLines(kFilename, datlst.ToArray());
        }
        private void fileRead()
        {
            // 1. read all lines
            var datlst = System.IO.File.ReadAllLines(kFilename);
            foreach(var elem in datlst)
            {
                Console.WriteLine(elem);
            }
            // 2. show specific line
            Console.WriteLine("--- [5] ---");
            Console.WriteLine(datlst[5]);
        }

        private void B_fileIO_Click(object sender, RoutedEventArgs e)
        {
            fileWrite();
            fileRead();
        }
    }
}
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6587ef72-52a8-b1e2-9a09-c71091f4d6f3.png)
インストール済みのPHPでちょこっと調べことをする時にワンライナーで確認

関連パッケージの有無やVer情報などを確認したい時によく使うのでメモしておきます。

```:command
$ php -r "phpinfo();" | grep -i [調べたいキーワード]
```

2017/11/15追記

```:command
$ php -i | grep [調べたいキーワード]
```
Unityでドリーズーム（ドリーイン＆ドリーアウト）

https://docs.unity3d.com/jp/current/Manual/DollyZoom.html

公式リファレンスのスクリプトがそのままだと動かないので、
修正したものを。。。汗

```ExampleScript.cs

using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    public Transform target;
    public Camera camera;
    
    private float initHeightAtDist;
    private bool dzEnabled;

    // Calculate the frustum height at a given distance from the camera.
    float FrustumHeightAtDistance(float distance) {
        return 2.0f * distance * Mathf.Tan(camera.fieldOfView * 0.5f * Mathf.Deg2Rad);
    }

    // Calculate the FOV needed to get a given frustum height at a given distance.
    float FOVForHeightAndDistance(float height, float distance) {
        return 2.0f * Mathf.Atan(height * 0.5f / distance) * Mathf.Rad2Deg;
    }

    // Start the dolly zoom effect.
    void StartDZ() {
        var distance = Vector3.Distance(transform.position, target.position);
        initHeightAtDist = FrustumHeightAtDistance(distance);
        dzEnabled = true;
    }
    
    // Turn dolly zoom off.
    void StopDZ() {
        dzEnabled = false;
    }
    
    void Start() {
        StartDZ();
    }

    void Update () {
        if (dzEnabled) {
            // Measure the new distance and readjust the FOV accordingly.
            var currDistance = Vector3.Distance(transform.position, target.position);
            camera.fieldOfView = FOVForHeightAndDistance(initHeightAtDist, currDistance);
        }
        
        // Simple control to allow the camera to be moved in and out using the up/down arrows.
        transform.Translate(Input.GetAxis("Vertical") * Vector3.forward * Time.deltaTime * 5f);
    }
}

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/fcc19e3f-042d-2cd3-80fb-50e6dd9d538a.png)


あとは、スクリプトの引数にターゲットと、カメラをアタッチし、
カメラを動かせばOK!
rails 画像表示

# slimの記述形式で画像の表示を行います
doctype html
html
  head
  meta charset="utf-8"
  title HelloApp
  
  = csrf_meta_tags
  
  = stylesheet_link_tag 'application', media:'all', 'data-turbolinks-track': 'reload'
  = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'

  body
    /img src="assets/images/Item-0.png" width="30" height="30" 
    /img src="/assets/images/IMG_0709.jpg" width="30" height="30" 
    = image_tag '/Item-0.png'
    = image_tag '/food.jpg'
    p
      | お試しruby on rails
      br
      | 2017 11 14作成
    h3
      a href="http://www.yahoo.co.jp" target="_blank" yahoo!
    = yield




![HelloApp.png](https://qiita-image-store.s3.amazonaws.com/0/188878/9a1d32f9-b609-a660-3ab8-35e698461d93.png)

###こんな感じ

######※ slimのコメントは / で表示されます
######※ imageの表示は = image_tag '/画像名' で行います（画像名の前に/を忘れずに。）
######※ 画像はapp/public直下に配置して下さい
Kubernetes Tutorial: How to pull a private docker image in a pod

Docker images that comprise a production application are often deployed to private repositories in Docker registries. Kubernetes provides a feature called imagePullSecrets that allows pods to pull private docker images. In this blog, we demonstrate how you can easily hookup imagePullSecrets to your pod using Shippable.

 

Creating an imagePullSecrets secret
imagePullSecrets is a type of a Kubernete Secret whose sole purpose is to pull private images from a Docker registry. It allows you to specify the Url of the docker registry, credentials for logging in and the image name of your private docker image.
![imagePullSecrets.png](https://qiita-image-store.s3.amazonaws.com/0/154485/942eab4c-4fdd-9d39-0ee1-c4378663ada8.png)


There are two ways an imagePullSecrets can be created.

Check out the full tutorial on [Shippable](http://blog.shippable.com/kubernetes-tutorial-how-to-pull-private-docker-image-pod)
ZabbixからRDSを監視する


ZabbixからAWS RDSを監視する設定です

## ODBCのインストール
RDSに接続するためODBCをインストール

```
$yum install unixODBC unixODBC-devel
$yum install mysql-connector-odbc
```

## 設定
上記でインストールすると`/etc/odbc.ini`ファイルが生成されるので下記のように監視対象のRDSの情報を書きます

```/etc/odbc.ini
[mydatabase]
Description = MySQL Database
Driver      = MySQL
Database    = hogehoge-db
Server      = hogehoge-db.fugafuga.ap-northeast-1.rds.amazonaws.com
Port        = 3306
User        = root
Password    = XXXXXXXXXXX
```

## 確認
以下のコマンドでRDSとの疎通確認ができます

```
$isql mydatabase

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> quit
```

## エラー
下記のエラーが出た場合は書式がおかしいので再度設定を見直しましょう

```
[IM002][unixODBC][Driver Manager]Data source name not found, and no default driver specified
[ISQL]ERROR: Could not SQLConnect
```

## 参考リンク

[Zabbix Documentation 2.2](https://www.zabbix.com/documentation/2.2/jp/manual/config/items/itemtypes/odbc_checks)

[ZabbixServerからAWSのRDS(Mysql)を監視するためにODBC接続設定をCentOS7＋Zabbix3.0でやってみた。
](http://blog.life-type.com/zabbixserverawsrdsmysqlodbccentos7zabbi/)
ITベンチャーに新卒入社した先でエンジニア第一号になったので、プログラミングを学ぶ #0 ～概要編～

![syosinnsya.png](https://qiita-image-store.s3.amazonaws.com/0/213734/131d97be-6d27-cfdb-cca5-6102ef68839b.png)
#スペック
- 文系4年大学生（2018年卒）
- 興味は以前からあったものの触ったことなし
- プログラミングはMacでしか出来ないと思っていた

#経緯
就活前は内定先の研修期間でプログラミングを学べば良いと考えていました。しかし、４月以降の予定を見ると、外部研修が終わるとOJTでした。企業内にいるエンジニアは他の企業から来ている方や中途採用の方しかおらず、人数も少ないので、初めは他の業種の仕事を教えてもらい、そのあとに、エンジニアとしての社内研修が始まります。しかし、第一号なので、研修体制が整っておらず、自分で見つけてきたサイトを見てもらい、「OK」を頂いたら、それで頑張るという流れになるそうです。そういう事もあり、記録を残していこうと思います。（句読点が多くてすみません。）


#教材
- Ｎ予備校【2017年度】プログラミング入門 Webアプリ
- Progate
- ドットインストール

#目標
- [ ] webページもしくはアプリを作成
将棋の指し手の正規表現の例

表記チェックというよりは、分解するための正規表現です。

```rb
@regexp = /
  (?<to>[１-９1-9一二三四五六七八九]{2})?
  (?<same>同)?
  \p{blank}*
  (?<piece>成[銀桂香]|[王玉金銀全桂圭香杏角馬飛龍竜歩と])
  (?<suffix>[左右直]?[寄引上行]?)
  (?<motion>不?成|打|合|生)?
  (\((?<from>\d{2})\))? # KIFフォーマットの移動元用
/x

def _(v) v.match(@regexp).named_captures end

_ "７六歩"         # => {"to"=>"７六", "same"=>nil, "piece"=>"歩", "suffix"=>"", "motion"=>nil, "from"=>nil}
_ "22角成(88)"     # => {"to"=>"22", "same"=>nil, "piece"=>"角", "suffix"=>"", "motion"=>"成", "from"=>"88"}
_ "同　飛"         # => {"to"=>nil, "same"=>"同", "piece"=>"飛", "suffix"=>"", "motion"=>nil, "from"=>nil}
_ "５八成銀右"     # => {"to"=>"５八", "same"=>nil, "piece"=>"成銀", "suffix"=>"右", "motion"=>nil, "from"=>nil}
_ "５８成香右上"   # => {"to"=>"５８", "same"=>nil, "piece"=>"成香", "suffix"=>"右上", "motion"=>nil, "from"=>nil}
_ "４一桂不成"     # => {"to"=>"４一", "same"=>nil, "piece"=>"桂", "suffix"=>"", "motion"=>"不成", "from"=>nil}
_ "５五玉打(59)"   # => {"to"=>"５五", "same"=>nil, "piece"=>"玉", "suffix"=>"", "motion"=>"打", "from"=>"59"}
_ "５五同王打(51)" # => {"to"=>"５五", "same"=>"同", "piece"=>"王", "suffix"=>"", "motion"=>"打", "from"=>"51"}
```

## 参照

日本将棋連盟 棋譜の表記方法
https://www.shogi.or.jp/faq/kihuhyouki.html
※とても詳しいが「行」の意味については触れられてない

品川将棋倶楽部 将棋のルール「棋譜について」
https://ameblo.jp/written-by-m/entry-10365417107.html
※昔の棋譜にある「行」の意味についての言及がある

棋譜 - Wikipedia
https://ja.wikipedia.org/wiki/%E6%A3%8B%E8%AD%9C
※「生」とは「不成」のこと