OmniAICreator/Qiita-1.07M huggingface dataset:
C#でslackにPOST

#プロローグ
ちょっとつまづいたので残しておきたくって。
誰かの参考になればと思って。
コピってぺして動かなかったら、調べてどうにかしって。（語彙不足）
俺も調べてどうにかなったって。（越中さんのモノマネしてるケンコバさん？）

#準備

##slack側
###アイコン
「ワークスペースのカスタマイズ」⇒「カスタム絵文字を追加する」
で、":mybot:"という名称を付け事前に追加した。

###POST先
１．App管理で、Incoming Webhookを検索。
２．「設定を追加」を押す。
３．とりあえずのPOST先チャンネルを指定し、「インテグレーションの追加」を押す。
　　後で変更できるのでどこでもいい。
４．インテグレーションの設定欄にある、Webhook URLをコピー
５．C#で作成するPostClassのpostUrlに割り当てる。

##C#側
###プロジェクト
お好きなC#プロジェクトを。

###Nugetパッケージの追加
Newtonsoft.Json を追加した。

###パラメータクラス
```NewsData.cs
public class Attachment
{
    public string color { get; set; }
    public string title { get; set; }
    public string title_link { get; set; }
    public string text { get; set; }
}
```

```SendParameters.cs
public class SendParameters
{
    public string username => "俺bot";
    public string icon_emoji => ":mybot:";
    public string text { get; set; }

    // POST先のチャンネルを指定する場合使用。
    // POST先がデフォルトのチェンネルの場合は空白で良い。
    public string channel { get; set; }

    // チュートリアルを見ると、[]で囲まれていた。
    // リストとして扱うと、jsonシリアライズする際スムーズ。
    public List<Attachment> attachments { get; set; }
}
```
###HttpClient
※2019年7月23日。コメントでご指摘いただいたサイト参考。
HttpClientは、staticで宣言して使いまわすのが望ましいらしい。
よって、使いまわせるように、スタティックしておく。

```GlobalClass.cs
using System.Net.Http;

public class GlobalClass
{
    public static HttpClient httpClient = new HttpClient();
}
```

#本題
##POSTクラス作成
```PostClass.cs
using System.Net.Http;
using Newtonsoft.Json;

public class PostClass
{
    // Webhook URLをコピってペ
    private const string postUrl = "";

    // POST本体。
    public async Task<bool> PostMethod(string titleText, string bodyText, string urlText, string colorText)
    {
        // 送信パラメータ作成
        var attachment = new Attachment()
        {
            color = colorText,
            title = titleText,
            title_link = urlText,
            text = bodyText
        };
        var sendParams = new SendParameters()
        {
            attachments = new List<Attachment> { attachment },
            text = "ワイはbotやさかい、日本語がOK牧場じゃないところは堪忍してやー。",
            channel = "#random"
        };

        // パラメータクラスをJSONにシリアライズ。
        var paramJson = JsonConvert.SerializeObject(sendParams);

        // POSTデータを作成
        var sendData = new Dictionary<string, string>
        {
            { "payload", paramJson }
        };
        var content = new FormUrlEncodedContent(sendData);

        // POST!!
        var res = await GlobalClass.httpClient.PostAsync(postUrl, content);

        return (res.StatusCode == System.Net.HttpStatusCode.OK);
    }
}
```
##呼び出すところ
```c#
var postClass = new PostClass();
var isOk = await postClass.PostMethod("グーグル", "中の人何人くらいで動かしてるんやろ", "https://www.google.co.jp", "#ff0000");
```

#結果
こんな感じに表示されます。
![qiita1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241095/dd42e50e-7b5b-d4a2-c3de-6ee3ba6389b7.jpeg)

#エピローグ
もうちょっと色々やりたい場合、この辺見ると、
attachmentsのほかの要素などが書いてあるので、参考になるのかなと思いましたって。
https://api.slack.com/incoming-webhooks
Raspberry Pi Zero WにインストールしたRaspbian BusterにUSB経由でSSH接続する

Raspberry Pi Zero WにRaspbian Busterをインストール（書き込み）までできたのはいいのですが、Wi-Fiにつなぐのがすんなりできなかったので、いったんUSB経由でSSH接続してWi-Fiの設定をすることにしました。その過程で、引っかかったところがあったので備忘録として記載します。

#用意したもの
・Raspberry Pi W Zero
・USBケーブル(Aオス - micro Bケーブル)
・micro SDカード(今回はKingston micro SDXC 64GB Class10)
※モニターがないのでMacのターミナルで操作する前提

#インストールしたRaspbian (OS)
・Raspbian Buster with desktop and recommended software(2019-07-10)
　https://www.raspberrypi.org/downloads/raspbian/

#インストール
・下記サイトを参考にSDカードへ書き込みを実施。
　dskst's diary : Raspberry Pi 3 を Mac でセットアップする
　https://dskst9.hatenablog.com/entry/2018/05/12/190425

#USB経由(USB-OTG)でSSH接続するための手続き
##書き込んだSDカードへの下準備
2つのテキストファイルの編集と1つのファイル作成を実施する
・まずターミナルでSDカードボリュームへ移動

```
$ cd /Volumes/boot
```

・次に"boot"直下のcmdline.txt(1行しかないファイル)をvimで開き、その中の"rootwait"と"quiet"の間に"modules-load=dwc2,g_ether"を記述する

（下記のように記述して上書き保存）

```
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_ether quiet init=/usr/lib/rasPi-config/init_resize.sh quiet splash plymouth.ignore-serial-consoles
```

・続いて同じく"boot"直下のconfig.txtの末尾を下記のように編集

 ```
# Enable audio (loads snd_bcm2835)
 dtparam=audio=on
 [pi4]
 # Enable DRM VC4 V3D driver on top of the dispmanx display stack
 #dtoverlay=vc4-fkms-v3d   //この行をコメントアウト
 #max_framebuffers=2
 [all]
 #dtoverlay=vc4-fkms-v3d
 dtoverlay=dwc2 //この行を追加
```

・最後に"boot"直下に"ssh"ファイルを新規作成

```
touch ssh
```

(念の為きちんとできているか確認、"ssh"があればOK)

```
$ ls
COPYING.linux			bcm2710-rpi-3-b-plus.dtb	fixup4.dat			kernel.img			start4db.elf
LICENCE.broadcom		bcm2710-rpi-3-b.dtb		fixup4cd.dat			kernel7.img			start4x.elf
bcm2708-rpi-b-plus.dtb		bcm2710-rpi-cm3.dtb		fixup4db.dat			kernel7l.img			start_cd.elf
bcm2708-rpi-b.dtb		bcm2711-rpi-4-b.dtb		fixup4x.dat			overlays			start_db.elf
bcm2708-rpi-cm.dtb		bootcode.bin			fixup_cd.dat			ssh				start_x.elf
bcm2708-rpi-zero-w.dtb		cmdline.txt			fixup_db.dat			start.elf
bcm2708-rpi-zero.dtb		config.txt			fixup_x.dat			start4.elf
bcm2709-rpi-2-b.dtb		fixup.dat			issue.txt			start4cd.elf
```

・SDカードを取り出す(FinderでもOK)

```
$ diskutil unmount /Volumes/boot
```

#Raspberry pi Zero WにUSB経由でSSH接続する
・USBケーブルをRaspberry Pi Zero Wの"USB"ポート(PWR INではない)とMacを接続し、ラズパイ側のLED点滅が終わるまで待つ
・点滅が落ち着いたのち、ターミナルからSSH接続する
![20190722_171725.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297732/2ba60045-6828-a646-3999-7b74102775c5.jpeg)


```
$ ssh pi@raspberrypi.local
```

接続ができると、下記メッセージが表示される

```
The authenticity of host 'raspberrypi.local (fe80::ce13:6828:d295:83dd%en4)' can't be established.
ECDSA key fingerprint is SHA256:4mVcnFAesdeSepuyW7bW+h5RLfcOMcEpTA1mK8QReAg.
Are you sure you want to continue connecting (yes/no)?
```

ここでyesを入力すると、パスワード入力を求められる：

```
pi@raspberrypi.local's password: 
```

ここで初期パスワードの"raspberry"を入力する。
![スクリーンショット 2019-07-22 17.19.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297732/f3a6a664-9d53-7414-2c9c-cb34db09d1ef.png)



これでUSB経由でのSSH接続は完了です。このあとにWi-Fiの設定などを行います。
bashを使ったシェルスクリプト上での文字列置換

シェルスクリプトで文字を置き換えるとき、以下のように`sed`コマンドを使うことが一般的だと思います。

```
$ sed -e 's/変更前の文字列/変更後の文字列/g' ./file.txt > ./file-new.txt
```

ファイル内の文字列全部を書き換えるときは確かに`sed`コマンドが便利だし直感的です。
実は他にもbashの標準機能を使うことで文字列単体を置換することもできるので、今回はその方法を解説します。

