OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi→AWS IoT→dynamoDB にデータ送信

チュートリアルをやって雰囲気がわかったので、dynamoDBにデータを書き込むところまでできたメモをまとめした。

# 全体の流れ
1. AWS IoT Coreでモノ・証明書・ポリシーを作成
2. ルールを作成
3. dynamoDBでテーブルを作成
4. RasPiプログラム側にAWS IoT Coreへデータ送信する行を実装
5. AWSIoTの「テスト」機能を使って確認

です。

作業を進める中で参考にさせて頂いた記事：
[DynamoDBに書き込む AWS IoT のルールの作り方](https://qiita.com/ekzemplaro/items/ccf5e18cc074ed5dd700)
[ラズパイ３上のPythonでMQTTの通信をやってみる](http://ino-h.com/blog/2017/02/15/mqtt.html)
[AWS IoTにPythonでMQTTイベントの送信、受信するまで](https://symfoware.blog.fc2.com/blog-entry-2224.html)
[import error！パスを通す？？pythonあるある。](https://qiita.com/arumiti/items/835e87c35dcbb69d8ca2)

## 1. AWS IoT Coreでモノ・証明書・ポリシーを作成
今回はチュートリアルと違って、モノを新規作成→1-Click 証明書作成 (推奨) で証明書を作ってRasPi側にダウンロードしておきます。証明書をポリシーとモノにアタッチします。

## 2. ルールを作成
の途中で
## 3. dynamoDBでテーブルを作成
[DynamoDBに書き込む AWS IoT のルールの作り方](https://qiita.com/ekzemplaro/items/ccf5e18cc074ed5dd700)
基本的には↑の通り進めますが、なぜかうまくいかなかったメモとして、事前にdynamoDBを作ってからこのルールで選択して進めると成功しませんでした。なので、**ルールを作っている途中で**テーブルを選ぶときに「新しいリソースを作成する」を押してdynamoDBの作成画面に飛び、DBを作成する。が良いと思います。
上記の記事ではjsonを送ってテストすることになってるんですが、私はテストプログラムの中にてjson形式でメッセージ送信することにしました。
なのでDBができたらいちどこのステップは終わりにします。

## 4. RasPiプログラム側にAWS IoT Coreへデータ送信する行を実装
`from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient`
からエラーを吐いたので心が折れそうになりましたが、下記の記事を読んでパスを通してみたところ無事できました。
[import error！パスを通す？？pythonあるある。](https://qiita.com/arumiti/items/835e87c35dcbb69d8ca2)

`import sys
sys.path.append('usr/local/lib/.......')
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient`

jsonファイルを送る、じゃなくてプログラムの中でjson形式にして送るようにして、いろいろ試しながらテストしてみました。

```python:test_basicPubSub.py
import logging
import getopt
import time
import json
import datetime
import sys
sys.path.append('usr/local/lib/.......')
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient

def customCallback(client, userdata, message):
  print('Received new message')
  print(message.payload)
  print('from Topic')
  print(message.topic)
  print('--------\n\n')

Ymd = datetime.datetime.now().strftime("%Y/%m/%d")
sending_msg = json.dumps({"deviceid":"Raspi-1","time_in",Ymd,"sentmessage":"this is a test from RasPi1"})

myMQTTClient = AWSIoTMQTTClient('mycliId') #適当で良い
myMQTTClient.configureEndpoint('エンドポイント',8883) #8883はポート
myMQTTClient.configureCredentials('rootCA.pem','privatekey','nnn-certificate.pem.crt') #証明書3つ、同じフォルダ内に置いてます
myMQTTClient.configureOfflinePublishQueueing(-1)
myMQTTClient.configureDrainingFrequency(2)
myMQTTClient.configureConnectDisconnectTimeout(10)
myMQTTClient.configureMQTTOperationTimeout(5)
myMQTTClient.connect()

myMQTTClient.subscribe("AWSIoTのテストに入れるトピック名", 1, CustomCallback)
myMQTTClient.publish("AWSIoTのテストに入れるトピック名", sending_msg, 1)
```

## 5. AWSIoTの「テスト」機能を使って確認
トピックのサブスクリプション　欄に上記テストコードの中で"AWSIoTのテストに入れるトピック名"に入れたトピック名を入れて、しばらく(2-3分)経ってから4のテストコードを実行。
RasPi側から送ったsending_msgの内容が表示されたら成功です！
続いてAWSIoTのコンソールからdynamoDBに移動して、データが入ってきていればこちらも成功です(・∀・)！

---

色々はまったところがありましたが、先人の皆さんのおかげでうまいことできました。
上記のテストコードがうまくいったら、後はほぼこれを使いまわして色んなものに埋めていけばいいので、ここで少々時間がかかっても確認ができてよかったです。
※メモ　Bitnami MEAN  (MongoDB password reset) 　

Edit the /opt/bitnami/mongodb/mongodb.conf file and replace the following lines:

````
# Turn on/off security.  Off is currently the default
#noauth = true
auth = true

# Disable the HTTP interface (Defaults to localhost:27018).
#nohttpinterface = true
setParameter = enableLocalhostAuthBypass=0
````
with:

````
# Turn on/off security.  Off is currently the default
noauth = true
#auth = true

# Disable the HTTP interface (Defaults to localhost:27018).
#nohttpinterface = true
#setParameter = enableLocalhostAuthBypass=0
````

Restart the MongoDB server:

````
cd /opt/bitnami
sudo /opt/bitnami/ctlscript.sh restart mongodb
````
Create a new administrative user with a new password. Run the following commands to do so (remember to replace NEWPASSWORD with the new one you want to set):

````
mongo
> db = db.getSiblingDB('admin')
admin
> db.changeUserPassword("root", "NEWPASSWORD")
````
Revert the modifications made to /opt/bitnami/mongodb/mongodb.conf by replacing:

````
# Turn on/off security.  Off is currently the default
noauth = true
#auth = true

# Disable the HTTP interface (Defaults to localhost:27018).
#nohttpinterface = true
#setParameter = enableLocalhostAuthBypass=0
````
with:

````
# Turn on/off security. Off is currently the default
#noauth = true
auth = true

# Disable the HTTP interface (Defaults to localhost:27018).
#nohttpinterface = true
setParameter = enableLocalhostAuthBypass=0
````
Restart the MongoDB server again:

````
cd /opt/bitnami
sudo /opt/bitnami/ctlscript.sh restart mongodb
````
C++ - struct vs class

Great explain.

* there is no technical difference. It means that ***class*** and ***struct*** are both belong class data type.
* struct = data is public, with very simple helper methods
* class = strongly encapsulated, data is modified / accessed only through methods
* struct defaults to public access and class defaults to private access.
* When inheriting, struct defaults to public inheritance and class defaults to private inheritance. 

https://stackoverflow.com/questions/54585/when-should-you-use-a-class-vs-a-struct-in-c
https://stackoverflow.com/questions/543515/structs-vs-classes-in-c?noredirect=1&lq=1
https://stackoverflow.com/questions/54585/when-should-you-use-a-class-vs-a-struct-in-c
Swiftでデザインパターン　テンプレートパターン


# テンプレートパターン
- アルゴリズムの骨組みを決めておき、実装はそれを継承したクラスで行う
- 細かい実装を気にせず、protocolで呼び出しできるメリットが有る

# 前提
- JapaneseManとEnglishManという２つのクラスがある
- sayHelloというメソッドがあり、挨拶をそれぞれの国の言葉でできる

```swift
class JapaneseMan {
    func sayHello() -> String {
        return "こんにちは" // 日本語で返す
    }
}

class EnglishMan {
    func sayHello() -> String {
        return "Hello" // 英語で返す
    }
}
```

# 問題
- 似たような関数であるsayHelloを使うのに、classが違うため、面倒
- たとえ話ですが、arrayに無理やり入れようとするとAnyとなる
- AnyではsayHelloを呼び出すことはできず、一度キャストする必要が出てくる

```swift

let peopleArray = [JapaneseMan, englishMan] as [Any]
peopleArray[0] // <- このときanyになる
```

# テンプレートパターン
- protocolで予め骨組みを作成し、各クラスで継承し、実装する
- 配列で使うときなどはprotocolを指定して受け皿を作成し、利用する
- こうすることで実装は気にせず、オブジェクトを抽象的に扱うことができる

```swift

protocol Greetings {
    func sayHello() -> String
}

extension JapaneseMan: Greetings {
    func sayHello() -> String {
        return "こんにちは" // 日本語で返す
    }
}

extension EnglishMan: Greetings {
    func sayHello() -> String {
        return "Hello" // 英語で返す
    }
}

let greetingsArray: [Greetings] = [japaneseMan, englishMan]
greetingsArray[0] // <- このときGreetingsになる
greetingsArray[0].sayHello()
greetingsArray[1].sayHello()
```
C++ - Pointer vs Reference

Clear and simple answer.

1. Once a reference is created, it cannot be later made to reference another object; it cannot be reseated. This is often done with pointers.

2. References cannot be NULL. Pointers are often made NULL to indicate that they are not pointing to any valid thing.

3. A reference must be initialized when declared. There is no such restriction with pointers

https://stackoverflow.com/questions/114180/pointer-vs-reference
XcodeでIPhoneを繋いでビルドした時のエラーを対処した

##nodeのパスを直す
```
こういったエラー
Can’t find ‘node’ binary to build React Native bundle
```
[React-NativeをiOS実機でビルドしたら，node binaryが見つからないとエラーが出た件](https://qiita.com/mkazutaka/items/eca26d441461985d8397)
mkazutakaさんの記事を参考にさせていただきました。

##証明書を発行する
```
こういったエラー文字
 Code signing is required for product type 'Application' in SDK 'iOS 10.0'
```
<img width="750" alt="fNsIk.png" src="https://qiita-image-store.s3.amazonaws.com/0/206790/20c1df41-81f1-d29c-99d5-26201d9753f5.png">

[stackoverflowの質問の](https://stackoverflow.com/questions/37806538/code-signing-is-required-for-product-type-application-in-sdk-ios-10-0-stic)683の回答を参照すればOKでした。

##Signingのプルダウンを変更する
```
こういったエラー
Failed to create provisioning profile. The app ID "hogehoge.hello_world" cannot be registered to your development team. Change your bundle identifier to a unique string to try again.
```
<img width="839" alt="スクリーンショット 2018-09-20 10.56.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/206790/5ad980ff-e296-50b9-ce4a-a1170525a3d5.png">


##Bundle React Native code and imagesを書きコードに書き換える
```
こういったエラー
../node_modules/react-native/packager/react-native-xcode.sh: No such file or directory
```

<img width="839" alt="スクリーンショット 2018-09-20 10.53.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/206790/1f483345-7172-e360-2eb4-b2f120d78da1.png">


```
../node_modules/react-native/packager/react-native-xcode.sh

//↓これに書き換える

../node_modules/react-native/scripts/react-native-xcode.sh
```



##IPnoneにいれたアプリを信頼する

おそらくiPhoneに入ったアプリをタップすると `信頼されていない開発元` と表示されるのでこれを行う
[【iOS 10】iPhoneにインストールしたアプリの「信頼されていない開発元」を“信頼”する手順](https://moshbox.jp/?p=29943)

はじめて自分のiPhoneに作ったアプリがデプロイされると嬉しいですね！！
gatsbyのgatsby-plugin-manifestプラグインを使ってwebmanifestを自動生成する

# gatsby-plugin-manifest

https://www.gatsbyjs.org/packages/gatsby-plugin-manifest/?=gatsby-plugin-manifest

基本はここに書いてあるが、細かな工夫点をいくつか

## そのままの状態ではiPhone Safariの「ホーム画面に追加」のアイコンにならない
![home.png](https://qiita-image-store.s3.amazonaws.com/0/16757/a1fd387a-8ded-cd21-5a15-2873b88b7e36.png)

[react-helmet](https://github.com/nfl/react-helmet)などを使って`head`タグ内に以下を記載

```html
/* icons/icon-48x48.pngなどは、gatsby-plugin-manifestで自動生成される */
<link rel="apple-touch-icon" href="icons/icon-48x48.png" sizes="48x48" />
<link rel="apple-touch-icon" href="icons/icon-72x72.png" sizes="72x72" />
<link rel="apple-touch-icon" href="icons/icon-96x96.png" sizes="96x96" />
<link rel="apple-touch-icon" href="icons/icon-144x144.png" sizes="144x144" />
<link rel="apple-touch-icon" href="icons/icon-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="icons/icon-256x256.png" sizes="256x256" />
<link rel="apple-touch-icon" href="icons/icon-384x384.png" sizes="384x384" />
<link rel="apple-touch-icon" href="icons/icon-512x512.png" sizes="512x512" />
```

## 自動生成の元となる画像が透過や正方形じゃない場合は、iPhoneで背景色ブラック固定になってしまう

### 方法その1
元となる画像を正方形、透過無しでつくる

```js:gatsby-config.js
  {
    resolve: `gatsby-plugin-manifest`,
    options: {
      name: `GatsbyJS`,
      short_name: `GatsbyJS`,
      start_url: `/`,
      background_color: `#f7f0eb`,
      theme_color: `#a2466c`,
      display: `minimal-ui`,
      icon: `src/images/icon.png`, // この画像を正方形、透過無しで作る
    }
  }
```

### 方法その2
gatsbyプロジェクトのルートフォルダに`static`フォルダを作り、背景色のあるアイコンファイルを配置する（ファイル名、サイズは各自設定）。

https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/ConfiguringWebApplications/ConfiguringWebApplications.html

その後に以下のようにlayoutなどで`<head>`に入るように設定する。

```tsx:layout.tsx
import Helmet from "react-helmet"
...
...
<Helmet>
  <link rel="apple-touch-icon" href="/icons/touch-icon-iphone.png"/>
  <link rel="apple-touch-icon" sizes="152x152" href="/icons/touch-icon-ipad.png"/>
  <link rel="apple-touch-icon" sizes="180x180" href="/icons/touch-icon-iphone-retina.png"/>
  <link rel="apple-touch-icon" sizes="167x167" href="/icons/touch-icon-ipad-retina.png"/>
</Helmet>
```



## ![Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/16757/f4a40f3e-49bb-7175-8b89-8a594bdaa6b3.png) タブやブックマークのfaviconだけは自動生成の物にしたくない

faviconはここで指定されているので、自動生成される48x48が上書き出来れば良い。
![source.png](https://qiita-image-store.s3.amazonaws.com/0/16757/1d928147-5801-8feb-fdf2-09662e9c4b32.png)

Adding Assets Outside of the Module System
https://www.gatsbyjs.org/docs/adding-images-fonts-files/
![gatsby-config_js.png](https://qiita-image-store.s3.amazonaws.com/0/16757/58e9ffe3-047f-e09f-839f-6bdd5f09b86b.png)
gatsbyプロジェクトのルートフォルダに`static`フォルダを作りその中に`icons/icon-48x48.png`を作ると、`gatsby develop`時に`gatsby-plugin-manifest`で自動生成されたアイコンを上書きする。



## 画像を変更したけど、faviconのキャッシュが効いてて新しい画像が見えない


### Chromeの場合

強制的にfaviconキャッシュを全部消す

```bash
rm /Users/ユーザー名/Library/Application Support/Google/Chrome/Default/Favicons
```
Elasticsearch の バージョンアップ（備忘録）


filebeat の index の 再作成を先にやっておく。

Elasticsearch を 6.4.x に バージョンアップし、プラグインをバージョンアップする。

```
yum update elasticsearch

# kuromoji 更新
ES_JAVA_OPTS="-Dhttp.proxyHost=proxy.*****.co.jp -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxy.*****.co.jp -Dhttps.proxyPort=8080" /usr/share/elasticsearch/bin/elasticsearch-plugin remove analysis-kuromoji
ES_JAVA_OPTS="-Dhttp.proxyHost=proxy.*****.co.jp -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxy.*****.co.jp -Dhttps.proxyPort=8080" /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji

# user-agent 更新 ※6.7.0～は不必要
ES_JAVA_OPTS="-Dhttp.proxyHost=proxy.*****.co.jp -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxy.*****.co.jp -Dhttps.proxyPort=8080" /usr/share/elasticsearch/bin/elasticsearch-plugin remove ingest-user-agent
ES_JAVA_OPTS="-Dhttp.proxyHost=proxy.*****.co.jp -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxy.*****.co.jp -Dhttps.proxyPort=8080" /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-user-agent

# geoip 更新（インストール Yes/No 聞かれる） ※6.7.0～は不必要
ES_JAVA_OPTS="-Dhttp.proxyHost=proxy.*****.co.jp -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxy.*****.co.jp -Dhttps.proxyPort=8080" /usr/share/elasticsearch/bin/elasticsearch-plugin remove ingest-geoip
ES_JAVA_OPTS="-Dhttp.proxyHost=proxy.*****.co.jp -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxy.*****.co.jp -Dhttps.proxyPort=8080" /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-geoip
```

※user-agent と geoip は elasticsearch 6.7.0 からは elasticsearch にデフォルト入っています。
レスポンシブWebデザインでスマートフォンを横にしたときのスタイルを指定する

##やりたいこと
レスポンシブWebデザインで、スマートフォンを横にした時に表示したくないエリアを`display: none;`にしたい。

##やったこと
cssのメディアクエリを使用しました。

```sample.html
<div class="hide">
　<p>隠したい</p>
</div>
```

```sample.css
@media (max-width: 812px) and (max-height: 414px)  {
    .hide {
        display: none;
    }
}
```
こちらのサイトなどを参考にし（[【2018年4月版】もう迷わない！Webサイト横幅サイズの大正解](https://fastcoding.jp/blog/all/webdesign/designswidth-2018/)）、スマートフォンの最大の縦横幅を探し出したところ、iPhone8Plusの横（414px）とiPhoneXの縦（812px）っぽかったので、それぞれを`max-height`と`max-width`に指定し上記のように記述しました。
※スマートフォンを横にした時のスタイルなので、縦横逆の指定になります。

なお、全ての端末で確認していないのと、これより大きな端末が出てきたら随時対応していく必要があります。。。
rubyとpython数字をゼロで詰めるには：rubyとpythonの両方

rubyやpythonで数字をゼロで詰めたいときがあります。

たとえば8桁を用意して数字が4桁のとき、左側にゼロを4個出力するとかです。

00001234

のように出力したい。

# rubyの場合
rubyにはCのsprintf関数のようなメソッドがあって

    str = sprintf("%08d", i)

のように使えます。

rubyのインタープリターirbで実行しました。

    irb(main):001:0> i=1234
    => 1234
    irb(main):002:0> sprintf("%08d", i)
    => "00001234"


ほかにも便利と思ったら

    str = "%08d" % i
の方法もありました。

こっちのほうがrubyっぽいですかね。

    irb(main):015:0> "%08d" % i
    => "00001234"


# Pythonの場合
Pythonは、zfillメソッドが使えます。

i = 1234

としたあと、iを文字列に変換して

    str(i).zfill(8)
    str(i).zfill(8)
とします。

Python3インタープリターで見てみます。

    >>> i=1234
    >>> print(str(i).zfill(8))
    00001234
『Google アナリティクス初級者向けコース』ユニット１のノート

[Google アナリティクス個人認定資格（GAIQ）](https://support.google.com/partners/answer/6089738?hl=ja)の公式学習コンテンツを受講し、内容をまとめました。
GAIQはこのコースの各ユニットにある確認テストのような形式なので、迷ったらまずこのコースを受講するのがオススメです。
さあ、レッツらトライ！！

# 1. [Googleアナリティクスの紹介](https://analytics.google.com/analytics/academy/course/6/unit/1/lesson/1)
## 1.1 [デジタル アナリティクスの利点](https://analytics.google.com/analytics/academy/course/6/unit/1/lesson/1)
### 到達プロセス
1. Acuisition(集客)
1. Behavior(行動)
1. Conversion(換算)

* モバイルアプリ
* オンラインPOSシステム
* ゲーム機
* 顧客関係管理システム

などのインターネットに接続された各種システムからも収集可能。

---

## 1.2 [Google アナリティクスの仕組み](https://analytics.google.com/analytics/academy/course/6/unit/1/lesson/2)
### 実装手順
1. Googleアナリティクスアカウントを作成
1. サイトの各ページにJavaScriptのトラッキングコードを追加

### 参照可能な情報
* ブラウザの設定言語
* ブラウザの種類
* 端末
* OS
* トラフィックの参照元
	* ユーザがどこからアクセスしたか
		* 検索エンジン
		* クリックした広告
		* マーケティングメール
		* etc...

ユーザの活動に関する情報は、セッションという期間にまとめられ、読み込みのたびに収集・送信される。

**セッション**：トラッキングコードを含むページにアクセスすると始まり、 デフォルトでは **活動がなくなって** 30分経過後に終了。

アナリティクスで処理されたデータは、DBに保存された後には変更不可。
後で分析する可能性があるデータは除外しないように設定する必要がある。

---

## 1.3 [Google アナリティクスの設定](https://analytics.google.com/analytics/academy/course/6/unit/1/lesson/3)

![gaiq_cons.png](https://qiita-image-store.s3.amazonaws.com/0/143784/e923f967-fb0c-91c4-7d13-7159007326ac.png)


### ビューについての注意点
* 新しいビューが含むのは、作成された時点からのデータのみ。
* 削除したビューの復元は、35日以内の内に管理者に限り可能。35日経過後は完全に削除される。

### ユーザ権限
* アカウント・プロパティ・ビューの各単位で他のユーザに権限を割り当てることができる。
* 上位の権限は下位に継承される。

#### 権限の種類
|種類|できること|
|---------------|---|
|ユーザ管理|アカウント・プロパティ・ビューへのアクセスを許可するユーザを追加・削除できる権限。|
|編集|設定を変更できる権限。|
|共有設定|マイレポートや測定の設定などを共有できる権限。|
|表示と分析|データの表示、レポートの分析、マイレポートの作成が可能な権限。|
数学教材

#高校数学教材

有料教材もいいけれど、無料教材があってもいいんじゃないか等と呻く日々。
探すのが大変なのでご存知の方がいらっしゃれば教えていただきたいなと思います。
ひとまず、自作した教材を細々とアップしていきます。
簡単な使用方法を記載するようにしていますので、わからないときはご連絡くださいませ。

基本的にGeoGebraで作成した教材です。一部、javascriptで制御しています。
（余談ですが、GeoGebraのスクリプトエディタが使いやすくなってほしいと願う。）

##高１

###数Ⅰ

####２次関数
- [二次関数の標準形](https://ggbm.at/n7b6y2fv)
- [<img width="258" alt="スクリーンショット 2018-09-27 9.24.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/143341/1670eaf8-b325-3c2d-5d55-1930a8acff34.png">](https://ggbm.at/sqwtz5p8)
- [<img width="273" alt="スクリーンショット 2018-09-27 9.24.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/143341/93ba5837-32b7-cbed-49cf-695ed37ca575.png">](https://ggbm.at/naxgztd2)
- [物体の垂直打ち上げ](https://ggbm.at/gn5fwxcv)

####三角比
- [三角比の符号の確認](https://ggbm.at/few2kqkh)
- [空間図形への応用（三辺が等しい三角錐と外接円と体積）](https://ggbm.at/sqpa3apc)

###数A
#### 図形と性質
- [円と接線 No.1（接線が１本）](https://ggbm.at/dphphh3d)
- [円と接線 No.2（半径と円を通る直線）](https://ggbm.at/bg8ya9js)
- [円と接線 No.3（接線が２本）](https://ggbm.at/rkzrmhdw)

####図形の性質
- [チェバの定理](https://ggbm.at/uct3ehnx)
- [メネラウスの定理](https://ggbm.at/jybayz5k)
- [三角形の辺と角](https://ggbm.at/fm4rzmhq)
- [円に内接する四角形](https://ggbm.at/zazg8zku)

##高２
##高３
tmux使用時にdockerコンテナに入った際、paneの背景色を変えるalias

# 前提
- tmux
- docker

# source
```zsh:.zshrc
alias docker-login='(){tmux select-pane -P "fg=4,bg=colour236"; docker exec -it $1 bash -lc "su - $2";tmux select-pane -P "fg=default,bg=default" }'
```
見たままだけど、内容としては、dockerの中にloginする際にtmuxのpaneのカラーを変更して、抜けたら元の色にもどしている。  
docker execの部分をsshに変更したら、dockerじゃなくてsshでどこかのリモートサーバにログインした時もカラー変更したりできる。

# 使い方

ここの部分はどこかのqiitaに書いてあったまんま

```
# amasokユーザでログイン
docker-login 7b566329da7f amasok
# rootユーザでログイン
docker-login 7b566329da7f
```

これで、dockerにアクセスしてる最中は背景色と文字色が変わる。

```zsh
tmux select-pane -P "fg=4,bg=colour236"
```

上のfgとbgを変えると色を変更できる。
抜けたら元の色に戻る。

# 参考
あったんだけど、忘れた。。見つけられない。。
Unity ML-Agents関連の記事まとめ

## 概要

Unity ML-Agentsに関してよく参考にしている記事をまとめています。

自分用なので、自分記事が若干多めです。随時更新

この記事良かったよーとか、教えていただけると助かります。


## 環境構築

Unity-Technologies/ml-agents/docs/Installation.md
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Installation.md

Using Docker For ML-Agents
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Using-Docker.md

Docker for Macをインストールしてみた
https://qiita.com/scrummasudar/items/750aa52f4e0e747eed68

トレーニング アプリケーションのパッケージング
https://cloud.google.com/ml-engine/docs/tensorflow/packaging-trainer?hl=ja

Macでhomebrewを使ってUnityをインストールする(Unity Hub、日本語化対応)
https://qiita.com/kai_kou/items/445e614fb71f2204e033

### v0.9.1

MacでUnity ML-Agentsの環境を構築する(v0.9.1対応) - Qiita
https://qiita.com/kai_kou/items/268ccf6f961f8ca8cba8

DockerでUnity ML-Agentsを動作させる(v0.9.1対応) - Qiita
https://qiita.com/kai_kou/items/0c2f3c7d22363fd91e4e


### v0.6.0

MacでUnity ML-Agentsの環境を構築する(v0.6.0対応) - Qiita
https://qiita.com/kai_kou/items/2a6545d1f9d83178d0c0

DockerでUnity ML-Agentsを動作させる(v0.6.0対応) - Qiita
https://qiita.com/kai_kou/items/157e91312c2c0115376d


### v0.5.0

MacでUnity ML-Agentsの環境を構築する(v0.5.0対応)
https://qiita.com/kai_kou/items/6478fa686ce1af5939d8

DockerでUnity ML-Agentsを動作させる(v0.5.0対応)
https://qiita.com/kai_kou/items/df3f3518a5a27b66f617


## 利用

【Unity】Unityで機械学習する「ML-Agent」を色々と試して得た知見とか
http://tsubakit1.hateblo.jp/entry/2018/02/18/233000

Unity ML-Agentsで強化学習できる2Dシューティングゲームをつくってみた
https://qiita.com/kai_kou/items/65b40c762ff0d89865cf

Unityでの強化学習が結構たのしい【その１】
https://qiita.com/Gri_Gra/items/2c0722d10b0d11892527


## チュートリアル

Using an Environment Executable
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Executable.md

Basic Guide
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Basic-Guide.md

Unityの公式サンプルml-agentsでAIを試す
http://am1tanaka.hatenablog.com/entry/2017/11/08/230525


## GCPで環境構築

### v0.9.1

Google Cloud Buildを利用してUnity ML-AgentsのDockerイメージを作成する(v0.9.1対応) - Qiita
https://qiita.com/kai_kou/items/5eabbaa2b564527e0b4e

Unity ML-Agentsの学習をGoogle Cloud Buildで実行してみた(v0.9.1対応) - Qiita
https://qiita.com/kai_kou/items/eec215a3927b172f19e2

### v0.5.0

Google Cloud Buildを利用してUnity ML-AgentsのDockerイメージを作成する(v0.5.0対応)
https://qiita.com/kai_kou/items/56de0f5a3b2f89290d0d

Google Cloud BuildでUnity ML-Agentsを動かしてみる(V0.5.0対応)
https://qiita.com/kai_kou/items/727b7b5b27dc67485bc9

Google Cloud Machine Learning EngineでUnity ML-Agentsを動かす
https://qiita.com/kai_kou/items/efff1c37a6843f0d3593

Google Kubernetes EngineでUnity ML-Agentsを動かしてみる(V0.5.0対応)
https://qiita.com/kai_kou/items/3a4d860f8353ff1b3110

Google Cloud Functions(Python)からGoogle Kubernetes Engine(GKE)のジョブを登録する
https://qiita.com/kai_kou/items/66d4bf823acb4cec277a
[Excel] 住所から都道府県を取り出して地方別集計をする


業務で使ったのでメモ

## １．住所から都道府県を取り出す

- **先頭から４文字目が「県」なら４文字、そうじゃないなら３文字が都道府県名**

という判定で47都道府県全部行ける。Excelではけっこうメジャーな方法らしく、「Excel ＋ 住所から都道府県」という検索で直ぐ出てきた。

考えた人は偉い。２文字の県名を作らなかった人も偉い。


エクセル関数なら以下の通り。

```:Excel関数
= IF(MID(A1,4,1)<>"県",LEFT(A1,3),LEFT(A1,FIND("県",A1)))
```

正規表現ならこんな感じ。

```python:python
re = r'^.{3}県?'
```

## ２．都道府県番号を取得する

とりあえず都道府県と番号対応表。

- [wikipedia 全国地方公共団体コード](https://ja.wikipedia.org/wiki/%E5%85%A8%E5%9B%BD%E5%9C%B0%E6%96%B9%E5%85%AC%E5%85%B1%E5%9B%A3%E4%BD%93%E3%82%B3%E3%83%BC%E3%83%89)

- [wikipedia 日本の地域](https://www.teikokushoin.co.jp/statistics/japan_world/japan/)

|都道府県名|都道府県番号|地方名|地方番号
|:--|:--|:--|:--|
|北海道|1|北海道地方|1
|青森県|2|東北地方|2
|岩手県|3|東北地方|2
|宮城県|4|東北地方|2
|秋田県|5|東北地方|2
|山形県|6|東北地方|2
|福島県|7|東北地方|2
|茨城県|8|関東地方|3
|栃木県|9|関東地方|3
|群馬県|10|関東地方|3
|埼玉県|11|関東地方|3
|千葉県|12|関東地方|3
|東京都|13|関東地方|3
|神奈川県|14|関東地方|3
|新潟県|15|中部地方|4
|富山県|16|中部地方|4
|石川県|17|中部地方|4
|福井県|18|中部地方|4
|山梨県|19|中部地方|4
|長野県|20|中部地方|4
|岐阜県|21|中部地方|4
|静岡県|22|中部地方|4
|愛知県|23|中部地方|4
|三重県|24|近畿地方|5
|滋賀県|25|近畿地方|5
|京都府|26|近畿地方|5
|大阪府|27|近畿地方|5
|兵庫県|28|近畿地方|5
|奈良県|29|近畿地方|5
|和歌山県|30|近畿地方|5
|鳥取県|31|中国地方|6
|島根県|32|中国地方|6
|岡山県|33|中国地方|6
|広島県|34|中国地方|6
|山口県|35|中国地方|6
|徳島県|36|四国地方|7
|香川県|37|四国地方|7
|愛媛県|38|四国地方|7
|高知県|39|四国地方|7
|福岡県|40|九州・沖縄地方|8
|佐賀県|41|九州・沖縄地方|8
|長崎県|42|九州・沖縄地方|8
|熊本県|43|九州・沖縄地方|8
|大分県|44|九州・沖縄地方|8
|宮崎県|45|九州・沖縄地方|8
|鹿児島県|46|九州・沖縄地方|8
|沖縄県|47|九州・沖縄地方|8

県名のセルからVLOOKUP関数で番号を引く

```:Excel関数
=VLOOKUP(B1,Sheet2!$B$1:$C$47,2,0)
```

- `B1` が県名の入ったセル
- `Sheet2!$A$1:$D$47`が番号対応表の範囲
- `2`は対応番号の取得。「2」なら都道府県番号。「4」なら地方番号
- 文字列による判定の時は最後の引数は「0」で。

## ３．集計する

COUNTIF(S)関数,SUMIF(S)関数を使って集計する。
あらためで考えると番号に変換する必要は無いかもしれない…。

あとExcelのCOUNTIFS,SUMIFSはOR条件が使えないので、OR条件を使うときは無理に工夫するより個別に出したものを合計する方針がいい。

```:COUNTIFの例
C1:C1000が都道府県番号の入ったセル範囲。
このなかで"1（北海道）"の件数をカウント 

= COUNTIF(C1:C1000,"1")
```

```:SUMIFの例
C1:C1000が都道府県番号の入ったセル範囲。
D1:D1000が売上のセル。
このなかで"1（北海道）"の売上合計をカウント。 

= SUMIF(C1:C1000,"1",D1:D1000)
```
Azure SDK for go で Storage Table のデータを作成する

Azure Storage Table のデータの書き出しを実施したかったので、どのように実施したかを記録しておきたい。

* [Azure SDK for Go](https://github.com/Azure/azure-sdk-for-go)

Storage Table の操作に関しては、Storage Account 名前とキーがあれば可能になる。こちらにリファレンスが存在するのでどうやって使うかは想像がつきやすい。

* [storage](https://godoc.org/github.com/Azure/azure-sdk-for-go/storage)


# 使用例と解説

使い方は簡単です。Storage Table のライブラリには、他のライブラリのように `service/storage/mgmt` の下に日付付きのライブラリが普通はあるのですが、なぜか Storage Table だけありません。

* [/services/storage/mgmt/2018-02-01/storage](https://github.com/Azure/azure-sdk-for-go/tree/master/services/storage/mgmt/2018-02-01/storage)

ルート直下にある `/storage` を読み込みます。その後は簡単で

1. Storage Account clinet をインスタンス化。`NewBasicClient` 今回の目的に適していた。
2. Storage Table Service のリファレンスを取得 `client.GetTableService()`
3. 具体的なテーブルのリファレンスを取得 `tableService.GetTableReference(YOUR_TABLE_NAME)`
4. Entity 構造体をセット
5. インサートまたはアップデートの実施

テーブルのレコードを作るためには、`Entity` 構造体を自分で New してインサートするか、Batch で複数のレコードを一括で更新するか？という方法がある。下記のサンプルはバッチ型で実施している。

```go 
import (
  "github.com/Azure/azure-sdk-for-go/storage"
)
: 
client, err := storage.NewBasicClient(YOUR_ACCOUNT_NAME, YOUR_ACCOUNT_KEY)
    :
tableService := client.GetTableService()
table := tableService.GetTableReference(YOUR_TABLE_NAME)
tableBatch := table.NewBatch()
entity := &storage.Entity {}
entity.PartitionKey = "1"
entity.RowKey = "0"
entity.TimeStamp = time.Now()
m := make(map[string]interface{})
m["Foo"] = "foo"
m["Bar"] = "bar"
m["CustomTime"] = time.Now()
tableBatchInsertOrReplaceEntityByForce(entity)
:
err := tableBatch.ExecuteBatch()
```

# Odata のコンフィグレーションは必要か？

結論から言うと必要ない。

一つ疑問だったのが、Entity の定義にあった Odata の提議。

```go
type Entity struct {
    Table         *Table
    PartitionKey  string
    RowKey        string
    TimeStamp     time.Time
    OdataMetadata string
    OdataType     string
    OdataID       string
    OdataEtag     string
    OdataEditLink string
    Properties    map[string]interface{}
}
```
どれが必須のなのかわからないけど、これは、Azure REST API のリファレンスを見ろとのこと。

* [Payload Format for Table Service Operations](https://docs.microsoft.com/ja-jp/rest/api/storageservices/payload-format-for-table-service-operations)

このリファレンスを見ると、OData のレベルに対応して、設定する必要のある項目が異なってくる。本ライブラリの場合は、各カラムの型などは自動で設定してくれて、medatada も勝手に設定してくれるので、実用上は、私の上記のサンプルで構わない。自分でコントロールしたい場合は、

```go
func (e *Entity) Insert(ml MetadataLevel, options *EntityOptions) error
```
の MetadataLevelを参照すれば良い。こちらだが、一瞬定義が見つかりにくいが、`Constant`のところに書かれている。

```
    EmptyPayload    MetadataLevel = ""
    NoMetadata      MetadataLevel = "application/json;odata=nometadata"
    MinimalMetadata MetadataLevel = "application/json;odata=minimalmetadata"
    FullMetadata    MetadataLevel = "application/json;odata=fullmetadata"
```

デフォルトでは、`MinimalMetadata` になっている様子で、私のユースケースでは、特に設定しなくても十分だと思われる。InsertOrReplace を使うと、一行で書ける。

```go
entity.InsertOrReplace(&storage.EntityOptions{Timeout: 10}) 
```

タイムアウトの単位は、秒で最大 30 秒。わざわざオプションを指定しないといけないのが面倒だが、REST API の`x-ms-client-request-id`(Optional)   と　`timeout`(Optional) パラメータに相当するので、タイムアウトも指定しなくても良い。空のインスタンスで良い。
php-master-changes 2018-09-19

# 2018-09-19
## dstogov: Class constants and default property values can't be IS_REFERENCE anymore.
- https://github.com/php/php-src/commit/b634ded197f0b79c3c6aa804181b37aeaa15fc58
- クラス定数とプロパティのデフォルト値は IS_REFERENCE ではないので、参照であればデリファレンスするようになっていたコードを削除

## crhg: Fix bug [#75533](https://bugs.php.net/bug.php?id=75533): array_reduce is slow when $carry is large array
- https://github.com/php/php-src/commit/ab6c45f5249d077463c1876d7cf09a11f04240fa
- [array_reduce()](http://php.net/manual/ja/function.array-reduce.php) のコールバック第一引数へ大きな配列が入る際に遅い、という問題の修正
- [crhg の人](https://qiita.com/crhg)が出してた奴
- 当初は zval_ptr_dtor() の位置を移動する [PR](https://github.com/php/php-src/pull/2931) だったが、マージの際に zval_ptr_dtor(&result) を潰して、ZVAL_COPY(&args[0], &result) のかわりに ZVAL_COPY_VALUE(&args[0], &result) を使うようになってる
- [ZVAL_COPY()](https://phpinternals.net/docs/zval_copy) と ZVAL_COPY_VALUE() の違いは、後者はコピーの際に参照カウントを足さないというもの
- 参照カウント減らしといてコールバック内の操作でのコピーを避ける、かな？後でもう少し見る

## petk: Remove unused methods-on-non-objects-nested.inc
- https://github.com/php/php-src/commit/6f1a04120b82df144c560b82bf448cfd1180edd0
- 使われていないファイル Zend/tests/methods-on-non-objects-nested.inc を削除

## nikic: Fixed bug [#76901](https://bugs.php.net/bug.php?id=76901)
- https://github.com/php/php-src/commit/294fb83ee84b76479a62e4ed37d5523c1208ad7c
- [method_exists()](http://php.net/manual/ja/function.method-exists.php) を SPL のイテレータへ使うとメモリ破壊を起こすバグの修正

## dstogov: Improve ZEND_VM_SMART_BRANCH()
- https://github.com/php/php-src/commit/b137441f0e86594c94bc43476ac6577f3510fe52
- ZEND_VM_SMART_BRANCH() の最適化

## dstogov: Remove zend_hash_exists()
- https://github.com/php/php-src/commit/ef00e7e547c9fd7a5fdcff919889274477e82751
- 不要な zend_hash_exists() を削除

## nikic: Fix intermittent failures in mysqli_stmt_bind_result_format.phpt
- https://github.com/php/php-src/commit/c614dd677c99e14ac6afb25d7bfe02cfa8cf1981
- ext/mysqli のテストを修正
- mt_rand() で動くテストとかやめてくれよう……などという愚痴がコミットコメントに入ってる

## nikic: Fix getColumnMeta() test
- https://github.com/php/php-src/commit/842bec5b3c539396d6ff9e207ba55f626b42524e
- ext/pdo_mysql のテストを修正
- 最近の MySQL が無効値に対して厳格めな動作をするようになってるのを反映してるもよう

## dstogov: Remove zend_hash_exists()
- https://github.com/php/php-src/commit/0df57480b6fb574580697da26df1ac5802bc367c
- 不要な zend_hash_exists() を削除

## dstogov: Micro-optimization
- https://github.com/php/php-src/commit/2a54867f7eef9b5f12a3f084b24c4faaa0047836
- 不要な一時変数の削除

## dstogov: Use zend_hash_find() instead of zend_hash_exists()
- https://github.com/php/php-src/commit/6beaa9fa5b9764b411a178395ba26b237debf9fd
- 当初 zend_hash_exists() を使っていた箇所を zend_hash_find() を使うよう修正

## dstogov: Turn zend_hash_exists() into inline function
- https://github.com/php/php-src/commit/27b0fecd2e0192290d6530ea1ee2f5cd23e43682
- zend_hash_exists() をインライン化

## dstogov: Drop unused variable
- https://github.com/php/php-src/commit/27b9fac19c7f5a24f24fc34107461e31570c8918
- 使われていない変数を削除

## dstogov: Improved hash copying
- https://github.com/php/php-src/commit/f5e18686016044030e51dc4d40c39f7cef826886
- ハッシュテーブルのコピー処理を最適化/単純化
Pythonデコレーターがややこしかったので覚書

#コード
```python
def print_more(func):
    def wrapper(*args, **kwargs):
        print('asdf')
        result = func(*args, **kwargs)
        print('result', result)
        return result
    return wrapper



def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args, **kwargs)
        print('end')
        return result
    return wrapper

@print_info
@print_more
def add_num(a, b):
    return a + b

r = add_num(10, 20)
print(r)
```
#実行結果
```console
start
asdf
result 30
end
30
```
#解説
上記の

```python
@print_info
@print_more
def add_num(a, b):
    return a + b

r = add_num(10, 20)
print(r)
```
は、

```python
f = print_info(print_more(add_num))

r = f(10, 20)


print(r)
```
してるのと同じ。
Google Cloud Next `18

###Hangouts Chat で変わる新しい働き方 〜 チームコラボレーションからチャットボッ卜の開発方法まで

####Hangoutchatsとは
チームコラボレーション、「企業文化によりメール制約などがかかっている現状」
課題2つ
　・企業文化により、組織間のつながりに課題がある
　・リモートワーク
HangoutChatsの特徴
・Webベース
・GSuiteとの連携プラットフォーム
・AIによるチャットの自動返送機能

####Hangouts Chat Bot
ユースケース
　・通知、タスクの自動化、情報の照会（検索）

機能
　・MeetBot
　→自然言語でのチームの会議をスケジュールできる。
　・GoogleDriveBot
　→
　・BoxBot
　→
利用事例
　・社内のナレッジシェア
####Botフレームワーク
・柔軟なフレームワーク
　１．http,webhooks
　２．clooudpub,sub（オンプレでの構築をする場合）
　３．apps Script

![image.png](https://qiita-image-store.s3.amazonaws.com/0/160422/7801deef-7c20-00df-fff4-b295d9abb147.png)
VuePressの使い方

## VuePressとは

- マークダウンを書くだけで静的サイトを作成できるライブラリ
- もう少し具体的に言うと、マークダウンをインプットにHTML/CSS/JavaScriptが生成されるイメージ
- 生成されたファイルをサーバに配置するだけで簡単に静的サイトを公開することができる

## VuePressでどんなものが作れるか

- [VuePress公式サイト](https://vuepress.vuejs.org/)がVuePressでできているのでそれを見るとイメージしやすいと思う

<img width="850" alt="スクリーンショット 2018-09-20 7.18.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/3976ba3d-431c-14a2-954d-a60a985e23ab.png">

- マークダウンをHTML化することに加えてナビゲーションバーやサイドメニューの設置もできる
- ページごとにURLを割り当ててルーティングすることもできる

## VuePressの使い方

### セットアップ

- まずはVuePressをインストールして`vuepress`コマンドを使えるようにする

```bash
npm i -g vuepress
vuepress -V
```

- `vuepress -V`でバージョンが表示されればOK
    - 執筆時点(2018/9/20)では0.14.4が最新版

### 開発の流れ

- HelloWorldで基本的な流れをおさえる
- まずはマークダウンファイルを作成する

```bash
echo '# Hello VuePress' > README.md
```

- 開発モードで起動すると`http://localhost:8080`でプレビューできる
- マークダウンファイルを変更保存すると自動でリロードが走る

```bash
# 開発モードで起動
vuepress dev
```

<img width="489" alt="スクリーンショット 2018-09-20 7.50.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/14c672af-d4c4-d272-7e8f-f4bbc0d2a363.png">

- ビルドすると`.vuepress/dist`ディレクトリにHTML/CSS/JavaScriptが生成される

```bash
# ビルド
vuepress build

# 生成されたファイルの確認
tree .vuepress/dist
.vuepress/dist
├── 404.html
├── assets
│   ├── css
│   │   ├── 1.styles.5a8ea794.css
│   │   ├── 2.styles.9d6c44ce.css
│   │   └── styles.a416d477.css
│   ├── img
│   │   └── search.83621669.svg
│   └── js
│       ├── 1.5a8ea794.js
│       ├── 2.9d6c44ce.js
│       ├── 3.dffb3a89.js
│       └── app.a416d477.js
└── index.html
```

### ナビゲーションバーの設定

- 先のHelloWorldではナビゲーションバーが表示されているがタイトルがなく簡素なものになっている
- ナビゲーションバーを始めとした設定情報は`.vuepress/config.js`に記述していく

#### ナビゲーションバーを表示しない

- navbarにfalseを設定するとナビゲーションバーを非表示にできる

```js:.vuepress/config.js
module.exports = {
  themeConfig: {
    navbar: false
  }
}
```

<img width="418" alt="スクリーンショット 2018-09-20 8.03.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/ff24cab9-c1dd-0cad-394e-7f3321c46e63.png">

#### ナビゲーションバーにタイトルを表示

- titleに値を設定するとナビゲーションバーのタイトルとして表示される

```js:.vuepress/config.js
module.exports = {
  title: 'Hello VuePress',
}
```

<img width="485" alt="スクリーンショット 2018-09-20 8.06.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/1b9d8508-4c85-a58a-256f-ee16ca893119.png">

#### ナビゲーションバーにリンクを設置する

- サイト内部へのリンクに加えて、外部サイトへのリンクも配置できる

```js:.vuepress/config.js
module.exports = {
  themeConfig: {
    nav: [
      { text: 'Home', link: '/' },
      { text: 'Guide', link: '/guide/' },
      { text: 'External', link: 'https://google.com' },
    ]
  }
}
```

<img width="387" alt="スクリーンショット 2018-09-20 8.13.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/d5f3d6f7-58d5-3316-b5e7-46448b8060ec.png">

#### ナビゲーションバーの検索窓を非表示にする

```js:.vuepress/config.js
module.exports = {
  title: 'Hello VuePress',
  themeConfig: {
    search: false,
  }
}
```
Go の Embedded を理解する

Go で継承みたいなことをしたい時は Embedded のしくみを使える。ふわっとしかわかってないことに気づいたけど、リファレンスレベルだけど、自分用に整理しておく

* [Embedding](https://golang.org/doc/effective_go.html#embedding)

# Embedded が使える種類

interface と struct に対して使える。

## interface 

```go 
type Reader interface {
  Read(p []byte) (n int, err error) 
}
type Writer interface {
  Write(p []byte)(n int, err error)

type ReadWriter interface {
  Reader
  Writer
}
```

## struct

struct の場合は、ポインタで書くこと

```go
embeded should be pointer

type ReadWriter struct {
   *bufio.Reader
   *bufio.Writer
}
```

### struct の初期化

struct の Embedded を使ったら初期化しないといけない。

```go
type Job struct {
  Common string
  *log.Logger
}
``` 

というEmbeddedを持っているとき初期化の際には初期化してEmbedded を持たせてあげる必要がある。

```go
func NewJob(command string, logger *log.Logger) *Job {
  return &Job{command, logger}
}
or
job := &Job{command, log.New(os.Stderr, "Job: ", log.Ldate)}
```

### struct のオーバーライド

Embedded を次のようにも書ける。その際には、自分でデリゲートしてあげる必要がある。おそらくメソッドをオーバーライドしたい時に使える。

```go
func (job *Job) Logf(format string, args ...interface{}) {
   job.Logger.Logf("%q: %s", job.Command, fmt.Sprintf(format, args...))
}
```

また、自分で次のように書いてオーバーライドしても良い

```go
type ReadWriter struct {
    reader *bufio.Reader
}

func (rw *ReadWriter) Read(p []byte) (n int, err error) {
   return rw.reader.Read(p)
}
```

### 関数が重複したら？

Embedded を使った Struct と元の struct の関数のシグネチャが重複したら、Embedded を使った方が優先させる。（Job と Logger では、Job の関数が優先）また、Embedded した元の struct で誰かが重複させてしまった場合、その場合でも、Job の方はプロテクションの機構が働いて、使えはする。その重複しているメンバにアクセスしない限りは。

# まとめ

リファレンスのまんまですが、自分の整理のために書きました。
アジャイルと請負契約、あるいは古のユーザー企業とSIerとデベロッパーの関わり方

---
## ■TL;DR
* アジャイルのSIでも、POの役割・責務を条件にすることで、発注者責任と完成責任がうまくバランスとれるんじゃないか?(※答えはまだ無い;)

---
## ■今までのSI:
* ウォーターフォール。ゼネコンスタイルによるヒエラルキーがゆえの高額見積もり
	* 実態は、発注者責任の放棄→発注者・受注者お互いの保険料がものすごく上乗せされている(コレ、本当にビックリするやつある。70画面くらいで4億とか)
* →結局
	* 丸投げ
	* 稚拙な表現力で書いたドキュメントによるバケツリレー
	* 超絶なムダ、コミュニケーションロス、デメリットばかり

---
## ■最近のヤバいSI:
* 発注者責任置いてけぼりの「早い・安い・旨い」的な請負い契約。なぜかアジャイル
	* バズワード駆動、発注者、元請営業のあさはかな都合の良い「いいとこどり」で始まりがち
	* そもそもウォータフォールでやればいいのにってケース
		* SoR領域、現行ありき多い
	* そもそもアジャイル初めてとか。。(しかも、発注者側も受注者側のチームメンバー両方とか、ありえんし;)
* →結果
	* プラハラ(プライム(または上位)コントラクター・ハラスメント)
	* カスハラ(カスタマー・ハラスメント)
	* チームは疲弊するばかり。チームの幸福 is何?

---
## ■そろそろ、、:
* 内製アジャイルと外注アジャイルについて向き合った方がいい
	* アジャイル・スクラムの原理・原則だけでは、外注アジャイル(日本のゼネコンスタイル)は無理ゲー
		* DEVが派遣や委託だと、ミッションに対するエンゲージメント低すぎるよ(あたりまえだけど)
			* これもそもそも問題なのだけど、すぐに打開できない；
			* チームもずっと維持できない
		* SIerはオワコン? 知ってるよ。ずっと前から言われてるの

---
## ■それに、、:
* ユーザ部門のPOは、技術的負債などについて理解しにくい
	* 教科書では"How"についてはチームに任せることになっているけど、バックログの優先順位付けに関わるので、責任を持つことからは逃れられない
		* たとえば、技術的負債の優先順位を下げまくると、生産性や保守性が下がって、デリバリの速度が落ちるってこと
* 最近、うまくいってる or いきそうなプロジェクトは、ダブルPO
	* ビジネス価値領域(ユーザ部門)のPO ... プロダクトのビジネス価値に責任をもつ
	* システム価値領域(情シス)のPO ... プロダクトの技術的価値(アーキテクチャ、保守性や運用性など)に責任を持つ

---
## ■請負契約によるアジャイル開発は、、:
* 結局のところ、"Do Agile"。現実的にみて、ちゃんと"Do Agile"できるようにすればいいんじゃないか?
	* ※内製は"Be Agile"で取り組めばいいと思うけど。。
* 受注者側の"完成責任"以前に"発注者責任"を発注者側のダブルPOがうまく請うことができるような契約条件にできないか?
特定の Organization で Github の通知や GCP からのアクセスができなくなる問題の原因

# 現象
- 特定の Organization からどうも Gitify で通知が受け取れない
- CloudBuild のトリガを設定したくて GCP で認証したけどその Organization のリポジトリだけリストアップされない

# 原因
### Third-party application access policy
Github->Organization->Settingsのこれ．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205151/c1d88d25-c8c4-8a3a-08dd-9e367f138a8e.png)
が，最近作った Organization だと，デフォルトで全部のサードパーティアクセスを禁止するようになっているようだ．管理権限を持っているユーザのみ許可できるが，CircleCI や Slack は問題なく認証できていたが，Gitify等サードパーティによっては**このリストに出てすらこない**ので，以下のように全体的に制限を解除するしかない．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/205151/f9474aed-139f-14cc-103a-d98dfd334f63.png)

なかなか融通が効かなくて困る．
Minecraft 1.12.2　ネザー要塞のスポーン座標決定のアルゴリズム


- Minecraft 1.12.2　村の座標決定部分のアルゴリズム https://qiita.com/MirrgieRiana/items/0a3baee86bb661dc5f99

の亜種。基本的なことはこれと同じ。

# アルゴリズム

概ねこんな感じ。

```
boolean canSpawnStructureAtCoords2(int chunkX, int chunkZ)
{
	int regionX = chunkX >> 4;
	int regionY = chunkZ >> 4;
	Random rand = new Random(seed ^ regionX ^ (regionY << 4));
	rand.nextInt();

	if (rand.nextInt(3) != 0) return false;
	if (chunkX != (regionX << 4) + 4 + rand.nextInt(8)) return false;
	if (chunkZ != (regionY << 4) + 4 + rand.nextInt(8)) return false;

	return true;
}
```

意訳すると次のようになる。

```
16x16チャンク毎、33%の確率で、中央付近の8x8チャンクのいずれかのチャンクを中心としてネザー要塞が出現する。
```

16x16の端付近には出現しないので、既知の遺跡から座標軸に沿って進むと高確率で発見できる。
出現可否と地域内の詳細位置はワールドのシードと16x16ごとの地域にのみ依存し、バイオームとかそういう条件はなく溶岩海の上だろうが地中だろうが問答無用でスポーンする。恐らく村と同じくチャンク内での位置も固定。村とは異なりチャンク座標が負の場合には説明しづらい特殊な挙動をする。

# 複製

もしやX座標が16*16*16離れてY座標が16*16離れた4か所のうち1か所には同じ形の要塞が湧く？

![2018-09-20_04.18.31.png](https://qiita-image-store.s3.amazonaws.com/0/280627/7e20f655-52ab-238a-a934-f99160147106.png)
![2018-09-20_04.19.20.png](https://qiita-image-store.s3.amazonaws.com/0/280627/1b513f28-db90-26e8-2128-789b386f2bbd.png)

![2018-09-20_04.22.48.png](https://qiita-image-store.s3.amazonaws.com/0/280627/c59dfb0b-a8eb-32bf-bc2d-4c69a6d284bf.png)
![2018-09-20_04.23.24.png](https://qiita-image-store.s3.amazonaws.com/0/280627/fe578487-4380-0fd3-20de-49f30b0c6198.png)

酷似している。多分同一。これは`regionX ^ (regionY << 4)`が同じ値になる場所で起こる。同様にXが16*16*16*2、Yが16*16*2離れた場所にも存在するはず。地域Yの反転ビットが地域Xの反転ビットの左4シフトになれば対応が取れる。大きな値を除けば任意の地域Xに対応する地域Yが存在することになるので、N個のネザー要塞があったとしてパターンは概ね√N個しかないことになる。
RaspberryPiとAWS IoT CoreでMQTT通信をしてみた

##とにかくAWS IoTとRaspberryPiをMQTT通信させたい。という方に作業内容だけをまとめました。


まず、全体の作業内容を説明します。大きく作業は３つです。
1. AWS IoTにRaspberryPiを登録
- 証明書の取得
- ポリシーの追加
2. RaspberryPiプログラムの作成
3. 通信テスト

以上です。今回はAWS IoT側がデータの送信側です。RaspberryPiは受信側。

##AWS IoTへRaspberryPiを登録
[AWSのWebページ](https://aws.amazon.com/jp/)⇨コンソールへログイン⇨サービス⇨IoTCore

管理→モノ→作成行きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253642/c661a72f-ff17-c2d0-372b-f24aa3ebf830.png)

単一のモノを登録する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253642/181fa407-32b4-ca88-b2df-eb9761f8f4cd.png)

モノの名前を登録（他の項目は自由に。未記入でも大丈夫です）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253642/9f6395bd-dc50-b290-4f55-0b52ad5962b0.png)

###証明書を取得します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253642/8e96061f-25e8-b5c1-f7e0-fc4c286a38e6.png)
ダウンロード（モノの証明書、パブリックキー、プライベートキー、ルートCA)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253642/d5de3500-69bc-199d-558e-44cade0c1263.png)

###ポリシーを設定します
セキュリティ機能の一つ、ポリシーを設定します。ポリシーとは操作やAWS上のデータベースなどの他のリソースアクセスを決めるモノです。
下の写真のようにアクションとリソースを設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253642/6665abbe-4120-9bc8-3b58-0d39923317b8.png)

証明書のページから-ポリシーの
アタッチを行って、上で作成したポリシーをアタッチします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253642/ba61d014-aae2-5280-0716-fc4ea10de26a.png)

###RaspberryPiのプログラムを作成します。
MQTTのクライアントには[paho mqtt](https://www.eclipse.org/paho/)を利用します。
RaspberryPiに入って、pipを利用してpaho mqttを入れます。

```shell-session
sudo apt-get install python-pip

pip install paho-mqtt
```
####ラズパイのプログラムです
下記コードを作成ください。XXXX.〜は各々のパラメータを入れてください。
作成後はscpモジュールなどでPC→MQTTに転送できます。証明書とプライベートキー、パブリックキーも転送します。同じ階層に入れてください。

```paho_mqtt_test.py
import paho.mqtt.client
import ssl
import subprocess
import json

endpoint = "XXXX.amazonaws.com"#AWSのエンドポイント
port = 8883#AWSのポート
topic_to_aws ="Raspi3_to"
topic_from_aws = "Raspi3_from"
rootCA = "VeriSign.pem"#ルート証明書
cert = "XXXX-certificate.pem.crt"#デバイス証明書
key = "XXXX-private.pem.key"#keyを設定

def on_connect(client, userdata, flags, respons_code):
	print("Connected")
	client.subscribe(topic_to_aws)#サブスクライブする

def on_message(client, userdata, msg):
	print(msg.topic)

if __name__ == '__main__':
	#ここら辺はpahoのリファレンスを参照。
	#https://www.eclipse.org/paho/clients/python/docs/#connect-reconnect-disconnect	
    client = paho.mqtt.client.Client()
    client.on_connect = on_connect
    client.on_message = on_message
    client.tls_set(ca_certs=rootCA, certfile=cert, keyfile=key, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
    client.connect(endpoint, port=port, keepalive=60)
print("StartScript")
client.loop_forever()
```

##通信テスト
テスト→発行のトピック名を記入して、"トピックスに発行"をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253642/0614a825-739f-0e7d-8835-a98172152475.png)
***成功していたら、RaspberryPiのコンソールへ(ソースコード)のon_message文字列出力される。***

#以上
Decentralandで仮想世界を構築する（その２）

# はじめに
[前回](https://qiita.com/shiruco/items/1b62d8654606c8fadca7)、Decentralandの概要と簡単なアーキテクチャの説明をしました。
今回からはDecentraland SDKを用いて実際にコンテンツを作っていきたいと思います。
まずはSDKのインストールと、シーンの雛形作成までやります。

# Decentraland SDK
### インストール
何はともあれDecentraland SDKをインストールしましょう。
npmでグローバルインストールします。

```bash
npm install -g decentraland
```
もしくは 

```bash
yarn global add decentraland
```
無事インストールが完了すると、 `dcl` コマンドが利用できるようになります。

### 最初のシーンを作る
次に最初のコンテンツ(以降 シーン)の雛形を作ります。
シーン作成用のディレクトリを作ってそこに移動し、下記コマンドを実行します。

```bash
dcl init
```
すると対話形式で以下のことを聞かれます。
<img width="696" alt="スクリーンショット 2018-09-20 1.50.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/73643/28b6ee77-db85-c188-133e-8336d3573b12.png">
**1. Scene title**
シーンのタイトルを入力します。
**2. Your ethereum address** 
Ethereumアドレス。開発用なので、私はRopstenネットワークのアドレスを入れました。空でもOK。
**3. Your name** 
開発者名を入力します。空でもOK。
**4. Your email** 
Emailアドレスを入力します。空でもOK。
**5. Parcels comprising the scene**
パーセルの座標を入力します。利用用途がいまいち不明でした。空でもOK。

**※2019.2 追記:** コメントで情報いただきましたが、実際にデプロイしたい場合は自分の所有するパーセルの座標を入力しないとdeploy時に怒られるようです。

**6. Which scene template would you like to generate?**
シーンのタイプを指定します。今回は `Basic` を選択します。

すべての質問に答え終わったら、依存モジュールのインストールが行われ、シーンが構築されます。ディレクトリ構成は以下のようになります。
<img width="370" alt="スクリーンショット 2018-09-20 2.17.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/73643/35319dbc-8524-5098-013d-6ee3835a1830.png">
##### 各々のファイルの使用用途

- **scene.tsx** シーンのエントリーポイントとなるプログラムファイル
- **scene.json** シーンのメタデータ記述ファイル
- **package.json and package-lock.json** モジュールの依存関係定義ファイル
- **build.json** ビルド用コンフィグファイル
- **tsconfig.json**: Typescriptのコンフィグファイル

# シーンのプレビュー
シーンの雛形ができ、それぞれのファイルの用途がわかったところで一度ビルドしてシーンを見てみましょう。下記コマンドを実行してください。

```bash
dcl start
```
実行すると8000番ポートでサーバが立ち上がり、ブラウザからシーンが覗けます。（もちろんOculus GoなどのHMDからでも確認できます）
![fff.gif](https://qiita-image-store.s3.amazonaws.com/0/73643/9e07e9e8-3fe3-c816-85b9-e383eaaec9a5.gif)

方向はマウスでグリグリ動かせます。移動はW(↑)S(↓)A(←)D(→)です。
実際に見るとちょっとテンション上がるので是非。

その3へ続きます。

# 補足
シーンのタイプを今回`Basic`にしましたが、他のタイプについてそれぞれ補足説明しておきます。

**Basic scene**
boxやsphereなどの[glTFモデル](https://dwango.github.io/vrm/gltf_about/)の置かれたノーマルシーンです。ちょうどA-Frameのデモみたいなやつです。

**Interactive scene**
ドアの開閉を制御するようなインタラクション付きのシーンです。ドアの開閉はクリックイベントを拾ってドアのState(開閉状態)を切り替えています。インタラクティブなコンテンツを作っていきたい方はこちらを。

**Remote scene**
Interactive sceneと同様にドアの開閉を制御するシーンですが、Stateはサーバで管理されています。通信はwebSocketを使用しています。インタラクティブなコンテンツ + サーバ通信を考えている方はこちらを選択して参考にするのが良いかと思います。

**Static scene**
XMLに記述されたシーンです。プログラムでシーンを制御できません。見て楽しみたいだけという方はこちらで。
Python3 + bottle + uwsgi + nginxをdockerで構築してみた

nginx と pythonのbottleを別コンテナで構築したかった。
そこでdocker-composeで複数のコンテナを作成した。

# 利用する技術

* python3
* bottle
* uwsgi
* nginx
* docker

# 利用するファイルとディレクトリ階層

```
/mysystem
  docker-compose.yml
  /myapp
    Dockerfile
    uwsgi.ini
    app.py
  /web
    Dockerfile
    nginx.conf
    index.html
```

## myapp/app.py
```python
from bottle import route, run, default_app

@route('/test')
def test():
    return 'test success'
if __name__ == '__main__':
    run(host='0.0.0.0', port=3031, debug=True, reloader=True)
else:
    application = default_app()
```
hostの部分はdockerに外部からアクセスするには`'0.0.0.0'`と指定する。
default_app()は先頭でbottleからimportする。

## myapp/uwsgi.ini

uwsgiの設定ファイル

```
[uwsgi]
master = true
wsgi-file = app.py
socket = :3031
max-requests = 5000
logto = uwsgi.log
```

## myapp/Dockerfile

Pythonアプリケーション用のDockerfile

```
From python:3

RUN pip install --upgrade pip
RUN pip install bottle
RUN pip install uwsgi

COPY app.py /opt/myapp
COPY uwsgi.ini /opt/myapp

```

## web/nginx.conf

nginxの設定ファイル

```
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;
    upstream uwsgi {
        server uwsgi:3031;
    }

    server {
        listen 80;
        charset     utf-8;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
        location /test {
           uwsgi_pass uwsgi;
           include uwsgi_params;
        }
    }
}

```
`include /etc/nginx/conf.d/*.conf;`の部分をコメントアウトし、`upstream uwsgi`以下を追記した。
もちろんdefault.confなどを/etc/nginx/conf.d/に配置して利用してもOK。

## web/Dockerfile

nginx用のDockerfile

```
FROM nginx

COPY index.html /usr/share/nginx/html

```

## docker-compose.yml

複数のDockerfileをまとめて処理できる。

```
version: '2'
services:
  uwsgi:
    container_name: myapp
    build: ./myapp
    command: uwsgi --ini uwsgi.ini
  nginx:
    container_name: myweb
    build: ./web
    links:
      - uwsgi
    volumes_from:
      - uwsgi
    ports:
      - "0.0.0.0:80:80"

```

# コンテナ作成と実行

## dockerコンテナ作成

docker-compose.ymlがあるディレクトリで以下のコマンド

```
docker-compose build
```

## dockerコンテナ起動

```
docker-compose up
```

バックグラウンド実行なら

```
docker-compose up -d
```

## dockerコンテナ停止
```
docker-compose down
```
stop + rmしてくれる

# 備考

さくらのVPSにdocker-composeがinstallされてなかったので以下を参照してinstallした。
https://docs.docker.com/compose/install/

実行権限が必要なので以下を参照して権限付与した。
https://qiita.com/DQNEO/items/da5df074c48b012152ee