OmniAICreator/Qiita-1.07M huggingface dataset:
データ基盤を設計するにあたり「10年戦えるデータ分析システム」がめっちゃ役立っているのでメモ

<a target="_blank"  href="https://www.amazon.co.jp/gp/product/4797376279/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797376279&linkCode=as2&tag=shogo807-22&linkId=4778836f058daf94b241371ae06ed379"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4797376279&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL160_&tag=shogo807-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=shogo807-22&l=am2&o=9&a=4797376279" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a target="_blank" href="https://www.amazon.co.jp/gp/product/4797376279/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797376279&linkCode=as2&tag=shogo807-22&linkId=9fc90240916c89a6964584679b9a95d8">10年戦えるデータ分析入門 SQLを武器にデータ活用時代を生き抜く (Informatics &amp;IDEA)</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=shogo807-22&l=am2&o=9&a=4797376279" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

本書では、分析システムのあるべき形として、「SQL中心アーキテクチャ」というものが提唱されている。
BigQueryを中心に据えたデータ基盤を作りたいと思っていたので、大変参考になった。

# SQL中心アーキテクチャとは
- 1. 必要なデータを1つのデータベースに集める
- 2. データの加工には原則としてSQLだけを用いる
- 3. データベース内を論理的にソースデータ層・DWH層・アプリケーション層の3層に区分する

# SQL中心アーキテクチャの利点
- 企業のデータはほとんどRDBMSかHadoopにある
  - RDBMSもHadoopも共通点としてSQLが使える
- サイズの制約がない
  - データ量が数MBでも数PBでも制約なく使える
  - BigQueryのような強力なデータベースの力を活かせる
- エンジニアとプランナーの共通言語として優れている

# SQL中心アーキテクチャの3つの層

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20307/7855a73a-3fa5-4bfc-584a-65a1de9216f3.png)


### ソースデータ層
- 元データをそのまま格納した層

### DWH層
- 整理・統合された汎用共通データモデル層
  - 例: アプリケーション層で共通で使われる利益集計テーブルや、広告費用集計のテーブル

### アプリケーション層
- 特定の分析や分析システムに特化したデータや、集計済みテーブルを格納する層（データマート）
  - 例: DWH層の利益集計と広告費用集計から出したROIテーブル


# 段階的な構築
3層管理は面倒だと思われがちだが、以下のようなイメージで段階的に進めていくと面倒ではないはず。

- 1. まずは元データをそのままデータソース層に貯める
  - 分析者は5、6人であればデータソース層から直接分析すれば問題ない
- 2. 分析者が多くなり、データソース層だけでは厳しくなったらアプリケーション層を作る
  - 主に集計テーブルや、BIツール用のテーブルを作る
- 3. さらに分析者が多くなり、アプリケーション層が乱立し、曖昧なデータの定義が混乱を生み出したらDWHを作る
  - 共通部分をくくりだし、アプリケーション層で曖昧だった定義を共通化し固める

# ETLよりELTを使う
**ETL**
- Extract -> Transform -> Load という順番で、Transformしてから分析データベースに入れる
**ELT**
- Extract -> Load -> Transform という順番で、分析データベースに入れてからTransformする

BigQueryのような強力なデータベースを利用している場合は、ELTモデルの方が恩恵を受けられるという理由で、本書ではELTの方が推奨されている
アプリのCI/CD関連サービス有名どころ調べてみた（簡易版）


Yoki(@enyyokii)と申します。

今回はCI/CD関連サービスの有名なものを調べてみたので簡単にまとめてみました。
AppCenterが思ったより便利でした ☺️

## CI/CDサービス

| 役割         | サービス名 | 機能                                                         | 対象                                                         | 料金                                                         | 備考                                                         |
| ------------ | ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| ビルドツール | fastlane   | ビルド自動化<br />テスト実行<br />証明書の管理<br />スクリーンショットの生成 | iOS: 主流<br />Android: △<br />全ての機能が使用できるわけではない<br />google playへのリリースやスクリーンショットの保存が可能<br />しかし、gradleがビルドツールとしての役割を担うため、fastlaneそのものへのありがたみは少ない。 | 無料                                                         | アプリのタスク実行ツール<br />BitriseなどのCIツールと併用しローカルで実行しないように生産効率あげることが多い |
| CI/CD        | App Center | ビルド時間:<br />（無料）240 ビルド時間 (分)/月<br />ビルドごとに 30 分まで<br />テスト：無制限の起動テスト | Android<br />iOS<br />macOS<br />Windows（UWP）<br />Xamarin | 基本無料<br />無制限のビルド時間+複数のビルド同時実行: ¥4480円/月<br />UIテストを好きな構成で実行: ¥11088円/月 | ViewController2つのWebView表示する簡易アプリでビルド時間は10分程（初回は時間かかるかも）<br />これはすぐに超えそうなので¥4480/月は契約した方がいいかも？ |
| CI/CD        | Bitrise    | 設定方法: GUI(WEB)、YAML<br />ビルド時間制限約8分<br />同時実行数:<br />(無料)x1<br />(有料)x2〜x18 | Android<br />iOS <br />Xamarin                               | 無料: 0<br />有料: $40/month〜（年契約もあり）<br />         | アプリに特化している<br />iOSDCへ参加するなど日本市場へ注力している。日本語記事も見つけやすい。 |
| CI/CD        | Circle CI  | 設定方法: YAML                                               | モバイルアプリ<br />Webアプリ                                | Linuxでのビルド: コンテナ数1 → 無料 ,<br /ビルド時間1000分（約16時間）<br />コンテナ数増やすごとに＄50ずつかかる<br />macOSでのビルド: $39/month〜 | ビルドコンテナメモリ上限: 4G<br />2コンテナ以上利用する場合は、ビルド時間の制限はなくなる<br />アカウント登録はgithub連携必須 |




* AppCenterのみ試してみたが、30分もあればpushをトリガーに、ビルド、単体テスト、配布までを用意に自動化できる。ストアへのアップロードもできる。

* プロダクトをまたいでテストアプリを触るケースがあるので配布ツールは統一したいかも

* iOSの場合、ワークフローはfastlaneにまとめておき、CI/CDツールでfastfileを実行するようにしておけばツールを変更した際の移行が楽（ZOZOの事例より）

* 複数のプラットフォームで同じようにワークフローを管理したいのであれば、Bitriseは選択肢から外れそう。

  

## 参考

