OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで経済ニュースの情報をWebスクレイピング

　前回[PythonでITニュースサイトの見出しをWebスクレイピング](https://qiita.com/y-araki-qiita/items/c9db8c18998e6cb10de7)という記事で、RequestsとBeautiful Soup、そしてCSSセレクタを使ったスクレイピングを試しました。

　今回はその続編のようなもので、正規表現とPandasを使った方法で基礎的なものを記載します。

他にも似たような記事がありますがコードに誤りがあったり、うまくいかないものもあったため、自分で検証してみました。

## 正規表現を使う
　正規表現を使えば、CSSでスクレイピング対象物を特定できない場合などに役立ちます。
今回は[日経新聞のサイト](https://www.nikkei.com)にある見出しを取得します。

まずrequestsをインストールしておきます。

```python
pip install requests
```

そして以下プログラムを実行すると見出しが出力されます。
※抽出箇所のHTMLが記事投稿時と違う可能性があるため、その際はブラウザの開発者ツールなどで要確認です。

```python
# requestsと正規表現のモジュールインポート
import requests
import re

# サイトURLを変数に格納
URL = 'https://www.nikkei.com'

# get()メソッドでデータを取得
res = requests.get(URL)

# ステータス確認
res.status_code == requests.codes.ok

# reモジュールのfindall()関数を使い正規表現にマッチした箇所を抽出
subtitles = re.findall(r'<span class="m-miM\d{2}_titleL".*>(.+)</span></a>', res.text)

# for文で出力
for i in subtitles:
    print(i)
```

するとこのように表示されたと思います。

```
英離脱合意、近づく崩壊　独首相「30日内に解決策を」
米国防長官、ミサイル発射実験で「中国を抑止」
「スパイダーマン」ファン不在でピンチ
（ストーリー4）
ランチ難民にサブスク弁当　月1万2000円で待ち時間ゼロ
至難の業「お宝株」探し 「1年で株価2倍」10年ぶり少なさ
…
```
正規表現にマッチした箇所を抽出するには、ブラウザの開発者ツールにて、
\<span class=～ タイトル名 ~></span>のようになっているところを見つけたら、
タイトル名を抜き出すような正規表現を記載すれば、得たい情報を取得できます。

## Pandasを使う
データ解析用ライブラリのPandasを使ってWebスクレイピングすることも可能です。
特に表データの抽出に優れています。インストールしておきましょう。

```
pip install pandas
```

こちらの[Yahooニュース：株式ランキング](https://info.finance.yahoo.co.jp/ranking/?kd=3&mk=3&tm=d&vl=a)をスクレイピングします。
とりあえず取得してみます。すごく短いコードですね。

```python
# pandasインポート
import pandas as pd

# サイトURLを変数に格納
URL = 'https://info.finance.yahoo.co.jp/ranking/?kd=3&mk=3&tm=d&vl=a'

# pd.read_htmlでHTML内の<table>データを拾う
dfs = pd.read_html(URL)

# 表示
print(dfs[0])
```
すると以下のように表示されたと思います。

```
来高  掲示板
0    1  8411  東証1部     (株)みずほフィナンシャルグループ  ...   0.00%    ---  63459300  掲示板
1    2  8306  東証1部  (株)三菱ＵＦＪフィナンシャル・グループ  ...  -0.26%   -1.3  32270000  掲示板
2    3  3656  東証1部               ＫＬａｂ(株)  ...  +8.41%    +86  23677000  掲示板
3    4  8604  東証1部         野村ホールディングス(株)  ...  +2.27%     +9  21700100  掲示板
4    5  9434  東証1部             ソフトバンク(株)  ...  +0.80%    +12  20954900  掲示板
…
```

これだけではいらない情報もあると思います。項目を抽出して取り直してみます。

```python
# coding: UTF-8
# pandasインポート
import pandas as pd

# サイトURLを変数に格納
URL = 'https://info.finance.yahoo.co.jp/ranking/?kd=3&mk=3&tm=d&vl=a'

# pandasで表データ抽出
dfs = pd.read_html(URL)

# 選択した項目のみ表示
dfs[0].columns = ['順位', 'コード', '市場', '名称', '取引値', '前日比', '出来高', '掲示板','Unnamed: 8','Unnamed: 9']
print(dfs[0][['順位','名称', '前日比', '出来高']])
```

すると先程よりシンプルになりました。

```
                      名称     前日比     出来高
0      (株)みずほフィナンシャルグループ   154.3   0.00%
1   (株)三菱ＵＦＪフィナンシャル・グループ   500.5  -0.26%
2                ＫＬａｂ(株)    1109  +8.41%
3          野村ホールディングス(株)   405.3  +2.27%
4              ソフトバンク(株)    1518  +0.80%
…
```

Pandasは、CSVやExcelなどのファイルもスクレイピング可能です。また取得した情報をCSVに出力することもできます。


あとはSeleniumを使ったスクレイピング方法などあります。
Seleniumはブラウザ操作をする為のライブラリなので、ログインスタートもできます。
また機会があれば記載したいと思います。

## 関連記事
[PythonでITニュースサイトの見出しをWebスクレイピング](https://qiita.com/y-araki-qiita/items/c9db8c18998e6cb10de7)
AWSとGCPのIAMの差異イメージ

##はじめに
自分の勉強した内容の整理のためみGCPの基本的なことメモです。

##AWSとGCPのIAMの違い
Google Cloud Identity & Access Management（IAM）についてAWSのIAM比べたときの違いについてイメージを記載します。

AWSは、SSOなどを使うと構成がもっとシンプルになりますが、一旦基本的な構成で記載します。元々ははじめてAWSを利用するときは、AWSアカウント作成し、その中でIAMユーザを作成し利用者がログインして利用する形になります。AWSアカウントが増えてきた木の対応としてAWS Orgnizationという機能で一元管理できるようになりました。それぞれのIAMユーザごとにIAMポリシーが付与されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/237ed768-8fea-eb9c-db54-f8e7a5965db0.png)

GCPの場合は、ドメインにユーザを作成し、そのユーザに対してプロジェクトごとに権限を付与することができます。そのため、ログインユーザが一意になります。プロジェクトをかんりするためにOrganizationが使用できます。IAMではユーザアカウントのを作成せず、権限の付与やグループ、サービスアカウントの作成などを行うところもAWSと異なります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/97493218-4bd2-2c04-27cc-a0f31e83b0fd.png)


また、ユーザではなくコンピュートのインスタンスなどにも各クラウドサービスに対して権限を付与する仕組みがあります。
こちらは、GCPとAWSで大きな差はありません。GCPではサービスアカウント、AWSでIAMロールと呼びます。

###投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
【Python】 圧縮されたファイルを一気に解凍したる！

# はじめに
【背景】
サーバ内部にあるミドルウェアのバックアップを取得しtarボールで固めて、ローカルに移動してから、そのtarボールを解凍してから次のめんどいことに気づきました。
※背景のストーリーは気にせずお願いします。。

【問題】
解凍されたtarボールの内部にフォルダが大量にあって、その中身に結構な数でtarボールがそれぞれのフォルダに散らばっている・・・。一気に解凍したい。

【解決】
オレヤル。

# 内容
## 結論

大量のフォルダがあって、その中にtarボールが大量にあって一度に解凍できないときとかに便利です。
いちいちボタンポチポチとかだるすぎるので、作りました。

** 退屈なことはPythonにやらせよう！ **ですね。

```python
import os
import sys
import tarfile
argvs = sys.argv

# コマンドライン引数で実行したいファイルを指定
# C:/Users/username/hogehoge/ とか
PATH = argvs[1]

# 特定のディレクトリをなめる
def files(path):
    for pathname, dirnames, filenames in os.walk(path):
        for filename in filenames:
            yield os.path.join(pathname, filename)

# tarボールの解凍
def extract_tar_file(dirname, path):
    with tarfile.open(path, 'r:*') as tar:
        tar.extractall(dirname)

if __name__ == '__main__':
    for path in files(PATH):
        if path.endswith('.tar.gz'):
            path = path.replace('\\','/')
            # tarボールを保存している一つ一つのディレクトリ抽出
            dirname, basename = os.path.split(path)
            extract_tar_file(dirname, path)
```

※エラー処理等々はしていないので、適当に入れていただければ。

参考記事にさせていた大内容がわかりやすくとても助かりました。
ありがとうございます！

# 追記

解凍先が上記のスクリプトで強制されているの自分で書いてキモイと思ったので、以下のように解凍先もコマンドライン引数で指定してやると解凍先も選べます。

```python
# 解凍先をコマンドライン引数で
# C:/Users/username/hogehoge/hogehoge/ とか
EXT_DIR = argvs[2]

# tarボールの解凍
def extract_tar_file(path):
    with tarfile.open(path, 'r:*') as tar:
        tar.extractall(EXT_DIR)
```

# 結論
スクリプト組まなくていいから、LhaplusとかCubeIceダウンロードして一気に解凍しようぜ！笑

# 参考
https://qiita.com/hasepy/items/8e6a0757da1ce074ce87
【Rails】 API開発で『Can't verify CSRF token authenticity』といわれたときの対応

## 現状の問題
RailsでAPI開発をしている際にエンドポイントを叩いたら以下のようなエラーが出ました。

```
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 22ms (ActiveRecord: 0.0ms)
```

CSRFトークン認証ができなかったという内容のエラーです。

## 解決方法

### 方法1. application_controller.rbを修正
`controllers/application_controller.rb`を見ると以下のようなコメントがあります。
> Prevent CSRF attacks by raising an exception.
> For APIs, you may want to use :null_session instead.

コメントに従い、以下のように変更すれば問題は解決します。

```diff
- protect_from_forgery with: :exception
+ protect_from_forgery with: :null_session
```


この変更により、CSRF対策が『例外の発生』から『セッションのクリア』になります。
『セッションのクリア」の場合、処理は継続されるためAPIのエンドポイントを叩いたら結果が返ってくるようになります。

### 方法2. APIで利用するcontrollerを修正

APIで利用するcontrollerに対して以下のメソッドを追加します。

```
skip_before_action :verify_authenticity_token
```

こちらのほうが、`application_controller.rb`を修正するのに比べて影響範囲が限定的になります。

## さいごに
ツイッター(<a href="https://twitter.com/nishina555" target="_blank" rel="noopener">@nishina555</a>)やってます。フォローしてもらえるとうれしいです！
Linuxのタブキーの入力補完で大文字小文字を無視する

キャメルケースのプロジェクトとかをタブキーで入力補完しようとしてもしてくれないので対処法メモ

# やりたい事
`/tmp/Hoge/Fuga/Piyo.pm` というディレクトリがあったとして

`/tmp/ho` の状態でタブキーを押して入力補完したい。 Hoge が正規のため、 hoge では入力補完してくれない。

なので、大文字小文字無視の記述を追記する

```shell
$ vi ~/.inputrc

set completion-ignore-case on
```

これで大文字小文字無視の入力補完が可能になる
Web広告（インターネット広告）の種類（個人お勉強用）

随時更新予定
# ★リ3兄弟
## リスティング広告
検索エンジンの検索結果に、検索キーワードと連動して表示する広告
## リターゲティング広告
行動ターゲティング広告の1つ

アドネットワークやDSPに広告出稿している広告主のほとんどが、リターゲティングを行っている

## リワード広告
アフィリエイト広告（成果報酬型広告）の一種で、広告のリンク先のWebサイトで、アプリのダウンロードや、商品の購入など成果が発生すると、広告主から媒体に成果報酬が支払われ、媒体がその会員に媒体内で使えるポイントなどを付与する仕組みの広告
アフィリエイト広告 ＞ リワード広告 ＞ ブースト広告
# ★その他広告の種類
## アフィリエイト広告
## ディスプレイ広告
## ネイティブ広告
## 純広告
## バナー広告
## 記事広告
## 動画広告
## SNS広告
この一冊で全部わかるWEB技術の基本 chapter7 Webシステムの構築と運用

##提供するサービスの検討
サービスの検討をするときは全体の概要から初めて最終的にアプリケーションの詳細な機能面まで落とし込む。

>・サービスの内容
何を提供するサービス？どんなユーザを想定している？Webかアプリのどちらの方で作る？どのような時に使うもの？
・必要な機能とデザイン
ログイン機能、投稿機能、外部API、
画面遷移、画面詳細など

##ネットワーク構成の検討
Webシステムを構成するネットワークは三つにわかれる。
どのようなネットワーク構成にするかはシステムの内容とコストによって検討する。

①外部ネットワーク
インターネットに晒されファイアーウォールの外側
②内部ネットワーク
インターネットからの接続を受けない、APサーバ/DBサーバなど
③DMZ (DeMilitarizedZone)
外部・内部ネットワークの間に位置し、不正な通信を内部に流さないためのもの、Webサーバ
IDS,IPS,WAFなどのセキュリティを高めるツールの導入はシステムとコスト面によりきまる

##サーバー構成の検討
ネットワーク構成が決まれば、各サーバーにどうサーバを構成するかを検討する。
Webサーバを冗長化する場合はリクエストをどのサーバに渡すかを考える必要がある。

###ロードバランサー
リクエストを各サーバに振り分ける役割を持つ。
Webサーバよりインターネット側に位置し、クライアントからのリクエストを受け取って配下のWebサーバに振り分け、Webサーバからのレスポンスをクライアントに流す。

システムによって、コストを抑えたサーバ構成の場合は一つのサーバをWeb・アプリケーションサーバとしてDMZに配置し、可用性を重視したものはAPサーバを内部に配置しDBを冗長化させるといった構成になる。

##サーバ基盤の検討

サーバーなどの機器をどのように調達するかを検討する必要がある。

###オンプレミス
自社で購入して利用する「自社運用」のこと。
好きなように構成を組むことができシステムのデータも扱いやすいというメリットがあるが、機器は高価で置き場所も必要なためコストが大きくかかり、運用知識も必要となる。クラウドの登場により徐々に少なくなっている。
###レンタルサーバー
他者が構築し貸し出しているサーバのこと。
費用がやすく、構築・運用の手間がないため個人利用に向く。完成しているもののため構成の自由度はほぼない。
###クラウド
他者が提供する仮想的なサーバーを設置できる環境のこと。
クラウドの中にサーバーを設置して利用する方法は個人・企業ともに多く採用されている。
メリットとして、構成の自由度も高く、課金制なので使った分だけの使用量となる。

##負荷分散

サーバーを複数台並列に用意してリクエストを振り分けて処理し、一台のサーバーの負荷を分散させることを負荷分散という。
負荷分散はロードバランサーが行い、これにより多くのアクセスを処理、サーバーの冗長化が実現できる。

###ラウンドロビン方式
各サーバーに順番にリクエストを振り分ける方式。処理の複雑さにばらつきがある場合は負荷に偏りができてしまう。

###動的分散方式
サーバーの負荷を監視し、負荷の少ないサーバーに優先してリクエストを振り分ける方式。
CPU使用率やメモリ使用量、ディスク負荷が「負荷」に定義される。

###パーシステンス
同一クライアントからのアクセスを判別し、常に同じサーバーへ転送する方式。
ログインなどを利用するシステムの場合はセッション管理がしやすくなる。

##サーバー設計・構築

###ディスク構成
ディスクとは、ハードディスクやSSDといったサーバーの記憶領域を指す。
データベースなど、重要なデータはサーバーのシステムデータと別のディスクに保存しておくことで、システムデータのディスクが破損した場合でも重要なデータを守ることができる。

またディスクが一つの場合でも、その内部を二分割にすることができ、パーティショニングという。


##データベース設計
大きく、論理設計と物理設計の二つに分かれる。

###論理設計
データベースに格納すべきデータの洗い出しとそのデータ同士の関連性を定義する。

>・格納すべきデータの洗い出し
EX.商品、在庫、注文、顧客、、、
・データの関連と多重度
EX.顧客と注文は１対多、注文と商品は1対多
・詳細な情報の洗い出し
EX.テーブル構造とデータ
・データの整理
EX.データの重複を無くすなど

###物理設計
論理設計で定義されたデータを実際のデータベース内にどのように格納するかを決めるのが物理設計。

・ここのデータをどのようなデータ型にするのか、
・頻繁に検索されるデータにインデックス（索引）をつける、
・文字列の文字コードを何にするか、

などを具体的に決める。

##ログ運用
機器が自分の行った処理をテキストファイルに記録していて、これをログファイルという。

・システムログ→OSが発生したイベントやエラーを記録するもの
・アプリケーションログ→ミドルウェアなどのアプリケーションが動作履歴を記録するもの
・アクセスログ→Webサーバなどが受けたリクエストを競ろくするもの

ログは何もしないと膨大なサイズになるから定期的にファイルを別のファイルに切り替えたり、削除する必要がある。
このようなメンテナンスをログ運用やログメンテナンスという。

###ログローテーション
ログファイルを切りわけ、別のファイルとして保存することでログの可読性を確保すること。
古いログファイルを削除してハードディスクの容量を圧迫しないようにするため、「ハウスキープ」よも呼ばれる。

###アクセスログの解析
Webサーバーのアクセスログにはユーザアクセスしたきた日時などの情報が記録されているてため、有効につ買えばサービスの向上や売り上げ増加にも使われる。
アクセスログを解析して参考となる情報を見ることを得ることをアクセス解析と呼ぶ。

##Webサイトのパフォーマンス
リクエストが送られてからユーザに対して画面が表示されるまでの時間などの指標をパフォーマンスという。

###パフォーマンスの指標
・応答時間→リクエスト送信から何らかのHTTP応答が帰ってくるまでの時間
・表示完了時間→Webページの表示が完了するまでの時間
・ページ読み込み時間→読み込みから読み込み完了までの時間
・可用性→エラーなくWebサイトにアクセスできた確率

###パフォーマンス監視
パフォーマンスはリクエストの数などのサーバーへの負荷で変化する。
定期的にパフォーマンスを監視して、低下を検知した場合はその原因を解決することを求められる。
原因の調査はサーバーごとのCPU使用率やメモリ利用率といったサーバーの負荷状態を監視することが重要である。

##脆弱性診断
セキュリティ確保のためには脆弱性診断が重要となる。

OSやミドルウェアなど外部のものは脆弱性情報データベースを定期的に確認し、利用している製品の脆弱性の有無を把握する必要がある。
自前で開発したものに関しては実際に擬似的なサイバー攻撃と同じ手法でWebシステムにアクセスを試みて、確認する。
この手法をペネトレーションテストという。
坂井 弘亮  2ステップで作る 組込みOS自作入門 備忘録(主に環境構築について)

[坂井 弘亮 2ステップで作る 組込みOS自作入門](https://www.amazon.co.jp/12%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E4%BD%9C%E3%82%8B%E7%B5%84%E8%BE%BC%E3%81%BFOS%E8%87%AA%E4%BD%9C%E5%85%A5%E9%96%80-%E5%9D%82%E4%BA%95-%E5%BC%98%E4%BA%AE/dp/4877832394/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=12%E3%82%B9%E3%83%86%E3%83%83%E3%83%97+os&qid=1566457088&s=gateway&sr=8-1) の備忘録です。環境構築で苦労したのでそれについてに主にまとめました。

## ホスト環境

- MacBook Pro (13-inch,2018,Four Thunderbolt 3 Ports)

- プロセッサ 2.3GHz Intel Core i5

- メモリ 16 GB 2133 MHz LPDDR3

- macOS Mojave Ver 10.14.5

## ハード

### 電源ケーブル、マイコン

電源ケーブル、マイコンは秋葉原の[秋月電子通商](http://akizukidenshi.com/catalog/)にて購入しました。マイコンはレジの店員さんに聞いたら倉庫から出してくださいました。電源ケーブルは自分の場合5Vを買いました。特に問題なく動きました。

### シリアルケーブル

自分はホストとしてMac Book Pro を使用したので

シリアルケーブル - USB Type-C 変換アダプタをアマゾンで購入しました。

購入したのは以下の商品です。

[DSD TECH SH-RS232B USB Type-C to RS232 シリアル 変換ケーブル FTDI FT232チップ付き MacBook Pro/Air 2018と他のUSB-Cラップトップ用](https://www.amazon.co.jp/gp/product/B07QGRQB9J/ref=ppx_yo_dt_b_asin_title_o05_s00?ie=UTF8&psc=1)

こちらの商品は別途ドライバーなどをインストールする必要がありませんでした。

## 環境構築

はじめUbuntu on Docker 上でやろうとしましたがうまくいかなかったのでVirtualBoxに[こちら](http://kozos.jp/books/makeos/#vmimage)で配布されているVMイメージをダウンロードしました。

[VMイメージダウンロード](http://kozos.jp/books/makeos/#vmimage)

## キーボードレイアウト変更

usキーボードを使用している方

```shell
loadkeys us
```

## VMイメージのパスワード

(一般ユーザ) ID:user Password:progtooluser

(スーパーユーザ) ID:root Password:progtoolroot

## 参考になったサイト

http://tkygtr6.hatenablog.com/entry/2018/02/25/201410

少し参考書と違うところがある(単純な間違いと思われる。)
h8writeディレクトリがないので作る。

## 注意事項

- make writeはsuでないと実行できない。

## minicom

はじめはScreenを使っていましたが4章以降ファイルの読み込み方法が
わからなかったので当参考書で説明があるminicomを使用しました。

- シリアルファイルはminicomを使用する場合``/dev/serial/by-id/usb-FTDI_USB_Serial_Conveter_FTEFGBJ1-if00-port0``だと長すぎる為記述できない。代わりに``/dev/ttyUSB0``が使用できる。

- ``minicom -s -o`` で設定画面起動

- ``minicom -o`` で通常起動

- ``C-a s`` で転送ファイル指定

- ``C-a x`` で終了

## リンカスクリプトについて

以下が参考になりました。

[リンカスクリプトの書き方](http://blueeyes.sakura.ne.jp/2018/10/31/1676/)
csv形式のanotationファイルをpklに変換する

#初めに
初投稿です、お手柔らかに。datasetのanotationがcsv形式だったので、Single Shot Multibox Detector(SSD)で使えるようにpklファイルに変換するときに書いたプログラムを置いておきます。

ちなみに、SSDの参考にさせていただいたのはこちらの記事です。
>https://qiita.com/slowsingle/items/64cc927bb29a49a7af14

数年前の記事なので、最新のverを使っている人はいくつか修正が必要だと思います。

##プログラム
日本語のコメントをうざったいぐらい入れてます（笑）

```python:csv_for_pkl.py
import pickle as pkl
import os
import csv
import numpy as np

class CSV_preprocessor(object):
    def __init__(self, data_path):
        self.path = data_path
        self.num_classes = 2   #クラス数
        self.data = dict()
        self._preprocess_CSV()

    def _preprocess_CSV(self):
        with open(self.path, 'r') as f: #fileをfとして読み込み
            reader = csv.reader(f)
            width =900   #画像の幅、anotationの中にあるならfor文内で取得してください
            height = 600   #画像の高さ
            flag = 1   #1行目をスキップするためのflag
            bounding_boxes = []
            one_hot_classes = []
            af = 'Non'

            for row in reader:
                if row[1] != af and af != 'Non':   #前の行のimage_idと異なるなら保存処理
                    image_name = af + '.jpg'
                    bounding_boxes = np.asarray(bounding_boxes)
                    one_hot_classes = np.asarray(one_hot_classes)
                    image_data = np.hstack((bounding_boxes, one_hot_classes))
                    self.data[image_name] = image_data
                    bounding_boxes =[]
                    one_hot_classes =[]

                if flag == 1:
                    flag += 1
                    continue
                #anotationがboundingboxの４点を持っていたので以下のような書き方に
                #なりました.値の場所が不変ならその値を入力してください
                xmin = (min([float(row[2]), float(row[4]), float(row[6]), float(row[8])])) / width
                ymin = (min([float(row[3]), float(row[5]), float(row[7]), float(row[9])])) / height
                xmax = (max([float(row[2]), float(row[4]), float(row[6]), float(row[8])])) / width
                ymax = (max([float(row[3]), float(row[5]), float(row[7]), float(row[9])])) / height
                bounding_box = [xmin, ymin, xmax, ymax]
                bounding_boxes.append(bounding_box)
                class_name = row[10]   #classの名前の場所
                one_hot_class = self._to_one_hot(class_name)
                one_hot_classes.append(one_hot_class)

                af = row[1]   #画像の名前の場所
 
            image_name = af + '.jpg'   #jpgで保存します
            bounding_boxes = np.asarray(bounding_boxes)
            one_hot_classes = np.asarray(one_hot_classes)
            image_data = np.hstack((bounding_boxes, one_hot_classes))
            self.data[image_name] = image_data
            bounding_boxes =[]
            one_hot_classes =[]

    def _to_one_hot(self, name):
        one_hot_vector = [0] * self.num_classes
        if name == 'class name':
            one_hot_vector[0] = 1
        
        elif name == 'class name':
            one_hot_vector[1] =1

        else :
            print('unknown label: %s' %name)

        return one_hot_vector

data = CSV_preprocessor('anotation pass').data
pkl.dump(data, open('train.pkl','wb'))

```
              
走り書きで書いたので、たぶんいろいろ直せるところはあると思います。
良かったらコメントしていってください。
list comprehension & map

list comprehension vs map + lambda

a = [1,2,3]
b = [4,5,6]

# list comprehension 1
c1 = [i for i in a]
output: [1, 2, 3]
# map 1
c2 = map(lambda i: i, a)
output:<map at 0x2d76be52240

list(c2)
output:[1, 2, 3]
# list comprehension 2
c3 = [i+j for i,j in zip(a,b)]
output:[5, 7, 9]
# map 2
c4 = map(lambda i,j: i+j, a,b)
output:[5, 7, 9]
# list comprehension *
c5 = [i+j for i in a for j in b]
output:[5, 6, 7, 6, 7, 8, 7, 8, 9]
PHPの配列をjson_encodeしたら、全角文字がユニコードになってハマった話。

タイトルのとおりの現象で、少々ハマりました。

結論としては、json_encodeの第2引数にJSON_UNESCAPED_UNICODEを指定すれば解決。

```php
$array = [
 'ほげ',
 'ふが',
];
$json = json_encode( $array, JSON_UNESCAPED_UNICODE );
```

みたいな感じで。
SQL Serverでスターリンソート

流行りが過ぎたところで投稿
二通りの方法が思いついたが、あまり粛清感が無い
DELETE を使用するべきだったかもしれない

```sql
/*************************************/
/***          STALIN SORT          ***/
/*************************************/
DECLARE @UNSTALINED AS TABLE(IDX int, SEED int);

--まずはデータを作成
WITH CREATE_SEEDS AS (
    SELECT 0 AS IDX
         , ABS(CAST(CAST(NEWID() AS binary(4)) AS int) % 10 + 1) AS SEED
    UNION ALL
    SELECT CREATE_SEEDS.IDX + 1 AS IDX
         , ABS(CAST(CAST(NEWID() AS binary(4)) AS int) % 10 + 1) AS SEED
    FROM CREATE_SEEDS
    WHERE CREATE_SEEDS.IDX + 1 < 10
)
INSERT INTO @UNSTALINED
SELECT IDX, SEED FROM CREATE_SEEDS;

--データを確認
SELECT IDX, SEED FROM @UNSTALINED ORDER BY IDX;

--Stalin.1
SELECT IDX, SEED
FROM @UNSTALINED AS MAIN
WHERE CASE WHEN
          (SELECT MAX(SEED)
           FROM @UNSTALINED AS SUB
           WHERE MAIN.IDX > SUB.IDX) > SEED
      THEN 0 ELSE 1 END = 1
ORDER BY IDX;

--Stalin.2
DECLARE @STALINED AS TABLE(IDX int, SEED int);

DECLARE STALIN CURSOR FOR SELECT IDX, SEED FROM @UNSTALINED ORDER BY IDX;
OPEN STALIN;

DECLARE @IDX  int;
DECLARE @SEED int;
FETCH NEXT FROM STALIN INTO @IDX, @SEED;

WHILE (@@fetch_status = 0)
BEGIN

    IF @SEED >= (SELECT ISNULL(MAX(SEED), 0) FROM @STALINED)
    BEGIN

        INSERT INTO @STALINED (IDX, SEED) VALUES (@IDX, @SEED);
    END

    FETCH NEXT FROM STALIN INTO @IDX, @SEED;
END

CLOSE STALIN
DEALLOCATE STALIN

SELECT IDX, SEED FROM @STALINED ORDER BY IDX;
```
Google Cloud Storage(GCS)の機能メモ

##はじめに
自分の勉強した内容の整理のためみGCPの基本的なことメモです。

Google Cloud Storage（以下、GCS）のアクセス制御について書きます。

##GCSの設定項目
AWSのS3と同じで構成要素としては、バケットとオブジェクトがあります。保存されたファイルをオブジェクトと呼び、保存される場所をバケットと呼びます。

###ロケーション
バケット作成時にロケーションが選択できます。以下の3つが選択可能です。
Region
Multi-region
Dual-region

###ストレージクラス
バケット作成のタイミングでアクセス頻度と冗長性レベルを以下の4つのストレージクラスから選択することができます。これがオブジェクトを格納する際のデフォルトのストレージクラスとなります。デフォルトのストレージクラスは、いつでも変更可能です。変更してもすでに格納しているオブジェクトのストレージクラスはそのまま維持されます。
- リージョナル
- ニアライン
- コールドライン

S3の場合は、コールドライン相当のGlacierは、基本取り出しリクエストを行ってから数時間でダウンロード可能になりますが、GCEのコールドラインはすぐにダウンロードできます。Glacierから高速に取り出すには、高速に取り出せるオプションを指定すれば素早くとりだせます。
https://dev.classmethod.jp/cloud/aws/glacier-restore-speed-upgrade/

###権限設定
権限は、バケット、オブジェクトの単位で設定可能です。また、権限を付与する対象の違いでIAMとACLを使い分けます。

ユーザやインスタンスに対して許可を付与したい場合は、IAMを使用します。バケットやオブジェクトに対して誰が操作してもよいかを許可したい場合は、ACLを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/4338e6b6-4279-ffeb-9f9b-557f7375e9bb.png)

###ライフサイクルポリシー
S3と同じくライフサイクルポリシーが付与可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/2086532e-2b8a-ff01-0f60-2c8b68650ce0.png)

###リテンション
削除保護としてリテンションポリシーが付与可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/11933c7c-a5d2-7fa5-3052-da62c74e2eef.png)

###投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
(メモ)Java クラス・変数・メソッド

#クラス
クラスは設計図のようなものです。
javaはプログラムをクラスという単位で作成します。
記述するときは「class」の右側にクラス名を記述し{ }（ブロック）で囲んで作成します。

```java
class Hello{
  public static void main(String[] args) {
    System.out.println("Hello World");
}
```

#変数
変数というのは、データの属性で名前を付けて一時的に保存する箱のようなものです。変数の型は、大きく分けて2種類あります。

**基本型(基本データ型・プリミティブ型)**
８つの型があります。基本型の変数は、値を直接管理しています。

+ 基本型
  + byte(1バイト整数)
  + short(短い整数)
  + int(整数)
  + long(長い整数)
  + float(単精度浮動小数点数)
  + double(倍精度浮動小数点数)
  + char(文字)
  + boolean(論理)



**クラス型(参照型)**
無限にある｡(存在するクラスの数だけあります｡)
クラス型の変数がある…という事は､そのクラスが存在するという事です｡
クラス型の変数は､そのクラスのコピー(のアドレス)を管理します｡
またクラスの1文字目は大文字で記述します。

#メソッド
メドッドとはプログラムを実行するための命令のことです。

#コードを書いてみよう

名前を入力すると、
*おかえりなさいませ（名前）さま*
と出力するプログラム。

```java
import java.util.Scanner;

class BackHome{

  public static void main(String[] args){
    Scanner stdIn = new Scanner(System.in);

    System.out.print("お名前を教えてね：");
    String s = stdIn.next();

    System.out.println("お帰りなさいませ" + s + "さま");
  }
}
```

**入力手続き１**
Scannerクラスを使用するための準備です。

```java
import java.util.Scanner;
```

**入力手続き２**
Scannerクラスを使用するための変数「scanner」を初期化しています。

```java
Scanner stdIn = new Scanner(System.in);
```

**クラス作成代入**
1. Stringクラス型の変数sを宣言[String s]
2. 入力された文字列を管理した､Stringクラスのコピーが生成されます。クラスのコピーは､コンピュータのメモリのどこかに生成されます。[stdIn.next();]
3. クラスのコピーの住所(アドレス)が､変数sに代入されます。[=]

```java
String s = stdIn.next();
```

**出力**
（変数sを指定すれば､その中にあるアドレスを辿った先にある文字列を利用できます｡）

```java
System.out.println("Hello" + s + "!!");
```
![19-08-22-15-40-13-166_deco.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434899/a54700b6-e414-258b-278f-b9f56772c704.jpeg)
BootstrapのFlex Layoutを使った、コンポーネント(2つ)を左右に配置する方法

# やりたかったこと

下図のような感じで画面の両端にコンポーネントを配置したいなあと思っていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275511/4baff1fd-0761-d694-c016-108631a25f17.png)

## 解決方法
左側に配置したいコンポーネントのクラスに`mr-auto`を追加しました。

コード

``` :pug
  b-container
    b-row
      b-col.mr-auto(cols="auto")
        div タイトル
      b-col(cols="auto")
        b-button.download ボタン
```


## mr-auto

このクラスが追加された要素の右側のマージンを、右側のコンポーネントまで詰めることができます。
↓こんな感じ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275511/03805238-f89a-d55b-58ad-e90131f7ad5e.png)


## 詰まっていたところ

CSSの`float`プロパティでできると思っていたのですが、flexではできない？

## 備考
右側のコンポーネントの`cols`だけを`auto`にしてもできるけど、ちゃんとやりたいならマージンを使った方がいいのかなあと思います。

## 参考文献
[Margin utilities on columns - Layout and Grid System _ Components _ BootstrapVue](https://bootstrap-vue.js.org/docs/components/layout/#margin-utilities-on-columns)
[CSS3: Bootstrap 4 Beta でグリッドレイアウトの offset クラスがなくなる](http://www.sirochro.com/note/css3-bs4-offset/)
grepを多重で実行する

１つのファイルに対して、沢山のパターン検索をしたい時に、grep -f pattern_fileでも良いのですが、ファイル内の全てのパターンを展開して実行してしまうみたいで、もの凄くメモリを食います。grep -e pattern1 -e pattern2 ・・・・-e patternXみたいな感じですね。

forループで1つのパターン毎にgrepを実行する方法もあります。

```
for i in `cat pattern_file`
do
   grep -E $i target_file >> grep_result.txt
done
```

これだと1つのパターンに対して1回ずつgrepを起動するので、パターンの回数実行されます。CPUを沢山積んでいるマシンの場合には、勿体ないですね。

そこで、本題です。xargsを使って多重起動してgrepを実行します。実行するコマンドはgrepでなくても良いので応用が可能ですね。

多重起動して、結果を同じファイルに書き込むと場合によってはファイルが壊れる可能性があるので、念のためfifoを経由してファイルへ書きます。(何度か実行しても問題はなかったんですが)

手順としては、以下の感じです。
1. fifoを作る
2. fifoから読みだして、ファイルへ保存するコマンドをバックグラウンドで動かす(別ターミナルでやった方が良いかも)
3. xargsでgrepを動かす。

```
$ mkfifo myfifo

$ cat ./myfifo > grep_result.txt &

$ xargs -a pattern_file -P4 -L1 -d '\n' -I% sh -c "grep -E '%' target_file > ./myfifo"
```

- -P4： 多重度(CPUの数に合わせて適当に)
- -L1： 1回のgrepに渡す引数の数。改行で区切られている前提
- -d '\n'： デリミタ、ここでは改行を指定しているい。これを指定する事により、ダブルクォートなどはそのまま渡される。逆にこれを指定しないとダブルクォートなどは取り除かれてしまうので、想定される結果が得られない事がある。
- -I%： 実行するコマンドの中で、引数が置き換えられる位置を指定する。ここでは%を指定して、grepコマンドの検索パターンの部分の%の位置で置き換える。よくあるのは{}ね。

ファイルをリダイレクトする場合は、shの引数としてリダイレクトも含めて実行するコマンドを指定する。
リダイレクト先にfifoを指定しているのは、同時に複数のコマンドで同じファイルへ書き込むと欠落したり、ファイルが壊れるのを防ぐためにfifoで排他制御してもらうため。
別に直接grep -E pattern target_file > grep_result.txtとかやっても問題なく動きはしたんだが、Unixの原理上壊れる事があるはずなので、念のため。

xargsの実行が終わると、バックグラウンドで動かしていたcatは自動的に終了する。

限られた時間内で作業しなくちゃいけなくて、CPUの数に余裕がある場合は、こんなやり方でやると、時間が大幅に短縮できます。forで1時間くらいかかったのが、xargsで4多重にしたら、10分程度で終わりました。その代わりCPUの負荷はかな～り高かったですけどね。
NullMailかどうかをチェックする

`mail`メソッドで返却されるオブジェクトは`ActionMailer::MessageDelivery`にラップされてるので、`.message`を使うのがポイントです。

```rb
require 'rails_helper'

RSpec.describe MyMailer, type: :mailer do
  describe '.hoge' do
    subject { described_class.hoge }

    context 'when something is wrong' do
      it 'returns NullMail' do
        expect(subject.message).to be_a ActionMailer::Base::NullMail
      end
    end
  end
end
```

## 参考
- [ActionMailerは何をしているのか \- Qiita](https://qiita.com/fursich/items/bb75a06714bcad6a0afb)
- [rails/base\.rb at master · rails/rails](https://github.com/rails/rails/blob/master/actionmailer/lib/action_mailer/base.rb)
MakeShop独自ドメイン利用でAnalyticsのCookieが途切れる問題

### やりたかったこと
MakeShopのECサイトを独自ドメインで運用しているショップでGoogleAdwordsの効果を確かめたい

### 問題点
MakeShopでは、かなりの高額プランのものでない限り、購入画面でmakeshopドメインに遷移してしまう。それ自体はいいのだが、その際に本来引き継がれるはずのCookieが切れてしまい、広告効果が測れない。

### 原因
MakeShop側のJavaScriptの記述順に問題ありの模様

```javascript:view/asset/system-1-1-6-4...

if (pageData.attr('data-order-google-analytics-enabled') === 'Y') {
 ga('linker:decorate', document.getElementById('makeshop-form-common-order'));
   }
if (data.service_type == 'amazon') {
  $('#makeshop-form-common-order 
  input[name=amazon_login_type]').val('amazon_basket_order');
  }
       
 $('#makeshop-form-common-order').attr('action', data.order_url);
 $('#makeshop-form-common-order').submit();
```

本来はこの最初のif行が最後に来るべきところ。。。とはいえ、MakeShopに文句言っても仕方ないので、

###解決策
MakeShopの「アクセス解析用のタグ」という追加入力のところにこんな感じで入れとけばOK
「AW-XXXXXXXXX」部分は適宜差し替え。

```html
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-XXXXXXXXX"></script>
<script>
 window.dataLayer = window.dataLayer || [];
 function gtag(){dataLayer.push(arguments);}
 gtag('js', new Date());
 gtag('config', 'AW-XXXXXXXXX');
window.addEventListener('load', function(){
   var addToCartForm = document.getElementById('makeshop-form-common-order');
   if(!addToCartForm || !window.location.pathname.includes('\/cart'))return;
   addToCartForm.onsubmit = function(e){
      ga('linker:decorate', document.getElementById('makeshop-form-common-order'));
   };
});
</script>
```
【初心者向け】Laravel プロジェクトを clone してブラウザ表示するまで


Laravel のプロジェクトを clone してきて、SQLite3 に接続して、ブラウザで表示する方法は意外とまとまっていなかったので記事にしました。

## 推奨環境
- MacOS Mojave バージョン10.14.2
- Laravel Framework 5.8.31 
- sqlite3 3.24.0


## やり方
####  1. 対象の Laravel プロジェクトを clone してくる

```
$ git clone リポジトリ URL
```

#### 2. プロジェクトのリポジトリに移動し、vendor ディレクトリがないことを確認
```
$ cd projectName
$ ls
```

#### 3. Composer がインストールされていなかったら
```
$ brew install composer
```

#### 4. ライブラリインストール
```
$ composer install
```
vendor ディレクトリが作成されるはず。

#### 5. ディレクトリ下の`.env.example`の内容を`.env`にコピー
```
$ cp .env.example .env
```
clone してきた Laravel プロジェクトは `.env` ではなく `.env.example` というファイル名になっているので変更する必要がある。

#### 6. アプリケーションキー(APP_KEY)を設定する
```
$ php artisan key:generate
```
.env ファイルの中身を見ると、`APP_KEY` の内容が `APP_KEY=SomeRandomString` となっているため、変更する必要がある。

#### 7. SQLite3 の準備
```
$ touch database/database.sqlite
```
database ディレクトリに `database.sqlite` が作られる。


#### 8. .env ファイルの設定
エディタや vim などで .env ファイルの該当箇所を以下のように書き換える

```
~略~
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=homestead
# DB_USERNAME=homestead
# DB_PASSWORD=secret
~略~
```
DB_HOST以下はいらないのでコメントアウト。
SQLite3 の配置場所やファイル名を変更する場合は、`DB_DATABASE` に絶対パスで指定しましょう。

#### 9. migrate 実行
```
$ php artisan migrate
```

#### 10. いつものようにサーバーを立ち上げる
```
$ php artisan serve
```
http://127.0.0.1:8000 にアクセス
【EC2】wp-cli をインストール

# wp-cli とは
- WordPress のコマンドライン操作を可能にするツール

＃手順
- EC2にログイン
- wp-cli のインストール

```
$ sudo su -
# curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
  →カレントディレクトリに「wp-cli.phar」が作成される
```

```
# ll /usr/local/bin | grep wp
# mv wp-cli.phar /usr/local/bin/wp
# ll /usr/local/bin | grep wp
-rw-r--r-- 1 root root 5542314 Aug 20 09:09 wp

# chmod +x /usr/local/bin/wp
# ll /usr/local/bin | grep wp
-rwxr-xr-x 1 root root 5542314 Aug 20 09:09 wp
```

- wpコマンドの動作確認

```
# wp --info
OS:	Linux 4.14.133-113.112.amzn2.x86_64 #1 SMP Tue Jul 30 18:29:50 UTC 2019 x86_64
Shell:	/bin/bash
PHP binary:	/usr/bin/php
PHP version:	7.3.6
php.ini used:	/etc/php.ini
WP-CLI root dir:	phar://wp-cli.phar/vendor/wp-cli/wp-cli
WP-CLI vendor dir:	phar://wp-cli.phar/vendor
WP_CLI phar path:	/home/ec2-user
WP-CLI packages dir:
WP-CLI global config:
WP-CLI project config:
WP-CLI version:	2.3.0```
【メモ】Cookie（野性爆弾ではない）

## COOKIEデータ
名前と値のセットで指定する。
EX) name=kawashima;

## 有効期限
以下の2種類のいずれかの方法でセットする。両方指定していた場合はmax-ageが優先される。
未設定の場合はセッション切れとともに消滅する。
### expires
消滅までの日付をUTC形式でセットする。
#### 365日後に消滅する例
expires='Fri, 21 Aug 2020 04:41:48 GMT';

#### UTC形式取得方法（javascript）
1年後の日付をUTCで取得する関数です。
コピペする場合、関数名や引数とかは適宜変えて下さい。

```javascript:sample.js
function cookieDeadlineUTC(days=365){
  var expire = new Date();
  expire.setTime(expire.getTime() + 1000*3600*24*days);
  return expire.toUTCString();
}
```

### max-age
消滅までの秒数でセットする（IE6,7,8は非対応）
#### 10分後に消滅する例
max-age=600;

## 有効範囲 
セットしたCOOKIEの有効範囲をセットする。
### domain
未設定：現ドメイン下で有効になる。ただしサブドメインは対象外。
設定：現ドメイン、サブドメイン下で有効になる。
#### ketabawo.asia内で有効化する例
domain=ketabawo.asia;

### path
複数指定は半角カンマで区切れば良さそう（要調査）でも基本はドメインルート（未設定or[/]）指定でOK。
未設定：対象ドメイン下で有効となる。
設定：セットしたディレクトリ下で有効となる
#### /hogeディレクトリ下で有効にする例
path=/hoge;

## まとめ
10日間、ドメインgoogle.com内で有効なクッキー名「user」、値「premium」をセットする例

```javascript:sample.js
document.cookie = 'user=premium; max-age=86400; domain=google.com;';
```

pathは未設定でルートとなるため指定しない

### 削除するには？
max-ageを0にすれば消えます。
もし消えない場合はdomainやpathも空の値でやってみてください。
#### 上記cookieを消す例

```javascript:sample.js
document.cookie = 'user=; max-age=0;';
//もしくは
document.cookie = 'user=; max-age=0; domain=; path=;';

```
[Rails] Could not load the 'listen' gem. Add `gem 'listen'` to the development group of your Gemfile (LoadError)

```
$ rails s
```
しようとしたら、

```
.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/
activesupport-5.1.7/lib/active_support/dependencies.rb:292:in
 `require': Could not load the 'listen' gem. Add `gem 'listen'`
 to the development group of your Gemfile (LoadError)
```
と怒られた。

config/environments/development.rb内の

```:config/environments/development.rb
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
```
をコメントアウトしたらいけた。


参考: https://www.oipapio.com/question-890966


>config.file_watcher: config.reload_classes_only_on_changeがtrueの場合にファイルシステム上のファイル更新検出に使われるクラスを指定します。デフォルトのRailsではActiveSupport::FileUpdateChecker、およびActiveSupport::EventedFileUpdateChecker（これはlistenに依存します）が指定されます。カスタムクラスはこのActiveSupport::FileUpdateChecker APIに従わなければなりません。

https://railsguides.jp/configuring.html より
GooglePlayの新しい評価が公開されてた件

自分の手元でPlayStoreを久々にみたところレビューが思ったよりも高くなっていてびっくりしました。

**3.9 => 4.6**

あれ！？どうしたのかなと思ったらコンソール上にこのように表示されていました。
![スクリーンショット 2019-08-22 14.26.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170870/ddb4de03-39e7-fe78-70a6-f4c4d9d79639.png)

# 新しい評価？とは
[I/O 2019: New features to help you develop, release, and grow your business on Google Play](https://android-developers.googleblog.com/2019/05/whats-new-in-play.html)
上のサイトに書かれていたのを一部抜粋すると・・・。

```
We’re also making big changes to another key source of performance data:
your user reviews. Many of you told us that you want a rating that reflects a more current version of your app,
not what it was years ago — and we agree. So instead of a lifetime cumulative value,
your Google Play Store rating will be recalculated to give more weight to your most recent ratings.
Users won’t see the updated rating in the Google Play Store until August,
but you can preview your new rating in the Google Play Console today.
```


**何年間も積み重なったレビューの累積値ではなく、最新の評価の方が重要視されるようにGoogle Playストアの評価が再計算されるようです。** 
↑英語よめないので間違ってたらコメントください。

# 新しい評価が全ての人に表示されてるの？
違うみたいです。
![スクリーンショット 2019-08-22 14.35.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170870/61181511-3938-bfb6-7532-5471fd26dd22.png)
まだ一部ユーザーだけでした。

# 結果
最近良いレビューがついていてよかったなぁとホッとしました。
マーケティングに携わる人とか困ったりしないのかなぁ・・・。
CQRSで書き込み側から読み込み側へ漏れなく投影するための方法考察

#はじめに
CQRSで書き込み側と読み込み側を分けた際に、読み込み側を最新に保つ方法について考察してみます。

#参考サイト

+ [The unfinished guide to Event-Sourcing, CQRS and DDD [Unreleased, RAW] + notes about Uber][The unfinished guide to Event-Sourcing, CQRS and DDD Unreleased, RAW + notes about Uber]
+ [Choosing an architecture][]
+ [Event Sourcing - Projections][]
+ [Some thoughts on using CQRS without Event Sourcing][]
+ [Tackling Complexity in CQRS][]

#考察の元とするCQRSの図
[Tackling Complexity in CQRS][]から引用
下図のProjection Enginesの部分についての考察です。
![image.png](https://vladikk.com/images/cqrs/cqrs-diagram.png)


#Pub/Subパターンで最新に保つ
Projection EnginesがPub/Sub機能を持つなにがしかを購読しといて、発行されたら読み込み側に投影します。
書き込み側にPub/Sub機能があればそれを使用しますし、
RDBMSのようにPub/Sub機能がなければ[Google Cloud Pub/Sub](https://cloud.google.com/pubsub/docs/overview?hl=ja)、[Amazon SQS](https://aws.amazon.com/jp/sqs/)、[Azure Service Bus](https://azure.microsoft.com/ja-jp/services/service-bus/)のようなPub/Subサービスを利用、もしくは自前で用意する必要があります。

EventStore用のDBである[EventStore](https://eventstore.org)にはPub/Sub機能がついているのでお勧めです。

書き込み側をイベントベースで実装している場合は、読み込み側に必要なイベントだけを購読して投影することができます。
書き込み側を[状態ベース(State Based Projections)][Tackling Complexity in CQRS]で実装している場合は、読み込み側に必要な集約だけを購読して投影することができます。

Pub/Subパターンだけだとメッセージが発行されなかった場合、読み込み側が最新にならないので別の方法でも監視する必要があります。

#Pollingで最新に保つ
Projection Enginesが書き込み側を定期的にチェックして、必要な情報が更新されていたら読み込み側に投影します。

更新されているか否かの目印になる情報は

+ 書き込み側をイベントベースで実装している場合は、イベント毎にインクリメントされるEventNumber([EventStore](https://eventstore.org)だと)
+ 書き込み側を[状態ベース(State Based Projections)][Tackling Complexity in CQRS]で実装している場合は、SQL Serverで言うところの[rowversion](https://docs.microsoft.com/ja-jp/sql/t-sql/data-types/rowversion-transact-sql?view=sql-server-2017)やその行の更新日時列

が使えるかと思います。
Pollingだけだと書き込み側の情報量にもよりますが、読み込み側への反映が遅いかもしれません。

#二系統用意することで最新に保つ
読み込み側を主、副の二系統用意します。
主が動作中に、副を破棄して

+ 書き込み側をイベントベースで実装している場合は、全てのイベントをリプレイすることで最新の状態にします
+ 書き込み側を[状態ベース(State Based Projections)][Tackling Complexity in CQRS]で実装している場合は、必要な集約の情報を取得して最新の状態にします

主と副を切り替えます。

これを繰り返すことで読み込み側を最新に保てそうです。
可用性を高めるために二系統用意していても、いざというときに動作するかは不安なので常日頃から使うような運用にすれば安心できる気がします。

#まとめ
二系統用意する話は無理やりな気はしてます。
他に有効な投影方法があればご教示ください。

CQRSで書き込み側と読み込み側を分割するメリットデメリットでいつも悩みます。
(結局はアプリの規模感次第だとは思いますけど。書き込みと読み込みが同一でもCQRS自体は出来ますし)

メリット

+ 読み込み側が別にDBじゃなくても良い(ファイルとかBLOBに書き出して常に上書きするとか)
+ 読み込み側のスケーラビティが向上する。
+ マイクロサービスへの第一歩

デメリット

+ Projection Enginesという投影するための仕組みを用意する必要がある
+ 結果整合性を許容しなければならない



[The unfinished guide to Event-Sourcing, CQRS and DDD Unreleased, RAW + notes about Uber]:https://medium.com/@vladimirmetnew/the-unfinished-guide-to-event-sourcing-cqrs-and-ddd-unreleased-raw-ff798b554837

[Choosing an architecture]:https://medium.com/margobank/choosing-an-architecture-85750e1e5a03
[Event Sourcing - Projections]:https://abdullin.com/post/event-sourcing-projections/
[Some thoughts on using CQRS without Event Sourcing]:https://medium.com/@mbue/some-thoughts-on-using-cqrs-without-event-sourcing-938b878166a2
[Tackling Complexity in CQRS]:https://vladikk.com/2017/03/20/tackling-complexity-in-cqrs/
PowerApps コンポーネントフレームワーク : CSS を使った画面全体の上書き

今回は Tips として、CSS を使った画面全体の上書きについて紹介します。

# PCF の CSS ファイル

これまで紹介してきた CSS ファイルは、すべて名前空間を利用して、既存の CSS と競合しないように設定されていました。

例: SampleNamespace 名前空間における各要素の CSS 定義

```css:TS_LinearInputControl.css
.SampleNamespace\.TSLinearInputControl input[type=range].linearslider {
  margin: 1px 0;
  background: transparent;
  -webkit-appearance: none;
  width: 100%;
  padding: 0;
  height: 24px;
  -webkit-tap-highlight-color: transparent
}

.SampleNamespace\.TSLinearInputControl input[type=range].linearslider:focus {
  outline: none;
}

.SampleNamespace\.TSLinearInputControl input[type=range].linearslider::-webkit-slider-runnable-track {
  background: #666;
  height: 2px;
  cursor: pointer
}

.SampleNamespace\.TSLinearInputControl input[type=range].linearslider::-webkit-slider-thumb {
  background: #666;
  border: 0 solid #f00;
  height: 24px;
  width: 10px;
  border-radius: 48px;
  cursor: pointer;
  opacity: 1;
  -webkit-appearance: none;
  margin-top: -12px
}

.SampleNamespace\.TSLinearInputControl input[type=range].linearslider::-moz-range-track {
  background: #666;
  height: 2px;
  cursor: pointer
}

.SampleNamespace\.TSLinearInputControl input[type=range].linearslider::-moz-range-thumb {
  background: #666;
  border: 0 solid #f00;
  height: 24px;
  width: 10px;
  border-radius: 48px;
  cursor: pointer;
  opacity: 1;
  -webkit-appearance: none;
  margin-top: -12px
}

.SampleNamespace\.TSLinearInputControl input[type=range].linearslider::-ms-track {
  background: #666;
  height: 2px;
  cursor: pointer
}

.SampleNamespace\.TSLinearInputControl input[type=range].linearslider::-ms-thumb {
  background: #666;
  border: 0 solid #f00;
  height: 24px;
  width: 10px;
  border-radius: 48px;
  cursor: pointer;
  opacity: 1;
  -webkit-appearance: none;
}
```

これらの CSS ですが、名前空間を省略して、かつ !important 指定をすると既存のコンポーネントの CSS を上書きすることができます。

```css
label{
color:red !important;
}
```

このような CSS を持ったコントロールをフォームに展開すると、以下のように表示がカスタマイズされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/d5e58ddb-cab9-b33b-6c02-999ac2366a85.png)

# まとめ

IFrame と違い直接埋め込まれるコントロールならではのハック方法ですが、既存の表示などがどこまで CSS に依存するか不明のため、あくまで自己責任でお試しください。

[目次に戻る](https://qiita.com/kenakamu/items/5dd4c64b14c453fa7d85)
機械学習をブラウザ上で手軽に行えるStackMLのおぼえがき

# <a href="https://stackml.com/" target="_blank">StackML</a>とは？
ブラウザ上で機械学習が行えるサービスで、顔検出、画像分類、ポーズ検出などが行え、無料で利用することができます。

# StackMLを使うには
- 利用登録を行う。
    <br>StackMLのサイトの` GET STARTED FREE `をクリックしてアカウントを作成します。外部アカウントを使用してアカウントを作成することもできます。使用できる外部サービスのアカウントとして、TwitterとGoogleがあります。

# アカウントが作成できたら
` GET STARTED FREE `となっていた部分が、` GO TO DASHBOARD `となります。<br>ダッシュボードに移動して、サービスを利用します。

# ダッシュボードに移動
元からあるモデルを使用する` Select a model `と、自分で機械学習モデルを作成できる` Training `という項目があります。

# 画像分類を使ってみる
StackMLのダッシュボードにあるModelsの` Image classification `を使用します。<br>
` INPUT SOURCE ` のドロップダウンメニューから` Image Upload `を選択し、` Choose File `をクリックし、分類したい画像をアップロードします。アップロード後、予測ボタンの` Predict `をクリックして予測することができます。<br>
皇帝ペンギンの画像を分類にかけたところ、99.2%の確立でキングペンギンとなりました...。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483911/50d3fd3c-6388-ae64-5e9c-4a5985e64e02.png)

# 機械学習を行ってみる
ダッシュボードのTRAINから、機械学習を行います。<br>` Model Name `には、学習させる画像の名前などを指定します。` Model Type `には、学習させたいモデルを選択します。<br>
` MobileNet classifier `、` numeric classification `、` numeric regression `から選べますが、画像分類に使用するので、GoogleのMobileNetを使用します。<br>
学習させたい画像をフォルダにまとめて、アップロードします。ここでは、エンペラーペンギンとキングペンギンの画像を学習させます。Penguinフォルダの中に、emperorとkingフォルダを作成し、その中に画像を入れます。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483911/0a001826-efc6-b702-1d36-da85f8cef92a.png)
画像のアップロード後、` Train `ボタンで機械学習を行えます。学習が完了した後は、ポップアップが表示され、ダウンロードとモデルのテストが可能です。![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483911/1fe75b2d-7a43-d528-8e85-2b82a2e01ee0.png)


# 機械学習で作ったモデルを使用してみる
` MODELS `の` MY MODEL `に先ほど学習させたモデルが選択できるので、` Image classification `で作成したモデルをテストします。<br>
画像を選択してアップロードし、分類させます。![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483911/cb490a31-429f-b034-136f-81802518d366.png)
結果として、0の確立が72.9%となりました。学習させたフォルダの0番目、つまりアルファベット順ではエンペラーペンギンのフォルダということになります。つまり、エンペラーペンギンの確立が72.9%ということになります。

# 最後に
ブラウザ上で機械学習が手軽にできる良いサービスだと思いました。SONYの<a href="https://dl.sony.com/ja/" target="_blank">Neural Network Console</a>のようにブラウザで機械学習ができるサービスはありますが、有料が多いので、無料で利用できるのは試しにやってみようと思えます。<br>StackMLはAPIが公開されているので、TensorFlowでコードを書くよりも低難易度で機械学習アプリを作ることができ、機械学習のハードルを下げる良いサービスだと思います。
AWS Loft Tokyoに行ってみたよ

#はじめに
前から興味はあったけど、敷居が高そうでなかなか行けてなかったけど特攻してみました。
プログラミングに触れて３ヶ月、AWSは無料枠しか使っていない私でも入れるものなのか…

#基本情報
まず軽くAWSLoftTokyoの情報から
[細かい情報は公式さんで](https://aws.amazon.com/jp/start-ups/loft/tokyo/)

>AWS Loft は、AWS を利用中のスタートアップおよびデベロッパーのための施設です。
リラックスした雰囲気のコ・ワーキングスペースや毎週開催される様々なセミナー、AWS のテクノロジーに熟達した AWS のソリューションアーキテクトやサポートエンジニアへいつでも技術的な相談が可能な「Ask An Expert カウンター」もご用意しております。
ぜひ AWS Loft Tokyo へお越しください。 

ざっくりAmazonがAWSの利用者に対して、提供している場所です。
会社でディベロッパーやってる人とかしか入れないと思っていたのですが、アカウントさえ持っていれば入れるそうなのできてみました。ちなみに無料枠しか使っていないようなアカウントです。

#いざ潜入
ビルに入ると受付があり、警備員にAWSLoftを利用しにきた旨を伝えます。その後すんなりエレベーターで１７階へ。
受付で初回に確認されることは
・AWSアカウントのマイアカウントのページ→登録にIDが必要なのと、アクティブなユーザーかを確認してるようです
・本人確認書類→免許証など。名刺２枚でもいいらしいです
・個人情報→住所やら。職業を記入するところがありますが、無職ならfreeとか書いておけばいいそうです。
以上を入力したら、一通りの説明と入場者用のシールを渡されます。
ここに名前とか会社名、職種が記入されるので適当には書かない方がいいです！あとwifiの情報も書いてあります。
シールを見えるところに貼ったらあとは自由に使えます。
ちなみに２回目以降はメールアドレスの入力と、本人確認書類だけでいいそうです。

#中の印象
非常に良いです。その一言につきます。
中にドリンクを売っているところがありますが、安いですしウォーターサーバーも無料でありますし。
予想はもう少しカジュアルな場所かと思っていましたが、どちらかと言えば、みんな集中して黙々と作業をしている感じです。
内装は如何にもWeb系キラキラ環境みたいな感じでむしろ場違い感すらあります。
昼過ぎに行ったのですが、８割くらい席が埋まっていました。
中の情報は公式さんや他の投稿の方が参考になると思うので割愛します。

#まとめ
特攻した甲斐がありました。どうやら本当にアカウントさえ持っていれば職業としてエンジニアじゃなくても問題なく利用出来る場所の様なのでぜひ近くの方は一度利用してみると良いと思います。
個人的には普段勉強している渋谷よりも近いですし、雰囲気も非常に好みなので、しばらく機会があればこちらで勉強しようかなと思いました！
【MySQL Workbench】Unknown table 'COLUMN_STATISTICS' in information_schema (1109)が発生

#はじめに
久しぶりにMySQLWorkbenchでDumpを出力しようとしたら、表題のエラーが発生。
対処方法を調べたら英語のページしか見つからなかったので、自分記録用に記事を書いてみた。

#発生したエラー

```sql
mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM,
'$."number-of-buckets-specified"') FROM
information_schema.COLUMN_STATISTICS WHERE SCHEMA_NAME = 'スキーマ名' AND
TABLE_NAME = 'テーブル名';':
Unknown table 'COLUMN_STATISTICS' in information_schema (1109)
```

information_schema スキーマに「COLUMN_STATISTICS」というテーブルが無いと怒られた。

#対象方法
MySQL Workbench 8.0の場合、データのエクスポートが正常に行われないケースがあるらしい。

## まずはWorkbenchのバージョン確認

###確認方法
1.MySQL Workbenchを起動する
2.画面上部の「Help」メニューを開く
3.「About Workbench」を選択
4.バージョンが表示される『Workbench バージョン番号』

MySQL Workbench 8.0でした。

###設定変更手順
1.MySQLWorkbenchを起動する
2.画面上部「Server」メニューを開く（Managementタブを開いてもいい）
3.「Data　Export」を選択
4.右上の「「Advanced Options...」をクリック  
<img width="475" alt="設定画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124751/1fe8875e-de05-f691-476b-9297d7627a32.png">

5.Other の中にある「column-statics -Writing……(set 0 to diasble).」を"0"に設定
![設定画面_設定場所.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124751/a2b0d72a-e208-31fc-ad80-3d4d524c9826.png)

更新・設定反映ボタンは特になかったので[<Return]で戻った。
###再度エクスポート
エクスポート正常終了したのでOK

##コマンドで実行する時は
mysqldumpオプションに「**--column-statistics=0**」を追加すればよいらしい。

```sql
mysqldump --column-statistics=0 --host=<server> --user=<user> --password=<password> 
```
# まとめ
mysqldump 8.0.2で新しく追加されたオプション[--column-statistics]
これが古いバージョンだと対応できずにエラーが発生したのでは？と推測できる。

公式でオプションの内容を調べたが、正直どういう使い方をするためのオプションなのか、その優位性を理解するまでには至らなかったので、古い(ver8.0以下)MySQLを使用するケースがある方はデフォルト「0」に設定しておいてとりあえずは問題ないだろう。

# 参考
- [【公式サイト】 mysqldump — A Database Backup Program](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html)
- [【serverfault】 mysqldump throws: Unknown table 'COLUMN_STATISTICS' in information_schema (1109)](https://serverfault.com/questions/912162/mysqldump-throws-unknown-table-column-statistics-in-information-schema-1109)
【RDS for PostgreSQL】EC2からRDSへのログイン方法

# 前提
- EC2作成済み
- RDS作成済み

# 手順
## １）EC2にpsqlをインストール
- EC2にログイン
- リポジトリからパッケージを検索

```
$ yum search postgresql
（略）
postgresql.x86_64 : PostgreSQL client programs
（略）
```
- パッケージのインストール

```
$ sudo yum -y install postgresql.x86_64
```
- インストール済みのパッケージ確認

```
$ yum list postgresql
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
インストール済みパッケージ
postgresql.x86_64                                         9.2.24-1.amzn2.0.1                                         @amzn2-core
```
- psqlのバージョン確認

```
$ psql -V
psql (PostgreSQL) 9.2.24
```

## ２）EC2からRDS for PostgreSQLへログイン
- ログイン

```
$ sudo psql --host=pos-test.xxxxx.us-west-2.rds.amazonaws.com  --port=5432 --username=db_user --password --dbname=pos_test
ユーザ db_user のパスワード:xxxxx
```

| オプション| 説明 | 
|:-----------------|------------------|
|--host|  エンドポイント名|
| --port| ポート番号|
|--username|マスターユーザ名|
|--dbname|DB名|

- ログインできたのでバージョンでも確認してみる

```sql
pos_test=> SELECT version();
                                                version
--------------------------------------------------------------------------------------------------------
 PostgreSQL 10.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit
(1 行)

```

- PostgreSQLの接続を切断

```sql
pos_test-> \q
```
GCEへのリモートアクセス整理

##はじめに
自分の勉強した内容の整理のためみGCPの基本的なことメモです。

AWSで言うところのSession MangaerのようにPrivate Subnetのインスタンス(PublicIPが付与されていないインスタンス)に直接リモートアクセスする仕組みはない。

###リモートアクセスのパターン
External IPを付与してSSHする
External IPを付与した踏み台サーバ(Bastion)にSSHして、そこから対象のPrivateInstanceにSSHする
Serial Port経由でアクセスする ※External IP不要
https://cloud.google.com/compute/docs/instances/interacting-with-serial-console
VPNを張って対象インスタンスのPrivateIPに対してSSHする

##SSHのやりかた
LocalMachineのTerminalやTeratermを使ってSSHする
管理コンソールからCloud Shellを使ってSSHする

###Cloud Shell
Cloud Shellとは、GCPコンソールから起動できるShellで、Cloud Shell用のインスタンスが各ユーザーまたは各セッションにプロビジョニングされます。インスタンスは、プロジェクトのVPC内ではないネットワーク空間で起動します。そのため、VPC内のインスタンスにSSHしたい場合は、対象のインスタンスにExternal IPアドレスが付与されている必要があります。
https://cloud.google.com/shell/docs/starting-cloud-shell?hl=ja

Cloud Shellが、コンソールの右上のShellボタンクリックすると起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/5679ca52-2095-88e2-1045-04058c3c1aef.png)

###OS認証のパターン

- GCP-managed SSH keys(Googleが管理する鍵)
    - ユーザは秘密鍵のダウンロードができない
    - メタデータ
    - 簡単
- OS Login
    - ユーザに紐付けられる鍵
    - IAMでユーザごとにSSHアクセスの権限を付与できる
    - Linux環境のみ
    - https://cloud.google.com/compute/docs/oslogin/?hl=ja
    - 細かな制御
- User-managed SSH keys(ユーザが作成した鍵を登録して使う)
    - プロジェクトで共通とするか、インスタンスごとに指定するかを選択可能
    - 細かな制御＋鍵の管理も自分で切りたい場合
    - https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys?hl=en_US&_ga=2.181422311.-1303976701.1565066087

###投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
webarenaでubuntu その24


#概要

webarenaでubuntu18.04やってみた。
php7.2やってみた。
session認証やってみた。

#login.php

```
<?php
	session_start();
	header ('Content-Type: text/html; charset=Shift_JIS');
?>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>
<body>
<form action="index.php" method="POST">
	ログインID：<input type="text" size="15" name="fLoginID"><br>
	パスワード：<input type="password" size="8" name="fPassword"><br>
	<input type="submit" value="ログイン">
</form>
</body>
</html>
```

#index.php

```
<?php
	session_start();
	if ($_SERVER['REQUEST_METHOD'] === 'POST')
	{
		$fLoginID = $_POST['fLoginID'];
		$fPassword = $_POST['fPassword'];
		$db = new PDO("mysql:host=localhost;dbname=mydb;", 'arena', 'pass');
		$sql = "SELECT pass FROM test where flag='1' AND ID='$fLoginID'";
		$res = $db->query($sql);
		if ($res->rowCount() != 1)
		{
			header ('Content-Type: text/html; charset=Shift_JIS');
			print "アカウントが違う、もしくはユーザ登録されていません。";
			print '<a href="../">こちらから登録してください。</a>';
			session_destroy();
			exit;
		}
		$user = $res->fetch();
		if ($user["pass"] != $fPassword)
		{
			header ('Content-Type: text/html; charset=Shift_JIS');
			print "パスワードが違います。";
			session_destroy();
			exit;
		}
		$_SESSION['sLogin'] = "ok";
		$_SESSION['sId'] = $fLoginID;
		header("Location: contents.php");
	}
	else if ($_SESSION['sLogin'] <> "ok")
	{
		header("Location: login.php");
	}
	else
	{
		header("Location: contents.php");
	}
?>
```

以上。
80/443以外のポートが通らない環境でHeroku Postgresにアクセス

以下の方法(既存DynoにSSHで入ってその中でpsql実行)でDBにアクセス出来た

heroku ps:exec --app stg-myapp ※検証DynoにSSH https://devcenter.heroku.com/articles/exec ※初回はDyno再起動が起こるらしい(今回はたまたま以前に実行済だったので再起動が起こらなかった)
　heroku login -i ※Heroku CLIでログイン ※当該DynoにCLIインストール済である必要あり
　heroku pg:psql --app prd-myapp ※本番DBにpsql接続
　　\l ※DB一覧表示
　　\c XXX ※DB選択
　　\dt XXX.* ※XXXスキーマのテーブル一覧

以下、以前のCLIインストールメモ
　heroku buildpacks:add https://github.com/heroku/heroku-buildpack-cli
　heroku authorizations:create
　heroku config:set HEROKU_API_KEY=＜heroku authorizations:createの結果のID欄の値＞ ※config:setはDyno再起動が起こる
Gitでよく忘れるやつ

# featureブランチ作成＆プッシュ (Windowsにて)
```
set REPOSITORY_URL=＜リポジトリURL＞ # https://～/＜リポジトリ＞.git
set REPOSITORY=＜リポジトリ＞
set BRANCH=＜ブランチ＞ # feature/より右の部分
git clone %REPOSITORY_URL%
rename %REPOSITORY% %REPOSITORY%.%BRANCH%
copy %REPOSITORY%.master\.vscode\launch.json %REPOSITORY%.%BRANCH%\.vscode # Git管理外ファイルのコピー例
cd %REPOSITORY%.%BRANCH%
git checkout -b feature/%BRANCH% # 新ブランチを作成して現ブランチとする
git push -u origin feature/%BRANCH% # 作成したブランチをプッシュ
```

# ブランチ名変更
```
git branch -m feature/mybranchnew
git push origin :feature/mybranchold
git push origin feature/mybranchnew
```

# masterが新しくなったのを現ブランチに取り込む
```
git rebase master
```

conflictが起きたらそのファイルを手で直してから

```
git add ＜直したファイル＞
git rebase --continue
```

rebaseが最後まで行ったら(conflictがなくなったら)

```
git pull
```

git rebase masterがCurrent branch feature/XXX is up to dateで空振りする場合

```
git checkout master
git pull
git checkout feature/XXX
git rebase master
```

# リモートで消えたブランチがローカルに残っている(git branch -aで見える)のを消す
```
git remote prune origin
git branch -d feature/XXX
```

# 間違って現ブランチにpushした内容を戻す
```
git reset --hard ＜戻したい時点のcommitのハッシュ＞
git push -f
```

# Windowsコマンドプロンプトで文字化け (\<HEX？>)
```
setx LANG ja_JP.UTF-8
refreshenv
```

# Windowsコマンドプロンプトで文字化け (なんかバイナリみたいな)
```
chcp 65001
```