OmniAICreator/Qiita-1.07M huggingface dataset:
応用カリキュラム 05 課題前の心構え

アプリケーション開発について、ゼロからリリースするまでを学ぶ。

企画⇨設計⇨開発⇨公開

開発中は、
わからないことは調べる。但し、長く詰まらないように！！時間で区切って質問！！
読みやすいソースコードを書く。
変更に強いプログラムを書く。

Git,GitHubを使って開発環境管理ツールに慣れる。
コミットはとにかく小さく機能毎に。
コミットメッセージを自分以外にむけてわかりやすく記載。

コードレビューしてもらう前に確認すべき点

- 凡ミス確認　　DB 外部キー、インデックス設定、n+1問題考慮
- コードは全てを論理的に説明できること
- クラス設計、MVC、コントローラの切り分け等
- 定義した名前付けが適切かどうか
- 適切なコミットできてるか

コーディング規約に則って書けると立派。

[Rubyコーディング規約](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md)

[Railsコーディング規約](https://github.com/satour/rails-style-guide/blob/master/README-jaJA.md)

コードを綺麗に読みやすく書けるようになりたいが、機能実装が最優先かな。
UE4ノードのみのプロジェクトからC++コードの使えるプロジェクトへの移行

#　ファイルの移動
　**コンテンツブラウザの中のコンテンツを右クリックして移行を選択**
![移行1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537026/5ad8e6dd-5727-58b2-f4c1-39ccfbf9920d.png)
**移行先のプロジェクトのコンテンツを指定してOKを押す**

これでファイルの移行は完了です。

#　その他
　プロジェクト設定などの情報は移行されないのでGameInstanceやインプットをいじっている方は注意してください。
####　インプット情報の移動
プロジェクトファイル　＞　Config　の中身を移行先の同じところにコピーしてあげるとセットし直す手間が省けます。
備忘録　by　cat　&　rose

部分積分の公式
​	∫ f(x) g(x) dx= f (x) G(x) - ∫ f '(x) G(x) dx

これの解釈をネットで調べてもわかりにくく、

自身の備忘録として書き留め

また、悩んでいる方の参考になれば幸いです。

前提知識として

　積の微分公式

　{f(x)g(x)}'=f'(x)g(x)+f(x)g'(x)

次に微分の積分はもとの関数

　∫{f(x)g(x)}'=f(x)g(x)

その次に

　　A+B=C　
　
　　両辺を積分して
　
　　∫A＋∫B＝∫C

　　また、引き算して

　  ∫A＝∫C-∫B

肝となるのは、積の微分公式

Fの微分をf、fの微分をf'、f’の微分をf''、f''の微分をf'''とする

同様に

Gの微分をg、ｇの微分をg'、g'の微分をg'’、g''の微分をg'''とする


　　　　　　    縦書きにすると

                    
           　F  ・・・・・G　

　　　　　f  ・・・・・g

　　　　　f' ・・・・・ g'

             f''         g''

             f'''        g'''


          FとGの 下の方向が微分で、上の方向が積分


　ここで第１行目の　F　と　G　の積の微分を考えてみる


　　　1行目　　F①  ・・・  G②
　　　　　　　　　　
　　　2行目　　f③  ・・・ g④


　　（F　G）'＝ｆG　＋　Fg　となり
　　　　　　　　③②　　　①④
     1行目の積の微分は2行目とのタスキ掛けの和となっている。

　　　ついでに同様に

　　　第３行目の　ｆ’　と　g'　の積の微分を考えてみる


　　　3行目　    f' ・・・  g'
　　　　　　　　　　
　　　4行目　　　f'' ・・・  g''


　　（f'　g'）'＝f''g'＋ｆ’g''　となり

　　3行目の積の微分は4行目とのタスキ掛けの和となっている。


　　　積の微分の計算パターンが見えてきたところで

　　　Gの列を1行下げてみる

　　　　　F ・・・・     ↓

　　　　　f  ・・・ ・   G

            　f'          g

              f''         g'

              f'''        g''

 　　　　　　　　　　　g'''

　　同様に積の微分を考える

　　　　2行目の　（ｆ　G)　の積の微分は

　　　　2行目　　　f  ・・・・  G

       　　 3行目      f' ・・・・  g

　　　　　　（f 　G）'＝f 'G＋ｆg　　となる

　　　　両辺の積分をとると（インテグラルをつける）


　　　　∫（f 　G）'＝∫　f '　G　＋　∫　ｆ　g　

　　　　　　　右辺の第一項を左辺に移行
　　　　

　　　　∫（f 　G）'- ∫  f 'G  = ∫ｆg　

            左辺第一項の微分積分がとれて　

　　　　　　　∫（※）'＝※

　　　　　
　　　　　　　f 　G - ∫ f ' G  = ∫ ｆ g　

　　　　　　　右辺と左辺を入れ替え



　　　　　　∫ｆg　= 　f 　G - ∫ f 'G  

　
　　　　　　お終い


　　　　　おまけ）
　　　　　覚え方　
　　
　　　　　　漱　　　　石　　引退して、　　ビッ　セルに　行く
　　　　　　そのまま、積分　引くインテグ　　微分　積分　＋Ｃ　
　　∫ｆg　= 　f 　　　G 　　　-　 ∫ 　　　　f '　G  　　（＋C）
　
　　　　あと便利な瞬間部分積分という裏ワザもあります。
　　　　　　ネット検索すればたくさん載っています。
　　　　 　
　　　　初めての投稿で、使い方がわからず、
　　　　黒帯が現れたり、文字と文字の間隔が
　　　　予期せず、なくなったり、改行がずれたりと。
　　　　見にくくてすみません。
　　　　内容に誤りあればお知らせください。
rootでAnkiの起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526362/af331218-8891-501c-4f76-73d11f2a5377.png)

Kali linuxでAnkiを使ってみたいが、不具合が発生しました。

**解決方法**
指示の通りにパラメータ ```--no-sandbox```を付けたら起動できます。
```anki --no-sandbox```
MacでPremiere Proを使ってトムとジェリーのEDにあるような丸く型抜いて消えるみたいなエフェクト作る


今回は、レガシータイトルで白い背景を作成し、その上にロゴを配置した以下のような静止画に対してエフェクトをつけていきます。
スタートはこんな画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119773/b180e3c0-86a7-7dd5-0024-7740f1ec1ade.png)


今回は静止画ですが、もちろん、動画でも大丈夫です。

## レガシータイトルで黒背景と白丸を作成する

レガシータイトルの作成は、Macだと以下のように作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119773/53e5afe1-ed62-1f5c-51f3-e27302120249.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119773/a31b470b-9d35-30af-9086-d1f0337ef184.png)


黒背景と白丸をエフェクトをかけたい部分に重ねてタイムラインに配置します。
そうするとこのようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119773/976daa98-3022-66cc-03ec-a1a59d82c069.png)


## 次に、黒背景に対してエフェクトを設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119773/ad069da0-4406-c3cb-1771-70136205cfbd.png)

このビデオエフェクトのトラックマットキーを黒背景に対して設定し、そしてエフェクトコントロールから、トラックマットキーの以下の設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119773/b674568e-91a8-40e4-218f-075add20abc0.png)

マットを適用するのはVideo4なので、`Video4`を選択。
`コンポジット用マット:` はルミナンスマットを選択。
この二つを設定した上で、下の素材（今回はロゴ画像）が見えない場合は`反転`もチェックを入れてください。

## 次に、白丸に対して`モーション`を設定する

モーションとはエフェクトコントロールにあるこの部分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119773/f40c7946-987e-d85d-a0db-f5172e557b64.png)

例えば、このようなモーションをつけてみます。
![3f6c10d24a90765d8a67fcffee714f23.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119773/fd16b5cb-315a-a5b2-7877-ea84f27b6e0f.gif)

このモーションの基本は、白い丸をめちゃくちゃ広いところからだんだんと狭め、最後にはゼロにする。
基本的にはこのやり方で、あとは狭めていくスピードや白丸のサイズを調整していくことでできあがります。

＊ キーフレームを追加してモーションに動きをつけよう
どれぐらいのスピードでどれぐらいのサイズまでというのを決めるとき、どこからどこまでという点（キーフレーム）を決めます。
それがこの部分です。右側にひし形の点（キーフレーム）が5つあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119773/acba1caf-3af3-0773-29f5-88f6c575a6a2.png)

点の上にある時間をみてもらうとわかるかと思いますが、2sを過ぎたあたり、3sを過ぎたあたり、その後1点と4sを過ぎたあたりと最後にキーフレームを追加しています。
キーフレームを追加するときは、![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119773/20778792-5a82-7e8f-fde4-d10e8beb1952.png)配置したい時間のところまで時間を進めたり・戻したりして移動させ、丸いボタンを押下することでキーフレームを配置することができます。

やってみましょう。
![c62381462511ded5dbeb628a80e9dd97.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119773/dc7c119a-f64c-c20c-d78d-49332e76fb30.gif)

一度配置したキーフレームは、削除はもちろん、横移動で時間の調整、上下移動でスケール調整ができます。


* スケールの調整をしよう

動画にもあるように、キーフレームを追加した場所ごとに白丸のスケール調整をすることで狭まる、広がるというモーションを実現します。
スケールの調整は上でも書いたように、追加したキーフレームを上下に動かすことで調整もできますが、それ以外にも方法があります。

