OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Lambda で EC2 を起動する。祝日は起動しない。

開発用の EC2 を経費削減のため、休日にはインタンスをたちあがらないようにしたい。
コピペでつかえるように、ライブラリなどは使いたくない。
祝日はそれほど多くないし、会社独自の休業日などもあるので、祝日系は配列で持つことにした。
年に2回くらいメンテナンスすれば良いので、これで良い。

``` ruby
require 'json'
require 'date'
require 'aws-sdk'

def lambda_handler(event:, context:)
    today = Date.today.to_s
    if holydays.include?(today)
        msg = "Today is Holyday! Does Not Start Instance."
    else
        msg = start_instance('ここにインスタンスのIDを書く')
    end

    { statusCode: 200, body: JSON.generate("#{today} - #{msg}") }
end

def holydays
  # この配列をメンテナンスする。
  # https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html
  [
    '2019-10-22', #休日（祝日扱い）
    '2019-11-03', #文化の日
    '2019-11-04', #休日
    '2019-11-23', #勤労感謝の日
    '2019-12-30', #冬季休業
    '2019-12-30', #冬季休業
    
    '2020-01-01', #元日
    '2020-01-02', #冬季休業
    '2020-01-03', #冬季休業
    '2020-01-13', #成人の日
    '2020-02-11', #建国記念の日
    '2020-02-23', #天皇誕生日
    '2020-02-24', #休日
    '2020-03-20', #春分の日
    '2020-04-29', #昭和の日
    '2020-05-03', #憲法記念日
    '2020-05-04', #みどりの日
    '2020-05-05', #こどもの日
    '2020-05-06', #休日
    '2020-07-23', #海の日
    '2020-07-24', #スポーツの日
    '2020-08-10', #山の日
    '2020-09-21', #敬老の日
    '2020-09-22', #秋分の日
    '2020-11-03', #文化の日
    '2020-11-23', #勤労感謝の日
  ]
end

def start_instance(instance_id)
    ec2 = Aws::EC2::Resource.new(region: 'ap-northeast-1') # 東京限定...
    i = ec2.instance(instance_id)
    # https://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v3/developer-guide/ec2-example-start-instance.html
    # からコピペ
    msg = "Instance:#{instance_id} is "
    if i.exists?
      case i.state.code
      when 0  # pending
        msg = msg + "pending, so it will be running in a bit."
      when 16  # started
        msg = msg + "already started."
      when 48  # terminated
        msg = msg + "terminated, so you cannot start it."
      else
        msg = msg + "stopped."
        i.start
      end
    else
      msg = msg + "not exists."
    end
    msg
end
```

## 「国民の祝日」について
以下に、内閣府が CSV を置いてくれている。
https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html

## 参考

https://qiita.com/kknd/items/da6a0970803bc035a870
https://dev.classmethod.jp/cloud/aws/ec2-lambda-auto-startstop-java/
MySQL socket error 対処法

自分用のメモですが、他の方にも参考になるのであれば。。。


### socket error
色々と参考にさせていただいたのですがどれもうまくいかなかったため、再インストールして進めたところうまくいきました。
以下のリンクで進めました。

* どうしよう！困った時のMac上のMySQLのアンインストール＆再インストール、動作確認手順
* https://qiita.com/akiko-pusu/items/aef52b723da2cb5dc596


### 認証方式 error
古いversion の MySQL を使用しているからかもしれませんが、認証方式のエラーが出たので、
caching_sha2_password　→　mysql_native_password へ変更したらエラーが解消しました。

* MySQL8.0 認証方式を変更する(Laravel5)
* https://qiita.com/ucan-lab/items/3ae911b7e13287a5b917


```MySQL:myapp.mysql
MySQL > SELECT user, host, plugin FROM mysql.user;
```

```
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
```

この状態で下のコードを実行すると、認証方式を変更できます。

```
MySQL > ALTER USER 'mysql.infoschema'@"localhost" IDENTIFIED WITH mysql_native_password;
MySQL > ALTER USER 'mysql.session'@"localhost" IDENTIFIED WITH mysql_native_password;
MySQL > ALTER USER 'mysql.sys'@"localhost" IDENTIFIED WITH mysql_native_password;
MySQL > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'P@ssw0rd'

// データベースへ反映
MySQL > FLUSH PRIVILEGES;
```


```MySQL:myapp.mysql
MySQL > SELECT user, host, plugin FROM mysql.user;
```

```
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
```



### unknown database error
これは単純にデータベースが無くなっていただけなので、
rails db:createをしました。

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
Rails チュートリアル　第1章　まとめ



versionを指定して、railsをインストール

```ruby
gem install rails -v 5.1.6
```
アプリケーションの作成

```ruby
rails _5.1.6_ new hello_app
```
アプリケーションに必要なgemをインストール
Gemfileをチュートリアル用に書き換える

```ruby
bundle install
bundle update
```
rails serverを別タブで開く
cdでenvironmentからhello_appに移る
previewから開く

```ruby
rails s
```


 Applicationコントローラにhelloを追加する

```ruby
def hello
    render html: "Hello world"
 end
```
ルーティングを追加

```ruby
root 'application#hello'
```

MVC
ルーティングの役割
ブラウザから送られてくるURLをapplicationコントローラのhelloアクションに振り分ける
アクションの役割
コントローラ名とアクション名からviewを探し出し、呼び出す
(今回ならapps/views/application/hello.html.erb)
ビューの役割
ビューに書き込んだ内容がブラウザに表示される

Git
Gitの役割
セーブポイントを作ること
リポジトリ（保管場所）の初期化

```ruby
git init
```
リポジトリに作業したファイルを追加

```
git add -A
```
待機用リポジトリ、色で状態を示す

```
git status
```
リポジトリに変更を反映

```
git commit -m "~~~~"
```
コミットの履歴を確認

```
git log
```

branchの確認

```
git branch
```
試行錯誤のため別のbranchで作業したい

```
git checkout -b "~~~"
```
作業し終わって、masterに組み込みたい時には

```ruby
git add -A
git commit -m "~~~"
git checkout master
git merge (try branch)
```

Heroku
Heroku用にGemfileを変更する（install --without production,update)
Herokuインストール用のコマンド

```
source <(curl -sL https://cdn.learnenough.com/heroku_install)
```

herokuへのログインとログイン状態の保持

```
heroku login --interactive
heroku keys:add
```
herokuにアプリケーションの作成

```
heroku create
```
デプロイした画面へのショートカットを作成

```
git remote -v 
```
gitを使ってherokuにデプロイ

```
git push heroku master
```

urlからopenでheroku用のページを開くことができる

urlを変えたいなら

```
heroku rename ~~~
```
Carbon の lastOfMonth() と endOfMonth() の違い



会社のコードの中で、lastOfMonth() と endOfMonth() が混在していた。何が違うのか調べてもまとまっている記事がなかったので書く。
調査にはLaravelのTinkerを使った。


## 環境
Laravel 6.2.0
Carbon 2系

## 前提
```php
$ php artisan tinker
>>>
>>> echo today()
2019-10-17 00:00:00
```



## lastOfMonth() と endOfMonth()
- lastOfMonth() : その月の最終日が始まった瞬間が取得できる（00:00:00）
- endOfMonth() : その月の最終日が終わる瞬間が取得できる（23:59:59）

-> 取得できる時間が違う

```php

>>> echo today()->lastOfMonth();
2019-10-31 00:00:00
>>> echo today()->endOfMonth();
2019-10-31 23:59:59
```

## firstOfMonth() と startOfMonth()
- firstOfMonth() : その月の初日が始まった瞬間が取得できる（00:00:00）
- startOfMonth() : その月の初日が始まった瞬間が取得できる（00:00:00）

-> 同じ！


```php

>>> echo today()->firstOfMonth();
2019-10-01 00:00:00
>>> echo today()->startOfMonth();
2019-10-01 00:00:00
```

## lastOfYear() と endOfYear()
- lastOfYear() : その年の最終日が始まった瞬間が取得できる（00:00:00）
- endOfYear() : その年の最終日が終わる瞬間が取得できる（23:59:59）

-> 取得できる時間が違う


```php

>>> echo today()->lastOfYear();
2019-12-31 00:00:00
>>> echo today()->endOfYear();
2019-12-31 23:59:59
```

## firstOfYear() と startOfYear()
- firstOfYear() : その年の初日が始まった瞬間が取得できる（00:00:00）
- startOfYear() : その年の初日が始まった瞬間が取得できる（00:00:00）

-> 同じ！


```php

>>> echo today()->firstOfYear();
2019-01-01 00:00:00
>>> echo today()->startOfYear();
2019-01-01 00:00:00
```