[0から始めるiOS自動化](https://logmi.jp/tech/articles/308962)
[AndroidのCIサービスをCircleCIからBitriseへ移行しました](https://techblog.timers-inc.com/entry/2017/06/14/123614)
[iOSで構築しているCIのWorkflow紹介](https://techblog.zozo.com/entry/ios-bitrise-workflow)
[Visual Studio App Centerで始めるCI／CD（iOS）](https://www.slideshare.net/shinyanakajima37/visual-studio-app-centercicdios)
[署名なしでiOSアプリのビルド&単体テスト〜AppCenter編〜](https://qiita.com/uhooi/items/3f5e2d9b774b86a23d3d)
iOS13 UISegmentControlのBeforeAfterを見てみる

## 概要

iOS13から[UISegmentedControl](https://developer.apple.com/documentation/uikit/uisegmentedcontrol)の見た目と動きが大きく変更になりました。

![default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509799/30a70598-0ac7-59fc-af6b-ba9c7c9d5998.png)

これまではButtonが複数あるタブっぽい動きでしたが、[UISwitch](https://developer.apple.com/documentation/uikit/uiswitch)のような動きに変わりましたね。
iOS13では他の新機能が目立って取り上げられていたので、UIKitの見た目変更があると全く知らなくて
開発中アプリの動作確認をしていたら、激変していてびっくりしました汗
実装する上でも変更点があったので備忘録としてまとめていきます。

## 変更点

iOS7からはUISegmentControlの色の指定は`tintColor`でしていましたが、
iOS13以降はこれが使えなく、代わりに[selectedSegmentTintColor](https://developer.apple.com/documentation/uikit/uisegmentedcontrol/3335209-selectedsegmenttintcolor)が追加されました。
機能的には全く同じ。
そう、 ~~プロパティ名が長くなっただけ←~~

どちらもアプリで対応する場合は`available`を使用してバージョン管理が必要です。

```swift:SampleViewController.swift
import UIKit

class SampleViewController: UIViewController
{
    @IBOutlet weak var segmentControl: UISegmentedControl!
    
    override func viewDidLoad()
    {
        super.viewDidLoad()

        // 背景色
        segmentControl.backgroundColor = .white
        // ベースカラー
        if #available(iOS 13.0, *) {
          segmentControl.selectedSegmentTintColor = .red
        } else {
          segmentControl.tintColor = .red
        }
        // 通常時の文字色
        segmentControl.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.red], for: .normal)
        // 選択時の文字色
        segmentControl.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: .selected)
    }
}
```

![colored.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509799/892023fa-f0a8-6842-19ee-1be694455e53.png)

ちなみに、背景色に白色を指定すると影がついたようなグレーになってしまいます。。
これはそういう仕様のようで色々頑張ってみましたが背景を完全な白にできませんでした。。
どうしてもしたい場合は画像を背景にするしかないのかな？汗

また、iOS12以前のSegmentControlのように外枠をつけてみました。

```swift:SampleViewController.swift
// 上記のコードに追記
segmentControl.layer.borderColor = UIColor.red.cgColor
segmentControl.layer.borderWidth = 1
segmentControl.layer.cornerRadius = 4
```

![bordered.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509799/eae1049f-ce4b-9933-4c3e-e87d592ebe79.png)

ちょっと外枠と内側のタブの間に隙間ができるんですね。なるほど。。
iOS12以前のものはパッと見変化がないですが、`cornerRadius`の値によって角丸のところが色が固まっているみたいになりました。。
下手に外枠はつけない方が良さそうですかね汗

## 参考

* [Designing for iOS 13](https://applypixels.com/blog/designing-for-ios-13)
* [iOS 13 UISegmentedControl: 3 important changes - Flawless iOS - Medium](https://medium.com/flawless-app-stories/ios-13-uisegmentedcontrol-3-important-changes-d3a94fdd6763)
AWS ConfigからSNSに通知されない

# はじめに
AWS ConfigからSNSに連携させて通知等を行いたかったが、SNSに通知されなかった。
マネジメントコンソールから自分で作成したSNSトピックを設定して、通知されなかったが、
Configの設定画面で、トッピクの作成を選んで作成したSNSには通知された。

# 必要な設定
SNSトピックのアクセスポリシーに下記「sns:Publish」の設定追加が必要でした。

```json
(省略)
    {
      "Sid": "XXXXXXXXXXXXXXXXXXXXXXXXX",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::XXXXXXXXXXXX:role/aws-service-role/config.amazonaws.com/XXXXXXXXXXXXXXXXXX"
      },
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:XXXXXXX-topic"
    }
(省略)
```

ConfigのIAMロールに対するSNSトピックへの「sns:Publish」の許可設定

# お願い
もうちょっと具体的に書いてくれてたら嬉しかったです。

![aaa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478113/49de8a4d-6ae1-0b0e-cf0f-f67afd06e6dd.jpeg)

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/sns-topic-policy.html
CSS内のカラーコード8桁をRGBAに一括変換

## IEはさておき、Edgeまで透明度ありのHEX8桁使えないの！？

ChromeでWebアプリをゴリゴリ作り込んでいたら、IE、Edgeで透明色が表示されないことが判明。
HEX8桁のカラーコード（例 #3498dbdd）に対応していないらしいのですが、
今更、全てのCSS中を探して、逐一変換していくのはちょっと、、

こんなお間抜けは筆者だけなのかもしれませんが、
Webサービス等でも一括変換はしてくれなかったので、Pythonでサクッと一括変換コードを書きました。
なんてことはない正規表現です。

## ファイル内の全てのHEX8桁 → rgba()

```int(文字列, 基数)```で、○進数表記の文字列`を10進数の数値に変換できます。

```python

import re

def hex2rgba(css):

    # 正規表現で8桁HEX部分を探索
    pattern = r'#[a-fA-F0-9]{8}'
    m = re.findall(pattern, css)
    
    for ccode in m:
        r = int(ccode[1:3], 16)
        g = int(ccode[3:5], 16)
        b = int(ccode[5:7], 16)
        a = int(ccode[7:9], 16)/255

        rgba = "rgba({}, {}, {}, {})".format(r, g, b, a)

        css = css.replace(ccode, rgba)
        
    return(css)

```

お試し

```python

hex2rgba("#3498dbdd")

# 'rgba(52, 152, 219, 0.8666666666666667)'

```

## ついでにCSSファイル全部変換

あとはJupyterでも開いて、glob使ってサクッと全CSSファイルを一括変換

```python

import codecs
import glob
from tqdm import tqdm


fn_list = glob.glob('hogehoge/static/app/css/*.css')

for fn in tqdm(fn_list):
    with codecs.open(fn, encoding='utf-8') as f:
        css = f.read()
    
    css_mod = hex2rgba(css)
    
    with codecs.open(fn, encoding='utf-8', mode='w') as f:
        f.write(css_mod)
```

終盤で急にIE対応が必要になった際は、是非。
（そんな要件定義はイヤだ）

## 環境
* Python 3.6.5
* Windows10
* Jupyter notebook


## Ref.
[HEX8桁に対応したカラーコードコンバータ（8-digit HEX converter）](https://jsfiddle.net/teddyrised/g02s07n4/embedded/result/)
Ubuntu on WSL2 上の Vim でクリップボード連携

Windows Subsystem for Linux 2 (WSL2) 上の Ubuntu 18.04 にて、Vim でクリップボード連携を行う方法について説明します。

また、こちらの記事はほぼ [Gist にあげた記事](https://gist.github.com/necojackarc/02c3c81e1525bb5dc3561f378e921541) の翻訳です。

## 環境
* Windows 10 Home
* Ubuntu 18.04 on Windows Subsystem for Linux 2 (WSL2)

## 手順
1. Vim をクリップボードオプションを有効にしてビルド
2. [VcXsrv Windows X Server](https://sourceforge.net/projects/vcxsrv/) をセットアップ
3. VcXsrv に WSL2 上の Ubuntu から接続

## Vim をクリップボードオプションを有効にしてビルド
まずは Vim のクリップボードオプションを有効にしてビルドするのに必要なライブラリを導入します。

```bash
sudo apt install ncurses-dev libncurses5-dev libgnome2-dev libgnomeui-dev libgtk2.0-dev libatk1.0-dev libbonoboui2-dev libcairo2-dev libx11-dev libxpm-dev libxt-dev python-dev python3-dev ruby-dev lua5.1 lua5.1-dev libperl-dev
```

全部のライブラリが必要なわけではないので、不要なものは好きに削除してください。
個人的に色々と予め有効化しておきたいので、ガッツリ入れてしまっています。

そして Vim を[公式ガイド](https://www.vim.org/download.php)に従いビルドします。

```bash
cd /usr/local/src
sudo git clone https://github.com/vim/vim.git
cd vim/src
sudo make distclean  # if you build Vim before
sudo make
sudo make install
```

## 2. VcXsrv Windows X Server をセットアップ
[VcXsrv Windows X Server](https://sourceforge.net/projects/vcxsrv/) をダウンロードし、XLaunch を以下のオプションで起動します。

* Multiple windows (default)
* Start no client (default)
* Extra settings
  * Clipboard (default)
    * Primary Selection (default)
  * Native opengl (default)
  * Disable access control
  
基本的には、全ての Extra settings を有効化し、残りはデフォルトといった感じです。
最後に Save configuration ボタンをクリックし、`C:\Users\<USER NAME>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup` に設定を保存し、Windows 起動時に VcXsrv が立ち上がるようにします。

## 3. VcXsrv に WSL2 上の Ubuntu から接続
WSL2 上の Ubuntu に再度ログインし、環境変数 `DISPLAY` を設定します。

```bash
LOCAL_IP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
export DISPLAY=$LOCAL_IP:0
```

以上です！

## 参考
* [Xfce4 Desktop Environment and X Server for Ubuntu on WSL 2](https://autoize.com/xfce4-desktop-environment-and-x-server-for-ubuntu-on-wsl-2/)
* [How do I copy whole text from vim to clipboard at once?](https://www.reddit.com/r/bashonubuntuonwindows/comments/be2q3l/how_do_i_copy_whole_text_from_vim_to_clipboard_at/)
ラズパイでTensorFlow Lite環境

# ラズパイでTensorFlow Lite環境

といってもPINTOさんの高速化チューニング済みのリポジトリを使用する
    - https://github.com/PINTO0309/TensorflowLite-bin
導入方法もREADMEに従う。

* 一部、まっさら状態だったので、numpyを入れた

```
$ pip3 install numpy
$ sudo apt install libatlas-base-dev
```

* sample動いた

```
$ python3 label_image.py --num_threads 4 --image grace_hopper.bmp --model_file mobilenet_v1_1.0_224_quant.tflite --label_file labels.txt
0.415686: 653:military uniform
0.352941: 907:Windsor tie
0.058824: 668:mortarboard
0.035294: 458:bow tie, bow-tie, bowtie
0.035294: 835:suit, suit of clothes
time:  0.08983588218688965
```
yarnで Error: self signed certificate in certificate chain と認証エラーが発生したら 

いつしか yarn global 系のコマンドで以下のエラーが出るようになっていた。

```
yarn Error: self signed certificate in certificate chain
```

内容としては、オレオレ証明書を許さないって感じな気がする。

## yarn のconfigを確認しよう

```
yarn config list
```

で一覧を出しましょう。以下のようなものが出ます。

```
yarn config v1.15.2
info yarn config
{ 'version-tag-prefix':
   'v',
  'version-git-tag':
   true,
  'version-commit-hooks':
   true,
  'version-git-sign':
   false,
  'version-git-message':
   'v%s',
  'init-version':
   '1.0.0',
  'init-license':
   'MIT',
  'save-prefix':
   '^',
  'bin-links':
   true,
  'ignore-scripts':
   false,
  'ignore-optional':
   false,
  registry:
   'https://registry.yarnpkg.com',
  'strict-ssl':
   true,
  'user-agent':
   'yarn/1.15.2 npm/? node/v10.15.3 darwin x64',
  lastUpdateCheck:
   1570528586389 }
```

重要なのは `'strict-ssl': true,` のところです。
ここが `'strict-ssl': true,` だとオレオレ証明書に対して、この記事の取り扱っている対象のエラーが発生します。


## 証明書に関してのエラーを許可する
ということで、strictにならなくていいからさ、ということでconfigを上書きします。

```
yarn config set strict-ssl false
```


これで、 `'strict-ssl': false,` に変わります。

はい、解決しましたとさ。
Rustで型の名前を取得する方法

1.38から[std::any::type_name](https://doc.rust-lang.org/std/any/fn.type_name.html)という関数を使って型の名前を取得することができるようになりました。

``` rust
fn print_typename<T>(_: T) {
    println!("{}", std::any::type_name::<T>());
}

fn main() {
    let a = 42;
    print_typename(a);
    let b = |x: i32| { x * 2 };
    print_typename(b);
    let c = (1..10).skip(2);
    print_typename(c);
}
```

これを[playground](https://play.rust-lang.org/)で実行すると以下のように出力されます。

```
i32
playground::main::{{closure}}
core::iter::adapters::Skip<core::ops::range::Range<i32>>
```

型名を取得できるのはデバッグや学習用に便利かもしれません。ちなみに、[std::any::type_name](https://doc.rust-lang.org/std/any/fn.type_name.html)の返す文字列はコンパイラのバージョンアップで変更の可能性があり、また一意であることも保証されないそうです。
【Systematic Trading】Backtesting and Automated Execution Platforms

# Backtesting and Automated Execution Platforms
[Machine Trading: Deploying Computer Algorithms to Conquer the Markets (Wiley Trading) Hardcover – 2017/2/6](https://www.amazon.co.jp/Machine-Trading-Deploying-Computer-Algorithms/dp/1119219604?language=ja_JP)
を読み、個人的にとっても気になっている事項であるバックテスト、執行システムに関する記述があったのでメモ

* プラットフォームとして持っているべき特性
 * It has integrated historical and live market data, or provides adaptors for popular data vendors. 
 * It allows maximum flexibility in strategy design by relying on generic programming languages such as Python or Java.
 * It allows connection to popular broker APIs.
 * It allows backtesting and live trading in US equities, among other instruments.

* 上記本で例として挙げられているPlatform
 * [Quantopian](https://www.quantopian.com/)
 * [QuantConnect](https://www.quantconnect.com/)
 * [Ninjatrader](https://ninjatrader.com/)
 * [Marketcetera](https://www.marketcetera.com/)
 * [Algo Trader](https://www.algotrader.com/)
 * [Open Quant](https://www.openquants.com/)
 * [Deltix](http://www.deltixlab.com/)
 * [Qunat House](https://www.quanthouse.com/)

知らないのもいっぱい。
【Python】VS CodeでPythonをデバッグするとrequestsがimportできないエラーが出た

#エラー内容

最近VS Codeを触り始めたのですが、以下のようなPythonのライブラリがないエラーが発生しました。

<img width="1028" alt="vscode-pythonPath01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352619/788dff8e-7cc7-c063-faa7-8a127103adb6.png">

#解決方法

簡単に方法を説明すると、vsCodeのsetting.jsonにmac内のPythonのある場所のパスを指定してあげればOK。

と言われても。。って方もいると思うので、実際にやっていきます。

##まずはvsCodeの設定が書かれているsetting.jsonを開きます。

<img width="561" alt="vscode-pythonPath02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352619/364c45f4-398a-943c-0109-219c39246af0.png">

<img width="1440" alt="vscode-pythonPath03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352619/e58fb9c4-6b51-1c12-6df7-b29ff2adc8a4.png">

右上のアイコンを押すと、setting.jsonのファイルを表示できます。

##ターミナルでPythonのパスを表示します。

僕は、以下のようになりました。

```:ターミナル
$ which python

/Users/ユーザー名/.pyenv/shims/python
```

##変更を追記する

<img width="1440" alt="vscode-pythonPath04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352619/50066e79-1556-61fb-2f9f-d9e8e7661e14.png">

デフォルトでは左記のようになっています。

右側に書くと上書きされるので、先ほどのターミナルで表示したパスを書いていきます。

###以上で終了です、もう一度デバッグしてエラーが出なければ成功です！
MySQL系用語まとめ

# 目的

- データベースの勉強をするにあたって、[DE系用語まとめ](https://qiita.com/miriwo/items/873aa03efaf0a572d156)という投稿をしたが、MySQLの内容も記載されていたため、別途投稿としてまとめる。
- MySQLの勉強内容をまとめる。

### MySQL

- Web系で主に使われているデータベースのこと。
- オープンソースデータベースの一つである。
- 使用しやすく、高速である。

#### 数値のデータ型

- 数値の型の例

|型  |値の範囲  |UNSIGNED  |ZEROFILL  |
|---|---|---|---|
|TYNYINT  |-128～127  |0～255  |000～255  |
|SMALLINT  |-32768～32767  |0～65536  |	  00000～65536  |
|MEDIUMINT  |-8388608～8388607  |0～16777215  |  00000000～16777215  |
|INTEGER  |	-2147483648～2147483647  |  0～4294967295  |	0000000000～4294967295  |
|BIGINT  |	  -9223372036854775808～9223372036854775807  |  0～18446744073709551615  |  00000000000000000000～18446744073709551615  |

#### テキストのデータ型

- 各バイト数を超えた場合はカットされる。
- 可変長のものは格納された文字列に合わせて表現される。
- 固定長のものは指定された文字列長さに、格納する文字列長さが満たなかった場合、満たない分だけ余白(文字としてのスペース)が格納される。
- 文字列の型の例

|型  |バイト数  |
|---|---|---|--|
|TYNYTEXT  |0～255バイト（固定）
|VARCHAR  |0～255バイト（可変）
|TEXT  |0～65535バイト（固定）
|MEDIUMTEXT  |0～16777215バイト（固定）
|LONGTEXT  |0～4294967295バイト（固定）

#### 日付・時間のデータ型

- ダブルクオートかシングルクオートで囲んで格納する。
- 日付・時間のデータ型の例

|型  |内容  |範囲  |
|---|---|---|
|DATETIME  |日付と時刻  |’1000-01-01 00：00：  00’～’9999-12-31 23：59：59’  |
|TIMESTAMP  |日付と時刻  |’1970-01-01   00:00:01.000000’UTC～ ’2038-01-19   03:14:07.999999’  |
|DATE  |日付  |’1000-01-01’～’9999-12-31’  |
|TIME  |時刻  |’-838：59：59～838：59：59’  |
|YEAR  |時刻  |’1901～2155’  |
【忘備録】win32comを使って、Outlookの添付ファイルを保存

# win32comを使ったOutlookの添付ファイル保存

* Outlookのメールをpythonで指定のフォルダに保存

```python
from win32com.client import Dispatch
import datetime as date

save_path = r'保存先フォルダパス'
lag = 1 # 過去何日分のメールを検索対象とするか
sub_ = '対象メールの件名'
att_ = '*添付ファイル名'

outlook = Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder("6")

# サブフォルダも指定可
# inbox = inbox.Folders("sub-folder")

all_inbox = inbox.Items
val_date = (date.date.today() - date.timedelta(lag)).strftime("%d/%m/%y")

for msg in all_inbox:
    print(msg)

    if sub_ in msg.Subject:
        for att in msg.Attachments:
            if att_ in att.FileName:
                att.SaveAsFile(save_path + "/" + att.FileName)

    elif msg.SentOn.strftime("%d/%m/%y") < val_date:
        break
```
xcode11でシミュレーターに機種を追加する方法

xcode11にアップデートしたところ、シミュレーターの一覧からSEが消えていたので追加した
storyboardのDeviceからiPhoneXSが消えたのは、iPhone11 proと同じやぞそんくらい覚えろやということですか？？

# 機種の追加方法
Add Additional Simulators...を選択
![スクリーンショット 2019-10-08 19.30.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475485/839fe59a-c94a-d185-561b-f9be5f47b98a.png)


左下の`+ボタン`を選択し、必要なDevice Type を選択してcleate
![スクリーンショット 2019-10-08 19.22.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475485/b9ab3128-35e8-34db-e855-c572c794a677.png)

# 追加できました
以上
CppCon 2019

# はじめに

9月にCppCon 2019がColorado州Auoroで開かれました。
色々おもしろい発表がされていたので、簡単に紹介します。
他にも面白い発表が見つかったら随時追加します。

# CppCon 2019

## RVO and In-Place Construction

[Ben Deane “Everyday Efficiency: In-Place Construction (Back to Basics?)”](https://youtu.be/oTMSgI1XjF8)

- RVOできるのってどんなとき？
- In-Place Constructionするには？

## Zero-cost Abstraction

[Chandler Carruth “There Are No Zero-cost Abstractions”](https://youtu.be/rHIkrotSwcc)

- 抽象化には必ず何かしらのコストが支払われる（ゼロコスト抽象化の否定）
- `std::unique_ptr`は生ポインタと比べてパフォーマンスがほんの少し低い

## Exceptions and RTTI

[Herb Sutter “De-fragmenting C++: Making Exceptions and RTTI More Affordable and Usable”](https://youtu.be/ARYP83yNAWk)

- スタックメモリを使用したRTTIを使わない例外の提案
- Static reflectionを使いコンパイル時に型情報を評価（type_infoが不要となる）
- RTTIを使わない省メモリなdown-castの提案
サーバサイド初心者がGoの型宣言とメソッドを個人的に理解しようとした話

# go lang に置ける注意点
A Tour of Goをやってるので、その中の必要な型宣言とかメソッド周りで必要なところをまとめた記事です。golang初心者なので、突っ込んでください！

## 変数型宣言
いつものvariableのvarを使った宣言をしていきます。

```go
var number int
var letters string
```

ってするのが基本形

- 初期化子を利用した簡単な型宣言もできる

```go
var number = 1
var letters = "This is a String"
```

- 連続して同じ型を宣言する場合はまとめることもできる。

```go
var number, numberTwo int
```

- 複数型を一括でも宣言できる。初期化子を利用した方法で

```go
var number, letters, isPython = 1 , "This is a String", false
```

えらい便利。すごい便利。素直にすごい。

- メソッド内限定だが（僕はそう理解した）、以下のような暗黙の型宣言もできるらしい。

```go
func someMethod(){
     i := 3
     // ゴリラやんけ
}
```
これ便利そう。varでわざわざ宣言する必要がないのは覚えとくと可読性の面でも楽そうだけど、型処理とかでめんどくさいことならないのかな。。。

## 型の種類
> bool

>string

>int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr

>byte // uint8 の別名

>rune // int32 の別名

>float32 float64

>complex64 complex128 //複素数とか虚数を許すすごいやつ

ほうほう。runeってこれまた古代魔法が使えそうな。。。
int, uint, uintptrの三種類は完全にそのシステムが64bitか32bitかによってその型特性？が変わると。
まぁ当たり前か。

## 定数宣言
これが結構特殊な感じがする。constantのconstを使っての宣言をする。
- constを使う場合ではメソッド内での ` := ` をさせてくれない。
- varよりも数値の精度が高い。
- 使える型はCharacter,String,Numeric,Booleanの四つのみ

この3点は覚えとく必要があるですね。


## 型宣言の特性
Goで最初にあげたように初期値を入れずに宣言をしたものは基本的に、No Value = nilにはならず、
Zero Value = 0もしくは空のStringになる。

```go
var letters string    //letters = ""
var number int        //number = 0
var isPython bool     //isPython = false
var decimals float32  //decimals = 0
```

## 型変換(Casting)
わりかし簡単っていうのが第一印象

```go
var number = 1
var decimals = float(number) //decimals = 1
```

っていう形になる。

じゃあintをstringにキャストできるかって言われると、できない。

```go
var number = 1
var letters = string(number) //letters = ""
```

#メソッド
Swiftが長いので正直めちゃくちゃわかりやすかった。

```go
func swap(x,y string) (fullScript string){
    fullScript = y + x
    return fullScript
}
```

こう言う形で戻り値、引数宣言ができる。

もちろん暗黙的にReturnさせれる

```go
func swap(x,y string) (fullScript string){
    fullScript = y + x
    return
}
```

引数がない場合に関しては、

```go
func swap(){
    total := x + y
}
```
ってする。まぁわかる。
[Typescript] enumよりもstring literalがイケてる

TypescriptではCやJavaなどでもお馴染みのenumがサポートされているけど、string literalを使うことでコードの記述量の削減、コンパイル後のオブジェクト数の削減ができますよという話。
以下、具体例。

```typescript
// A.ts
export enum Enum {
    Hoge = 'hoge',
    Fuga = 'fuga'
}
function enumFunc(val: Enum) {}
function typeFunc(val: 'hoge' | 'fuga') {}  // inlineで書くこともできる

// B.ts
// import {
//     Enum,  // import必須
//     enumFunc,
//     typeFunc
// } from './A.ts'
enumFunc(Enum.Hoge) // importしたenumを使わないといけない
typeFunc('hoge')  // typeのimportがいらない
```

これがjavascriptにコンパイルされると

```javascript
// A.ts
export var Enum;
(function (Enum) {
    Enum["Hoge"] = "hoge";
    Enum["Fuga"] = "fuga";
})(Enum || (Enum = {}));
function enumFunc(val) { }
function typeFunc(val) { } // inlineで書くこともできる
// B.ts
// import {
//     Enum,  // import必須
//     enumFunc,
//     typeFunc
// } from './A.ts'
enumFunc(Enum.Hoge); // importしたenumを使わないといけない
typeFunc('hoge'); // typeのimportがいらない
```

になる。Enumオブジェクトが増えてしまっている。

以下、Playground
https://www.typescriptlang.org/play/#code/PTAEEEDoBcGcCgCmAPADgewE7VIgdgK4C2oAooSQN7yi2gAS6A5oqALygDkAFs4pwBoadAGIEmAQ3ZcAZuImd4AX3hy8AY2gBLdHlwUxGgBQA3CQBsAXGQoBKUJRVrNOvdACeqRIfWmL1nj5OUAAfWXlOe0daEFAtPHN4xEBzBkAPs0B5BkBlBkALBkAghmTAWQZAaIZ4eFiAIRgEWK0iDGwHMrA6G2IBGLBa+uhAUf1ACAymlv1iHyFYlo8vH0GlUBlMdBJOSGAoOEV8EYJjcmJIRhZ7GrqsaEB1BkB9Bk2iQCSGQH95QHiGQCsGQBEGbJfARQZX+Envbd9AixIh1QL9AHYMXVOgBkGF6ASIZvkA
Automation Anywhereの用語集をScrapboxで作ってみた


公式ドキュメンテーションも日本語化されてだいぶ使いやすくはなっているのですが、
並行して一部のユーザーさんたちと単語集をまとめてしまいましたので、Qiitaでも共有しておきます。
（非公式なものなので、掲載情報についてはあくまで参考用に使ってください。）
詳細な解説については公式ドキュメンテーションへのリンクだけで済ませている部分もありますが、
なるべく前提知識なしに読めるようにしていこうとしています。

[Automation Anywhere用語集](https://scrapbox.io/AutomationAnywhere/)

作成に使用したScrapboxですが、お薦めがあり今回初めて使用してみましたが、ナレッジ共有をする際にとても素早く、手軽に出来て便利でした。
こういったまとめなど作成されたい方にお勧めです。
特に公開プロジェクトであれば無料で使えるところも有難いところです。

[Scrapbox - チームのための新しい共有ノート](https://scrapbox.io/product)

なお、Automation Anywhereについては、Qiita上に以下のまとめを作成頂いている方もいますので、参考にしてください。

[🔰Automation Anywhere 初めて使う人のための用語をまとめた話 - Qiita](https://qiita.com/KamiyaMT/items/61abb7dd1d9d19c8268a)
Serverless Frameworkでログの保持期間を環境毎に設定する

## はじめに

開発環境と本番環境でCloudWatchLogsのlogRetentionInDays（logの保持期間）を設定する方法について。
※ 微量ですが、コストの削減にも繋がるかと思います

以下を読んでおくと、よりわかりやすいかもしれないです。
[Serverless Frameworkでstage毎に外部ファイルから環境変数を参照させる
AWS](https://qiita.com/sayama0402/items/a13610202220896796aa)

今回は例として、
開発環境の保持期間を1日
本番環境の保持期間を7日
とします。

## serverless.yml

```yml
provider:
  logRetentionInDays: ${self:custom.logRetentionInDays.${opt:stage, self:custom.defaultStage}, self:custom.logRetentionInDays.default}
  stage: ${opt:stage, self:custom.defaultStage}

custom:
  defaultStage: dev
  logRetentionInDays:
    dev: "1"
    prod: "7"
    default: "1"
```

上記のように設定することで、開発環境にデプロイしたlogRetentionInDaysは1日に本番は7日に設定されるようになるかと思います。
省略されてばっかりなHTML用語を読み解く

#はじめてのQiita
はじめましてあさちゃんです。
普段は事務職でお仕事をしているのですが、
合間を見てコーディングの勉強もさせてもらえることになりました。

今回のテーマは

:weary:　<　__HTML用語って英単語が省略されているから覚えづらい！！！！__

というところから思いついたのですが、
この投稿が初めてのQiitaになるので、
まずは__私自身の紹介__を記しておこうとおもいます:point_up_tone1::girl_tone1:

＼誰も聞いてね～ぞ～／　

と、ヤジが飛んできそうですが、始めます。

##パソコンが仲間になりたそうな目でこちらをみている！

私の父はエンジニアで、自分の仕事が天職だと言い張る根っからのPCオタクです。
（パパ大好き:man_tone1:）

なので私は、
生まれたときから身近にパソコンとインターネットがある暮らしを送ってきました。

幼稚園生の頃は父がパワーポイントを使って
『走る車』
（柱にぶつかると「どんがらがっしゃーん！」と音を立てて壊れてしまうアニメーション:red_car:）
を再現して見せてくれるなど、父らしい遊ばせ方をしてくれていました。

##画面の向こう側に友達がいる小学生
父のおかげでパソコンが大好きな子供に育った私は、

小学生の頃にはオンラインゲームで知り合った年上の女の子とSkypeで通話をしていましたし、
お小遣いをもらったらそのほとんどをアバター課金に費やしていました。

うちにはペットとかいなかったし、一人っ子だった＆学校で友達も少なかったので
学校が終わるとすぐに帰ってきてPCで夜遅くまで遊ぶような
ちょっと心配になる子供だったと思います。(笑)

##そんなこんなで
（めっちゃ雑な省略）

次第に自分のWEBサイト作ってみたいなーとか、
「__自作してみること__」に興味を持つようになったわたしは
HTMLやCSS、javascriptを少しだけ触れるようになりました。

でも、最初はネットや本にあるサンプルコードを真似してるだけで、
結局書いているものの本質？みたいな部分が分かってないんですよね。
だから全然覚えられなくて。

なので今回は自分のための備忘録として、

:rolling_eyes: < __なんじゃこりゃ？__

なタグや用語の名前の意味なんかを記して覚えていこうと思います。

今まであんまり気にしなくてもタグとか使い方覚えられた天才肌な皆さんも
ほえ～～～って感じで眺めてみてもらえたらうれしいです。（初投稿なので）（実は初投稿2回目だけど）

#本編
①　対象の用語
②　正式名称（略されていない形）
③　日本語の直訳
④　私的な意訳
④　私の解釈・感想
という流れで覚えていきたいと思います。

##HTML
正式名称：__Hyper Text Markup Language__
直訳：過度に 文書 印を付ける 言語
意訳：めっちゃ文書に<font color="hotpink">印</font>を付ける言語 <font color="LightGray">卍</font>
解釈と感想：
意訳つけると、なんていうか卍！って感じで私は好き。

うーん、なんで「印」を付けるんだ･･･？

と思ったので調べてみたけど、
コンピューターに「ここから本文ですよ～」「ここは重要だからね～」と
分かりやすくするために分かりやすく<font color="hotpink">印</font>を付けて文章を「構造化」するらしい。

そうした書き方をする言語を「マークアップ言語」と呼ぶが、
HTMLのほかにも
　・__Standard Generalized Markup Language__（意訳：普通に一般化されてるマークアップ言語）
　・__Extensible Markuo Language__（意訳：拡張できるマークアップ言語）
とかっていう仲間がいるそうな。

なんでHTML先輩だけ「めっちゃ」なんだろ。その辺はまた調べてみよう。

##meta （タグ）
正式名称：__METAinfomation__
直訳：メタ情報
意訳：メタい情報
解釈と感想：
いやだからメタってなんやねん！！
メタがわからんねんて！！！

という私のためのメモ

・そもそも「meta」は、古代ギリシア語で前置詞として使われていたらしい。
・英語のmeta-は「後から」「超えて」「ともに」「変化」などのニュアンスの接頭語で
　そもそもがいろんな目的で使用される
・情報系におけるメタは「何かについての何か」という意味なので
・HTMLにおける__metainfomation__は、「__このHTML文書についての情報__」

ってことになるらしい
ウェブサイトから順番にメタを掘り下げたら

ウェブサイト
↓メタ
HTML文
↓メタ
英語？

なのかな？
プラトン哲学で出てくる「イデアのイデア」みたいだ。

##OGP
正式名称：__Open Graph Protocol__
直訳：開く 図表 要綱
意訳：公な図表についての要綱
解釈と感想：
うーん、意訳が合ってるのか自信ないなー。

OGPってFacebookとかTwitterでリンクがシェアされたときに出てくる
サムネイル＋タイトル＋概要みたいな箱の
中身をちゃんと設定するときに使うやつじゃないですか。

だからあの箱が図表が不特定多数にシェアされるから「公な図表」って表したんですけど。

ちゃんと理解していて教えてくれる方いたらぜひ教えてください。。。

#おわり
調べながら書いてたら結構時間がかかってしまったので
今回は用語3つでおわりにしたいと思います。

また覚えづらい単語があったら調べてみます！
phpenvで5.6と7.2の開発環境を準備する

## 結果
phpenvで5.6のインストールでopcacheが有効になっていたようで、5.6のビルトインサーバーを起動しブラウザでアクセスすると、segmentation faultが発生しました。
opcacheを無効化する方法を記事の最後に記載しました。

## 環境情報

- MacOS High Sierra 10.13.6
- zsh 5.7.1
- Homebrew 2.1.12
- phpenv v0.9.0-rc.1

## 手順

### phpenvのインストール

#### ・ Gitでクローン

```shell
git clone https://github.com/madumlao/phpenv.git ~/.phpenv
```

#### ・ パスを通す（zsh）

```shell
vi ~/.zprofile
```

#### ・ zshrcに追加

```shell
export PHPENV_ROOT="$HOME/.phpenv"
export PATH="$PHPENV_ROOT/bin:$PATH"
eval "$(phpenv init - zsh)"
```
*※ bashの場合は、 `eval "$(phpenv init -)"` で設定。*

---

### php-buildをインストール

#### ・ Gitでクローン

```shell
git clone https://github.com/php-build/php-build.git ~/.phpenv/plugins/php-build
```

#### ・ PostgreSQL用の設定をデフォルトに （オプション）

```shell
echo '--with-pgsql' >> ~/.phpenv/plugins/php-build/share/php-build/default_configure_options
echo '--with-pdo-pgsql' >> ~/.phpenv/plugins/php-build/share/php-build/default_configure_options
```

---

### phpのインストール

#### ・ brewで必要なライブラリをインストール

```
brew install re2c openssl bison libxml2 autoconf automake icu4c libjpeg libpng libmcrypt
```

### ・ インストールするバージョンを確認

```
phpenv install -l
```

#### ・ 7.2のインストール （以下は、7.2.20）

```
phpenv install 7.2.20;
```

#### ・ 5.6のインストール （以下は、5.6.40）

```
export CONFIGURE_OPTS="--disable-opcache"
phpenv install 5.6.40
unset CONFIGURE_OPTS
```
*※ opcacheが有効になってしまい、5.6のビルトインサーバーを起動してブラウザでアクセスすると、segmentation faultで落ちたので、disableにしています。*
*※ opcacheは、iniファイルにzend_extensionで最終行に追加されるようなので、コメントアウトでも問題ないようです。*

#### ・ 5.6.40のphp.ini
```
vi /Users/kazumi_watanabe/.phpenv/versions/5.6.40/etc/php.ini
```
## 関連

- [MacOS High SierraでPHP5.3のインストール](https://qiita.com/kazumiiiiiiiiiii/items/2a50335f5e4b5bb915ac)
marl C++11 task scheduler のメモ

A hybrid thread / fiber task scheduler written in C++ 11
https://github.com/google/marl

fiber にも対応している task scheduler です.
thread/task scheduler ですといくつか他に実装はありますが, fiber 対応で Android なども対応で依存ライブラリ無しというのは marl くらいな気もしますのでよさそうな感じはあります. 

Ticket という機能も実装されています.

https://github.com/google/marl/blob/master/include/marl/ticket.h

SwiftShader で最近(?)使われているようで気になりました.
https://github.com/google/swiftshader 

特にグラフィックスアプリ関連で使えそうですね.

`defer` 以外は, 記述は `std::thread` に近い感じで使えますので, 自前アプリに組み込みは容易かと思います.

## defer

リソースの解放など, スコープが抜けたあとに処理を実行するのに `defer` というマクロが用意されています.

https://github.com/google/marl/blob/master/include/marl/defer.h

変数が delete されるときに呼ばれるのでは**ない**ので, ライフサイクルに注意ください.
AWSのインスタンス費用を簡単に減らす方法 リザーブドインスタンス

# 対象
AWSを活用している。
IaaSなので使うときだけ稼働させればいいのですが、
夜間土日などのON/OFFやマシンの大きさを変更する予定がない方向けです。

# 概要
リザーブドインスタンス(RI)はインスタンスの利用を予約する仕組みです。
OFFにしても固定で払う代わりに割安でインスタンスを利用できます。
割引率は最大で約60％にもなり起動したままになっているような環境であれば使うだけでお得です。

# 購入について

[AWS マネジメントコンソール]>[EC2]>[リザーブドインスタンス]から購入できます。
購入すると自分では何もしなくともAWSが勝手に適応してくれます。

## メニューについて
| 項目 | 内容 |
| --- | --- |
| プラットフォーム | インスタンスで利用している環境の物を選んでください |
| テナンシー | インスタンスで利用している環境の物を選んでください。基本的にデフォルトで問題ないと思います。 |
| 提供クラス | 将来的にファミリー(インスタンスタイプのプレフィックスのt2, t3, m4部分)を変更する予定がなければスタンダードでOKです。 |
| 期間 | 1年 or 3年 当然3年の方が割引率が高いです。|
| お支払い方法 | 全額前払いが一番割引率が高いです。 |

# 注意
リザーブドインスタンス購入後は使っても使わなくても金額は変わらないのでご注意ください。
WEBコーディング前に確認したいフォントについて

#おすすめフォント
| フォント | 自動カーニング | デバイス | デメリット |
|:----------|:---------:|:------|:-------|
|ヒラギノ|○|MAC|Windowsでは有料フォント|
|遊ゴシック|○|MAC/Windowsどちらも|IE11で崩れがある（都度調整がいるため回避策なし）|
|Noto Sans|✕|全てのデバイス|Webフォントなので重い|
|メイリオ|✕|Windows|Macにはoffice入れるなりDLする必要あり|
**ない！**


##ヒラギノデザインの場合
mac依存フォント windowsではだいたいメイリオにしてと言われる、（遊ゴシックよりは似てるからかな？）
これが困る。

この時点でデザイン時にカーニング（V/Aみたいなの）にオプティカルとか自動とか設定されていたら問題が発生する。

ヒラギノ　自動カーニングOK
メイリオ　自動カーニングできない

自動カーニングはCSSでのfont-feature-settingsでできますが、各フォントによりその情報がないとできません。

自動カーニングではなくきっちりと値を入力してほしい
（そもそもタイトル部分ではなく文章部分なら使わないほうがいいのかなとも思います。）
　
※ここでの問題はデザインと違うといわれること、（改行位置が違ったり最悪の場合カラム落ちしたり）

###ヒラギノで作成されたデザインをWindowsで見た場合
**アウトラインで作成していただければデザインは見れる**
そうでないとデバイス依存デザインになってしまう

windowsではメイリオと指定されているのに
何故デザイナー及びデザイン確認者は**メイリオにフォントを変えてデザイン作成せず確認しないの**だろうか？

####誰の責任？
もしmacで見て崩れが起きていればそれはコーダーの責任だけど
しかしwindowsで崩れがおきていればそれは崩れが起きる可能性があることを示唆する必要があります。
誰も確認していない状況がコーダーにはとにかくまずい（このデザインでいけますと発言したことと同義だと思う）ので、
コーディング開始前に伝えておいたほうがいいです。

**ヒラギノ＝メイリオではないのは皆わかっているはずなのに**

##遊ゴシックデザインの場合
**Windows7の場合手動でフォントをDLする必要がある**
IE11で天地中央表示（flexbox)などした場合何故かズレが生じる
（おそらくAタグをflexboxしたらかな。。）
なので大抵はIE11のみメイリオに変更している。

###遊ゴシックで作成されたデザインを各OSで見た場合
Mac/Windowsどちらでも使えるフォントなので、デザインを見ることは可能

###誰の責任？
ヒラギノの時とほぼ同じなので省略。
Windows7のみ手動でフォントをDLする必要があること、
IE11のみ崩れが起きるのでメイリオに変更する必要があることを周知しておきたい。
ちゃんとWindows7のChromeで見た場合もここまで案件対象か確認もしておくことが望ましい


##WEBフォントデザインの場合
これならどのデバイスでも大丈夫。
だけどgoogleフォントは自動カーニングできなくなったので
デザイナー様は**googleフォント使うのならカーニングは数値**でお願いします。
自動で全ての文字ではないけど[約物半角専用のWebフォント](https://yakuhanjp.qranoko.jp/)を先に読み込むことで解消させる方法もある
縦書きの場合、Webフォント自体や他にCSSプロパティを付与したことが原因でうまくいかないことがあるので縦書きの場合は作ってみないとわからない事が多々ある。

###有料フォント（タイトルなどの一部分でも）デザインの場合
デザイナー様やデザイナー様の所属する会社が所有していてもコーダーは持っていないことが多々あるので、
アウトライン化しておかないと今度は有料フォント所持依存デザインになってしまう

また有料フォントなのかWEBフォントなのか実際フォントを調べないといけない時間もかかる

TypeSquareやAdobeフォントもpv数に応じて有料になっていくので
これを制作関係者隅々まで周知させているかを徹底してほしい
（最終的にお客様が認知しているかどうか）
googlemapもそうだけど永久タダのほうがいいに決まっている。
有料になるPV数これくらいだから絶対大丈夫ですよ？
だれもそれだけリニューアルしても見に来ませんよってお客様に言える人がいるかどうか。

###どうしてそのフォントをベースフォントにしたの？
WEBは誰しもが同様にどのデバイスでも同じように見れる・または内容が伝わるように作成しているかと思います。
（そのためにwindows7のIEとも戦っている。）
WEBデザイナー様はデザイン確認者がOKを出せばそこでゴールとなり作業終了ではないと思いたいです。
とりあえずコンペで受かりたかったためキレイだけどデバイス依存フォント使っちゃいました。
といってくれるほうがコーディング作業の覚悟（見積もり増）もできる。

####デザイナー様へ
**MacでWindows見れるようにしているのは必ずしもMacユーザー全員ではない**
その恩恵はやはりMacから簡単にヒラギノフォントをWindowsに使用できたり（個人利用なら問題はないらしい）、
Microsoft officeを入れていればメイリオをMacで見れたりもする。
だけどそれは半分いたらいいほうだと勝手に思っている（windows7 のIE11もこれくらいいればいいのに）

私が主にWindowsを使っているのでヒラギノを例にだしましたが、ヒラギノやMacが悪いのではなく、
現状どのデバイスもなんか見やすく有名でカーニングができて、といったフォントは（おそらくこれからも）ないのだから、
どこかで（コーダーではなくもっともっと早い段階で）共有して落とし所をつけておくかだと思います。
最終的な確認で発覚し修正が多発することにならないように、
コーダーだけが防波堤になってしまうことがないように。

**あとコーダーは英字のみのフォントはフォントサイズと高さ違うから上下のマージンちゃんと計算しないとダメですよー。
デザイナー様は計算が複雑になるから一行の場合行間いれないでくれたらすごく助かります。**

ありがとうございました。
グラフィカルガウシアンモデル

```{r}

library(dplyr)

m=1000

X=sample(20:400,m,replace=T)

C=t(t(X))%*%t(X)+diag(1,m)

y=sample(1:1000,m,replace=T)

V=sample(y,30);E=c(1:1000)

dat_y=data.frame(num=1:length(y),y=y,sign=ifelse(y %in% V,1,0))

b_var=sum(dat_y$y[dat_y$sign==1])/length(V)

y=y-b_var

a=1;b=1;r=1



ite=30000;ite2=300

a_vec=c();b_vec=c();r_vec=c();cost_vec=c()

for(j in 1:ite){
  
u=as.numeric(sum(diag(C%*%solve((b+r)*diag(1,m)+a*C)))/length(E)+((b^2)*t(y)%*%C)%*%((solve((b+r)*diag(1,m)+a*C))^2)%*%t(t(y))/length(E))
  
v=as.numeric(sum(diag(solve((b+r)*diag(1,m)+a*C)))/length(E)+((b^2)*t(y))%*%((solve((b+r)*diag(1,m)+a*C))^2)%*%t(t(y)))  

b=as.numeric(sum(diag(solve((b+r)*diag(1,m)+a*C)))/length(V)+(b*t(y))%*%((r*diag(1,m)+a*C)^2)%*%((solve((b+r)*diag(1,m)+a*C))^2)%*%t(t(y))/length(V))

a_pre=a;r_pre=r

for(i in 1:ite2){
  
a_pre=a;r_pre=r

a=a*sqrt(sum(diag(C%*%solve(r*diag(1,m)+a*C)))/(u*length(E)))

r=r*sqrt(sum(diag(solve(r*diag(1,m)+a*C)))/(v*length(E)))

#print(paste0("a:",a,"; r:",r))

}

a_vec=c(a_vec,a);b_vec=c(b_vec,b);r_vec=c(r_vec,r)

#print(paste0("a:",a,"; b:",b,"; r:",r))

cost=sqrt(det(b*(r*diag(1,m)+a*C))/(((2*pi)^length(V))*det((b+r)*diag(1,m)+a*C)))*exp(-b*t(y)%*%(r*diag(1,m)+a*C)%*%solve((b+r)*diag(1,m)+a*C)%*%t(t(y)))

#print(cost)

cost_vec=c(cost_vec,cost)

}

print(paste0("a:",a,"; b:",b,"; r:",r))

x=b*solve((b+r)*diag(1,m)+a*C)%*%t(t(y))

```
Growi, CrowiからAWS S3にアップロードするための設定

# 概要
CrowiとGrowiでやった内容だが、esa.ioも多分同じ。エンドポイントの書き方が違うくらい。

1. HerokuとかDockerとかでGrowiを建てる。
2. Growiで利用するS3のバケットを作る。
3. IAM作ってGrowiで利用するS3だけ許可するポリシーを書く。
4. Growiの管理画面でIAMの情報を入力する。
5. おしまい。

## なぜやるのか

Herokuの無料範囲（free Dyno）で建てるケースやDockerで運用する場合、ローカル環境に入れると消えてしまうため、MongoDBかS3かその他のストレージに入れる必要がある。
MongoDBに保存するのは抵抗があるため、S3に置きたい。
（特に無料範囲で動かす場合、ストレージのサイズがネックになる可能性が高い。）

## 手順

### 1. HerokuとかDockerとかでGrowiを建てる。

（省略）

### 2. Growiで利用するS3のバケットを作る。

（省略）
ブロックパプリックアクセスは全部 `オフ` で問題なし。IAMで制御する。

### 3. IAM作ってGrowiで利用するS3だけ許可するポリシーを書く。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::{$growi}",
                "arn:aws:s3:::{$growi}/*"
            ]
        }
    ]
}
```

### 4. Growiの管理画面でIAMの情報を入力する。

プロフィール画像とかちゃんとアップロードできてればおｋ。

## トラブルシューティング

ENVで `FILE_UPLOAD: aws` になってることを確認

## Todo

GrowiはS3のURLに対してプロキシしてくれるので、直URLは見えないものの、S3のURL直叩きするとファイルが見えてしまう問題がある。
S3のバケットポリシーでIP制限掛けるのが良いが、Herokuの無料範囲でやるとAWSのリージョンで設定されている範囲全部来る可能性があるのでちょっと現実的じゃない。

- [ ]  lambdaで都度変更するfunction動かすとか
- [ ]  Growiで使ってる `aws.js` をオーバーライドするとか、改善してPR送るとか


/資料/外部仕様/S3のACL設定 - GROWI Developers Wiki https://dev.growi.org/%E8%B3%87%E6%96%99/%E5%A4%96%E9%83%A8%E4%BB%95%E6%A7%98/S3%E3%81%AEACL%E8%A8%AD%E5%AE%9A
PHPでデータベース接続

#１行で実行する場合
<pre>
$dbh = new PDO ('mysql:dbname=データベース名;host=ホスト名またはIPアドレス;charset=utf8;',ユーザ,パスワード,PDO属性)；
</pre>
・PDOクラス（基底クラス）のインスタンスを作成することで接続が確立します。
基底クラスは、ベースクラス、スーパークラス、親クラスとも言い、PHPで元々用意されているクラスのことです。

#２つのファイルで実行する場合

**file1.php**
<pre>
// file2.phpを読み込む
require （'file2.php'）;

// file2.php内の関数を使用して接続を確立する
$dbh = 関数();
</pre>

**file2.php**
<pre>
function 関数(){
$dsn = 'mysql:dbname=データベース名;host=ホスト名またはIPアドレス;charset=utf8';
$user = 'ユーザ';
$pass = 'パスワード';
$options = 'PDO属性'

$dbh = new PDO($dsn, $user, $pass, $options);
return $dbh;
}
</pre>
・$dsnのDSNはData Souse Nameの略であり、PHPではデータベース接続指定書式のことです。
・関数内でreturnすると、その関数の実行を停止し、引数を関数の値として返します。
この値をfile1.phpが受け取り、使用することで接続を確立します。
・returnは関数ではなく言語構造なので引数の指定に()は不要です。
<br>

PDO属性は以下のように指定します。

<pre>
$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT,属性2,属性3,);
または
$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT,属性2,属性3,];

// PDO属性を$dbh内の$optionsではなく
$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
</pre>



■参考
・PHPマニュアル(PDO::setAttribute)
PDO属性の詳細が確認できます。
https://www.php.net/manual/ja/pdo.setattribute.php
GASのUrlFetchApp.fetch()関数で、「無効な引数」というエラーが出る場合

## 概要
Google Apps Scriptの**UrlFetchApp.fetch()**関数で、**「無効な引数」**というエラーが出る場合の対処法です。
![スクリーンショット 2019-10-08 18.30.09（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/8a93650b-ba69-1844-939e-523efb4681f3.png)

## 対処法
リクエストのURIを送る際、特殊文字等が入ってることが原因の可能性があります。
URIエンコードをします。

以下はslack APIに投稿のリクエストを投げる場合の例です。

```js
function postSlack(text){
  const token = ‘hoge’
  const channel = ‘fuga’

  response = UrlFetchApp.fetch(
  'https://slack.com/api/chat.postMessage?'
  + 'token=' + token
  + '&channel=' + channel
  + '&text=' + encodeURIComponent(text)); //原因となる部分をエンコードする

  Logger.log(JSON.parse(response.getContentText())); 
}
```

## 参考
[Google apps script urlfetch encoding URL - Stack Overflow](https://stackoverflow.com/questions/12183817/google-apps-script-urlfetch-encoding-url)
【メモ】webpack環境下においてonclickで関数が発火しなかった件

以下はwebpackを使わない環境であれば普通に動きます
eventはデータ取得のために使ってるだけなので本件とは関係ありません

```haml
%ul{onclick: 'hoge(event)'}
  %li ほげ
  %li ひげ
  %li はげ

```

```javascript
function hoge(e){
  console.log(e.target);
};
```

バンドルされないJSファイルを別途用意して、そこに上記関数を書けば動きます。
でもそれではwebpack使ってる意味が無いｗ
逐一イベントリスナー設定したり、JSによって追加されたDOMでJS発火させる時に便利なonclickが使えないのはきつい。
そして悶絶すること数時間。

```javascript
window.hoge = function(e){
  console.log(e.target);
};
```
はい解決！！
@JKL_Prestoさん助かりました！
多謝
UITextView UILabel で Times New Romen が使用される

## 環境
Xcode 11.1
Swift 4.2
iOS13

## 事象
最新の環境で、ビルドするとUITextView UILabelのテキストが、明朝体風の Times New Romen へ変わってしまう問題が発生しました。


![スクリーンショット 2019-10-08 18.05.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15703/0ee004fa-0403-1255-f0e0-55db071971a1.png)

Xib上は、System を指定できている。
<img width="282" alt="スクリーンショット 2019-10-09 1.45.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15703/59cfa496-1752-77a0-cb0e-ea882fdea0b8.png">


期待値では、SFUI-Regularが使用されるはずが、
<img width="283" alt="スクリーンショット 2019-10-09 1.41.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15703/fcc8b423-d9ff-b7ac-c1ec-bd040b4d96c4.png">



Debug View Hierarchy上で確認してみると　Times New Romen というフォントが設定されてしまう。
![スクリーンショット 2019-10-08 17.59.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15703/3681d597-fb7c-c673-81a6-e002c2ad6c92.png)


## 暫定対応
NSAttributedStringを使う方法とFontを再設定する方法があります。
あくまで暫定対応なので、アップデートで治る可能性もあるため、急いで直したい場合は、以下で対応できました。

```swift

let stringAttributes: [NSAttributedStringKey : Any] = [.font : UIFont.systemFont(ofSize: 14.0)]
textView.attributedText = NSAttributedString(string: "text", attributes: stringAttributes)
```

or 

```swift

// customクラスを作成する
class SystemFontTextView: UITextView {
    override var text: String! {
        didSet {
             font = UIFont.systemFont(ofSize: font?.pointSize ?? 14)
        }
    }
}
```

## 参考
[System font renders as Times New Roman in certain contexts](https://openradar.appspot.com/6153065)



####追記:2019/10/08 18:30 現在、iOS 13.1.2
Xcode 11.1でも直らない  

####追記:2020/05/15/ 18:00
CoreTextのログが出るが、使えている

```
[23824:577523] CoreText note: Client requested name ".PingFangSC-Regular", it will get TimesNewRomanPSMT rather than the intended font. All system UI font access should be through proper APIs such as CTFontCreateUIFontForLanguage() or +[UIFont systemFontOfSize:].
```
python pandas plot matplotlib 複数のグラフを一つに



#複数のグラフを一つに表示

##気を付けたこと
・あまりカッコよくないが、「pivot_table」で集計内容を「sum」・「len」で２つ作成
　で、２つのデータを一つのアウトプットにするように調整
　項目を「sum」だけ「len」だけ読み込むなんてことできないかな。。。できそうだよね。。。。

・グリッド線は見づらいので片方だけ表示
<pre>
ax1.grid(True)
ax2.grid(False)
</pre>

・凡例の表示をオフ「legend=False」
・棒グラフの太さを調整「width=0.8」
<pre>
data1_sum.plot(ax=ax1, kind='bar', legend=False, width=0.8, stacked=True)
data1_len.plot(ax=ax2, kind='line', legend=False)
</pre>

・凡例は一緒に表示
・「bbox_to_anchor」で場所をグラフの外に
<pre>
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1, l1, bbox_to_anchor=(1.1,1), loc='upper left',fontsize=10)
</pre>


##コード
※前と同じデータ使ってるけどインデックス名称が変わりやがった。。。
<pre>
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import ticker
from matplotlib import dates as mdates
import numpy as np


df = pd.read_csv(r'インプットファイル', index_col=0).drop(['Company Code','Company Name','Store Code','Store Name','Payment Number','Refund Number'], axis=1)
df_pre = df["Date/Time"].str.split("\"").str[1]
df["Date/Time"] = df_pre.str.split(":").str[0]


 #要素の内容を確認
 #要素一覧
pay_syu = df["Payment Option"]
 #要素をカウント
pay_s  = pay_syu.unique()

 #集計
 #合算(aggfunc→sum)
data1_sum = pd.pivot_table(df, index='Date/Time',  columns='Payment Option',  values='Amount', aggfunc=[sum]).fillna(0)
 #件数(aggfunc→len)
data1_len = pd.pivot_table(df, index='Date/Time',  columns='Payment Option',  values='Amount', aggfunc=[len]).fillna(0)

 #plot
 #区画
fig = plt.figure(figsize=(8,6))
ax1 = fig.add_subplot()
ax2	= ax1.twinx()

 #plot
data1_sum.plot(ax=ax1, kind='bar', legend=False, width=0.8, stacked=True)
data1_len.plot(ax=ax2, kind='line', legend=False)

 #凡例情報取得
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
 #凡例情報結合
ax1.legend(h1, l1, bbox_to_anchor=(1.1,1), loc='upper left',fontsize=10)

ax1.set_title("daily", fontsize=8)
ax1.set_xlabel("day", fontsize=7)
ax1.set_ylabel("money", fontsize=7)
ax2.set_ylabel("count", fontsize=7)

 #grid線　ax1は残してax2は消す
ax1.grid(True)
ax2.grid(False)

 #グラフのグリッドをグラフの本体の下にずらす
ax1.set_axisbelow(True)

 #軸の目盛りの単位を変更する
ax2.yaxis.set_major_formatter(ticker.FormatStrFormatter("%d件"))

plt.savefig(r'アウトプット' ,bbox_inches='tight')

plt.close()
</pre>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395963/a2a68b7c-e67b-e297-d991-7dadfbd2f902.png)

#展望
「Payment Option」要素のユニーク件数をカウント
要素ごとにデータを作成し、グラフを作成。
subplotsで複数表示ってしたい。
Railsチュートリアル 第４章＜復習＞

第４章の復習メモです。
個人的に重要と思ったことを書きます。
調べたことや、知っていたことも含めて書きます。


#ヘルパー
ビューやコントローラ、モデルから呼び出せるメソッド。
以下の二種類がある。

1. 組み込みヘルパー
2. 新しく定義できるカスタムヘルパー

1は、Railsで元々用意されている。
2は、自分で定義でき、以下のファイルに記述する。
　app/helpers/application_helper.rb

※以下のサイトも参考にさせていただきました
https://www.sejuku.net/blog/28563


#文字列の表現
文字列は、シングルクォート（'）またはダブルクォート（"）で囲む。
前者は、囲った物をそのまま表現する。
よって、正規表現（\n等）や、式展開（文字列中に変数を埋め込む）は無効となる。
後者は、両方とも有効。


#引数、カッコの省略
##メソッドにデフォルト引数を設定している場合、引数、カッコを省略できる。

```
# メソッドの定義
def string_message(str = '')   # デフォルト引数として''を設定
 .
 .
end

# 呼び出す側
string_message
```

##最後の引数がハッシュの場合、波カッコを省略できる。

```
# 以下の二つは同じ意味となる
stylesheet_link_tag 'application', { media: 'all',
                                     'data-turbolinks-track': 'reload' }

stylesheet_link_tag 'application', media: 'all',
                                   'data-turbolinks-track': 'reload'
```


#範囲 (range) オブジェクト
`1..10`、`a..z`のように表現する。
to_aメソッドで配列に変換すると、範囲内の値が全て、配列に格納される。


#ブロック
{}で囲むパターンと、do～endで囲むパターンがある。
すいません、文章にできるほど理解できていないので、
リンクを貼らせていただきます・・・
https://www.sejuku.net/blog/14291


#inspectメソッド
対象のリテラル（プログラムに記述するデータ値。コードに書いた値。）を返却する。

```
>> puts (1..5).to_a            # 配列を文字列として出力
1
2
3
4
5
>> puts (1..5).to_a.inspect    # 配列のリテラルを出力
[1, 2, 3, 4, 5]
>> puts :name, :name.inspect
name
:name
>> puts "It worked!", "It worked!".inspect
It worked!
"It worked!"
```

以下を参考にさせていただきました
https://www.sejuku.net/blog/77039
http://www.designmap.info/2016/12/16/javascript-3/#i-2

#クラス、継承
Rubyにおけるすべてのクラスは、最終的にスーパークラスを持たない
**BasicObjectクラス**を継承している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506678/a371543c-f51d-65e3-461b-153ea754f48a.png)
Railsチュートリアル 第３章＜復習＞

第３章の復習メモです。
個人的に重要と思ったことを書きます。
調べたことや、知っていたことも含めて書きます。


#Webページの作成
Railsで、Webページ作成に最低必要なのは、以下の３つ。

1. URLのルーティング
2. 1に対応するコントローラ及び、アクションの作成
3. 2に対応するビューの作成

以下のコマンドを実行すると、上記3つを自動生成してくれる。

```
$ rails generate controller <コントローラ名> <アクション名1> <アクション名2> <アクション名xx>
```

- ルーティングについて
 - config/routes.rbファイルにルーティングが追記される。 
- コントローラについて
 - 慣習的に、コントローラ名はキャメルケース（頭だけ大文字）で記載する。
 - 生成されるコントローラは、スネークケース（単語間を_でつないだ形）になる。 
 - アクション名は全て小文字にする。また、いくつ書いても良い。
- ビューについて
 - コントローラのアクション毎、ビューが生成される。


#切り戻しについて
コマンドを打ち間違えて、変なファイルを作ってしまった場合、
元の状態に戻すためのコマンドが用意されている。

- コントローラを戻す

```
$ rails destroy  controller <モデル名> <アクション名1> <アクション名2>
```

- モデルを戻す

```
$ rails destroy model <モデル名>
```

- DBへの反映を１つ戻す

```
$ rails db:rollback
```

- DBへの反映を全部戻す

```
$ rails db:migrate VERSION=0
```


#テストについて

```
$ rails test
```

で、テストを実行できる。
テストコードは、あらかじめ生成されている物もある。
また、**Guard**を使ってテストを自動化できるみたい。
詳しく理解するのはまたの機会に。


#Gitについて

```
git push origin <ブランチ名>
```

で、GitHub上のブランチにPUSHされる。
GitHubにブランチが存在しない場合、新規作成される。


最低限、３章まではやろうと思っていたので、目標は達成しました。
４章以降についても、できれば続けていきたいと思います。
Django REST Framework APIの"api/"でAttributeError: 'OrderedDict' object has no attribute 'register'になった話

# はじめに

最近Djangoを仕事で使う必要ができたためせっかくだからとDjango REST FrameworkAPIを使おうと思いやり始めた出先でころんだ話。

# 症状

ここの[サイト](https://qiita.com/tomy0610/items/3af2adb83aa3e6eae08e)がわかりやすくて、進んでいたのですが、
`http://localhost:3000/api/`にアクセスした瞬間

<img width="700" alt="500_error.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211139/51d2c7a4-98b3-2868-d6cf-427c8b267a1a.png">

>AttributeError: 'OrderedDict' object has no attribute 'register'

となり画面がエラーになってしまいました。

# 結論
同じようなエラーの[stackoverflow](https://stackoverflow.com/questions/57479412/attributeerror-at-ordereddict-object-has-no-attribute-register-in-django-r
)を発見したので、terminalでmarkdownのバージョンを確認しました。

```
Python 3.6.1 |Anaconda custom (x86_64)| (default, May 11 2017, 13:04:09)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import markdown
>>> print('Markdown module path', markdown.__file__)
Markdown module path /Users/arata.honda/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/markdown/__init__.py
>>> print('Markdown version:', markdown.version)
Markdown version: 2.6.11
>>> ^C
KeyboardInterrupt
>>> exit()
```
と、2.6.11なんですね、ちょっとバージョン上げてみました。

```
arata.honda@hoge:demo_app$ pip install -U markdown
Collecting markdown
  Downloading https://files.pythonhosted.org/packages/c0/4e/fd492e91abdc2d2fcb70ef453064d980688762079397f779758e055f6575/Markdown-3.1.1-py2.py3-none-any.whl (87kB)
     |████████████████████████████████| 92kB 1.7MB/s
Requirement already satisfied, skipping upgrade: setuptools>=36 in /Users/arata.honda/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages (from markdown) (39.0.1)
Installing collected packages: markdown
  Found existing installation: Markdown 2.6.11
    Uninstalling Markdown-2.6.11:
      Successfully uninstalled Markdown-2.6.11
Successfully installed markdown-3.1.1
```

もっかい叩くと動きましたとさ、というクソみたいな話。
補足：python manege.py migrateを一度でも叩いてない場合はdjango_sessionというテーブルを探しに行って絶対にエラーになって見れないです。
FireStoreにデータを投入する時に、値がundefinedのpropertyがあると怒られる

掲題の通り。
undefinedを含むオブジェクトをaddやsetで渡すとエラーを投げる。
fireStoreのNull型に自動変換とかはしてくれないし、
そのプロパティだけ自動で省くといったような気の利いたことはしてくれない。
スキーマレスとは言っても受け入れられないものはある。

typescriptで言うところの

``` typescript
type HOGE = {
  fuga?:someType　
}
```
のようなプロパティがundefined可能性もあるオブジェクトを投入する場合は注意。
(なお、上記の場合fugaプロパティ自体が存在しなければセーフ。
fugaプロパティが存在してかつundefinedが入っているとアウト。)

# 対応策
1. undefinedの場合はフィールドを消す(deleteを使う)
2. undefinedの場合はnullに変換する(nullならfirestoreのNULL型になる)
3. update系の場合なら`firebase.firestore.FieldValue.delete()`に変換する(フィールド自体をfirestore上に残したくない場合)　ただし、create処理で`firebase.firestore.FieldValue.delete()`を使うとこれまたエラーを吐かれるので注意
4. Typescriptを使った上で、そもそもundefinedをpropに持ちうるような型定義をしない
空のディレクトリをgithubに上げる

### 何がしたかったか

結果を保存するディレクトリを空の状態でgithubに上げたかった
>gitは空のディレクトリを管理できない


### 解決法
空のディレクトリに`.gitkeep`を追加する

```bash
touch path_to_dir/.gitkeep
git add path_to_dir/.gitkeep
git commit
git push remote master
```