## bashを使う



```
#!/bin/bash

tmp="/dir1/dir2/dir3/1234_Abcde_01.jpg.html"
echo ${tmp#/}
echo ${tmp##*/}
echo ${tmp%%.*}
echo ${tmp/d/D}
echo ${tmp//d/D}
hoge=${tmp##*/}
echo ${hoge%%.*}
```

例えば、上記のようなシェルスクリプトを書くと以下のように変換されます。

```
dir1/dir2/dir3/1234_Abcde_01.jpg.html
1234_Abcde_01.jpg.html
/dir1/dir2/dir3/1234_Abcde_01
/Dir1/dir2/dir3/1234_abcde_01.jpg.html
/Dir1/Dir2/Dir3/1234_abcDe_01.jpg.html
1234_Abcde_01
```

やってる処理を順番に書くと

1. 先頭の`/`を取り除く
2. 末端の`/`までまとめて取り除く
3. 末尾の`.`を取り除く(`%なら末尾から1つ目の.*を取り除く`)
4. 先頭の`d`を`D`で置換
5. 全ての`d`を`D`で置換
6. 2と3の複合型

覚えておくと、変数に代入したちょっとした文字列を変換する時に便利。
ファイル単位で変換したい時は`sed`のほうが使いやすそうです。



## メモ

これ書いてるときに解消したエラーについて。
bash(シェルスクリプト)で条件文を書こうとしているときに

```
 [: =: unary operator expected
```

のようなエラーが出た時は以下のようにして対処。

```
  if [ "$var" = '' ]; then
    echo 'テストecho'
  fi  
```
`"$var"`と書くのと`半角スペースを正しく記載する`のがポイントのようです。
（シェルスクリプトは半角スペースや改行の指定の仕方に注意ですね）


