OmniAICreator/Qiita-1.07M huggingface dataset:
Google Earth Engineでオーストラリア火災

#概要

Google Earth Engineで、オーストラリア火災を探してみた。

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/27ec8289-8e22-010a-d47b-a89f9288cbab.jpeg)



#サンプルコード


```
var po = ee.Geometry.Point(137.50, -35.793);
Map.centerObject(po, 9);
var image = ee.ImageCollection('COPERNICUS/S2').filterBounds(po.buffer(20000)).filterDate('2019-12-31', '2020-01-04');
Map.addLayer(image.first(), {
	bands: ['B12', 'B8', 'B5'],
	max: 4400
}, 'fire');
```


以上。
SQLのLIMIT句によるデータ抽出を、pandas(python)を使って再現して見た

#はじめに
　最近、プライベートでデータ分析のツールを作成している関係でpandasというpython外部ライブラリを活用している。が、いざ使って見ると、「pandas?なにそれかわいいの？」と動物のパンダ🐼を連想させるヤバい思考に行きつつある状況になる。
　これはまずいと感じ、投稿者はpandasを探し求める旅に出る。
　この記事は、pandasを飼いならすために<b>pandasをSQLっぽく考えるというデータサイエンス初学者に向けた記事となります。</b>

#そもそもpandasとは何か
　pandasとは、構造化された（表形式、多次元、潜在的に不均質）データと時系列データを簡単かつ直感的に操作できるように設計された高速で柔軟な表現力のあるデータ構造を提供するPythonパッケージで、実際的な実世界のデータ分析を行うための基本的な高レベルのビルドを行う事が可能なツールです。
　<b>要は、表データをpythonを使っていい感じに処理して目的のデータ抽出するツールです。</b>

#実践
###準備
今回は下記の表データ【receipt】を用いてpythonのpandas攻略を行います。（表データはCSV形式）

![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/8ab25deb-8863-9255-b0f5-5c0b627e8128.png)

参考データ：データサイエンス100本ノック
https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess

また、今回はpandasを使用するため、コードは下記のように予め準備しておきます。

```python:python
import pandas as pd
df_receipt = pd.read_csv('receiptのCSVファイルのパス', sep=',')
```

###本題
タイトルにある通り、今回はSQLのLIMIT句によるデータ抽出を、pandasを使って再現します
<br>
問題：<b>レシート明細のデータフレーム（df_receipt）から全項目の先頭10件を表示し、どのようなデータを保有しているか目視で確認せよ。</b>
<br>


###解答・解説

まず、解答を記述するとこんな感じになります。

```python:python
df_receipt.head(10)
```

そして、図に表すとこんな感じになります。

![1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/8f1f524f-7171-3c8b-0466-861c8139aec4.png)

これをSQL文で表すとこんな感じになります。

```SQL:SQL
SELECT * FROM receipt LIMIT 10;
```
この部分を説明すると、receipt表から全ての列を選択し、先に登録された10行を抽出した事を示します。

<ul>
<li>FROM句：データベース内の指定する表を選択する</li>
<li>SELECT句：指定した表から抽出すべき列を選択する</li>
<li>LIMIT句：抽出する行数を指定する</li>
</ul>

そして、今回の設問ではSQLではLIMIT句を使用する部分を、pandasで<b>head()</b>で表現する事により表現が可能となります。

#まとめ
pandasを使って、SQLのLIMIT句によるデータ抽出を行いました。pandasはデータベース及びSQLを意識したpythonライブラリなため、普段からSQLを意識するとかなり使いやすいツールだと改めて感じます。

#終わりに
　今回、利活用したデータはデータサイエンス協会（DS協会）の「データサイエンス100本ノック」を参考にしております。こちらはJupyter notebookを使用しているので、より見やすいデータが抽出されます。
　この記事を読んで、「実際に実装してみたい！！」という方がおりましたら、下記にその実装に関する記事を上げているので、良かったそちらの記事を参考に是非実装してみて下さい。

データサイエンス初学者にむけた、データサイエンス100本ノックを実装する方法：
https://qiita.com/syuki-read/items/714fe66bf5c16b8a7407
マクシミン原理


応用情報技術者平成29年春期 午前76

いずれも時価100円の株式A～Dのうち，一つの株式に投資したい。経済の成長を高，中，低の三つに区分したときのそれぞれの株式の予想値上がり幅は，表のとおりである。マクシミン原理に従うとき，どの株式に投資することになるか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/01139cf2-96b9-ac98-8006-4df965d5da4a.png)