## lastOfWeek() と endOfWeek()
- lastOfWeek() : 存在しない
- endOfWeek() : その週の最終日が終わる瞬間が取得できる（23:59:59）


```php

>>> echo today()->endOfWeek();
2019-10-20 23:59:59
```


## firstOfWeek() と startOfWeek()
- firstOfWeek() : 存在しない
- startOfWeek() : その週の初日が始まった瞬間が取得できる（00:00:00）

```php

>>> echo today()->startOfWeek();
2019-10-14 00:00:00
```


## lastOfDay() と endOfDay()
- lastOfDay() : 存在しない
- endOfDay() : その日が終わる瞬間が取得できる（23:59:59）


```php

>>> echo today()->endOfDay();
2019-10-17 23:59:59
```


## firstOfDay() と startOfDay()
- firstOfDay() : 存在しない
- startOfDay() : その日が始まった瞬間が取得できる（00:00:00）

```php

>>> echo today()->startOfDay();
2019-10-17 00:00:00
```
Beamerのスライドのテーマカラー変更備忘録for me

# 1. Beamerのテーマカラーをガラッと変えたい．
友人からもらったテンプレートの色があまり好みじゃなかったから，色々調べて，テーマカラーを変更できるように試行錯誤した．今回も自分の覚書なので雑に．
　解決法は，単純に，

```{tex}
\usecolortheme[RGB={0,100,125}]{structure}
```
を追加して，RGB = {,,}のとこをいじれば良い．

# 2.　Tex例
これをoverleaf v2に貼り付けて，コンパイル方式をXeLaTexに変えてコンパイルすると利用できる．

```{tex}
\documentclass{beamer}
\mode<presentation> {
\usetheme{Madrid}
%テーマの色指定%
\usecolortheme[RGB={0,100,110}]{structure}%this color is named itogreen.
%%%
\usepackage{zxjatype}
\usepackage[ipa]{zxjafont}
\setbeamertemplate{footline}[page number]
\setbeamertemplate{navigation symbols}{}
}
\usepackage{graphicx} 
\usepackage{booktabs} 
%\usepackage {tikz}
\usepackage{tkz-graph}
\usepackage{bm}
\GraphInit[vstyle = Shade]
\AtBeginSection[]{
    \begin{frame}
        \tableofcontents[currentsection]
    \end{frame}
}
\newcommand{\indep}{\mathop{\perp\!\!\!\perp}}
\tikzset{
  LabelStyle/.style = { rectangle, rounded corners, draw,
                        minimum width = 2em, fill = yellow!50,
                        text = red, font = \bfseries },
  VertexStyle/.append style = { inner sep=5pt,
                                font = \normalsize\bfseries},
  EdgeStyle/.append style = {->, bend left} }
\usetikzlibrary {positioning}
%\usepackage {xcolor}
%\definecolor {processblue}{cmyk}{0.96,0,0,0}
\newcommand{\ctext}[1]{\raise0.2ex\hbox{\textcircled{\scriptsize{#1}}}}
\title[Short title]{ここにタイトルを入れる．}
\author{Your name}% your name

\institute[OU HUS nantoka Lab M1] 
{
Osaka University Graduate School of Human Sciences\\honyarara Lab M1\\
\medskip
}% 所属を{}の内側にかく．
\date{\today} 
\begin{document}
\begin{frame}
\titlepage
\end{frame}
\begin{frame}
\frametitle{Overview} 
\tableofcontents 
\end{frame}
%%%
\begin{frame}[fragile]{箇条書き}
\begin{itemize}
\item あああ
    \begin{itemize}
    \item あああ
    \end{itemize}
\end{itemize}
\end{frame}

%%%
\section{共変量調整による因果効果の推定法}
%%%
\begin{frame}[fragile]{箇条書き}
\begin{itemize}
\item あああ
    \begin{itemize}
    \item あああ
    \end{itemize}
\end{itemize}
\end{frame}

%%%
\begin{frame}{メモに使ってね}
    
\end{frame}

%%%
\section{Reference}
\begin{frame}{References}
\end{frame}

\end{document}
```
【頻出】検索しがちなSQL文まとめてみた

##型名変更
```
ALTER TABLE [テーブル名] MODIFY [カラム名][型]
```

NOT NULL制約をつけたければ下の方法で！

```
ALTER TABLE [テーブル名] MODIFY [カラム名][型] NOT NULL
```
##カラム名変更
```
ALTER TABLE [テーブル名] CHANGE COLUMN [古カラム名] [新カラム名] [型]
```
型名を既存のカラム名と別のものを指定すれば名前の変更とともに型の変更も可能！
##カラム順変更
```
ALTER TABLE [テーブル名] MODIFY [移動したいカラム名][型] AFTER [移動したいカラム名の上にくるカラム名]
```
例えば"mst_user"という以下のようなテーブルがあったとして、

>
cd int
id VARCHAR
name VARCHAR
mail VARCHAR
create_date DATE

[mail]カラムを[name]の上に持っていきたい場合は
>ALTER TABLE mst_user MODIFY mail VARCHAR AFTER name

とすることで順番の入れ替えが可能
##ラストインサート
```
SELECT LAST_INSERT_ID()
```
MySQLは内部的に最後にauto_incrementで挿入したレコードのIDを保持しているので、
auto_incrementのレコードを自動採番してインサートした場合、最後にインサートした自動採番の値を持ってくる。
ただし、自動採番でインサートした場合のみなので、自分でauto_incrementの値を入力した場合は取れない。
##平仮名・カタカナ検索
```
utf8_unicode_ci
```
大文字小文字/全角半角を区別しない。
「AAA」で検索すると、半角アルファベット「AAA」、全角アルファベット「ＡＡＡ」、半角アルファベット小文字「aaa」、全角アルファベット小文字「ａａａ」がマッチする。
「あああ」で検索すると、全角ひらがな「あああ」全角カタカナ「ァァァ」半角カタカナ「ｱｱｱ」全角ひらがな小文字「ぁぁぁ」全角カタカナ小文字「ァァァ」がマッチする。
「2」で検索すると、半角数字「2」、全角数字「２」がマッチする。
そのため、レコード上カタカナもしくは平仮名のみ登録されている場合でも、検索は平仮名・カタカナどちらでもマッチしてくれる。

>
select * from member where namae collate utf8_unicode_ci like '%サトウ%';

とすることで平仮名・カタカナ共に曖昧検索が可能に！
[Python] firebase-adminでTypeError: __init__() got an unexpected keyword argument 'status'

## 現象
Pythonからfirebase-adminパッケージを使おうとしたらエラーが発生した。

エラー内容

```
Traceback (most recent call last):
  File "firebase_db.py", line 5, in <module>
    from firebase_admin import db
  File "/Users/k_ikemura/.local/share/virtualenvs/python-sample-qH44U9i1/lib/python3.7/site-packages/firebase_admin/db.py", line 35, in <module>
    from firebase_admin import _http_client
  File "/Users/k_ikemura/.local/share/virtualenvs/python-sample-qH44U9i1/lib/python3.7/site-packages/firebase_admin/_http_client.py", line 32, in <module>
    raise_on_status=False, backoff_factor=0.5)
TypeError: __init__() got an unexpected keyword argument 'status'
```

## 原因

内部で使われている urllib3 というパッケージが古いらしい。

最新は 1.25.6 だが、自分のローカル環境は 1.24.1 だった。

### 最新のurllib3バージョン
https://pypi.org/project/urllib3/

### ローカル環境のurllib3バージョンの調べ方

```
$ python
Python 3.7.2 (default, Mar 25 2019, 16:42:54)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> from requests.packages import urllib3
>>> urllib3.__version__
'1.24.1'
```

- https://stackoverflow.com/questions/56212844/how-to-fix-firebase-admin-error-typeerror-init-got-an-unexpected-keyword
- https://github.com/firebase/firebase-admin-python/issues/262

## 解決策

ローカル環境のurllib3を最新にしたら直るようだが、やり方が分からない。
そもそもurllib3を追加した覚えがない。。。

requestsパッケージを更新したらいい？

とりあえずstackoverflowに従って、firebase-adminパッケージのコードを修正した。

```python:_http_client.py
    #以下をコメントアウト
    #from requests.packages.urllib3.util import retry
    #DEFAULT_RETRY_CONFIG = retry.Retry(
    #connect=1, read=1, status=4, status_forcelist=[500, 503],
    #raise_on_status=False, backoff_factor=0.5)

    def __init__(
            self, credential=None, session=None, base_url='', headers=None,
            # retries=DEFAULT_RETRY_CONFIG): ここをコメントアウト
            # 以下を追加
            retries=1):
```

