OmniAICreator/Qiita-1.07M huggingface dataset:
React.js, Angular.jsとDjangoを使ったアプリケーション開発

クライアントサイドにReact.jsやAngular.jsを使い、サーバーサイドでDjangoを用いたWebアプリケーションって、どういう仕組みなのか気になっていたが、調べてみて、少しずつ理解していった。

## 参考
#### ①[勉強会JS編＜2＞ クライアントサイドMVCフレームワーク](https://qiita.com/park-jh/items/8b0a21e09223e3a8d0bc)
"アプリケーションの変遷"という項目がスッキリさせてくれた。
>- スタンドアロンアプリケーション
    - Webアプリケーションではなく、スタンドアロン環境で動くGUIアプリケーション。
    - クライアント・サーバ方式（多数のスタンドアロンアプリケーションがDBサーバとSQLで通信）
- シンプルWebアプリケーション
    - サーバ側でのプログラミングを中心にしたWebアプリケーション
    - 画面遷移とGUIの状態を一致させることで、状態を意識しないプログラム実行環境が実現
    - HTMLのGUI部品により、表現力や操作性はスタンドアロンアプリケーションに比べて低下したが、アプリケーション開発の生産性は大きく向上
- リッチWebアプリケーション
    - リッチなGUIを持つWebアプリケーション
    - 画面遷移はほとんどない。
    - 裏でサーバと通信する必要があるデータだけリアルタイムでやりとりしたり、リッチなモーダルダイアログを表示する。
    - GUI制御のプログラムをJavaScriptで書く必要がある。

`Backbone.js` の機能
>- Key-Value型のデータとカスタムイベントを持つモデル
- 複数のモデルをリスト化し、リストを操作するAPIが整ったコレクション
- HTMLの描画とイベントハンドリングを担当するビュー
- サーバとJSON（JavaScript Object Notation）をやりとりするRESTfulインタフェース


#### ②[クライアントサイドMVCを使ったときのサーバサイドの役割](https://qa.atmarkit.co.jp/q/2764)

##### サーバーの役割の変化
`HTMLを生成` → `JSON APIを提供する`

>例えば Twitter API を使うと Twitter クライアントを作ることができますよね。iOS 用クライアント、Android 用クライアントなど様々なものがあって、そのなかのひとつとして HTML と JavaScript でできたクライアント (= twitter.com) がある、というようなイメージです。

>とはいえ、すべてのドメインロジックがクライアントに移るわけでもありません。アクセス制御はもちろんとして、更新系で整合性を保つこと、クライアントの必要に応じた粒度でリソースをエクスポートすることなどはサーバサイドの責務です。データベースのレコードをそのままエクスポートするだけではこれらを実現できないので、サーバサイドでも MVC フレームワークを用いることは普通にありえることです。**この場合、View は HTML の代わりに JSON を生成することになるでしょう**。
早期リターン

return if ~ というコードをよく見るので調べてみたのでメモ。

## 早期リターンとは
・ifのネストを深くしたり、else句を使うのを避けるためのテクニック
・条件を満たしたときに、すぐにreturnさせることによって後ろに影響を及ぼさない。

## 普通のif文
```ruby:test.rb
def sample
  if hoge 
    # hoge が nil でないときの処理
  else
    return
  end
end
```
hogeがnilの時は、else returnとなる、つまり処理が実行されないことが分かる。

## 早期リターンで書いてみる
```ruby:test.rb
def sample
  if hoge == nil
    return
  end
  # hoge が nil でないときの処理
end

または

def sample
  return if hoge == nil
  # hoge が nil でないときの処理
end
```

状況に応じて使うことでコードが見やすくなる。
【SQLAlchemy】insertしたレコードのidを取得・利用

# この記事はなに

SQLAlchemyにおいて新規作成したレコードのid値を取得・利用する方法を書いたメモ

# 前置き
```
# Userテーブルのレコードを新規作成

# 続けて作成したuserのidをuser_idとしてauthorizationレコードを作成
```

というような操作をしたい場合、
みんな大好きRuby on RailsのORMであるActive Recordなどでは

```
user = User.create!(test_column=‘test’)
# user.id -> 2

# 続けてuser.idをuser_idとしてauthorizationレコードを作成
```
と直感的に書けるが、

FlaskやBottleなどのPythonの軽量フレームワークでしばしば使用されるORMであるSQLAlchemyでは書き方が直感的ではない気がしたので雑メモする

# 本題

SQLAlchemyのinsertにおいてidが確定するタイミングは

```
db = SQLAlchemy()

user = User(test_column=‘test’)
db.session.add(user)
db.session.commit()
```

のcommit部分なので


```
user = User(test_column=‘test’)
# user.id -> None

db.session.add(user)
# user.id -> None

db.session.commit()
# user.id -> 2

# 続けてuser.idをuser_idとしてauthorizationレコードを作成
```

のように(考えてみれば当たり前だが) commit()したタイミングで、userが変化してid が取得できるようになる。

また、もちろんネストを使って以下のように書いても

```
db.session.begin_nested()
# user.id -> 2
```

とidが確定する。
C言語ライブラリのインポート

## Introduction

以前、C言語ライブラリを使うにはCoreFoundationをimportすれば良いと書いたが、これはSwift 3.0.xまでの話だったらしい。usr/lib/swift/CoreFoundation/module.modulemap が変更されたためである。

Swift 3.0.x以下

```
module CoreFoundation [extern_c] [system] {
    umbrella header "CoreFoundation.h"
    explicit module CFPlugInCOM { header "CFPlugInCOM.h" }
    
    export *
    module * {
        export *
    }
}
```

Swift 3.1以上

```
module CoreFoundation [extern_c] [system] {
    umbrella header "CoreFoundation.h"
    explicit module CFPlugInCOM { header "CFPlugInCOM.h" }

}
```

## Method / Result

### Foundation

というわけでimport方法を変更する必要があるのだが、Universalなやり方をなるべくなら使いたいもの。
Swift 3.0以上であればFoundationが使えるようだ。

```
import Foundation
```

ただし、Swift 2.xを考慮するなら分岐が必要(3.0はCoreFoundationも使えるので、以下では3.1としてある)。

```
#if swift(>=3.1)
import Foundation
#else
import CoreFoundation
#endif
```

ただ、Swiftはライブラリ依存がただでさえ激しいようなので(so.\*が違うのをsymlinkを張り替えて解決する例が散見される)、同じ分岐を要するならライブラリ依存を減らす方向にしたい。

### _runtime

DarwinとGlibcの別だけで良ければ、_runtimeを使うのが簡便か。
定義は https://github.com/apple/swift/blob/swift-4.2-branch/lib/Basic/LangOptions.cpp#L261 にある。

```
#if _runtime(_ObjC)
import Darwin
#else
import Glibc
#endif
```

### os

https://github.com/apple/swift/blob/swift-4.2-branch/lib/Basic/LangOptions.cpp#L29 によると、`OSX, tvOS, watchOS, iOS`などが識別子として使えるらしい(4.2の段階では他に、`Linux, FreeBSD, Windows, Android, PS4, Cygwin, Haiku`)。Swift 3.1以降はmacOSがOSXの別名として使えるようだ。

```
#if os(OSX)||os(tvOS)||os(watchOS)||os(iOS)
import Darwin
#elseif os(Windows)
import MinGWCrt
#else
import Glibc
#endif
```

### canImport