１、マクシミン原理は、　maximin principle
各戦略を選択した場合に得られる最小利得が最も大きくなる戦略を選ぶという保守的な考え方です。

各株式の最小利得は次のようになります。
　・A…成長率・中のときの10円
　・B…成長率・中のときの5円
　・C…成長率・低のときの5円
　・D…成長率・低のときの-10円

マクシミン原理に従う場合、それぞれの最小利得を比べたときに最も利益が大きくなるAに投資すると結論づけられます。

参照：
https://www.ap-siken.com/kakomon/29_haru/q76.html
Matlabサンプルデータに対してシステム同定してみた

#概要
Matlab ツール System Identificationを使用してサンプル入出力データからシステム同定を行ってみた。
今回は伝達関数モデルに対しての同定を行った。

#使用ソフト
MATLAB                                                バージョン 9.9           (R2020b)
Signal Processing Toolbox                             バージョン 8.5           (R2020b)
System Identification Toolbox                         バージョン 9.13          (R2020b)

#行ったこと
サンプルデータをロード

```matlab
load dcmdata
```
サンプル入力データ(下) 出力データ(上)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/b369fe70-aecf-ad80-884b-a70ac6b9544b.png)

システム同定guiよりサンプル入出力データから伝達関数を推定した

```matlab
systemIdentification
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/28cb26f9-788d-cae3-87ec-e211244fc89d.png)

伝達関数での推定の場合、極と零点の次数を設定する。以下2条件で推定してみた
・tf1 極数:1 零点数:0 
・tf2 極数:2 零点数:0 

tf1,2の推定結果を示す。tf1の推定精度は91% tf2の推定精度は98%であった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/fdec9de9-e9ed-c012-ee78-b4316840cd0f.png)
次数を増やせば同定精度が上がる。


#参考
https://jp.mathworks.com/videos/system-identification-for-model-based-design-and-control-design-82363.html

#今後
事前に用意した伝達関数に対してM系列信号を入力して出力データ保存
その入出力データからモデルを推定してみたい
勉強日誌15日目

今日も朝から勉強
おおかみくには騙されないを久しぶりに見た
恋愛って良いですなあ

てことで開始
前回より落ちた原因は回答の自信のなさとまた凡ミスだった
昨日もだったから直さなければ・・・。
特殊変数苦手だあああ

正答率　76 (67)

~/.bashrc
ユーザが自分用にコマンドのエイリアスを設定したい時、編集すべきファイル

set -o emacs
シェルのオプション機能、キーバインドをemacs風にする

~/.bashrc
bashログイン時　4番目に読み込む環境設定ファイル

env -i
envコマンドで何も環境変数設定されてない状態

set -o vi
シェルのオプション機能、キーバインドをvi風にする

env
設定されている環境変数の値を一時的に指定した値に変更するコマンド

declare -f
独自のシェル関数を確認

set -o noclobber
上書き禁止

alias
登録されているエイリアスを表示

$USER
ユーザ名の表示

正答率　82 (74)

$?
直前に実行されたコマンドの終了ステータス

$0
直前に実行したシェルスクリプト名

$#
コマンド実行時に指定された引数の数が設定される変数

$$
プロセス番号
ワークシェアリング(work sharing)

応用情報技術者平成29年春期 午前74 

ワークシェアリングの説明はどれか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/db390b0d-1df9-7f4f-365a-9d4c38841dbe.png)


１、ワークシェアリングは、仕事(work)と共有(sharing)を組合わせた言葉で、人々の間で雇用を分かち合うことを意味し、労働時間の短縮によって仕事の機会を増やす考え方です。

※分かち合う　分担　分享

ワークシェアリングは2タイプに大別されます。
・雇用維持型
　一時的な業績悪化、あるいは中高年等の余剰人員の発生に対処するため、1人あたりの労働時間を少なくすることで雇用を維持しようとするもの
・雇用創出型
　1人のフルタイム従業員が行っていた仕事を、複数人のパートタイム等の短時間雇用で賄うことで、多くの人々に雇用機会を与えるもの


２、
・企業が継続雇用の前提として，従業員に対して他社でも通用する技術・能力の維持責任を求める一方，企業も従業員の能力開発を積極的に支援する。
⇒CDP(Career Development Program)の説明です。


・専門業務や企画業務における労働時間は，実際の労働時間に関係なく，労使協定であらかじめ取り決めた労働時間とみなす。
⇒裁量労働制の説明です。


・能力主義と実績主義の徹底，経営参加意識の醸成，業績向上へのインセンティブなどを目的に，職務と能力，業績を基準に報酬を決める。
⇒成果・能力主義の説明です。


参照：
https://www.ap-siken.com/kakomon/29_haru/q74.html

ワークシェアリング
https://bowgl.com/work-sharing/
SQL(MySQL)入門！ INSERT, UPDATE, DELETE, TRUNCATE 編


###環境
　Windows 10
　MySQL : version(5.7.28)
使用アプリ
　コマンドプロンプト(Windowsマーク押して「cmd」って打ったら出てくるやつ)

----

#INSERT

指定したカラムのデータを登録する

    INSERT
    INTO
	    TABLE1  -- テーブル名
    (
	    COLUMN1 -- カラム1
	,   COLUMN2 -- カラム2
	,   COLUMN3 -- カラム3
    ) VALUES (
	    VALUE1  -- カラム1に挿入する値
	,   VALUE2  -- カラム2に挿入する値
	,   VALUE3  -- カラム3に挿入する値
    )


カラム名を省略して書けるが、カラムの並び順通りにすべての値を力しないとエラーとなる

    INSERT
    INTO
	    TABLE1 -- テーブル名
    VALUES(
	    VALUE1 -- カラム1に挿入する値
    ,	VALUE2 -- カラム2に挿入する値
    ,   VALUE3 -- カラム3に挿入する値
    )

-----
UNIQUE KEYが存在するテーブルへのデータINSERT処理
-----



#IGNORE
重複データの`INSERT`を無視する

    INSERT
    IGNORE
    INTO
	    TABLE1 -- テーブル名
    VALUES(
	    VALUE1 -- カラム1に挿入する値
    ,	VALUE2 -- カラム2に挿入する値
    ,   VALUE3 -- カラム3に挿入する値
    )

`INSERT`と`INTO`の間に**IGNORE**を入れる


#REPLACE
既存のデータを`DELETE`して新しいデータを`INSERT`する

    REPLACE
    INTO
	    TABLE1  -- テーブル名
    (
	    COLUMN1 -- カラム1
	,   COLUMN2 -- カラム2
	,   COLUMN3 -- カラム3
    ) VALUES (
	    VALUE1  -- カラム1に挿入する値
	,   VALUE2  -- カラム2に挿入する値
	,   VALUE3  -- カラム3に挿入する値
    )

INSERTの部分を`REPLACE`に置き換える

間違ってデータを消してしまったテーブルに対して`INSERT文`を使って再度データを挿入しようとしたらこのエラーが出ました。

    Error Code: 1062. Duplicate entry '010006' for key 'PRIMARY'

`REPLACE`を使って、無事にデータを挿入することができました。

#UPDATE
レコードを更新する（`,`で繋ぐことで複数入力も可能）

    UPDATE 
        TABLE1    -- テーブル名
    SET
        COLUMN2   =   VALUE -- カラム2に新たに値を挿入
    WHERE
        COLUMN1   =   VALUE 更新したいデータを特定するため、主キーやユニークキーなどが設定されたカラム名と値を指定

#DELETE
レコードの削除

    DELETE
    FROM
	    TABLE1  -- テーブル名
    WHERE
	    COLUMN  =    VALUE -- 削除したいデータを特定するため、主キーやユニークキーなどが設定されたカラム名と値を指定

#TRUNCATE
テーブル内の全データ削除（強制的にデータが消えるので使用する際には注意が必要です）

    TRUNCATE テーブル名

一旦テーブルを削除して、またテーブルを作成

    TRUNCATE TABLE テーブル名

----

#終わりに

**[フューチャー株式会社](https://future-architect.github.io/coding-standards/)が作成する[SQLコーディング規約（Oracle）](https://future-architect.github.io/coding-standards/documents/forSQL/SQL%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A6%8F%E7%B4%84%EF%BC%88Oracle%EF%BC%89.html#update%E6%96%87)に則った形で書いています。**
Python 3 + Tkinter で Windows アプリを開発する (exe ファイル化編)

# はじめに

[前回の記事](https://qiita.com/akagisho/items/7dfa6304b8233b85fa13)で、Tkinter を使用してサンプルの Windows アプリケーションを作成した。

今回は「[PyInstaller](https://pyinstaller.readthedocs.io/en/stable/)」を使用して、Python スクリプトを exe ファイル (実行ファイル) 化し、Python の実行環境がない Windows 上でも実行できるようにする。

※ 「[py2exe](http://www.py2exe.org/)」というのもあり、そちらの方ができあがる exe ファイルが軽量＆高速なのだが、Tkinter との組み合わせがうまくいかないので調査中。

# 準備

## pip のインストール

まず、[Pleiades の PyDev では pip がうまく動かないことがある](https://qiita.com/neko_the_shadow/items/0ce215380845e08db044)ので、pip を入れ直す。

[pip の公式ドキュメント](https://pip.pypa.io/en/stable/installing/)に記載の下記の URL から `get-pip.py` をダウンロードし、適当なフォルダに保存する。

* https://bootstrap.pypa.io/get-pip.py

コマンドプロンプトを起動し、PyDev の python で `get-pip.py` を実行する。

```
C:\pleiades\python\3\python.exe (ダウンロードししたフォルダ)\get-pip.py
```

`Successfully installed pip-〜〜` のようなメッセージが表示されれば、インストール成功。

## PyInstaller のインストール

次に PyDev 環境に「PyInstaller」をインストールする。

Eclipse を起動し、メニューの [ウィンドウ] -> [設定] を開く。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/a97aec61-5f09-7e3f-705f-89a40af840b1.png)

左側メニューの [PyDev] -> [インタープリター] -> [Python インタープリター] を開く。「Python3」を選択して [Manage with pip] ボタンをクリックする。

![40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/c0655b5c-ebfe-0284-9e27-894c219deb35.png)

「Command to execute」に「`install pyinstaller`」と入力し、[実行] ボタンをクリックする。「FINISHED」と表示されたら [閉じる] ボタンをクリックする。

![41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/46d91fa3-cfd6-6b8b-46d9-df11f99fc482.png)

# Python スクリプトの exe 化

PyInstaller をインストールできたので、これを使用して Python スクリプトを exe 化する。

コマンドプロンプトを起動して `pyinstaller.exe` を実行する。このとき、引数に exe 化したい Python スクリプトを指定する。

```:実行例
cd C:\pleiades\workspace\testproj1