これでfirebase-adminが動作するようになった。

## 環境
Python 3.7.2
ターミナル、今いるディレクトリをFinderで表示するコマンド

##ターミナルで、ディレクトリをファイルで開く

`open .`
このコマンドで、ターミナルで現在作業中のフォルダーがFinderで開かれます。
vimで編集が慣れていないので、度々使うことが多かったです。
良かったら、使ってみて！
PythonでJPEGのヘッダーから解像度を読み取る

##最初に
初投稿です！
自身の備忘と調べたことのアウトプットとして活用していきたいと思います。

JPEG画像から画像の解像度を取り出す必要があったのですが、
プロパティから確認出来るとは言うものの、せっかくなのでpythonの勉強がてら自動で画像を開き、JPEGヘッダーを参照して解像度を抽出するpythonスクリプトを作ってみました。

##開発環境
Windows
python=3.6

##使用する画像
使用する画像はなんでもいいのですが、今回はこちらのフリー素材をお借りしました。
https://pixabay.com/ja/photos/%E6%B2%88%E9%BB%99-%E5%BF%83%E3%81%AE%E5%B9%B3%E5%92%8C-%E3%83%AA%E3%83%A9%E3%82%AF%E3%82%BC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-4522878/


今回はJFIF形式にのみ有効なものとしています。
JFIFの説明は本稿では説明していませんが、下記リンク先にまとめられているので参考にしてください。
https://qiita.com/urakarin/items/e5782dec3d24fb1cec6f
https://memo.studiogaki.com/what-are-exif-and-jfif/

プロパティで開いた時の赤枠内の解像度をpythonで抽出するというのが本稿の内容になります。
↓こちらは上記リンク先のプロパティ画面（test.jpgとリネームしています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405687/4c652eb6-98d5-1dad-515c-36e8d887f84c.png)


##pythonスクリプト
早速pythonスクリプトを示します。
時間がない方、基本的なことは分かっているという方は下記pythonスクリプトをコピペしてみてください。
その際にinputというフォルダをpythonスクリプトと同じディレクトリに作成してください。

```python:read_jpegheader_reso.py
import os

"""
メイン
"""
if __name__ == "__main__":
    
    #カレントディレクトリを取得
    current_dir = os.getcwd()
    
    #入力ディレクトリを取得
    indir = current_dir + "\\input\\"
    
    inimg = indir + "test.jpg"
    
    with open(inimg,"rb") as infile:
        
        #dataの中に画像のバイナリ情報を全て入れる
        data = infile.read()

        # JFIF形式であること前提
        wide_reso = data[14:16]
        height_reso = data[16:18]

        # ビッグエンディアン方式で16進数⇒10進数　
        wide_reso_big_10 = int.from_bytes(wide_reso,"big")
        height_reso_big_10 = int.from_bytes(height_reso,"big")
        
        print("wide_reso_big_10:",wide_reso_big_10)
        print("height_reso_big_10:",height_reso_big_10)

```

重要な箇所のみ解説していきます。
まずはディレクトリや画像のパスの設定です。
今回のスクリプトでは、スクリプトと同じディレクトリに「input」というフォルダを作り、その中に「test.jpg」とリネームした画像を入れることが前提です。

```python

    #カレントディレクトリを取得
    current_dir = os.getcwd()
    
    #入力ディレクトリを取得
    indir = current_dir + "\\input\\"
    
    inimg = indir + "test.jpg"

```

次に、画像をバイナリモードで開いてdataに格納しています。

```python

    with open(inimg,"rb") as infile:
        
        #dataの中に画像のバイナリ情報を全て入れる
        data = infile.read()

```
最後に、格納したバイナリ情報から必要となる解像度の情報を抽出します。
JPEGのヘッダー仕様を確認して、水平方向、垂直方向の解像度が書かれたアドレスを指定して抽出しています。
水平方向は14、15バイト目に、垂直方向は16、17バイト目に記載されています。

抽出したものをそのまま表示してもバイナリデータのままなので、10進数に変換を行います。
その際にビッグエンディアン方式で10進数へと変換します。

なお、JPEGヘッダーについてはこちらを参考にさせていただきました。
https://www.setsuki.com/hsp/ext/jpg.htm

ビッグエンディアンはバイトオーダに関する用語になりますが、下記リンク先が参考になります。
http://www.ertl.jp/~takayuki/readings/info/no05.html

```python

        # JFIF形式であること前提
        wide_reso = data[14:16]
        height_reso = data[16:18]

        # ビッグエンディアン方式で16進数⇒10進数　
        wide_reso_big_10 = int.from_bytes(wide_reso,"big")
        height_reso_big_10 = int.from_bytes(height_reso,"big")
        
        print("wide_reso_big_10:",wide_reso_big_10)
        print("height_reso_big_10:",height_reso_big_10)

```

今回のスクリプトを実行した結果を示します。

```python

wide_reso_big_10: 300
height_reso_big_10: 300
```


プロパティで確認した結果と一致することが確認出来ました！



##最後に

globを使ってディレクトリ内の画像を順番に選択してヘッダーを参照して解像度を抽出することも可能です。
そして、その出力結果をcsvなどに出力することも可能です。
反響があれば上記のソースコードも追記していこうかなと思っています。

ご指摘があればどうぞよろしくお願いいたします。
コンテンツブロッカー　freedom　

「ヤバい集中力」という本に書いてあった「freedom」というツールをchromeの拡張機能に追加した。
URLはこちら
https://chrome.google.com/webstore/detail/freedom-website-blocker-f/abdkjmofmjelgafcdffaimhgdgpagmop

ほかのブラウザやOSでのダウンロードはこちら
https://freedom.to/downloads

デフォルトで
facebook.com
instagram.com
youtube.com
twitter.com
などがブロックされているみたい。

例えばyoutubeにアクセスするとこのように表示されてアクセスできない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396969/53914084-118c-6eba-5020-b129d12a8ca7.png)

開発中にコンテンツを見て、作業が中断してしまう人は「freedom」を導入するのもいいかもしれませんね。
UnityからAndroidの.apkファイルを作成する

## 環境
- UnityHub
- Unity 2019.2.9f1

## .apkファイルを作成するためにやったこと

UnityHubを開いて「インストール」→「メニューバー」(画像の緑色マーカーで囲んでいる部分)を選択。
![UnityHub_install.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515482/cac6d889-2c33-002c-8a55-054646a57246.jpeg)


→「モジュールを加える」
![UnityHub_install2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515482/46ce4675-638c-9726-da76-812e9aeb5305.jpeg)

→「Android Build Support」と、「Android SDK & NDK Tools」「OpenJDK」を選択→右下の「実行」をクリック（画像では「iOS Build Support」にチェックが入っていますが、今回はAndroidについて書いているので無視してください）
![UnityHub_install3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515482/73b89da9-4aef-6a13-d267-450cd00510e1.jpeg)

インストールが終わるまでしばらく待ちます。僕の場合は10分程度かかりました。
インストールが終われば、.apkファイルを作りたいUnityのプロジェクトをUnityHubから開いて、左上の「file」→「Build Settings」から、Platformで「Android」を選択すると、Build Settingsウィンドウの右下に「Switch Platform」ボタンが出現するので、それを選択します。
そうすると、「Switch Platform」ボタンだったところに「Build」ボタンが出現します。「Build And Run」ボタンもありますが、僕の場合はデバイスをうまく認識しなかったので、「Build」を選択して適当な場所に.apkファイルを保存しました。
![Unity_BuildSettings.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515482/dbf4e9ff-7b9e-f294-2680-0073c7a20552.jpeg)

海外の方のYoutubeにも同様の動画がありましたので参考までに。
https://www.youtube.com/watch?v=Ska81xpB-Po

ここにも同様の記事を発見しました
Android SDK, NDKをUnity Hubからインストールする方法
https://yanpen.net/unity/install_android-sdk-ndk_from_unity_hub/
Java

