OmniAICreator/Qiita-1.07M huggingface dataset:
tips:顧客データをPandasで抽出する一例

# 概要
- 顧客データをpandasでデータの前処理を行う場合の一例を示す
- 2018/1-2018/11で新規登録した顧客が、30日以内に商品を購入した割合を算出する

# import
```python:import
import pandas as pd
import numpy as np
import random
import datetime
import time
```

# 顧客データの生成
```python:顧客データの生成
def strTimeProp(start, end, format, prop):
    """Get a time at a proportion of a range of two formatted times.

    start and end should be strings specifying times formated in the
    given format (strftime-style), giving an interval [start, end].
    prop specifies how a proportion of the interval to be taken after
    start.  The returned time will be in the specified format.
    """

    stime = time.mktime(time.strptime(start, format))
    etime = time.mktime(time.strptime(end, format))

    ptime = stime + prop * (etime - stime)

    return time.strftime(format, time.localtime(ptime))


def randomDate(start, end, prop):
    return strTimeProp(start, end, '%Y-%m-%d', prop)

no = 10000
# 顧客データの生成
df_customer = pd.DataFrame({'顧客No':np.arange(0,1000,1),
                           '登録日':[datetime.datetime.strptime(randomDate("2017-11-1", "2019-12-1", random.random()),'%Y-%m-%d') for _ in range(0,1000)]})
# 商品データ
df_item = pd.DataFrame({'顧客No':[random.randrange(0,1000,1) for _ in range(0,no)],
                       '購入日':[datetime.datetime.strptime(randomDate("2017-11-1", "2019-12-1", random.random()),'%Y-%m-%d') for _ in range(0,no)],
                       '商品ID':[random.randrange(1000,2000,1) for _ in range(0,no)]})
```

# 顧客データと商品データのマージ
- 顧客Noで紐づけし、2つのテーブルを統合する

```python:merge
df = pd.merge(df_customer,df_item,on='顧客No')
```

# 条件に合わせて抽出する
- 2018/1-2018/11で新規登録した顧客が、１か月以内に商品を購入した割合を算出する

```python:抽出
# 登録日が2018年1月1日以降に登録 かつ
# 登録日が2018年12月1より以前に登録　かつ
# 登録日+30日より以前に商品を購入　かつ
# 購入日が登録日以降の顧客Noのユニーク数
value1 = df.loc[(df.登録日 >= datetime.datetime(2018,1,1,0,0))
                & (df.登録日 < datetime.datetime(2018,12,1,0,0))
                & (df.購入日 <= df.登録日 + pd.offsets.Day(30))
                & (df.購入日 > df.登録日),'顧客No'].nunique()

# value1を顧客データの全数で除する
ans = # 登録日が2018年1月1日以降に登録 かつ
# 登録日が2018年12月1より以前に登録　かつ
# 登録日+30日より以前に商品を購入　かつ
# 購入日が登録日以降の顧客Noのユニーク数
value1 = df.loc[(df.登録日 >= datetime.datetime(2018,1,1,0,0))
                & (df.登録日 < datetime.datetime(2018,12,1,0,0))
                & (df.購入日 <= df.登録日 + pd.offsets.Day(30))
                & (df.購入日 > df.登録日),'顧客No'].nunique()

# value1を2018-01-01~2018-12-01以前の顧客データで除する
ans = value1 / df_customer.loc[(df.登録日 >= datetime.datetime(2018,1,1,0,0)) & (df.登録日 < datetime.datetime(2018,12,1,0,0)),'顧客No'].count()
```
Java学習メモ（基本 ）

Java Silverの勉強を始めたので、自分の忘備録としてUPします。
ざっくりとしたメモなので、詳細は記載してません。

第１章　Javaの基本 
 
１．クラス宣言に含めることのできるもの 
　・メソッド 
　・フィールド 
　・コンストラクタ（newでクラスを宣言したと同時に実行される関数） 
 
２．３．パッケージ 
　・クラスやインターフェイスをグループ化して分ける仕組み 
　・フォルダでグループ分け 
　・必ずパッケージに属する（指定のないものは「無名パッケージ」のグループとして扱われる→同じ無名パッケージ同士しかアクセスできない） 
　・パケージ名「package　第1階層フォルダ名.第2階層フォルダ名.第3階層フォルダ名;」 
　・ソースコードの先頭行へ記述 
 
　例） 
　Package aaa; 
　Import java.io.*; 
　Public class Sample{ 
　} 
 
４．import宣言 
　Java.langパッケージと同じパッケージのクラスのみimport宣言を省略できる。 
　↓ 
　基本的なクラス（String，System等） 
 
 
　「＊」アスタリスクはそのパッケージに属する全クラスを指す。 
　例） 
　Import java.util.*; 
 
 
５．継承 
　例） 
　Public class Sample{ 
　protected int num = 10; 
　} 
 
　上記Sample classを継承して変数を利用したい場合、 
public（修飾詞）class  派生クラス名 extends 基底クラス名 { }と記述することで継承する。 基底クラス名が利用したいクラス名。 
 
　　　　同じクラス　同じパッケージ　他のパッケージ　違うサブクラス 
Public　　　 ○　　　　　　　○　　　　　　　○　　　　　　　○ 
private　　　 ○　　　　　　　☓　　　　　　　☓　　　　　　　☓ 
protected　　○　　　　　　　○　　　　　　　☓　　　　　　　○ 
なし　　　   　○　　　　　　　○　　　　　　　☓　　　　　　　☓ 
 
６．７．Staticインポート 
　・Static=クラス変数とクラス宣言 
　記述） 
　クラス名.変数名　　 
　クラス名.メソッド名と毎度記述しなくてはならない。 
　↓ 
　Import static ~.クラス名.変数名 
　Import static ~.クラス名.メソッド名 
　上記でインポートすることにより、以後は変数名とメソッド名だけで記述すればよくなる。 
オーバーロードされた同じ名前のメソッドが複数ある場合でも、引数の型や種類で判断するのでインポートの記述は１つでOK。 
 
・クラスの宣言 
　フィールドとメソッドを宣言する。→メンバと呼ぶ。 
 
・オーバーライド 
　サブクラスのメソッドが同じ名前のスーパークラスのメソッドに変わって機能する 
 
　＊Ststicインポートしたクラスに同名の変数があった場合、インポートした変数は無視される。 
 
８．エントリーポイント 
　クラスに複数のメソッドがある場合に、処理を始めるためのメソッドをエントリーポイントと呼ぶ。 
　Javaでの記述方法が決まっている。 
　記述） 
　Public static void main(String[] 引数名){ 
　} 
　・publicで公開されていること 
　・staticでインスタンスを生成しなくても実行できること（オブジェクトと同義語newで呼び出す） 
　・戻り値は戻せない（void） 
　・メソッド名はmainであること 
　・引数はString配列型を１つ受け取ること 
　↓ 
　可変長引数のString型も、コンパイルする際に配列型に直るのでOK。 
　記述） 
　Public static void main(String... 引数名){ 
　}
php-master-changes 2019-03-30

この日は putenv() / getenv() をマルチスレッド環境で安全に使うためのロック追加、PHP_PROG_BISON と PHP_PROG_RE2C のリファクタリングと機能追加、win32 でコードページを扱うコードの微修正、FFI で Windows 用にlong long の扱いの修正、README.GIT-RULES と CONTRIBUTING.md を統合する修正、ドキュメントの更新があった！

# 2019-03-30
## krakjoe: tsrm environment lock
- https://github.com/php/php-src/commit/072eb6dd77b079a6f90ca5b155f9b0add1b5f2d4
- [7.4~]
- putenv() / getenv() をマルチスレッド環境で安全に使うためのロック追加
- setlocale() / mktime() / tzset() あたりの対応はまだ
- [PR:3998](https://github.com/php/php-src/pull/3998)
- 最初マルチプロセス環境での共有とか変なこと考えてて「おわあ」と思ってたけど、無事スレッドのみ前提の妥当なところに落ち着き何より

## petk: Refactor PHP_PROG_BISON and PHP_PROG_RE2C
- https://github.com/php/php-src/commit/3207741df0ac71dc78f8b8c54c4b3a44553208f0
- [7.4~]
- ビルドシステムで、m4 マクロ PHP_PROG_BISON と PHP_PROG_RE2C のリファクタリングと機能追加
- 最少バージョン指定と除外バージョン指定ができるように
- genfiles もなんか直してる（けどあまり見てない）

## weltling: No need for scoping anymore
- https://github.com/php/php-src/commit/83c0f43fc8ed4d161572d2fb968dea93af5491bc
- win32 でコードページを扱うコードのブロック外してるっぽいけど、よく分からず

## weltling: Fix handling and extend ext/ffi/tests/044.phpt
- https://github.com/php/php-src/commit/039500adb615ceddfcf53e375bfb5e4d2c7c31d5
- [7.4~]
- ext/ffi で、Windows 用の long long の扱いを修正

## petk: [ci skip] Mention PHP_PROG_BISON and PHP_PROG_RE2C
- https://github.com/php/php-src/commit/acf0411855f35e0a76f78b95c5b77281363632b8
- [7.4~]
- UPGRADING.INTERNALS で、PHP_PROG_BISON と PHP_PROG_RE2C の修正への言及を追加

## petk: Join README.GIT-RULES and CONTRIBUTING.md
- https://github.com/php/php-src/commit/a8e879c53fa954ff51736eff3f9cdb8e26256337
- [7.4~]
- README.GIT-RULES と CONTRIBUTING.md をがっちゃんこし、よりプロジェクトルートディレクトリをスッキリ化
- あとドキュメント更新ちょっと入れてる
【基本情報技術者試験対策】MIPSに関する問題の解き方

参考サイト:
https://www.fe-siken.com/kakomon/30_aki/q9.html
https://ja.wikipedia.org/wiki/MIPS

#MIPSとは？
million instructions per second) の略。
1秒間に何百万個の命令が実行できるかを表す。