C:\pleiades\python\3\Scripts\pyinstaller.exe C:\pleiades\workspace\testproj1\test1.py --onefile --noconsole
```

うまくいくと、コマンドプロンプトのカレントディレクトリ (上記の例では `C:\pleiades\workspace\testproj1`) 配下の `dist` フォルダの中に exe ファイルが生成される。

![42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/0cfc51fd-b4f4-e0a8-6209-e4c063276409.png)

生成された exe ファイルをダブルクリックして実行してみる。ちょっと時間がかかってアプリケーションが起動する。

![43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/5e72a9ee-6101-d6ea-a4a7-c854d75542bd.png)
行動ターゲティング、地域ターゲティング、コンテンツ連動型広告、検索連動型広告(リスティング広告)

応用情報技術者平成29年春期 午前72

インターネットを活用した広告手法のうち，行動ターゲティングの説明はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ce27f3f1-9c08-78a4-de45-9b73628c2bfb.png)


１、行動ターゲティングは、
利用者の検索履歴やWebサイトの閲覧履歴・購買履歴などのオンライン上における行動データをもとに、興味のありそうな分野を推測し、利用者ごとに最適な広告を表示する手法です。

行動は、利用者の行動ですね。利用者の閲覧・購買の行動履歴によりその製品を広告としたら、費用効果が期待できるでしょう。

例としては、直前に検索した内容が、その後に訪れたWebページ上の広告として表示されることなどがその一例です。広告主側としては、自分たちの製品に興味のある人、または目標セグメントに対してピンポイントで広告を表示できるので費用対効果の向上が期待できます。行動データの収集にはクッキーおよびWebビーコンが用いられています。

２、
・インターネット検索エンジンで，利用者が入力した特定の検索キーワードに関連する商品の広告を表示する。
⇒検索連動型広告(リスティング広告)の説明です。

利用者の検索によりリストするものに、広告を表示すること。


・サービス運営会社が発行する広告タグを埋め込んだWebサイトを訪れた利用者に対して，そのWebサイトのコンテンツに関連した広告を自動的に表示する。
⇒コンテンツ連動型広告の説明です。

利用者はあるHPを開いて、そのHPの内容に関連する広告を表示すること。


・スマートフォンなどのGPS機能を使い，利用者の現在地に合わせて，近隣の商業施設の広告を，利用者が見ているWebサイトに表示する。
⇒地域ターゲティングの説明です。

利用者は現在地の商業施設を利用する促す広告ですね。
旅行者にとってよくあるでしょう。


参照：
https://www.ap-siken.com/kakomon/29_haru/q72.html
エスクローサービス（Escrow Service）

応用情報技術者平成29年春期 午前71 

インターネットオークションにおいて，出品者と落札者の間の決済で使用されるエスクローサービスはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c6be013a-136e-0091-52c9-1ef8d44f869f.png)


１、エスクローサービスは、　Escrow Service
電子商取引において支払いや商品の発送などについての安全性を保証する仲介サービスです。

※Escrow：預託
 エスクロー（escrow）とは、商取引の際に信頼の置ける第三者を仲介させて取引の安全を担保する第三者預託である。

仲介業務を依頼されたエスクローサービス業者は、
・買主から商品代金および手数料を受け取る
・売主の商品配送を確認する
・商品代金を売主に送金する
という手順で買主・売主のどちらにも安全な取引を保証します。特にネットオークションでは個人同士の取引によるトラブルの可能性があるため、オプションとしてエスクローサービスの利用が可能な場合があります。

２、
・決済に関する情報の利用に関して，情報の保護基準が守られているかを第三者機関によって監視する仕組みのこと
⇒PCIデータセキュリティスタンダード(PCI DSS)の説明です。

※PCIデータセキュリティスタンダード（PCI DSS：Payment Card Industry Data Security Standard）は、 
クレジットカード情報および取り引き情報を保護するために2004年12月、JCB・American Express・Discover・マスターカード・VISAの国際ペイメントブランド5社が共同で策定した、クレジット業界におけるグローバルセキュリティ基準である。 2016年4月28日に改訂版であるV3.2が発表された。このバージョンは2016年11月1日発効となる。 これに伴いV3.1は2016年10月31日に失効し、PCI SSCは、2016年4月28日付でPCI DSS v3.2の公開を行った。[1]


・決済に関する電子メールなどの情報交換において，送信元とメールアドレスが正常であることを認証する仕組みのこと
⇒SPF(Sender Policy Framework)やDKIM(DomainKeys Identified Mail)に関する記述です。

・決済に使用されるクレジットカード情報を暗号化したり，正規のショップであることを認証局によって確認したりすることによって，取引の安全を確保する仕組みのこと
⇒SET(Secure Electronic Transactions)の説明です。


参照：
https://www.ap-siken.com/kakomon/29_haru/q71.html

PCIデータセキュリティスタンダード
https://ja.wikipedia.org/wiki/PCI%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%80%E3%83%BC%E3%83%89
symfony4 レポジトリで使うサブクエリ

#in句でサブクエリを使って一括更新
```
    public function updatePaymentStatus(?array $ids,?int $status){

        $inquirySubQb = $this->_em->createQueryBuilder()
        ->select('i.id')
        ->from(Inquiry::class, 'i');
        $inquirySubQb->andWhere($inquirySubQb->expr()->in('i.id', $ids));

        $qb = $this->createQueryBuilder('e')
        ->update()
        ->set('e.paymentStatus', $status);
        $qb->andWhere($qb->expr()->in('e.inquiry', $inquirySubQb->getDQL()));

        $query = $qb->getQuery();

        return $query->getResult();

    }