## 参考
[シェルスクリプトによる置換や削除](https://eng-entrance.com/linux-shellscript-replacement)
[空行を検出するスクリプトを書いていた](http://karoten512.hatenablog.com/entry/2018/01/19/002558)
[Bash の if 文（test文）のオプションを整理してみた](https://qiita.com/wakayama-y/items/a9b7380263da77e51711)
[Bashで正規表現マッチした文字列を取り出す](https://qiita.com/rockhopper/items/bee538ab4c6aabcd6b0f)
EC2(Amazon Linux 2)にmariaDBを導入する

#今回の目的
先輩から教えてもらったサーバー構築の備忘録、物理サーバーでやったことをAWSで確認中。
mariadbをインストールし,EC2内でログインする。前回下の原因でできなかったDBをインストールします。

##注意事項
Amazon Linux 2のインスタンスを使用すること。Amazon Linuxだとmariadbがサポートされていません！

##インストール

```
# インストール
$ sudo yum install -y mariadb-server

# 起動
$ sudo systemctl start mariadb

# 有効化
$ sudo systemctl enable mariadb
$ sudo systemctl is-enabled mariadb

# セキュリティ設定　rootのパスワード等を設定します。全部Yでもいいかなと思っています。
$ sudo mysql_secure_installation
Set root password? [Y/n]
Remove anonymous users? [Y/n]
Disallow root login remotely? [Y/n]
Remove test database and access to it? [Y/n] n
Reload privilege tables now? [Y/n]
 ...
Thanks for using MariaDB!


```

#ログインしてみよう
```
#ルートユーザーでログイン、パスワード付きで
mysql -u root  -p

Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 23
Server version: 10.3.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

#ログアウト
MariaDB [(none)]> exit
Bye
```

これでmariadbがEC2内で使えるようになりました。大規模でなければRDSでなくてもいいと思います。
次はSSL認証をやっていこうと思います。それでは！

#参考文献
[Amazon Linux 2でサーバ作成 (Apache2.4+PHP7.2+MariaDB)](https://qiita.com/reflet/items/3359762dd1e2e1c39509)
pythonをストレスなく使う！（Python Pocket Reference (O'REILLY)が、分かり易いっ)

#背景
Keras関連のpythonのコードで、
numpy配列の以下のような処理があり、

```
test_xxx_prediction[test_xxx_prediction >= 0.5] = 1
```
   ※test_xxx_predictionは、numpy配列

numpyの”fancy indexing”というようなものも、知らなかったので、
調査に手間取った。
泥縄式に調べる過程で、表題（下記）のPocket Referenceが、わかりやすいなと感じたので、、、
その旨、情報共有。(ただし、このリファレンスは、当然、numpy自体は範囲外です。）

　Python Pocket Reference, 5th Edition 
　Python In Your Pocket
　By Mark Lutz 
　Publisher: O'Reilly Media

（　出典：http://shop.oreilly.com/product/0636920028338.do　）

![cat.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/a002827a-92f1-8d7a-d42a-020d296f899d.gif)


#目的
　**pythonをストレスなく使う！**
そのためには、少しでも、理解のレベルを上げる必要あり。
なんでも、こだわって、、、、理解を深める。
ここで記載しているのは、
**Python Pocket Reference (O'REILLY)が、分かり易いっ**です。

Pocketなので、

 - 表が多用されており、
 - 網羅的
 - しかも、端的に整理されている。

”5th Edition”であり、人気があるのでは？


#分かり易いっ例１

indexing,Slicingの説明。
以下、本項、すべて抜粋の形で引用。

## Table3.Sequence operations (抜粋）

|Operation|Description|Class method|
|:---:|:---:|:---:|
|S[i]|Index by offset|\_\_getitem\_\_|
|S[i:j],S[i:j:k]|Slicing:items in S <br>from offset i through<br> j-1 by optional strike k|\_\_getitem\_\_|

## Sequence Operation Notes

Indexing:S[i]
・Fetches components at offsets(first item is at offset 0).
・.....

Slicing:S[i:j]
・Extracts contiguous sections of a sequence,from i through j-1
・...


#分かり易いっ例２
listのcopyの説明が、**スキがない。**
単に、Make a copyでなく、**top-level(shallow)**の文言が
入っているのが、手短で、的確。

>L.copy()
 Make a top-level(shallow)copy of L.  ...


#まとめ
何度か、
**Python Pocket Reference (O'REILLY)が、分かり易いっ**
と感じたことがあるので、記事にした。

以前、
[pythonをストレスなく使う！（結局docs.python.orgのreferenceが納得感が高い気が、、、)](https://qiita.com/enoughspacefor/items/9f714c9d4a13b6f1eaa9)
と記載したが、
端的にまとまっているという意味では、
**「Pocket Reference (O'REILLY)」が一番**だと思う。



#関連（本人）

[pythonをストレスなく使う！（結局docs.python.orgのreferenceが納得感が高い気が、、、)](https://qiita.com/enoughspacefor/items/9f714c9d4a13b6f1eaa9)
[pythonをストレスなく使う！（generatorに詳しくなる。since1975らしい。)](https://qiita.com/enoughspacefor/items/524a76fcde2610b9da8a)
[pythonをストレスなく使う！（Pythonでは、すべてがオブジェクトとして実装されている)](https://qiita.com/enoughspacefor/items/0c6118da4c228226a65f)
[pythonをストレスなく使う！（Pylintに寄り添う)](https://qiita.com/enoughspacefor/items/df692b27bb58ca1ffa1d)
[pythonをストレスなく使う！（ExpressionとStatement)](https://qiita.com/enoughspacefor/items/1a11f553c265a2c703f2)
[英語と日本語、両方使ってPythonを丁寧に学ぶ。](https://qiita.com/enoughspacefor/items/d4b49747773e2d0285f9)

#今後
コメントなどあれば、お願いします。:candy:
勉強します、、、、
Azureアーキテクチャガイドまとめ 2【N層】

## はじめに
[**Azureクラウドアプリケーションアーキテクチャガイド**](https://azure.microsoft.com/ja-jp/campaigns/cloud-application-architecture-guide/)より、7つあるアーキテクチャスタイルの一つ、**N層アーキテクチャ**に関してまとめます。

#### 連載目次
[Azureアーキテクチャガイドまとめ 1 【はじめに】](https://qiita.com/Catetin0310/items/74249f333d9fbfccd543)
Azureアーキテクチャガイドまとめ 2【N層】 → 本記事
[Azureアーキテクチャガイドまとめ 3 【Webキューワーカー】](https://qiita.com/Catetin0310/items/fe0729549faeee843e8a)
[Azureアーキテクチャガイドまとめ 4 【マイクロサービス】](https://qiita.com/Catetin0310/items/06ab890a04baa161cac6)
[Azureアーキテクチャガイドまとめ 5 【CQRS】](https://qiita.com/Catetin0310/items/d0e8b489f6501e4da90b)
[Azureアーキテクチャガイドまとめ 6 【イベントドリブンアーキテクチャ】](https://qiita.com/Catetin0310/items/58f65242a7b71620825b)
[Azureアーキテクチャガイドまとめ 7 【ビッグデータアーキテクチャ】](https://qiita.com/Catetin0310/items/d515fc3fdff68b54f408)
[Azureアーキテクチャガイドまとめ 8 【ビッグコンピューティングアーキテクチャ】](https://qiita.com/Catetin0310/items/eebd754637dcda8ad14d)


## 概要
N層アーキテクチャと呼ばれるもの中で代表的なものが、以下の三層アーキテクチャです。

- プレゼンテーション層
- 中間層
- データ層

下記の例では、中間層が二つ(Middle Tier 1 / Middle Tier 2)あり、別々の機能を持たせています。名称はとっつきにくいですが、よく見るような一般的な構成です。

![2019-07-22_15h32_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/a7f1c258-e18f-f6e5-9bea-b3238467cec2.png)



以下のような特徴を持つアプリケーションに適したアーキテクチャスタイルです。

- **単純なWebアプリケーション**
- オンプレアプリをAzureに**最小限のリファクタリング**で移行
- オンプレアプリとクラウドアプリの統一的開発

特徴は以下の通り。

- **一般的なIaaSアプリ**としての実装
- レイヤー
    - 論理レイヤーと物理レイヤーに分断し、**責任を分離**し、**依存関係を管理**する
    - 上位レイヤーは下位レイヤーのサービスを利用可。逆は不可
- 2種のアーキテクチャ
    - クローズドレイヤー (直下のレイヤーのみを呼び出し可)
    - オープンレイヤー (下のすべてのレイヤーを呼び出し可)


### 利点
- オンプレ/クラウド間の**移植性**が高い
- エンジニアにとって**学習コスト**が低い
- 異種混在環境(Windows/Linux)への適合性が高い


### 課題
- 各機能の**独立展開不可**
- **管理コスト**が高い
- 大規模システムの**セキュリティ管理**が難しい場合あり
- 中間層が無意味に待ち時間を増やす場合あり


### ベストプラクティス
スケーラビリティ、信頼性、セキュリティの各層の境界として**サブネット**を活用し、以下の**マネージドサービス**を利用する

- キャッシング
- オートスケール
- ロードバランサ
- メッセージング
    - 各層の分離に非同期メッセージングを使用
- データストレージ
    - アクセス制限のため、中間層からの要求だけ許可
    - 高可用性実現のため、可用性グループを使用

### 対応するAzureサービス
各層のコンピューティングに**Virtual Machine**を利用し、マネージドサービスを追加していく形です。アイコンと一緒に覚えてしまいましょう。

![02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/109b05f9-2b88-be31-670a-3ae40730fe67.jpeg)


### まとめ
N層アーキテクチャの特徴と、使用されるサービスについて見ていきました。次回はWebキューワーカーについてまとめます。お楽しみに！

## 参考リンク
[**Azureアーキテクチャセンター**](https://docs.microsoft.com/ja-jp/azure/architecture/)
[**Azureクラウドアプリケーションアーキテクチャガイド ダウンロードページ**](https://azure.microsoft.com/ja-jp/campaigns/cloud-application-architecture-guide/)
「sqlite3」と「postgres」の違い /  datebase

#はじめに
私は、大学4回生で、将来的にプログラミングは武器になると感じ、勉強中です。
現在、未来電子テクノロジープログラミング開発コースに所属しています。
今回は、Dockerとdjangoを使用している際に気になったdatabase関連についてお話しします。
それは、「sqlite3」と「postgres」の違いについてです。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#「sqlite3」とは
sqlite3は、デフォルトで「sqlite3」というデータベースを使うように設定されており、settings.pyファイルの中の以下の部分で設定されています。
特徴は、以下です。
・データが1つのため、バックアップが容易
・MySQLより高速
・無料
・パスワード設定がない
つまり、django用のデータベースです。


#「postgres」とは
postgresは、世界で1番使われているMySQLに対抗するデータベース管理システムです。
特徴は、以下です。
・オープンソース
・SQLの標準規格に対する準拠度が高い 
 ・マルチバイト対応
・無料（有料もあり）
つまり、postgresは無料のオープンソースソフトウェアです。

#まとめ

「sqlite3」と「postgres」の違いについて完全に理解は、できていません。
利用回数を増やし、理解を増やしていきたいと思います！！
アロー関数はthisを束縛しないとかいう謎文言について考える

# アロー関数はthisを束縛しないとかいう謎文言について考える
ES6で導入されたアロー関数式は従来のfunction式の代替構文ではあるものの、純粋な[糖衣構文](https://ja.wikipedia.org/wiki/糖衣構文)ではありません。
特にthisの扱いが異なることは有名です。

具体的にどう違うのかと言うと、アロー関数のthisは宣言時のスコープにおけるthis固定である一方、function式におけるthisは呼ばれ方によって決まります。
加えてアロー関数のthisはapplyやcallで上書きすることは出来ませんし、bindで新しい関数を作っても上書きされません。

## 「アロー関数はthisを束縛しない」
この特徴に対し、「アロー関数はthisを束縛しない」という説明がよくされています。
が、この文言よく意味が分かりません。
字面やthisの動きだけ見ると、アロー関数の方がthisの値が変わらないわけでより値を束縛してそうに見えます。

### 出所と原文
おそらく、この文言の出所は[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions)かと思われます。


>アロー関数式は、より短く記述できる、通常の function 式の代替構文です。また、this, arguments, super, new.target を束縛しません。アロー関数式は、メソッドでない関数に最適で、コンストラクタとして使うことはできません。

いかにも直訳しました感が漂う文言なので、英語の原文も見てみます。

>An arrow function expression is a syntactically compact alternative to a regular function expression, although without its own bindings to the this, arguments, super, or new.target keywords. Arrow function expressions are ill suited as methods, and they cannot be used as constructors.

直訳かと思いきや意外と意訳してました。
なんにせよ、
「this(中略)を束縛しない」は「without its own bindings to the this(中略)keywords.」
に相当するようです。

### its own bindings to the this
ここで出てくる「its own bindings to ... keywords.」の意味は、javascriptでfunction式で宣言された関数を実行する際に関数内限定で特定の値が特定のキーワードに対し自動で代入、設定されることを指します。
例えば、argumentsには引数が配列のようなArgumentsオブジェクトの形で入りますし、new.targetにはundefinedかコンストラクタや関数への参照が入ります。

ここで示されているのは、アロー関数式で生成した関数にはこれらの処理が行われませんよ、ということです。
関数内で特別に値が上書きされないので、thisやargumentsと言った値の参照先は、
javascriptの一般的な文法に則ってレキシカルスコープで探索されます。

thisは予約語なのでちょっと特別感がありますが、例えばargumentsは普通に変数名として使えるものなので、
アロー関数の横で変数宣言しているとそれが拾われたりします。

```js
const arguments = [1,2,3];
var arrow = () => console.log(arguments);
var func = function(){
  console.log(arguments);
};
arrow("hoge");//[ 1, 2, 3 ]
func("hoge");//[Arguments] { '0': 'hoge' }

```

よって、
「without its own bindings to the this (中略) keywords.」
の訳は、
「this(中略)に対して関数内独自の値を束縛しません」
が正しいはずです。

## まとめ
* アロー関数ではfunctionでは暗黙的に行われるthisなどに対する値の束縛がない
* 「thisを束縛しない」という謎文言の意味するところはこれ
* 正直誤訳に近いのでは？
zabbix4.2のダッシュボードが表示されない

# トラブル

 * zabbix: AWS EC2
 * db: AWS RDS

zabbixのダッシュボードが表示失敗するので調査。RDSのCPUが急上昇、同然「現在のアクティビティ」数も急上昇中。
dbを再起動すると、正常になった。

# 対応
調査のため、RDSの「パフォーマンスインサイト」を有効化。
「現在のアクティビティ」が接続数からセッション数に変わった。
そのセッションがリンクになっているので押してみると、「パフォーマンスインサイト」が開かれた。
「データベースのロード」の「SQL」を見ると、問題の遅いクエリが見えた。

```SQL
SELECT DISTINCT  e.eventid,e.clock,e.ns,e.objectid,e.acknowledged,er1.r_eventid
FROM events e
left JOIN event_recovery er1 ON er1.eventid=e.eventid
WHERE e.source='0' AND e.object='0' AND e.objectid='18502' AND  e.eventid<='52409906' AND e.value='1'
ORDER BY e.eventid DESC
LIMIT 20
```

「LIMIT 20」を外すと、早くなるのでINDEX不足だと分かる。
ということはzabbixのバグかな。普段はカスタマイズせずFIXを待つのだが。
後日、またサービス障害が起きたのでやむを得ずINDEXを追加した。

```SQL
ALTER TABLE `event_recovery` ADD INDEX `event_recovery_idx_eventid_eventid` (`eventid`,`r_eventid`);
ALTER TABLE `events` ADD INDEX `events_idx_source_object_object_value_eventi` (`source`,`object`,`objectid`,`value`,`eventid`);
```

早い！というか正常に戻った。
![2019-07-22 16.05.48 ap-northeast-1.console.aws.amazon.com 6f4882b9657b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249425/7c4d0c7e-5344-d5b3-acdf-02b9ef3e47c4.png)


# 参考
https://support.zabbix.com/browse/ZBX-15079
https://support.zabbix.com/browse/ZBX-13417

寺島広大氏からzabbixの企業理念を聞いたとき鳥肌が立った。素晴らしい会社。
ScalaでPowerAssertを使う

DiagrammedAssertionsを紹介する記事がQiitaにないことに気付いたので書いておこうと思いました。

ScalaにExpectyというpower assertのライブラリがありますが、
(参考:[Expecty を用いた power assert を復活させる](http://eed3si9n.com/ja/power-assert-with-expecty))
Scalatestを使っている場合は、Expectyを使わなくてもDiagrammedAssertionsでpower assertできます。

```scala
import org.scalatest.{DiagrammedAssertions, FunSpec}

class ExampleSpec extends FunSpec with DiagrammedAssertions {
  it("example") {
    assert(2 * 3 === 5)
  }
}
```
```
> ExampleSpec:
> - example *** FAILED ***
>   assert(2 * 3 === 5)
>            |   |   |
>            6   |   5
>                false (ExampleSpec.scala:7)
```
細かい使い方は[DiagrammedAssertionsのScalaDoc](https://static.javadoc.io/org.scalatest/scalatest_2.13/3.1.0-SNAP13/org/scalatest/DiagrammedAssertions$.html)を見るといいです。
既存DBから ActiveRecord::Attributesのattribute を雑に生成するスクリプト

Rails 5 から導入された ActiveRecord::Attributes では、レコードのカラムをRuby側のコードに明示して、デフォルト値や型変換などに役立てることができます。

```ruby
class User < ApplicationRecord
  attribute :id, :integer
  attribute :name, :string
  attribute :email, :string
end
```

ですが、Rails 5 以前からアップデートしてきた場合には、当然、`attribute` は定義されていません。では、DB定義とにらめっこしながら、手打ちするしかないのでしょうか？

# 雑に生成するスクリプト

`.connection` のメソッドを使えば、テーブル名やカラム定義にアクセスできます。なので、こんなスクリプトを書けば良いでしょう。

```ruby
# columns.rb
# bin/rails r columns.rb のように実行する

# コネクションを取得
conn = ApplicationRecord.connection

# 抽出したいテーブル名を書く
tables = %w[
  users
  products
]

# カラムの情報を出力する
tables.each do |t|
  puts t
  conn.columns(t).each do |c|
    puts "  attribute :#{c.name}, :#{c.sql_type_metadata.type}"
  end
end
```
パーティション化戦略の変更機能を試す（Oracle Database 18c）

# パーティション・テーブル
　パーティショニング機能はテーブルをパーティションと呼ばれる単位で物理的に分割し、管理性とパフォーマンスを向上させる機能です。Oracle Database Enterprise Editionに加えて、Partitioningライセンスを購入することで利用できます。
　パーティション分割は基本的に列値によって行われます。パーティション化戦略（Partitioning Storategy）として、値の範囲（RANGE）、特定の値（LIST）、ハッシュ分割（HASH）とそれらの組み合わせ（コンポジット）を選択することができます。以前のバージョンでは、パーティション化戦略を後から変更することはできませんでした。Oracle Database 18cでは、RANGEパーティションから、HASHパーティションのように、パーティション化戦略を変更することができるようになりました。ONLINEオプションを指定することで、アプリケーションが稼働したままテーブルの変更を行うこともできます。

# 準備
パーティション・テーブルPART1を作成します。C1列に対して5つのパーティションを持つRANGEパーティション・テーブルです。パーティション・テーブルが作成できたらダミーのデータを格納します。

```
SQL> CREATE TABLE part1 (c1 NUMBER PRIMARY KEY, c2 NUMBER, c3 VARCHAR2(10))
         PARTITION BY RANGE(c1) (
             PARTITION p1 VALUES LESS THAN(100000),
             PARTITION p2 VALUES LESS THAN(200000),
             PARTITION p3 VALUES LESS THAN(300000),
             PARTITION p4 VALUES LESS THAN(400000),
             PARTITION p5 VALUES LESS THAN(500000)
         );

表が作成されました。

SQL> INSERT INTO part1 SELECT LEVEL c1, 100 c2, 'data1' c3 FROM DUAL
         CONNECT BY LEVEL < 500000;

499999行が作成されました。
```

LOCALインデックスをC2列に、GLOBALインデックスをC3列に作成します。

```
SQL> CREATE INDEX idx1_part1 ON part1(c2) LOCAL;

索引が作成されました。

SQL> CREATE INDEX idx2_part1 ON part1(c3) GLOBAL;

索引が作成されました。
```

# パーティショニング戦略の変更

この状態からPART1テーブルをRANGEパーティションからHASHパーティションに変更します。ALTER TABLE MODIFY PARTITION文を実行します。ALTER TABLE文にONLINEを指定しているため、アプリケーションの動作を妨げません。

```
SQL> ALTER TABLE part1 MODIFY
         PARTITION BY HASH(c1) (
             PARTITION p1,
             PARTITION p2,
             PARTITION p3,
             PARTITION p4
         ) 
         ONLINE
         UPDATE INDEXES (
             idx1_part1 LOCAL,
             idx2_part1 GLOBAL
         );

表が変更されました。
```

　内部的には新しいパーティション・テーブルを作成してデータの移動を行っていると思われるため、実行には時間がかかります。

# 確認

　ALTER TABLE文実行後の状態を確認します。USER_PART_TABLESビューを確認すると、4パーティションを持つHASHパーティション・テーブルに変更されていることがわかります。

```
SQL> SELECT table_name, partitioning_type, partition_count FROM USER_PART_TABLES;

TABLE_NAME                     PARTITION PARTITION_COUNT
------------------------------ --------- ---------------
PART1                          HASH                    4

```

インデックスの状態を確認します。これまでになかったLOCALインデックスがなぜか１つ増えています。


```
SQL> SELECT index_name FROM USER_INDEXES WHERE table_name='PART1';

INDEX_NAME
------------------------------
SYS_C007857
IDX1_PART1
IDX2_PART1

SQL> SELECT index_name, locality FROM USER_PART_INDEXES;

INDEX_NAME                     LOCALI
------------------------------ ------
IDX1_PART1                     LOCAL
SYS_C007857                    LOCAL
```

追加されたインデックスの対象列を確認します。

```
SQL> SELECT column_name FROM USER_IND_COLUMNS WHERE index_name='SYS_C007857';

COLUMN_NAME
------------------------------
C1
```

C1列に対してLOCALインデックスが作成される理由はわかりませんが、オンラインでパーティショニング戦略を変更できることは確認できました。
マニュアルは [Oracle Database VLDBおよびパーティショニング・ガイド](https://docs.oracle.com/cd/E96517_01/vldbg/release-changes.html#GUID-4470CAFE-CFE4-4DB0-9A32-A6FF49F8368E) です。
Toolbarメモ

## StatusBar 透明化の正しい方法

http://y-anz-m.blogspot.jp/2016/02/statusbar.html

## Lollipopより前のバージョンでToolbarに影を表示する

API Level 21よりまえは```android:elevation```が使えないので、shapeで影を表現する。

```xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="top"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/color_alizarin"
        android:titleTextAppearance="@color/White"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- **** Place Your Content Here **** -->

        <View
            android:layout_width="match_parent"
            android:layout_height="5dp"
            android:background="@drawable/toolbar_dropshadow" />
    </FrameLayout>
</LinearLayout>
```

```xml:toolbar_dropshadow.xml
  <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <gradient
        android:startColor="@android:color/transparent"
        android:endColor="#88333333"
        android:angle="90"/>
    </shape>
```

```xml:color.xml
<color name="color_alizarin">#e74c3c</color>
```
Android Architecture Componentsメモ

# Room

## データの変更があっても、通知されない（Room + Dagger2）

以下のようにDaoでデータを取得するメソッドの戻り値をLiveDataにすると、その後データに変更があった場合に通知してくれる。


```kotlin:MailDao.kt
@Dao
interface MailDao {

    @Query("SELECT * FROM mail")
    fun loadMail(): LiveData<List<Mail>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertMails(mails: List<Mail>)

    @Query("DELETE FROM mail")
    fun clearTable()
}
```

```kotlin:MailViewModel.kt
var mailList: LiveData<List<Mail>> = mailDao.loadMails()
```
```kotlin:InboxFragment.kt
mailViewModel.mailList.observe(this, Observer { mailList ->
            if (mailList == null) {
                return@Observer
            }

            adapter?.setMailList(mailList.toMutableList())
        })
```

しかし、データの追加・変更をしても通知が来ない。
原因はDaggerでインスタンスを生成するときにシングルトンにしてなかったから。
```@Singleton```を追加して無事変更の通知が来ました。

```kotlin:AppModule.kt
    @Singleton  // ★追加
    @Provides
    fun provideMailDatabase(app: Application): MailDatabase = Room.databaseBuilder(app, MailDatabase::class.java, "mail").allowMainThreadQueries().build()

    @Singleton  // ★追加
    @Provides
    fun provideMailDao(database: MailDatabase) = database.mailDao()
```


参考：[Room - LiveData observer does not trigger when database is updated
](https://stackoverflow.com/questions/44742445/room-livedata-observer-does-not-trigger-when-database-is-updated)
Fragmentがバックスタックから再表示された時にonResume()を呼び出す


```java
FragmentManager mgrFragment = getSupportFragmentManager();
 mgrFragment.addOnBackStackChangedListener(getListener());
        mgrFragment.beginTransaction().add(R.id.fl_home, frgNearby).addToBackStack(null).commitAllowingStateLoss();
```



```java

private FragmentManager.OnBackStackChangedListener getListener() {
        FragmentManager.OnBackStackChangedListener result = new FragmentManager.OnBackStackChangedListener() {
            public void onBackStackChanged() {
                FragmentManager manager = getSupportFragmentManager();

                if (manager != null) {
                    Fragment currFrag = (Fragment) manager.findFragmentById(R.id.fl_home);

                    currFrag.onResume();
                }
            }
        };
        return result;
    }
```
etherjsの使い方 - Eventの拾い方 (1) -

## これは何？
* web3.jsからether.js派になった@salvaがetherjsの使い方を雑にメモするよ
* イベントのとり方
* RLPエンコードされたEventデータをデコードするところまでやるよ

## やること
* 適当なコトントラクトからイベントを取得
* イベント開始取得点のblockNumberを適当に指定
* RLPデコードしてイベントの中身を取り出す


### コード例
```typescript
// ethersライブラリの読み込み
import { ethers } from "ethers";
// RLP(ないしABIの）デコーダ
import { defaultAbiCoder } from 'ethers/utils/abi-coder';

// 適当に設定のこと
const address = "XXXX"
const abi =  [] 

// イベント取得の開始点にしたいblockNumber
fromBlockNumber = 1000
// providerを適当に作るURLをhttp://localhost:8545のような形で与える
const provider = new ethers.providers.JsonRpcProvider(ethereumURL);
// イベントの取得開始点を設定
provider.resetEventsBlock(fromBlockNumber)

// contract Objectを作成
const contract = new ethers.Contract(address, abi, provider)
// contractオブジェクトからfilter関数を叩いてfilterを生成
const eventName = "SampleEvent"
const filter = contract.filters[eventName]()

// イベントデータのデコードに使うイベントのinterfaceオブジェクト
const eventInterface = contract.interface.events[eventName
   
contract.on(filter,  (...args) => {
   const arg1 = args[0]
   const arg2 = args[1]
   // eventオブジェクト
   const event = args[args.length - 1]
   const eventRLPData = event.data // RLPエンコードされたイベントデータ
   const decodedEvent = defaultAbiCoder.decode(eventInterface.inputs, eventRLPData)
   console.log(decodedEvent
})
```

## Pros / Cons
* Pros
    * ether.js + TypeScriptの方が型定義がしっかりしているので使いやすい
    * 例えば末尾に示すようなABIの型定義などをつかってゴニョゴニョしたりするコードがweb3に比べるとシュッとかける
　 * Contractオブジェクトを生成するとRLPのデコードに必要なオブジェクトなどを同時に作ってくれるので、使いやすい感がある
* Cons
    * 現行のバージョン(4.x) ではイベントのフィルターにblockNumberが使えない

## おまけ
FuntionFragment, EventFrangmentのような型が定義されており、JSONに書かれたABIを読み込むときなどにうまく使えるので便利

```typescript
import ethers from "ethers"
import { FunctionFragment, EventFragment } from "ethers/utils"

export interface ContractListConfig {
    readonly contracts: ContractConfig[]
}

interface ContractConfig {
    readonly name: string
    readonly address: string
    readonly deployedBlockNumber: number
    readonly abi: (FunctionFragment|EventFragment)[] // ABIの配列の要素の型定義
}

```
構造体配列への書き込みはアドレスを渡して行う


自分用のメモです

構造体配列に書き込むときに
｢アドレス渡しにしなかったことで書き込めていなかった｣
というバグを何回かやらかしたのでメモ

以下の構造体bombを配列(キュー)として扱いたい

```c:
//爆弾の構造体 座標(x,y) と 残り時間time を保持する
typedef struct {
    int x, y;
    int time;
} bomb;

bomb bomb_queue[QUEUE_SIZE];  //bomb構造体の配列(キューとして扱う)
int bq_head;                  //キューの先頭要素の位置
int bq_num;                   //キューの要素数
```

この構造体配列に書き込むとき
以下のようにいちいち配列にアクセスしたくないので

```c:
//新しい爆弾を座標(x,y)にセット 
void set_new_bomb_1(int x, int y) {
    bomb_queue[bq_head+bq_num].x = x;
    bomb_queue[bq_head+bq_num].y = y;
    bomb_queue[bq_head+bq_num].time = 10000;
    bq_num++;
}
```

以下のように書いて エラーを起こした
tbomb に 構造体配列のアドレスを渡していないので
tbomb.x = x としても 構造体配列bomb_queueの要素に書き込めていない  (コンパイルは通る)
tbomb.xに書き込んでもtbombはこの関数を抜けるときに消える

```c:
void set_new_bomb_bug(int x, int y) {
    bomb tbomb = bomb_queue[bq_head+bq_num];
    tbomb.x = x;
    tbomb.y = y;
    tbomb.time = 10000;
    bq_num++;
}
```

正しくは以下のようにする
bomb型のポインタtbombを宣言し, 書き込みたい構造体配列のアドレスを渡す

```c:
void set_new_bomb_2(int x, int y) {
    bomb *tbomb = &bomb_queue[bq_head+bq_num];
    tbomb->x = x;
    tbomb->y = y;
    tbomb->time = 10000;
    bq_num++;
}
```


まとめ

```c:pointer_bug.c
//
//  pointer_bug.c
//
//  ポインタでやってしまったバグ
//

#include <stdio.h>
#include <string.h> //memcpy実装に必要

#define QUEUE_SIZE 100

//爆弾の座標(x,y)と残り時間timeを保持する構造体bomb
typedef struct {
    int x, y;
    int time;
} bomb;

bomb bomb_queue[QUEUE_SIZE];  //bomb構造体の配列(キューとして扱う)
int bq_head;                  //キューの先頭要素の位置
int bq_num;                   //キューの要素数

//新しい爆弾を座標(x,y)にセット 
void set_new_bomb_1(int x, int y) {
    bomb_queue[bq_head+bq_num].x = x;
    bomb_queue[bq_head+bq_num].y = y;
    bomb_queue[bq_head+bq_num].time = 10000;
    bq_num++;
}

//上のようにいちいち配列アクセスしたくないので以下のように書いた
//しかし tbomb に 構造体配列のアドレスを渡していないので
//tbomb.x = x としても 構造体配列bomb_queueの要素に書き込めていない    (コンパイルは通る)
void set_new_bomb_bug(int x, int y) {
    bomb tbomb = bomb_queue[bq_head+bq_num];
    tbomb.x = x;
    tbomb.y = y;
    tbomb.time = 10000;
    bq_num++;
}

//正しくは以下のようにする
//bomb型のポインタtbombを宣言し, 書き込みたい構造体配列のアドレスを渡す
void set_new_bomb_2(int x, int y) {
    bomb *tbomb = &bomb_queue[bq_head+bq_num];
    tbomb->x = x;
    tbomb->y = y;
    tbomb->time = 10000;
    bq_num++;
}


int main() {
    set_new_bomb_1(10, 20);
    printf("bomb x=%d, y=%d\n", bomb_queue[0].x, bomb_queue[0].y);
    /*  ↑   bomb x=10, y=20 と正しく表示される */
    set_new_bomb_bug(30, 40);
    printf("bomb x=%d, y=%d\n", bomb_queue[1].x, bomb_queue[1].y);
    /*  ↑   bomb x=0, y=0 と不正な値が表示される */
    set_new_bomb_2(50, 60);
    printf("bomb x=%d, y=%d\n", bomb_queue[2].x, bomb_queue[2].y);
    /*  ↑   bomb x=50, y=60 と正しく表示される */


}

```
Ralisでのアプリケーション作成の流れ(第1章)

#はじめに
この記事はRuby on Railsを学習して二か月の超初心者が作成している記事です。
ある程度の大まかな流れが分かってきたので、アウトプットの意味も込めて記事にしました。
誤字脱字、間違った解釈をしている内容に関しては、修正またはご指摘をお願いします。

---
###使用するクラウド
AWS cloud9

###使用するデータベース
mysqld

---


##作成前準備

 ・mysql関連ファイルのインストール

```ターミナル.
$ sudo yum install mysql-devel
```
・mysqlの実行

```ターミナル.
$ sudo service mysqld start
```

・ bundlerのインストール

```ターミナル.
$ gem install bundler
#bundler=Gemを管理するためのGem
```

・ruby on railsのインストール

```ターミナル.
$ gem install rails --version="5.2.1"
```

---
#新規アプリケ―ションの作成
・アプリケーション作成

```ターミナル.
$  rails new アプリケーション名 -オプション名
```

・今回のdbはmysqldを使用するのでオプションのところにmysqldを指定する

```ターミナル.
$ rails new アプリケーション名 -d mysql
```
実行後、ディレクトリにmysqlというデータベースに最適化された設定でアプリケーションが生成される。

##railsアプリケーション
・rails new で作成したアプリケーションは、アプリケ―ション名のディレクトリが作成される。
・ディレクトリ以下のファイル全て**railsアプリケーション**という

##Gemの追加
・Gemの追加は「Gemfile」に「gem ‘Gem名’」と追記する。

```Gemfile.
gem 'gem名'
```
・追加後「bundle install」コマンドを実行する。

```ターミナル.
$ bundle instll
```

ここで第一章は終了。
Kaggleでcommitせずに作成ファイルをダウンロードする方法

kaggleで作成したモデルやsubmitファイルをダウンロードしたいと思ったことはありませんか
私は毎回ダウンロードするためにcommitを行なっていたのですが、下記のメソッドを記載すればcommitしなくてもファイルをダウンロードできます

```
from IPython.display import HTML
import pandas as pd
import numpy as np

def create_download_link(title = "Download file", filename = "filename"):  
    html = '<a href={filename}>{title}</a>'
    html = html.format(title=title,filename=filename)
    return HTML(html)

-----------------ここまで-------------------
# 使い方の例
df = pd.DataFrame(np.arange(1000), columns=['data'])
df.to_csv('submission.csv')
create_download_link(filename='submission.csv')
```

みんなでkaggle lifeを楽しみましょう
AtCoder Beginner Contest 002


###A - 正直者

問題文をちゃんと読まず、早速1敗(正直者）

```py
R=int(input());
L=int(input());
if R < L:
  print(L)
else
  print(R)
```

input側の設定はちゃんと読もう！

```py
L, R =map(int, input().split());
if R < L:
  print(L)
else:
  print(R)
```

###B - 罠

特段語ることもなく。

```py
I = list(input())
C = ['a', 'i', 'u', 'e', 'o']
s = str()
for i in I:
  if i not in C:
    s += i
print(s)
```

・他のAC
⇒ 正規表現モジュールreのsubメソッドで
　 正規表現による文字列置換が出来るらしい。お世話になりそうだ。

```py
import re;print(re.sub('[aiueo]','',input()))
```

###C - 直訴

ヘロンの公式を使ってやりたかったけど上手く出来なかった…。
(エラーコード)

```py
import math
import numpy
x1, y1 , x2, y2 , x3, y3 = map(int, input().split())
H = sorted([abs(y1 - y2), abs(y2 - y3), abs(y3 - y1)])
W= sorted([abs(x1 - x2), abs(x2 - x3), abs(x3 - x1)])
W1 = abs(W[0]-W[1])
W2 = abs(W[0]-W[2])
H1 = abs(H[0]-H[2])
a = numpy.array([W[0], W[1]])
b = numpy.array([W[1], W[2]])
c = numpy.array([H[0], H[2]])
d = a - b
e = b - c
f = c - a
x = numpy.linalg.norm(d)
y = numpy.linalg.norm(e)
z = numpy.linalg.norm(f)
s = (x + y + z) / 2
num = math.sqrt(s*(s-x)*(s-y)*(s-z))
print(num)
```

妥協案として、底辺×高さ÷2で普通に三角形の面積を出す。
しかし未だにこの答えで全パターン網羅出来ていることに納得できていない…。

```py
x1, y1 , x2, y2 , x3, y3 = map(int, input().split())
H = [abs(y1 - y2), abs(y2 - y3), abs(y3 - y1)]
W= [abs(x1 - x2), abs(x2 - x3), abs(x3 - x1)]
t = abs((W[0] * H[2] - H[0] * W[2]) / 2)
print(t)
```
Terasic DE0-nano最高動作クロックを探る

Terasic DE0-nanoの最高動作クロックを探ってみた

## 設定
### Platform Designer 構成
Nios2、PLL、オンチップメモリの最低限の構成

- nios2_gen2
- altpll
 - inclk0 50MHz
 - areset,locked端子を削除
 - c0 output clock frequecnyを順番に設定
- onchip_memory
 - Total memory size 32768
- sysid_qsys
- jtag_uart


### Quartus Prime
トップモジュールにCLKとRESET端子のみ設けて、nios2インタスを作成する単純な構成

```top.v
module top(
	CLK,
	KEY_0
);

input					CLK;
input					KEY_0; //RESET

display_qsys u0 (
     .clk_clk       (CLK),       //   clk.clk
     .reset_reset_n (KEY_0)  // reset.reset_n
);

endmodule
```
### Timing Analyzer
タイミング制約ありのときの設定

```top.sdc
create_clock -period 20.000 [get_ports {CLK}]
derive_pll_clocks
derive_clock_uncertainty
```


## 結果

### 100MHz
1. タイミング制約なし：Hello worldする。
1. タイミング制約あり：試していない

### 150MHz
1. タイミング制約なし：System ID Not found
1. タイミング制約あり：Hello worldする。

### 200MHz
1. タイミング制約なし：System ID Not found
1. タイミング制約あり：Hello worldする。

### 300MHz
1. タイミング制約なし：試していない
1. タイミング制約あり：System ID Not found

## 考察
DE0-Nanoに搭載のCycloneIV　EP4CE22F17C6N FPGAのカタログスペックは
　PLL Output frequency  472.5MHz
　Clock Tree Performance for Cyclone IV Devices  500MHz (Device:EP4CE22  Performance:C6)
であるので、300MHzは動くことを期待したけども、搭載のSDRAMコントローラが100MHzまでであることと、
DE0nanoのNios2サンプルコードも100MHzになっているので、実用限界はそういうことかも。
設定次第で改善の余地ある？
https://forums.intel.com/s/question/0D50P00003yyPJaSAM/maximum-clock-speed-for-cyclone-iv?language=en_US

##追記
300MHz版で、PLL設定を`Operating Mode:With no compesation`にしてみたけど変化なし。

##追記の追記
こんなことしなくても、マクニカにデバイス毎の動作周波数の資料が掲載されてた。 
https://service.macnica.co.jp/support/faq/126137
ドキュメントによるとCyncloneIV(EP4CGX30CF19C6)ではNiosII/fで160MHz,NiosII/eでは170MHzであるから、200MHzで動いても保証外と判断したほうがよさそう。
〜1年前まで現場人だった初心者がWebサービスを開発する物語〜　ビングマップの導入

#超初心者がビングマップを自分のサービスに入れてみた
皆さんはじめましてNaokiです！
いきなりですがビングマップってみなさん知って居ますか？？
ビングマップは自分のサービスにマップを使ったサービスを使いたい時に使う物で
誰でも簡単にマップを使ったサービスを作る事が出来ます。
今回はこんな便利なビングマップの導入の仕方や便利な使い方をみんさんにご紹介します！
##いろんな機能が紹介されているサイト  ビングマップGO
ビングマップGO（https://mapapi.org/）
こちらはビングマップを使ったサービスを作るのに必要な材料が載っているサイトで究極
コピペで出来てしまいます笑
またビングマップクエリと言って全てコピペするだけで出来てしまうものも掲載されています。

##実際にビングマップGOを使ってみる
（https://mapapi.org/）まずはビングマップGOに移動します。
ビングマップGOには様々なコピペで使える材料が沢山有るので自分のサービスに
使いたいものを選びコピーします。

##注意点
ビングマップGOはほとんどそのままで使う事が出来ますが一つだけ変更しないと
行けない点があります。
それは<script src='https://www.bing.com/api/maps/mapcontrol?callback=GetMap&key=[  *** Your BingMapsAPI key. *** ]' async defer></script>の中の[  *** Your BingMapsAPI key. *** ]の部分を自分のkeyに変更してください！

##keyの取得の仕方
（https://www.bingmapsportal.com/）ここでSign inを押すとアカウントを作成する画面でアカウントを制作してください
自分のkeyを取得することが出来たら[  *** Your BingMapsAPI key. *** ]の部分を変更してください。
するとマップの真ん中にあった帯が表示されなくなります。
Laravelのリレーションがわかりづら過ぎるので忘備録

LaravelのEloquentのリレーションのID指定が個人的にものすごく分かりづらいので忘備録です。
忘備録なので、他人が読んで理解できるかどうか、は考慮せずに書いてあります。ご了承ください。


|利用する関数名|第一引数|第二引数|第三引数|第四引数|第五引数|第六引数|
|:-----:|-----|-----|-----|-----|-----|-----|
|hasOne|相手先モデル|あっち|こっち||||
|belongsTo|相手先モデル|こっち|あっち||||
|hasMany|相手先モデル|あっち|こっち||||
|belongsToMany|相手先モデル|結合テーブル|こっち|あっち|||
|hasManyThrough|相手先モデル|中間モデル|中間外部|あっち外部|こっち|中間|


**用語**
こっち：この関数を記述しているモデル。指定した相手先モデルが参照に利用しているカラム名。
あっち：指定した相手先モデル側がこの関数へ参照を持つために利用しているカラム名。
相手先モデル：この関数を利用することにより結合したいモデルの名前。
結合テーブル：この関数を記述しているモデルと、相手先モデルを結合するために使用するテーブルの名前。
中間モデル：この関数を記述しているモデルと、相手先モデルを結合するために利用するモデルの名前。
中間外部：中間モデルがこの関数を記述しているモデルと結合するのに利用しているカラム名。
あっち外部：相手先テーブルが、中間モデルと結合するのに利用しているカラム名。


なお、原則に沿って関数・テーブル名・モデル名をきちんと作成・使用していればこれらの引数は意識しなくても勝手に補完される。
**複雑なのでなるだけこれらの引数は利用しないで済むのが好ましい。**
termux on GeminiPDAでsoracom cliを動かす

# これは

Android上にLinux + terminal環境を実現するtermux上で、soracom cliを動かしたときのメモです。
あれこれ試行錯誤した上でクリーン環境での再検証をしていないので、もしかしたら手順が抜けてるかもしれませんがその際はご指摘いただけたら修正いたします。

# termuxとは

termuxは、Android上にLinux + terminal環境を実現するアプリです。rootを取る必要は無く、普通にPlayストアからダウンロードできます。

詳しくは[公式ページ](https://termux.com/)をご覧ください。

# termuxにsoracm cliをダウンロードしてみる

termuxをインストールしたら、普通にsoracom cliをダウンロードしてみましょう。私は[GeminiPDA](https://store.planetcom.co.uk/collections/gemini-pda/products/gemini-pda-1)で試しているからアーキテクチャはArmになるので(ほとんどのAndroid端末はそうだと思います)、[soracom cliのgitページ](https://github.com/soracom/soracom-cli/releases)から、「soracom_(バージョン番号)_linux_arm」をダウンロードしてきます。

早速実行してみると、こんな感じです。ダウンロードしたファイルには実行権限ついてないのでchmodを忘れずに。

```bash
%cp (ダウンロードしたフォルダ)/soracom_(バージョン番号)_linux_arg soracom
%chmod +x soracom
%./soracom 
A command line tool to invoke SORACOM API

Usage:
  soracom [command]

Available Commands:
  auth               Performs authentication to access to the SORACOM API.
  bills              Show or export billing info.
  completion         Generate script for bash or zsh completion.
  configure          Show, create or update configurations (profiles).
  configure-sandbox  Create configurations (profiles) for API Sandbox.
  coupons            List or register coupons.
  credentials        List, create, update or delete credentials sets.
(省略)
```

はい、動きましたね？さすがgo、どこでも動きます。
あとはアカウントのセットアップをいつも通りすれば完了・・だったらいいんですけどね(´･ω･`)

# あれ、動かない・・

soracomコマンド自体は動くのですが、ネットワークに接続する必要のある動作を実行すると全く動きません。
あれこれ検索したところ、どうもこの辺が該当しそうです。

[dns lookup issue when running my Go app in termux](https://stackoverflow.com/questions/38959067/dns-lookup-issue-when-running-my-go-app-in-termux)

要約すると

- Linuxのリゾルバは/etc/resolv.confの有無を調べ、なければlocalhost:53にアクセスしてホスト名解決しようとする
- termuxはroot取らないため(?)ちょっと特殊な形で/usr/etc/resolv.confになっている
- termuxのlibc(?)はこちらを見るようにパッチが当たってる
- しかし、クロスコンパイルしたgoのバイナリはこのパッチが当たってないリゾルバを使っているので/etc/resolv.confを見に行き、それがないのでlocalhost:53にアクセスしてだんまりになる

ということのようです。はて困った。

# バイナリを自前でビルドしましょう

方法は色々ありえますが、手っ取り早いのはtermuxでビルドしてしまえばいいわけです。
ただ、READMEに載っている

```bash
bash scripts/build.sh (バージョン番号)
```

を実施すると全てのアーキテクチャのバイナリをクロスコンパイルしようとして途中でこけるので、自分が使う分だけビルドしましょう。

まずはgo環境とgitのインストール。ソースコードをZIPで落としてくるならgit不要ですが、せっかくなのでいれておきましょう。

```bash
%apt-get install golang git
```

ソースコードをcloneします。

```bash
%git clone https://github.com/soracom/soracom-cli.git
```

ビルドしましょう。

```bash
%cd soracom-cli/soracom
%go build
```

ビルドに成功したら、カレントディレクトリにバイナリが出来てるので試してみましょう。

```bash
%./soracm subscribers list
[
        {
                "apn": "soracom.io",
(出力略)
````

無事動きました。あとはこのバイナリをパスの通ったところにでも置いておきましょう。

# まとめ

termuxを使えばAndroid端末にお手軽にLinux + terminal環境が作れ、そこでsoracom cliも動かせます。
キーボードついたSIMフリー端末であるGeminiPDAにSoracom Air挿してcli動かすと色々捗りますね！
CCWDMコンパクト粗波長分割マルチプレクサの4つの利点

CCWDMは、コンパクトCWDM、コンパクトコース波長分割マルチプレクサ、コンパクトコース波長分割マルチプレクサです。 ＣＣＷＤＭモジュールの出現により、追加のファイバを追加することなく、ファイバネットワークを競合しアップグレードする方法が可能になる。

CWDMとCCWDMの主な違いは、CCWDMコリメータとフィルタが共通の基板にはんだ付けされているのに対し、CWDMシステムは低コストの無冷凍分布帰還型（DFB）レーザを使用している点です。

波長チャネルが2つのレンズとその特定の波長に一致するTFFで構成されるCWDM固有の波長用の3ポートフィルタ。 各フィルタの反射ポートは次のフィルタの共通ポートに接続されており、フィルタはCWDMマルチプレクサであるファイバコネクタによって接続されています。

![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/23d03c0a-1088-31f0-a7e2-d8c3796592b2.jpeg)

小型ＣＣＷＤＭ粗波長分割多重装置は、入力ファイバから多波長光信号が入力される小型自由空間ＣＷＤＭ装置である。

![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/2ef313a8-730c-b08b-d0c4-50ddc619e728.jpeg)
原理は、入力レンズ上の波長λ１、λ２、・・・λｎの光信号を第１のフィルタに集束させるために入力レンズを使用することであり、波長λ１の光信号は第１のフィルタを通過し、第１の出力レンズに結合される。 第１の出力ファイバでは、波長λ１の光信号が分離され、残りの光信号は、全ての信号が分離されるまで、第１のスライドによって次のスライドに反射され、以下同様である。 波長チャネル間の結合は、「Zhi」線のHuaizhi光の形をとることによって達成される。

上記の原則に基づいて、CCWDMには次の利点があります。
1.小型パッケージ
CWDMモジュールは、光ファイバー線の最小曲げ半径によって制限されているため、パッケージのサイズを小さくしすぎると、ボックス内のスペースの大部分がアイドル状態になります。 ＣＣＷＤＭの隣接チャネルは、ファイバの代わりに自由空間内でカスケードするために平行ビームを使用する。 カスケードに使用されるファイバがないと、CCWDMパッケージのサイズを大幅に減らすことができます。 標準の4CH CWDMのサイズは80×60×12 mmで、YiyuantongのCCWDMモジュールのサイズは50×27×7.7 mmで、標準のCWDMパッケージサイズの1/4にすぎません。 高密度環境で広く使用することができます。
![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/8902f4e6-99f5-bcfa-d697-b400308ca7fc.jpeg)

2.低挿入損失
CWDMとCCWDMは異なるレイアウト方法と異なるパッケージング方法を採用しているため、損失の差が生じる要因も異なります。 CWDM挿入損失に影響を与える主な要因は、コリメータとコリメータの間の結合損失とフィルタ損失です。 カスケードモードが異なるため、CWDMで使用されるコリメータの数はCCWDMの2倍になります。これは、特に信号数が多い場合、必然的に大きな損失を招くことになります。

3.安定性が良い
小型ＣＷＤＭ装置は、反射ビームの傾きを減少させるように構成されているので、ＣＷＤＭよりも温度に対する感受性が低い。 CCWDMは粗いフィルタ面と接続されているため、結合力はCWDMの結合力よりはるかに大きく、反射ビームの傾きを最小限に抑えることができ、反射ビームの傾きがデバイスのTDLにおける最も重要な要素です。 たとえば、Yiyuantongの4CH CCWDMデバイスは、-40°C〜85°Cの動作温度範囲を持ち、さまざまな環境に適応できます。

4.高いスケーラビリティ
CCWDMには4/8/10チャネルがあり、拡張ポートチャネルに加えて、拡張端末を通じてより多くのチャネルを拡張できます。

![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/86eb8b5b-fd6f-d054-1911-6be01facdbee.jpeg)

さらに、ＣＣＷＤＭは、従来のＣＷＤＭと比較して、高温安定性および高い信頼性という特徴を有する。 その小さいパッケージサイズ、超低光路損失および温度のために、ＣＣＷＤＭモジュールは波長分割多重化システム、受動光ネットワーク、および放送ケーブルＴＶネットワークにおいて広く使用されている。

HYC は光通信パッシブ基本部品の研究開発、製造、販売およびサービスを専門とする国家ハイテク企業です。 同社の主力製品は以下のとおりです。光ファイバコネクタ（データセンター高密度光コネクタ）、波長分割マルチプレクサ、光スプリッタおよびその他の3コア光パッシブ基本コンポーネント、家庭用光ファイバ、4Gモバイル通信で広く使用されている、 インターネットデータセンター、防衛通信、その他の分野
mysqlでrootのpasswordを変更しようとしてSyntaxエラー吐かれた

## password関数で変更しようとした
rootのpasswordを変更に関する多くの解説記事ではpassword関数で変更しようとしていますが、


```
mysql> update user set password=password('********') where user = 'root';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('********') where user = 'root'' at line 1
```

## password関数は廃止されていた

[MySQL8でユーザーのパスワードの変更 / リセット方法](http://www-creators.com/archives/5574)
はい、ありがとうございます。
ver. 5.6.7時点でどうやら廃止されたようでした。

```
mysql> set password for 'root'@'localhost' = '********';
Query OK, 0 rows affected (0.02 sec)
```
小ネタ: IBM CloudのAIランタイム WML(Watson Machine Learning)のAPIがV4になってます(2019-07)


![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/1d708e0c-d03d-1e55-43e8-d6d7bfd608b1.png)

# 要は(TR;DL)
- Watson Machine Learningの新API がV4として公開されてます
- AutoAIやDecision Optimizationなどの新機能はV4 API使ってます
- 新機能をPythonから使うならクライアント・ライブラリーはアップデートしておきましょう(watson-machine-learning-client_V4)

# はじめに
えらくニッチな話題ですいません。以下、Watson Studioや**Watson Machine LearningをAPIやPythonクライアントなどからプログラムを介して触ってる方のみに関係する話**です。ツールのUIのみ使っている方はAPIの層は隠されているので意識不要です。

あまり告知されていないので初耳かもしれませんがIBM CloudでAIのランタイムであるWatson Machine Learningが機能拡張し、**V4のAPIやPythonクライアント**が提供されています。以下がAPIドキュメントへのリンクです。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/4ba19fdc-d72e-5ad5-a08e-e5d9a8bec423.png)

| 種類 | 新(V4) | 旧(V3)|
|:---|:---:|:---:|
| API | [新文書へのリンク](https://watson-ml-v4-api.mybluemix.net/)|[旧文書へのリンク](https://watson-ml-api.mybluemix.net/)|
| Python Client | [新文書へのリンク](https://wml-api-pyclient-dev-v4.mybluemix.net/)|[旧文書へのリンク](https://wml-api-pyclient.mybluemix.net/)|

# 知っておくといいこと

- WML V4のAPIは、従来のAPIとは異なっています
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/978fafa7-bcd7-3e10-9890-f2e757186f4c.png)
 APIの種類＝できることも増えています
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/8439d934-f586-e771-689b-96e6fa9c51f6.png)

- 従って、V4 APIに対応したPython Clientも別のものになっています
 
モジュールの名前が**watson-machine-learning-client-V4**になり、**Python 3.5以上が前提**です

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/12886a74-c4fa-534e-a31e-faf70a0760c9.png)

```bash:導入の方法
pip install -i https://test.pypi.org/simple/  watson-machine-learning-client-V4
```
Pythonクライアントの場合、pip installすべきモジュールの名前や提供される機能は変わってますが**プログラムでimportするPython Clientの名前はV3とV4で同じ**です。ここ、ややこしいのでご注意ください。
>from watson_machine_learning_client import WatsonMachineLearningAPIClient

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/00addc9e-7973-2bd3-f89f-12119567b467.png)


- 現時点、**V3とV4は並存**です。上述の通りAPIの文法自体が違うので並存可能。基本的には新しいほうを使うべきなのでしょうが、どちらを使うかは現時点は利用者に委ねられています。 

- 最近のWatson Studioの新機能であるAutoAIやWMLの新機能 Decision OptimizationはV4 APIを使っており、古いV3環境からは見えなくなっています。**Python ClientからV4 API対応のAutoAIで作ったモデルアクセスしたい場合はPythonライブラリーをアップデートしておきましょう**

【例】
**V3**クライアント・ライブラリー環境でWMLのモデルを照会したら4件表示されました。これらのモデルはModel Builder/SPSS Modeler/NeuNetSで作ったものです。
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/affc5374-acca-8a1c-1756-ae6f8ee3d91f.png)

同じ環境で**V4**クライアント・ライブラリー環境でモデルを照会したら、上記以外にAutoAIとDecisionOptimizationのモデルも追加で+3件表示されました。逆に言うと、**V3ライブラリーではこれらのオブジェクトは認識できていない**、ということです。
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/05fc70cf-c0f0-bb18-a8b4-0492034e307a.png)

以上、ニッチな話ですが自分が使ってて「あれ？」と思ったのでメモしておきました。
AWSのEC2インスタンス内(本番環境)の整え方(自動デプロイ後の方法)

※全てのコマンドは、本番環境のディレクトリで行うこと。

#1.Railsを起動する。

##(1).起動方法

ローカル環境でのアプリのディレクトリにおいて、自動デプロイ(Capistranoを使った自動デプロイ)を行う。

```
 bundle exec cap production deploy
```

##(2).シャットダウン方法

###①.起動しているプロセスの確認方法

```
ps aux | grep unicorn
```
コマンドを実行すると、unicorn_rails masterと表示されている(unicornの文字の部分は、赤字で表示されている。)行の一番左から、ec2-userの隣に表示されている4桁〜６桁くらい(?)の数字を確認する。
ちなみに、この数字のことをプロセスというらしい。


###②.プロセスの切り方

Killコマンドで、上記コマンドで確認したunicorn_rails masterのプロセスを止める。

```
sudo kill -9  数字(unicorn rails masterのプロセスID)
```


#2.webサーバー(Nginx)を起動する。

webサーバー(Nginx)の再起動

```
sudo service nginx restart
```


#3.MySQLを起動する。

MySQLの再起動

```
sudo service mysqld restart
```
[Docker]ローカル開発用Postgres

## 概要

ローカル開発で使用してPostgresサーバを立てたい場合に、Dockerで簡単にPostgresサーバを起動する方法です。
また、今回のサンプルはデータをローカルのストレージに永続化します。
[サンプル](https://github.com/tchnkmr/docker-development-postgres.git)

## 手順

### Postgresの使用するDockerイメージの取得

以下のコマンドにて使用するPostgresのDockerイメージを取得します。\<version\>は使用するMySQLのバージョンです。[Postgresバージョン](https://hub.docker.com/_/postgres)

`docker pull postgres:<version>`

### docker-compose.yml作成

docker-composeファイルを作成します。必要に応じて各項目を変更してください。

```yaml
version: '3'

services:
  postgres:
    image: postgres:<version>
    ports:
      - 5432:5432
    volumes:
      - <local_storage>:/var/lib/postgres/data
    environment:
      - POSTGRES_PASSWORD=<password>

```

| 項目 | 内容 |
|:-----|:----|
|version|取得したMySQLのバージョン|
|local_storage|データを保存するローカルパス|
|passwrod|ルートパスワード|

### 起動

`docker-compose up -d`

### 停止

`docker-compose stop`