#MIPSに関連した問題
![20190317_CentOS7ダウンロード_046.JPG](https://qiita-image-store.s3.amazonaws.com/0/368574/e9e6ea17-494b-e33d-79a1-8fb9f0c8710a.jpeg)
上記のような問題は、2ステップで解くことができます。
##1. 1命令を実行するのに必要な平均クロック数を求める
表に記載されている３つの命令「レジスタ間演算」「メモリ・レジスタ間演算」「無条件分岐」。
それぞれの命令実行に必要なクロック数と出現率は、表に記載されている通りである。
それらの情報を基に、ある１つの命令を実行するのに必要な平均クロック数を求める。
平均クロック数は、各命令実行に必要なクロック数に出現率を乗じたものを、足し合わせれば求めることができる。
>　(4×0.3)＋(8×0.6)＋(10×0.1)
＝1.2＋4.8＋1.0＝7.0

##2. MIPSを求める
問題文にも記載がある通り、この CPU の動作クロック周波数は 700MHz である。
動作クロック周波数って？って方は、<a href="https://qiita.com/philip_runner/items/7e468947db408f30dd4e">こちら</a>をご参考ください。
「動作クロック周波数」「1命令を実行するのに必要な平均クロック数」、これら２つの情報がある場合は、次のようにして MIPS を求めることができる。
>MIPS = 動作クロック周波数 ÷ 1命令を実行するのに必要な平均クロック周波数

1秒間に発生するクロック周波数を、１つの命令を実行するのに必要なクロック周波数で割れば、答えがでるってだけの話である。
問題に当てはめて式を立てると、次のようになる。
>700×10^6÷7＝100×10^6回
railsチュートリアル1章のときに参考にしたもの

###railsチュートリアル1章を進めるにあたってたどり着いた記事
[Ruby on Rails 第1章 チュートリアル やることリストと学んだこと 第1章](https://qiita.com/nogamin/items/bd2b21c4dd7384b20994)
全体の把握に使いました。

[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~]
(https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
bitbucketについてはこちらを参考にしました。

[SSH接続でgit pushしたときに警告が出るやつへの対処法]
(https://qiita.com/tdrk/items/a0554763c29f60e347b5)
これも見ました。

[Cloud9でHerokuが使えない時の対処法]
(https://qiita.com/bdogrep/items/8620dbba5e4c3fd859df)

```
$ heroku -v
```
と打つと

```
heroku: command not found
```
と出たら４つ目のリンクが参考になると思います。

READMEfileのところはわからなかったのでスキップ。。。

```
heroku login --interactive
```
をお忘れなく


最後に
[Qiita Markdown 書き方 まとめ]
(https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)
これを参考にqiitaの初投稿をしてみました。
ありがとうございます。
UnityのGit管理について2019年の最新情報

## UnityのGit管理について2019年の最新情報
Unityプロジェクトをチームで開発している場合Git管理が必須になってきます。
その時にGUIツールでもあるUnityは、「コミットを見ただけではどの様な変更がコミットされたのか分からない」という状況が発生してしまいます。

2019年現在、この問題は未だに解決されていないようです。自分のローカルで動かして見て変更を確認するしかありません。

「GitHub for Unity」というツールもありますが、簡単なコミット機能を有するだけでファイルの差分をGUIで表示してくれる機能はありません。

本当に困っていますが、これからの進化に期待です。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
MESH GPIOブロックでレジンLEDをLチカする

かわいいレジン型を見つけたので、LEDをコーティング。ソニーMESHのGPIOブロックを使ってLチカしてみました。
![カバー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58993/4968f163-adb5-3a14-e949-b54817e7e500.jpeg)

# 用意するもの
- ソニーMESH GPIOブロック（タグ）、ボタンブロック（タグ）
- ハードタイプのレジン液
- レジン用のシリコン型
- LED（好きな色）
- ラジオペンチ（先が細いものが使いやすい）
- MESHアプリの入ったスマートフォン

# 手順
1. レジンLEDを作る
2. GPIOブロック（タグ）でLチカする
3. レシピを考えよう

# 1. レジンLEDを作る
まずは好きなシリコン型を選び、LEDの配置を考えます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58993/0b8cd389-9654-4384-229b-6dda3a817098.jpeg"  width=50%>

こちらはDAISOのシリコン型です。同じく100円ショップなら、キャン★ドゥにもかわいいものがありました。LEDで光らせることを想像しながら、お好みのものを探してみると楽しいです。

次にラジオペンチでLEDの脚を曲げて、シリコン型に安定させます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58993/a2d0b92e-2142-4cb8-1aa8-552333aced5b.jpeg"  width=50%>

そこにゆっくりレジン液を流し込みます。LEDの下にもきちんと注ぎましょう。またレジン液を流し込むとき、気泡が入らないように注意してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58993/804ad027-a3eb-b90b-eb09-c5b28f1fda22.jpeg"  width=50%>

型の隅々まできれいに流し込めたら、太陽光の下へ。東京都内なら4〜5分ほどで固まります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58993/b966083c-ffd4-b343-ff53-708ba7723a33.jpeg"  width=50%>

しっかり固まったらレジンLEDの完成です。ボタン電池で試しに光らせてみましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58993/be482889-1f5a-7803-4e72-c3e901105f7c.jpeg"  width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58993/110c884d-e708-298b-b64e-b64ce3365c2f.jpeg"  width=50%>

# 2. GPIOブロック（タグ）でLチカする
レジンLEDができたら、次はいよいよGPIOブロックと組み合わせます。GPIOブロックでのLチカはMESHレシピ集の「[LEDを光らせよう！](http://meshprj-recipe.hatenablog.com/entry/gpio_2)」を参考にします。

GPIOブロックのピンにレジンLEDの脚を正しくセットできたら、MESHアプリでレシピを作成します。ボタンブロックを押してLEDを点灯させてみます。
<img width="375" alt="IMG_3489.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58993/e2de6b3f-e2eb-d8f7-c674-e3c6bfb3be3c.png">

今回作ったのは、ボタンブロックを押すと「ハイ、チーズ！」とスピーカーから音声が流れ、カメラ型のレジンLEDが点灯、スマホのカメラがシャッターを切る、というものです。

うまく点灯しました！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58993/f0d12934-58eb-fece-4526-47a13b6bb3c5.jpeg"  width=80%>

# 実際に作るときに気をつけること
このように、レジンを使うといつもと違ったLEDが楽しめるのでおすすめです。ただし、いくつか注意点があるのでまとめます。

## レジン液の取り扱い
今回のやり方ですと直接触ることは少ないですが、結構ベタつくのでビニール手袋などを着用したほうがいいです。またしっかりと固めないと、ずっとベタベタします。固まり具合が心配なときは、市販のUVライトを使う方法もあります。
また気泡が入ると出来栄えが悪くなります。私の場合、レジン液を急いで流しもうとチューブを押してしまい、小さな気泡がたくさん入ってしまいました。その後太陽光に当てると、熱せられるからか大きな気泡ができてしまいました。液を無理に流し込まないなどの忍耐が必要です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58993/c4b05bb5-151d-ec77-7f3d-26c09c8f4d6c.jpeg"  width=80%>

## LEDの向き
好みや作りたいもの次第ですが、LEDの頂点がレジン側を照らすように配置したほうがきれいです。今回2種類のレジンLEDを作りました。カメラの方はLEDが上を向いているため、レジン本体に光が拡散しません。一方、タワーの方ではLEDを下向きにしているため、レジン内部まで光っています。
![MESHワークショップ.003.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58993/5b7a4f68-0145-c1b3-1e44-ae2deba3c0dc.jpeg)

# まとめ
いつかはレジンを使いたいと思いつつなかなか挑戦できずにいたのですが、いざやってみると簡単でした。シンプルなLEDに比べて個性も出せたので満足です。
レジンは太陽光でも固まるので、子ども向けのワークショップで使ってみようと思います。
Leetcode #884: Uncommon words from two sentences

Time complexity: O(M+N), M and N are lengths of A and B respectively
Space complexity: O(M+N)

```swift
func uncommonFromSentences(_ A: String, _ B: String) -> [String] {
    let array = A.components(separatedBy: " ") + B.components(separatedBy: " ")
    var dict = [String: Int]()
    for str in array {
        if let value = dict[str] {
            dict[str] = value + 1
        } else {
            dict[str] = 1
        }
    }
    return dict.keys.filter {dict[$0]! == 1}
}
```
laravelでRESTfulなメソッド,コントローラーをコマンド一発で作成する

#RESTに沿ったメソッドの作成

```shell
$ php artisan make:controller PostController --resource
```
　で、CRUD機能を搭載したRESTfulなメソッドが生成される。
http/controllersに PostController.phpファイルが作成され、

```php:PostController.php
<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
   public function index()
   {
       //
   }

   public function create()
   {
       //
   }

   public function store(Request $request)
   {
       //
   }

   public function show($id)
   {
       //
   }

   public function edit($id)
   {
       //
   }

   public function update(Request $request, $id)
   {
       //
   }

   public function destroy($id)
   {
       //
   }
}

```

作成されたアクションと、それぞれの操作は以下の通り。
![スクリーンショット 2019-04-13 20.21.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/a8352118-1b71-2be4-baeb-5a27d1349a10.png)


#RESTに沿ったルーティング

RESTに沿ったルーティングを作成するには以下をweb.phpに作成する。

```php:web.php
Route::resource('post', 'PostController');
```

Route::resourceは、コントローラー作成の際に「 --resource」をつけて生成された7つのアクションを一括して登録してくれる。

この一行だけでRESTに沿ったルーティングが自動生成される。

そして作成されるルーティングは以下。

![スクリーンショット 2019-04-13 20.32.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/cf95b7e4-d030-14f3-50b2-5d6cb72b4f42.png)

以下のコマンドで実際に確認することができる。



```shell
$ php artisan route:list
```
VB.netで純粋仮想関数


### １．経緯と目的など
基底クラスで定義した関数を、継承先で呼び出す。
その関数の実行順序はある程度枠組みを作りたい。
こういったケースを考えたときに、使えるかもしれません。
例）
途中まで共通で同じ処理を行って、
そのあとの処理は「処理１　→　処理２　→　処理３」の順番で実行してほしい。
ただし、実装内容は継承先にお任せします。
といったケース。（需要あるのかな？）

### ２．サンプル

```vb:Test.vb

Module Module1
#Region "基底クラス"
    MustInherit Class BaseClass

        Public MustOverride Function Proc1() As Boolean
        Public MustOverride Function Proc2() As Boolean
        Public MustOverride Function Proc3() As Boolean

        Private Sub CommonProc1()
            '継承するクラスが共通して実施する処理をここへ記載する。
            Console.Out.WriteLine("何かしらの共通処理１")
        End Sub
        Private Sub CommonProc2()
            Console.Out.WriteLine("何かしらの共通処理２")
        End Sub
        Public Function DoExec() As Boolean
            Me.CommonProc1() ' 基底クラスで定義した処理を実行する関数１
            Me.Proc1()       ' 継承先で実装した処理内容を実行する関数１
            Me.Proc2()       ' 継承先で実装した処理内容を実行する関数２
            Me.Proc3()       ' 継承先で実装した処理内容を実行する関数３
            Me.CommonProc2() ' 基底クラスで定義した処理を実行する関数２
            Return True
        End Function
    End Class
#End Region
#Region "継承クラス"
    Class InheritClass_A
        Inherits BaseClass
        Public Overrides Function Proc1() As Boolean
            Console.Out.WriteLine("Proc1 From [ A ]")
            Return True
        End Function
        Public Overrides Function Proc2() As Boolean
            Console.Out.WriteLine("Proc2 From [ A ]")
            Return True
        End Function
        Public Overrides Function Proc3() As Boolean
            Console.Out.WriteLine("Proc3 From [ A ]")
            Return True
        End Function
    End Class

    Class InheritClass_B
        Inherits BaseClass
        Public Overrides Function Proc1() As Boolean
            Console.Out.WriteLine("Proc1 From [ B ]")
            Return True
        End Function
        Public Overrides Function Proc2() As Boolean
            Console.Out.WriteLine("Proc2 From [ B ]")
            Return True
        End Function
        Public Overrides Function Proc3() As Boolean
            Console.Out.WriteLine("Proc3 From [ B ]")
            Return True
        End Function
    End Class

#End Region

    ' TestProc
    Sub Main()
        Dim _A As New InheritClass_A
        _A.DoExec()
        Dim _B As New InheritClass_B
        _B.DoExec()
    End Sub
End Module
```

### ３．実行結果
```

何かしらの共通処理１
Proc1 From [ A ]
Proc2 From [ A ]
Proc3 From [ A ]
何かしらの共通処理２
何かしらの共通処理１
Proc1 From [ B ]
Proc2 From [ B ]
Proc3 From [ B ]
何かしらの共通処理２
Go で Enum をやるために：String(), FromString() 対応は Stringer よりも Apache Thrift を使うと便利で楽

Example: https://github.com/kazuki-ma/golang-enum-example

TL;DR
=====
* Go に組み込みの Enum は無い。。。 OMG...
* [Apache Thrift](https://ja.wikipedia.org/wiki/Apache_Thrift) 使って生成するとよい。
    * Enum の書き方は[Thrift Missing Guide#Enums](https://diwakergupta.github.io/thrift-missing-guide/#_enums) が詳しい


Example
=========

人間が書く物
---------

```thrift:enum.thrift
enum Gender {
    Unknown = 0,
    Male = 1,
    Female = 2,
}
```

機械生成されたコード
----------

```
thrift --gen go pass_to_thrift_file.thrift
```

```go
// Autogenerated by Thrift Compiler (0.12.0)
// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING

package enum

// 前略

type Gender int64

const (
	Gender_Unknown Gender = 0
	Gender_Male    Gender = 1
	Gender_Female  Gender = 2
)

func (p Gender) String() string {
	switch p {
	case Gender_Unknown:
		return "Unknown"
	case Gender_Male:
		return "Male"
	case Gender_Female:
		return "Female"
	}
	return "<UNSET>"
}

func GenderFromString(s string) (Gender, error) {
	switch s {
	case "Unknown":
		return Gender_Unknown, nil
	case "Male":
		return Gender_Male, nil
	case "Female":
		return Gender_Female, nil
	}
	return Gender(0), fmt.Errorf("not a valid Gender string")
}

func GenderPtr(v Gender) *Gender { return &v }

func (p Gender) MarshalText() ([]byte, error) {
	return []byte(p.String()), nil
}

func (p *Gender) UnmarshalText(text []byte) error {
	q, err := GenderFromString(string(text))
	if err != nil {
		return err
	}
	*p = q
	return nil
}

func (p *Gender) Scan(value interface{}) error {
	v, ok := value.(int64)
	if !ok {
		return errors.New("Scan value is not int64")
	}
	*p = Gender(v)
	return nil
}

func (p *Gender) Value() (driver.Value, error) {
	if p == nil {
		return nil, nil
	}
	return int64(*p), nil
}
```

他の解決法 - Stringer
========

人間が書く物
----------
```go:pill.go
type Pill int

const (
	Placebo Pill = iota
	Aspirin
	Ibuprofen
	Paracetamol
	Acetaminophen = Paracetamol
)
```


機械生成されるコード
----------

```go:pill_string.go
// Code generated by "stringer -type=Pill"; DO NOT EDIT.

package main

import "strconv"

func _() {
	// An "invalid array index" compiler error signifies that the constant values have changed.
	// Re-run the stringer command to generate them again.
	var x [1]struct{}
	_ = x[Placebo-0]
	_ = x[Aspirin-1]
	_ = x[Ibuprofen-2]
	_ = x[Paracetamol-3]
}

const _Pill_name = "PlaceboAspirinIbuprofenParacetamol"

var _Pill_index = [...]uint8{0, 7, 14, 23, 34}

func (i Pill) String() string {
	if i < 0 || i >= Pill(len(_Pill_index)-1) {
		return "Pill(" + strconv.FormatInt(int64(i), 10) + ")"
	}
	return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]
}

```

Stringer との差
======
* Thrift だと `MarshalText`, `UnmarshalText` があるので JSON 対応
* Thrift だと `Scan`, `Value` があるので int64 で DB 定義しておけばそのまま突っ込める（これは微妙かも）
    * go の MySQL Driver って全部 int64 で読むのか？ あんまそこ気にしたことは無い。
        * https://github.com/go-sql-driver/mysql/issues/549#issuecomment-285031918

その他
======
Spring BootでURLごとにファイルアップロードでのファイル最大サイズを制御したい

# 1. やりたいこと

- `spring.servlet.multipart.max-file-size=1MB`みたいなのをURL単位で制御する

# 2. バージョンや条件など

- Java 12
- Spring Boot 2.1.4.RELEASE

# 3. やったこと

- 以下のようなIntercecptorを作成し、MultipartFile#sizeを判定する

```java:MultipartFileInterceptor.java
public class MultipartFileInterceptor extends HandlerInterceptorAdapter {

	private final long maxFileSize;

	public MultipartFileInterceptor(long maxFileSize) {
		this.maxFileSize = maxFileSize;
	}
	
	public MultipartFileInterceptor(String maxFileSize) {
		this(ByteSizeUnit.toBytes(maxFileSize));
	}

	@Override
	public boolean preHandle(HttpServletRequest request,
							 HttpServletResponse response,
							 Object handler) throws Exception {

		if (MultipartRequest.class.isInstance(request) && maxFileSize >= 0) {
			MultipartRequest multipartRequest = MultipartRequest.class.cast(request);

			multipartRequest.getFileMap()
				.values()
				.stream()
				.forEach(f -> {
					if (f.getSize() > maxFileSize) {
						throw new MaxUploadSizeExceededException(maxFileSize);
					}
				});
		}

		return super.preHandle(request, response, handler);
	}
}
```

- 以下のようなWebMvcConfigurerを作成して、Interceptorを制御したいURLに関連付ける

```java:WebMvcConfig
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

	@Value("${app.file.max-file-size:-1}")
	private String fileMaxFileSize;

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new MultipartFileInterceptor(fileMaxFileSize))
			.addPathPatterns("/file");
	}

}
```

- この課題に直接関係はないが、以下のようなクラスを用意することでアプリケーションの設定に`1MB`のように定義することができるようにした

```java:ByteSizeUnit.java
public enum ByteSizeUnit {

	KB {
		@Override
		long toBytes(long size) {
			return size * UNIT_SIZE;
		}
	},
	MB {
		@Override
		long toBytes(long size) {
			return size * UNIT_SIZE * UNIT_SIZE;
		}
	},
	GB {
		@Override
		long toBytes(long size) {
			return size * UNIT_SIZE * UNIT_SIZE * UNIT_SIZE;
		}
	};

	abstract long toBytes(long size);

	static final long UNIT_SIZE = 1024;

	public static long toBytes(String size) {
		if (Objects.isNull(size) || size.isEmpty()) {
			throw new IllegalArgumentException("size must not be empty");
		}

		for (ByteSizeUnit byteSizeUnit : values()) {
			if (size.toUpperCase().endsWith(byteSizeUnit.name())) {
				return byteSizeUnit.toBytes(Long.valueOf(size.substring(0, size.length() - byteSizeUnit.name().length())));
			}
		}

		return Long.valueOf(size);
	}

}
```

# 4. Example

- https://github.com/ShigeoTejima/spring-boot-demo

Spring Bootの設定でできるのあったら教えてほしいです。
おわり。
【Rails】wicked_pdfを用いてpdfファイルを作成する

wicked_pdfを用いてpdfファイルを作成するためのメモ。逐一付け足していきたい。

## gemを導入
Gemfileに以下のように記述。公式リファレンスによると、"wicked_pdf is a wrapper for wkhtmltopdf, you'll need to install that, too."とのことなので、二つのgemが必要になる。

```:Gemfile
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'
```

## 設定ファイルの作成
ターミナル上で以下のコマンドを打ち込んで設定ファイルを作成。

```bash
$ rails generate wicked_pdf
```

## configファイルの設定
configファイルを以下のように設定。公式リファレンスによると、"If your wkhtmltopdf executable is not on your webserver's path, you can configure it in an initializer:"とのことで、wkhtmltopdfに対してpathを通してあげて実行可能な状態にしてあげないといけない。

```ruby:config/initializers/wicked_pdf.rb
WickedPdf.config = {
  :exe_path => "#{Gem.loaded_specs['wkhtmltopdf-binary'].full_gem_path}/bin/wkhtmltopdf"
}
```

## ルーティングの設定
以下のような感じでルーティングを設定。

```ruby
get 'get_pdf', to: 'pdf#get_pdf', format: 'pdf'
```

## コントローラーの設定
コントローラーの設定。

```ruby
def get_pdf
  respond_to do |format|
    format.pdf do
      render pdf:      "pdf-success", # 作成されるファイルの名前を記入
             template: 'path/to/your/template_file' # pdfをして出力したいファイルへのpath
             encoding: 'UTF-8' # 文字コード指定
      end
    end
  end
```

## viewの記入
以下のように記入して"success"と書かれたpdfが表示されたら成功。

```haml:path/to/your/template_file
%h1 success
```

## 参考資料
公式リファレンスは強い。
https://github.com/mileszs/wicked_pdf
Leetcode #953: Verifying an alien dictionary

Time complexity: O(c), where c is the total content of words
Space complexity: O(1)

```swift
func isAlienSorted(_ words: [String], _ order: String) -> Bool {
    var dict = [Character: Int]()
    var index = 0
    for character in order {
        dict[character] = index
        index += 1
    }
    
    for i in 1..<words.count {
        let previousLength = words[i-1].count
        let laterLength = words[i].count
        for j in 0..<min(previousLength, laterLength) {
            let previous = words[i-1][words[i-1].index(words[i-1].startIndex, offsetBy: j)]
            let later = words[i][words[i].index(words[i].startIndex, offsetBy: j)]
            if dict[previous]! > dict[later]! {
                return false
            } else if (dict[previous]! < dict[later]!) {
                break
            } else if previousLength > laterLength {
                return false
            }
        }
    }
    return true
}
```
MacにOpenCV4をインストールする(C++)

# はじめに
MacでC++プログラミングをするときにOpenCVが必要になったので，Homebrewでインストールし，VSCodeでコーディングできる環境を作ったので，そのメモとしての記事です．Pythonを使った記事はたくさんありますが，案外C++の話がなかったので(大して苦労しないからなのでしょうか？)．

前提として，Homebrewやcmakeが既にインストールされていて，C++のHello Worldはコンパイルできる環境が整っているとします．

# 環境
使用した環境は以下の通りです．

- OS: macOS Mojave 10.14.4
- Mac: MacBook Pro 13-inch, Late 2012
- Homebrew 2.1.1

# インストール
Homebrewが入っていれば，以下のコマンドで簡単にOpenCVをインストールすることができます．

```shell
$ brew install opencv
```
これでインストールは完了です．

インストールパッケージをopencvとだけするとその時点でインストール可能な最新版がインストールされます．記事執筆時点では，4.1.0でした．

```shell
$ brew list --versions | grep opencv
opencv 4.1.0_1
```

## 他のバージョンが欲しい場合
OpenCV2やOpenCV3が必要な場合は，

```shell
$ brew install opencv@2
$ brew install opencv@3
```
のようにすればインストールできます．
以下のようにすればインストール可能なバージョンがわかります．
opencvでインストールしたので，

```shell
$ brew search opencv
==> Formulae
opencv ✔  opencv@2  opencv@3
```

# VSCodeの設定
VSCodeではIntelliSenseを使うためにはc_cpp_properties.jsonのincludePathにOpenCVのパスを設定する必要があります．

```json
{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/local/include/opencv4"
            ],
            "defines": [],
            "macFrameworkPath": [],
            "compilerPath": "/usr/local/bin/gcc-8",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x64"
        }
    ],
    "version": 4
}
```

OpenCVを使うときに必ずインクルードする"opencv2/opencv.hpp"は

```shell
/usr/local/Cellar/opencv/4.1.0_1/include/opencv4/opencv2
```
に存在しますが，以下の場所に自動的にシンボリックリンクが張られますので，VSCodeに設定するパスは，こちらの短い方でOKです．

```shell
/usr/local/include/opencv4
```

# テストする
OpenCVがインストールできたので，テストしてみます．CMakeListsは以下のようにしました．

```cmake
cmake_minimum_required(VERSION 3.0)
# コンパイルに必要なソースコードを取得(それぞれの環境に合わせる)
file(GLOB my_src ../src/*.cpp)
# インクルードパスの設定(これもそれぞれの環境に合わせる)
include_directories(../head)
# コンパイラへのオプション
set(CMAKE_CXX_FLAGS "-std=c++0x -O3")
# コンパイル対象コードと出力ファイル名
# 余計なファイルが存在したので修正しました(2019/04/25)
add_executable(main ${my_src})

# OpenCVに必要(Linuxの場合)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(main ${OpenCV_LIBS})
```

試しに，jpeg画像を読み込んで表示するだけのプログラムを実行してみます．

```cpp
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;

int main()
{
    cout << "start" << endl;
    
    cv::Mat img = cv::imread("umbrella.jpg"); //読み込ませたい画像ファイル名
    if(img.empty()) return -1;

    cv::namedWindow("hogehoge", cv::WINDOW_AUTOSIZE); //Windowのタイトルとサイズ設定
    cv::imshow("hogehoge", img);
    cv::waitKey(0);

    cv::destroyAllWindows();
    cout << "Finish" << endl;
}
```

これで画像が表示されればOKです．

## パッケージ不足
インストールしてコンパイルまではできたのですが，実行時に何かライブラリが無いとかでプログラムが動きませんでした．私の場合は，"glog"なるパッケージが足りなかったようなので，やはりhomebrewでインストールしたら動きました．

```shell
$ brew install glog
```

# おわりに
MacでHomebrewを使ってOpenCVをインストールし，C++の簡単なコードを走らせてみました．VSCodeの設定も案外忘れてしまいがちなので，残しておきました．なお，記事執筆時ではOpenCV4がリリースされており，新しい機能を使うことができそうです．

この記事はC++環境のことだけ考慮していますので，Pythonから使う場合については私は全く未確認ですので，他の記事を参照されることをお勧めします．
[ASP.NET Core MVC] サービスコレクション（DIコンテナ）の構成方法 AddMvc/AddMvcCore/AddController/AddControllersWithView の違い

# これはなに？

ASP.Net Coreのサービスコレクション（DIコンテナ）にMVC機能を載せる拡張メソッドはいくつかあります。

* `AddMvcCore`
* `AddControllers`
* `AddControllersWithView`
* `AddMvc`

どう違うのかドキュメントがないので、ソースコードから探ってみます。

__2019年4月__時点の情報です。


# TL;DR

| 拡張メソッド | 解説 |
|:--|:--|
| `AddMvcCore`  | 必要最小限のものを追加  |
| `AddControllers`  | `AddMvcCore` + いろいろ（後述）  |
| `AddControllersWithView`  | `AddControllers` + `AddViews` + `AddRazorViewEngine`  |
| `AddMvc`  | 全部入り `AddControllersWithView` + `AddRazorPages`  |



# ソースコードのありか

ソースコード自体はこちらにあります。

* [AddMvc拡張メソッド](https://github.com/aspnet/AspNetCore/blob/master/src/Mvc/Mvc/src/MvcServiceCollectionExtensions.cs)
* [AddMvcCore拡張メソッド](https://github.com/aspnet/AspNetCore/blob/master/src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreServiceCollectionExtensions.cs)

# `AddControllers`がやっていること

`AddMvcCore`に加えて、以下のことをやっています。

```c#
AddApiExplorer();
AddAuthorization();
AddCors();
AddDataAnnotations();
AddFormatterMappings();
```

なんとなく文字面から想像できるでしょうか。

`AddAuthorization` 認証/認可周りの処理をやってくれそうです。

`AddCors` クロスオリジンな処理をやってくれそうです。

`AddDataAnnotations` モデルの検証（バリデーション）周りをやってくれそうです。

`AddFormatterMapping` URL文字列と、メディアタイプの関連付けをやってくれるようです。

`AddApiExplorer`、、は謎ですね。


# まとめ

なんとなく雑にわかったのでまとめてみます。

* Razorビューを使うひと → 全部入り`AddMvc`を使う
* ビューが不要なひと → `AddControllers`か`AddMvcCore`を使う
* WebAPIのみなひと → `AddControllers`か`AddMvcCore`を使う
ESP-WROOM-02タイマー（定期的処理）

# やりたかったこと
「ESP-WROOM-02を使って，定期的に加速度センサから値を得る」という機能を実装しようと思い，タイマーについて調べてみました．

# 実装（msecタイマー）
msecタイマーの実装に必要最低限なものは以下の通りです．

```C++
#include <Arduino.h>
extern "C" {
  #include "user_interface.h"
}

ETSTimer timer;
int Interval = 5;//タイマーの周期．単位はmsec．

void setup(){
    system_timer_reinit();
    os_timer_setfn(&timer, sample, NULL);
    os_timer_arm(&timer,Interval, true);
}

void loop(){
    yield();
}

void sample(void*){
    //割り込み処理をしたい内容を記述
}

```
上記のようなコードで，msec単位のタイマー割り込みが可能です．

# 実装（μsecタイマー）
ESP-WROOM-02ではμsecタイマーも実装されています．

```C++
#define USE_US_TIMER
#include <Arduino.h>
extern "C" {
  #include "user_interface.h"
  #include "osapi.h"
}

ETSTimer timer;
int Interval = 1000;//タイマーの周期．単位はμsec．

void setup(){
    system_timer_reinit();
    os_timer_setfn(&timer, sample, NULL);
    os_timer_arm_us(&timer,Interval, true);
}

void loop(){
    yield();
}

void sample(void*){
    //割り込み処理をしたい内容を記述
}

```

Espressif Systems社の仕様書によると，最高でも精度は500μsecと記載されています．msecがESP-WROOM-02タイマーの限界と言ってもいいでしょう．
# 注意点

### system_timer_reinit();
必ず初期化を行いましょう．当初はこの行をすっ飛ばして実装していたのですが，微小なラグが蓄積されていってしまいます．

更にμsecでのタイマーを実装する際にこの初期化を忘れると，μsecではなくmsecでタイマー処理されてしまいます．気をつけて下さい．

# まとめ
とりあえずタイマーの実装を行いました．あとは個々人でsample関数の中身を書いてみてください．
jupyterでR

jupyterでRが動かしたいんだけど他の人の記事だとなぜかうまくいかない。

```
https://irkernel.github.io/installation/
チュートリアル
```

他の人の記事で「Rにこんな感じのパッケージを入れたらjupyterでRが動く」
というのを発見

```R
install.packages(c('repr', 'IRdisplay', 'evaluate', 'crayon', 'pbdZMQ', 'devtools', 'uuid', 'digest'))

devtools::install_github('IRkernel/IRkernel')

IRkernel::installspec()
```

install.packagesはできる。

devtools::install_github('IRkernel/IRkernel')で、
**エラー: Git does not seem to be installed on your system.**

エラーメッセージはちゃんと読まないとダメですね
gitが問題

```
https://git-scm.com/downloads
```
ここでgitをDLしてインストールした後動かすと動きました。
残りも実行して、juoyterを開くと

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/a50efe45-8694-0117-19b3-1220fde0eb99.png)

入っていました。
アナグラムを判定する

#　問題を確認する

二つの文字がアナグラムかどうかを判定する

# 思考工程

例えば
listen
silent
はアナグラムです。
文字列の長さが同じかどうかを判定して最初に思い浮かぶのはlistenの最初の文字lをsilentに存在するかどうか判定して、iがsilentにあるかどうか判定して。。。全部の文字がsilentに存在すればアナグラムとなります。
これだとO(n^2)となりもう計算効率が悪くなります

# 改善

アナグラムとは本質的には同じ文字が同じ文字数あればいいので、各文字数をカウントして両者の文字数のカウントが同じになれば良い。
例えば 
listen は l => 1, i => 1, s => 1, t => 1, e => 1, n => 1

silent は s => 1, i => 1, l => 1, e => 1, n => 1, t => 1

となりアナグラムだと判定できます。
listen と strike　はn の数が違うのでアナグラムとはならないです。
ここまで来るとアナグラムはこの方法で解けそうです。

さて計算量はどうなるでしょうか？ 文字数のカウントに必要な計算量が O(N + N)。そこから各文字数のカウントを確認する計算量がO(N) となります。
となって全体ではO(N)となります。最初の計算より効率が良さそうです。
じゃあメモリの使用量はどうなるかというと二つのハッシュマップを用意しないといけないためO(N + N) => O(N) となります。

# 実装

```js
const isAnagram = (str1, str2) => {
    if(str1.length === str2.length) {
        const {str1Count, str2Count} = countLetter(str1, str2)
        return equalObj(str1Count, str2Count)
    } else {
        return false
    }
}
const equalObj = (obj, obj2) => {
    for(const key in obj) {
        if(obj[key] !== obj2[key]) {
            return false 
        }
    }

    return true
}
const countLetter = (str1, str2) => {
    function count(l, obj) {
        if(obj[l] == null) {
            obj[l] = 1
        } else {
            obj[l] += 1
        }
    }
    let str1Count = {}
    let str2Count = {}

    for(let i = 0; i < str1.length; i++) {
        const s1 = str1[i]
        count(str1[i], str1Count)
        count(str2[i], str2Count)
    }

    return {str1Count, str2Count}
}
isAnagram("listen", "strike"))
```

となりアナグラムの問題を解くことができます
Androidで動作するLinux「Maru OS」を、Nexus 5にインストールしてみた

はじめに
---

ちょうどNexus 5が空いたので、何か楽しいことできないかな、と思って見つけたのが下記記事。試しに[Maru OS](https://maruos.com/)をインストールしてみました。

[gihyo.jp - Androidで動作するLinux「Maru OS 0.6.6」がリリース](https://gihyo.jp/lifestyle/clip/01/awt/201903/14)

見ればわかるできること
---

商品コンセプトは**Use your phone as your PC.**
詳しくは[Maru OS](https://maruos.com/)を見てください。

|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63318/9571af1b-1908-f382-02fc-37dd7ab971cc.jpeg">|
|:--:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63318/63040b69-7e15-47d6-88df-843434e61a17.jpeg">|||

ハードウェア環境
---

- モニタはWi-Fi経由で、ChromeCastが接続されているHDMIモニタを利用します。

- キーボードとマウスは、Android互換Bluetooth対応のものをペアリングして利用します。

ROM焼き
---

他のカスタムROM同様、[TWRP](https://twrp.me/lg/lgnexus5.html)でWipeした後、[Maru OS](https://maruos.com/downloads/)と[Open GApps](https://opengapps.org/)を焼きます。
root化は[TWRP](https://twrp.me/lg/lgnexus5.html)で[SuperSU.zip](http://www.supersu.com/download)を焼いてシステムを立ち上げた後、Google Playストアから[SuperSU](https://play.google.com/store/apps/details?id=eu.chainfire.supersu&hl=ja)をダウンロードすればできます。


ChromeCastへのキャスト
---

**設定**で目新しい項目が追加されています。**キャスト**するだけでChromeCastのモニタにMaru Desktopが表示されます。

|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63318/5e33288b-b477-e8d7-ac52-b4f1477287c6.png">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63318/ab8ea22a-035a-db36-fe29-b58b8d075490.png">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63318/963d5837-ccfa-f2f9-cae7-a65e96c08f1a.png">|
|:--:|:--:|:--:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63318/825f22be-2168-3e91-0c95-1a03baceae40.png">|||

Bluetoothキーボード・マウスの接続
---

普通にペアリング設定します。私はどちらも持っていないので動作未確認ですが。

おわりに
---

**Maru OS**を応用すれば何か楽しいことができる予感がします。
それにしてもNexus 5はいろいろと使い勝手がいいスマホですね。(=^・^=)
Dart private public

# Dart pulic private
Dart言語において、Javaのようなpublicやprivateなどでメンバのアクセスを制御する文法はない。
Dart言語では、変数名にアンダースコア(_)をつけるかどうかでアクセスを制御する。

```dart
class Sample {
   // public変数
   String a = "";
   // private変数
   String _a = "";
}
```

慣れればわかりやすいので、何回も書くことが重要。
そして、しっかりとアンダースコアを使い分けて、見やすいプログラム構造を意識することが重要。
TextFieldのキーボードを表示させない方法

#はじめに
TextFieldの入力をbuttonなどで行いたいと思った時に、標準キーボードが邪魔なので表示させない方法を調べました。

#方法１
```swift
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    return false
}
```
でも、この方法だとタッチイベントが使用できなくなっちゃいます。

#方法２
```swift
let textField = UITextField()
let dummyView = UIView()

textField.inputView = dummyView
```
TextFieldのinputViewをダミーのViewに設定すればタッチイベントも使用できる状態で、標準キーボードが見えなくなります。
「すべてのプログラマーはC言語を学習すべき」かどうかを脳科学的に考えてみる

自分の状況を簡単に説明します。
自分は未経験からエンジニアになり、業務経験は半年ほどです。
業務ではRubyを書きつつ、
・C言語の技術書を２冊半ほど写経（『苦しんで覚えるC言語』『新・明解C言語 中級編』『C言語で学ぶアルゴリズムとデータ構造（途中）』）
　↓
・swiftの学習
と進んできています

よく話題になるテーマだと思うのですが、自分なりの切り口で書いてみようと思います。
「そんな未熟者が偉そうに…」と思われた方、すみません汗
適当に読み飛ばしてください。

自分の考えは、
###「必要でない場合が多いけど、できるならやっておいた方がいい。」
です。

理由は「**参照情報が増えるから**」です。

参照情報とは簡単にいうと記憶のことです。
例えば、
①今まで行ったことのない店に行く
②何度か通りかかったことがある店に初めて行く
③行きつけの店に行く
の3つを難しい順に並べるとどういう順番になるでしょうか？

いうまでもなく① > ② > ③の順で難しいです。

これらの違いは「**道順をどの程度記憶しているか**」に起因しています。
同じもしくは似た記憶が少しでもある方がやり易く、またその記憶も鮮明であるほど行うのが容易になっていきます。
自分たちが何かを理解しようとするとき、すでに持っている記憶や経験と照らし合わせて分かろうとします。
その意味で記憶＝参照情報です。
なので**その事柄に関する記憶、もしくは似た体験の記憶があるほど理解と行動が容易**になります。

プログラミングに話を戻すと、
C言語には他の言語では考えなくてもいい部分を考える必要があります。
他の言語では自動でやってくれる部分を手動で操作するようにできています。

自動車でいうと、オートマ車でもマニュアル車と同じくギアの切り替えはしていますよね。
ただその部分を自動車がやってくれるので運転手が意識する必要がなくなっているだけです。
それと同じことなんですよね。

逆に言えば、**考えることが多いC言語を学習することで、プログラミングに関する豊富な参照情報を得ることができます**。
その結果、**コードを読んで理解するスピードが速くなったり、新しい言語を習得するのが簡単になったり**します。

業務や独学の中で「ああC言語でいうとあれのことね」「これってC言語の構造体と似てるな」と記憶と紐づく場面が何度もあります。

ですので自分の結論は、
「**必要でない場合が多いけど、参照情報を増やすためにC言語を学習した方がいい**」
です。



###参考図書
小沼勢矢『自分の脳に合った勉強法』
https://www.amazon.co.jp/%E8%87%AA%E5%88%86%E3%81%AE%E8%84%B3%E3%81%AB%E5%90%88%E3%81%A3%E3%81%9F%E5%8B%89%E5%BC%B7%E6%B3%95-%E5%B0%8F%E6%B2%BC%E5%8B%A2%E7%9F%A2/dp/4894517906
jupyterのpython 3.7を3.6にする


jupyterのバージョンを変える方法は2.7にする方法などで紹介されていますが、今回3.6にしたのでメモ。

```
activate #3.6が入っているバージョンの環境名
#切り替わったことを確認
pip install ipykernel
python -m ipykernel install --user
jupyter kernelspec list
#ここで確認してもpython 3が入っているとしか言われない。。。
```

jupyterを起動してバージョンを確認してみる

```python
import sys
sys.version
#'3.6.8 |Anaconda, Inc.|
```
3.6.8になっています。
3.6じゃないとうまく走らないスクリプトも走るようになりました。
問題解決です。
terminalコマンドメモ(カーソル系)

自分用にメモ

# 行頭に移動
```
Ctrl + a
```
カーソルの現在位置を行頭に移動します。長いコマンドで行頭でミスったときに便利です。

# 行末に移動
```
Ctrl + e
```
カーソルの現在位置を行末に移動します。行頭で文字を修正後に行末に戻るときに便利です。

# 行頭まで削除する
```
Ctrl + u
```
カーソルの現在位置から行頭までを削除します。

# 行末まで削除
```
Ctrl + k
```
カーソルの現在位置から行末までを削除します。

# ワード単位で行頭方向の文字列を削除
```
Ctrl + w
```
カーソルの現在位置からワード単位で文字列を削除します。スペースが空いていれば単語とみなされるので単語単位で修正したい場合には便利です。

# コマンド履歴の検索
```
Ctrl + r
```
過去に入力したコマンドを探します。もっと早くこのコマンドに出会いたかった…

- +[文字列]：部分一致で候補を表示
- +[Enterを押す]：表示されているコマンドを実行
- +[Escを押す]コマンドが入力された状況で通常画面に戻る
create-react-appコマンドを利用して、reactをインストールする方法

## 1.Node.jsをインストールする
まずはnode.jsがインストールされているか確認してください。

```shell
$ node -v
```

バージョンが出ればOK！
node.jsをインストールしていない人は下記の記事を参考にしてインストールしてください

[Node.jsのインストール](https://qiita.com/mk185/items/7ad004bf202f400daea1)

## 2.npmをインストールする

Node.jsがインストールできたら、npmをインストールをする。

```shell
$ npm -v
```

バージョンが出れば、ちゃんとnpmがインストールされています。
インストールされていない人は先程の記事を参考にnpmをインストールしてみてください！！
[npmのインストール](https://qiita.com/mk185/items/7ad004bf202f400daea1)

## 3.create-react-appコマンドを使えるようにする

```shell
$ npm install -g create-react-app
```

もし、permission deniedというエラーが出た方は下記のコマンドを実行してください！！

```shell
$ sudo npm install -g create-react-app
```

## 4.create-react-appコマンドでアプリ作成

```shell
$ create-react-app 任意のアプリケーション名
```

もし、permission deniedというエラーが出た方は先程と同様sudoを前につけて実行してください。

## 5.サーバーを立ち上げる
```shell
$ cd 任意のアプリケーション名
$ npm start
```

http://localhost:3000 にアクセスする。

![スクリーンショット 2019-04-20 22.21.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328873/6b76e21c-b6dc-e79e-72a3-0b3e3b207b3d.png)

できた！！
CORSを前提とした認証ありのRESTはリクエストメソッドOPTIONSを提供する必要がある

## はじめに
この投稿はメモ的なものです。
実装コードは出てきません。

## 先に結論
題名通り。
backendとfrontendを別ドメインで構築することを想定した場合(だけじゃないけども)、CROSの設定+HTTPメソッドのOPTIONSを提供しなければAPIコールに失敗する。
理由はここ
https://developer.mozilla.org/ja/docs/Web/HTTP/CORS#Functional_overview

## 背景など
- backendはDjangoのRest framework
- frontendはVue+axios
- backendとfrontendは別ドメイン
    - 開発環境的には、backendはDockerコンテナ、frontendはホスト
- CROS設定は以下のようなところを参考にとりあえず全ブッコ
    - https://qiita.com/MuuKojima/items/334f9d59e7ba6fc75987
    - https://qiita.com/hirohero/items/886733f50f37404235db
    - https://qiita.com/Masa_Kado/items/a3af4c21be3c987ab942

## 発生した現象

- CROSオリジンのエラーが発生
    - ここら辺のエラーが発生
    https://qiita.com/hirohero/items/886733f50f37404235db

## ハマりどころ

- 同一ドメインの場合は、OPTIONSを提供しなくてもAPIコールが成功する
    - 少なくともchromeでは
- 正しくOPTIONSを提供できていない(Django内でOPTIONS実行エラーになる)場合でも、Django上ではそのようなエラーは出ない
    - chromeでもOPTIONSは成功し、CROSオリジンでエラーした旨のログが出ていた

## 〆
設定をググるのも良いが、ドキュメントも大事
CROS設定してもうまくいかない人はここら辺も確認してみるのも良いかもしれません
Accessフォームでタブコントロールのタブを非表示に出来ちゃった

#なんでこの記事が必要なのか
Accessのフォームにタブコントロールを設置して、個々のタブ（Access用語におけるページ）をメニュー選択により表示したり、非表示にしたりするのを、VBAでやりたいと思いました。

イメージとしては、フォームの上部にメニュー、下部にタブコントロールがあって、メニューを選ぶとタブコントロールに必要なタブだけが表示される。選んだメニューによって表示されるタブが違う。

ということで、タブコントロール内の個々のページの表示・非表示についてさっそくggってみたのですが、removeメソッドを使え、という古い記事ばかりヒットする。タブを一度削除してしまって、再表示するときは生成するってことですね。
ええー流石にそんなわけないだろうと思って、手探りでトライアンドエラーしていたらやり方がわかったので、記念にここに記するわけであります。
（※補足しておくと、Accessの古いバージョンでは、この方法ができなかったんだと思う。古いAccessなど手元にないのでわかりませんが、先人の誰も試していないとは思えないので。ちなみに私はOffice 365のAccessを使用しています。今どきAccess使ってる人どんだけいるのかな…）

#で、どうやったら出来たのか
```VBScript
Me![タブコントロールの名前].Pages(0).Visible = True
Me![タブコントロールの名前].Pages(1).Visible = False
```

タブコントロールの名前は、タブ群全体の名前ね（各ページの名前ではなく）。

Pages()のカッコの中の数字は、ページインデックスが入ります。
それ何？って人は、フォームをデザインビューで開いて、タブコントロールの中の一つのタブを選択すると、右側のプロパティウィンドウに「ページインデックス　0」とか書いてあるところがあるので、そこの数字をチェックしてください。
というか、タブの並びを、左から数えた順番（ゼロ始まり）だと思います。

Visible = True だと表示する。
Visible = False だと非表示にする。
上記の例ではページインデックスが0のページを表示、1のページを非表示。です。

#気になってる点
上述の通り、ページインデックス＝ページの並び順っぽい。
後から並び順変えたくなったり、途中にページを追加したりしたとき、既存のページとインデックスの数字の対応が変わっちゃうんですが、その度にコード書き換えるのやだな…って思いますよね…

対処としてはPages()の中身は変数にしておいて、変数の中身はタブページの名称からページインデックスを照会してあてはめる。とかで対処できるのかとは思いますが、試してないのでできるかどうかはわかりません（※追記参照）。
###追記
やり方わかりました。

```VBScript
Me![タブコントロールの名前].Pages("ページ1").Visible = True
Me![タブコントロールの名前].Pages("ページ2").Visible = False
```
先ほどの例でページインデックスを書いてたところに、ページの名前をダブルクォートで囲って記述すればOKのようです。
注意事項として、ページインデックス0のページの名前のデフォルトが「ページ1」、ページインデックス1のページが「ページ2」なんで一瞬お？ってなったんですけど、いい子のみなさんは適切に命名しましょうね。

以上、お粗末様でした。誰かの役に立つといいんですけどね。
QRコードリーダーをOpenCVとTkinterで作る

USB接続のカメラを使ってQRコードリーダーを作ります。


##環境とモジュール

Python3.6以上、Windows10、市販のUSBカメラ

OpenCV、PIL、pyzbar　（別途インストールが必要）

##参考にした記事

カメラでQRコードを読み取る方法(Python)

[Picameraを使ってQRコードを認識させよう](https://camp.isaax.io/ja/examples/recognize_qrcode_with_picamera)

[QRコードを読み取るPythonスクリプト](https://github.com/glatan/QRreader)

tkinter canvasの使い方

[Canvasを使ってみる。](https://www.pytry3g.com/entry/2018/02/09/124143)

##Pythonコード

```python
"""
OpenCVの動画取得機能を利用し、TkのCanvasに描画して、QRコードを認識させるプログラム

"""
from datetime import datetime
from time import sleep
import tkinter

import cv2
from PIL import Image, ImageTk
from pyzbar import pyzbar

root = tkinter.Tk()
root.title("QR reader")
root.geometry("640x480")
CANVAS_X = 640
CANVAS_Y = 480
# Canvas作成
canvas = tkinter.Canvas(root, width=CANVAS_X, height=CANVAS_Y)
canvas.pack()


# VideoCaptureの引数にカメラ番号を入れる。
# デフォルトでは0、ノートPCの内臓Webカメラは0、別にUSBカメラを接続した場合は1を入れる。
cap = cv2.VideoCapture(0)


def show_frame():
    global CANVAS_X, CANVAS_Y

    ret, frame = cap.read()
    if ret == False:
        print('カメラから画像を取得できませんでした')

    image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)  # BGRなのでRGBに変換
    image_pil = Image.fromarray(image_rgb)  # RGBからPILフォーマットへ変換
    image_tk = ImageTk.PhotoImage(image_pil)  # ImageTkフォーマットへ変換
    # image_tkがどこからも参照されないとすぐ破棄される。
    # そのために下のようにインスタンスを作っておくかグローバル変数にしておく
    canvas.image_tk = image_tk
    # global image_tk

    # ImageTk 画像配置　画像の中心が指定した座標x,yになる
    canvas.create_image(CANVAS_X / 2, CANVAS_Y / 2, image=image_tk)
    # Canvasに現在の日時を表示
    now_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    canvas.create_text(CANVAS_X / 2, 30, text=now_time, font=("Helvetica", 18, "bold"))

    # 画像からQRコードを読み取る
    decoded_objs = pyzbar.decode(frame)

    # pyzbar.decode(frame)の返値
    # ('Decoded', ['data', 'type', 'rect', 'polygon'])
    # [0][0]->.data, [0][1]->.type, [0][2]->rect, [0][3]->polygon

    # 配列要素がある場合
    if decoded_objs != []:
        # [0][0]->.data, [0][1]->.type, [0][2]->rect
        # example
        # for obj in decoded_objs:
        #     print('Type: ', obj.type)

        str_dec_obj = decoded_objs[0][0].decode('utf-8', 'ignore')
        print('QR cord: {}'.format(str_dec_obj))
        left, top, width, height = decoded_objs[0][2]
        # 取得したQRコードの範囲を描画
        canvas.create_rectangle(left, top, left + width, top + height, outline="green", width=5)
        # 取得したQRの内容を表示
        canvas.create_text(left + (width / 2), top - 30, text=str_dec_obj, font=("Helvetica", 20, "bold"))

        # QRコードを取得して、その内容をTextに書き出し、そのままTKのプログラムを終了するコード
        # with open('QR_read_data.txt', 'w') as exportFile:
        #    exportFile.write(str_dec_obj)
        # sleep(1)
        # cap.release()
        # root.quit()

    # 10msごとにこの関数を呼び出す
    canvas.after(10, show_frame)

show_frame()
root.mainloop()
```
Firebase Cloud Functionsの定期実行が、それ単体で簡単にできるようになった！

以前、Firebase Functionsを定期実行するには、Googleの他のクラウドサービスや外部サービスと連携する必要がありました。

さて、

* firebase-functions NodeJS モジュールバージョン : 2.3.0
* Firebase CLIバージョン : 6.7.0

を使うことで、Firebase Functions中の設定・実装のみで、Firebase Functionsの定期実行が行えるようになりました。（これらは、2019年4月時点では利用可能です。）

* Firebase公式ブログ : 「[Scheduling Cloud Functions for Firebase (cron)](https://firebase.googleblog.com/2019/04/schedule-cloud-functions-firebase-cron.html)」（2019年4月18日）
* Firebase公式ドキュメント : 「[Schedule functions](https://firebase.google.com/docs/functions/schedule-functions)」

---

以下に、公式ドキュメントを参考に試したこと、確認した事項をまとめます。最新のドキュメントを確認してください。

* 従量課金プランである「[Blaze Plan](https://firebase.google.com/pricing/)」が必要
* 内部的には、[Google Cloud Pub/Sub](https://cloud.google.com/pubsub/)と[Google Cloud Scheduler](https://cloud.google.com/scheduler/)を利用
* そのためFirebaseプロジェクトが↑の機能が有効である必要がある
* [Google Cloud Scheduler](https://cloud.google.com/scheduler/)は[2018年11月に正式リリースされた](https://cloud.google.com/blog/products/application-development/announcing-cloud-scheduler-a-modern-managed-cron-service-for-automated-batch-jobs)新しいサービス
* [Google Cloud Pub/Sub](https://cloud.google.com/pubsub/)とFirebase Functionsの連携は以前からサポートしていた。
* デプロイすると自動的に↓ができる。これらはGoogle Cloud Consoleから確認できる。
   * Google Cloud Scheduler
   * Google Cloud Pub/Sub
* 「Unix Crontab」と「AppEngine cron.yaml syntax」という形式で定期実行のタイミングを指定。（AppEngine cron.yaml syntaxは[こちら](https://cloud.google.com/appengine/docs/standard/python/config/cronref#schedule_format)を参照）
* 該当のFirebase Functionsの関数を消すと、それと連動するCloud SchedulerとCloud Pub/Subも消えた（投稿者が記事執筆時に確認した挙動）

---

この機能追加、非常に嬉しく思います。

以前もGoogleの他のクラウドサービスや外部サービスと連携することで、Firebase Functionsの定期実行は可能でした。可能ではありましたが、Firebase Functions以外にも把握・実装・管理することが増え、面倒でした。（私もGoogle Cloud Pub/Subなど慣れていないクラウドサービス使い、四苦八苦しながらFirebase Functionsの定期実行を実装した覚えがあります。）

この機能追加により、ゲーム開発者/モバイル開発者/ウェブフロント開発者にとって、（表向きはとりあえず）Firebase Functionsを利用するだけで、定期実行処理が利用できるようになりました。（内部的には、Google Cloud SchedulerとGoogle Cloud Pub/Subを使っているので、把握していた方がベターではありますが。）

趣味開発や少人数でのプロトタイプ開発に、心強い味方になるのではないでしょうか？
Gitコマンドの備忘録

# Gitコマンドの備忘録
## 概要
- gitコマンドをよく忘れるので。。。整理しました。

## 参考資料
- [GitHub実践入門](https://gihyo.jp/book/2014/978-4-7741-6366-6)

## コマンドたち
### GitHubにリポジトリ作成

### gitリポジトリの初期化
```console
$ cd [gitリポジトリにしたいディレクトリ]
$ git init
```
- .gitディレクトリが作成されればOK

### ステージ領域にファイルを追加
```console
$ git add [対象ファイル] 
```

### リポジトリの状態確認
```console
$ git status
```
- gitリポジトリの状態を確認できる。
- gitリポジトリに登録されていないファイルは「Untracked files:」に表示される。
- gitリポジトリに登録さらたファイルは「Changes to be committed:」に表示される。

### リポジトリの履歴を記録
```console
$ git commit -m "コメント"
[master (root-commit) 325b742] first commit
 1 file changed, 152 insertions(+)
 create mode 100755 .zshrc
```

### リモートリポジトリを登録
```console
$ git remote add origin git@github.com:[ユーザ名]/[リポジトリ].git
```

### リモートリポジトリへ送信
```console
$ git push -u origin master
Enter passphrase for key '/Users/XXXXXXXX/.ssh/id_rsa_github':
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 2.25 KiB | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:[ユーザ名]/[リポジトリ].git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
```

### 全てのブランチの確認
```console
$ git branch -a
```

### 現在のブランチの確認
```console
$ git branch
```

### ブランチの作成
```console
$ git branch [ブランチ名]
```

### ブランチを変更する
```console
$ git checkout [ブランチ名]
```
【Unity】コンポーネントの初期化にAwakeを使うか自作メソッドを使うかで例外発生時の止まり方が違う

Instantiateなどで生成したコンポーネントを、その場ですぐに初期化する場合、大きく分けて2つの方法があると思います。

1. Awake() のように、**Unityのメッセージ**で初期化する
2. Init() のように、**メソッド**を呼んで初期化する

どちらにもそれぞれのメリットがあります。
例えばAwakeはいつ呼ばれるのか単純明快ですし、生成側とコンポーネントが依存しない造りにできます。
一方メソッドを作るのなら引数を自由に変えられますし、Unity独特の仕様に依存しない造りにできます。
パフォーマンスも、InstantiateやAddComponentそれそのものに比べたら差はないも同然です。

というわけで、引数もなくて同じ所で呼ぶなら、様式以外は大差ない――

――と思っていました。

#サンプル
その違いは**例外処理**にありました。
次の2つのコードは、上で説明した2パターンを再現したものの組み合わせです。

##パターン1（Awakeで初期化）
```cs:Manager.cs
public class Manager : MonoBehaviour {
	// ゲーム開始時にキャラクターを生成する
	void Awake() {
		Debug.Log("パターン1（Awakeで初期化）");

		var gameCharacter = new GameObject("GameCharacter");
		gameCharacter.AddComponent<GameCharacter>();

		Debug.Log("Game Start!");
	}
}
```
```cs:GameCharacter.cs
public class GameCharacter : MonoBehaviour {
	// だがそいつは初期化時にエラーを起こしてしまう死のキャラクターだった！
	void Awake() {
		Debug.Log("Initializing GameCharacter");
		throw new System.Exception("GameCharacter: Initialization failed");
	}
}
```

##パターン2（Initメソッドで初期化）
```cs:Manager.cs
public class Manager : MonoBehaviour {
	// ゲーム開始時にキャラクターを生成する
	void Awake() {
		Debug.Log("パターン2（Initメソッドで初期化）");

		var gameCharacter = new GameObject("GameCharacter");
		gameCharacter.AddComponent<GameCharacter>().Init();

		Debug.Log("Game Start!");
	}
```
```cs:GameCharacter.cs
public class GameCharacter : MonoBehaviour {
	// だがそいつは初期化時にエラーを起こしてしまう死のキャラクターだった！
	public void Init() {
		Debug.Log("Initializing GameCharacter");
		throw new System.Exception("GameCharacter: Initialization failed");
	}
}
```

##結果
![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375327/45ff9cfb-67ff-9e11-2036-5e83710e7e00.png)
Managerを配置すると、**1ではGame Startに到達していますが、2では到達しませんでした。**

#検証
C#の仕様上は、2のような挙動をするはずです。
つまりは「1は例外が起きたはずなのに止まっていない」ということです。
きっとUnityが**Awakeを呼ぶとき何かしている**に違いありません。
例ではAddComponentですが、もちろんInstantiate中に呼ばれるAwakeでも同じです。

試しにtryで囲ってみました。この他の部分はさっきと同じです。

```cs
// パターン1 + try-catch
try {
	var gameCharacter = new GameObject("GameCharacter");
	gameCharacter.AddComponent<GameCharacter>();
} catch {
	Debug.LogWarning("キャラクター生成できなかったけどいいよね？");
}
```
```cs
// パターン2 + try-catch
try {
	var gameCharacter = new GameObject("GameCharacter");
	gameCharacter.AddComponent<GameCharacter>().Init();
} catch {
	Debug.LogWarning("キャラクター生成できなかったけどいいよね？");
}
```
![pic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375327/0fca1560-5563-0c29-621a-83262c5f5bdf.png)
なんと前者は**例外をキャッチできません。**囲ってない状態と全く同じです。
別に、初期化が遅れて実行されているわけではないということは、ログからもスタックトレースからもわかりますが……。

これは「**全てのメッセージは最初からtry-catchで囲まれている**」ということか、もしくは同様の何かでしょう。

#まとめ
- Unity上のC#の例外処理は、Unityがメッセージ呼び出しをするたびに区切られます。
- **スクリプトの途中でメッセージが呼ばれる場合、メッセージから奥で例外が起きても、手前の処理は止まらずに続行します。**

プログラムを書くときにはわざわざ例外が起きたときの止まり方まで意識はしないでしょうが、もしリリースビルドで明らかに例外が起きているっぽい状態に出くわしたら、何が動いていて何が止まったかから原因を特定するような時には役立つ知識かもしれません。

それにしても、UpdateのようにPlayerLoopから呼ばれるメッセージは当然こういう仕組みなんだろうとは思っていましたが、Awakeなどが途中で呼び出される場合でも同じというのは意外でした。