```
#サブクエリを使って同一グループ内で最新のデータを取得
```
$qb = $this->createQueryBuilder('i');
$subQb = $this->_em->createQueryBuilder()
            ->select('max(subi.updateDate)')
            ->from(Inquiry::class, 'subi')
            ->where('i.senderMail = subi.senderMail');
$qb->andWhere("i.updateDate = ({$subQb->getDQL()})");
```
AWS Step Functionsで5分後にDynamoDBのデータを削除する

#はじめに
API Gateway + Lambda + DynamoDBでwebAPIを開発しています。
Lambda関数でDynamoDBへデータを書き込み、そのデータを5分後に削除する必要がありました。
そこで、以下の方法を考えました。
・DyanamoDBのTTL機能を使って5分後にデータを削除する
・データを書き込むLambdaから5分後にデータを削除するLambdaを呼び出す

#DynamoDBのTTL機能
まずDynamoDBのTTL機能を調べたのですが、`TTLでは有効期限から48時間以内に期限切れのアイテムを削除します`との記載があり、5分後に必ず削除する設定は不可能でした。
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html

#AWS Step Functionsを使う
次に、`データを書き込むLambdaからデータを削除するLambdaを呼び出す`を検討します。
調べた結果、AWS Step Functionsを使うことで実現できそう。実装してみます。

##データを書き込むLambda関数の作成
ランタイムはPython3.8、DynamoDBとStepFunctionsへのアクセス権を付与します。
以下のLambda関数でDynamoDBへデータを書き込み、StateMachineを呼び出します。
userIdをパラメータとしてStateMachineに渡します。

```lambda_function.py
import  boto3

