OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで「SyntaxError: Non-ASCII character〜」が出てしまった時の解決法

さっき真っさらなところからPythonファイルを作って見たところ下記のエラーが発生しました。


```
SyntaxError: Non-ASCII character '\xe5' in file ファイル名 on line 16, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
```

encodingが宣言されてないからここ見て直して、というものだったので下記URLを確認。

https://www.python.org/dev/peps/pep-0263/

ページのタイトルが「Defining Python Source Code Encodings」ということで、ちゃんとencodingを定義してね、という内容でした。

よくよく自分の作ったファイルを見返してみるといきなりimportしていて、いつものおまじない文を忘れていました。

```
# -*- coding: utf-8 -*-
```

ということだったのでこちらを追加して無事解決しました。
Swift：大文字か小文字か区別する

#はじめに
アプリ開発中に文字列の処理を行うことはよくありますよね。Swiftの場合大文字と小文字に変換するメソッドはあるのですが、その文字が大文字なのか小文字なのか区別するメソッドが無いよう（Cのメソッドはある）なので、作ってみました。

#ソースコード
```swift:CharacterExtension.swift
extension Character {
	func isUpper() -> Bool {
		return String(self).range(of: "[A-Z]", options: .regularExpression) != nil
	}

	func isLower() -> Bool {
		return String(self).range(of: "[a-z]", options: .regularExpression) != nil
	}
}
```

#説明
`Character`クラスを拡張してメソッドを追加しました。
パターンマッチも扱いが面倒な`NSRegularExpression`を避けて`String`クラスの`range`メソッドを使ってみました。
実際に扱うときは、

```swift
let str = "Hello World!"

for c in str {
	print(c.isUpper())
}
```

のようにすればOKです。
【しずおかアプリ部】活動ログ　第48回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)