Swift 4.1以降であればcanImport statementが使えるようだ。実は上のWindowsは[SwiftForWindows派生版](https://github.com/SwiftForWindows/SwiftForWindows/releases)を対象にしていて、[純正版](https://github.com/apple/swift/blob/master/docs/Windows.md)では正しくインポートできない(純正版はまだバイナリリリースがないのである意味しかたない)のだが、その問題も含めてまとめて解決できる。

ただ、4.1未満を切り捨てることにはなってしまう(`swift(>=4.1)`の場合だけcanImport節を読むと言ったことはできない)。

```
#if canImport(Darwin)
import Darwin
#elseif canImport(MinGWCrt)
import MinGWCrt
#elseif canImport(MSVCRT)
import MSVCRT
#else
import Glibc
#endif
```
JavaScriptで配列の内容を繰り返した配列を作る

# はじめに

Rubyだと簡単に配列の内容を指定個数、繰り返した配列を作れますが、
javascriptで簡単に短く作る方法はないのか調べてみました。

# シンプルな例

```ruby:ruby
> hash  = { a: 1 }
> array = [hash] * 3
=> [{:a=>1}, {:a=>1}, {:a=>1}]
```

```javascript:javascript
> var hash = { a: 1 };
> var array = Array(3).fill(hash);
=> [ { a: 1 }, { a: 1 }, { a: 1 } ]
```

しかし、これだと `hash` 変数の値に変更を加えると全て反映されてしまいます。

```ruby:ruby❌
> hash[:a] = 2
> array
=> [{:a=>2}, {:a=>2}, {:a=>2}]
```

```javascript:javascript❌
> hash.a = 2;
> array
=> [ { a: 2 }, { a: 2 }, { a: 2 } ]
```

# オブジェクトを複製する

```ruby:ruby
> hash  = { a: 1 }
> array = [hash.dup] * 3
> hash[:a] = 2
> array
=> [{:a=>1}, {:a=>1}, {:a=>1}]
```

```javascript:javascript
> var hash = { a: 1 };
> var array = Array(3).fill({ ...hash });
> hash.a = 2;
> array
=> [ { a: 1 }, { a: 1 }, { a: 1 } ]
```

`hash` 変数の値に影響されなくなりましたが、配列の一つのオブジェクトに変更を加えると全てに反映されます。

```ruby:ruby❌
> array[0][:a] = 2
> array
=> [{:a=>2}, {:a=>2}, {:a=>2}]
```

```javascript:javascript❌
> array[0].a = 2;
> array
=> [ { a: 2 }, { a: 2 }, { a: 2 } ]
```

# 配列の要素一つずつオブジェクトを生成する

```ruby:ruby✅
> hash  = { a: 1 }
> array = Array.new(3) { hash.dup }
> hash[:a] = 2
> array[0][:a] = 3
> array
=> [{:a=>3}, {:a=>1}, {:a=>1}]
```

```javascript:javascript✅
> var hash = { a: 1 };
> var array = Array.from({ length: 3 }, () => ({ ...hash }));
> hash.a = 2;
> array[0].a = 3;
> array
=> [ { a: 3 }, { a: 1 }, { a: 1 } ]
```

`Array(3).fill()` 等で、なんとかして指定長の配列さえ作れてしまえば、 `map` を使っても良いかと思いましたが、
`Array.from` の `length` プロパティで数値指定できるのがしっくりきました。

```javascript:Array().fill()
> var array = Array(3).fill();
> array
=> [ undefined, undefined, undefined ]
> array = array.map(() => ({ ...hash }));
> hash.a = 2;
> array[0].a = 3;
> array
=> [ { a: 3 }, { a: 1 }, { a: 1 } ]
```

# 最後に
同じ内容を繰り返した配列を作るような状況はあまり無いかと思いますが、後輩に聞かれて焦ったので調べました。
間違い、より良い方法等ございましたらコメント下さい。

# 参考文献
* [Stack Overflow - Array.fill(Array) creates copies by references not by value [duplicate]](https://stackoverflow.com/questions/37949813/array-fillarray-creates-copies-by-references-not-by-value)
* [Array.from() | MDN
](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from)
メモ：「３０日でできる！OS自作入門 」23日目

## グラフィックいろいろ

1) malloc を作ろう
- memory manager の初期化、malloc, free の API

2) 点を書く
- ウィンドウ番号、x, y, 色で API 呼び出し

![スクリーンショット 2018-12-26 22.47.43.png](https://qiita-image-store.s3.amazonaws.com/0/109145/4920cbf9-b7e2-6d73-5698-d41d9f2f86f0.png)

3) ウィンドウのリフレッシュ
- リフレッシュするだけのAPIを作成

4) 線を引く
- 点書くAPIを利用し、C言語でアルゴリズムを実装していくイメージ

![スクリーンショット 2018-12-26 22.56.35.png](https://qiita-image-store.s3.amazonaws.com/0/109145/e0722e26-b4ce-a3b9-cc83-a24d90011544.png)

5) ウィンドウのクローズ
- 画面からウィンドウを消すAPI
- 早すぎてウィンドウ自体でたの見えなかったｗ

6) キー入力
- Windowsのpause 機能 (Enter押したら次実行）
- API の中でカーソルとかの処理もする必要あった

7) キー入力で遊ぶ
- * をArrowキーで動かせるようになった
- Cの実装のみ

![window-move3.gif](https://qiita-image-store.s3.amazonaws.com/0/109145/827e5697-b421-0de6-88c4-22156647681c.gif)

8) 強制終了でウィンドウを閉じる
- シートにタスクをもたせて終了時にシート開いたままだと閉じて上げる処理