client = boto3.client('stepfunctions')
dynamoDB = boto3.resource('dynamodb')

def lambda_handler(event, context):
    # データを書き込むテーブル
    table = dynamoDB.Table('test')
    # 呼び出すStateMachine
    stateMachineArn = 'StateMachineのARN'
    # DynamoDBにデータを書き込む
    table.put_item(Item={'data': data})
    # StateMachineを呼び出す
    input = {"parameters":{"userId":userId}}
    client.start_execution(
        stateMachineArn = stateMachineArn,
        input = json.dumps(input)
        )
    return {'statusCode': 200, 'body': "writeData"}
```

##StateMachineの作成
以下の定義でStateMachineを作成します。
StateMachineにLambdaへのアクセス権を付与してください。

```
{
  "StartAt": "wait_5_miutes",
  "States": {
    "wait_5_miutes": {
      "Type": "Wait",
      "Seconds": 300,
      "Next": "deleteData"
    },
    "deleteData": {
      "Type": "Task",
      "Resource": "データを削除するLambda関数のARN",
      "Parameters": {
          "userId.$": "$.parameters.userId"
      },
      "End": true
    }
  }
}
```
![スクリーンショット 2020-09-20 16.04.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410068/db6110a3-953f-47e8-e161-a096569cffa0.png)
##データを削除するLambda関数の作成
StateMachineから、以下のLambda関数を実行することでデータを削除します。

```lambda_function.py
import boto3