#### Java SE 設置
[Java SE설치, 환경변수 설정](https://dev-imaec.tistory.com/9)

##### 환경변수 설정 단축키
- Window키+R
- sysdm.cpl ,3

#### Eclipse
[Eclipse Down(무설치)](https://gocoder.tistory.com/119)

#### Tomcat
[Tomcat 설치](https://copycoding.tistory.com/164)

#### Struts
[개발환경부터 개발](https://devbada.tistory.com/176?category=296054)
```xml:web.xml
  <filter>
   <filter-name>struts</filter-name>
   <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
 
  <filter-mapping>
   <filter-name>struts</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>
```  



[스트럿츠란_01](https://m.blog.naver.com/PostView.nhn?blogId=tinatan&logNo=70165549411&proxyReferer=https%3A%2F%2Fwww.google.com%2F)
[POJO란_01](https://itewbm.tistory.com/entry/POJOPlain-Old-Java-Object)
[POJO란_02](https://m.blog.naver.com/writer0713/220700687650)
[스트럿츠 프로젝트 개발](https://devbada.tistory.com/176?category=296054)
大文字↔︎小文字に変換するメソッド

#大文字↔︎小文字に変換するメソッド
・downcase : 大文字を小文字にする。
・upcase : 小文字を大文字にする。
・swapcase : 小文字を大文字に、大文字を小文字にする。
・capitalize : 先頭の小文字を大文字にする。


####downcaseで大文字を小文字に変換
```ruby
str = "hello WORLD"
puts str.downcase

#=> hello world
```

####upcaseで小文字を大文字に変換
```ruby
str = "hello WORLD"
puts str.upcase

#=> HELLO WORLD
```

####swapcaseで小文字⇔大文字の変換

```ruby
str = "hello WORLD"
puts str.swapcase

#=> HELLO world
```
####capitalizeで先頭の小文字を大文字に変換
```ruby
str = "hello WORLD"
puts str.capitalize

#=> Hello world
```

##「！」で値そのものを書き換える「破壊的メソッド」
これらにはメソッドの末尾に「!」をつけることで、値をそのものを書き換えることが出来ます。
呼び出したオブジェクトの状態を変更してしまうメソッドのことを「破壊的メソッド」と呼びます。


```ruby
str = "hello WORLD"
str.downcase
puts str

#=> hello WORLD
#strの値は変わっていない

str = "hello WORLD"
str.downcase!
puts str

#=> hello world
#strの値そのものが書き換わる
```

##複数行の変換
ヒアドキュメントを使うことで複数行を変換することも出来ます。

```ruby
str = <<-EOS
hello WORLD
Ruby on Rails
Good night
EOS
puts str.upcase

#=>HELLO WORLD
#=>RUBY ON RAILS
#=>GOOD NIGHT
```
アンリアルエンジン４(UE4)でのFBXインポート時のピボットポイントについて

現在、アンリアルエンジン4.23を使っています。
mayaからfbx2018（バイナリ、ASCII）共に書き出したものをインポートすると移動拡縮回転の編集点が自動的にxyz位置「０」になってしまいます。
しかしインポートされたオブジェクトが少し複雑なためmaya側で設定するのも骨が折れるし今後作っていく以上、やはりmayaのピボットポイントを保って頂かないと困ります。どうすればmayaのピボットポイントをUE4に適用できるでしょうか。
Puppeteerでtarget="_blank"属性anchorタグで開いたページの処理

## 概要
Puppeteerでanchorタグを別タブで開いた際処理の備忘録です。

## 方法
```javascript:example.js
browser.on('targetcreated', async (target) => {
    const newPage = await target.page();
    // ページに対する処理
    await newPage.close();
});

const el = await page.$(selector);
await el.click();
```

target作成のイベントリスナーを用意して処理します。
browser.removeListenerでリスナーを除去する処理も必要ですね。

## 参考
https://stackoverflow.com/questions/53374443/using-puppeteer-to-get-a-handle-to-the-new-page-after-blank-click
[composer]Laravelプロジェクト作成



プロジェクトの作成

```terminal
$ composer create-project laravel/laravel output_english
```

app.phpの設定

```php:app.php
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
```

database.phpの設定

```php:database.php
'mysql' => [
   'charset' => 'utf8',
   'collation' => 'utf8_unicode_ci',
 ],
```

##データベース接続

データーベース、ユーザーの作成、`.env`設定後、マイグレーション

```terminal
php artisan migrate
```

エラーになる場合は[コチラ](https://qiita.com/tetsu-upstr/items/95edb817bcde5b13b908)を確認してみてください。
ROC 曲線とAUCの自作コード

機械学習時など，モデルの性能評価で必要なROC, AUCですが
cutoff ポイントを自作したいとき，不便なので自分で作ってみました。
(もしかして誤解があったら，気づいた方は教えてください！)

For ROC curve after model construction

```python:ROC.py

# Code for CutOff_and_ROCcurve.
Predict_arr = model.predict(test_arr)

cutoff_list = np.arange(0, 1.001, 0.001)

cut_sen_spe = []
for cutoff in cutoff_list:
    pred_answer_arr = Predict_arr.copy()
    pred_answer_arr[pred_answer_arr >= cutoff] = 1
    pred_answer_arr[pred_answer_arr < cutoff] = 0
    PP = 0
    PN = 0
    NP = 0
    NN = 0
    for i in range(len(test_answer_arr)):
        if test_answer_arr[i] == 1 and pred_answer_arr[i] == 1:
            PP += 1
        if test_answer_arr[i] == 1 and pred_answer_arr[i] == 0:
            PN += 1
        if test_answer_arr[i] == 0 and pred_answer_arr[i] == 1:
            NP += 1
        if test_answer_arr[i] == 0 and pred_answer_arr[i] == 0:
            NN += 1
    cut_sen_spe.append([cutoff, PP, PN, NP, NN])

total_list = []
for j in range(len(cut_sen_spe)):
    sen = cut_sen_spe[j][1] / (cut_sen_spe[j][1] + cut_sen_spe[j][2])
    spe = cut_sen_spe[j][4] / (cut_sen_spe[j][3] + cut_sen_spe[j][4])
    total_list.append([sen, spe])

total_arr = np.array(total_list)

sen_arr = total_arr[:, 0]
spe_arr = total_arr[:, 1]


# Visualization & Save ROCcurve

f = plt.figure(figsize = (10, 10))
plt.plot(1-spe_arr, sen_arr, c = "r", linewidth = 3.0)
plt.plot([0.0, 1.0], [0.0, 1.0], linestyle='dashed')
plt.xticks(np.arange(0, 1.01, 0.1))
plt.yticks(np.arange(0, 1.01, 0.1))
plt.xlim(-0.03, 1.03)
plt.ylim(-0.03, 1.03)
plt.savefig(ROCcurve_Save)
plt.show()

# AUC 
target_falPos_arr = 1-spe_arr
target_sen_arr = sen_arr
target_falPos_arr.sort()
target_sen_arr.sort()

AUC_segIMG = 0
for ind in range(len(target_falPos_arr[:-1])):
    X_p = target_falPos_arr[ind]
    nex_X = target_falPos_arr[ind+1]
    Y_p = target_sen_arr[ind]
    nex_Y = target_sen_arr[ind+1]
    area = (nex_X - X_p) * Y_p + (nex_X - X_p) * (nex_Y - Y_p) / 2
    AUC_segIMG += area

print(AUC_segIMG)
```
Oculus Quest Build 10.0アップデート後に提供元不明のアプリが表示されなくなった時の対処

# はじめに

Oculus Questに[Build 10.0](https://forums.oculusvr.com/community/discussion/81417/quest-go-gear-vr-build-10-0-release-notes)が適用されると以下の不具合が起きていました。

* Oculus Questを再起動すると必ず開発者モードがオフになる
* Oculus Questを起動後に開発者モードをオンにしてもライブラリの提供元不明のアプリが表示されない事がある

ですが更なるアップデートでこの不具合は修正されました。以下のバージョンなら問題ありません。
![com.oculus.vrshell-20191019-135040.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/a7b4b977-7c2a-9c0f-7151-1376d58fe1c0.jpeg)

もしも以下の修正前バージョンなら不具合があります。このうち提供元不明のアプリを表示する手順が分かったのでまとめました。
。
![com.oculus.vrshell-20191018-030000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/9e8b5d2b-7655-dfcf-9403-076c1d12bcc6.jpeg)

余談ですが前者は修正済みのはずですが直ってなかったようです。

* [Oculus Developer Release Notes: October 14th, 2019](https://developer.oculus.com/blog/oculus-developer-release-notes-october-14th-2019/)

> Bug Fix: Developer mode is no longer disabled on hardware restart. Developer Mode may have been disabled when the device updated to 9.0. With this fix, once re-enabled, Developer Mode persists through device reboots.

# 提供元不明のアプリを表示する手順

1. Oculus Questを起動したらスマホのOculusアプリから開発者モードをオンにする
1. VR内で一度でもライブラリを表示したなら任意のアプリを起動して終了する
    * ![com.oculus.vrshell-20191018-025851.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/a80b4305-35dc-a3fc-1ddc-ca273e7969a3.jpeg)

どうやらライブラリを表示するとその時の開発者モードがキャッシュされるらしく、任意のアプリを起動→終了してホームに戻った時にリロードされているようなのです。そのため、Oculus Quest起動後にライブラリを表示する前に開発者モードをオンにするとすぐに提供元不明のアプリを表示できます。

# 参考リンク

* [Quest / Go / Gear VR Build 10.0 Release Notes](https://forums.oculusvr.com/community/discussion/81417/quest-go-gear-vr-build-10-0-release-notes)
* [Oculus Developer Release Notes: October 14th, 2019](https://developer.oculus.com/blog/oculus-developer-release-notes-october-14th-2019/)
【AirDish】vol.1 Facebookログイン機能の実装

Facebookのログイン機能を実装したときの手順を備忘録的に残しておく。
もっといい方法がある場合など、指摘をお願いします！

## 参考となるYOUTUBE
https://www.youtube.com/watch?v=7DdgvI8z6OU&feature=youtu.be
基本的には、上記のyoutube通りに進めれば良い。

## 動画と異なる点
動画と異なる記述が必要なのは以下の点。

### 1. SDKApplicationDelegate → ApplicationDelegate（5分50秒頃〜）

AppDelegate.swiftの
`SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)`
ではエラーが出る。
`ApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)`
で解決する。

### 2. ログインのviewのLoginButton → FBLoginButton（8分頃〜）
ログインボタンを作るコード部分
```let loginButton = LoginButton(permissions: [.publicProfile])
        loginButton.center = view.center
        loginButton.delegate = self
        self.view.addSubview(loginButton)
```
ではエラーが出る。
正しくは、
```let loginButton = FBLoginButton(permissions: [.publicProfile])
        loginButton.center = view.center
        loginButton.delegate = self
        self.view.addSubview(loginButton)
```
で解決する。


追記
遷移のことまで考えると
https://www.youtube.com/watch?v=7R3DLfLkhtc
こちらのようにstoryboardでボタン生成したほうがわかりやすいかもしれない。
iOS シミュレータのキーボードが反応しない時の対応

実行時環境 Xcode11.1/Swift5/iOS13.1

Xcode11にあげてiOS13の対応を行なっていた時突然シミュレータのキーボードが反応しなくなりました。
入力した途端アプリが固まって動かなくなってしまう状態です。

ちなみに実機ビルドはOK。画面遷移後別の画面ではOK。なぜか初回の画面だけが動かない。

# ＊対応

シミュレータを初期化したら直りました！

シミュレータを起動
Hardware＞Erase All Content and Settings...
Laravel開発時のTips

Laravelで開発するにあたって度々詰まるところが出てくるので、その時の対処法をまとめています。便利なTipsはどんどん追記していきます。

## 実行環境

- php 7.3
- Laravel 5.8

## ログ出力

Logファサードを使うのが便利です。出力結果は、 `storage/logs/laravel.log` に貯まっていきます。ログの重要度に応じて、 `info` や `debug` を使い分ければOKです。

```php
<?php

\Log::info('ログ出力');
/*
* 出力結果：
* ログ出力
*/

$hoge = ['a', 1, 'Z'];
\Log::info($hoge);

/*
* 配列の場合も中身を展開してくれます 
* 出力結果：
* local.INFO: array (
*  0 => 'a',
*  1 => 1,
*  2 => 'Z',
* )
*/  

```

## キャッシュ系コマンド

Laravelはキャッシュが効きすぎてるおかげ（せい）で、コードを修正しても修正が適用されない場合があります。そういった場合には各キャッシュを消してみましょう。

アプリケーションのキャッシュを消したいときに使っています。

```bash
php artisan cache:clear
```
設定ファイル（.envやconfig/*をいじったとき）のキャッシュを消したいときに使っています。

```bash
php artisan config:clear
```

ルート（not / but routes/*）のキャッシュを消したいときに使っています。

```bash
php artisan route:clear
```

ビュー（bladeやtwig）のキャッシュを消したい時に使ってます。

```bash
php artisan view:clear
```

## キーの再生成

キーを再生成したい時に使います。全てのキャッシュを消したい時に使ってます。stg環境や本番環境ではNGですが、local環境ではキャッシュを細かく消すのは面倒なので、キャッシュ削除時にはこれを実行しています。

```bash
php artisan key:generate
```

## env() 禁止令

env()は直接使わないようにしましょう。config/*.phpにenv()の値を入れてconfig()から参照するのがよいです。
localやstg環境では、.envファイルを読んでくれるので問題ないですが、本番環境では.envファイルを読み込まずにエラーになるため。

```php:config/my-config.php
<?php

return [
    'hoge' => env('HOGE'),
];
```

```php:hoge.php
<?php

// こちらは決してやってはいけない
$hoge = env('HOGE');

// 必ずconfig()を経由する
$hoge = config('my-config.hoge');
```
【備忘録】PHPのリファレンスについて考えてみる

#目的
PHPリファレンスを理解する。

#背景
PHPのforeachについての記事を書いたときに、指摘いただいたのですが、リファレンスの意味が全くわからない。

[【備忘録】PHPのforeachについて考えてみる](https://qiita.com/abecha_ja/items/0c618e656cd0b97e4563#comment-cd5a309d024ea0dc9a87)

#参考資料
[PHPの参照はCのポインタとは別物](https://unskilled.site/php%E3%81%AE%E5%8F%82%E7%85%A7%E3%81%AFc%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%A8%E3%81%AF%E5%88%A5%E7%89%A9/)


[リファレンスとは](https://www.php.net/manual/ja/language.references.whatare.php)


[【PHP】参照(リファレンス)渡しとは？使い方をわかりやすく説明](https://positivelifeshow.com/programming/php/reference/)


# #1 リファレンスについて考える？
公式ドキュメントによると、
>PHP において、リファレンスとは同じ変数の内容を異なった名前で コールすることを意味します。これは C のポインタとは異なります。 リファレンスを使ってポインタの演算をすることはできませんし、 リファレンスは実メモリのアドレスでもありません。詳細は リファレンスが行わないこと を参照ください。 そうではなく、リファレンスはシンボルテーブルのエイリアスです。 PHP では、変数名と変数の内容は異なっており、 このため、同じ内容は異なった複数の名前を有する事が可能であることに 注意してください。最も良く似ているのは、Unix のファイル名とファイルの 関係です。この場合、変数名はディレクトリエントリ、変数の内容は ファイル自体に対応します。リファレンスは、Unix ファイルシステムの ハードリンクのようなものであると考えられます。

だめだ！全くわかんねー！

次はこれを読んでみます
[【PHP】参照(リファレンス)渡しとは？使い方をわかりやすく説明](https://positivelifeshow.com/programming/php/reference/)

ちょっとだけわかったかも！
今までの認識だと、関数の引数に変数を入れたら、値が代入されるっていう認識だったけど、***関数の引数には変数が入るパターン（参照渡し）と、値が入るパターン（値渡し）があるんだな***

```ruby:値渡し
<?php
function keisan($a){
  $a++;
  echo $a;
}
 
$b=1;
keisan($b);
//2と表示
echo $b;
//1と表示
?>
```

```ruby:参照渡し
<?php
function keisan(&$a){
  $a++;
  echo $a;
}
 
$b=1;
keisan($b);
//2と表示
echo $b;
//ここでも2と表示される
 ?>
```

***値渡し***は引数に値を入れてるだけで、変数に影響はないから、`echo $b`の出力が`1`になるけど、

***参照渡し***は引数に変数を代入してるから、変数にも影響が出て、`echo $b`すると、`2`になる。

これからは、変数と値を別々に捉えた方が良さそうだ、、
、

理解を深めるために、また
公式ドキュメントを読み返してみた。
>PHP において、リファレンスとは同じ変数の内容を異なった名前で コールすることを意味します。

さっき理解した感じで説明すると、
`y = 5`と`x = 5`が存在した時、***x,yを値ではなく、変数として関数の引数に入れてもいいという概念がある***って伝えたいのかな。


>リファレンスはシンボルテーブルのエイリアスです。

シンボルテーブルとは？エイリアスとは？？？？
調べて見る！！！

[PHPのシンボルテーブルを覗いてみる](https://hnw.hatenablog.com/entry/20170520)
>PHPのシンボルテーブルというのはC実装のレベルの用語で、その時点で有効な変数テーブルのことを指します。つまり、グローバルスコープならグローバル変数を管理する変数テーブル、関数スコープならローカル変数を管理する変数テーブルの意味になります。

まだわからんねー、[テーブル](http://e-words.jp/w/%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB.html)とは？？
>表のように複数の異なる要素間の対応関係を管理するためのデータ構造や格納領域をテーブルという。この場合は必ずしも2次元の格子状に整理された構造を指すとは限らない。

これはわかりやすい
なんとなーくわかってきた！:thinking:

要するに、
***変数と値の関係性を管理？記録？する奴が存在しているんだな！変数の更新とか、参照渡しとかってこいつが管理してるのかなー***

この概念もなんか重要な気がする。
IBMさんの[変数テーブル](https://www.ibm.com/support/knowledgecenter/ja/SSGSPN_9.2.0/com.ibm.tivoli.itws.doc_9.2/distr/src_tsweb/General_Help/awsrgvartableconcept.htm)
>いつどこで使用するかに応じて、名前は同じでも値はそれぞれ異なる変数を定義することができます。 それには、それぞれ異なる変数テーブル内の同一変数に、それぞれ異なる値を割り当てます。

***変数テーブルが複数ある***っていう概念。
大事な気がする


次は[エイリアス](https://wa3.i-3-i.info/word1149.html)について調べてみた
>あだ名。

急に簡単なものが出てきたなー

minoさん[記事](https://unskilled.site/php%E3%81%AE%E5%8F%82%E7%85%A7%E3%81%AFc%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%A8%E3%81%AF%E5%88%A5%E7%89%A9/)から
>リファレンスを扱うには＆演算子を用います

`$a = & $b;`


さっきのドキュメントもう一度解釈してみる。
>リファレンスはシンボルテーブルのエイリアスです。

ってことは、
***リファレンスとは、変数と値の関係性を管理？記録？する奴のあだ名。***

って解釈でいいのかこれ、、、、

まぁいいか（諦め）

#まとめ
***リファレンスとは、
プログラミング実行する時点で、有効な変数と値の関係性を管理するテーブルのあだ名。***

、、、、理解するのに諦めました
Cognitoのユーザ移行トリガーの使い方のたった１つの大事なこと。あとSAMでのコツ

# 前提
* 既存Cognitoユーザプールから新規ユーザプールへマイグレーションしたい
* ユーザにパスワードの再入力をさせたくない

可能にするやり方は調べた限り以下の２つのようでした。

1. CSVでごっそりインポート
2. **Cognitoのユーザ移行トリガーを使ってLambdaを呼び出して１つずつ移行**

今回は***Cognitoのユーザ移行トリガーを使ってLambdaを呼び出して１つずつ移行***をやってみました。

# Cognitoのユーザ移行トリガーの使い方
## 準備
1. Cognitoのユーザ移行トリガーを移行Lambdaを設定する
2. アプリクライアントの**アプリベースの認証でユーザー名とパスワードの (SRP を使用しない) フローを有効にする (USER_PASSWORD_AUTH)**にチェックを入れる


## ユーザ移行トリガーの発火させ方 ー**たった１つの大事なこと**ー
***USER_PASSWORD_AUTHで認証する！***
具体的にはAWS AmplifyのConfigure以下のように明示的に指定する必要があります。

```
    Amplify.configure({
      Auth: {
        // REQUIRED - Amazon Cognito Region
        region: `${region}`,

        // OPTIONAL - Amazon Cognito User Pool ID
        userPoolId: `${pool_id}`,

        // OPTIONAL - Amazon Cognito Web Client ID (26-char alphanumeric string)
        userPoolWebClientId: `${client_id}`,

        // OPTIONAL - Manually set the authentication flow type. Default is 'USER_SRP_AUTH'
        authenticationFlowType: 'USER_PASSWORD_AUTH',

        mandatorySignIn: true,

      }
    });
```

とConfigureで```authenticationFlowType: 'USER_PASSWORD_AUTH'```と設定したら、普通にログインを試みれば大丈夫です。

```
    const user = await Auth.signIn(username, password);
    this.user = cloneDeep(user);
    return true;
```

これでユーザ移行トリガーが発火して設定したLambdaが動くことを確認できました。

#参照
https://stackoverflow.com/questions/52664612/cognito-user-migration-trigger-not-firing

# 所感
ユーザ移行トリガーは公式のドキュメントで、[サインアップで発火](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html)とか[サインインで発火](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-lambda-migrate-user.html)とか、両方書いてあったので両方試しましたが、どちらも発火せずハマってしまいました。正解はサインインでした。大事なのは、```authenticationFlowType: USER_PASSWORD_AUTH```で認証方法を指定することでした。そんなことドキュメントの例に書いてないんだもんなー
Cognitoの認証についてはもっと勉強が必要だと感じました。
ま、マイグレーションLambdaはこれから書くんですけどね。。。

# SAM
SAMを使う場合、LambdaにCognitoのトリガーの設定に加え、パーミッションの設定してあげないとダメでした。
参照 https://forums.aws.amazon.com/thread.jspa?messageID=835378

```
  migrateLambdaFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: migrate_func-python3.7/
      Handler: app.lambda_handler
      Description: Handle requests for sample
      Timeout: 180
      MemorySize: 128
      Runtime: python3.7  # python3.7/go1.x/nodejs10.x
      Tracing: Active # https://docs.aws.amazon.com/lambda/latest/dg/lambda-x-ray.html
      Events:
        Cognito:
          Type: Cognito
          Properties:
            UserPool: !Ref UserPool
            Trigger: UserMigration

 PermissionToInvokeUserPoolMigration:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !Ref migrateLambdaFunction
      Action: lambda:InvokeFunction
      Principal: cognito-idp.amazonaws.com
      SourceArn: !Sub arn:aws:cognito-idp:${AWS::Region}:${AWS::AccountId}:userpool/${UserPool}

```
Django Admin Sortableを使ってモデルインスタンスの順序を変えよう！

Django Admin Sortableを使うことでモデルインスタンスの順序をドラッグ＆ドロップで変えることができます。
#Django Admin SortableのGithub
https://github.com/alsoicode/django-admin-sortable
#導入方法

###pipインストール

``` 
$ pip install django-admin-sortable
```

###setting.pyに追加
#####```setting.py```の```INSTALLED_APPS```に```adminsortable```を追加します
```
INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'adminsortable',  ←--------------追加
]
```

###models.pyに追加
####Before

```
from django.db import models

class Basic(models.Model):
    title = models.CharField(max_length=100)

    def __str__(self):
        return self.title
```
####After
モデルの順番を変えるためにモデルに```adminsortable.models```の```SortableMixin```を継承させる。
モデル```Meta.ordering```にthe_orderフィールドを追加してください。
```the_order```などの名前に関して```order_filed```は既に使われているので使わないようにする。
※順番を決めるために必要なフィールドがあるらしいのですが僕はしっかり理解できなかったのでGithubのコードと同じように```models.PositiveIntegerField```で進めてみましたが特にお問題はなさそうです。
他にフィールドを確認した方は[こちらから](https://github.com/alsoicode/django-admin-sortable#models)


```
from django.db import models
from adminsortable.models import SortableMixin 　←-追加 

class Basic(SortableMixin):               ←-変更
    title = models.CharField(max_length=100)
    
    class Meta:                         
        ordering = ['the_order']　　　　←-追加

    the_order = models.PositiveIntegerField(default=0, editable=False, db_index=True) ←追加

    def __unicode__(self):       ←'__unicode__'に関してはこれで実行するとobjectsで表示されます。
        return self.title
```

###admin.pyに追加
####Before

```
from django.contrib import admin
from .models import Basic

class BasicAdmin(admin.ModelAdmin):
    list_display = ('id','title')
    list_display_links = ('id','title')

admin.site.register(Basic.BasicAdmin)
```

####After 
``adminsortable.admin.SortableAdmin``を継承する。

```
from django.contrib import admin
from adminsortable.admin import SortableAdmin
from .models import Basic

class BasicAdmin(SortableAdmin):
    list_display = ('id','title')
    list_display_links = ('id','title')

admin.site.register(Basic.BasicAdmin)
```


###最後に
最後にAdmin画面に行って実際に順番を変えようとしますが通常画面ではできません右上のCHANGE ORDERボタンからドラック&ドロップできるページに移動します。
![25059b3cc816923a9c26f7b04893ee61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392275/97ec6377-3f50-3c0e-474a-c170c676ea20.png)

#### ```__str__```　(通常時)
実際にデータにある値を表示してくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392275/bc7c16f6-6116-2860-649c-05c1f0555c25.png)

#### ```__unicode__```　(unicodeにした場合)
このようにobjectになって表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392275/eeae8e8f-30a6-1da9-17b8-65971158e48b.png)


僕自身のメモって感じなので参考程度にどうぞ！
docker-composeで起動したmysqlのテーブルの日本語が文字化け「？？？」するのを直す手段

# 背景
実装のエビデンスのために、mysqlのテーブル内容を貼る必要があったのですが、以下のような感じで日本語部分が文字化け（「????」部分）してしまいました。

```
mysql> SELECT * FROM employee;
+----+--------------------------------------+------+-------------------+----------+-----------+
| id | uuid                                 | name | email             | password | isDisplay |
+----+--------------------------------------+------+-------------------+----------+-----------+
|  1 | 24bb8cda-d7c8-41b1-a641-2d310a9a04b1 | ???? | test@test.co.jp   | test     |         1 |
|  2 | a8ed75e2-8c75-43bc-aa01-d0638457d390 | ???? | check@check.co.jp | check    |         0 |
|  3 | 86f9a92c-d931-4369-9788-87f0e640a7f1 | ???? | ok@ok.co.jp       | ok       |         1 |
+----+--------------------------------------+------+-------------------+----------+-----------+
```
これを直す手段を共有します。

# 手段
docker-composeで立てたmysqlにアクセスして、以下を叩きます。

```
mysql> status;
--------------
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    latin1
Conn.  characterset:    latin1
--------------
```

ここの

 - Server characterset
 - Db     characterset
 - Client characterset
 - Conn.  characterset

4つがutf8になるようにする必要があります。
そのために、`docekr-compose.yml`をいじります。

```docekr-compose.yml
version: '3'
services:
  db:
    image: mysql
    # ↓のcommandの一行を追加する
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --skip-character-set-client-handshake
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: payment
      MYSQL_USER: user
      MYSQL_PASSWORD: passwordpassword
```

もう一度、docker-composeで立てたmysqlにアクセスして、確認すると、

```
mysql> status;
--------------
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
```
`utf8`に変わっています。

最後に、文字化けしていないかもう一度確認してみます。

```
mysql> select * from employee;
+----+--------------------------------------+--------------+-------------------+----------+-----------+
| id | uuid                                 | name         | email             | password | isDisplay |
+----+--------------------------------------+--------------+-------------------+----------+-----------+
|  1 | 24bb8cda-d7c8-41b1-a641-2d310a9a04b1 | 田中太郎     | test@test.co.jp   | test     |         1 |
|  2 | a8ed75e2-8c75-43bc-aa01-d0638457d390 | 山田大輔     | check@check.co.jp | check    |         0 |
|  3 | 86f9a92c-d931-4369-9788-87f0e640a7f1 | 佐藤次郎     | ok@ok.co.jp       | ok       |         1 |
+----+--------------------------------------+--------------+-------------------+----------+-----------+
```

直りました。

# 出典

https://qiita.com/waterada/items/1dbf6a977611e0e8f5c8
https://qiita.com/luccafort/items/0553c589dcc6459746bc
CSS セレクタの使い方

####セレクタの説明において以下の構文を使用する
html

```
<div class="aaa">
  <p>あああ</p>
  <input>
  <div>
    <p>AAA</p>
    <div>
      <p>BBB</p>
      <div>
       <p>CCC</p>
      </div>
    </div>
  </div>
  <div>
    <p>DDD</P>
  </div>
  <p>いいい</p>
</div>
```

#各セレクタの説明

##[半角スペース]
指定したすべての要素に適用
css

```
.aaa p{
  color: green}

aaa要素内のp要素すべてに適用される
すべての文字がグリーンになる。

```

##隣接セレクタ[+]
その直後に出現する要素に適用される
例：
css

```
.aaa input + div{
  color: green}

inputの直後に記述されているdiv要素に適用される
「AAA」「BBB」「CCC」がグリーンになる。

```


##直下セレクタ[>]
直下の子要素にだけ適用
css

```
.aaa > p{
  color: green}

aaaの直下にあるp要素
「あああ」「いいい」だけがグリーンになる

```

##関節セレクタ[~]
同一階層で後続に登場するすべての要素に適用される
css

```
.aaa input ~ p{
  color: green}

<input>よりも後続で登場するp要素(同一階層)は
1つだけ
「いいい」だけがグリーンになる
```
mac slack アプリ に 新たなワークスペース を 追加 するときのメモ

# 目的

- macのslackアプリにワークスペースを追加する方法をまとめる。

# 実施方法

1. Dockにあるslackアイコンを右クリックする。
1. 「他のワークスペースにサインインする。」をクリックする。
1. webブラウザが開いたら追加したいワークスペースの情報を入力する。
1. 「Slack appを開きますか？」のメッセージボックスが出たら「Slack appを開く」をクリックする。
1. slackアプリを一旦閉じて再起動する。
1. アプリにワークスペースが追加される。
less コマンドで "v" キーを押した時に実行されるエディタを変更する

# less コマンドで "v" キーを押した時の挙動 (実行されるエディタ) を変更する

## 一言で言うと
lessコマンドの "v" で開くエディタは "VISUAL" という環境変数で変更可能
何も起こらないようにしたければ ":" にでもしておけばいい

```shell

$ export VISUAL=':'
```
好きなエディタがある場合にはそれにしておくことも可能

## 背景
Linux や macOSには less コマンドがあり、ファイルの内容を開くことができる。（それ以外にもできることはあるが。。。）
lessコマンドでファイルを開いている時に "v" キーを押すとエディタが開き、内容を編集することができる。できるのだが...

個人的なlessの用途として、
- 内容を見たい。 (編集は不要。というよりもしたくない)
- ファイルの行数が長く、モニタ的にcatではきつい。
- 検索もしたい。
みたいな場合が多く、タイプミスなどでいきなり「編集可能な状態」になってしまうのはあまり嬉しくない。

試しにlessを開いて "v" を押してみると、(環境によるとは思うが) 手元の環境では vim が開いた。
反射的に `C-x C-c` を押してしまう体質なので、絶対に編集したくないファイルでこの状態になると結構焦ったりもする。

cat でファイルを開いてパイプでlessに繋ぐなどすればいいのかもしれないが、
逐次更新 (F) できなかったりと不便 (そもそも毎回打つのが...)

対応としては、環境変数の "VISUAL" に好きなコマンドを入力してあげればいい。
emacs にすれば emacs が開くし、nano にすれば nano になるはず
何もしたくない ("v" を押しても何も (見た目的に) 起こらなくしたい) 場合には ":" にしておけば良さそう

### macの場合には...
emacsがない...？ (macOSには元々インストールされていた気がしたが...

```shell

$ which emacs
emacs not found
```

macOSにインストーラからemacsをインストールした場合には、 `/Applications/Emacs.app/Contents/MacOS/Emacs -nw` を指定すれば問題なく動いた。
( brewなどでインストールした場合はわからない
学生にありがちな下限、上限のif文の改善

#学生にありがちな下限、上限のif文#


こんばんは。今回使うのはstd::min とstd::maxです
便利なのでソースを綺麗にしたい人はやってみてほしいです

##std::minとは
```ruby:before
    if(Num>100){Num=100;}
```
std::minを使うと

```ruby:after
Num=std::min(Num,100);
```
このようにif文を書かないで済みます。

std::min関数は2つの引数のうち小さいほうの値を返す関数です
##std::maxとは

```ruby:before
     Num--;
    if(Num<0){Num=0;}
```
std::maxを使うと

```ruby:after
  Num--;
Num=std::max(Num,0);
```
std::max関数は2つの引数のうち大きいほうの値を返す関数です

##少しでもif文を減らす
パット来ないかもしれないけれどこれから先便利にあるので知らない人は片隅にでも覚えててほしい:grin:
.a ファイルのビルドを makefile と build.ninja で比較。 make から ninja への移行検討メモ

# これは何

[GNU make](https://www.gnu.org/software/make/) から [ninja](https://ninja-build.org/) に移行を検討中のメモです。

# 想定読者

`makefile` を自分でかける人
`.PHONY: clean` を毎回書くのに飽き飽きした人
素の make の動作が遅いなぁと思う人
ninja 向けのメタビルドツールを作りたい人

# ninja って何?

https://mattn.kaoriya.net/software/ninja/20140121141906.htm こことか読んでください。

# libfoo.a のビルドを比較

`a.c`, `b.c`, `c.c` の3ファイルから構成される `libfoo.a` をビルドする例を `makefile` と `build.ninja` で示します。
実行ファイルのビルドについては [前回](https://qiita.com/2fbCvmiYKX/items/671ea66b252f8571b2ab)を見てください。

今回は、ソースファイルの置き場と、ビルドの作業領域が別ディレクトリとしています。下記のようなファイル配置です。

```
./
|-- src/a.c
|-- src/b.c
|-- src/c.c
|-- build/makefile
`-- build/build.ninja
```

make する場合は、 `make -C build` を行います。 ninja する場合は `ninja -C build` となります。

## makefile の場合

`makefile` の例を示します。デフォルトルールを全力で利用した場合、下記のようになると思います。
並列ビルドを行うと、 `libfoo.a` が破壊されるので実用性は皆無です。デフォルトルールを使わない方が良いでしょう。

```makefile:makefile
CFLAGS = -Wall -Os -MMD -MP
CPPFLAGS = -DNDEBUG

vpath %.c ../src

.PHONY:clean
libfoo.a: libfoo.a(a.o) libfoo.a(b.o) libfoo.a(c.o)
libfoo.a(a.o):
libfoo.a(b.o):
libfoo.a(c.o):

clean:
	$(RM) libfoo.a a.o a.d b.o b.d c.o c.d
-include a.d
-include b.d
-include c.d
```

相変わらず、clean ルールの記述が面倒くさい。
初回 make は、中間ファイルが削除されるので、ちょっと気持ちがいい。
しかし、このルール記述だと毎度 ar が走るので、イマイチです。

## ninja.build for gcc の場合

上記 makefile と同等の build.ninja を示します。 ninja は、暗黙のルールや変数を持ちません。
そのため、すべて明示的に定義しています。

```:build.ninja
cc = cc
cflags = -Wall -Os
cppflags = -DNDEBUG
ar = ar
arflags = rv

rule compile
     deps    = gcc
     depfile = $out.d
     command = $cc -MMD -MP -MF $out.d $cflags $cppflags $target_arch -c -o $out $in

rule archive
     command = $ar $arflags $out $in

build libfoo.a: archive a.o b.o c.o
build a.o: compile ../src/a.c
build b.o: compile ../src/b.c
build c.o: compile ../src/c.c
```

今回は、makefile と記述量があまり変わりません。変わらない理由は、makefile で変数展開を駆使していないからですが。。。
rule文とbuild文を明確に分けて記述するだけなので、読む側からは理解しやすいです。
makefile だと、サフィックスルールの記述方法が2種類あって、どっちがどうだったとか、ライブラリ用の書き方がどうだったかとかで混乱します。
そして、clean がビルトインされているのがうれしい。

# 感想

make は暗黙ルールを使わないと負けた気がして、無理矢理使ってしまいがちです。私だけかもしれませんが。
とは言え、暗黙ルールと暗黙の変数を使用しておかないと、環境変数で `CLFAGS` や `CC` をオーバーライドしたりできなくなってしまうので、使わないとダサい makefile になっちゃいます。
暗黙ルールに従った makefile であれば、 gcc から clang に変えたければ `export CC=clang` してから make すれば良いので便利。クロスコンパイルしたければ、`export CC=arm-linux-gcc` してから make すれば OK だったりして便利。
といっても、こんな簡単にいかないから autotools や cmake が流行っている訳で。

思い返すと、 makefile を初めて書いたとき、build.ninja のように全てのルールと依存関係を記述していた。慣れてきて、暗黙ルールを駆使して記述量が減ることに喜んでいました。しかしなぁ、全部書くのと機能に違いが無いんだから、書きゃいいよなぁ。昔と違って、エディタもPCリソースも豊かなんだし。ということで、ninja がいいと思います。

# 参考リンク

[The Ninja build system](https://ninja-build.org/manual.html)
[Static library built-in rule in GNU make](https://stackoverflow.com/questions/31694358/static-library-built-in-rule-in-gnu-make)
【58日目】Gitの仕組みを理解しよう！

# gitの導入
今後のプログラミング学習においては、個人開発でもGitを使っていこうと考えています。
とりあえずgitをインストールして使ってみることは簡単かもしれませんが、一旦落ち着いて、具体的な仕組みをきちんと理解していきたいと思います。

## gitとは
gitとはソースコードのバージョン管理ツール

ファイルを編集した際に、編集前の状態をとっておいて、いつでも元に戻せるようにしたいと思ったらどうすればよいでしょうか？
例えばそのファイルをコピーして、ファイル名にバージョン名を加えて管理することが考えられると思います。
しかし、その方法では管理が煩雑ですし、間違いも起きやすく、ファイル名だけではそのバージョンがどういう内容なのかもわかりにくいです。
さらにチームで編集しているファイルなどでは、同時に編集したことによって他の人の作業内容が失われてしまうことも起こり得ます。

こういったバージョン管理による問題を解消することができるのがgitです。
gitでは、好きな時にファイルの状況を更新履歴として保存しておき、いつでも当時の状況に戻すことができます。
さらに、古いバージョンのファイルで、新しいファイルを編集しようとすると警告が表示され、他人の作業を勝手に消してしまわないようになっています。

## gitの仕組み
gitの構造は次のようになっています。

（１）ワークツリー（実際に作業をする場所）
　　　↓add
（２）インデックス（gitに上げる必要があるもの置場）
　　　↓commit
（３）ローカルリポジトリ（ローカル環境/分散）
　　　↓push  
--------------------------------------------------------- ↑ローカル/ ↓共有
　　　↑pull
（４）リモートリポジトリ（GitHub）


###（１）ワークツリー
ワークツリーは開発者が実際に作業を行うディレクトリのことです。
ここで作業した変更履歴のうち、gitを使って管理したい部分だけをインデックスにaddします。

###（２）インデックス
ワークツリーからaddされた変更履歴が集積されている場所。
全ての作業内容をgitで管理するのはかえって煩雑なため、必要な内容だけをインデックスに一旦addして管理する。
最終的にインデックスに記述された変更履歴をコミットすることでローカルリポジトリに渡して開発者個人の編集履歴を管理します。

### （３）ローカルリポジトリ
ローカルリポジトリは開発者の手元の環境において「git init」したディレクトリのことです。
開発は全てこのディレクトリ配下で行うことになり、編集されたファイルがaddされたインデックスをコミットすることで、その時点での編集履歴を保存します。

#### コミット
コミットをすると、前回のコミットと今回のコミットの変更履歴の差分を記録したリビジョンと呼ばれるものが作成されます。この差分が時系列順に保存されているようなイメージです。
この変更の差分を辿っていくことで、任意の地点の変更内容を知ることができます。

ローカルリポジトリに保存された変更履歴は、あくまでその開発者個人の分のみです。
リモートリポジトリにプッシュされて初めて他の開発者と共有することができ、またリモートリポジトリからプルすることによって、その変更内容をローカルリポジトリに適用することが可能です。

### （４）リモートリポジトリ
リモートリポジトリは手元の作業環境ではなく、各種開発者がそれぞれ自身の変更履歴をプッシュして共有するためのリポジトリで、GitHubなどの外部にあります。
各開発者はこれらのバージョン情報をプルすることで、ローカル環境にその変更内容を取り込むことができます。
また、リモートリポジトリをそのままクローンすることで、全く同じ内容をローカルリポジトリに写すこともできます。

#### マージと競合の解決
最後にリモートリポジトリからプルした後、次にプッシュをしようとした時に、先に他の人がプッシュしてリモートリポジトリの内容が書き換わっていた場合、自分もさらにプッシュしてしまうと誰かの変更履歴を上書きして消してしまう可能性がある。
そのため、先にプッシュしている人がいた場合、その人の変更内容を「マージ」という機能によって一旦ローカルリポジトリに取り込んでから、プッシュする必要がある。
この時の変更履歴の適用は、基本的にgitが自動でやってくれます。
ただし、リモートリポジトリに上がっている最新の変更と、ローカルリポジトリで自分が加えた変更が同じ箇所だった場合、どちらが正しいかgitには判断できないので、手動で修正する必要があります。



このようにして、バージョン変更を時系列順に管理し、即座に過去の状態を再現できるようにしながら、他の人と変更内容を共有し、さらには誤って他の人の作業を消してしまうことが内容にしているのがGitです。

次回からはGitの具体的な使用方法についてまとめてみたいと思います。
CognitoのAWS-cliコマンド集

### ユーザの作成

```bash
aws cognito-idp admin-create-user \
--user-pool-id ap-northeast-1_XXXXXXXXX \
--username username \
--user-attributes Name=atr_name,Value=atr_value \
--profile profile_name
```

### ユーザプールのユーザーパスワード設定

※ `--permanent` を付けると、ステータスが `CONFIRMED` になる。

```bash
aws cognito-idp admin-set-user-password \
--user-pool-id ap-northeast-1_XXXXXXXXX \
--username username \
--password password \
--permanent \
--profile profile_name
```

### ユーザの属性値変更

```bash
aws cognito-idp admin-update-user-attributes \
--user-pool-id  ap-northeast-1_XXXXXXXXX \
--username username \
--user-attributes Name=atr_name,Value=atr_value \
--profile profile_name
```

### Cognitoのサインアウト

```bash
access_token=XXXX
aws cognito-idp global-sign-out --access-token ${access_token}
echo $? # コマンドの実行結果が返ってこないのでじっこうステータスを見る
```