![スクリーンショット 2018-12-26 23.18.53.png](https://qiita-image-store.s3.amazonaws.com/0/109145/970fcdcb-08be-85e1-395e-a50aeaebd37c.png)
Xcode インストールからHelloWorldアプリを作ろう！

#手順
1. Macを準備する
2. XcodeはMac App Store からダウンロード（無料）

##HelloWorldアプリ作成
Xcodeをクリックすると以下の画面が表示されます。
<img width="497" alt="スクリーンショット 2018-12-26 22.42.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/325764/c90b2d36-5cda-5412-dd13-3e18a26a986b.png">

赤で囲まれているところをクリックして、プロジェクトを作ります。
<img width="733" alt="スクリーンショット 2018-12-26 22.55.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/325764/77914e44-7c4c-9f49-fb1c-112bc3e625e4.png">
Single View Appを押した状態でNextを押します。
<img width="730" alt="スクリーンショット 2018-12-26 23.02.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/325764/bfc2e5df-df33-63c6-c0c7-55e27fa9b1b0.png">
ProductNameをHelloWorldにして上記と同じ状態でNextを押します。
Shift-JIS形式を一括でUTF-8形式にして出力するJavaプログラム



**使い方**
UTF-8形式に変換したいテキストファイルを一つのフォルダに集めます。
"フォルダーのパス"と書かれたところにフォルダの場所を書きます。
パスのところは以下のように書きます。（エスケープ処理のために「\\」をひとつ足す必要があると思います）
例）C:\\Users\\YourName\\Desktop\\Folder

実行すると「converted」というフォルダがファイルと同じ場所に作られ、中に変換されたファイルが保存されます（Shift-JIS以外は処理しません）。

**作った理由**
iPhoneからAndroidに乗り換えた際に、使っていたメモアプリ（Textforce）がAndroidに無かったため別のメモアプリ（Simplenote）に乗り換え、それまでのメモを移植したところ文字コードの違いで、PCで作成したメモが全て文字化けしてしまったので。
Androidで使えてShift-JIS形式のテキストを読み込んでくれてパソコン・スマホで簡単に同期できてかつ軽いアプリがあれば自分でこんなことする必要は無かったのに･･･
誰かおすすめあれば教えてください


```java:SJIS2UTF8.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;

public class SJIS2UTF {
	public static void main(String[] args) {
		SJIS2UTF stu = new SJIS2UTF();
		stu.readFolder(new File("フォルダーのパス"));
	}

	public void readFolder(File dir) {
		File[] files = dir.listFiles();
		String fileName;
		if (files == null) {
			return;
		}
		for (File file : files) {
			if (!file.exists()) {
				continue;
			} else if (file.isDirectory()) {
				readFolder(file);
			} else if (file.isFile()) {
				try {
					byte[] byteOfFile = convertFile(file);
					fileName = file.getName();

					if (isSJIS(byteOfFile)) {
						encodeStoU(file, fileName);
					} else {
						System.out.println(fileName + "はSJISじゃありません");
					}
				} catch (IOException e) {
					System.out.println("IOExceptionエラー");
				}
			}
		}
	}

	public void encodeStoU(File file, String fileName) {
		String parentPath = file.getParent();
		String sourcePath = parentPath + "\\" + fileName;
		String destFolder = parentPath + "\\converted";
		String destPath = parentPath + "\\converted\\" + fileName;

		File folder = new File(destFolder);
		if (!folder.exists()) {
			try {
				Files.createDirectory(Paths.get(destFolder));
				Files.createFile(Paths.get(destFolder, fileName));
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}

		try {
			File sourceFile = new File(sourcePath);
			BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(sourceFile), "Shift-JIS"));
			File destFile = new File(destPath);
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destFile), "UTF-8"));

			String line;
			while ((line = br.readLine()) != null) {
				bw.write(line);
				bw.newLine();
			}
			br.close();
			bw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public byte[] convertFile(File file) throws IOException {
		return Files.readAllBytes(file.toPath());
	}

	public static boolean isSJIS(byte[] src) {
		try {
			byte[] tmp = new String(src, "Shift_JIS").getBytes("Shift_JIS");
			return Arrays.equals(tmp, src);
		} catch (UnsupportedEncodingException e) {
			return false;
		}
	}
}
```
○日間にマージされたすべてのPRをブラウザで開くワンライナー

入りたての会社でキャッチアップの為に表題のことがしたいなと思いやってみた。(`hub`が必要)

```sh
for e in `git log --since=1.days | grep 'Merge pull request' | cut -d '#' -f 2 | cut -d ' ' -f 1`; do hub browse -- issues/$e; done
```

`git log`のオプションはなんでもよいので、例えば Railsのバージョン間のPRを見たい時にも使える（かもしれない）

```sh
for e in `git log v5.2.1..v5.2.2 | grep 'Merge pull request' | cut -d '#' -f 2 | cut -d ' ' -f 1`; do hub browse -- issues/$e; done
```
OKHttpリクエストのCurlコマンドを出力するライブラリが便利だった

# 概要

[Apollo GraphQL Client (Android)を動かしてみた際のメモ] (https://qiita.com/m_kunugi/items/a8b9685ada81aed84442) でAndroidからGraphQLを触っている際、CurlコマンドでGraphQLのエンドポイントを叩きたいケースがしばしばあった。Chromeのデベロッパーツールの「Network」タブには「Copy as Curl」というリクエストをCurlコマンドで出力してくれる機能があるが、Androidでもそういったデバッグ機能がないか探したところ、「[Ok2Curl](https://github.com/mrmike/Ok2Curl)」というライブラリがあった。
利用してみたところ便利だったのでメモ。

# 利用方法

GithubページのREADMEに従えばOK。
https://github.com/mrmike/Ok2Curl

以下の依存関係を追加

```gradle

dependencies {
    implementation 'com.github.mrmike:ok2curl:0.4.5'
}
```

使い方は下記のように、InterceptorをOKHttpClientのBuilderに差し込むだけで、CurlコマンドをLogcatに出力できる。

(Kotlin)

``` kotlin
        OkHttpClient.Builder()
                .addInterceptor(CurlInterceptor(Loggable { message -> Log.v("Ok2Curl", message) }))
                .build()
```

(Java)

```java
OkHttpClient okHttp = new OkHttpClient.Builder()
    .addInterceptor(new CurlInterceptor(new Loggable() {
            @Override
            public void log(String message) {
                Log.v("Ok2Curl", message);
            }
        }))
    .build();
```

OKHttpの通信をサクッとCurlにできるので便利。
ESP32からmqttしてin the dynamodb する。

このあたりの記事の続きとなります。

[リクガメのおウチの温度/湿度をモニターしてawsに投げるのを1000円くらいでやる(予定)](https://qiita.com/ikegam1/items/74d98ed702c280e815cb)
[温度/湿度をモニターしてaws IOTを介して…](https://qiita.com/ikegam1/items/0d45681489c0788fd01f)

とりえあず、温度や湿度をaws iotにmqttする所まではやってます。

## mqtt

あらためてmqtt。
送信をpublish、受信をsubscribeとざっくり考えていいんだろうか。
その送信側をesp32+micropythonにて実装しました。で、受信側がまだできてない。
試しに拾ってsnsに投げるのはやってみて無事出来てたけど。
今回は特定のTOPIC(kamekusa/DHT22)に投げたメッセージをin the dynamodbする。

## dynamodbにsubscribe

まんまコレかな。
[DynamoDB ルールの作成](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-ddb-rule.html)

なお、これはやっておきたい。
[DynamoDB の TTL (Time To Live) 機能を使って古いレコードを自動的に削除](https://hacknote.jp/archives/42161/)

古いデータいらんですしね。
まず投げるjson決めときましょう。
idはUUID的なの入れたいけどuuidのライブラリが標準でなさそうだしユニークになるtimeをそのまま入れておきます。ハッシュキーがidでソートキーがexpire。expireはtime+48時間にしておいてTTLの制御に使います。

```
{
  "id": "id1545826432",
  "expire": 1545826432,
  "d1": "22.2",
  "d2": "33.3"
}
```

## 現在時刻の取得

しかし、、microPythonで現在時刻どうとるねん。
ためしに```machine.RTC().datetime()```実行してみたらこうなるし。。

```
>>> print (machine.RTC().datetime())
(2000, 1, 1, 5, 0, 8, 16, 409726)
```

時刻合わせがわからんし、なんか時刻の起点も2000/1/1になってるし。
なんか余計な仕事っぽくて嫌やですけど、そういうの作ってくれてる方もおられますし、ntpから時間を取る処理を入れておきます。

[micropython on ESP32 でNTPサーバから時刻取得](http://ippei8jp.hatenablog.jp/entry/2017/08/18/135755)

ありがたく使わせいただきます。
で、無事取れたけどなんかちょっと値が違う気も。。まあいっか後でoffset分調整しよう。

```
>>> print("localtime=%s" % ntptime.time())
localtime=599141370
```

## publish側修正

```def mqttpub(tem,hum)```をこうしました。

``` Python:test.py
def mqttpub(tem,hum):
  a=usocket.getaddrinfo(mqtt_endpoint,8883)
  addr = a[0][-1][0]
  time = ntptime.time()
  msg = {
          "id": "id{}".format(time),
          "expire": time + 48 * 60 * 60,
          "d1": "{}".format(tem),
          "d2": "{}".format(hum)
        }
  msg = json.dumps(msg)
  client = MQTTClient(client_id="ESP2866DHT22", server=addr, port=8883, keepalive=5000, ssl=True, ssl_params={ "key":key, "cert":cert, "server_side":False })
  client.connect()
  print(str(client))
 
  loop = 10
  while loop > 1:
    print (".")
    try:
      res = client.publish(topic=mqtt_topic, msg=msg, qos=0)
      print('Sending: ' + msg)
      print(str(res))
      loop = 0
    except Exception as e:
      print('Could not establish MQTT connection')
      print (str(e))
      time.sleep(1)
      loop -= 1
```

## DynamoDB側とaws iot側

このへんは直感でイケると思うのでスクショだけで失礼します。

![26.png](https://qiita-image-store.s3.amazonaws.com/0/308709/838a9342-fc84-871b-955d-69c0d3666b5a.png)

![27.png](https://qiita-image-store.s3.amazonaws.com/0/308709/3248698e-2dd7-a204-820d-3360064720c9.png)

![28.png](https://qiita-image-store.s3.amazonaws.com/0/308709/4b5ecf66-78cb-f13d-703c-e54e045c60bb.png)

お。データ入ってきた。
（timeってなってるとこはこのあとexpireに変えました)

## ソース

https://github.com/ikegam1/esp32-2-dynamo-mycropython

sleepのやつはちょっと宿題です

## 今後の予定

- フロントからJSで値拾って表示
- フロントからmqttをpublish -> esp32でサーボ動かして給餌


2018/12/28追記
あまり深く考えずにこれだけでdeepsleepはできました。

```
  machine.deepsleep(60000*5)
```
python でファイルを read してリストにする時に、改行コードを入れない

こんなファイルがあるとして

```
$ cat /tmp/foo.txt 
foo
bar

pon
```

`readlines()`を使うとこうなっちゃう

```python
with open('/tmp/foo.txt', 'r') as f:
    lines = f.readlines()
    
    # print lines -> ['foo\n', 'bar\n', '\n', 'pon\n']
```

けど大抵の場合`\n`は付いてこなくて良いので、今まで何年もずっとこうやってた

```python
with open('/tmp/foo.txt', 'r') as f:
    lines = map(lambda s: s.strip(), f.readlines())

    # print lines -> ['foo', 'bar', '', 'pon']
```

どうも素直に左から読めないし、`map(strip, f.readlines())`って書けないしですっきりしないので悶々としてた

けど、こう書けることをたまたま知って、とても感動したのでメモ

```python
with open('/tmp/foo.txt', 'r') as f:
    lines = f.read().splitlines()

    # print lines -> ['foo', 'bar', '', 'pon']
```

これはすっきりしてて良いなぁ！
そんだけ！
VSCodeでコード整形ツール(Fomatter)を使用する

VSCodeでコード整形ツール(Fomatter)を使用したい場合の導入方法メモ。
1. Formatterのデフォルトのショートカットキーである「Ctrl + Alt + F」キーを押下する
   (Macの場合、英字モードにしてから「Shift + Option + F」を押下)
2. フォーマッターがインストールされていなければ、右下にインストールしますか？という通知が表示される
3. Yesボタンをクリックする (Installボタンだったかも)
4. pythonの場合、「$ python -m pip install -U autopep8 --user」のコマンドがターミナルに表示され、自動でautopep8のライブラリがインストールされる

これでCtrl + Alt + F(もしくは Shift + Option + F)を押すとコード整形できるようになります。

## 保存時にコード整形したい場合
1. メニューからFile -> preferences -> settings
2. formatOnで検索する
3. Format On Saveにチェックをつける

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/140953/b2d8cd1b-d5fe-2cf7-bd32-e6979218a7b6.png)

参考
https://code.visualstudio.com/docs/getstarted/keybindings 
https://devadjust.exblog.jp/23791887/
GitHubのREADMEでGoogle翻訳をかけるとプログラムコードも日本語化されて煩わしい思いをしている君へ

###以下のスクリプトをF12 → Consoleから実行します。
```魔法のスクリプト.js
Array.prototype.forEach.call(document.getElementsByTagName('pre'), x => x.classList.add('notranslate'))
```
その後に右クリックの「日本語に翻訳(T)」とかで翻訳します。
※ Google翻訳のChrome拡張入れていない人は[ここ](https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb?hl=ja)からどうぞ
##内訳
Google翻訳は.notranslateを持つタグ内は翻訳しない。
GitHubやnpmのコード部分は`<pre></pre>`タグで囲われている。
 → ページ翻訳かける前に`<pre></pre>`にnotranslateクラスを追加してあげればええんやね :heart_eyes:

ちなみに`<code></code>`内はデフォルトで翻訳スルーされるみたいです。

##翻訳する直前に毎回スクリプトを実行するのが煩わしい君へ
[ScriptAutoRunner](https://chrome.google.com/webstore/detail/scriptautorunner/gpgjofmpmjjopcogjgdldidobhmjmdbm?hl=ja)を使いましょう。
指定したホストのときに予め設定したスクリプトを自動で実行してくれるんやね:heart_eyes_cat:
以下、Qiitaの記事です。

[任意のサイトで任意のJavaScriptを自動実行させるChrome拡張](https://qiita.com/nakajmg/items/bcbf0e5debcfa70c8d63)
とりあえず★5入れておきました。

設定するとこんな感じになると思います。
![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/62209/5f330f8a-ba54-b2f4-3558-164eff37b7c5.png)

###以上！充実した翻訳ライフをお過ごしください :boar: :boar:
めっちゃ使えるpandasのメモリサイズをグッと抑える汎用的な関数

# はじめに
kaggleでpandasを使用していると、とんでもなく重いデータを扱わなければいけないことがあります。
どうすればいいのか途方に暮れていたところ、kaggleのカーネルに汎用的で使い勝手のいいコードが投稿されていたので紹介します。
※以下のコードはFabienDaniel氏による投稿を引用しています。偉大な先駆者に感謝です。
引用元：https://www.kaggle.com/fabiendaniel/elo-world

## データフレームのメモリ削減関数
```python:script.py
import pandas as pd
import numpy as np
def reduce_mem_usage(df, verbose=True):
    numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
    start_mem = df.memory_usage().sum() / 1024**2
    for col in df.columns:
        col_type = df[col].dtypes
        if col_type in numerics:
            c_min = df[col].min()
            c_max = df[col].max()
            if str(col_type)[:3] == 'int':
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)
    end_mem = df.memory_usage().sum() / 1024**2
    if verbose: print('Mem. usage decreased to {:5.2f} Mb ({:.1f}% reduction)'.format(end_mem, 100 * (start_mem - end_mem) / start_mem))
    return df
```

### 解説
pandasに詳しい方はご存知と思いますが、
csvから読み込んだデータなどは、データ型を指定しなければ`Int64`,`float64`が指定されてしまいます。
大量の数値データを扱う場合は、この指定がネックとなりメモリを大量に使用してしまうはめに。
上記コードは、カラムのデータ型がintかfloatの場合に最大値・最小値を鑑みて、適切なデータ型を指定するようにできています。

#### 使用例
```python:script.py
print('Importing data...')
historical_transactions = pd.read_csv('historical_transactions.csv')
print('start size: {:5.2f} Mb'.format(historical_transactions.memory_usage().sum() / 1024**2))
historical_transactions = reduce_mem_usage(historical_transactions)
```

<strong>【実行結果】</strong>
Importing data...
start size: <strong>3109.54 Mb</strong>
Mem. usage decreased to <strong>1749.11 Mb (43.7% reduction)</strong>

使用例に用いたcsvは読み込んだ時に3109.54 Mbありましたが、
無事1749.11 Mbまで軽くすることができました。
C#で処理をスタックして、呼び出す。

# はじめに
処理(メソッド)をまとめて実行したいとか、
処理を別々のスレッドで並列に捌きたいと思いました。

じゃあ処理をスタックしようか。

# サンプルソース

Listを使う。usingにこれを追加。

```cs
using System.Collections.Generic;
```

以下のコードぺたり。

```cs
// スタックを用意
var procStack = new List<Action>();

// ラムダ式で任意の処理をスタックする
procStack.Add(() => { Console.WriteLine("aaa"); });
procStack.Add(() => { Console.WriteLine("bbb"); });
procStack.Add(() => { Console.WriteLine("ccc"); });

// 任意の順番で呼び出す
procStack[2]();
procStack[0]();
procStack[1]();
```

コンソールの出力

```
ccc
aaa
bbb
```
# スタックした処理の逐次実行


```cs
List<Action> actions = new List<Action>();
int sum = 0;

// 処理を溜める
for (int i = 0; i < 10000; ++i)
    actions.Add(() => { sum += i; });

// 逐次実行
actions.ForEach(action => action());

Console.WriteLine(sum);
```

コンソールの出力

```
100000000
```

# スタックした処理の並列化

並列処理したいので、using追加。

```cs
using System.Threading.Tasks;
```

Parallel.ForEachメソッドはIEnumerableな型なら何でもOKなので、
ぱぱっと処理を並列化できる。

```cs
List<Action> actions = new List<Action>();
int sum = 0;

// 処理を溜める
for (int i = 0; i < 10000; ++i)
    actions.Add(() => { sum += i; });

// 並列実行
Parallel.ForEach(actions, action => action());

Console.WriteLine(sum);
```

コンソールの出力

```
53300000
```
そりゃsumの読み込みと書き込みのタイミングがバラバラだからこうなるよね。
気を付けようね。

ちなみにこの程度処理だと、逐次実行の方が1.7倍くらい速かった。
OS = Windows8.1 Pro 64bit
CPU = Intel CPUQ9550 : 2.83GHz 4core
逐次実行：1.017[ms]
並列実行：1.744[ms]

並列実行は、並列化のコストが無視できるくらい重い処理を走らせるのがいいかも。
Firebase 覚書


さいきんのfirestoreのアップデートで変更箇所が出たので共有する。

## firestore

```js

// INFO: https://qiita.com/teramotodaiki/items/b3592326579166003102
const firestore = window.firebase.firestore();
firestore.settings({/* your settings... */ timestampsInSnapshots: true});
firestore.getImages = ()=> {
  // Initialize Cloud Firestore through Firebase
  var db = firestore;
  db.collection("images").get().then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
      const timestamp = doc.get('created_at');
      console.log(timestamp);
      const date = timestamp.toDate();
      console.log(date);

      console.log(doc.data());
      console.log(doc.data().filePath);
    });
  });
  // getDownloadURL = ()=> `https://firebasestorage.googleapis.com/v0/b/${bucketName}/o/${encodeURIComponent(filePath)}?alt=media`,
};

```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17342/021bd9b1-9ca8-b221-58aa-03d01fe85a2d.png)
新人デベロッパーのためのマイクロサービス

#まずは結論
マイクロサービスアーキテクチャとはRestfulAPIのような小さな処理サービス群（例えばログイン処理、会員情報参照、ビジネスロジック）を集合させて一つの大きなサービスを作ることである
そしてRestfulAPIとはあるURLに対して
Requestを

```javascript

class Repository {
  postData() {
    const requestBody = {
      quantity: 50,
      comment: "品評会近いから頑張ります"
    }

    const urlPath = '/api/hogehoge'

    fetch(urlPath, {
      body: JSON.stringify(requestBody),
      credentials: 'include',
      headers: {
        'Content-Type': 'application/json',
        'X-XSRF-TOKEN': getCookie('XSRF-TOKEN')
        // トークンとかはここで指定する 上のX-XSRF-TOKENは一例
      },
      method: 'POST'
    })
    .then(response => {
      return response.json()
    })
  }
}
```
このような形で渡し、そのデータを元にサーバーで様々な処理をしてもらい
その結果のResponseを

```javascript

// responseの中身
// {
//   comment: "50個受け取りました",
//   status: "受け取った"
// }

class responseGet {
  constructor() {
    this.repository = new Repository()
  }

  getResponseText() {
    this.repository.postData()
      .then(response => {
        console.log(response.comment) //out 50個受け取りました
        console.log(response.status)  //out 受け取った
      })
  }
}

```

受け取ることができる"場所"のようなものである

#はじめに
僕が新人だった頃社内では「マイクロサービス」という言葉が流行っていました
はっきり行ってしまえばチンプンカンプンでした
自身がこれまで理解したこととチンプンカンプンな人を少しでも減らすために一度簡単にまとめてみようと思います
少しでも理解がすすんでくれるととても嬉しいので上にRequestからResponseの簡単な一つの例を載せておきますが他にも方法はあるので参考程度にしていただけたら嬉しいです
そして僕自身の考えの変遷とどのような問題にブチ当たったか残しておきます
それ故にそんなの分かってるということでも丁寧にカッコ書きで注釈するのでご了承ください

#思い込みの壁
新人だった頃の知識としてバックエンド言語（JavaやGolang）は
・DB処理
・ページを表示するためのHTMLを吐き出す
などwebアプリケーションはバックエンド言語一つで全てをこなすんじゃないかという万能な言語で、JavaScriptは軽視されていました（実際研修や学校でも一切触れることはありませんでした）
この前提知識があったこともあり、マイクロサービスとは反対のモノリシックな思考をしておりそのシステムでしか使えない汎用性と保守性がとても低いコードばかり書いていました
1~2年目に書いたコードはGolangを使いながらもHTMLをString型で組み立てて、htmlTemplateとして吐き出し表示、JavaScriptはページに簡単な変化をもたらせる言語(例えば一定時間たったらリロードする)という認識で目も当てられないものでした
一人で書いていたということや指摘もなかったこともあり今後もこのような形で作ればよいのかと勝手に考えていました

しかしTwitterやQiitaを見ているとバックエンドは情報を取得してきてそのデータを利用してJavascriptで表示することが主流であるということが分かってきました
どのようにやっているのだろうという単純な疑問と興味がわいてきたので調べて実際に書いてみようと思いました

#Request?Response?問題
ブチ当たった大きな問題として「Requestどう投げればいいかわからねえ！」でした
Getに関してはURLを指定してfetchすればよいだけだったのでよかったのですが、Get以外が調べてもはっきりとわかりませんでした
そもそもJSONとは何かということやfetchにつけるオプション、ラスボスとしてトークン周りをどのようにRequestに含めればよいかさっぱりなど分からないことだらけで、周りにも聞くことが出来ない状態だったのでGoogleのAPIをひたすら試すことができるページやGoogleCloudPlatformのログを調べまくっていました
あるときGoogleCloudPlatform内でheadersという項目を見つけました
試しにそのように記載したところどうにかResponseが帰ってくるようになりました上

もう一つ当たった問題として「Responseまではconsole出力できたけどどうやって参照すればいいか分からねえ！」という問題も出てきました
こちらは幸いにもIDE（統合開発環境）が賢く試しに書いて見た所候補を出してくれたので、ことなきをえました
目で見える情報と使用するIDEはホント大事…

問題を解決していく中で「あれ？これデータを受け取ることに特化してるからいろんな所で使い回しがきくのでは？」と思いました
そこでもう一度マイクロサービスという言葉について調べると何を言っているのかが理解することが出来ました

#やっと分かったよマイクロサービス
ここまでの流れを経てやっとマイクロサービスというものがどういうものであるかという輪郭をつかむことが出来ました
現在はwebアプリケーションを作成していてAPIの作成、バックエンド処理、フロントエンド処理というものをしっかりと意識し、コードを書くことができるようになりました
コツとして表示したいページでは
・どのAPIを使ってデータを取得するのかしっかりと調べること
・もしもAPI作成する場合は着手する前にどのようなResponseがバックエンドから帰ってくるのかというイメージをしっかりと持つこと
が学びとしてありました

#最後に
簡単ですが以上まとめになります
ご指摘などありましたらぜひお声かけください！まだまだ勉強したいのでよろしくお願いいたします
Elixir and Ruby Language Uses 

![Elixir and Ruby](https://d32myzxfxyl12w.cloudfront.net/assets/images/article_images/0605a79466349a8106e31f831b53480eff5f4feb.png?1542887761)
These two languages and frameworks can coexist without any competition and be actively utilized. It is possible to take advantage of both, but for different types of projects. All is simple if you have project requirements, strategy, and know the pros and cons of Rails and Phoenix. What you should do is to decide which of the frameworks is a good fit for your project based on the knowledge you already have.

Below, there are some hints to help you make your choice. 

###What is Ruby Language Used For?

Many programmers believe that Ruby is the best language for web development. This title could be fair, especially if applied in the following cases:

- Prototypes

Prototypes are built to tell the world about your idea and show investors or potential users what you are looking to create.

- MVP

MVP is usually created to quickly enter the market. Generally, new products do not receive much traction all at once, but gain users step by step. 

- Small and fast apps

Small applications do not need the power of Elixir and Phoenix. 

- Apps with a small number of users

If you know that your application will be used by a limited number of users, Ruby on Rails will provide enough opportunities for you to implement desired features.

- Websites

Ruby on Rails has been around for quite a long time and there are thousand of websites created with its help. It is still great for website development.

###What is Elixir Used For?

The analysis of Elixir and Phoenix web development advantages shows that these technologies can be used for any project, but they are needed most for the following implementations:

- Apps with concurrent connections
- Apps with high user load
- Products that will need scaling in the future
- Distributed systems
- IoT projects

Follow this [article](https://mlsdev.com/blog/elixir-vs-ruby-and-phoenix-vs-rails-what-to-choose-and-why) to find out more on these languages and how they should be better utilized.
#システム #アーキテクチャ #とは #川の流れ #学習 #まとめ TW @hiroki_daichi

[なぜ、組織のつくりとソフトウェアアーキテクチャは似てしまうのか - Qiita](https://qiita.com/hirokidaichi/items/d12fcce80ee593bcf34d)

# アーキテクチャとは何か

たとえばAmazonのおすすめ商品は、ユーザーの消費行動の傾向を変える。

>Amazonのレコメンドシステムはユーザーに対して以前購入したものと同じような書籍を購入しやすくすることで、より消費をすることを促すようになります。

# これはRuby on Rails などのフレームワークでも同じ

>たとえば、Ruby on RailsなどWeb Application Frameworkは、Webサービスを作りやすくする代わりに、様々な制約を課します。

# アーキテクチャとは「水が流れる方向を作ること」らしい。

>このように「しやすさ・しにくさ」を提供し、「ある方向に」人々を導く構造のことをアーキテクチャとして理解すると


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c4f25a1e-a03f-2d69-eb44-e273b2edd26f.png)


[組織論yumainaura - Google Search](https://www.google.co.jp/search?q=%E7%B5%84%E7%B9%94%E8%AB%96yumainaura&oq=%E7%B5%84%E7%B9%94%E8%AB%96yumainaura&aqs=chrome..69i57.2577j0j7&sourceid=chrome&ie=UTF-8)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Kibanaのデザインを6.0以前に戻す

#Kibanaのデザインを6.0以前に戻す

忘れないように備忘録として残しておきます。

Management の　Advanced Settings で変更できます。
ちなみに、Elasticsearch6.5.0以上で、逆にK7のデザインをSpaceごとに反映できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/159184/de1796a4-a758-5ede-3668-73f168afaa58.png)
BitVisor用のclang-format設定

皆さんこんばんは．Advent Calendar終わったのにBitVisorの記事を投稿しています:joy:[^1]．
今年個人的に結構便利だと思った設定を思い出したので，共有しておきます．

[^1]: Advent CalendarじゃないとBitVisorの記事を投稿してはいけないというルールはないです:joy:

---

[clang-format](https://clang.llvm.org/docs/ClangFormat.html)というツールがあり，これを使うと自動でソースファイルを整形してくれます．

BitVisorのコーディング規約に関して，以下の記事があります．

- hdk_2, [BitVisorのコーディングスタイル
](https://qiita.com/hdk_2/items/3c74c2f166c83db17c87), BitVisor Advent Calendar 2015.

clang-formatのフォーマット設定は`.clang-format`に記述することになっています．上記記事を参考に設定してみましょう．

## .clang-format

```yaml
BasedOnStyle: 'google'
AlignConsecutiveAssignments: false
AlignTrailingComments: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: 'None'
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: true
AlwaysBreakBeforeMultilineStrings: false
BinPackArguments: true
BinPackParameters: true
BreakBeforeBinaryOperators: 'None'
BreakBeforeBraces: 'Linux'
ColumnLimit: 80
ConstructorInitializerIndentWidth: 8
ContinuationIndentWidth: 8
IndentWidth: 8
DerivePointerBinding: true
IndentCaseLabels: false
IndentWrappedFunctionNames: false
PointerAlignment: 'Right'
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: 'Always'
SpacesBeforeTrailingComments: 1
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
Standard: 'Cpp03'
TabWidth: 8
UseTab: 'Always'
```

上記記事の以下の項目が考慮されてるかなと思います．

- :o: タブは8桁、関数の引数等で折り返しが必要な場合はタブとスペースを組み合わせて位置を合わせる
- :o: 関数定義は関数名の前で改行 (grep用)
- :o: 関数定義・関数呼び出しともに関数名の後ろにスペース
- :o: if文等のキーワードの後ろにもスペース
- :o: 79桁までで折り返す (守られてないところもある)
- :o: 関数定義の { は単独の行に、それ以外のif文等で使われる { は同じ行に
} は単独の行に
- 16進数は0xを小文字、その後ろを大文字に
- :o: switch-caseのインデントはswitchとcaseを同じ深さに、ラベルがある場合はラベルも同様
- :o: 行末にスペースやタブを置かない
- :o: if文等の後ろの文が1文なら { } を省略してもいいし、してないところもある (適当)
    - 自分で{}を省略すれば省略されます．
- コメントを含めUS-ASCIIのみ使用
- :o: ,の後ろや演算子の前後には1つ以上のスペース

Base styleがgoogleなのに特に深い理由はありません．上記以外の設定は適当です．
各設定については以下にドキュメントがあります．

- http://clang.llvm.org/docs/ClangFormatStyleOptions.html

## 使い方
上記の.clang-formatファイルをプロジェクトのルートに配置したあと，

```sh
clang-format -i core/main.c
```

みたいにすればフォーマットされます (`-i`オプションでinplaceに変更）．

多くのエディタでclang-format用のツールがあると思います．自分は[vim-clang-format](https://github.com/rhysd/vim-clang-format)を利用しています．

ファイル保存時に自動でフォーマットするようにすると便利ですが，一方で既存のBitVisorのコードが全てこの.clang-formatの設定に従っているわけではなく，フォーマットかけてしまうと変更点が増えてしまい，diffも分かりにくくなるので必要に応じてフォーマットかけたい部分だけ選択してフォーマットするのが良いのかな，と思います．
Web Audio APIでオーディオ入力のメモ

# はじめに
タイトルの通りです。Web Audio APIを使ってオーディオを入力します。
ハッカソンで実装する際に調べたので、そのメモです。

# サンプルコード
単刀直入にサンプルコード(JavaScript)です。

```js
$(function() {
  navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;

  navigator.getUserMedia (
    {
      video: false,
      audio: true
    },

    function(stream) {
      var source = ctx.createMediaStreamSource(stream);
      source.connect(ctx.destination);
    },

    function() {
      // error handler ( no operation )
    }
  );
```
# 説明
getUserMediaのパラメータの意味は以下の通りです。
第一引数: 入力メディアの種類を指定
第二引数: メディアを取得できた場合に呼び出されるコールバック処理
第三引数: メディア取得失敗時のコールバック処理

上記サンプルコードでは何もせずにオーディオ入力をそのまま出力しています。

# 留意事項
- ブラウザ経由でgetUserMediaを使用してビデオやオーディオのメディアを取得する場合は、セキュリティ上、https接続である必要があります。ApacheやNodejsでhttps接続できるようにしましょう。
- やはりJavaScriptだとレイテンシが大きく、リアルタイム入力として使うには難があるようです。。
Success TypingのCase規則の改善案


## 既存の問題点

Dialyzerのアルゴリズム success typingには独特のユルさがあります。その１つがcase式の型導出規則です。
次のerlangコードを見てください。

```case_expr.erl
run(N) ->
    case N of
        0 -> 'foo';
        1 -> 100
    end + 3.
```

この関数 `run` は N=0の場合に `'foo' + 3` となってしまうため型エラーになって欲しい気がしますがDialyzerはこれをパスします。

### Success Typingがこれを許すメカニズム

型推論木は次のようになります

$$
\frac{
\displaystyle\frac{}{\texttt{+}:\texttt{number()}^2\to\texttt{number()}}　
\displaystyle\frac{
  \displaystyle\frac{}{A\vdash \texttt{N} : \alpha_N}
　\displaystyle\frac{}{\texttt{0:0}}
　\displaystyle\frac{}{\texttt{1:1}}
　\displaystyle\frac{}{\texttt{'foo':'foo'}}
　\displaystyle\frac{}{\texttt{100:100}}
　\displaystyle\frac{}{\texttt{}}
}
{A\vdash \texttt{case N of ... end} : \beta_c, (\beta_c=\texttt{'foo'}\wedge\alpha_N=0)\vee(\beta_c=100\wedge(\alpha_N=1)}　
\displaystyle\frac{}{\texttt{3:3}}
}
{A\vdash \texttt{case N of 0 -> 'foo'; 1 -> 100 end + 1} : \beta_+, ...\wedge(\beta_c\subseteq \texttt{number()}) \wedge (↑)}
$$

得られる型制約は次のようになります

- Conj
  - ...
  - $\beta_c \subseteq \texttt{number()}$
  - Disj
     - ($\beta_c=\texttt{'foo'}) \wedge (\alpha_N=0)$
     - ($\beta_c=100) \wedge(\alpha_N=1)$

この制約は次のように解かれ、型チェックは通ります。

- $\beta_c \mapsto 100$
- $\alpha_N \mapsto \texttt{0 | 1}$
 
主な原因は casek規則に置いて、各パターンの制約を $\vee$ で結合してしまっていて、どこか１つの場合で型制約が通るものがあればよいとしてしまっているところにあると思います。

$$
[CASE]
\frac{A\vdash e:\tau, C_e　　A\cup \\{  v\mapsto \alpha_v | v\in Var(p_i) \\}\vdash p_i:\tau_i,C_i^p　　b_i:\sigma_i,C_i^b}
{A\vdash \texttt{case } e \texttt{ of } p_i \to b_i \texttt{ end} :\beta ,
C_e\wedge 
\displaystyle\bigvee_i
\left(
(\beta=\sigma_i)\wedge(\tau=\tau_i)\wedge C_i^p \wedge C_i^b
\right)
}
$$

## 改善案

[CASE]規則を次で置き換えます。

$$
[CASE']
\frac{A\vdash e:\tau, C_e　　A\cup \\{  v\mapsto \alpha_v | v\in Var(p_i) \\}\vdash p_i:\tau_i,C_i^p　　b_i:\sigma_i,C_i^b}
{A\vdash \texttt{case } e \texttt{ of } p_i \to b_i \texttt{ end} :\beta ,
C_e \wedge \left(\tau \subseteq \displaystyle\bigsqcup_{i} \tau_i\right) \wedge \displaystyle\bigwedge_{i} \left(\sigma_i \subseteq \beta \wedge C_i^p \wedge C_i^b \right)}
$$

この規則への変更で、得られる型制約は次のように変わります

- Conj
   - $\beta_c \subseteq \texttt{number()}$
   - $\texttt{'foo'} \subseteq \beta_c$
   - $\texttt{100} \subseteq \beta_c$

これで、この `run` 関数を型エラーにできるようになります。

### 新しい問題点

上記で与えた[CASE']への修正によって、通って欲しいコードが型エラーになってしまう困った事例があります。次のコードを見てください

```case_expr2.erl
run(X) ->
    case X of
        X when is_integer(X) -> X + 1;
        'ok' -> 0
    end.
```

このコードは `X when is_integer(X) ->` の場合の右辺では　`X`が `integer()` 型であることを使ってパターンごとで違う制約を与えています。すごいです依存型みたいですね。このコードは型エラーにしたくないですが、我々の修正案を入れると型エラーにしてしまいます。

## 参考文献

- [Lindahl, Tobias & Sagonas, Konstantinos. (2006). Practical type inference based on success typings. 2006. 167-178. 10.1145/1140335.1140356. ](http://www.it.uu.se/research/group/hipe/papers/succ_types.pdf)
- [amutake. (2017). 静的に型がつく Erlang を目指して. 進捗大陸01. 31-46. 技術書典2 う-17](https://shinchokutairiku.booth.pm/items/491301)

## 宣伝

dialyzerより軽くて早いErlangの型検査ツールをOCamlで開発しています。

- https://github.com/dwango/fialyzer/
1年目iOSエンジニアがAWS SAAを取得した勉強法

こんにちは。
普段は、iOSアプリ開発🍎をしている新卒エンジニアのよっしーです。

ここ最近は、

- iOSだけじゃなく **周辺のスキルセットをバランスよく身につけないと、より良いiOSエンジニアになれないと思った。**
- **インフラを知ることで、問題の切り分けができるようになりたい**と思い、そのきっかけを作りたいと思った。
- 弊社(株式会社ゆめみ)がAWS資格の取得に報奨金を出しており、キャンペーン中で12月末まで高額。(SAAは8万円、SAPは20万円)

という理由から、12/25にAWS SAA(Solution Architect Associate)の試験をスケジューリングして、勉強をしておりました。

そして昨日、クリスマス🎄はさておいてAWS試験を受け、無事試験をパス🎉することができましたので勉強法を共有したいと思います！

# 想定読者
インフラやサーバサイドをやったことないけど、クラウド/AWSを触ってみたい **ネイティブエンジニア** や **フロントエンジニア** の方々。

# 参考にしたもの
[AWS 認定 Associate level を大体一ヶ月で取った話](https://qiita.com/yutachaos/items/2b0b8d9bfe76a597953c)

会社の先輩から「自分が取った時、これが参考になったよ！」と紹介を受けたので、こちらの記事を参考にして計画を立てていきました。

# 勉強開始前の状態
- AWSの機械学習系のサービスや、いくつかのサービスを勉強会などで試した程度。
- iOSのapple-app-site-associationファイルを置くのに、s3をちょろっと触った。

The・初心者！

# スケジュール
11/2 試験申し込み、試験勉強開始 
~ 終業後や土日に試験勉強
12/25 試験当日

# 合格に向けて勉強したこと
- [合格対策 AWS認定ソリューションアーキテクト －アソシエイト](https://www.amazon.co.jp/dp/B01LZ2CBKB/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)を繰り返し読んで、サービス概要と特徴を理解をする
- [blackbelt](https://aws.amazon.com/jp/aws-jp-introduction/)を読む
- [AWS Web問題集](https://aws.koiwaclub.com)のゴールド会員に課金して、問題解きまくる
- [3分間ネットワーキング](https://www.amazon.co.jp/改訂新版-3分間ネットワーク基礎講座-網野-衛二/dp/4774143731)
- [Amazon Web Services 基礎からのネットワーク＆サーバー構築 改訂版] (https://www.amazon.co.jp/dp/B06Y5ZSYY4/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
- 実際に動かす

AWSの青本(合格対策 AWS認定ソリューションアーキテクト －アソシエイト)を読んで、疑問に思った点をブラックベルトで確認していくのは最低限必要だと思います。しかし自分的には、ある程度理解した後に、 **AWS WEB問題集を解きまくるのが効果的でした。**

「へー。こんなオプションあったんだ！🤗」というのをテスト駆動で学習を進めていくと、効率的にAWSの各種サービスについての知識を付けることができたと思います。

あとは、そもそも本業ではないネットワークの知識が弱かったので3分間ネットワーキング読んだり、AWS使ってブログサイトをデプロイしてみよう！っていう本読みながら手を動かしたりしていました。

最後に、得た知識を使ってイメージ通りの構成を作れるかなど実際に手を動かしてすり合わせを行いました。

# 勉強の進め方
青本読む
→ブラックベルトで確認する
→実際に触ってみて概念やユースケースを視覚的に理解する
→**問題解きまくる(これ大事！)**

こんな流れで進めました。スタートは青本がわかりやすくてオススメです。

途中で「あれ？これネットワークの知識が理解のボトルネックになってる？」と思ったら、その箇所の勉強をする。っていうのは挟んでいます。

# 要注意事項
2018年度中盤から新試験が導入されたので、試験配分がかなり変わり以下のようになっております。
 
試験における比重は[試験ガイド](https://d1.awsstatic.com/training-and-certification/docs-sa-assoc/AWS%20Certified%20Solutions%20Architect%20-%20Associate%20Exam%20Guide%20001%20v1.5%20JPN.pdf)の通りに表示しています。

| 種別       |   内容 |    割合    |
|:-----------------|:------------------|:------------------|
| 分野 1             |     回復性の高いアーキテクチャを設計する  |        34%        |
| 分野 2             |     パフォーマンスに優れたアーキテクチャを定義する  |        24%        |
| 分野 3             |     セキュアなアプリケーションおよびアーキテクチャを規定する  |        26%        |
| 分野 4             |     コスト最適化アーキテクチャを設計する  |        10%        |
| 分野 5             |     オペレーショナルエクセレンスを備えたアーキテクチャを定義する  |        6%        |

以前の試験では可用性に6割近い配点があったのが新試験からは3割強になって、全体的に分散しています。

そのため、可用性への対応が分かればある程度の合格見込みがある。ということはなくなったので、満遍なく勉強する必要があります。

加えて、サービスは毎年更新されており **青本の内容が古い可能性が高いので**、古い知識のまま試験に挑まないように注意が必要です。 **問題集の内容はかなり新しかったので、その点でも助かりました。**

# 終わってみて
AWS SAAの試験を受けるにあたって、ネットワークやサービスの知識を勉強することができたので楽しかったです！(結構突貫工事的な勉強だったので、時間的には辛いところもあったのですが...。😅 まぁそれも楽しみの１つ。

運用経験がなく、実戦投入は難しいことは理解しておりますが、AWSを使ってサービスを構築したい時に最低限ググれるぐらいのインデックスはできたかなー？と思うので、これをきっかけにしてAWS&インフラへの理解を進めていきたいと思います！

強いエンジニア💪になりたい...。頑張るぞ！

お読みいただきありがとうございましたー。
seabornのpairplotをカスタムして相関係数を表示する（欠損値にも対応）

seabornのpairplotは便利だが、相関係数も確認できればな・・・と思ったので作ってみた。
欠損値があってもwarningが出ないようにしている。

```python
import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

def draw_hist(x, **kws):
    plt.hist(x[~np.isnan(x)])
    
def corr_func(x, y, **kws):
    mask = ~np.logical_or(np.isnan(x), np.isnan(y))
    x, y = x[mask], y[mask]
    r, _ = stats.pearsonr(x, y)
    ax = plt.gca()
    ax.annotate("r = {:.3f}".format(r),
               xy=(.2, .5), 
               xycoords=ax.transAxes,
               size=16)

def pairplot(df):
    g = sns.PairGrid(df, height=1.6, dropna=False)
    g.map_diag(draw_hist)
    g.map_upper(sns.regplot, scatter_kws={"s": 8}, line_kws={"color":  "r"})
    g.map_lower(corr_func)
```

```python
from sklearn.datasets  import load_boston
boston = load_boston()
boston_df = pd.DataFrame(boston["data"],  columns=boston["feature_names"])

pairplot(boston_df.iloc[:,:6])

```

<img src="https://qiita-image-store.s3.amazonaws.com/0/132208/c95890aa-c3c0-c812-ebec-a70b08898651.png" width=70% style="text-align:center;">

ちなみに、sns.heatmapでannot=Trueとすると値が表示されることに後から気づいた。まあ散布図と一緒に確認できるので。。


```python
sns.heatmap(boston_df.iloc[:,:6].corr(), annot=True)

```
<img src="https://qiita-image-store.s3.amazonaws.com/0/132208/dc91d409-4c4e-4d9f-f6c3-9e70dd3c41a2.png" width=50% style="text-align:center;">
mysqlのbundle installに失敗する

おなじみのmysqlで失敗するので備忘録

OS: macOS mojave
Ruby: 2.6.0

```
...
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/corocn/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/mysql2-0.5.2 for inspection.
Results logged to /Users/corocn/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-18/2.6.0-static/mysql2-0.5.2/gem_make.out
```

OpenSSL周りが原因っぽい

以下試してエラー
https://qiita.com/akito19/items/e1dc54f907987e688cc0

ログ見たら --with-cppflags オプションに対応してないとのこと。
ldflagsのみで実行してみる

```
bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
bundle install
```

通った :tada:
Ada言語 13日目 関数

#はじめに
今回は関数を使ってみました。

#ソースと結果
```main.adb
with Ada.Text_IO;
with Ada.Integer_Text_IO;
use Ada.Text_IO;
use Ada.Integer_Text_IO;

procedure main is

   hennsuu1 : Integer := 0;
   
   -- function kannsuu1(hikisuu1 : Integer) return Integer;
   
   function kannsuu1(hikisuu1 : Integer) return Integer is
      hennsuu2 : Integer := 0;
   begin
      Ada.Text_IO.Put_Line("call kannsuu1");
      hennsuu2 := 100;
      return (hennsuu2 + hikisuu1);
   end kannsuu1;
   
begin
   
   Ada.Text_IO.Put_Line("Ada : sub program");
   
   hennsuu1 := kannsuu1(50);
   
   Ada.Integer_Text_IO.Put(hennsuu1, 1);

end main;
```

まず、コメントアウトしてある1行はC言語のプロトタイプ宣言にあたるものだと思います。
この1行を入れても入れなくても動作することを確認しました。

関数を宣言する場所は変数を宣言する場所と同じらしいです。

`実行結果1行目 : call kannsuu1`
`実行結果2行目 : 150`

#最後に
どうやらAda言語はクラスも使えるらしいのです!

#日記一覧へ
[Ada言語を習得する日記一覧](https://qiita.com/C_Assembly/items/50a0f9d8542679d92ea8)
Oracle Cloud Infrastructure(OCI) Database System のスケールアップ注意点

# はじめに
Oracle Cloud Infrastructure(OCI)のDatabase Systemについて、Cloudならではの気になった部分があるため導入前の注意点について"少し"まとめてみました。
少しでもOracle Cloudの導入の手助けになれば…

**前提：今回は対象をVirtual MachineとしてBare Metalを対象としていません。**

## Database Systemのスケールアップ
2018.12.26時点ではスケールアップの仕様は以下となります。
- StorageのスケールアップはConsoleからボタン1つで可能
- CPU/MemoryのスケールアップはConsoleからボタン1つで不可能

そうすると、1回Database Systemを構築してしまうと、CPU/Memoryのスケールアップが出来なくなってしまう？となってしまいますが、安心してください。
その場合は、以下の方法で対応が可能です。
- Standaloneバックアップを取得する
- 上記のバックアップを使用して、新規Database Systemを構築する
※要はバックアップを取得して、他サーバーにリストアする

参考URL(https://docs.cloud.oracle.com/iaas/Content/Database/Tasks/recoveringOS.htm)
　>　Creating a New Database from a Backup
　　>　To launch a new DB system from a backup

しかし、これを使用するために以下の制約があるためご注意ください。
- 同じAD内でDatabase Systemが構築される ---☆1
- 1node → RAC等の変更は不可能
- Database Editionは同じかそれ以上であること
- 同じhost名は使用できない（同じサブネット内で）---☆2
- Data Guard構成はサポートされない

また、マニュアルには記載ありませんが、構築画面や他の設計で注意が必要そうなのを以下に記載します。
- Database Systemの構築画面は、Internal IPアドレスをOptionで設定できないため、同じInternal IPアドレスは使用できない可能性がある→できなかった！
- 稼働後の運用にて、本番DB → 開発DBの構築で画面を使用したい場合は、☆1の制約から同じAD内で設計する必要がある
- 同じhost名を使用したい場合は、☆2の制約から既存のDatabase Systemを削除する必要がある
- 初期化パラメータのいくつかは設定が変わってしまう。(確認したのはSGAやPGAのみで全ては確認していない)
- OS領域の拡張はできない


今後、他にも情報Updateあったら追加していきます。
スケールアップについて検証したため以下にリンクを作成。
[Oracle Cloud Infrastructure(OCI) Database System のStandalone Backupからの構築(検証編)](https://qiita.com/untitle_23/items/6cd93f98a7a47d8ad2b6)
Real Sence D400シリーズ備忘録

# 始めたいけど情報古いの巻
ひょんなことから会社で遊べるようになった RealSense D435。しかし、情報と実際がとてつもなくかけ離れていたのでした。簡単にUnityで色々出来ると聞いていたが。。

## なぜか古い情報のUnity公式
[Unity公式](https://unity3d.com/jp/partners/intel/realsense)
ここに貼られているリンクはいずれも下記のクローズ済みのサイトです。
とは言え2014年位の情報を元に作られたものなので当然と言えば当然ですね。

## なぜかCloseの公式
[Intel® RealSense SDK for Windows* (Discontinued)](https://software.intel.com/en-us/realsense-sdk-windows-eol?_ga=2.146212660.1886597265.1545182386-982184311.1545131459)

後から分かったのですが、どうもこの辺の情報はD400シリーズ以前の古い型番。既に閉じており、サポートもありません。

## ページの中にGitHubへのリンクを見つける
途方に暮れていたのですが、よくよく見るとGitHubへの誘導リンクが一つ貼られていました。SDKもメジャーバージョンが更新され、バージョン2.x.xが配布されていました。
[GitHub : IntelRealSense/librealsense](https://github.com/IntelRealSense/librealsense)

上記をクローンしてビルドしても良いのですが、ビルド済みのリリース製品があります。

[リリース](https://github.com/IntelRealSense/librealsense/releases)
* rssetup-2.17.0.394.exe
* Intel.RealSense.unitypackage <- [NEW] 2.16.0から

# D400 シリーズにハンドジェスチャーは無い(2018.12現在)
https://github.com/IntelRealSense/librealsense/issues/1176

# D400 シリーズとUnitySDKで現在できるすべての事(2018.12現在)

https://github.com/IntelRealSense/librealsense/tree/master/wrappers/unity

> RealSense SDK 2.0用のUnityラッパーにより、Unity開発者は提供されたテクスチャを使用してRealSenseデバイスからシーンにストリームを追加できます。 1行のコードをコードすることなく、Unity Inspectorを使用してデバイス設定とテクスチャバインディングを可能にする使いやすいプレハブを提供することを目指しています。このラッパーを使用することで、Unity開発者は、カラー、デプス、赤外線テクスチャのライブストリームを取得できます。さらに、（奥行きを使用して）テクスチャを互いに整列させる簡単な方法と、背景のセグメンテーションの例を提供します。

RealSenseD435はRealSenseD400シリーズです。
RealSenseD400シリーズで現在提供されている機能はカラー映像と赤外線映像と深度映像をテクスチャ化することだけです。それ以外の音声認識やジェスチャー認識、顔認証は現在提供されていませんでした（[2018年12月現在](https://software.intel.com/en-us/realsense-sdk-windows-eol/notice)）。

ソース的には1フレーム分の画像をTexture2D型で毎フレーム受け取れるので、加工はとても簡単そうでした。私はReal SenceがただのWeb Cameraと化すので不本意ながらも。OpenCVとの組み合わせは実現可能であることはテスト済み。

#TIPs
##x86でも動くの？
動きます。付属のUnityパッケージは64bitのdllが入っています。x86版が欲しい場合はインストール内容の下記のパスにそれぞれのアーキテクチャのDLLが入っています。

```txt:パス
C:\Program Files (x86)\Intel RealSense SDK 2.0\bin\x86
C:\Program Files (x86)\Intel RealSense SDK 2.0\bin\x64
```
[target platform x86 BadImageFormatException](https://github.com/IntelRealSense/librealsense/issues/1544)

##デバイス認識しないエラー
USB3.0かどうか確認しましょう
[Couldn't resolve requests #2818](https://github.com/IntelRealSense/librealsense/issues/2818)

#困ったこと
##Windows7とUnitySDKの相性は最悪？
2.17.0.394では、Windows7上で動作できませんでした。Win10で作ったexeもWin7では×。
Win7+Unityエディタ上でクラッシュします（サンプルシーンでさえも）。

と思ったら、下記の通りWin7は動きません。。
https://www.intel.co.jp/content/www/jp/ja/support/articles/000025567/emerging-technologies/intel-realsense-technology.html

以上。

#参照
[RealSense SDK Unity ToolkitによるUnityアプリ開発の基礎](https://www.buildinsider.net/small/bookrealsense/0801)

[RealSense SDK 2.0 を自力でビルドして、C++やUnityで使う@Windows](http://izmiz.hateblo.jp/entry/2018/03/15/223503)

[奥行きも検知できるIntelの3Dカメラ「RealSense™ D415」触ってます！](https://ideacloud.tokyo/develop-days/development/intel_realsense_d415.html)