dynamoDB = boto3.resource('dynamodb')
table = dynamoDB.Table('test')

# StateMachineで呼び出される
def lambda_handler(event, context):
    # StateMachineからパラメータを受け取る
    userId = event['userId']
    # 削除対象のデータを探す
    searchResult = table.get_item(Key={'userId': userId})
    if "Item" in searchResult:
        table.delete_item(Key={'userId': userId})
    return {'statusCode': 200, 'body': "deleteData"}
```

#おわりに
AWS Step Functionsを使うことで、`DynamoDBへデータを書き込み、そのデータを5分後に削除する`が実現できました。
もっと複雑な処理もできそうなので試してみたいです。

#参考
https://qiita.com/ketancho/items/147a141c9f8a6de86c97
https://aws.amazon.com/jp/getting-started/hands-on/create-a-serverless-workflow-step-functions-lambda/
Python + DjangoをWindowへインストールし管理画面を開発するまで。

```
下記リンクから入ります。
https://www.python.org/downloads/windows/


Download Windows x86 embeddable zip file

Add Python 3.6 to PATH」にチェックして、「Install Now」をクリック

インストールが完了したら。Closeボタンで閉じます

コマンドプロンプトを起動

その後下記コマンド
pip install virtualenv

virtualenv env1をエンター

cd Desktop

コマンドプロンプトで「pip install django」を実行

django-admin startproject mysite

python manage.py mygrate
python manage.py createsuperuser

-------------
Username: 
Email address: 
Password:
Password (again):
Superuser created successfully.
-------------

上記を全て入力後に
python manage.py runserverで起動
http://127.0.0.1:8000/admin

上記URLからユーザー名とパスワードを入力すると管理画面へとログインできます。