それがこの部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119773/fa43d4a3-07b2-cc03-ce05-0dfda352df86.png)

今回は、maxのスケールを800にしています。このように数字を直接入力してスケールを調整できますし、800.0と書かれた数字のしたに200.0と○がみえるかと思います。この○い部分を左右に動かしてスケールの調整ができます。しかし、注意なのは、200.0と書かれているのがわかるかと思いますが、つまり200.0以下のスケールの調整しかこの部分ではできないため、スケール調整をするときは、キーフレームを上下に動かすことでちょうどいいモーションを実装するのが良いかなと個人的には思います。

# 完成！

これだけで、トムとジェリーのEDにあるようなモーションが完成しました！とても簡単ですので、ぜひ作ってみてください。

おわり
フィンテックエンジニア養成勉強会#3

###会場は[東京証券取引所](https://www.jpx.co.jp/)
・有難いことに東京証券取引所に入館させていただき、業界をリードする方々から日常業務では得る事が出来ない知見を聴かせていただきました（この場所が「東京市場」かと思うと感慨深いものがありました）。備忘録として記録したいと思います:slight_smile:

・[JPXデータクラウド](http://db-ec.jpx.co.jp/)
オンライン情報提供サービスです。
四本値（始値・高値・安値・終値）や売買高・売買代金などをダウンロードし、データ分析するためにFin-Techスタートアップ企業などが実証実験で使っている。

###金融ビックデータの活用と今と未来
・[ナウキャスト社](http://www.nowcast.co.jp/)
・JCBやTポイントのデータを使い、汚い（コードが理解出来ない）データを使えるデータにしたり（クレンジング）、レポート作ったり。
・POSデータで今を分析する。データサイエンティストに使ってもらう。

・[アルパカジャパン社](https://www.alpaca.ai/ja/)
・[アルパカフォーキャストクラウド](https://www.alpaca.ai/)、数分後の株価の動きを予測する。
・[jpxlab](https://qiita.com/kitayama_tomoya/items/23a9e8b570a679e34502)をオープンソースとしてリリース。

・内部と外部データの利用状況として、従来のデータが使い尽くされている。外部データが重要になってきている。
・リスクベースで考えている。
・機械学習に詳しい人いるけど、育成も必要。

###金融クラウドの進化
・パブリッククラウドを使ってない人はいますか？の質問に対して手を上げる人は0人でした。（早く「モダン」な使い方を実現し差別化しなくてはと感じた）

・リスク、コンプライアンスのクリアが大変
・少しずつ理解してもらうところから始め、POCやりました
・[fisc](https://www.fisc.or.jp/)レポート
・[CCoE](https://pages.awscloud.com/rs/112-TZM-766/images/J1-04.pdf)（Cloud Center of Excellence）!!!

・導入に時間がかかる金融ユーザが多い（船が山を登る。。。）ので、外してはいけないセキュリティ要件と機能要件を押さえる
・止まらないシステムはないと言っている、止まった時を予め考えておく
・ロイズ銀行は「モダン（k8s・サーバーレス）」なシステムやっている
・勘定系をクラウドに持っていく意味は？　→運用コストが安くなる、お客さんが幸せになる、バッチ処理の時間が短くなる、などメリットがあるならクラウドを選ぶ

・[マネーフォワードクラウドシリーズ](https://biz.moneyforward.com/)
・アジリティを高めたいならクラウドにする意味がある

###[Slido](https://www.sli.do/)で質問させていただきました！
Q1：どんなエンジニアと一緒に仕事したいですか？
A1：①今はホワイトペーパとか素材が揃っているので自ら勉強する人材がいい。②自分のために勉強している人。一言えば十わかる人と仕事したい。③会社の存在価値を高めてくれる人。自分の技術を高めることに加え、技術の新しいものや変化に適応できる人と働きたい。

Q2：クラウドを利用した金融サービスの中で凄いと思った事を教えてください。
A2：①C社の設計は凄かった、感覚、センス、40人でこれやったのかと思った。②使い易いとか変化に強いのが凄いと思う。

###勉強会の感想
日本を支えている分野であるる金融ビジネスの中で、過去の経験や学びを多く積み上げ、活躍されている人達に少しでも追いつけるように、日々、インプット＆アウトプットしたいものです。どうもありがとうございました:bow_tone1:

最後に余談ですが・・・
テレビなどで見たことのある[シリンダー](https://www.jpx.co.jp/learning/tour/virtual-tour/index.html)の様子をブラウザで見ることができます。とってもワクワクします:smiley:
Postfixadmin-Cliを使ってpostfixにコマンドでドメイン・アドレス・エイリアスを追加

今時まだPostfixAdminなんて使ってる人いるのかっていう感じでしょうが、
お客様のお金の関係で未だにSESを使えずにいます。

そんなこんなでpostfixadmin-cliというコマンドラインツールを最近知りまして、
いろいろ自動化のためにcliからコマンドを発行してアドレスを作ろうと思ったのでございます。

さっそく、良く使うと思われるコマンド例を挙げていきます。

1.　まず、ドメインを追加しましょう。

```bash:ドメインの追加
sh /var/www/html/postfixadmin/scripts/postfixadmin-cli domain add anken.co.jp
```
楽勝ですね。

2.　メールアドレスを追加しましょう

```bash:メールアドレス（mailbox）の追加
sh /var/www/html/postfixadmin/scripts/postfixadmin-cli mailbox add support@anken@co.jp --password "*********" --password2 "*********"
```

[参考]https://www.skyarch.net/blog/?p=5461
（2015年だってよ...弊社終わってますね）

3.　エイリアス（転送用）メールアドレスを追加しましょう。

```bash:エイリアスの追加
sh /var/www/html/postfixadmin/scripts/postfixadmin-cli alias add payment@anken.co.jp --goto "watashino@mailadress.desu,joushino@mailadress.desu"
```
これで私と上司にpayment@anken.co.jpのアドレス宛てのメールが転送されます。

https://sourceforge.net/p/postfixadmin/wiki/Postfixadmin-cli/
いくらマニュアル通りにやっても通らなくて、
ググりまくったら"--goto"を使ってる例を何とか発見。
~~わかるわけねぇだろが（怒~~

#終わりに
クラウドの台頭で枯れたどころか朽ちてきているpostfixでまだ運用してる方の助けになりますように。
コマンドラインからSourcetreeを開きたい

## 概要
ターミナルから、現在のリポジトリをサクッとSourcetreeで開きたい方向けの記事です。
普段の作業はコマンドが速いのですが、差分やログはSourcetreeが見易いので、使い分けたいところです。


## 環境
- Git 2.31.1 (Apple Git-128)
- Sourcetree 4.1.5 (241)
- macOS Big Sur 11.5.2

## 何が面倒か
- Sourcetreeで既存リポジトリをGUIでブックマーク追加するのが面倒
- ⌘OでFinderから辿って開くのはもっと面倒

## できること
- `stree`を実行すると、現在いるリポジトリをSourcetreeで開けるようになります。

## 方法

- Sourcetreeのメニュー -> Sourcetree -> コマンドラインツールをインストール
- streeコマンドが入ったか確認
 - コマンドラインから以下を実行して
```
stree -v
```

## 現在いるリポジトリ以外も開きたい
相対・絶対パスで開けます

```
stree /work/target_repo/
```

つまり、現在のカレントディレクトリの場合は

```
stree .
```

# おまけ

## streeコマンドのみでシンプルに使う

デフォルトの設定ではSourcetreeで前回開いていたプロジェクトも一緒に開いてしまいます。
私はこれを無駄で紛らわしいと感じたのでオフにする方法を紹介します。
![sourcetree-setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275986/0b6dc3e4-a4e3-981f-c8c5-2cf9c17e9ad5.png)
1. `その他`の`ウィンドウの復元`で`起動時にウィンドウを復元しない`を選択
2. `起動時にブックマークを閉じたままにする`にチェック

これで必要なときに必要なものだけが表示されます。

## Alfredとの統一感を出す
AlfredでSourcetreeを前面にもってくるときは
「so」で呼び出すことが多いので、私はシェルに以下のエイリアスを設定しています。

```sh
alias so='stree .'
```
これでコマンドラインかFinder上でただ切り替えたいのかを意識せず利用できます。


## おわり
GitUp、Fork、Towerなどいろいろなツールがあるので使い所を考えると良いでしょう。

最近出たGitUp、狂おしい程高性能なのでいづれGeekな使い方を紹介したいと思います。
https://gitup.co/
NumPyで拡散方程式のアニメーション

#やること
pythonでラプラシアンを含む微分方程式のシミュレーションをしたかったのですが，つい先日にラプラシアンの差分をfor文以外で処理する方法を思いついた(車輪の再発明をした)ので拡散方程式のアニメを書きました．

思いついてから改めて調べてみたら数年前に自分のやったことの上位互換をされてる方がいらっしゃいました．その記事はかなり参考にさせていただきました: [NumPy・SciPyを用いた数値計算の高速化 : 応用その1](https://qiita.com/jabberwocky0139/items/a9751d11caa64bc19226)

解いている微分方程式は次式で表される1次元拡散方程式です:
$$
\frac{\partial }{\partial t}\psi(x,t)= D\frac{\partial^2}{\partial x^2}\psi(x,t)
$$
初期条件はガウシアンで与え，時間発展はとりあえずオイラー法にしました．

#書いたコード

```python:Diffusion_1D_ani.ipynb
%matplotlib nbagg
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import ArtistAnimation

# calculate Laplacian with periodic boundary condition
def Lap(L, M):
    # expand vector
    VL = [L[0]]
    VR = [L[-1]]
    Le = np.hstack([VR ,L, VL])
    Lc = np.dot(M, Le) # central diff
    return Lc[1:N+1]

# generate 1-D lattice and initialize
N = 64
x = np.linspace(-10, 10, N)
psi = np.exp(-x**2/7)

# time and diffusion const
dt = 0.05
T = np.arange(0.0, 37, dt)
D = 3

# make (N+2)x(N+2) matrix to calc Laplacian
I = np.eye(N+2,N+2)
S = np.vstack((I[1:],np.array([0]*(N+2))))
M = S + S.T -2*I 

# make animation
fig = plt.figure()
ims = []
for i in range(len(T)):
    psi += dt*(D*Lap(psi, M))
    line = plt.plot(x, psi, 'b')
    ims.append(line)

ani = ArtistAnimation(fig, ims, interval=5, blit=True, repeat=True)

plt.show()
```
###実行例
![Diffusion.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505603/cbdc1de8-f05e-23d6-b534-151edae3d2a6.gif)

##工夫した点
ラプラシアンの計算を行う際に元の$N$次元配列$\psi$の右端と左端の値をそれぞれ左端と右端に`np.hstack`でくっつけて$N+2$次元配列にしました．これにより，予め用意した$(N+2)\times(N+2)$行列$M$と内積を取れば自動的に周期境界条件を含む拡散項が計算できました．境界条件用に追加した部分は不要なので関数の最後に捨てています．

#総括
課題点:とりあえず見える形にしたかったので，数値的な安定性や誤差は1mmも考慮していません．NumPyに高速かつ安全に数値積分してくれる何かがあるとは思うので調べて何とかしようと思います．これらの課題に関して，今後何らかの進捗が生まれたら追記します．

今後:今回の1次元バージョンを適当に拡張すれば2次元バージョンも作れそうなので，反応拡散系のシミュレーションをやってみたいなあと考えています．(よっぽどエグい非線形項を含む方程式でなければ何とかなるっしょ...)

###追記:
(11/23) 前進差分で妥協すれば，3行で非線形項を入れられました．一応1次元のNavier-Stokes方程式もできそうです．

```python
def nl(L, N):
    Lf = np.hstack((L,L[0]))
    return L * np.diff(Lf)
```
前進差分だとレイノルズ数のみならず初期条件や時間の刻み幅も慎重に選ばないとすぐに計算が発散しました．さぁ，どうしましょうか
Docker メモ

自分用dockerメモ

## マウント系
これがわかりやすい
https://qiita.com/supaiku2452/items/5d6e78d10094f64d269f

ホストとコンテナ間でソースを同期する
```bash
docker run --mount type=bind,src=$(pwd),dst=/app -it --rm --name {コンテナ名} イメージ名 /bin/bash
```

## 起動済みコンテナにアタッチ
これがわかりやすい
https://qiita.com/leomaro7/items/649732faf2f632419f11
起動済みコンテナにアタッチした後exitを打ってもコンテナが落ちて欲しくない場合はexec

```bash
docker exec -it {コンテナID | コンテナ名} /bin/bash
```
新JIS対応でPマーク更新審査を受けた話

社内の情報システムを担当している @hsuzuki40 です。

この記事は  [Photocreate Advent Calendar 2019](https://qiita.com/advent-calendar/2019/photocreate) の 7日目 の記事です。

# 概要
フォトクリエイトでは、様々なイベントで撮影された写真をご本人様に提供しております。
その写真は個人情報として取り扱わなければならず、ご本人様に安心してサービスをご利用いただきたいと考えています。
Pマークを取得することで、個人情報を適切に取り扱うための運用を継続しております。
本記事では、JIS規格が改訂されて初めてPマークの更新審査を受けたのでポイントをお話ししたいと思います。

#前提知識
##Pマークとは
「プライバシーマーク」の略で、[JIPDEC（一般財団法人日本情報経済社会推進協会）](https://www.jipdec.or.jp/)が創設した制度。
JIS Q 15001に適合していないと取得できません。
2年に1回更新審査を通らなければなりません。
##JIS Q 15001とは
*個人情報保護マネジメントシステム ― 要求事項*
個人情報を保護するためにこういうことをしなさいというのが書いてある文書です。
2017年に個人情報保護法の改正に合わせて改訂されました。
https://ja.wikipedia.org/wiki/JIS_Q_15001

##  Pマーク取るとどうなるの？
２年毎に更新審査があるので、適切な運用が継続できます。
個人情報保護法遵守よりも厳しい対応が求められます。
具体的には、個人情報取得時に事前同意が必要になる点。
外部に「ちゃんとしてますよ」アピールができます。

##社内における個人情報保護の運用
1年単位で以下のことを実施しなければなりません。

- 従業員教育
- 運用点検
- 内部監査
- 運用見直し
- 委託先監督

これだけでも結構大変です。

#### **フォトクリエイトでの運用ポイント**
フォトクリエイトでは写真が商品として取り扱われています。
インターネット写真販売業界では初のPマーク取得事業者となりました。
最初は審査員も「写真＝個人情報なの？」って困惑していました。
「個人を特定できる情報」という法の定義に照らせば、顔が写っていれば個人情報であると言えます。
なので、写真は全て個人情報として取り扱っています。

Web掲載＝第三者提供なので法律上も事前同意が必須です（改正後）。
撮影前の本人との接点はイベント主催者や幼稚園等になります。
そこで同意を得てもらわなければなりませんので、なかなか大変です。

事業サイドが新しい取り組みを始めるにあたって、決まってから相談をしてきたり。。。
法を侵さないことはもちろんのこと、ご本人様に納得していただけるよう考えています。

# 文書審査
JIPDECが委託している審査団体に審査の申し込みをします。
**申請書の書式がJIS改訂前とは変わっていました。**
以下の書類を印刷して郵送します（まだ紙文化w）

- 更新審査申請書
- 定款
- 履歴事項全部証明書
- 社内文書一式（2cmくらいの厚さ）

書類送付から1ヶ月後くらいに現地審査の日程について電話で連絡が来ます。
その連絡の1ヶ月後くらいに設定されます。

# 現地審査
ここからが本番！
7時間くらい審査員としゃべりっぱなしになるので体力が必要です。
社内での承認の履歴とかサイトのここダメじゃね？って言われたり。。。
JISの要求事項を元に質問攻めになることを覚悟しておきましょう。
今年で５回目の審査でしたが、基本的に現地審査の審査員は毎回違う人になります。
人によって見るところも指摘も違うので柔軟な対応が必要になります。

##こんなことをチェックされます

- 委託先との契約関連
    - データの保持期間と破棄についての記載が契約書にあるか 
    - 特定個人情報の記載についての記載が契約書にあるか
- 書類の破棄記録について現物確認
- 管理台帳の現物確認
- 苦情や問い合わせの記録を残しているか
- 運用点検の記録
- 匿名加工情報について、社内規定と公表文書があるか

# JIS改訂の影響
- 個人情報の管理台帳に「利用期限」・「保管方法」というのが必要
- 関連する法令一覧でマイナンバー法を特定しておく
- 従業員教育時にプライバシーポリシーの説明をしなければいけない（**教育資料に本文を載せなければならない**）
- 内部監査のチェックシートを新JISに合わせる

- **以下を社内規定に入れる必要がある**
    - 外国にある第三者への提供について
    - 第三者提供時と受領時の記録を保管することについて

# あとがき
ここに書いた情報はあくまでフォトクリエイトが対応したことです。
これが全てではありませんし、不要なこともあるかもしれません。
フォトクリエイトでは一緒に情シスとして会社を裏から支えてくださる方を募集しております。少しでもご興味をお持ちいただけたようでしたら、人事部門の担当者 [@tetsunosuke](https://twitter.com/tetsunosuke) へお知らせください。
let式とスコープ、シャドウイング(Rustの基本構文-2-)

#はじめに
Rustの基本的な文法をまとめてみた。第1回の続きです。
###目的
Rustにおける基本的な構文の理解をする。
それらを活用したコードの作成。

#Rustの基本構文シリーズ
第1回⇒[Rustの基本構文(1)](https://qiita.com/jin237/items/b344d3a7e6dfe1056e31)　　URL：https://qiita.com/jin237/items/b344d3a7e6dfe1056e31
第3回⇒[Rustの基本構文(3)](https://qiita.com/jin237/items/59ef229a4de30cb8203b)　　URL:https://qiita.com/jin237/items/59ef229a4de30cb8203b
#ソースコード（うるう年と平年）
from URL: https://github.com/ghmagazine/rustbook/blob/master/ch06/leap-year/src/main.rs
このコードが基本的なことがいろいろあるので、使用していく。これを紐解くことで理解を深めていく。

```rust
// 入力された年がうるう年かどうかを判断するプログラム

// `std::io` 名前空間を `io` としてインポート
use std::io;
// `std::io::Write` トレイトを使う
use std::io::Write;

// エントリポイントとなる関数
fn main() {
    let mut year = String::new();
    print!("Please input a year to check if it is a leap year: ");
    io::stdout().flush().unwrap();
    io::stdin().read_line(&mut year).unwrap();
    let year = year.trim().parse::<u32>().unwrap();

    if is_leap_year(year) {
        println!("{} is a leap year!", year);
    } else {
        println!("{} is not a leap year.", year);
    }
}

// うるう年の場合は `true` 、平年の場合は `false` を返す関数
fn is_leap_year(year: u32) -> bool {
    year % 4 == 0 && !(year % 100 == 0 && year % 400 != 0)
}
```

#let式(スコープ、シャドウイングなど)
###スコープ
第1回記事にて、変数導入のlet文について基本構文とミュータビリティについて記述した。
その__変数には有効範囲__がある。範囲のことを__スコープ__という。

例を引用してくる。(from 実践Rust入門　言語仕様から開発手法まで P.224,225-例3)

```rust
//例3
//main関数
fn main() {
    scope_example();
}
//scope関数
fn scope_example(){
    let _x = 10;
    if _x == 10{
        let y = 20;
        println!("{}", y);
    }
    
    {
        let z = 30;
        println!("{}", z)
    }
    println!("{}", _x);
}
```
実行結果

```terminal
[Running] cd "c:\Users\[username]\rust\project1\" && rustc let_function2.rs && "c:\Users\[username]\rust\project1\"let_function2
20
30
10

[Done] exited with code=0 in 3.721 seconds
```
{　}で囲まれた部分が__ブロック__と呼ばれる部分である。__ブロックとは{　}で囲まれたプログラム要素のこと__で、その__範囲内でしか、変数範囲は有効とならない__。ただし、一番外側（だいたい関数の最初から）を__グローバルスコープ__と呼ぶ。


###シャドウイング
例を引用してくる。(from 実践Rust入門　言語仕様から開発手法まで P.226-例4)

```rust
fn main() {
    shadowing_example();
}

fn shadowing_example(){
        let _x = 10;
        let _x = 20;
        let x ="String";

        println!("{}", x);
        {
            let x = 30;
            println!("{}", x);
        }

        println!("{}", x);
}
```
実行結果

```terminal
[Running] cd "c:\Users\[username]\rust\project1\" && rustc let_function3.rs && "c:\Users\[username]\rust\project1\"let_function3
String
30
String

[Done] exited with code=0 in 0.578 seconds
```
同じ変数に対して、中身が違うものを入れたときに最後の変数に導入された中身のものが採用される。
さらにはブロック内でスコープが決まっているので、変数記号が同一であっても中身は変わってしまう。
__シャドウイングとは、前に導入した変数を新たに導入した変数で隠してしまうこと__であり、__イメージとしては上書きでいい__と思う。

#最後に
今回載せているコードについても実行できる、または、Warningがない状態で例文を書き換えたものとなっている。書籍その通りには書いていない。このコードでしっかりと理解してほしい。
疑問になりそうなことについて（アンダーバーのことなど）は別記事で。
let文の内容についてはだいたいこれくらいになる。今回は「__変数__」についてだったので、第3回では「__定数__」についてまとめていこうと思う。
JenkinsからAWS Lambdaをデプロイする

# Jenkinsとは
初心者ですが、私の解釈としては自由度の高いCI/CDツールという位置付けです。
実行したい内容をJobという形で登録しておくことで自動で実行してくれます。
今回初めて触ってみたので、忘れないうちにメモしておきます。

#手順　
- コンソールから「新規ジョブ作成」を選択します。

![スクリーンショット 2019-11-22 11.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/98c74577-8b2c-b2ab-4737-49fcc347c22b.png)

- そのジョブの中に入り「新規アイテム作成」を選択。
基本的に一番上のフリースタイルでいいと思います。
![スクリーンショット 2019-11-22 11.47.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/3afb99f4-5792-f3e4-6973-4354258ac4e4.png)

- アイテムの設定をしていきます。
**ソースコード管理**と**ビルド**だけ設定すれば今回は動きます。
ソースコード管理にはgitを選択しました。これによってJenkinsが、設定したレポジトリをcloneしてくれます。
![スクリーンショット 2019-11-22 11.48.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/6b25d452-c6a3-a5c5-20a6-becd11ddbf70.png)

ビルドでは、シェルの実行を選択します。これでシェルスクリプトと同じ操作ができます。
![スクリーンショット 2019-11-22 11.50.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/38f15048-2ba3-3939-dd8f-ad849f345a3d.png)

- シェルスクリプトを書いていく。
このシェルスクリプトが実行されるタイミングでは既にcloneが実行されています。
※なぜかclone元の親ディレクトリ配下のファイル群が展開されるので注意

```sh:script.sh
cd /path/to/lambda_dir
zip -r lambda.zip .
aws aws lambda update-function-code --function-name function-name --zip-file fileb://lambda.zip #function-nameはlambda上の上書き対象の関数名
```
- 権限周りで問題が出る場合は、Jenkinsサーバにsshするなりして.aws/credentialsや.aws/configを編集しましょう。
- 出力は「コンソール出力」から確認できるのでエラーを読みたい場合などはここを確認。
 ![スクリーンショット 2019-11-22 11.59.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/a6c61a93-5805-0d5a-6941-73a11bfbded9.png)
mariadbが死んでも自動で復活させる方法

まー、mariadbに限らずなのですが。

# 環境
- CentOS7
- maridb 5.5

# やりかた
crontabに仕込んどく。

```bash:bash
# crontab -ie
```

↓
以下記述

```bash:crontab
* * * * * systemctl status mariadb.service 1> /dev/null || systemctl start mariadb.service
```

## 軽く解説（蛇足）
crontab -e ではなくcrontab -ie としてるのは安全策。crontab -rしたらcrontabの内容がぶっ飛ぶから。
普段からcrontab -iつけるようにしとけばcrontab -ir した時に確認メッセージが出て気付ける。


crontab の、実行タイミング（分 時 日 月 曜日）をすべてアスタリスクにする（* * * * *）と、毎分実行になる。

|| は、左辺が失敗したら、右辺が実行されるやつ。

1\> /dev/null は、/var/spool/mail/root にメール吐かないように。（エラー（＝mariadbが停止していたとき)は吐く）
ジェネリックの基本クラス制約とクラス継承によるメソッドの隠ぺい関係(どっちが強いか!?)

独習C#第３版p483を読んでいて、ジェネリックの基本クラス制約とクラス継承によるメソッドの隠ぺい関係について知りたくなり、以下の通り実験した。
結果、基本クラス制約が強く、メソッド隠ぺいを無効にすることが分かった。

```C#
using System;

namespace p483
{
    class Program
    {
        class ReverseClass
        {
            public string ReverseStr(string str)
            {   // 文字列を反転するメソッド
                string result = "";
                foreach (char ch in str)
                    result = ch + result;
                return result;
            }
        }

        // ReverseClassクラスから継承するNonReverseClassクラス
        class NonReverseClass : ReverseClass
        {
            // ここでは、ジェネリックの基本クラス制約の機能を確認するために、
            // ReverseMethodsクラスのReverseStrメソッドを隠ぺいする
            new public string ReverseStr(string str)
            {
                return str;     // メソッド名はReverseであるが基本クラス制約の機能を
                                // 確認するためこのクラスでは反転させず、パラメータをそのまま戻す
            }
        }


        // ReverseClassで基本クラス制約をかける
        class Test<T> where T : ReverseClass
        {
            T obj;
            public Test(T o)
            {
                obj = o;
            }
            public void ShowReverse(string str)
            {
                String revStr = obj.ReverseStr(str);
                Console.WriteLine(revStr);
                Console.WriteLine();
            }
        }

        static void Main()
        {
            ReverseClass objA = new ReverseClass();
            NonReverseClass objB = new NonReverseClass();

            Console.WriteLine("基本クラスによるジェネリック");
            Test<ReverseClass> t1 = new Test<ReverseClass>(objA);
            t1.ShowReverse("This is a test.");

            Console.WriteLine("継承クラスによる隠ぺいをした場合のジェネリック");
            Test<NonReverseClass> t2 = new Test<NonReverseClass>(objB);
            t2.ShowReverse("More testing.");
            t2.ShowReverse("基本クラス制約をかけると、継承クラスの隠ぺいは無効になることがわかる。");
            Console.WriteLine("継承クラスでメソッドを隠ぺいして、文字列を反転しないようにしたが、");
            Console.WriteLine("その効果は表れず、継承クラスの隠ぺいは呼び出されなかった。");
            Console.WriteLine();
        }
    }
}
```


![実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/c29bf403-d909-0633-d27b-e3bb15514bb0.png)
Linuxのサービス管理

# はじめに

CentOS7でyumインストールされたパッケージのサービス管理情報がどこにまとめられているか調べ直した。

# CentOS7のサービス管理
CentOS6まではchkconfigコマンドで管理してきたが、CentOS7からはsystemctlコマンドを使って管理するようになった。

## systemdの情報が管理されているディレクトリ
/etc/systemd/ディレクトリ以下にsystemdが利用する情報が管理されている。


# デフォルトターゲットの確認方法
CentOS6までのデフォルトランレベルに相当するのがデフォルトターゲット。マルチユーザー(ランレベル3)の時に起動するユニットが何を元にして選択されているか調べるには get-defaultオプションを使用する。

```console:
$ systemctl get-default
multi-user.target
```

/etc/systemd/system/multi-user.target.wantsディレクトリ以下に必要なサービス群が登録される。


# ユニットの自動起動について
httpdを例にsystemdから自動起動するユニットとして登録してみる。

## ユニットの自動起動登録

```console:
$ systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target/wants/httpd.service to /usr/lib/systemd/system/httpd.service.
```

## ユニットの自動起動確認

```console:
$ systemctl is-enabled httpd
enabled
```


# 参考
- Systemdメモ書き https://qiita.com/a_yasui/items/f2d8b57aa616e523ede4
- CentOs7システム管理ガイド(秀和システム)
Appleにバグレポートを送った時の手順

iOS13で[CNCopyCurrentNetworkInfo()がNULLを返す時がある](https://forums.developer.apple.com/message/385189)現象が自分のところでも再現したので、Appleにバグレポートを送りました。
その時の手順まとめ。

## `sysdiagnose`でログを取得する
基本、[Bug Reporting - Profiles and Logs](https://developer.apple.com/bug-reporting/profiles-and-logs/)にある手順書通りに作業するだけ。

## プロファイルのインストール
[Bug Reporting - Profiles and Logs](https://developer.apple.com/bug-reporting/profiles-and-logs/)から、目的に応じたプロファイルを選択してiPhoneにインストールします。

今回はWi-Fi関連の障害なので、`Wi-Fi for iOS`のプロファイルをインストールしましょう。

## 現象を再現させる
プロファイルのインストールが終われば、ログ取りのために現象を再現させます。

発生した日付・時刻は忘れずに記録しておきましょう。
Feedback Assistantに送信する時、必要になります。

## `sysdiagnose`を実行する
再現させた後、[手順書](https://download.developer.apple.com/iOS/iOS_Logs/WiFi_Logging_Instructions.pdf)に従って`sysdiagnose`を動作させます。

> Trigger a sysdiagnose by simultaneously pressing and releasing both volume buttons + Side (or Top) button. 
> Notes:
> - The sysdiagnose is triggered upon button release.
> -On an iPhone you will feel a short vibration when a sysdiagnose is successfully triggered.

2019/11時点では、電源ボタン＋音量ボタンの両方を押しこんで少し待ち、放した後に起動します。
~~スクショ取られたりシャットダウンの画面でたりするので正直使いづらい~~

5分から10分程度待つと、sysdiagnoseの結果が保存されます。

設定.app > プライバシー > 解析 > 解析データ に、`sysdiagnose_`から始まるデータが保存されていれば成功です。
AirDropなどでPCやMacに転送しましょう。

## Feedback Assistantに投稿する
[Feedback Assistant](https://feedbackassistant.apple.com/)を開き、バグレポートを送信します。

書き方などは[このスライド](https://speakerdeck.com/knagadou/yong-qi-wochu-site-applenibagurepotowochu-sitemimasenka)が参考にできます。

## 参考にしたもの
* [Bug Reporting - Profiles and Logs](https://developer.apple.com/bug-reporting/profiles-and-logs/)にある手順書
* [iPhoneのsysdiagnoseの取得方法](https://qiita.com/HirotoshiKawauchi/items/d7952ab834d7376d7903)
* [勇気を出して、Appleにバグレポートを出してみませんか？](https://speakerdeck.com/knagadou/yong-qi-wochu-site-applenibagurepotowochu-sitemimasenka)
htmlとcssのみで簡易的なダイアログを作る方法

記事を読んでて、ちょっと感動したので、勉強がてらの忘備録です。

:targetを使うやつなので、
「はいはいそれね。」の方は、大事な時間をロスするかもしれません。
お戻りください。


こんな感じで動くので、ますはコードペンで実際に動かしてみてください。
https://codepen.io/AdrianBece/pen/poopaaQ


まずはコードの説明から。


```html:html

<a href="#modal">Open modal</a>

<div class="modal" id="modal" tabindex="-1">
  <a href="#" class="modal__overlay" aria-label="Close modal"></a>
  <div class="modal__content">
    <a href="#" class="modal__close" aria-label="Close modal">&times;</a>
    <div>Modal content</div>
  </div>
</div>

```

1行目のaタグは発火用のテキストボタンです。

続いて、モーダルをwarpしている.modal。ようはダイアログの背景です。（背景の透明のグレーとかの）
###これにaタグのリンク先のid(modal)を指定。
.modal直下のaタグは、ダイアログ以外をクリックした時にダイアログ消すためのwrap。

そしてダイアログ自体は.modal__contentです。
その中にはダイアログを閉じるためのボタンと、テキストが入っています。（←中身はなんでもいい）


```css:css

/* --- Required CSS (not customizable) --- */

.modal {
  display: none;
}

.modal:target {
  display: flex;
}

/* --- Required CSS (customizable) --- */

.modal {
  text-align: left;
  backdrop-filter: blur(2px);
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  padding: 2rem;
}

.modal:target {
  justify-content: space-around;
  align-items: center;
}

.modal__overlay {
  position: absolute;
  height: 100%;
  width: 100%;
  left: 0;
  top: 0;
  cursor: default;
}

.modal__content {
  min-width: 480px;
  position: relative;
  background-color: #f5f5f5;
  padding: 2rem;
}

.modal__close {
  color: initial;
  text-decoration: none;
  position: absolute;
  top: 0;
  right: 0;
  padding: 0 0.5rem;
  display: inline-block;
}

/* --- Codepen styles - not required --- */

body {
  padding: 2rem;
  text-align: center;
  font-size: 2rem;
}

```


続いてcssです。ずらっと並んでいますが、
ここでのポイントは2行目の、
### .modal:target !!

擬似要素の:targetは、MDNではこう説明されています。
>CSS の :target 疑似クラスは、URL のフラグメントに一致する id を持つ固有の要素 (対象要素) を表します。


.
.
.

アホな僕は頭にハテナが浮かびます。

ただ、忘れた頃に確認しに来る未来の自分に分かるよう、頑張って説明します。

今回のケースでいうと、

```
<a href="#modal">Open modal</a>'
```

のhrefで指定している#modal。これは、


```
<div class="modal" id="modal" tabindex="-1">
```


のid="modal"を指していて、
aタグをクリックしたら.modal:target{}内のcssが反映されるという仕組み。
（ちなみにcssはclassで指定していますが、#modal:target{}でも大丈夫）

今回は display: none; -> display: flex;

に切り替えるためだけに使っていますが、文字の色とか背景色なんかも変えることができますね。
hrefの指定は#からしかダメだったのでclassは無理。idで単一のターゲットにしか使えないっぽいです。

ダイアログを消すときは

```
<a href="#" class="modal__overlay" aria-label="Close modal"></a>
```

aタグのhrefを"#"だけにすることでOK！
ダイアログを消す背景部分（ダイアログの背景）にセットすると...なるほどダイアログを消せます。
closeボタンにも記述するといいですね。

一つ注意点で、aタグをpositon: absoluteで飛ばしているのは理由があって、
aタグって要素内にaタグを入れれないので、そうしています。
なのでaタグでダイアログをwrapしてしまわないように注意してください。

ちなみに:targetはほぼ全てのブラウザ（iE含めて）使えます。

まだ知ったばかりで何も試してないけど。これはちょくちょく使えるなと。
transitionとか効くのかな〜いろいろ試してみたい。

また仕様が分かってきたら、追記します。


コリスさんの記事を参考にしました。
この記事まじで神。
https://coliss.com/articles/build-websites/operation/css/css-elements-without-javascript.html

ではでは。
git hook の pre-push を使おうとしてハマったこと

## 問題
push前に入れたい動作があったのでpre-pushにスクリプトを書いてみた。
ブランチ名とハッシュが取りたい、[どうやらreadで標準入力から取れるらしい](https://qiita.com/mkiken/items/af5c40ce0d0c6d3530c7)。
こんな感じで試してみる。

```shell:pre-push
#!/bin/bash

read local_ref local_sha1 remote_ref remote_sha1
echo "branch=${remote_ref##refs/heads/}"
echo "hash=$remote_sha1"
exit 0
```

これでpushすればブランチ名とハッシュが表示されるはず！

…

表示されない！！なんで！！！

## 解決
表示されるリポジトリもあればされないのもある、色々やってみたけど条件がわからない。
結局[このSOの記事](https://stackoverflow.com/questions/22585091/git-hooks-pre-push-script-does-not-receive-input-via-stdin)を見つけて解決しました。

up-to-dateなブランチで試してたんですが、
pushするものがないときは標準入力から取れないらしいです／(^o^)＼
goose マイぐれ

#install

githubにforkされている版もある。


ロールバック（Down）、再実行（redo）の単位が１ファイル（１バージョン）単位なので、
なるべくセットのSQLは1ファイルにまとめる。
テーブル毎にファイル作るとかやると面倒。

```
go get bitbucket.org/liamstask/goose/cmd/goose
```

#config

open: %ユーザ名%:%パスワード%@tcp(%IPアドレスor DNS%:3306)/%DB名%

```
dbconf.ym

development:
    driver: mysql
    open: root:hogepw@tcp(mysql:3306)/bookdb

test:
    driver: mysql
    open: root:hogepw@tcp(mysql:3306)/bookdb_test
```

```
goose status
```

```
goose create create-users
```

```
goose up
goose down
goose -env test up
goose -env test down
```

```
#down and up
goose redo
```


```
goose is a database migration management system for Go projects.

Usage:
    goose [options] <subcommand> [subcommand options]

Options:
  -env string
        which DB environment to use (default "development")
  -path string
        folder containing db info (default "db")
  -pgschema string
        which postgres-schema to migrate (default = none)

Commands:
    up         Migrate the DB to the most recent version available
    down       Roll back the version by 1
    redo       Re-run the latest migration
    status     dump the migration status for the current DB
    create     Create the scaffolding for a new migration
    dbversion  Print the current version of the database

```
是丈は心得おくべし：AWS

深く後悔したことをメモしていく。

# AWSのサービスと関係するコードは、最初の1行からAWS上でユニットテストすべし

ユニットテストは手元で走らせたいのが人情だが、やってはならない。うっかり`moto`を信じた私が馬鹿だった。`moto`は何をしてもまったくエラーを返さない。

# Lambdaでは共有メモリが使えない

そのため`multiprocessing`の`Pool`と`Queue`が使えない。そのため`loky`も使えない。

[Parallel Processing on AWS Lambda with Python using Multiprocessing](https://sysadmins.co.za/parallel-processing-on-aws-lambda-with-python-using-multiprocessing/)

# CodeBuildでCodeCommitのリポジトリをソースにすると、普通に`git clone`する。しかしCodePipelineでCodeBuildをキックすると、CodeCommitのリポジトリをZIPファイルとして取得するので、`.git`ディレクトリ等が存在せず、Gitメタデータが使えない

知らなければ絶対に思いつかない驚天動地の[クソ仕様](https://forums.aws.amazon.com/thread.jspa?threadID=251732)。AWSに限らず、誰か「知らなければ必ずハマる驚天動地のクソ仕様」というまとめを作ってください。

随時追記する予定。
LambdaからLightsail上のコンテナDB(MariaDB)へとアクセスする

初投稿の記事です。

私の環境ではEC2ではなくLightsailを使ってます。そして、その上にdocker-composeにてコンテナのDBを動かしています。この状況でLambdaからコンテナ上のDBへとアクセスする方法を探したのですが、ググった感じ日本語の記事など見つからず。
結論としてはVPCにLambdaを入れ、LightsailもVPC Peeringすれば普通にアクセスできました。分かってる人にしてみると、当たり前なのでわざわざ記事するほどでも無いんでしょうね…。

###### 誰向け？
私と同じくAWSを始めたばかりや、初心者向けの内容だと思います。

###### 前提
+ Lightsail上にdocker-composeによるDB(MaridaDB)がすでに立っている環境。
+ 恐らくこんな構成だと思います。
![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537256/1c1d45d2-d921-6459-6f31-7fdc1570d571.png)


以下の手順で実施しました。
1. Docker上でDBへのリモートアクセス設定。
2. LightsailをVPC Peeringする。 
3. LambdaにVPCを設定をする。
4. LambdaからVPC上のDBコンテナへと疎通確認する。


###### 1. Docker上でDBへのリモートアクセス設定。
当たり前すぎて恥ずかしいのですが、実はここでいきなり躓いて疎通確認が上手くいかず時間がかかってしまいました。というのも、私の環境ではコンテナ1(DB)とコンテナ2(App)が動いております。そのためコンテナ同士はポート開放せずとも通信が可能なため、てっきり空いているものと勘違いしていました。

1.1. ポートの確認
以下のコマンドでちゃんとポートが割当てられている確認します

```
ubuntu@ip-xxx:~$　sudo docker ps
CONTAINER ID  PORTS
1a77aa41a892  0.0.0.0:3306->3306/tcp 
```

長いので他ステータスは省略しますが、ここでMySQLのポートが空いていることを確認しましょう。

1.2. DBのアカウント確認
次にDB上でリモートアクセス用のアカウントが作られているか確認します。

```
ubuntu@ip-xxx:~$　sudo docker-compose exec [コンテナ名] /usr/bin/mysql -uroot -p[rootのパスワード] [DB名]
MariaDB [DB名]> SELECT Host, User FROM mysql.user;
+-----------+----------+
| Host      | User     |
+-----------+----------+
| %         | Useruser |
| %         | root     |
| localhost | root     |
+-----------+----------+
```

localhost以外のUserが作られていれば、リモートからのアクセスは可能です。

1.3. インターネット経由でのリモートアクセス確認
不正アクセスされても笑って済ませられる環境であれば、ここで一旦、インターネット経由で疎通確認した方が良いと思います。この時点で失敗していると、VPCも何も関係ないですし。

+ Lightsailのポートを開放する。
+ 好きなMySQLクライアントで接続する。  
　→LightsailインスタンスのグローバルIPに接続　
+ 疎通確認後、Lightsailのポートを閉じる。

###### 2. LightsailをVPC Peeringする。 
これはLightsail上の設定でVPCピアリングを設定するのみです。なお、今の仕様(2019年11月)ではデフォルトVPCへの接続しか選択肢が内容です。デフォルトVPCを削除しているとエラーが出ました。

###### 3. LambdaにVPCを設定をする。
Lambda側にVPCに関する設定を行いましょう

+ LambdaをデフォルトVPC内に入れる。
+ LambdaにVPCに関するIAMポリシーを割り当てる。  
+ VPCのセキュリティグループを確認する。  
→デフォルトでは全ポート空いているので特に設定不要でした。

###### 4. LambdaからVPC上のDBコンテナへと疎通確認する。
Lambdaのテストを実行し、エラーなどでなければ終了です。
→LightsailインスタンスのプライベートIPに接続

###### あとがき
Lambda部分はさらっと書いてますが、初AWSだとここが一番わけわかんないですよね。lambda-uploaderを使っているのでコードだけじゃなくて一緒にアップロードする設定ファイルが特に。
業務が暇なときに私用環境のAWS弄っているのですが、AWS Cliなども入れた開発用のLightsailインスタンスをもう一台立てて~~遊んでます~~勉強してます。
社内PCに勝手なツール入れると怒られたり、Proxy認証がある会社なので。
Androidエミュレーターでadb remountしようとしてもfailする場合

## adb remountを実行するとfailする

この記事に従ってhostsを書き換えようと思ったが出来なかった。

https://qiita.com/devnokiyo/items/5388169f798bd2678d64

## 解決策

最初から入ってるエミュレーター`Nexus_5X_API_29_x86`では頑張っても無理でした。
Android Studioから新しいエミュレーター`Nexus_6P_API_27`をインストールしてリトライしたらあっさり解決。

```
$ emulator -list-avds
Nexus_5X_API_29_x86 // NG
Nexus_6P_API_27     // OK
```

## 結論

とりあえずAndroidシミュレーターを動かしてChromeでWebページの表示を確認したかっただけなので、詳しい原因等調べていなくて恐縮ですが参考になれば幸いです。
【入門】kibanaのインストールから始めるまで

**kibanaは公式のユーザーガイドがとてつもなく分かりやすいので、Qiitaで調べずに公式のユーザーガイドを見よう。（マジでわかりやすい）**

### kibanaユーザーガイド
https://www.elastic.co/guide/jp/kibana/current/index.html

### Kibanaのインストール
https://www.elastic.co/guide/jp/kibana/current/install.html

### kibanaの始め方 及び チュートリアル
https://www.elastic.co/guide/jp/kibana/current/getting-started.html
プログラミング学習５日目

今現在わからないことについて


ruby on　railsの
バグ修正の問題で、
何が原因か判断できない。

その理由はMVCの流れを理解できていないから。
細かいルール（どのように記述するかなど）

改善策としては、
これから先の練習問題をときつつ
どんなバグが多いのか体感して行く。

それで自分の理解できていない部分を
細かく洗い出す&よく出るバグの修正を重点的に出来るようにする。


今やるべきことは
問題をといて、自分の苦手を知ること。
どんなバグが多いのか知ること。

わからないことは人に聞くこと。ぐぐること。以上！
kerasのcallbackのEarlyStoppingの自分が勘違いをしていたところ

#EarlyStoppingとは
監視する値の変化が停止した時に訓練を終了する。

参考：https://keras.io/callbacks/

#勘違いをしていたところ
EarlyStoppingの引数で`patience`と`baseline`について勘違いしていた。
##patience
`patience`は監視する値が改善しなくなってから`patience`の数内に改善が止まった値よりも改善しなかった場合学習を止める。

```
model.fit(... ,callbacks= EarlyStopping(monitor='val_loss',patience=3, verbose=1, min_delta=0,mode="auto"))
```


```出力
patienceが３の場合

Epoch1/100  val_loss = 1.0
Epoch2/100  val_loss = 1.5　　epoch1と比較し改善していない。１回目
Epoch3/100  val_loss = 1.1　　epoch1と比較し改善していない。２回目
Epoch4/100  val_loss = 1.2　　epoch1と比較し改善していない。３回目
Epoch 00006: early stopping   止まる
```

##baseline
修正
>翻訳
>baseline：監視対象の数量が到達するためのベースライン値。モデルがベースラインを超えて改善を示さない場合、トレーニングは停止します。
引用：https://keras.io/callbacks/

よくわからない。


間違っているかもしれないのでご指摘をお願いします。
iPadOSにおけるUser-Agent

iPadOSが13から登場し、その影響でiPadにおけるUser-Agentの仕様が変わったことが話題になりました。
その中で、気になることがあったので検証してみました。

使ったのは[ウィルラボのUserAgent確認ツール](http://lab.risewill.co.jp/tools/web-tools/user-agent)です。

# 通常

<details><summary>スクリーンショット</summary><div>
<img width="768" alt="7A266C42-E33D-40E4-BF71-31794EEE8EC9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135304/ff294a97-da2f-b5cc-403d-6dd49cc0d2b0.png">
</div></details>

`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.1 Safari/605.1.15`
これは話題になったもので、macOSと区別が付けられなくなったパターンですね。
サーバ側でUser-Agentを見ているサービスはこの対応で苦労しているんじゃないでしょうか。

# 気になったのは以下

## Slide Over
<details><summary>スクリーンショット</summary><div>
<img width="768" alt="F2E4DED3-5A8A-4501-B66C-90FFAE7CC4D4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135304/0c831b74-32a6-086a-d95f-db6c639b9eb5.png">
</div></details>

`Mozilla/5.0 (iPad; CPU OS 13_1_3 like MacOS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.1 Mobile/15E148 Safari/604.1`

なんと、`iOS`という文字列こそ無いものの、`iPad`表記が現れたことでiPadであるという判定ができるようになりました。

## Split View
<details><summary>スクリーンショット</summary><div>
<img width="768" alt="EE28B2CA-F091-4DB4-B3FA-D867BC1F59F0.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135304/42d8053a-307b-da51-f9ed-e1da821e3369.png">
</div></details>

`Mozilla/5.0 (iPad; CPU OS 13_1_3 like MacOS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.1 Mobile/15E148 Safari/604.1`

画面分割比が小さいウィンドウではSlide Overと同じUser-Agentになりますね。
では画面分割比を大きくするとどうなるでしょうか

<details><summary>スクリーンショット</summary><div>
<img width="768" alt="F9B8FEB1-5E83-49A9-8A42-E38C977E29BE.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135304/dfc2b63c-1d5d-b2e7-baf4-31a1c17f6f30.png">
</div></details>

`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.1 Safari/605.1.15`

なんと、通常時と同じmacOSのUser-Agentになりました。

# 考察
以上のことから、iPadではウィンドウサイズによってUser-Agentを出し分けているのではないかという説が浮上しました。
今後iPad対応アプリではこれらのマルチタスキング用画面への対応が必須になるので、開発の際は注意しておいた方がいいかもしれません。
○分以内に登録されたDBのレコードを取得する方法

###　概要
SNS認証のために5分以内に同じ電話番号がDBに10個以上登録されていればエラーになる（しばらくその電話番号で登録できなくなる）、という実装をしようとしていたため、created_atに登録されている時間で５分以内の処理をしようと思ったのですが、その際詰まってしまったので備忘録メモ。


###　１つ目の詰まったところ

コントローラーに送られてきた$requestの中身を確認しようとしたところ、created_atのカラムがnullに！
これじゃ5分以内の部分が実装できない！でも他のテーブルではちゃんとcreated_atの値が入っているのになぜ？？と焦ったのですが、そもそもcreated_atはcreateされるときに値が入るので、createの処理前の値をvar_dumpで見ても入ってなくて当然というとても初歩的なことに後から気づかされました。




###　２つ目の詰まったところ

なかなか解決できなかった下記のエラー。
deleted_atと買いてあるが、deleted_atなんてカラム作ってなかったためなぜdeleted_atが？？？？状態。

```sql
SQLSTATE[42S22]: Column not found: 1054 Unknown column'phone_number_slotlings.deleted_at' in 'where　clause' (SQL: select exists(select * from `phone_number_slotlings` where `phone_number` is null and`phone_number_slotlings`.`deleted_at` is null) as `exists`)
```

いろいろ試してもわからなかったため相談してみると、継承元のBaseModelにuse SoftDeletesの記載があるためdeleted_atのカラムがないとエラーになるとのこと。
必要ないカラムでしたが、存在しても特に問題はないのでカラムを追加することにしました。
継承元もエラー時にどうなっているか一応確認はしていたのですが、use SoftDeletesが何をしているかまで確認せず...今思うと思いっきりDeleteって書いてあるのに。
DB周りのエラーは関係ありそうなモデルをもっと丁寧に確認しようと思います。

use SoftDeletesについて下記を参考にしました。便利な機能！
https://qiita.com/amymd/items/072b6b60dc5e4331b254


###　３つ目の詰まったところ
5分以内に同じ電話番号がDBに登録されているかどうかの実装が一番時間かかりました。
時間データはdate("Y-m-d H:i:s")のように記載して処理することができますが、特に入力せずにdate("Y-m-d H:i:s")のまま使用すると、現在時間を取得してくれるようです。
気づくのに時間かかった...

```php

date("Y-m-d H:i:s")　　//現在時刻取得
```


現在時間から●分前は、下記のようにして取得できます。


```php

date("Y-m-d H:i:s", strtotime("-● min"))  //現在時刻から●分前
```

A〜B（期間）以内の検索は、whereBetweenというメソッドがあったので下記を参考にして実装しました。
https://codeday.me/jp/qa/20190301/344067.html

```php

$hoge = Hoge::query();
$hoge->whereBetween('created_at', [date("Y-m-d H:i:s", strtotime("-5 min")), date("Y-m-d H:i:s")])->get();
```

これでいけるはず、、、が。取得できない。

```php
var_dump(date("Y-m-d H:i:s", strtotime("-5 min")));
var_dump(date("Y-m-d H:i:s");
```

でみると確かに時間が取得できているのになぜ...？
date("Y-m-d H:i:s")とdate("Y-m-d H:i:s", strtotime("-5 min"))をそれぞれ変数に格納してから使用するとうまくいきました。

```php
$start = date("Y-m-d H:i:s", strtotime("-● min"));
$end = date("Y-m-d H:i:s");
$phoneNumberSlotling = $phoneNumberSlotling->whereBetween('created_at', [$start, $end])->get();
```

これでうまいこと取ってこれました。めでたし。
JSやTSにおける日付処理

日付処理いつも忘れちゃうからまとめる

```typescript
const today = new Date(); // 変数が呼ばれた時の日時がDate型で取得できる
const year = today.getFullYear(); // 2019とかを取得できる
const month = today.getMonth(); // 月は0~11の値で管理されているというトラップ
const date = today.getDate(); // 日付は普通に1~の数字で管理されている
const day = today.getDay(); // 曜日は0~6の数字で管理されている 0が日曜で6が土曜
const tomorrow = new Date(today.setDate(today.getDate() + 1));
const nextMonth = new Date(today.setMonth(today.getMonth() + 1));
const nextYear = new Date(today.setFullYear(today.getFullYear() + 1));

const beginDate = new Date(today.getFullYear(), today.getMonth(), 1); // その月の初日
const endDate = new Date(today.getFullYear(), today.getMonth() + 1, 0); // その月の終日
```

UnixとDateの変換

```typescript
function convertDateToUnix(date: Date): number {
  const unix = Math.round(date.getTime() / 1000);
  return unix;
}

function convertUnixToDate(unix: number): Date {
  const date = new Date(unix * 1000);
  return date;
}
```
Date型を表示させるときに便利なdayjs

```typescript

import dayjs from 'dayjs';
import 'dayjs/locale/ja'; // これimportしないとエラー吐かれる

enum DateFormat {
  YY_MM_DD_dd = 'YYYY/MM/DD(dd)',
  MM_DD_dd = 'MM/DD(dd)',
} // enum型で表示パターンを書いておくと後で楽(jsはenum使えないけど...)

function formatDate(date: Date, type: DateFormat): string {
  switch (type) {
    case DateFormat.YY_MM_DD_dd:
      return dayjs(date)
        .locale('ja')
        .format('YYYY/MM/DD(dd)'); 
    case DateFormat.MM_DD_dd:
      return dayjs(date)
        .locale('ja')
        .format('MM/DD(dd)');
    default:
      return '';
  }
};

const today = formatDate(new Date(), DateFormat.YY_MM_DD_dd); // 2019/11/22(金)
const today2 = formatDate(new Date(), DateFormat.MM_DD_dd); // 11/22(金)
```

その他あると便利かもしれない関数

```typescript
// 日付を渡すと、その日付がその月の第何週目に当たるかを返してくれる関数
function getWeekIndex(date: Date): number {
  const week = 7; // 1週間は7日
  const sunday = date.getDate() - date.getDay();
  const nextSaturday = sunday + 6;
  const targetDay = nextSaturday + 6;
  const weekIndex = Math.floor(targetDay / week);
  return weekIndex;
}

// 日付とX週目を渡すと、その月のX週目にあたる平日の日付をDate配列として返してくれる関数
function getWeekOfMonth(date: Date, weekIndex: number): Date[] {
  const year = date.getFullYear();
  const month = date.getMonth();
  const beginDate = new Date(year, month, (weekIndex - 1) * 7 + 1); // その月の最初の日付
  const day_num = beginDate.getDay(); // その月の週初めの曜日番号
  let beginDayParam = 0; // その週の月曜を取得するためのパラメーター
  let targetDates: Date[] = [];

  const sunday = 0;
  const monday = 1;
  const saturday = 6;

  if (day_num === monday) {
    beginDayParam = 0;
  } else if (day_num === sunday) {
    beginDayParam = 1;
  } else if (day_num === saturday) {
    beginDayParam = 2;
  } else {
    // それ以外は曜日の分だけ日付を戻す
    beginDayParam = -day_num + 1;
  }

  beginDate.setDate(beginDate.getDate() + beginDayParam); // その週の月曜日取得
  const endDate = new Date(beginDate);
  endDate.setDate(endDate.getDate() + 4); // その週の金曜日取得

  // 欲しい期間の日付のDate配列を生成
  while (1) {
    const pushDate = new Date(beginDate);
    targetDates.push(pushDate);
    if (beginDate.getDate() === endDate.getDate()) break;
    beginDate.setDate(beginDate.getDate() + 1);
  }

  return targetDates;
}

```
Eclipse で HANA Studio の環境を作ろう


# 経緯

・HANA StudioはSAP Support Portal よりダウンロード可能
https://support.sap.com/en/my-support/software-downloads.html

⇒まさかの権限なしでダウンロードできず。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/32ecc6d5-c1d5-d43b-4e8c-dabf7909522d.png)

・Eclipse経由でHANA Studioのプラグインが使用できることを確認！
https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/ja-JP/b0e351ada628458cb8906f55bcac4755.html

# 導入方法

①以下のサイトにアクセスし、Eclipse(Neon)をダウンロード
https://www.eclipse.org/downloads/packages/release/Neon/3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/8b67a564-88be-c2bb-4c41-861a3f10e237.png)

②ダウンロードしたzipファイルを解凍し、任意のローカル環境へ移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/07466037-a206-3a2c-d2b9-82f183ceb5c0.png)

③「eclipse.exe」を起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/06bca573-0642-137d-54bf-d37891e7556c.png)

④任意のワークスペースを指定して、[OK]を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/ff503281-edb9-df07-4835-d90ef0b26063.png)

⑤新規ワークスペースが表示されるので、[Help]＞[Install New Software...]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/4ddb514c-ba42-6d53-b4f1-fdc8df8a2cfc.png)

⑥Work withフィールドに **「https://tools.hana.ondemand.com/neon」** と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/a59683b3-1463-6453-36b8-1dee46857e9f.png)

⑦「SAP HANA Tools」にチェックを入れ[Next]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/5786a674-d359-f622-7a51-b27a9cb19f14.png)

- 次のウィザードページに、インストールされる機能の概要が表示されます。Next を選択します。
- ライセンス契約を確認します。
- Finish を選択してインストールを開始します。
- インストールが正常に終了すると、Eclipse IDE を再起動するように求められます。

⑧再起動後、「Welcome」タブを削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/5056eda1-7097-39ad-6236-c5b5a2223300.png)

＜削除後＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/8b18f636-ed8c-d900-1744-9da825edb3ab.png)

⑨[open perspective]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/e1eb518c-8a67-ad2a-a787-a9d819eadb8d.png)

⑩[SAP HANA Administration Console]を選択し、[OK]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/20425389-e839-c8cd-df5b-0d41a3dc663e.png)

⑪HANA Studio のプラグインが起動しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/72edd48b-5815-c94a-b7cf-89751c8a5267.png)

# まとめ＆留意点
- HANA Studioのダウンロードには、専用の権限が必要
- EclipseにSAP HANA Tools を追加することで、HANA Studioとほぼ同様のインターフェースで開発可能
- SAP HANA Toolsに対応しているEclipseは、Neon(32または64bit)のみなので注意
コマンドプロンプトを使ってテキストファイルから指定文字列を含む行を取り出してリダイレクトする


DBからダンプしたSQLファイルからinsert文だけを抜き出したかった。
ファイルサイズがデカすぎてエディタで開けない場合に有効

cドライブ直下のdフォルダ内にある1GB弱の`big.sql`から"INSERT INTO"を含む行をouput.sqlに出力する

```
C:\d>find /N "INSERT INTO" C:\d\big.sql > c:\d\ouput.sql
```


サンコウ
[コマンドプロンプトWindowsの便利な使い方](https://www.k-tanaka.net/cmd/find.php)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339446/d9a02660-11c3-f471-e6e8-fbf082866775.png)
【LINE】LIFF の間違ったチャンネルのつくり方 【#linedev】

# 概要

LIFF が v1 から v2 に更新され、様々な便利な API が追加されました。ただし、最初のチャンネルの作り方を間違っている方が多そうでしたので、記事にします。

# 詳細

LIFF v1 のころはチャンネルは 「Messaging API」で作成していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/f8933685-e1fd-b53f-cb3f-bf29865713c7.png)

LIFF v2 からは 公式のドキュメントにもある通り、「LINEログイン」から作成しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/0e2d8f92-7a6a-c10c-c9b8-c1f4b1b4af08.png)

それ以外は基本的に同じです。

# 何がまずいの？
公式ドキュメントにはこのように書かれています。

> 現時点では、Messaging APIチャネルにLIFFアプリを追加することもできますが、追加しないでください。Messaging APIチャネルに追加したLIFFアプリには、以下の制限があります。
・ボットリンク機能は利用できません。
・LIFFの機能拡張に対応できない可能性があります。
・LIFFアプリが使用できなくなる可能性があります。
・なお、LINEログインチャネルに追加したLIFFアプリには制限がなく、LIFF v2のすべての機能を利用できます。

確認したところ現時点(2019/11/22)でもどちらでも作成・登録することはできました。

LINE ログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/3e92bab5-1fe5-f487-03cc-0dd777125f66.png)

Messaging API
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/f3aa5bc1-08b8-2aa4-c2a0-4f8332c42c5b.png)


https://developers.line.biz/ja/docs/liff/getting-started/

# まとめ

v2 から作成する方は LINEログインチャンネルから作成しましょう。
ts3

mybatis
Mybatis3でSQLを変更しても、いちいちAPサーバを再起動しなくてもいいような設定

List<OrderDto> orderDtoList = xxxRepository.selectOrder(dto);
↑これを一度コメントアウトして、下記に書き換える。実装が終わったら、下記のコードを消して元のコードに戻す。

List<OrderDto> orderDtoList = new ArrayList<>();
SqlSession sqlSession = null;
try {
  String resource = "\\META-INF\\mybatis\\mybatis-config2.xml";
  InputStream inputStream;
  inputStream = Resources.getResourceAsStream(resource);
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  sqlSession = sqlSessionFactory.openSession();
  orderDtoList =
      sqlSession.selectList("xxx.XxxRepository.selectOrder", dto);
 
} catch (IOException e) {
  e.printStackTrace();
} finally {
  if (sqlSession != null) {
    sqlSession.close();
  }
}

利用方法：

１．既存のmybatis-config.xmlとは影響しないよう、mybatis-config2.xml（ローカルで用意するファイル、コミットしない）を用意します。

　設定内容にはDB接続用の環境情報とSQL確認対象のmapperを追加します。

２．上記ソースをコピーし、下記のSQL行を実際のsql操作と合わせて修正します。

　　orderDtoList =sqlSession.selectList("kirin.domain.repository.hikari.Hks001Repository.selectOrder", dto);

/// 
mybatis-config2.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <typeAliases>
      <package name="xxx" />
  </typeAliases>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="org.postgresql.Driver"/>
        <property name="url" value="jdbc:postgresql://localhost:5432/iap_db"/>
        <property name="username" value="imart"/>
        <property name="password" value="imart"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="xxx/domain/repository/yyy/YyyRepository.xml"/>
  </mappers>
</configuration>
railsでアプリ名を確認する方法

[参考](https://off.tokyo/blog/rails5-%e3%81%a7%e3%82%a2%e3%83%97%e3%83%aa%e5%90%8d%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b%e3%81%ab%e3%81%af%e3%81%a9%e3%81%86%e3%81%99%e3%82%8c%e3%81%b0%e3%81%84%e3%81%84%e3%81%ae%ef%bc%9f/)
ローカル環境のfacebookログインでhttpsじゃないと怒られるときの対策

### 要約
ここ一年くらい、facebookのoauthログインでコールバックurlをhttpsにしないとローカルでもログインできなくなった。この記事のやり方で成功したのでメモ。ただし開発モードしかだめ。

### 詳細
https://stackoverflow.com/a/53120370
>enable Client OAuth Login and write "localhost:3000" in Valid OAuth Redirect URIs.
Save changes. it will automatically change to https://localhost:3000 , but it doesn't matter...
And set Status: In Development (THIS IS IMPORTANT!)
Then it will work in your http localhost.

この記事の通り
- `https://localhost:3000/xxx`(xxxはコールバックのパス)で登録。(portは自分はrailsなので3000)
- 開発モード
- 実際にはhttp://localhost:3000から遷移
したらできた