##■公式サイト##
[http://monolizm.com/shizuoka-app](http://monolizm.com/shizuoka-app)
「Slack」も利用しています。 shizuapp で検索し、ご参加ください。

##◾️参加申し込み##
しずおかアプリ部への参加申し込みは[こちら](https://shizuoka-app.connpass.com/)から

##■タイトル##
第４８回


##■開催日##
２０１８年３月２４日（土）　１６：００～１８：００


##■参加者##
１５名


##■活動内容（概要）##
・部員さんプレゼン「ゲーム企画の相談」
・菅原プレゼン「Unity始めるよ　〜高速化テクニックLODに関するTips〜」
・部員さんプレゼン「Flutter」について
・雑談


##■活動内容（詳細）##

【実演・プレゼン】


**・部員さんプレゼン「ゲーム企画の相談」**
　企画中のゲームなので詳しくは載せられないが、
　360度写真を使ったゲーム。
　ゲームの内容を一通りプレゼン後、部員さん達から様々な意見が出てきた。
　アイディアをまとめるのはなかなか大変なことだが、
　ぜひ、企画をパワーアップに繋げるきっかけになってほしい。
![スクリーンショット 2018-03-24 20.46.27.png](https://qiita-image-store.s3.amazonaws.com/0/88105/64fa1455-4a37-97a5-7b33-5ef48b13f5c5.png)


<hr>


**・菅原プレゼン「Unity始めるよ　〜高速化テクニックLODに関するTips〜」**

　いつかはやらなきゃと思っていたLODを触ってみた。
　Level Of Detailの略で、高速化テクニックの１つ。
　カメラに近い場合はハイポリモデルを表示し、カメラから離れたらローポリモデルに切り替え、
　処理の負荷を減らす仕組み。
　
![スクリーンショット 2018-03-24 14.01.19.png](https://qiita-image-store.s3.amazonaws.com/0/88105/0a90bf9c-a7e9-9557-376f-cbf42bbb1513.png)



　LODGroupというコンポーネントを使えば簡単に実現できる。
　とはいっても、ポリゴン数の違うモデルを用意する手間がある。

　LODGroupにレベルに応じたレンダラを登録すれば、カメラからの距離によって自動でレンダラを切り替えてくれる。
　切り替える距離の設定も非常に簡単。

　LODを適用するGameObjectを工夫すると管理がラク。
　親GameObjet　(ここにLODGroupをアタッチ)
　　∟ LOD0　(ハイポリ)
　　∟ LOD1　(中間)
　　∟ LOD2　(ローポリ)

　アニメーターを使うモデルのLODはちょいと工夫が必要
　親にアニメーターを持たせて、子は同じボーンを参照する様にする

　上記のことを3Dモデリングソフト内で完結しておくとラク。

　レベルが切り替わるのが顕著に見えてしまうポッピング現象には注意。

　 [資料](http://monolizm.com/sab/pdf/第48回_プレゼン資料(〜高速化テクニックLODに関するTips〜).pdf)　[プロジェクト一式](http://monolizm.com/sab/src/ShizuokaAppliClub47.zip)

<hr>


**・　部員さんプレゼン「Flutterについて」**
　Flutterとは、iOS/Android対応のクロスプラットフォーム開発のUIフレームワーク。
　現時点ではまだベータ版。

　特徴
　　・Google製なので、Googleのサービスとの連携が強い
　　・言語はDart
　　・ホットリロード対応

　特にホットリロードという機能が魅力的で、
　なんとコンパイルせずに、変更した内容が実行中のアプリに反映される仕組み。
　コンパイルから転送までに要する待ち時間は有効に使いにくく、かなり無駄な時間だった。
　チリも積もってで、１つのプロジェクトでも相当な時間をビルドに使ってきた。
　その無駄時間がなくなることで、開発効率（コスト）が減らせるというのは大きな利点。

　 [資料](http://monolizm.com/sab/pdf/第48回_プレゼン資料(Flutterで見えるアプリ開発の展望).pdf)

![IMG_8898.png](https://qiita-image-store.s3.amazonaws.com/0/88105/cabcb150-0867-1b36-ca60-0ccee4d597ef.png)

<hr>


**・最近の話題の技術ニュース、告知**
・DirectXのリアルタイムレイトレーシングの話

・[モデルデータを用意すれば簡単に、アニメーションをつけられるAdobeの「Mixamo」というサービス](https://www.mixamo.com/#/)
　顎の位置、肘の位置、膝の位置、など、数カ所に点を打つだけでボーンをとウェイトペイントをしてくれる。
　しかも、相当数のアニメーションデータも無料で利用可能。
　fbxなどで吐き出せるので、Unityでも使える便利なサービス。

・その他、雑談
【Flutter】Firebase AdMobを使って広告表示する

FlutterアプリでFirebase AdMobを使って広告表示する方法メモです。

## 手順

### 1. AdMobのパッケージ追加

pubspec.yaml の dependencies に firebase_admob 追記する。

```yaml:pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
  firebase_admob:
```

### 2. パッケージ取得
terminalで下記のコマンド実行。

```
$ flutter packages get
```

### 3. 初期化 & 読み込み & 表示


```dart
@override
void initState() {
  super.initState();
  FirebaseAdMob.instance.initialize(appId: FirebaseAdMob.testAppId);
  _bannerAd = createBannerAd()
    ..load()
    ..show();
}

BannerAd createBannerAd() {
  return new BannerAd(
    adUnitId: BannerAd.testAdUnitId,
    size: AdSize.banner,
    targetingInfo: targetingInfo,
    listener: (MobileAdEvent event) {
      print("BannerAd event $event");
    },
  );
}

static final MobileAdTargetingInfo targetingInfo = new MobileAdTargetingInfo(
  keywords: <String>['foo', 'bar'],
  contentUrl: 'http://foo.com/bar.html',
  birthday: new DateTime.now(),
  childDirected: true,
  gender: MobileAdGender.male,
);
```

（参考）pluginの `show()` のコード

`anchorType` を指定することでで表示位置を変えることができます。

```dart:firebase_admob.dart
  Future<bool> show(
      {double anchorOffset = 0.0, AnchorType anchorType = AnchorType.bottom}) {
    return _invokeBooleanMethod("showAd", <String, dynamic>{
      'id': id,
      'anchorOffset': anchorOffset.toString(),
      'anchorType': anchorType == AnchorType.top ? "top" : "bottom"
    });
  }
```

## 環境
- Flutter 0.1.5
- Dart 2.0.0-dev.28.0
- firebase_admob 0.5.0

## 補足
2018/03時点ではバナー広告とインタースティシャル広告のみ対応しているようです。

あとfirebase_admob PluginのREADMEのサンプルコードが一部間違っていたようなのでPR出してみました。
https://github.com/flutter/plugins/pull/436

## リンク
firebase_admob | Flutter Package
https://pub.dartlang.org/packages/firebase_admob

Using Packages - Flutter
https://flutter.io/using-packages/
AtCoder に登録したら解くべき精選過去問 10 問を Esolang で解いてみた ~ 05AB1E編

# Esolangとは？
[Esolang](https://ja.wikipedia.org/wiki/%E9%9B%A3%E8%A7%A3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E) とは Esoteric programming language の略であり，日本語で言えば難解プログラミング言語のことである．
実用性よりは，プログラミングが難しくなるように設計されている．

# 実行方法は？
自分で，インタプリタをビルドしても良いが，[Try it Online](https://tio.run/#) を使うのが楽である．

# おすすめのサイト

+ [Try it Online ](https://tio.run/#05ab1e), webページ上でEsolangを実行できるサイト
+ [Esolang wiki](https://esolangs.org/wiki/Main_Page) Esolangについてのドキュメントが抱負なwiki(英語)
+ [esolang-box](https://github.com/hakatashi/esolang-box) Esolang のコンパイラやインタプリタがたくさん詰まったDockerイメージ


# 05AB1Eの概要

スタック指向言語．ゴルフ言語．

+ [Documents](https://github.com/Adriandmen/05AB1E)
+ [Try it Online - 05AB1E](https://tio.run/#05ab1e)

## スタック指向言語とは？
主にスタックを操作することによって，計算する言語．

## ゴルフ言語とは？
ソースコードができるだけ短く書けるように設計された言語．


# コード
+ AtCoderでテストしてもらえないため，問題ページに載っている入力例しか試していません．
+ ゴルフ言語ではあるが，ソースコードを短くする努力は(あまり)していません．
+ もっと短い書き方があるよってという場合はぜひコメントしてください！

### Helloworld

```
"Hello, worldd!
```

`"`で囲うと文字列リテラルが作れる．
最後の`"`は省略できる．
stackの一番上が最後に自動的に出力される

### Cat(1行)

`I`

`I` 入力1行をpushする

### AtCoder 0

```
II#OOðIJ
```

1. `I` 入力1行をpushする
2. `I#` 入力1行を空白で分けてlistにしpushする
3. `O` popし，listの合計をpushする
4. `O` stackをすべてpopし合計をpushする
5. `ð` 空白をpushする
6. `I` 入力1行をpushする
7. `J` stackをすべてpopしすべてを結合してpushする

`O`,`J`のように，stackの一番上がlistならばlistに対して機能し，そうでなければstack全体に対して機能するcommandがある．


### AtCoder 1

```
"Odd"I#PÈi"Even"
```

1. `"Odd"` をpush
2. `I#` 入力1行を空白で分けてlistにしpush
3. `P` popし積を取る
4. `È` popし偶数なら1を，奇数なら0をpush
5. `i"Even"` popし1なら"Even"をpush

`i<commands>}`はpopして1ならば，}までの<commands>を実行する．<commands>が1つだけならば，}は省略できる．
偶数の場合は，"Odd", "Even"が最終的なstackになり， "Even"が出力される．
奇数の場合は．"Odd"が最終的なstackになり， "Odd"が出力される．

### AtCoder 2

```
ISO
```

1. `I` 入力1行をpush
2. `S` popし文字列を文字のリストに
3. `O` popしリストの合計をpush

数字の文字列と数字は区別されない `123 == "123"`

### AtCoder 3

```
0UII#D[vyÉi1U¾}}X#ε2÷}D¼]
```
1. `0U` Xを0で初期化
2. `I` 入力1行をpush，この値は使わない
3. `I#` 入力1行を空白で分けてlistにしpush
4. `D` popし2度push
5. `[...]`無限ループ `#`で脱出
6. `v<commands>}` popし，各要素について<commands>を実行する．現在の要素はyで取得する
7. `y` 現在の要素をpush
8. `É` popし奇数であれば1をpush，そうでなければ0をpush
9. `i1U¾}` popし1であれば，X=1とし，カウンタをpushする
10. `}` vループの終わり
11. `X#` Xをpushし1ならば無限ループを終わる
12. `ε2÷}` popしすべての要素を2で割ったlistをpush
13. `D` popし2度push
14. `¼` カウンタを1増やす
15. `]` 無限ループの終わり

### AtCoder 4

```
```
執筆中

### AtCoder 5

```
0VI#`>U<sƒNSOX‹iDNSO‹iYN+V]Y
```
1. `0V` Yを0で初期化
2. `` I#` `` 入力を空白でスプリットして，stackに展開 stack:[N, A, B]
3. `>U` インクリメントして，Xに代入 stack:[N, A], X=B+1
4. `<` デクリメント stack:[N, A-1]
5. `s` stackの上2つをスワップ stack:[A-1, N]
6. `ƒ` popして0~Nでループ stack:[A-1]
7. `NSO` ループのインデックスの数の各桁を合計する
8. `X‹` popしてXより小さいなら1をpush，そうでないなら0をpush
9. `i` popして1であるなら，次の命令を実行
10. `D` スタックのトップを複製 stack:[A-1, A-1]
11. `NSO` ループのインデックスの数の各桁を合計する
12. `‹` A-1 < インデックスの数の各桁の合計 を判定 真なら1をpush，そうでなければ0をpush
13. `i` popして1であるなら，次の命令を実行
14. `YN+V` Yに対してインデックスを足す
15. `]` すべてのループとifのブロックを閉じる
16. `Y` Yをpush

### AtCoder 6

```
```
執筆中
CentOSでeclipse開発を始めたが、入力言語を日本語に変えるのにハマッた

CentOS内にインストールしたeclipseで開発を始めてみてから気付いたことがあった。
キーボードの設定が日本語に変わらない！　キーボード設定を日本語に変更したが変わらず、コンソール上で設定ファイルまわりを確認しながら、グダグダ時間が過ぎてしまった。。。

#環境
VMware Player6.0.7
CentOS6.9
Eclipse-4.7.2

#対処法
キーボード配列を変えるだけでなく、IBusによる入力設定が必要だった。必要パッケージをインストールしIBus-Anthyにより日本語へ変更出来るように設定した

#作業手順
##パッケージのインストール

```
# yum install i-bus
# yum groupinstall "Japanese Support"
```

##設定
###i-Busの設定
画面上部「システム」→「設定」→「入力メソッド」を押下
表示されたポップアップより、入力メソッドの個人設定を押下
[![https://gyazo.com/8eb58e9c5524a68cba20efa7dccfbfc3](https://i.gyazo.com/8eb58e9c5524a68cba20efa7dccfbfc3.gif)](https://gyazo.com/8eb58e9c5524a68cba20efa7dccfbfc3)
[![https://gyazo.com/cda4e21b8e8a93622d6a40f83d59d2a7](https://i.gyazo.com/cda4e21b8e8a93622d6a40f83d59d2a7.gif)](https://gyazo.com/cda4e21b8e8a93622d6a40f83d59d2a7)

「インプットメソッド」タブより日本語-Anthyを選択し、追加を押下
[![https://gyazo.com/9eda653095bba97e51c7f65399291b7b](https://i.gyazo.com/9eda653095bba97e51c7f65399291b7b.gif)](https://gyazo.com/9eda653095bba97e51c7f65399291b7b)

###キーボードレイアウトの設定
画面上部「システム」→「設定」→「キーボード」を押下
表示されたポップアップより「レイアウト」タブを押下
[![https://gyazo.com/45d6e76070561ab746fce9dd1423ff5b](https://i.gyazo.com/45d6e76070561ab746fce9dd1423ff5b.gif)](https://gyazo.com/45d6e76070561ab746fce9dd1423ff5b)

追加を押下し、日本語を選択
[![https://gyazo.com/2d68354ecbdd08d0d8cb4ee9f8d1ff8a](https://i.gyazo.com/2d68354ecbdd08d0d8cb4ee9f8d1ff8a.gif)](https://gyazo.com/2d68354ecbdd08d0d8cb4ee9f8d1ff8a)

国別、言語別を日本に設定し、デフォルトのラジオボタンをチェック
[![https://gyazo.com/d9372633d499d4cba9ebbd6c7179f703](https://i.gyazo.com/d9372633d499d4cba9ebbd6c7179f703.gif)](https://gyazo.com/d9372633d499d4cba9ebbd6c7179f703)

これで、半角/全角ボタンで日本語入力に変更でき、またキーボードの入力ボタンもWindowsと同じ感覚で入力できるようになった。
DynamoDBについて

# DynamoDBについての覚書


##コアコンポーネント
- テーブル
- 項目
- 属性

「属性」の集合が「項目」
「項目」の集合が「テーブル」

##プライマリキー
テーブルの各項目をいひ位に識別するため、デーブル内に同じキーを持つことはない。

２種類のプライマリーキーをサポート
###パーティションキー
- パーティションキーとハッシュ関数を使用して項目が保存されるパーティション（DynamoDB内部の物理ストレージ：場所）が決まる
- パーティションキーのみを含むテーブルではパーティションキーの重複はNG

###パーティションキーとソートキー
- 複合プライマリキー（二つの属性で構成される）
- パーティションの決め方は上記と同じ＋ソートキーでパーティションごとにソートされて保存される
- 複合プライマリキー（２つの属性の組み合わせ）の重複はNGだが、どちらか一方の重複は存在が許される

##セカンダリインデックス
- プライマリキーに対するクエリに追加で代替キーを使用してテーブル内のデータのクエリを行うことができる
- セカンダリインデックスの使用は必須ではない
- インデックスを使用するとデータのクエリを実行する際にアプリケーションの柔軟性が高まる
- ２種類のインデックス
    - Global secondary index
        - パーティションキーとソートキーを持つインデックス
    - ローカルセカンダリインデックス
        - テーブルと同じパーティションキーとことなるソートキーを持つインデックス


##DynamoDBストリーム
- テーブルのデータ変更イベントをキャプチャするオプション
- ほぼリアルタイム＋発生順にストリームされる
- イベント
    - 新しい「項目」の追加＞全ての「属性」を含む「項目」全体のイメージをキャプチャ
    - 「項目」の更新＞「項目」の「（変更前＋変更後）の「属性」のイメージをキャプチャ
    - 「項目」の削除＞削除前に「項目」全体のイメージを取得
Parityノードを立ち上げる際にError upgrading parity data: CannotCreateConfigPathのエラーが出る場合

Parityノードを立ち上げる際に以下のエラーが出る場合がある。

```bash
ubuntu@ip-172-xx-xx-xxx:/var/parity$ parity --config node.toml
Loading config file from node.toml
Error upgrading parity data: CannotCreateConfigPath
ubuntu@ip-172-xx-xx-xxx:/var/parity$ 
```

# 結論
パーミッションが無い場合に起こる。ubuntuなら`sudo`を付ければ解決。

```bash
ubuntu@ip-172-xx-xx-xxx:/var/parity$ sudo parity --config node.toml
Loading config file from node.toml
2018-03-24 10:05:59 UTC Starting Parity/v1.10.0-beta-0a9d41e-20180320/x86_64-linux-gnu/rustc1.24.1
2018-03-24 10:05:59 UTC Keys path /var/parity/keys/foobar
2018-03-24 10:05:59 UTC DB path /var/parity/chains/foobar/db/d0678730db999999
...
```
[書評]サーバーレスアプリケーション開発ガイド

# はじめに
[Amazon Web Servicesを使ったサーバーレスアプリケーション](https://www.amazon.co.jp/Amazon-Web-Services%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AC%E3%82%B9%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E3%82%AC%E3%82%A4%E3%83%89-%E8%A5%BF%E8%B0%B7-%E5%9C%AD%E4%BB%8B/dp/4839964564)を
西谷さんに献本いただきました。ありがとうございます！！
<img width="246" alt="hon.png" src="https://qiita-image-store.s3.amazonaws.com/0/88884/06d348f4-b3e4-cb19-bfee-7d1d84a384ea.png">

サーバーレスアプリケーションに関して、
語句の説明からユースケース、コード例まで、まとめられていました。
サーバーレスアプリケーション(AWS)入門へは、内容の濃い、
とても良い本だと感じました。

[この本に関する西谷さんのブログ記事](http://keisuke69.hatenablog.jp/entry/2018/03/23/161824)

本書くの大変そうだけど、面白そうだなー！!

# 思ったこと
### Lambda!!!!
サーバーレスの文脈においての主役。
「いか上手くLambdaをユースケースに乗せれるか」がポイントかな。と。

例として挙げられているのは、
  * Twitterのリアルタイム分析
  * 写真投稿サイトのシングルページアプリケーション

## Twitterのリアルタイム分析
要するに、クライアント側から、大量データが`Kinesis Data Stream`に
流れてくるので、`Event Source`付けて`Lambda`でリアルタイムに
処理しましょう。って感じ。
メリットとして、
  * データが入った時しかプロビジョニング(課金)されない
  * 大量データをシームレスにスケールさせてさばける
ここでは、Lambdaで処理させた後、DynamoDBへデータが格納される例であった。
Lambdaの後ろのデータストアが「なぜDynamoDBか。」に関して、とても重要だと思う。
上記に関して、後ほど詳細な説明があった点が、かなり良かった。(5-2 p87~)

## 写真投稿サイトのシングルページアプリケーション
こちらの例では、認証・認可から始まり、S3ウェブホスティング等で実装。
バックエンドを`API Gateway`, `Lambda`, `DynamoDB`等で実装。

特に`5-2`p86~が`なぜ`このサービスを選定したのか。
という理由が書かれている。

AWSをベンダーに選ぶ上で重要なのは、この__サービス選定__だと僕は思ってます。
数あるサービス群の中から、システム要件にマッチしそうなサービスを選択することは、
とても難しく、これを間違えると、
__とても大きな損失（時間・コスト・リスク）__につながりかねません。

また、サービスの使い方も一通り、コード例を交えながら書かれている。
こちらも実際に動かしながら、学習できるので良いポイントだと思いました。

## 6章 サーバーレスアプリケーションのライフサイクル管理
ここもとても重要な章だと思います。
ここではSAMを使った例、複数環境(dev環境, test環境, prod環境)の管理方法など紹介があり、
参考になります。

## 7章 トラブルシューティング
運用ですね。
サーバーレスで開発すると、〜のメリットがある。と冒頭部分にいろいろ書かれていました。
  * サーバー運用から解放される
など。

ですが、反面、実際のシステム・アプリケーションの運用は、複雑で大変になると僕は思っています。
そのデメリットを解決するために、運用基盤を早期から整えておく必要があります。
ここがしっかりしていないと、運用が回らず、すごく苦労することになると思います。
`DevOps!!!!`がすごく大切だと思います。

# さいごに
開発ガイドとしては、とてもわかりやすく、手を動かしながら学習できるので、おすすめです！(僕は動かしませんでしたがw)

あと、最近気づきましたが、サーバーレス(シームレスにスケール)の文脈に
`Step Functions`は、あまり有効ではないように思います。(使い込んでみると、限界がくる。)

サーバーレスに組んでいくと、機能が小さい単位で切り出されていって、`マイクロサービス風`に近づくように設計されていくのかな？なんかふと、思いました。
画像のプロファイルカラーを取得する。

[![thif.png](https://qiita-image-store.s3.amazonaws.com/0/235946/37db8423-eaf6-09f9-4f5d-a385303b43cb.png)
](image)
### 画像をドロップして画像の主要なカラーをピックアップできると便利。
color-thiefという優れたスクリプトがある。
http://lokeshdhakar.com/projects/color-thief/

```js
p=(new ColorThief()).getPalette(el,5) //[[71, 45, 105],[200, 85, 117],[25, 8, 27],....]
```
```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/color-thief/2.0.1/color-thief.min.js"></script>
<img src...></img>
```
```js
//usage
let fn={}
fn.q=(s,doc=document)=>{return doc.querySelector(s)}
fn.toColor=(d)=>{return '#'+d.map(d=> ('00'+d.toString(16)).slice(-2) ).join('')}
;
let el=fn.q('img') //image need the loaded and over the cross domain.
,p=(new ColorThief()).getPalette(el,5) //[[71, 45, 105],[200, 85, 117],[25, 8, 27],....]
,hex=p.map(d=>fn.toColor(d))
;
console.log(p,hex)
```

### demo
https://s.codepen.io/gnjo/debug/EEvmYR/DqADdEyGBwKA
５０件までは縮小画像をlocalStorageに保存する。それ以降は古いものを削除。表示上の制限はなし。

### 追記
クロスドメインはブラウザが行っている場合が多い。chromeは--disable-web-security　オプションで解除できる

```
//cmd.exe
start "" "C:\Users\gnjo\AppData\Local\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir
```
[RubyOnRails]リクエストとレスポンスの流れ　その２

#コントローラファイルの編集
rails gコマンドでできたコントローラファイルは、app/controllers内に出来ます。rails gでできたコントローラファイルには最初からクラスとクラス名の定義されています。
定義されたclass内にindexと言うアクションを呼び出すように書き足します。

```hogehoge_controller.rb
class HogehogeController < ApplicationController
   def index
   end
end
```

#ビューファイルの編集
ビューファイルとはクライアント側にレスポンスで返されるデータです。ビューファイルはコントローラのメソッドひとつにつき、ひとつ存在します。「コントローラと同じ名前のフォルダ」内にある「アクション名と同じファイル名」のものが適用されます。
Railsではerbと言うファイルがそのデータです。

app/views/hogehogeフォルダの下に index.html.erbと言うファイルを作ってそこに書きます。

```index.html.erb
<p>Hello World</p>
```

##レイアウトファイル
ビューファイルの横のフォルダapp/views/layoutsのなかにレイアウトファイルと言うビューファイルがあります。このファイルは個々のビューファイルの共通のヘッダーやフッターが書かれています。
前行程のビューファイルは、このレイアウトファイルのbody部分に当たります。

#サーバの起動
アプリケーションを動かすためにはサーバの起動が必要です。
ターミナルでrails sコマンドしてサーバを起動できます。

```
$ rails s
```

以上
時系列データの順番を保持したまま、訓練データとテストデータに分ける

機械学習でデータを訓練データとテストデータに分けるのは、scikit learnフレームワークのtrain_test_splitがよく使われています。この関数を使うと、順番がシャッフルされてしまうため、時系列データに対しては使いにくいという問題がありました。そこで、オプションでshuffleをFalseに設定すると、順番を保持したまま、訓練データとテストデータに分けられます。時系列データの機械学習を行うときに便利です。

```Python:split_test_data.py

import numpy as np
from sklearn.model_selection import train_test_split

X = np.arange(10).reshape((5, 2))
Y = np.array([1,1,0,1,0])

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.4) 
# 順番がシャッフルされてしまうので、時系列データに対しては使いにくい

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.4, shuffle=False)
# オプションで、shuffle=Falseを指定すると順番がシャッフルされないので、時系列データに対しても使いやすい

print(X_train, '\n', X_test,'\n', Y_train,'\n', Y_test)

""" 出力: 
[[0 1]
 [2 3]
 [4 5]]
 [[6 7]
 [8 9]]
 [1 1 0]
 [1 0]
"""

```
Rubyで累積的計算を遅延評価する


##はじめに　
　まず簡単な例を挙げてみます。
　例えば、1から順番に整数の二乗した値を足し算していき、累積的に加算された値が10000を超えない最大の数を求める場合です。

　Haskellで書くとこんな感じです。無限リストが使えます。
　`last $ takeWhile (<=10000) $ scanl (\b a-> b+a*a) 0 [1..]`

##Rubyでは
Rubyのinjectやeach_with_objectが近いのですが、遅延評価してくれないので無限配列を使えません。近い機能をもつメソッドを作ってみました。

```Ruby:
class Enumerator::Lazy
	def scan(init)
		prev=init
		Enumerator::Lazy.new(self){|yielder, *values|
			yielder << (prev=yield prev, *values)
		}
	end
end
```

`puts (1..Float::INFINITY).lazy.scan(0){|r,a| r+a*a}.take_while{|a| a<=10000}.to_a.last
`
Haskellのscanlでは、初期値がリストの先頭に入りますが、上のruby版scanは初期値が入らない違いがあります。


##他の使いかたも
初期値に空の配列を与えて累積的に配列に要素を追加していくことで、いろいろな計算で遅延評価できるようになります。

uniqの遅延評価だと
`p [1,2,3,4,1,3].lazy.scan([]){|r,a| r.include?(a) ? r : r+[a]}.to_a.last`

少し危険な香りがしますが、破壊的代入で
`p [1,2,3,4,1,3].lazy.scan([]){|r,a| r.include?(a) ? r : r<<a}.to_a.last`
もありかなあ、もっとも遅延評価できるuniqが標準で入っていますのでわざわざ作る必要ないのですが

そこまでに計算した累積結果を元に計算できますので、いろいろな応用がありそうです。
とあるアイドルゲームに登場するキャラクター全52人の体重データを基にヒストグラムを作ってみた

最近趣味で統計学を勉強しているのですが、なにか形に残るものを作ってみようと思いました。
そのほうが勉強になると思いますし息抜きにもなるので。
ちなみに題材に関しては著作権を考慮してかなりぼかしていますが、
52人という数字でピンとくる方がいらっしゃるかと思われます。

# データの読み込みとヒストグラム作成

インターネットで適当に情報を集めたら、52人の体重が記述されたCSVファイルを雑に作成します。
作成したファイルをPandasで読み込んでいきます。

```ruby:Untitled1.ipynb
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

#CSV読み込み
csv = pd.read_csv('任意のCSVファイルが置かれているパスを入力')
```
おっとCSV読み込みの前にimportですね。
あとJupyter Notebookで画像を表示する際に「%matplotlib inline」と表記する必要があるそうな。

```ruby:Untitled1.ipynb
#体重データを格納
WeightData = csv.Weight.values.tolist()
```
データを格納したらヒストグラムを作るための下ごしらえを行います。
最小値と最大値を求めて、階級を決定します。

```ruby:Untitled1.ipynb
#最小値と最大値を算出
print("最小値",np.min(WeightData))
print("最大値",np.max(WeightData))

```
>最小値 35.0
>最大値 51.0

最小値と最大値を確認することが出来ました。
あとは適切な数値を入れていくだけです。

```ruby:Untitled1.ipynb
fig, ax = plt.subplots()

# 5個の階級でヒストグラムを作成します。binsの最小値と最大値をrangeで指定します。
# 戻り値について　n => 各階級における度数、bins => 階級のリスト
n, bins, patches  = ax.hist(WeightData, bins=5, range=(31, 55))

# グラフのタイトル
ax.set_title('Girls Weight')
# X軸のタイトル
ax.set_xlabel('Weight Group')
# Y軸のタイトル
ax.set_ylabel('Frequency')

# X軸のラベル
label = [
    '31 - 35',
    '36 - 40',
    '41 - 45',
    '46 - 50',
    '51 - 55'
]

# ラベルを打つX軸の場所。階級値をセットする。
ax.set_xticks([33, 38, 43, 48, 53])

# X軸にラベルをセット、90度回転させる
ax.set_xticklabels(label, rotation = 90)
```
いよいよ描画です。

```ruby:Untitled1.ipynb
# 描画
plt.show()
```

![Histodata.png](https://qiita-image-store.s3.amazonaws.com/0/237647/006e3fc2-c787-769d-27d0-1af138d596b0.png)

ね、簡単でしょう？
といった具合でヒストグラムを作成することが出来ました。

# ヒストグラムからわかること

こうして表にするとアイドルの平均体重がだいたい43kgぐらいであることが分かります。
現実の女子が理想とする体系が40kg程度(らしい)ということを考えると、
アイドルの設定体重としては妥当なところなのでしょうか。

ちなみに私の担当の体重は結構重めということが分かりました。
いいんです。
女性はちょっとむちむちしていた方がかわいいですからね(笑顔)

# 参考
-[【プログラマーのための統計学】 度数分布とヒストグラム](https://qiita.com/Esfahan/items/93550dab4fd60adb34ee)
-[ハンバーガー統計学にようこそ！](http://kogolab.chillout.jp/elearn/hamburger/)
XAMPP in macOS トラブルシュー


```console:XAMPPバージョン
Welcome to XAMPP for 7.2.3-0
```

# PHPファイルの配置場所
1. 起動する (General - Startボタン)
2. mountする (Volumes - Mountボタン)
3. exploreでファインダーを起動  (Volumes - Exploreボタン)
4. lamp/htdocs配下に自身のスクリプトを配置する

![Screen Shot 2018-03-23 at 15.07.20.png](https://qiita-image-store.s3.amazonaws.com/0/70065/b521a4c8-4a66-3993-c8cc-bf8977dfde3c.png "Screen Shot 2018-03-23 at 15.07.20.png")

都度、起動してマウントしては、辛いよな。。。。
ただし停止後に再度起動するとファイルも復元される。

# file_put_contents が権限エラーとなる

「その他のグループ」に対して、書き込みのファイル権限を付与する。
書き込むフォルダもしくはファイルに対して、その他に書き込み権限を付与する

```console:terminal
chmod o+w 書き込み先ディレクトリもしくはファイル
```
Cent 6.8 に Mondo Rescue をインストールする方法

[ここ](https://www.riscascape.net/archives/6493)を参考に Mondo Rescue のインストールを試みたが，次のようなエラーがでた．

```
The GPG keys listed for the "rhel 6 x86_64 - mondorescue Vanilla Packages" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.
```

# 対処方法
/etc/yum.repos.d/mondorescue.repo 内に記載される GPGkey のURLを書き換える．

```//etc/yum.repos.d/mondorescue.repo
# 変更前
gpgkey=ftp://ftp.mondorescue.org//rhel/6/x86_64/mondorescue.pubkey

# 変更後
gpgkey=ftp://ftp.project-builder.org/test/centos/6/x86_64/pb.pubkey
```

インストールしてみる．

```bash
$ sudo yum install mondo -y
```
```
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : mondo-3.2.2-1.rhel6.x86_64                                   1/1 
  Verifying  : mondo-3.2.2-1.rhel6.x86_64                                   1/1 

Installed:
  mondo.x86_64 0:3.2.2-1.rhel6                                                  

Complete!
```
以上．
lwIPの使い方

lwIP 2.0.2のRAW APIでちょっとはまったので、メモを残しておきます。

DNS

```h:lwipopts.h
#define LWIP_DNS                        1
```

```
        dns_setserver(0, &dnsserver);
        dns_gethostbyname("www.yahoo.co.jp", &dnsres, dns_found, NULL);
```

~~コールバック関数(dns_found)が用意されていますが、dns_gethostbyname()はブロックなので、アドレスがdnsresに入って返ってきます。~~確認してみたらこの関数もノンブロックでdnsresは空のようです。やはりコールバック関数で処理を確認する必要があるようです。tcp_connectはconnectとerrのコールバックが別ですが、dnsはアドレスが拾えても拾えなくても同じコールバックが呼ばれ、アドレスがあるかないかで判断できるようです。

DHCP

ずいぶんはまりました。

```h:lwipopts.h
#define LWIP_DHCP                       1
```

```
        dhcp_start(&netif);
        while(netif.ip_addr.addr == 0)
                sys_check_timeouts();
```

dhcp_startはノンプロックの関数なので、返ってきた時点ではIPアドレスは設定されていません。dhcpの処理はDHCPDISCOVER->DHCPOFFER->DHCPREQUEST->DHCPACKで成立するのですがACKを受けた時点では、IPアドレスは設定されていなくて、sys_check_timeoutsから起動される処理で設定されます。このためIPアドレスがセットされたかを確認してループを終了するようにしてみました。

sys_check_timeouts()でDHCPの更新処理もするようなので、更新処理が必要な場合には定期的に呼ぶ必要があるようです。

sys_check_timeouts()ではsys_new()関数を呼んでいてEmbedの場合は作る必要があります。ある程度正確な値を返さないとおかしな動きをするかもしれません。

tcp_poll

このコールバックはtcpのtime out処理などをするためにあるようです。ローカルの接続ではあまりtime outする事はないですが、Internetへの接続では時間がかかる場合があるので十分な時間を設定した方が良いようです。あまり短く設定してtime outが頻発するとlwipが不安定になるような気がします。

これでIPの三つの神器のDHCP,DNS,SSLがそろったので、なにか作ってみようかと思います。

ネットは広大だわ
byebugでデバッグ中に「Terminating timed out worker」が出る問題の解決

# 問題
Byebugでブレークポイントを置いてデバッグしている時に、
「Terminating timed out worker」 というメッセージが出て
デバッグ状態が解除されてしまう。

# 原因
サーバーのPumaのWorkerがタイムアウトすることが原因。

# 解決
PumaのWorkerのタイムアウト時間を伸ばしてあげればよい。
（デフォルトでは60秒）
Pumaの設定ファイル（config/puma.rb）に以下の一行を追加する。

```ruby
worker_timeout 500
```

```ruby:config/puma.rb
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
  # Worker specific setup for Rails 4.1+
  # See: https://devcenter.heroku.com/articles/
  # deploying-rails-applications-with-the-puma-web-server#on-worker-boot
  ActiveRecord::Base.establish_connection
end

worker_timeout 500
```

# 参考
- [PUMA WORKERS VS BYEBUG](http://blog.desafiolatam.com/puma-vs-byebug-timed-worker/)
- https://github.com/puma/puma/blob/master/examples/config.rb
railsエラー　起こりやすいファイル

ルーティングファイル

コントローラーファイル

ビューファイル

モデルファイル

●よくある間違い部分
アソシエーションの定義忘れ

resourcesの記入間違い

ビューの名前間違い

変数の定義間違い

ネストの間違い
防犯カメラの動画を見る

# カメラを買いました

防犯カメラが欲しくて、amazonを物色していたら以下のカメラを見つけました。
[SV3C 960P 130万画素 WI-FI 防犯カメラ ネットワークカメラ ワイヤレス IPカメラ](https://www.amazon.co.jp/dp/B0773BMQY9)

720P、960P、1080Pとバリエーションがあり、値段から960Pの奴に決めました。
レビューを見るとわかりますが、かなりチャレンジングな商品なので、いろいろわかってる人にしかお勧めできません。

# カメラの設定と設置

カメラが届いたら、レビューにある写真を参考にレンズ部分の蓋を外してmicroSDカードを入れます。
続いて、ACアダプタとLANを繋いで、iPhoneにインストールしたアプリで無線LANの設定等をします。
そして、smtpサーバの設定やftpサーバの設定、動体検知の設定をすると、動くものを検知すると写真を撮ってメールを送ってくれたり、動画を撮ってftpサーバにアップロードしてくれたりします。

一応販売元から日本語のマニュアルのpdfファイルがメールで送られてくるのですが、なかなかわかりにくいです。

設置は、3本の木ネジで固定します。ただ、屋外でも使えるような外見なのに、ACアダプタは屋内用っぽいので、電源の引き回しは工夫が必要です。

# 動画が見られない

カメラから送ってくる静止画はjpegなのですが、動画は謎の.264ファイルです。
試しにVLCで開いてみましたが、見ることはできず。

[How to play .264 video files from IP cameras/DVRs?](https://www.unifore.net/ip-video-surveillance/how-to-play-264-video-files-from-ip-cameras-dvrs.html)

と言うサイトを見つけたので、VLCの設定を変更してみましたが、変化無し。

続いて、

[Make camera footage usable in normal players like VLC 1,MPlayer et.al.](https://www.spitzner.org/kkmoon.html)

と言うサイトを発見。
ここに載っていたプログラムで、謎の.264ファイルをmp4に変換すると、上記VLCの設定で「H264ビデオ デマルチプレクサー」を使うと再生ができた。
しかし、デフォルトの「自動」だと再生できず。

プログラムを真面目に読んでmp4のヘッダとかを正しく付けてあげればそのまま再生できるファイルができそうな気がするけど、面倒なのでffmpegで変換してあげると、無事にデフォルト設定のVLCで再生できるファイルができた。
そこで、以下のようなシェルスクリプトを書いて、変換してあげることにした。(2番目の参考サイトのプログラムをsplit264と言う名前でコンパイルしておくこと)

エラーチェックとかしていないので、元のファイルは消さないようにしている。
引数として.264ファイルがあるフォルダを指定すると、中にある.264ファイルを全てmp4に変換する。

```sh:264toMP4
#!/bin/sh

for i in $1/*.264
do

orig=$i
fname=${orig%.*}
mp4=${fname}.mp4
wav=${fname}.wav
tmpf=${fname}.mp4.mp4

if [ -e $mp4 ]
then
continue
fi

split264 $orig
mv $mp4 $tmpf
ffmpeg -i $tmpf -i $wav $mp4
touch -r $orig $mp4
rm -f $tmpf $wav

done
```
MicrosoftアカウントのOutlookメールアドレスを取得する方法

# はじめに

MicrosoftアカウントのOutlookメールアドレスの取得方法について記載します。

# 前提

- 本人確認用のSMSメッセージ確認用の携帯電話

# Microsoft アカウント取得

[こちらのリンク](https://signup.live.com/)を開き、「新しいメールアドレスを取得」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/5135e741-a81b-71c0-b82e-abb696ea5eda.png)

取得したいメールアドレスを入力して「次へ」をクリックします。既に他の方が使用中のメールアドレスの場合は、別なアカウント名を指定してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/b9af356a-a2d5-785d-f8db-fd29131b3044.png)

パスワードを設定して「次へ」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/d11e205b-1ce2-8db9-c39c-58de3693dc68.png)

各種情報を入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/a3748290-5433-717c-29e9-7cd9f3ded9ba.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/f93a60b2-38e5-5e59-32e2-4501e31784c4.png)

本人確認用のSMSメッセージが受信可能な携帯電話の番号を入力します。携帯電話に届いたアクセスコードを入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/409a5e42-6616-476e-37b7-ff035267f7a9.png)

アカウントの画面が表示されれば成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152422/dcce24db-7fc9-3961-db7f-a7a3e01e7499.png)

# Offie365ログイン画面からのログイン

こちらの[Office365ログイン](https://www.office.com/?omkt=ja-jp)画面から「サインイン」ボタンをクリックして作成したメールアドレス、および、パスワードでログインします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152422/5a306797-8c94-aa5a-9f4f-f60e774598ef.png)

Outlookを開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152422/1af20362-6858-7866-2d62-ee36c51039ec.png)

Outlookの受信ボックスを開ければ成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152422/c91d01e1-abb8-68e0-0e20-e2430c30395b.png)


# まとめ

MicrosoftアカウントのOutlookメールアドレスを取得することが出来ました。
教えてください

まったくの初心者なので下記の意味が理解出来ません。
－－－－－－
インストール方法
1) Node.js 8.5以降をインストール
2) ターミナルからgitリポジトリをクローン

git clone https://github.com/bitrinjani/r2.git
3) フォルダr2に移動し、npm installをコンソールで実行

cd r2
npm install
4) インストールフォルダ内のconfig_default.jsonをconfig.jsonにリネーム
5) key、secretフィールドを、各取引所から取得したAPIキー、シークレットに置き換える 
6) 日本語UIにする場合、languageフィールドを"en"から"ja"に変更する
7) コンソールからnpm startで起動

https://github.com/bitrinjani/r2/blob/master/docs/INSTALL_JP.md
rails エラー例  Rooting error

Rooting error
●　rootパスが間違っている

```
root to: "tweet#index"  本来はtweets
```

●該当するルーティングが設定されていない。

tweetsのshowのルーティングがなく、shoeというルーティングが設定されている。

```
#before
resources :tweets, only: [:index, :shoe, :new, :create, :destroy, :edit, :update]
```

```
#after
resources :tweets, only: [:index, :show, :new, :create, :destroy, :edit, :update]
```

●該当するルーティング無いことが原因。
```
resources :tweets, only: [:index, :show, :new, :create, :destroy, :edit, :update] 
resources :comments, only: [:create]
```

```
#after
```
resources :tweets, only: [:index, :show, :new, :create, :destroy, :edit, :update] do
  resources :comments, only: [:create]
end
```

コメントのルーティングをツイートのルーティングにネストしていないため、form_tagで設定したようなルーティングが設定されていなかった。
【Flutter】Widgetの表示・非表示を動的に切り替える

FlutterでWidgetの表示・非表示を動的に切り替える方法メモです。

## 結論
空の `Container` を使う。

## 環境
- Flutter 0.1.5
- Dart 2.0.0-dev.28.0

## サンプルコード

```dart
Widget foo(bool isVisible) {
  if (isVisibile) {
    return Text("foo");
  } else {
    return Container(); // Empty Container Widget
  }
}
```

## 補足
- Androidのvisibilityにあたるものが2018/03時点でなさそうなので、このようにするしかなさそうです。
- opacityを0.0に設定しても見た目消えるのですが要素は残ったままなので空の `Container` で差し替えたほうが良さそうです。

## 参考
android - show/hide widgets on Flutter programmatically - Stack Overflow
https://stackoverflow.com/questions/44489804/show-hide-widgets-on-flutter-programmatically
No route to hostと返ってくるからと言ってサーバーが死んでいるとは限らない


hidekiy blog: [linux] ping は通るのに No route to host と言われる http://blog.hidekiy.com/2012/09/linux-ping-no-route-to-host.html

の再現


# 設定

80番（http）がiptablesで許可されている。

```
# iptables -L -v --line-numbers
6        2   120 ACCEPT     tcp  --  any    any     anywhere             anywhere             state NEW tcp dpt:http
```

その手前にREJECT用のルールを追加する

```
# iptables -I INPUT 5 -p TCP --dport 80 -j REJECT --reject-with icmp-host-prohibited
```

# 結果

そうするとpingは通るのにhttpアクセスはNo route to hostとなる。

```
# ping xxx.xxx.xxx.xxx
PING xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) 56(84) bytes of data.
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=64 time=0.075 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=64 time=0.084 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=3 ttl=64 time=0.083 ms

# curl xxx.xxx.xxx.xxx
curl: (7) Failed connect to xxx.xxx.xxx.xxx:80; No route to host
```

# 参考

REJECTターゲット http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/output/rejecttarget.html
Python＋subprocessで子プロセスを一定時間で終了する方法

親プロセスからsubprocessで子プロセスを起動して、一定時間経過後親プロセスからkillする方法。

環境：CentOS7、Python3.6

**コード**

```py3
import subprocess
import time

cmd = """
while true
do
  date
  sleep 1s
done"""
p = subprocess.Popen(cmd, shell=True)
time.sleep(5)
p.kill()
```

**実行結果**

```
Sat Mar 24 17:01:26 JST 2018
Sat Mar 24 17:01:27 JST 2018
Sat Mar 24 17:01:28 JST 2018
Sat Mar 24 17:01:29 JST 2018
Sat Mar 24 17:01:30 JST 2018
```

subprocess.runや.callだと子プロセスの終了を待つため延々と実行されます。subprocess.Popenだと投げっぱなしのfire and forgetとなるらしい。

注意：shell=Trueはシェルインジェクションに悪用されるため、コマンドを入力を受け付けるような処理では使わないようにしてください。

Pythonを使わずに**timeoutコマンドで終了させる方法もあります**。以下、参考資料。

**参考：**
一定時間でシェルコマンドを終了させるたった1つの方法
https://qiita.com/ma2saka/items/741b614418bf8fce04de
“Fire and forget” a process from a Python script
https://stackoverflow.com/questions/17937249/fire-and-forget-a-process-from-a-python-script
さくらVPS nginxインストール

## nginxをインストール

```
$ sudo yum install nginx
```

nginxを起動。

```
$ systemctl start nginx
```

OS再起動時に自動で起動するように設定。

```
$ systemctl enable nginx
```

## firewallの設定

httpで外部からのアクセスを許可する。

```
$ sudo firewall-cmd --permanent --add-service=http
```

ついでにhttpsも。

```
$ sudo firewall-cmd --permanent --add-service=https
```

firewallの設定を有効にする。

```
$ sudo firewall-cmd --reload
```

ブラウザを開いて、サーバアドレスにアクセスしてnginxのwelcomeページを表示されたら成功。
インタプリタとコンパイラ

コンピュータでプログラムを実行する方法は大きく分けて2つあります。
それは「**インタプリタ**」と「**コンパイラ**」です。

この二つを理解するためにまず「**機械語**」を理解する必要があります。

コンピュータに搭載されるCPU自体は単なる計算機です。
計算の際には電流の「オン」と「オフ」をもとにした「1」と「0」による2進数の計算しか出来ません。
コンピュータは「1」と「0」の命令でしか動かないのです。

この2進数で書かれた命令の集まりを「機械語」と呼びます。

###インタプリタ
インタプリタはプログラミング言語で書かれたソースコードを読み込んで、機械語のプログラムライブラリを呼ん(call)だり、場合によっては機械語に変換してコンピュータに命令を与えます。
「**プログラム実行時に変換する**」というところがポイント。

実行時にその都度変換するため、時間が掛かってしまいます。

###コンパイラ
コンパイラはプログラミング言語で書かれたソースコードを事前に機械語へ「一括変換」して、変換後のプログラムがコンピュータに命令を与えます。
こちらは「事前に変換する」ということがポイントです。

実行時に改めて変換する必要がないので、高速で処理できます。また、実行時に変換するための仕組みも必要ありません。単独でプログラムを実行できます。

変換する仕組みのことを「コンパイラ」、変換する作業のことを「コンパイル」と呼ぶ。
CMakeの使い方（その３）

# はじめに

CMakeを使い始めて色々と学んだことを少しずつまとめています。

## 関連記事

- [CMakeの使い方（その１）](https://qiita.com/shohirose/items/45fb49c6b429e8b204ac)
- [CMakeの使い方（その２）](https://qiita.com/shohirose/items/637f4b712893764a7ec1)

## 参考資料

- [CMake Documentation - FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html)

# ステップ８：他のライブラリを自分のプロジェクトで使えるようにする

自分のCMakeプロジェクトをビルドするために、インストールされていないライブラリが必要だとします。CMakeには、ビルドに必要なライブラリを自分のCMakeプロジェクト内で使えるようにする[FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html)というモジュールがあります。

FetchContentモジュールに含まれる`FecthContent_Declare`関数と`FetchContent_MakeAvailable`関数を使うと、他のプロジェクトのCMakeターゲットや変数をそのまま自分のプロジェクト内で参照できるようになります。詳しくはドキュメントをあたってください。ここではよく使うものをGoogleTestを例にして紹介します。

FetchContentモジュールはCMake 3.11から導入されたものです。それ以前はExternalProjectモジュールを使って似たようなことを行うことができました。

## GitHubを参照する場合

```cmake
include(FetchContent)
FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        e2239ee6043f73722e7aa812a459f54a28552929 # release-1.11.0
)
FetchContent_MakeAvailable(googletest)
```

## ソースコードをダウンロードする場合

```cmake
include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/refs/tags/release-1.11.0.zip
)
FetchContent_MakeAvailable(googletest)
```
初心者のLinux勉強!! 文系学生がやってみた!!

##はじめに
インターン先でプログラミングを勉強中の文系学生。

社員さんからLinuxについて聞いたのをきっかけに勉強していこう!!

##Linuxとは
世界中のほとんどのサーバーやOSがLinuxで動いているみたい。
プログラミングに携わっていく以上、勉強しておかないとね。

##Linuxの勉強
Linuxの勉強をするにあたり、社員さんから[Linux Survival](https://linuxsurvival.com/linux-tutorial-introduction/)を紹介して貰った。
今回はこれで勉強していこうっと。

ちょっと触ってみたけど、必要なコマンドとかはコマンドプロントやPowerShellと同じだよね。
まぁ、それらがLinuxで動いているんだから当然と言えば当然か。

左に学べる内容のリストがあるから、その中から興味のある事や知りたいことを見ていくのが良さそう。

##Hackerrank
Hackerrankに[Linux Shell](https://www.hackerrank.com/domains/shell?filters%5Bsubdomains%5D%5B%5D=bash)という練習問題があるのを発見!!
実際にどう動くのかを試してみたい人はやってみるのがオススメかな?

##まとめ
今回はLinuxの勉強をしました!!
プログラミング自体には関連だないだろうけど、プログラムを動かすためには必要だろうし、よく勉強しておこうっと。

##参考サイト
[Linux Survival](https://linuxsurvival.com/linux-tutorial-introduction/)-[[https://linuxsurvival.com/linux-tutorial-introduction/](https://linuxsurvival.com/linux-tutorial-introduction/)]
[Linux Shell](https://www.hackerrank.com/domains/shell?filters%5Bsubdomains%5D%5B%5D=bash)-[[https://www.hackerrank.com/domains/shell?filters%5Bsubdomains%5D%5B%5D=bash](https://www.hackerrank.com/domains/shell?filters%5Bsubdomains%5D%5B%5D=bash)]
さくらVPS sudo設定

管理ユーザでログイン、または一般ユーザでログイン後、管理ユーザに変更。

sudoコマンドを使用したいユーザをwheelグループに追加。

```
# usermod -G wheel sampleuser
```

wheelグループに所属するユーザがsudoコマンドを使用できるように設定。

```
# visudo
```

`%wheel`の先頭に`#`がついてコメントアウトされている場合は、コメントアウトを削除。

```
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
```

sudoコマンドでnginxをインストールしてみる。

```
$ sudo yum install nginx
```

すると、

```
sampleuser は sudoers ファイル内にありません。この事象は記録・報告されます。
```

と、怒られる。

一度ssh接続を切って、再度ログインしsudoコマンドを打ってみる。

無事成功。
既存のAWS環境にkopsでsubnetを指定してkubernetesを構築

現在利用していて、複数のsubnetがすでに登録されているAWS環境に、kopsでkubernetesを構築する方法をまとめてみました。また東京リージョンでmaster冗長化も試してみました。

# 環境
Mac OS 10.12.6
kops 1.8.1

# 設定

今回の環境では以下の設定になっています。適宜読み替えてください。

| 項目 | 値 | 備考 |
|:-----------|:------------|:------------|
|vpc-id|vpc-xxxxxxxx|既存アカウントで作成済のvpc-idを利用|
|region|ap-northeast-1|東京リージョン|
|cidr|10.16.0.0/16||
|zone  |ap-northeast-1a,ap-northeast-1c,ap-northeast-1d|3つのzoneを利用|

master-zonesの指定を2つにすると以下のようなエラーになります。
etcdが「The recommended etcd cluster size is 3, 5 or 7・・・」という制約に引っかかってるんでしょうか。
ap-northeast-1dがあってよかった。

```
There should be an odd number of master-zones, for etcd's quorum.  Hint: Use --zones and --master-zones to declare node zones and master zones separately.
```

# バケット作成

terraformだとこんな感じかとおもいます。

```
resource "aws_s3_bucket" "k8s-dev" {
  bucket = "k8s-dev.example.com"
  acl    = "private"

  tags {
    Name        = "k8s-dev.example.com"
    Environment = "Dev"
  }
}
```

# Route53設定

terraformだとこんな感じかとおもいます。

```
resource "aws_route53_zone" "k8s-dev" {
   name = "k8s-dev.example.com"
}
```

登録が終わったらちゃんと名前解決ができるように上位のDNSにNSレコードを登録しておきます。

# 環境変数の設定

```terminal
# 権限のあるIDとKEYを設定
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXX

# リージョン設定
export AWS_DEFAULT_REGION=ap-northeast-1
export ZONES="ap-northeast-1a,ap-northeast-1c,ap-northeast-1d"

# 各ノードのサイズ
export NODE_SIZE=${NODE_SIZE:-m4.large}
export MASTER_SIZE=${MASTER_SIZE:-m4.large}

# kopsの設定が保存されるバケット(さきほど作ったもの)
export KOPS_STATE_STORE="s3://k8s-dev.example.com"
```

# kops create 

--yesをつけない

```terminal
$ kops create cluster k8s-test.example.com \
--vpc=vpc-xxxxxxxx \
--network-cidr=10.16.0.0/16 \
--node-count 3 \
--zones $ZONES \
--node-size $NODE_SIZE \
--master-size $MASTER_SIZE \
--master-zones $ZONES
```

# kops edit

ここで既存のサブネットとぶつからないように書き換える

```terminal

$ kops edit cluster k8s-test.example.com

  subnets:
  - cidr: 10.16.100.0/24 #ここを書き換える
    name: ap-northeast-1a
    type: Public
    zone: ap-northeast-1a
  - cidr: 10.16.101.0/24 #ここを書き換える
    name: ap-northeast-1c
    type: Public
    zone: ap-northeast-1c
  - cidr: 10.16.102.0/24 #ここを書き換える
    name: ap-northeast-1d
    type: Public
    zone: ap-northeast-1d
```

# 念のため設定確認

--yesはつけない

```
$ kops update cluster k8s-test.example.com
```

# kops update

ここで構築される

```
$ kops update cluster k8s-test.example.com --yes
```

しばらくまつと出来上がる


# 確認

```
$ kubectl get nodes
NAME                                                STATUS    ROLES     AGE       VERSION
ip-10-16-100-217.ap-northeast-1.compute.internal   Ready     node      1h        v1.8.7
ip-10-16-100-72.ap-northeast-1.compute.internal    Ready     master    1h        v1.8.7
ip-10-16-101-229.ap-northeast-1.compute.internal   Ready     master    1h        v1.8.7
ip-10-16-101-86.ap-northeast-1.compute.internal    Ready     node      1h        v1.8.7
ip-10-16-102-136.ap-northeast-1.compute.internal   Ready     node      1h        v1.8.7
ip-10-16-102-154.ap-northeast-1.compute.internal   Ready     master    1h        v1.8.7
```
複数のSQLファイルを、psqlコマンド一度に実行するWindowsバッチ（リリース用）


# 前提
* 社内Webシステム
* PostgreSQL9.6
* Windows Server 2012


# 背景

リリース時に実行するSQLファイルが、以下のように複数あります。

```txt:実行するSQLファイルの一覧
A関係のテーブルを更新.sql
B関係のテーブルを更新.sql
VIEWを更新.sql
functionを更新.sql
```

今までは、pgAdminのクエリツールで1個ずつ実行していました。
しかし、これには以下の問題があります。

* 実行するSQLファイルが漏れるかもしれない
* 実行するSQLファイルの順番を間違えるかもしれない

# 対策
Windowsバッチで、複数のSQLファイルを一度に実行できるようにしました。psqlコマンドを使います。


```bat:execute_sqlfile.bat
@ECHO OFF

REM データベースの接続先を設定
SET PGHOST=localhost
SET PGPORT=5432
SET PGDATABASE=sample
SET PGUSER=postgres

REM このバッチファイルが存在するフォルダに移動する
PUSHD %~DP0

REM sqlファイルを実行。標準出力、標準エラー出力をファイルに出力する。
(TYPE ^
 A関係のテーブルを更新.sql ^
 B関係のテーブルを更新.sql ^
 VIEWを更新.sql ^
 functionを更新.sql ^
 | psql --single-transaction --echo-all ) > %~DP0\psql_log.txt 2>&1

POPD
```

* `TYPE`コマンドで、複数のSQLファイルを1個にまとめている
* `--single-transaction` : 一つでもエラーがあればロールバックさせる
* `> %~DP0\psql_log.txt 2>&1` : batファイルと同じフォルダに、標準出力と標準エラー出力の結果をファイルに出力。正しく実行されたことの確認に使う。


## 【注意】パイプ`|`の前にはスペースが必要

以下のようにパイプの前にスペースがないと、「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」というエラーが出ます。
これに約15分ハマりました。

```bat:execute_sqlfile.batの一部
| psql --single-transaction --echo-all ) > %~DP0\psql_log.txt 2>&1
```

## 【注意】SQLファイルの文字コードがBOM付きUTF-8だとエラーが出る

以下のようなSQLファイルを実行すると、「"﻿COMMENT"またはその近辺で構文エラー」というエラーが出ました。

```sql:test.sql
COMMENT ON TABLE address IS 'サンプル';
```

```bat:execute_sqlfile.batの一部（BOM付きUTF-8）
REM エラー確認のためtest.sqlを2回実行する
(TYPE ^
 test.sql ^
 test.sql ^
 | psql --single-transaction --echo-all ) > %~DP0\psql_log.txt 2>&1
```

```txt:psql_log.txt
﻿COMMENT ON TABLE address IS 'サンプル';
ERROR:  "﻿COMMENT"またはその近辺で構文エラー
```

以下のように実行するBOM付きSQLファイルが1個のときは、エラーが出ませんでした。

```bat:execute_sqlfile.batの一部（BOM付きUTF-8）
REM エラー確認のためtest.sqlを2回実行する
(TYPE ^
 test.sql ^
| psql --single-transaction --echo-all ) > %~DP0\psql_log.txt 2>&1
```

ファイルの途中にBOMがあると、エラーになるみたいです。

また、psqlコマンドに`--file`オプションでBOM付きUTF-8のSQLファイルを渡したときも、エラーが出ました。

```bat
psql --file=test.sql
```

```txt:console
ERROR:  符号化方式"SJIS"における0xef 0xbbバイトシーケンスを持つ文字は"UTF8"符号化方式では等しくありません
```


# 参考サイト
* [%~dp0 とは](http://pentan.info/server/windows/cmd/dp0.html)
* [psqlコマンド](https://www.postgresql.jp/document/9.6/html/app-psql.html)
Unityでシェーダを学ぶ時に参考した本とか

知り合いに聞かれたので自分が参考にしたやつをまとめます。本といいつつ、本はほぼないです。

# [凹みTips](http://tips.hecomi.com/)

Unityのシェーダ、グラフィック、レンダリングに関して、素晴らしい記事がとても多いです。

Unity のシェーダの基礎を勉強してみたのでやる気出してまとめてみた - 凹みTips
http://tips.hecomi.com/entry/2014/03/16/233943

の記事から時間とともに技術レベルが上っていくので、記事を1つずつ見ていくととても勉強になります。

# [テラシュールブログ](http://tsubakit1.hateblo.jp/)

みんな大好きテラシュール、Unityを学ぶ上で死ぬほど参考になります。

シェーダ関連だと記事は少ないですが、グラフィック関連だとライティングやポストエフェクト等の実用的なUnityの機能紹介とノウハウ共有が多いのが特徴です。

シェーダを自分で書く理由は **自分の表現したいビジュアルを出すこと** であるはずなので、このためには **Unityの既存機能を理解して美しく見せる技術** も同時に必要になります。シェーダを書かずに美しく見せる技術がないなら、シェーダを書いても美しくなることはありません。

また、シェーダ自体はただのプログラムなのでそれがどう使われるか（=Unityの内部的な仕組み）を理解していることはとても重要です。実用上の観点から考えると、UnityのシェーダではUnity特有の変数と関数（ビルトインの変数、関数、マクロ）を使うことが多いですが、これらはUnityの機能をそもそも理解していることが前提になります。

# [Unity Shaders and Effects Cookbook](http://amzn.asia/gi9SIST)

英語本です。シェーダの仕組み、書き方、表現方法を網羅的に扱っていて、自分でコードを書きながら学んでいけます。教科書としては一番いい本ではないでしょうか。

Unityの情報的には古い本なのと、サンプルコードのところどころに不具合が見受けられるのがあれですが、、

[Unity 5.x](http://amzn.asia/glsScll)の新板もあります。

# [公式リファレンス](https://docs.unity3d.com/ja/540/Manual/SL-Reference.html)

**見づらすぎるので入門としてはオススメできません** が、シェーダに慣れてきたら一通り目を通すと良いです。

# [ビルトインシェーダ](https://unity3d.com/jp/get-unity/download/archive)

Unityはビルトインシェーダのソースコードを公開しています。

[Standard Shader](https://docs.unity3d.com/ja/current/Manual/shader-StandardShader.html)のコードを全て読めば、PBRの仕組みやUnityの内部的な仕様（reflection probeって結局なにやってるの？とか）をほぼ把握できます。実用的には、[uGUIの改造](http://tsubakit1.hateblo.jp/entry/2015/10/29/214107)が役に立つことが多いです。

余談ですが、自分がStandard Shaderのコードを読み始めたのは「Shader Forgeが生成するPBRのシェーダとStandard Shaderの見栄えが微妙に違う」とデザイナーさんから言われて調べたのがきっかけです。あまりポジティブな理由ではないという・・・

# [Shader Forge](https://assetstore.unity.com/packages/tools/visual-scripting/shader-forge-14147)

シェーダをノードベースで作るやつです。変数などが自動生成されるのでエンジニア的には辛いやつですが、アーティストから見た機能がコード上でどう表現されるかがわかります。

コード自体はパフォーマンス的によろしくない（特にPBRは）ので、最終的には[手で最適化](http://acegikmo.com/shaderforge/wiki/index.php?title=Using_Shader_Forge_for_Mobile)したほうが良いです。

# [OpenGL Wiki](https://www.khronos.org/opengl/wiki/Main_Page)

Unityやシェーダ以前の話として **レンダリングの仕組みを理解すること** は非常に重要です。fragment/vertex shaderを書くことに慣れたら[rendering pipeline](https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview)あたりを読んでおくと良いです。GPUとGraphics APIの仕組みを学ぶことで、シェーダの呪術的な文法の意味が理解できるようになります。

# [UnityShader 入門](http://unityshader.hatenablog.com/)

内容がほとんど入門ではないですが、、入門コンテンツはとても参考になります。

1から始めるUnityShader(全6回) - UnityShader 入門
http://unityshader.hatenablog.com/entry/2017/02/25/110446

# [primitive: blog](http://i-saint.hatenablog.com/)

入門ではありませんが、強いモチベーションをもらえます。

シェーダをある程度扱えるようになると **何を作ったらいいかわからない** 状態になります（シェーダにかぎらずプログラミング初心者全般に言えますが・・・）。

具体的には

1. 役に立つ
2. 見た目がかっこいい
3. 技術的にすごい

このうち2個くらいは満たしていないとモチベーションが出ません。こういう時には **今の技術力でできなさそうなこと** をやってみましょう。続けていればそのうちできるようになります。

# その他

## [Unity Graphics Programming](https://indievisuallab.stores.jp/items/59edf11ac8f22c0152002588)

初心者向けではないので、初心者を脱したら読むのが良いです。

## [7日間でマスターするUnityシェーダ入門](http://nn-hokuson.hatenablog.com/entry/2018/02/15/140037)

ものすごくよくまとめられています。 ~~これだけ読んでおけば良い気がする。~~

## [wgld.org](https://wgld.org/)

HLSLではありませんが、情報が網羅的にまとめられています。
chromedriverで無限スクロールする方法

```scraping.py
for i in range (1, 100):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    sleep(5)
```

こちらのスクリプトでできるのですが、以下のリンクから最新のChromedriverをダウンロードしてから行った方がいいと思います。
https://sites.google.com/a/chromium.org/chromedriver/downloads

最新のChromedriverを使っていなかったせいで、エラーに悩まされました。。。
多層ニューラルネットワークの立体表示

多層ニューラルネットワークを解釈しようとするとき、主に次の4つの方法があると考えています。
- 数学的
- 幾何学的
- 抽象概念
- プログラム
ここでは、このうち「幾何学的」な解釈を目的に、ネットワークの可視化を行います。深層学習は、現実はGPUのメモリやメインメモリ上でのデータの流れであり、全ての要素を可視化するのは容易ではありません。そこで、データの側面から考え、概念的なレベルでデータがどのようにネットワークを伝播してゆくかを見ていくことにします。

##目的
多層ニューラルネットワークでのデータ構造を、実際の比率で立体的なダイヤグラムとして表現します。その際、遠近法を使うことで実際の縮尺で可視化することが容易になります。

##ネットワーク構造
1998年に、AT&TのYann LeCun氏ら[1]によって、畳み込みニューラルネットワークの原型であるLeNetが発表されました。主に手書き文字の認識を目的に開発されたネットワークで、2層の畳み込み層と、2層の全結合層によって構成されています。データサンプルは、1辺28ピクセルの画像で、5ピクセルのカーネルによりた2回の畳み込みが行われます。また、出力に際しては、2回の全結合が行われます。以下が、全体図となります。

##可視化
![tensor0.jpg](https://qiita-image-store.s3.amazonaws.com/0/242602/5887f565-199e-4f28-f281-b9a54ee7cbdd.jpeg)

左から、画像が入力として与えられ、畳み込み層で直方体のテンソルに変換されます。プーリング層では水平方向で小さくなり、全結合で一気に膨大な長さのベクトルに変換されています。直感的には、畳み込み層1でチャンネル数が一気に20になる部分で、かなりデータ量が多くなっている印象です。また、実際は複数の画像をまとめてミニバッチで処理されるため、直方体のテンソルの部分は高次元になり、そうなると可視化するのは困難です。

また、全結合層を横から見ると、以下の図になります。
![tensor1.jpg](https://qiita-image-store.s3.amazonaws.com/0/242602/a9f1f022-63bf-63a9-1550-90621eafacac.jpeg)

これにより、全結合層の計算コストがいかに高いかが想像できるのではないでしょうか。GoogLeNetやResNetなどのモダンなCNNでは、この全結合層をなるべく小さくするような工夫がされています。

##課題
課題としては、各層での活性化関数が視覚的に表現されていないこと、また、学習パラメータである重みやバイアスの可視化も今後取り組んで見たいと思います。

##参考情報
[1] [Gradient Based Learning Applied to Document Recognition](http://vision.stanford.edu/cs598_spring07/papers/Lecun98.pdf "Gradient Based Learning Applied to Document Recognition")
http://vision.stanford.edu/cs598_spring07/papers/Lecun98.pdf
【備忘録】Scala


Scala初心者がScala勉強中に覚えたことなどをまとめます。
間違ったことを書いている可能性があります。

# Intelli IDEA関係

### プロキシ環境でのIntelliJ IDEA with SBT
設定箇所が多いです。
[プロキシ環境でのIntelliJ IDEA with SBT](http://jetbeaver.hatenablog.com/entry/2016/05/24/220048)


### ツールチップのコピー
`Alt+左クリック`でできます。
https://teratail.com/questions/118916


### `libraryDependencies`が反映されない
* `build.sbt`に`libraryDependencies`を書いたけど、そのライブラリが使えない。 
⇒ [Refresh Project]を実行した。  
https://stackoverflow.com/questions/41372978/unknown-artifact-not-resolved-or-indexed-error-for-scalatest

### テストとテストサブジェクトの間を移動する
* `Ctrl+Shift+T`で移動できる。 https://pleiades.io/help/idea/navigating-between-test-and-test-subject.html

### 対応する括弧に移動する
`Ctlr+Shift+M`で対応する括弧に移動できる。
https://pleiades.io/help/idea/navigating-to-braces.html




# Scala構文関係

### sealed
* sealed修飾子:サブクラス/トレイトは同じファイル内にしか定義できない


### caseクラスはnewが不要

### case classとcase objectの違い

```scala
sealed abstract class DayOfWeek
case object Sunday extends DayOfWeek

sealed abstract class Exp
case class Add() extends Exp
```


### Pattern type is incompatible with expected type, found: UnknownToken.type, required

「 warning: Token and EndToken.type are unrelated: they will most likely never compare equal」


# ScalaTest関係
* `===`で値を比較する

* `+-`でトレランスが比較できる


# SBT

### `build.sbt`を修正したら、`reload`コマンドを実行すること
いつも忘れます。。。
https://www.scala-sbt.org/1.x/docs/Command-Line-Reference.html


# 難しいと感じところ、詰まったところ

### newを付けるべきかどうか

### ScalaTestでcaseクラスの比較は？




# 電卓プログラムで参考にしたサイト

https://qiita.com/quwahara/items/d7ea5d0e0dbc0409a01f