```
EMNISTでアルファベット手書き認識

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">EMNIST-lettersを学習させました。<br>CODE: <a href="https://t.co/D3bP7tHq9U">https://t.co/D3bP7tHq9U</a><br>DEMO: <a href="https://t.co/8c20CEzLpC">https://t.co/8c20CEzLpC</a> <a href="https://t.co/gr66WGkQRi">pic.twitter.com/gr66WGkQRi</a></p>&mdash; mbotsu (@mb_otsu) <a href="https://twitter.com/mb_otsu/status/1306432782273409026?ref_src=twsrc%5Etfw">September 17, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[EMNIST](https://www.nist.gov/itl/products-and-services/emnist-dataset)は2017年にNISTが公開したデータセットになります。

* EMNIST ByClass: 814,255 characters. 62 unbalanced classes.
 * 大文字(26) + 小文字(26) + 数字(10)  
* EMNIST ByMerge: 814,255 characters. 47 unbalanced classes.
* EMNIST Balanced:  131,600 characters. 47 balanced classes. 

  * ByMergeとBalanced  
大文字(26) + abdefghnqrt(11) + 数字(10)  
大文字と被るcijklmopsuvwxyzを省いたもの。  
ブレンド具合は下記図を参照

* EMNIST Letters: 145,600 characters. 26 balanced classes.
 * 大文字と小文字のセット(26)
* EMNIST Digits: 280,000 characters. 10 balanced classes.
* EMNIST MNIST: 70,000 characters. 10 balanced classes.
 * DigitsとMNISTは元のMNISTと互換性のある手書き数字

![スクリーンショット 2020-09-21 5.25.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35973/b77335a6-0192-a1f9-470a-f825eb221971.png)

## はまりどころ

* TensorFlowのデータセットでうまく認識しない？  
当初、TensorFlowのデータセットを使ったのですが手書き文字が認識しませんでしたので元のEMNIST-lettesのデータを使いました。  
これについては結論は出ていませんがラベルに対してデータ数が少ないのが原因かもしれません。んー

| | train| test | Label |
|:-----------|:-:|:-:|:-:|
|[EMNIST-lettes](https://www.nist.gov/itl/products-and-services/emnist-dataset)| 124,800 | 20,800 | 26 |
| [TensorFLow](https://www.tensorflow.org/datasets/catalog/emnist?hl=ja) | 88,800 | 14,800 | 37 |


* EMNIST-lettesはラベルが1から始まる問題  
byclassは0から始まりますがlettersは1から始まりました。  
トレーニングには[tf.data.Dataset.from_tensor_slices](https://www.tensorflow.org/tutorials/load_data/numpy?hl=en#load_numpy_arrays_with_tfdatadataset)を使いましたので、0から始めないとラベル数が正しく扱えませんので調整を行いました。

```
x_train, y_train = extract_training_samples("letters")
np.unique(y_train)
```

```
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
       18, 19, 20, 21, 22, 23, 24, 25, 26], dtype=uint8)
```

```
y_train = y_train - 1
np.unique(y_train)
```

```
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25], dtype=uint8)
```

## 全体の処理

基本的な処理は[Kerasを使用したMNISTでのニューラルネットワークのトレーニング](https://www.tensorflow.org/datasets/keras_example)を参照しました。

WEBでの表示やモデルは[How to distribute a Tensorflow model as a JavaScript web app](https://dida.do/blog/how-to-deploy-a-tensorflow-model-as-a-javascript-web-app)を参照しました。

今回試した[コードはGitHub](https://github.com/mbotsu/emnist-letters)に上げています。

以上。後に調べる方の参考になればと思います。

# 後日譚 (2020/10/02)

[EMNIST：手書きアルファベット＆数字の画像データセット](https://www.atmarkit.co.jp/ait/articles/2009/28/news024.html)にtfdsのデータはtransposeが必要とあったので試してみたら認識するようになった。

実験ノート
https://gist.github.com/mbotsu/bf4d16df4020b9c3630e0ccae32d5a88
<script src="https://gist.github.com/mbotsu/bf4d16df4020b9c3630e0ccae32d5a88.js"></script>
CATechChallengeで動画を簡単にGIFにできる追加機能をつくった話

# はじめに
サイバーエージェントの3daysインターンに参加してきました。
せっかくなのでこちらで技術的な振り返りをしていきたいと思います！

# CATechChallengeとは
今回参加したインターンはCATechChallenge(3daysiOS/Android向け開発型インターン)というもので、AbemaTVに架空の追加機能を実装するハッカソン形式のインターンです。

# 作成した機能
視聴中の動画を長押しすることでその部分のGIFが作成されツイートされる機能を実装しました。

# 使用した技術
言語: Swift
アーキテクチャ: MVC
ライブラリ: Regift, Swifter
を使用しました。アーキテクチャに関しては元々MVCのコードが用意されていたのでそのまま実装しました。
ライブラリはGIF生成のためにRegift, ツイートのためにSwifterを使用しています。

# 苦戦した箇所
### ライブラリがm3u8に対応してなかった
元々用意されていた動画の形式がm3u8だったのですがRegiftがmp4にしか対応していなかったため、危うくアイデア自体が終わるところでしたw
メンターさんがmp4の動画も用意してくださっていたので入れ替えることでこちらは無事解決しました。

### 長押しした時の秒数の取得
これは完全に僕の勉強不足なのですが、AVFoundationを使ったことがなかったので長押し中の秒数の取得に苦戦しました。
AVFoundationではCMTimeという独自の時間表現をするため、currentTimeがCMTimeで表示されていました。
GIFを作成する際には通常の秒数を取得する必要があったので、親切な方の記事を見ながらそれっぽく変換しました

### GIFの容量がデカすぎてツイートできない
Twitter的に15MB以上のメディアはアップロードできないためGIFがツイートできなくて詰みました。
意図せぬ変更ではあるんですがGIFの画質を落とすことによってこの制限をクリアできたので画質を一番低いものにしました。

### Swifterからツイートするとユーザーが文章を足せない
これは使うまで気がつかなかったのですが、アプリからSwifterを使ってツイートすると一瞬safariに飛んでアプリにコールバックするため、ツイート時にユーザーが文章を足すことができません。
個人的に不便だなと感じたので間に自作のAlertを挟むことでユーザーが文章を足せるようにしました。

# 工夫したポイント
今回一番のアピールポイントは動画視聴という体験をほぼ中断せずに機能が完結する点です。
ツイートする際にアプリとTwitterを連携させる部分以外は動画を視聴しながら使用できる機能にしました。

# 実際にツイートすると
ちなみに実際にツイートしたらこんな感じになります！
![catweetimg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/a5d59b5d-b02e-bfb3-f7c5-9097e0cc8084.png)

# 結果
そして気になる結果は...
BestEngineer賞をいただくことができました！！！めちゃ嬉しかったです:clap:

GIFのプレビュー機能や番組へのリンクなどまだまだやりたい機能もあったのでホントはあと１ヶ月ぐらい開発したかったですが、とても楽しめたので参加してよかったです！ありがとうございました。
Flutter mapとforEachにindexを付ける方法

## はじめに
備忘録です！

## エクステンション生やします。
後述していますが、.asMap()を使えば以下必要ありませんでした。

```dart
extension IterableExtensions<E> on Iterable<E> {
  /// Like Iterable<T>.map but callback have index as second argument
  Iterable<T> mapIndex<T>(T Function(E e, int i) f) {
    var i = 0;
    return map((e) => f(e, i++));
  }

  void forEachIndex(void Function(E e, int i) f) {
    var i = 0;
    forEach((e) => f(e, i++));
  }
}
```

## 使い方

```dart
final hunterList = ['GON', 'KILLUA', 'CURARPIKT', 'LEORIO', 'HYSKOA'];

hunterList.forEach ((hunter, index) {
  debugPrint('${hunter}, ${index}');
});

// GON, 0
// KILLUA, 1
// CURARPIKT, 2
// LEORIO, 3
// HYSKOA, 4
```

## 追記：
@ntaoo さんからご指摘いただきました。
https://api.dart.dev/stable/2.2.0/dart-core/List/asMap.html
.asMap()でindexが取得できるようです。

```dart
final hunterList = ['GON', 'KILLUA', 'CURARPIKT', 'LEORIO', 'HYSKOA'];
hunterList.asMap().forEach((index, value) {
   debugPrint('${index} : ${value}')
});

// GON, 0
// KILLUA, 1
// CURARPIKT, 2
// LEORIO, 3
// HYSKOA, 4
```
わざわざExtensionはやす必要ありませんでした。
ありがとうございます。
Azure DevOps でブランチを保護する

Branches security の Force push を Deny に設定することで保護ができます。 GitHub や GitLab などは設定が「ブランチの保護」に対して、 Azure DevOps は「強制プッシュしない（ブランチの削除なども）」になっているため、設定方法の違いに要注意です。

## 手順

1. Branches > 保護対象のブランチメニュー > Branches security を選択します。
[![Image from Gyazo](https://i.gyazo.com/3526fbd26b07d7ecc5b1def9e44748b1.png)](https://gyazo.com/3526fbd26b07d7ecc5b1def9e44748b1)

2. Contributors の Force push を Deny に設定します。グループをカスタマイズして利用していたり、特定のユーザーのみ保護したい場合は Contributors ではなく、保護対象のグループやユーザーを選択してください。
[![Image from Gyazo](https://i.gyazo.com/eb77228cf969df86e715faff71c64251.png)](https://gyazo.com/eb77228cf969df86e715faff71c64251)

## 参考

- [Set Git branch security and permissions - Azure Repos | Microsoft Docs](https://docs.microsoft.com/en-us/azure/devops/repos/git/branch-permissions?view=azure-devops)
- [保護されたブランチを設定する - GitHub Docs](https://docs.github.com/ja/github/administering-a-repository/configuring-protected-branches)