OmniAICreator/Qiita-1.07M huggingface dataset:
MIPSのSIMD其の弐

githubで探したところ、mips32-dspというテストケースに以下のようなコードがありました。

```c:bitrev.c
#include<stdio.h>
#include<assert.h>

int main()
{
    int rd, rt;
    int result;

    rt     = 0x12345678;
    result = 0x00001E6A;

    __asm
        ("bitrev %0, %1\n\t"
         : "=r"(rd)
         : "r"(rt)
        );
    assert(rd == result);

    return 0;
}
```

bitrevはshortのビット反転のようです。

AR9341で試したのですが、コンパイル方法がまずかったようで、ちゃんと動いてなさげです。

```
# ./bitrev
Trap cause = 58 (reserved 26 - user mode)
panic: trap
time = 1402
KDB: enter: panic
[ thread pid 303 tid 100050 ]
Stopped at      _DYNAMIC_LINKING+0x3:
db> where
Tracing pid 303 tid 100050 td 0x8066f3c0
kdb_enter+0x48 (?,?,?,?) ra 800f16f0 sp c3aefd38 sz 24
vpanic+0x184 (?,?,?,?) ra 800f171c sp c3aefd50 sz 32
shutdown_nice (?,0,0,0) ra 80272a78 sp c3aefd70 sz 32
trap+0x230 (?,?,?,?) ra 80261ff4 sp c3aefd90 sz 240
MipsUserGenException+0xe8 (?,?,?,400870) ra 0 sp c3aefe80 sz 0
```

サポート無いAtheros 24Kで実行すると正しくIllegal instructionになります。

なにかカーネルでおまじないが必要なのかな？

24Kのpdf見たら書いてありました。

> Tried to run an instruction from the MIPS DSP ASE, but it’s not enabled (that is,Status[MX]is zero)

NetBSDのsys/arch/mips/mips/mips_dsp.cが綺麗に書かれていて参考になりそうです。
Java SE 11 Programmer II (1Z0-816-JPN) を受験したので、学習プロセスをまとめてみました

# 始めに
　先日、Java SE 11 Programmer II (1Z0-816-JPN) を受験して無事合格できました。

これから受験しようとしている方！既に勉強中の方！
自分の学習方法が参考の1つになればと思ったので、その方法をまとめ、公開してみようと思います。

# 費やした期間(時間)・お金
　「Java SE 8 Programmer I」を持っているのが受験資格ですが、それを取得したのが一昨年の終わりくらいでした。
そこから若干期間を空けて学習を開始したので、正味の期間としては大体1年弱だと思います。

平日朝の出勤前と休日の昼間に学習を進めていて、大体 3~6 時間 / 週 くらい費やしていました。[^05]

　掛かったお金としては、上記資格に対応した模擬試験付きのテキスト[^10]を2~3冊[^12]と、本試験の受験料なので、テキスト代を4,000円/冊として概算で
　　4,000 円 × 3 + 32,340 円 = 44,340 円
くらいです。

　資格を取得された方の合格体験記を見ると、体感で3ヶ月~半年でテキスト1~2冊を何度も解いたという方が多い気がします。
自分はどちらかと言えばリソース多めに割いていた方かなと思っています。

# どんな風に学習を進めていたか？
　購入したテキストの問題を解いたり、公式ドキュメントを見たりして学習していました。

所謂「分からない事が分からない」状態で、まずは分からない事を洗い出すのが先決でした。そこで、いきなり問題集の模擬試験を解いてから、知らない事を炙り出して、学習の起点を作るスタイルで進めました。
具体的には、

1. 模擬試験を解く
1. 採点をして、解説を読む・テストコードの動作確認をする
1. 気になった点をテキストやドキュメント等でさらに深堀する

この1~3をひたすら繰り返していました。


ただテキストを見るだけだと「そういうものか」で終わる事も、問題として与えられたら「なぜそうなるのか？」という目線で考える事が出来たので、自分には合っていました。

テキストには通常、「Stream API」, 「JDBC」 みたいに章毎にまとめられていますが、そちらは模擬試験を解く中で「あ、この分野の知識足りてないな」と感じた時に、周辺知識の確認も含めて読むようにしていました。


# 学習を進める上で大事だと思ったこと

#### ①動作確認をする
これが最も重要だったと思います。
基本的に気になるコードは全て自分の手で動かしてみて、どんな挙動をするか確認していました。

(誰を悪く言う訳でもありませんが、)コードを動かしてみると、テキストに書かれた内容と異なる結果が得られる事も多々あって、問題の答えは選択肢aだと書かれていたけど、コードを動かしてみたら選択肢bだったという事がありました。

情報を鵜呑みにせず、何が正しいか自分の手で検証して確かめる訓練としても、とても効果的だったと思います。

#### ②一次情報を見る
　問題を解いて、知らないクラスやメソッドが登場するたび、一次情報 - javaドキュメント - を確認するようにしていました。
テキストや技術ブログは分かり易く書かれてはいるのですが、飽く迄2次情報なので参考程度に留めるよう気を付けていました。

　資格学習に限らず一次情報を当たるのは重要で、つよつよエンジニアはドキュメントから情報を得るようにしているらしいので、その訓練も込みで面倒でも確認していました。

# 終わりに
　試験では、コンパイルエラーとなるかを判断させる問題も登場します。エディタやIDEで検知できるんだからそんなの解けなくていいじゃん！、と元々は思っていました[^20]。

ただ実際の業務では、何千行ものソースコードを複雑なサービスロジックを考慮しつつ解読しないといけないシーンが多かったです。
なので、試験で出るような短いコードだったら、コンパイルエラーであろうと目視検知できても良いのでは、と思い直しました。

　実際の業務を意識すると、資格に受かるスキルというのがどこまで役に立つのか分かりません。ただ、学習の目安だったり分かり易くスキルを視覚化出来たりする所があったりと、個人的には資格学習はオススメです。


[^05]: 気分が乗ったときにはガッツリ時間を取って、そうでないときには程々で済ませていたので、週によって大部ムラがありました。
[^10]: 後述の理由で、書籍名は出さないです。
[^12]: ある程度冊数が欲しかったので、Java SE 8 のテキストも含めて購入しました。ただ、Java8->11 で出来るようになっている事もあるため、答えが異なる場合がある事には注意を払いました。
[^20]: 問題が解けないときほど、そう思いますね(笑)
ブランチの削除・ブランチの復元　Git

## 用途
ブランチを削除・復元したいときに使う。

## 使用方法
### ブランチを削除
```
$ git branch -d ブランチ名
```
```:例
$ git branch -d hoge
```

### 複数のブランチを削除
```
$ git branch -d ブランチ名1 ブランチ名2
```
```:例
$ git branch -d hoge hogehoge
```

### オプション
```
$ git branch -d ブランチ名
```
`-d` はマージやプッシュをしていないブランチは削除できない。
```
$ git branch -D ブランチ名
```
`-D` は強制的に削除できる。

### ブランチを復元（削除した際のハッシュ値を使用する。）
```
$ git branch -d hoge
``` 
上記で hogeブランチ を間違って削除してしまった時に以下の文が表示される。
〇〇〇〇がハッシュ値だからメモしておく。
```
Deleted branch hoge (was 〇〇〇〇).
```
復活させるには以下のコマンドを流す。（〇〇〇〇はハッシュ値）
```
$ git checkout 〇〇〇〇 -b hoge
```
DXスキルツリー：DX人材の役割とスキルセットを整理しました

今は驚くほど多種多様のデジタル人材育成プログラムが提供されています．
でも「研修を受けてもどこでスキルが使えるか分からない」「どの人にどんなスキルを身に着けてもらえばいいか計画が難しい」そんな声を何度も聞きました．そこで，
1. まずDXが最初から最後までどんな流れで行われる活動なのかを振り返り，
2. その中で必要なスキルと人材を整理する

という形で資料をまとめてみました．詳細は元のPDFをご参照頂くとして，ここではエッセンスを紹介します．
◇元ファイル：[DXスキルツリー](https://drive.google.com/file/d/1ACqbinVtOmua6ac0_tjC1DjyQPRvOwj8/view
)

### 想定読者
* DX人材になりたいけど何を勉強したらいいか分からない方
* DXに関わっているけどキャリアパスが見えず不安な方
* DX人材育成を企画するのにDXの全体像が分からない方

### 特徴
* (コンサルやベンダーではなく) DXで変わる側の視点で考えられている
* まずDXの流れを示している
* 職業の果たす役割とスキルの関係が明示されている
* 必要な人材をチーム単位で考えている
* キャリアパスへのヒントがある
* DXをプロダクト開発とプロジェクトの側面で捉えている
* [機械学習プロジェクトキャンバス](https://www.mitsubishichem-hd.co.jp/news_release/00837.html)の考案メンバーが主体となっている

## DXの流れ
私たちが整理したDXの流れをまず示します．
黒い四角で示されているのが必要な人材です．後で示しますが，かなり多くの専門家が必要なため，状況に応じたチームを組むことが重要です．

### DXの流れ：大枠
DX活動が始まる前後を表すとこんな感じになります．ざっくり言うと，経営戦略と現場課題の整合したポイントにニーズが発生し，それを基にDX活動が行われ，新製品やサービス，ビジネモデルやプロセスなどが生成されることになります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539151/10569463-d23d-e44e-0055-02cf6ff9c1b2.png)

### DXの流れ：DX活動
DXはニーズから始まる以外にも，技術を触ってみたり事例を真似してみたりと，様々な入り方があります．しかし王道は必要な問題を正確に捉え，適切な技術で解決することです．
* 構想ステージ：ニーズを定義し，それを解決できそうな技術を探して，実際上のアプローチが可能か検討します．
* 価値PoCステージ：取り組む価値があるのか，各種フレームワークやペーパープロトタイプなどを使い検討してみます．
* 技術PoCステージ：ここでようやくエンジニア陣を投入し，動くプロトタイピングを行って技術的に可能かどうかを検討します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539151/dd6aea31-2f41-e60c-7236-9d001aa9710e.png)
* 開発ステージ：コンセプトが検証されたら，本格的な開発を行います．ここでもアジャイルが望ましいものの，予算など意思決定の問題からウォーターフォールになる場合もありますので，それに耐えるだけの情報が出揃っている必要があります．
* 運用ステージ：基本的な保守運用をしつつ，継続的な改善や次の開発へのフィードバックを行います．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539151/b81d8af4-c412-a171-109e-91b0177f5390.png)

なお，DX活動には広義のプロダクト開発とプロジェクトの側面があると考えています．そのためプロダクトマネジャーとプロジェクトマネジャーが同時に登場しますが誤記ではありません．

## DXスキルツリー
前述のDXの流れを受けて，それぞれの登場人物の関係をスキルベースで捉え直してみました．流れには一部登場しない職業がありますが，どういうパターンで複数の職を修めることが多いのか，参考までに記載しています．

### DXスキルツリー(全体)
大きく分けて，
* ドメイン知識を持つビジネスサイドの人々
* 業務を分析したり戦略を提案したりする人々
* 全体活動やプロジェクトをうまく回せる人々
* デジタル技術に詳しい人々
* 動くものが作れる人々
* データ周りが詳しい人々

という区分けになっています．ただし相互に連関するため，スキルツリーはきれいに切れている訳ではありません．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539151/e9a76dc1-0e3f-b752-2253-73dc64b325ef.png)
元ファイルのPDFでは，それぞれの職をクリックするとその解説ページに飛べます．
(↓個別解説ページの例)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539151/1d15ab5a-d34d-ee86-2f28-be270c2bcfec.png)

職業はもっと線で繋ぐことも，もっと分解することもできます．RPGでいえば魔法剣士は典型的な複合職ですが，魔法格闘家だってあり得ると思います．逆に戦士でも個人戦と集団戦で専門職を分けることは可能です．DXスキルツリーの職業は，あくまで分かりやすくまとめた目安だとお考えください．
\# 例えば私はシニアデータサイエンティスト＋DXストラテジストといった趣ですが，この複合パターンは名前を付けるほど重要な組み合わせではないと判断しました．どんな専門職の組み合わせでも相互理解が進むので確実に意味はあるのですが

## 終わりに
世間のDX熱はすさまじいものがあります．コンサルティングファームが急拡大する一方，全てを外注できるはずもなく，またそうあるべきでもない．しかしデジタル人材獲得は熾烈．なので自社の人材を育てるしかない．
DX人材育成が叫ばれているのはこのような背景からだと理解しています．

そういったなか，DXの全体像からスキルに落とすガイドがないことに気付き，納得感を醸成するためにDXスキルツリーという形でまとめてみました．

本稿はあくまで考え方を示すものです．研修は無料のものから高額なものまで驚くほど多く提供されていますので，具体的な施策はそちらに譲ります．
ひとつの整理軸として参考になれば幸いです．

### 追記
この資料は現時点でバージョン0.1，まだスキルの解説もありませんし，正確性も網羅性も欠いています．私たちは1つの会社の元同僚ですが，現在は4つの会社に分かれてキャリアを築いており，このDXスキルツリー制作は個人として活動したものになります．夜と週末での活動には限界があるため，今後はより多くの方々と議論し発展させていければ幸いです．
json_encode　PHP　他言語に値を渡す

## 用途
他言語に値を渡したいときに使う。

## 使用方法
JSONは、多様なプログラミング言語に対応するデータ記述言語。
JSONを使うことで言語関係なく値の受け渡しが可能になる。
```php:書き方
json_encode($値, JSON定数);
```
※JSON定数は省略可能
```php:例
json_encode($hoge);
```

### 日本語で変換
```php:書き方
json_encode($値, JSON_UNESCAPED_UNICODE);
```
※JSON定数に `JSON_UNESCAPED_UNICODE` を指定する。

### 値ごとに改行して出力
```php:書き方
json_encode($値, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
```
※JSON定数に `JSON_PRETTY_PRINT` を指定する。
※日本語に変換するJSON定数と併用可能。
MXEのレシピの作成メモ

[前に書いたMXEのメモ](https://qiita.com/c_kuwata/items/bb503453597826f8096f)の続き。

MXEが用意しているレシピ、ディストロが配布しているビルド済みパッケージだけだと足りなくなった時のために、自分でMXEのレシピを書いてみた。ざっくりとだが調べたことや書いた事のメモを書いておく。

## 準備

MXEのGitリポジトリをクローンしてくる。

```shell
git clone https://github.com/mxe/mxe.git
cd mxe
```

レシピのビルドに必要なパッケージは場合によりけりなので、必要なら都度インストールする事にする。（多分MXEにレシピにそこ含めて書く方法があると思うが、今回は割愛）

## 今回書いたレシピ

とりあえず簡単に書けそうだったので[LV2](https://qiita.com/c_kuwata/items/39c852c3f2f57ffe7bf5)のレシピを書いてみた。

MXEのレシピは、src配下の.mkファイル群として存在しているので、今回の例ではsrc/lv2.mkを作成した。

```
PKG             := lv2
$(PKG)_WEBSITE  := http://lv2plug.in/
$(PKG)_IGNORE   :=
$(PKG)_VERSION  := 1.18.2
$(PKG)_CHECKSUM := 4e891fbc744c05855beb5dfa82e822b14917dd66e98f82b8230dbd1c7ab2e05e
$(PKG)_SUBDIR   := $(PKG)-$($(PKG)_VERSION)
$(PKG)_FILE     := $(PKG)-$($(PKG)_VERSION).tar.bz2
$(PKG)_URL      := $($PKG)_WEBSITE)/spec/$($(PKG)_FILE)
$(PKG)_DEPS     := gcc

define $(PKG)_UPDATE
    echo $($(PKG)_VERSION)
endef

define $(PKG)_BUILD
    cd '$(SOURCE_DIR)' && ./waf configure --prefix=$(PREFIX)/$(TARGET) && ./waf && ./waf install
endef
```
### レシピの解説

レシピファイルは主に以下のセクションからなっているようだ。

* パッケージ情報
* アップデート確認
* ビルド

#### パッケージ情報セクション

* `PKG`: パッケージ名。make <パッケージ名>でレシピをビルドする。
* `$(PKG)_WEBSITE`: パッケージのウェブサイト。
* `$(PKG)_IGNORE`: 後述の`$(PKG)_UPDATE`で無視されるバージョンを列挙するらしい。
* `$(PKG)_VERSION`: パッケージのバージョン
* `$(PKG)_CHECKSUM`: パッケージのsha256チェックサム。
* `$(PKG)_SUBDIR`: `$(PKG)_URL`内部（アーカイブ展開後の事？）のサブディレクトリらしい。
* `$(PKG)_FILE`: ソースコードのアーカイブファイル名。
* `$(PKG)_URL`: アーカイブファイルのURL。ビルド時にこのファイルがダウンロードされる。
* `$(PKG)_DEPS`: 依存しているレシピ。

#### アップデート確認セクション

`define $(PKG)_UPDATE`～`endef`の中に記述する。

上記のサンプルでは固定値を返しているが、他のレシピを見るとダウンロードページをスクレイピングしてパッケージバージョンを切り出し、アップデートがあるかどうかを確認しているようだ。

#### ビルドセクション

`define $(PKG)_BUILD`～`ebdef`の間にビルド手順を書いていく。いつものconfigureしてからmakeというレシピもあれば、もっと複雑なレシピもある。

ビルドセクションでは色々なマクロが使えるが、以下はその一例。

* $(SOURCE_DIR): ソースコードの展開先。
* $(PREFIX): usrディレクトリ。
* $(TARGET): x86_64-w64-mingw32.sharedなどビルドのターゲット。

通常は`$(PREFIX)/$(TARGET)`がインストール先のディレクトリなので、上記の例ではスースコードの展開先に移動した後、waf configureでインストール先ディレクトリをprefixに指定し、ビルドとインストールをそのまま行っている。

## ビルドとその結果

settings.mkでビルドのターゲットを指定できる。今回はWindows向けのクロスコンパイル環境が欲しいので、settings.mkに下記の記述を追加する。

```
MXE_TARGETS := x86_64-w64-mingw32.static x86_64-w64-mingw32.shared
```

後は`make lv2`を実行すれば、usr/配下にパッケージがビルドされる。
jQuery　eachの使い方・抜け出し方・スキップの仕方

## 用途
jQueryのオブジェクトに対して、繰り返しの処理をしたい時に使う。
繰り返しの処理から抜け出したい時に使う。
処理をスキップさせたい時に使う。

## 使用方法
```js:書き方
$.each(配列やオブジェクト, function(index, value) {
    //繰り返しの処理を書く
})
```
第1引数に処理を行いたい配列・オブジェクトを指定する。
第2引数に関数を指定する。関数の引数で「index（番号）」「value（値）」を取得できる。

### 繰り返しの処理から抜け出したい時
`return false` で抜けられる。
JavaScriptのループから抜け出すときはbreakを使うが、jQueryでは使えない。

### 処理をスキップさせたい時
`return true` でスキップできる。
JavaScriptのループのスキップはcontinueを使うが、jQueryでは使えない。
[ARKit] ARReferenceObject

### 3dオブジェクトをスキャンする

.arobjectファイルを生成するには下記のurlからApple公式のアプリでスキャンする必要がある

https://developer.apple.com/documentation/arkit/scanning_and_detecting_3d_objects

スキャンするときは下記の事柄を注意すると良いスキャンができるそう。

・照度は250〜400ルクス。全方向を照らす。
・光温度は日光と同様の約6500ケルビン。
・暖かい光源や色の付いた光源は避ける。
・背景は灰色で光は反射しない素材であること。

このアプリを実機で立ち上げ指示通りに動かせば.arobjectファイルを生成できる。（Airdropなどでicloudに保存とかになる）
Apple公式では、開発時点でどの物体を検知するかを定義した方が良いとしており、アプリを新規に作ってスキャンする必要はないとしている。
そのため、ユーザーアクションとしてスキャンすることもなければ、個人（もしくは会社）独自でスキャン用のアプリを作って.arobjectファイルも作ることはないと思う。

## つくったarobjectを組み込む
前回の画像トラッキングと同様にAssets.xcassetsのARResourceGroupにドラックアンドドロップで
.arobjectファイルを組み込む。

## ARKitで物体を検出する流れ

1 ARWorldTrackingConfigurationに検知したいオブジェクトを設定する
```swift
let objects = ARReferenceObject.referenceObjects(inGroupNamed: "AR Resources",
                                                         bundle: nil)! 
let configuration = ARWorldTrackingConfiguration()
    configuration.detectionObjects = objects
```
2 ARSessionを開始する
```swift
arView.session.run(configuration)
```
3 カメラから取得した映像からARオブジェクトを認識
```swift
 func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
        for anchor in anchors {
            // 「ARObjectAnchor」かどうかを確認する
            guard let objAnchor = anchor as? ARObjectAnchor else {
                continue
            }
         .....
        }
    }
```
4 ARObjectAnchorを追加する
5　どのARオブジェクトが認識されたかどうかを調べる
6　ARオブジェクトによって処理を変われる。
```swift
// 認識されたオブジェクトを調べる
guard let name = objAnchor.name else { continue }
   switch name {
            case 〇〇:
                処理
            break
    }
```




#### ARReferenceObject詳細
```swift
var rawFeaturePoints: ARPointCloud { get }
// 特徴点をゲットできる
var center: simd_float3
// 対象の中心座標
var extent: simd_float3
// 対象のサイズ
var scale: simd_float3
// 対象のローカル座標空間における倍率。
```

```ARObjectAnchorとは```
ARKit取り扱う3dオブジェクト。
ARAnchorを継承しているのでARsessionのDelegateメソッドでAnchorの追加や削除を監視できる。
ARAnchorはARシーンにオブジェクトを配置するための物理空間の位置と方向を持ったオブジェクトなので、その3dオブジェクト版。
【Java】1からNを複数行で表示する【標準入力】


python3以外の言語を学ぶべく問題を解くにあたって、標準入力の知識が必要になる。
ループ処理の問題の中でも基本的な

```
//入力する値
N
```

```
//出力する値
1
2
…
n
```

という問題に対してどのように対処するか考えた。
原則、出力する値一行目は1から始まるものとする。

このような複数行の表示はpython3でfor構文に世話になったためこちらでもforを使う。


```java
import java.util.*;

public class Main {

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);//標準入力を取得する

    int n = sc.nextInt();//取得した標準入力を数値にする
    for (int i = 1; i < n + 1; i++) {//出力する値一行目は1から始まるもの
      System.out.println(i);
    }

    sc.close();
  }
}
```

```
//出力された値
1
2
…
n
```
jquery　同じイベントを複数の要素に設定

## 用途
複数の要素に同じイベントを設定したいときに使う。

## 使用方法
```js:書き方
$('クラスやID, クラスやID, クラスやID').on('イベント', function(){
  // 処理を書く
});
```
指定したクラスやIDの値のどれかが、指定したイベントに該当した場合に処理が流れる。
```js:例
$('#hoge, #hogehoge, #hogehogehoge').on('change', function(){
  // #hoge, #hogehoge, #hogehogehogeのどれかの値が変わったときに流れる処理を書く
  console.log("値が変わりました");
});
```
Gitのコマンド

・Gitのコマンド

●git init
リポジトリ(.gitディレクトリ)を作成

●git add
リポジトリに圧縮ファイル、ステージにインデックスを保存
```
git add ファイル名
git add ディレクトリ名
git add .                           など
```

●git commit
リポジトリにツリーとコミットを保存
```
git commit
git commit -m メッセージ
git commit -v                       など
```

●git clone
既存のGitリポジトリをコピー
```
git clone リポジトリ(GitでコピーしたURL)
```

●git status
変更されたファイルを確認

●git diff
git addする前(ワークツリーとステージ間)の変更を確認
```
git diff
git diff ファイル名
```

●git diff --staged
git addした後(ステージとリポジトリ間)の変更を確認

●git log
変更履歴を確認
```
git log =>全ての変更履歴を表示
git log --oneline => 1行で表示
git log -p ファイル名 => 特定のファイルの変更履歴を表示
git log -n コミット数 => 指定のコミット数分だけの変更履歴を表示
```

●git rm
ファイルやディレクトリの削除(ステージに削除したという記録は残る)
```
#ファイルごと削除
git rm ファイル名
git rm -r ディレクトリ名
#ワークツリーにはファイルは残して、リポジトリからだけファイルを削除
git rm cached ファイル名
```
※rmとの違い
rmコマンドではワークツリーからだけファイルを削除(リポジトリには残る)

●git mv 元のファイル名 新ファイル名
ファイル名の変更
※以下のコマンドでも同じ操作が可能
mv 元のファイル名 新ファイル名
git rm 元のファイル名
git add 新ファイル名

●git remote add リモートリポジトリ名 リモートリポジトリのURL
指定のリモートリポジトリ名にURLのリモートリポジトリを登録
```
git remote add origin URL
=>originというリモートリポジトリ名でURLのリモートリポジトリを登録
```

●git push リモートリポジトリ名 ブランチ名
ローカルリポジトリの内容をリモートリポジトリに送る
```
git push origin master
=>ローカルリポジトリの内容をoriginリモートリポジトリにmasterブランチで送る
```

●git restore ファイル名
対象ファイルのワークツリーにおける変更の取り消し

●git restore --staged ファイル名
対象ファイルのステージにおける(git add後)変更の取り消し

●git commit --amend
直前のコミットをやり直す
=>ファイルやコミットメッセージの編集を行う

●git remote
設定しているリモートリポジトリ名を表示

●git remote -v
設定しているリモートリポジトリ名とそのURLを表示

●git remote show リモートリポジトリ名
対象のリモートリポジトリ名のURL、ブランチ、git pullとgit pushの挙動を表示

●git fetch リモートリポジトリ名
設定しているリモートリポジトリの情報を取得
=>ワークツリーに保存する場合は、git mergeする。

●git pull リモートリポジトリ名 ブランチ名
設定しているリモートリポジトリの情報を取得し、ワークツリーに保存
※保存される場所に注意すること。

●git remote rename 元のリモートリポジトリ名 新リモートリポジトリ名
リモートリポジトリ名を変更

●git remote rm リモートリポジトリ名
対象のリモートリポジトリを削除

●git branch ブランチ名
ブランチを新規作成
※ブランチを作成するだけで、切り替えは行わない

●git branch
現在のリポジトリにあるブランチの一覧を表示
※リモートブランチは表示しない

●git branch -a
現在のリポジトリにある全てのブランチの一覧を表示
※リモートブランチも表示する

●git switch ブランチ名
ブランチを切り替え

●git merge
変更履歴をマージ
```
git merge ブランチ名
git merge リモート名/ブランチ名
```
例)
```
git merge origin/master
=>作業中のブランチにoriginリポジトリのmasterブランチをマージ
```

●git branch -m 新ブランチ名
作業中のブランチのブランチ名を変更

●git branch -d ブランチ名
指定したブランチを削除
※マージされていない変更が残っている場合は削除されない

●git branch -D ブランチ名
指定したブランチを強制削除
※マージされていない変更が残っていたとしても削除する

●git tag
タグの一覧を表示

●git tag タグ名
軽量版(タグ情報が名前のみ)のタグを作成
※最後に作成したコミットにタグが付く

●git tag タグ名 コミット名
指定したコミットにタグを付ける

●git tag -a タグ名 コミット名 -m "メモ"
注釈付きのタグを作成
※基本的には注釈付きのタグを付ける
※過去のコミットにタグを付ける場合はコミット名を指定する

●tag show タグ名
タグのデータ(タグ付けした人、タグ付け日時、メモ、コミット内容)を表示

●git push リモートリポジトリ名 タグ名
指定のリモートリポジトリに指定のタグをプッシュ

●git push リモートリポジトリ名 --tags
指定のリモートリポジトリにタグを一斉送信

●git stash
作業を一時避難

●git stash list
避難した作業の一覧を表示

●git stash apply
最新の作業をワークツリーに復元
(ステージの状況は復元されない)

●git stash apply --index
最新の作業をステージの状況まで復元

●git stash apply スタッシュ名
特定のスタッシュを復元
例)
```
git stash apply stash@{2}
※スタッシュ名stash@{2}はgit stash listで確認
※番号は0が最新で、大きくなるほど古い作業
```

●git stash drop
最新の作業を削除

●git stash drop スタッシュ名
特定の作業を削除

●git stash clear
全作業を削除
不均衡データへのダウンサンプリング後のCalibration

不均衡データに対してダウンサンプリングをした後に機械学習で確率予測をしたときにCalibrationが必要になります。数式などをメモしたので書いておきます。
[論文「Calibrating Probability with Undersampling for Unbalanced Classification」](https://www.researchgate.net/publication/283349138_Calibrating_Probability_with_Undersampling_for_Unbalanced_Classification)が数式の元です。

# 内容
Calibrationは以下の式で行います。

```math
p = \frac{p_s}{p_s + \frac{(1 - p_s)}{\beta}} \\
\beta = p(s=1|y=0)
```

## 前提
ダウンサンプリング後の予測確率$p_s$からDS前の予測確率pを導きます。その前提となる項目一覧です。
※「ダウンサンプリング」という言葉が長いので表中ではDSと略しています。

|項目|内容|補足|
|:-:|:-:|:--|
|正例|y=1|少数
|負例|y=0|多数
|確率変数|s|DS前データがDS後データに含まれている場合は1
|DS前予測確率|p=p(y=1&#124;x)|説明変数xに対して正例となる確率(不均衡データなのでとても低い)
|DS後予測確率|$p_s$=p(y=1&#124;x,s=1)|DS後に説明変数xに対して正例となる確率(DS後なので高くなる)
|DS率|β=p(s=1&#124;y=0)|負例がDS後データに残る確率|

## 式展開
ダウンサンプリング後の予測確率$p_s$は以下の式です。なぜこの式になるかは論文を見ればわかると思いますが、そこまで見ていません。

```math
p_s=\frac{p}{p+\beta(1-p)}
```

サンプリング率βを変えたときの推移を表にしました(pは0.01で固定)。
サンプリング率を低くすると自信過剰($p_s$が高くなる)になるのがわかります。当然ですが、βが1の場合は$p=p_s$です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/6055ac55-ff29-8cbb-e5c3-97d8baade73a.png)
ダウンサンプリング後の予測確率$p_s$からダウンサンプリング前の予測確率$p$を求めるために式変形します。

```math
\begin{eqnarray}
p_s & = & \frac{p}{p+\beta(1-p)} \\
p & = & (p+\beta(1-p)p_s) \\
p- pp_s+ p\beta p_s & = & \beta p_s \\ 
p(1-p_s+\beta p_s) & = &  \beta p_s \\
p & = & \frac{\beta p_s}{1-p_s+\beta p_s} \\
  & = & \frac{p_s}{p_s+\frac{1-p_s}{\beta}}
\end{eqnarray}
```

## 実データ例
Excel でシミュレーションしました。

- サンプリング率βが低いほどCalibrationの率が高くなります(Calibrateされた値が小さくなる)。
- DS後予測確率pが高いほどCalibrationの率が低くなります(Calibrateされた値が相対的に高くなる)

サンプリング率βが0.01にすると正例と判断させる確率(0.5以上)にするのは0.99よりも大きくする必要があります(赤字行)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/6c806c4a-6f83-50f9-645a-c71b1b4eb18a.png)

## Pythonコード例
簡単なサンプルですが、以下のPythonコードでCalbrationを計算できます。

```python
# ダウンサンプリング率(DS後の負例数/ DS前の負例数)
BETA = XX

# df['CONFIDENCE1_NONCAL'] にCalibration前確率が入っている
df['CONFIDENCE1'] = df['CONFIDENCE1_NONCAL'].map(lambda x: x/(x+((1-x)/BETA)) )
```


# 参考リンク
以下のサイトを参考にしました。

https://yukoishizaki.hatenablog.com/entry/2020/05/24/145155

https://qiita.com/0NE_shoT_/items/fe87bae0c875f786c92f

https://pompom168.hatenablog.com/entry/2019/07/22/113433
str_replace　str_ireplace　preg_replace　文字列を置換　PHP

## 用途
対象の値の中に指定した文字列が存在した場合に、その文字列全てを置換したい時に使う。

## 使用方法
### str_replace
```php:書き方
str_replace( $検索したい文字列, $置換したい文字列, $検索対象の文字列, int &$count )
```
**第1引数**
検索したい文字列。この文字列があったときに置換する。
**第2引数**
置換したい文字列。この文字列に置換する。
**第3引数**
配列などを置換した際に、置換した回数が表示される。省略可能。

```php:例
$hoge = "red, green, blue";
$hogehoge = str_replace('red', 'yellow', $hoge);

echo $hogehoge;
// 結果
"yellow, green, blue"
```
※日本語の置換も可能
### str_ireplace
文字の大小を区別せずに置換する。使い方は同じ。

### preg_replace
正規表現で検索する。第1引数に検索したい正規表現を入れる。
100日後くらいに個人開発するぞ！day008

## 今日から中級編！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/2326198a-20e2-e12f-75bf-c47a3fd329bd.png)


## Progateに課金した！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/3749dd14-37c4-0d07-e956-ec41587d9455.png)


## 今日は全体のレイアウトを作ってみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/4b4b1177-093b-57c6-a473-cc9c47ce6927.png)



### ヘッダータグとフッタータグ
 - ヘッダーとフッターのタグは非常によく使われるためHTMLには`<header>`タグと`<footer>`タグが存在する
 - `<header>`タグと`<footer>`タグを使うことで`<div>`とクラス名を用いる方法は不要になる
        - 例：`<div>`とクラス名を用いる方法
            - `<input type="submit">`
            - `<div class="header"></div>`
            - `<div class="main"></div>`
            - `<div class="footer"></div>`
        - 例：`<header>`タグと`<footer>`タグを用いる方法
            - `<header></header>`
            - `<div class="main"></div>`
            - `<footer></footer>`
教えることで自分がいちばん学ぶ、「ファインマンテクニック」を使って複雑な概念をよりよく理解する

"How to understand complex coding concepts better using the Feynman Technique" というお話

https://dev.to/cesscode/how-to-understand-complex-coding-concepts-better-using-the-feynman-technique-5anj

という記事を参考に、「ファインマンテクニック」について概要をまとめるもの。

## ファインマンテクニックとは

- 複雑なトピックを、他の人に簡単な言葉で説明できるものに変える。
- そうすることで、自分も、複雑なトピックをより深く理解し学ぶことができる。
    - ... という。

## ファインマン式学習法

- ノーベル賞を受賞した物理学者、リチャード・ファインマンは、ファインマン式学習法を生み出した。
- 彼は、複雑なテーマをよりシンプルな言葉で説明する。
- ファインマンテクニック: **「自分自身がよくわかっていないのに、何かをうまく説明することはできない」**
    - 自分が知っていることを、それについて何も知らない人に説明しようとすると、自分の欠点に気づく。
    - 自分が学んだことを、子どもにもわかるようにわかりやすく伝えることを目標とする。

## ファインマンテクニックのメリット

- 学習内容を徹底的に理解できる。
- 新しいことを素早く学び、学んだことを思い出せる。
- 自分の知識を他の人と共有し続ければ、教えるのが上手になる。
- 複雑なことをより簡単な言葉で説明するために、「推論」することができるようになる。

## ファインマンテクニックの4ステップ

- ファインマンテクニックは、4ステップで構成されている。

1. 学びたいテーマを選ぶ。
2. 「12歳の子供（を想定したひと）」にそれを説明する。
3. 説明を見直す。
4. 簡略化する。


### ステップ1：学びたいテーマを選ぶ

- 学びたいテーマやトピックを紙の一番上に書く。
    - 例えばJavaScriptのループを勉強したいのであれば、白紙の上に見出しとする。
    - JavaScriptのループについて、知っていることを何でもその白紙に書きこむ。
    - JavaScriptのループについて何も知らない人が見てもわかるだろうか、と考えて書く。
        - 書いた上で、自分自身がこのトピック（JavaScriptのループ）をしっかり理解したら、ステップ2に進む。

### ステップ2:「12歳の子供（を想定したひと）」にそれを説明する

- 今度は「12歳の子供（を想定したひと）」に説明してみる。
- 「子供でも理解できるような基本的な用語で説明する」を目指す。
    - 複雑な用語を使って説明すると、自分の理解不足が露呈してしまう。
    - 「JavaScriptのループ」を簡単な言葉で説明できるということイコール、自分が何を言っているのか分かっているということとなる。
        - テクニカルライティングの練習でもある。学んだことを共有する。
        - オンラインコミュニティに参加するのも良い。コミュニティに参加して、学んだことを共有する。
            - コミュニティに参加すると、同じ興味を持つ人たちに出会える。
        - YouTube、TikTok、Twitterなどのソーシャルメディアプラットフォームを利用してもよい。
- 想像上の聴衆の前で行うのでもよい。12歳に「JavaScriptのループ」について教えると想像する。
    - もちろん、実際の聴衆を相手にするのが一番効果的（聴衆は質問をするからである）。
    - 聴衆から質問を受けることで、自分が改善すべき点が見えてくる。


### ステップ3:説明を見直す

- 具体的な改善点を明らかにしたら、次は「JavaScriptのループ」の説明を見直し、不十分と思われる部分を特定する。
    - どこが足りなかったのかがわかったら、もう一度見直して、理解を深める。
    - 今まで説明できなかったことがすべてクリアになるまで勉強する。
    - このステップ3の目標は、苦手な分野を得意な分野に変えていくこと。


### ステップ4: 簡略化する

- ステップ3の結果、より深い知識を得ることができた。このステップ4では知識を得た上で、ステップ2「説明」をもう一度練習する。
- 今まで説明できなかったあらゆる部分を簡略化する。「JavaScriptのループ」の説明を書き直すか、他の人にもっと良い説明をする。
- これを繰り返す。この学習方法は、理解するのが難しいトピックに最も効果的である。


## 結論

ファインマンテクニックは、あるトピックを自分の言葉で説明するところまで理解することが重要である。説明するときは、子供を教育するような気持ちで、自分がどれだけそのテーマを理解しているかを確認する。

勉強会などで「教える」ときに講師本人が最も学んだ気持ちになるのはこのテクニックで裏付けされているからなのかと。[【初心者が】社内のGit勉強会の講師(司会)をしてみて【体験談】 - Qiita](https://qiita.com/185shingeki/items/9197936d645882de1550)

関連: [コーチング・メンタリング・ティーチング・コンサルティング・カウンセリングの違いと、自分のメンタリングへの心がけ 2022春 - Qiita](https://qiita.com/e99h2121/items/10cdc7d17fbcfa3cb0b3)


## 参考

[Learning From the Feynman Technique | by Evernote | Taking Note | Medium](https://medium.com/taking-note/learning-from-the-feynman-technique-5373014ad230)
[The Pomodoro Technique](https://cesscode.hashnode.dev/getting-work-done-with-the-pomodoro-technique)
[リチャード・P・ファインマン - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%81%E3%83%A3%E3%83%BC%E3%83%89%E3%83%BBP%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%9E%E3%83%B3)

以上です～
2022/4/26主にITとかセキュリティの記事

電子帳簿保存法（Law on Book and Record Keeping through Electronic Methods）(4/25)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/041900113/

「東欧のシリコンバレー」に影　日立など日本企業も影響(4/25)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/092400133/041900075/

データベースの新常識　クラウド移行でDX加速(4/25)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/041800115/

都水道局を装うフィッシング　300円割引で誘導する新手口(4/25)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031800050/041800038/

再配布と経路集約(4/25)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031500132/041800002/

通販装う「攻撃用USBメモリー」が届く、ランサムウエアの脅威に備えよ(4/25)
https://xtech.nikkei.com/atcl/nxt/info/18/00033/041200089/

デジタル庁「新霞が関ネット」はまずNECとコムシスが受注、またも1者応札の課題(4/25)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/06774/

対ウクライナDDoS攻撃の余波を観測 - JPCERT/CC
https://www.security-next.com/136085

スマホゲーム「イケメン戦国」でデータ破損 - 一時全データが確認不能に
https://www.security-next.com/136082

チケットセンターで他会員の個人情報を誤表示 - CBCテレビ
https://www.security-next.com/136089

デジタルマーケ担当者、半数強が改正個情法の詳細知らず
https://www.security-next.com/135993

料金確定通知を装った「＠nifty」のフィッシングに注意
https://www.security-next.com/136106

JPCERT/CC、第1四半期インターネット観測レポート - ウクライナへの攻撃の影響確認(4/24)
https://news.mynavi.jp/techplus/article/20220424-2327724/

Spring Cloud Function における HTTP ヘッダの処理に起因する遠隔からの任意のコード実行につながる脆弱性（Scan Tech Report）(4/22)
https://s.netsecurity.ne.jp/article/2022/04/22/47504.html

7-Zipに脆弱性。任意のコマンドを実行される恐れ(4/23)
https://www.nichepcgamer.com/archives/7-zip-vulnerability-cve-2022-29072.html

NHK受信料無料をちらつかせる詐欺メール急増、掲載番号に電話をかけてみた結果(4/24)
https://news.nicovideo.jp/watch/nw10839384

週刊仮想通貨ニュース｜Web3.0を巡る国内動向に注目集まる、バイナンスが約180万BNBをバーンなど(4/24)
https://coinpost.jp/?p=343683

焦点：ナイジェリアで携帯と個人番号紐づけ義務化、7300万台停止(4/24)
https://jp.reuters.com/article/nigeria-tech-phones-idJPKCN2ME0C9

Cisco、Spring Frameworkの脆弱性の影響を受ける製品を公開　迅速に対処を(4/23)
https://www.itmedia.co.jp/enterprise/spv/2204/23/news021.html

Operational Excellence 実行の勘どころ マスターブラックベルトが語る本音の話 【第7回】(4/22)
https://www.gmp-platform.com/article_detail.html?id=13754&lang=ja
[Swift] スペクトログラム③ ArrayからCGImageを作る


SwiftとSpriteKitで、スペクトログラムを描写するプログラムを書いています。
手順としては

①オーディオファイル読み込み [ここ](URL "https://qiita.com/Talokay/items/8912e60843bd824d74ce")
②FFTでスペクトラル分析 [非常に古いですがここ](URL "https://qiita.com/Talokay/items/f1c653de7f3fe4d23ba5")
③周波数領域データを[UInt8]データに格納
④[UInt8]をCGImageに変換 **←この記事**
⑤CGImageをtextureとしてShaderに送る
⑥Shaderでスペクトログラム描写


完成イメージ
(Gif埋め込みが上手く行かなかったためYoutubeです。)
<iframe width="560" height="315" src="https://www.youtube.com/embed/BoSI42aD7ew" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

動画のように、軽い動作でスペクトログラムを拡大縮小・スクロールできるようにしつつ、せっかくだからAppleのライブラリを使いたいというのが趣旨です。

```swift

var buffer:[UInt8]! // spectrogram data
var texture:CGImage!

texture = createTextureFromArray(src: &buffer,
                                 w: bufferWidth,
                                 h: bufferHeight,
                                 toW: textureWidth,
                                 toH: textureH)

```

buffer はFFTでスペクトラル分析した周波数領域データになります。
サイズはデフォルトでは（［FFTフレーム数］x ［FFTSIZE / 2］)になりますが、スペクトラムとして表示する周波数幅を小さくする際は（［FFTフレーム数］x ［FFTSIZE / 4］）など適宜調整します。

bufferサイズはスペクトラル分析データに依存しますが、それをそのままShaderメモリ領域に送ると都合が悪いので、適宜サイズ調整しつつ、それに合わせてスケールアップ・ダウン処理を行います。

texture size はSpriteKitのSceneサイズと同じにすることで、スペクトラルを効率よく画面に描写することが可能になります。


```swift

func createTextureFromArray(src:inout [UInt8], w:Int, h:Int, toW:Int, toH:Int)->CGImage?{
        
        let src = array2vImageBuffer(src: &src, w: w, h: h)
        
        var dst = try! vImage_Buffer(size: CGSize(width: CGFloat(toW), height: CGFloat(toH)), bitsPerPixel: 8)
        
        scaleBuffer(source: src, destination: &dst)
        
        guard let format = vImage_CGImageFormat(bitsPerComponent: 8,
                                                bitsPerPixel: 8,
                                                colorSpace: CGColorSpaceCreateDeviceGray(),
                                                bitmapInfo: CGBitmapInfo(rawValue: 0)) else{
            return nil
        }
        
        let img:CGImage? = try? dst.createCGImage(format: format)
        dst.free()
        
        return img
    }

```

[UInt8]型のArrayをAccerelateライブラリを使用してvImage_Buffer型に変換し、スケール処理を実行、その後でCGImageに変換しています。
vImage_Bufferはプログラマが明示的にメモリ解放する必要があるため、dst.free()を読んでいます。

この処理よって、スペクトラルデータが、bufferサイズからテクスチャーサイズに変換されたCGImage型として保存されました。

最後にUniformを介してShaderへTextureデータを送ります。

```swift

    private var uniformBuffer:SKUniform!

    self.uniformBuffer = SKUniform(name: "buffer",
                                   texture:SKTexture(cgImage: texture))

    self.shaderSource.addUniform(self.uniformBuffer)


```

自分向けメモレベルで書いてしまいました。
もう少し時間ができましたら、丁寧にまとめたいと思います。
AnimBP内のSlot 'DefaultSlot'がControl Rigの前後で変わる挙動

# UE5でアニメーションを適用する際に躓いたSlot 'DefaultSlot'（以降SDとする）のノード位置について
## アニメーション適用に利用したもの
・Unreal Engine5（正式リリース後）
・Mixamoにあるアニメーション

参考にした記事：剣で攻撃を実装する方法 https://zenn.dev/daichi_gamedev/books/unreal-engine-5/viewer/attack-with-sword

## UE5のアニメーション適用について
![プレゼンテーション1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239058/5928d140-be36-dae0-5ab8-e3395bd55468.gif)

上記のアニメーションを操作キャラに適用させることが今回の目的だった。

## Unreal Engine5におけるAnimBPについて
UE4と比べて、見た目的に大きく変わったかなという部分は個人的にあまりなかった印象だったが、AnimBPの継承はデフォルトで置かれてなかった気がする。
Third Person Templeteで操作するキャラのBP_ThirdPersonCharacterのAnim ClassはABP_Quinn_Cとなっているので、このAnimBPを開いてみると以下のような画像となっている。
![s2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239058/95402088-2a4e-dee0-93a0-fcfd5f427275.png)

見たところ、ABP_Mannyを継承しているようなので、ABP_Mannyを開いてみる。
![s1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239058/f662172f-0630-a2bd-42b2-92598476dd71.png)

このノードにSDをつなげると求める結果になる。

## Control Rigの前側でSDを繋げてみる
足がおかしくなる
![プレゼンテーション2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239058/165adcae-ceca-205c-8649-b90992e37861.gif)

## Control Rigの後ろ側でSDを繋げてみる
左足を前に出している
![プレゼンテーション3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239058/3c51b192-f351-f441-6373-e63f688b1746.gif)

## まとめ
Control Rigノードの前後で挙動は変わることは言われればそれはそうって感じはするけど、言われなきゃなんで変な挙動になるのかわからない部分だと思う。
JIRASoftwareなどのチケット番号をgit commit時に自動でコメントに付与する方法

古来より（古来っていうほど昔なのか？）色んな人が記事にしるので今更感はありますが、20記事以上見てきて個人的に改良したシンプルだと思うものを忘備録兼ねて挙げておきます。

`.git/hooks/prepare-commit-msg`を作り以下を記述。

```bash
COMMIT_EDITMSG=$1
MODE=$2
if [ "$MODE" = "" ] || [ "$MODE" = "message" ] ; then
  TICKET_NUMBER=`git branch | grep "*" | awk '{print $2}' | perl -nE 'say $& if /[0-9a-zA-Z_-]+$/'`
  if [ "$TICKET_NUMBER" != "" ]; then
    # 変更を加える前に退避。
    mv $COMMIT_EDITMSG $COMMIT_EDITMSG.tmp
    # 退避ファイルの１行目先頭にチケット番号を付与して、本来のファイルに上書きする
    sed '1s/^/'"[$TICKET_NUMBER]"' /g' $COMMIT_EDITMSG.tmp >> $COMMIT_EDITMSG
  fi
fi
```

```shell
% touch test.php
% git add .
% git commit # これは$MODEの条件通らないのでチケット番号付与されません
% git commit -m ":wrench: xxx実装"
```

|  こういうブランチ名なら |  こうコメント付与される  |
| ---- | ---- |
|  feature/XXX-999  |  [XXX-999] :wrench: xxx実装  |
|  bug/XXX-999  |  [XXX-999] :wrench: xxx実装  |
|  feature/XXX-999_add_user_column  |  [XXX-999_add_user_column] :wrench: xxx実装  |
|  feature/XXX-999_notify_purchase  |  [XXX-999_notify_purchase] :wrench: xxx実装  |
|  feature/yamada/XXX-999  |  [XXX-999] :wrench: xxx実装  |



正直、課題管理ソフトが必要なのはチケット番号である`XXX-999`の部分だけなのでそれ以外は不要。



なのですが、、、課題管理ソフトによってはチケット番号のフォーマットが
`123456789`かもしれないし（これはasana）
`#123456789`かもしれないし（これはpivotal）
`XXX_123456789`かもしれないし
`XXX-123456789`かもしれない。（これはJIRA）


最後２つの可能性を考慮すると`_`と`-`（アンスコとハイフン）は正規表現に含める必要があるんですよね。

そうすると意図しないブランチ名、例えば
`XXX-999_add_user_column`
`XXX-999_notify_purchase`
のようなブランチ名からチケット番号を作り出すときにブランチ名がそのままチケット番号になっちゃうのです。

じゃあ正規表現で最後が数値で終わってることを条件にすれば良くないか？
う〜ん、課題管理ソフトによってはチケット番号のフォーマットが
***`123456789-xxx`とか`123456789_xxx`なものだってあるかもしれないだろう？***

だからもうプログラム側で頑張るのはやめて各々に運用でカバーしてもらうことを想定としたよ。
この仕組みは弊社の他のPJでも使えるのでcomposerで導入できるようにライブラリ化しようと思う。
ライブラリ化したらお知らせ更新しますのでLGTMとストックしてくれると励みになります。

https://packagist.org/packages/gild/

この正規表現でならいけるんじゃない？的なアドバイスありましたら教えていただけますと参考にライブラリ改良していきます。
ちなみにsourceTreeなどのgitクライアントソフトからでも使えます。

元ネタはこちら👇

http://blog.enogineer.com/2014/09/06/git-hook-commit-ticket/

おやすみ。

## 2022/4/29追記

ライブラリ化しました。

https://packagist.org/packages/gild/add-issue-number
【Windows Terminal】Git Bashを追加

## 環境
+ Microsoft Windows 10.0.22000.613（21H2）
+ Windows Terminal 1.12.10983.0

## 手順
### 設定ファイルを開く
`Ctrl+,` で設定を開く。左下の設定マークをクリックすると `settings.json` が開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/53a82c15-7ff5-b4e7-0307-6a71c1d87c9e.png)

`list` 内に Git Bash の設定を追加する。（以下の例はGit Bash が `C:\\Program Files\\Git` にインストールされている場合）
```json:Git Bash の設定
{
    "guid": "{c41fc47f-3f5f-5414-a05d-cf0341702683}",
    "name": "Git Bash",
    "commandline": "C:\\Program Files\\Git\\bin\\bash.exe -li",
    "icon": "C:\\Program Files\\Git\\mingw64\\share\\git\\git-for-windows.ico",
    "startingDirectory": "%USERPROFILE%"
}
```

#### `guid`
[一意識別子 - Windows ターミナル](https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/profile-general#hide-profile-from-dropdown) 

次のいずれかの方法で `guid` を生成する。`{}` をつけることを忘れずに。

##### 1. コマンドから
PowerShell上で `New-GUID` または `[guid]::NewGuid()` を実行

```:出力
Guid
----
7b5858bb-42a3-4b8c-8df2-b20446d8ee29
```

##### 2. ジェネレーターから
https://www.guidgenerator.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/514851bc-73d1-2a80-abd1-54eb3cea5761.png)

## エラーの原因
`,` を忘れていないか確認

## 参考
https://docs.microsoft.com/ja-jp/windows/terminal/dynamic-profiles
Vue→React移行の個人的メモ #1

Vueを使っていたのですが、諸事情によりReactに移行する必要がありました。
React+JavaScript, React+TypeScriptなどのソースを見て気づいたことを
なるべくVueと対比して書いていきます。何回かの記事分けて書きます。

### 変数の埋め込み、関数の埋め込み
Vueでの{{}}と違って、Reactで値を埋め込むcurly braces{}はそれぞれ一つずつ。
Vueで""を使っていたのとは違い、Reactでクリック時に実行する関数はcurly braces{}で渡せる。
些細なことだが、HTMLのonclickと違い、onClickであることが違う。

```js:関数コンポーネントの例
import {useState} from 'react'

const Component=()=>{
  const [value, setValue] = useState('default value')
  const sayClicked = ()=>{
    setValue('Clicked!')
  }

  return (
    <button onClick={sayClicked}>{value}</button>
  )
}
```
### ReactDOM.render

これは、Electronを扱うプロジェクトで見かけました。
DOMに直接Reactを書き込むようだ。

２つめの要素は挿入先のことだそう。この例ではindex.htmlの#barにReact要素を挿入するらしい。


なお、公式ドキュメントによると、最近のバージョンでは.renderはcreateRootに置き換わったらしい。

```js:ReactDOM.renderについてのメモ
import ReactDOM from 'react-dom'
ReactDOM.render({
  <Component/>,
  document.getElementById('bar')
})

```

https://ja.reactjs.org/docs/react-dom.html#render

https://ja.reactjs.org/docs/handling-events.html


### TSで関数コンポーネントを使うときの型の表記
TSでの関数コンポーネントは以下のようになっている。
`React.FC`の部分が型定義に使われている。
`React.FC`は関数コンポーネントの型らしい。

```ts
const Component: React.FC = () => {
  // ...
}
```

#### C++の継承、というアナロジーで腑に落ちる
C++の継承の概念に似ているので、わかりやすい。
`interface`で定義された型ををベースクラスと考えたときに、そのクラスを継承している、というような考え方ができる。
（あくまでC++とのアナロジーなので、正確さは保証できないが）
```c++:C++での継承
class B : public A { };
```


https://www.ibm.com/docs/en/zos/2.4.0?topic=reference-inheritance-c-only

### JSX/TSXでのコンポーネント

以下のように`<></>`でラップされていることが多い。
複数のタグがある場合、Vueではルートエレメントを一つのタグで囲ってネストする必要があった。
これに同じように、Reactでも`<></>`で囲っているようだ。
```
<>
  <Bar/>
  <Foo/>
</>
```

https://stackoverflow.com/questions/59751733/react-native-what-exactly-is-the-empty-component

次回は#2について書いていきます。
【Golangエラー】type does not implement as method has a pointer receiver

interfaceを受け取る関数に構造体を渡そうとしたところ、エラーが出てきてちょっとつまづいたのでメモです。
`hello world`を出力するシンプルなプログラムを見ながら挙動を確認します。

## うまくいかない場合

以下のコードだと `Type does not implement 'sampleInterface' as the ... has a pointer receiver`というエラーが出てうまくいきません。

```main.go
package main

import "fmt"

type sampleInterface interface {
	DoSomething()
}

func interfaceReceiverFunc(si sampleInterface) {
	si.DoSomething()
}

type sampleStruct struct {}

func (s *sampleStruct) DoSomething()  {
	fmt.Println("hello world")
}

func main() {
	s := sampleStruct{}
	interfaceReceiverFunc(s)
}

```

![スクリーンショット 2022-04-26 0.50.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/d40fdcac-591a-8476-32fe-ac71ceae4468.png)


## うまくいく場合その1：構造体のポインタを渡す

mainの中身をポインタに直せばうまくいきます。

```main.go
func main() {
	s := &sampleStruct{}
	interfaceReceiverFunc(s)
}
```

なぜでこれでうまくいくのか？以下のコードを見るとポインタレシーバに対して、インターフェースのメソッドが定義されているためです。`DoSomething`は`*sampleStruct`のメソッドであり、`sampleStruct`のメソッドではありません。なのでポインタで渡すことでうまくいったのです。

```
func (s *sampleStruct) DoSomething()  {
	fmt.Println("hello world")
}
```

## うまくいく場合その2：構造体レシーバを実体にする

構造体のレシーバを実体にすれば、回避できます。ただこれよりはポインタレシーバにする場合がほとんどだと思うので、その１がいいかと思います。

```main.go
func (s sampleStruct) DoSomething()  {
	fmt.Println("hello world")
}

func main() {
	s := sampleStruct{}
	interfaceReceiverFunc(s)
}
```

## 参考

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

https://stackoverflow.com/questions/40823315/x-does-not-implement-y-method-has-a-pointer-receiver

こちらに以下のように書かれていまして、そちらをほぼ意訳した感じになります。

- A pointer to the value must be used, whose method set will include the method with the pointer receiver
- Or the receiver type must be changed to non-pointer, so the method set of the non-pointer concrete type will also contain the method (and thus satisfy the interface). This may or may not be viable, as if the method has to modify the value, a non-pointer receiver is not an option.
【コマンド】ディレクトリ構成図をtreeコマンドで作成

## 環境
+ Microsoft Windows 10.0.22000.613（21H2）
+ Windows Terminal 1.12.10983.0
+ PowerShell 7.2.2
+ Command Prompt

```:ディレクトリ構成
C:\USERS\USERNAME\DESKTOP\TEST
└─parent
    │  parent1.txt
    │  parent2.txt
    │
    └─child
            child1.txt
            child2.txt
```

## treeコマンド
### カレントディレクトリ（フォルダのみ）
```posh:ターミナル
tree
```
```:出力
C:.
└─parent
    └─child
```

### カレントディレクトリ（ファイルも含む）
```posh:ターミナル
tree /f
```
```:出力
C:.
└─parent
    │  parent1.txt
    │  parent2.txt
    │
    └─child
            child1.txt
            child2.txt
```

### パスを指定（フォルダのみ）
```posh:ターミナル
tree C:\Users\username\Desktop\test
```

```:出力
C:\USERS\USERNAME\DESKTOP\TEST
└─parent
    └─child
```

:::note
ディレクトリをターミナルにドラッグ＆ドロップするとパスが入力される。
:::

### パスを指定（ファイルも含む）
```posh:ターミナル
tree /f C:\Users\username\Desktop\test
```

```:出力
C:\USERS\USERNAME\DESKTOP\TEST
└─parent
    │  parent1.txt
    │  parent2.txt
    │
    └─child
            child1.txt
            child2.txt
```

## 参考
https://windows.command-ref.com/cmd-tree.html
【iTerm2】処理終了時に通知する方法

## はじめに
本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。  
そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。  
間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。  

## iTerm2で処理終了時に通知する方法
iTerm2で処理終了時に通知するようにできます。
![image220425_234415.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/b77084c9-7b3d-3dd6-d02c-fb45ae36c522.png)

設定方法を以下に記載します。

### `Shell Integration`をインストール
iTerm2を開いてメニューから`iterm2` > `Install Shell Integration`と選択します。
![image220425_232859.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/fd908b31-b005-dfa8-cf24-e75ff1969e91.png)


以下のように表示されます。
`Continue`をクリックします。
![image220425_235436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/32f6350b-c1c0-e9fc-4177-6fb35e72bfef.png)
`Download and Run Installer`をクリックします。
![image220425_235251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/e1adb511-c60d-cf1d-1632-b0d1d67d1fd6.png)
`Continue`をクリックします。
![image220425_235551.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/e6b816d1-82dd-1db3-5326-cf888f41e19e.png)
すると`.iterm2_shell_integration.zsh`がダウンロードされます。
また`.zshrc`に以下のように追記されます。

```.zshrc
test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh"
```

### 通知の設定をする
メニューから`Edit` > `Marks and Annotations` > `Alerts`と選択します。
`Post Notification`にチェックがついていることを確認してください。
![image220426_001304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/2356571b-89ea-cdb9-8fc7-c1ca61809418.png)
次にシステム環境設定を開き、iTerm2の通知が許可されているか確認します。
許可されていなければ許可します。
![image220426_003332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/5a2cf246-864e-b762-b348-de5a9ad153bd.png)
`cmd + opt + a`を入力すると画面右上に目のマークがつきます。
![image220426_002224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/fe09a158-b66a-fe7f-4c2d-3413514c70da.png)
この状態でコマンドを実行すると処理が終了すると以下のように通知されます。
![image220425_234415.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/b77084c9-7b3d-3dd6-d02c-fb45ae36c522.png)
「マイクロサービスパターン」の復習 11章 横断的関心事

## 11章 本番環境に耐えられるサービスの開発

- 機能要件とは別に、サービスを成り立たせる上で必要な横断的関心事の話
- 横断的関心事とは、セキュリティ、設定可能性、可観測性とされている
- 横断的関心事はたくさんあるので、それらをある程度まとめて扱える、マイクロサービスシャシーや、その派生であるサービスメッシュについての説明

## セキュリティ

- セキュリティの主要な4要素：認証、認可、監査、セキュアな通信
    - ここでは認証と認可をとりあげる
- モノリシックでの認証
    - HttpSessionや、それよりも少し上位のセキュリティコンテキストAPIなどが認証情報の保持に使われる
    - どちらも1プロセス限定あるいは、プロセス間で共有しても密結合になる
    - マイクロサービスには向かない
- マイクロサービスでの認証
    - これは入口となるAPIゲートウェイで行うのがよい
- マイクロサービスでの認可
    - これはサービスの詳細が必要なので、各サービスで行うのがよい
- マイクロサービスとOAuth2.0
    - ここの部分の説明は全体的に賛同しかねる
    - イマイチな点：OAuthなのにパスワードグラントをベースにしている（通常は非推奨）
    - JWTにユーザーの情報を全部入れるのがいいというのも、この辺はトレードオフがあって、検証しようとすると結局別サーバーへの同期通信が発生するし、情報を入れすぎるのは個人情報漏洩という意見もあるので、識別子型のアクセストークンが採用される場合もあるらしい。

## 設定可能性

- 設定情報をいかに外出しするかの話
- 別サービスにhttpアクセスするならホスト名が必要、kafkaでメッセージングするならkafkaのネットワーク位置、DBにアクセスするならDBのパスワードなどが設定情報として必要
- プッシュ型の外部設定
    - 起動時のコマンドラインオプションや環境変数で、設定情報あるいは設定情報ファイルのパスを渡すやり方
    - メカニズムとしてはシンプル
    - ただしマイクロサービスのようにプロセスがたくさん立ち上がるアーキテクチャだと、それぞれのプロセスの起動コマンドに渡せるようにしなければいけない
- プル型の外部設定
    - 設定サーバーを立てて、そこを参照しにく
    - AWS Parameter Storeのような専用なものもあれば、DBサーバーやgitなども選択肢に入る
    - 一元化、暗号化、動的再読込など便利と言えば便利
    - 一方で、お守りの必要なサーバーがまた一つふえるという大きな欠点も。
    - 設定サーバーへのアクセス情報だけは、push型にしないといけない

## 可観測性

- さまざまな観測について。
- health checkパターン
    - みんな大好きhealth check。
    - zabbixなどから、サービスの死活管理しましょう
    - helth checkでどこまで監視するかは、開発者次第
- Log Aggregation
    - マイクロサービスは複数プロセス、複数ホストで動いて、デバッグしづらいので、まずは一箇所にログを集めましょう
    - 集めたログはElastic Searchなどで解析
- Distributed Tracing
    - 単にログを集めただけではできないこと：スタックトレースの表示
    - ではどうするか
        - APIゲートウェイで外部からのリクエストにトレースIDを振る
        - APIが自身の処理には、スパンIDを振る
        - サービスへの呼び出しを行う際には、トレースIDとスパンIDを伝搬する
        - 呼ばれたサービスが、別のサービスを呼び出すさいも、同じことを行う
        - 各サービスは、都度、分散トレーシングサーバーに情報を送る
    - 上記は手書きだと大変なので、AOPで透過的に行う
    - 分散トレーシングサーバーとしては、zipkinというのが有名らしい
    - トレースIDやスパンIDなどを渡すHttpヘッダは標準化されている
- Application Metrics
    - メモリ使用量、CPU利用率など、OSやVMレベルの情報
    - オーダー数、キャンセル数などアプリレベルの情報
    - AWS Cloudwatchは、プッシュモデル
    - Prometheusは、プルモデル
    - 個人的には、必要なときにcurlなどで読めるプルモデルの方が良さそうな気もする
- Exception tracking
    - 通常のログは単一行出力にしておいて、例外ログは別で記録した方がいいよという話
    - HoneyBadgerというライブラリを使うとログを拾って、サーバーに送って、issue管理にチケットまで作ってくれる
    - 通常ログと例外が一緒に出ている方が時系列が分かりやすくて便利じゃない？という意見もある
- Audit logging
    - 実現手段が3つある
        - 手書き
        - AOP
        - イベントソーシング
    - 個人的には監査ログは、ビジネス要件が絡むので手書きな気がする

## マイクロサービスシャシーとサービスメッシュ

- マイクロサービスシャシーは、各サービスのプロセス内で動作するライブラリとして以下を行う
    - 外部設定
    - ヘルスチェック
    - アプリメトリクス
    - サービスディスカバリ
    - サーキットブレイカー
    - 分散トレーシング
- マイクロサービスシャシーは、プロセス内で動くので、Java用、Node用などテクノロジスタックに合わせる必要がある
- サービスメッシュ
    - シャシーで実現するうちのいくつかを、サービスから独立したネットワークレイヤーとして実現する
    - テクノロジスタック非依存になるし、各サービス内で動作するものが減るでの作りとしてもシンプルになる
    - といっても目立ったところはサービスディスカバリやサーキットブレイカーで、ほかはある程度サービス側でもやらないと成り立たない。
    - 最近よく聞く、istioはサービスメッシュの一つ

## まとめ

- この章で紹介された横断的関心事は多かれ少なかれ、ほとんどのサービスで必要になるのは分かる
- サービスシャシーやサービスメッシュを導入すれば、その多くをまとめて面倒を見てくれるのが便利なのも分かる
- とはいえ、サービスシャシーやサービスメッシュの使い方を覚えて、実際に障害発生時に対処できるくらい熟練するには多くの時間を要するでしょう
- サービス作るのは大変だ
ICLR2022の枝刈り論文 (1)

# 概要

この記事では、[ICLR2022](https://iclr.cc/)の枝刈り論文をまとめます。[^1]
[^1]: 画像や数式は論文から引用しています。


# Learning Pruning-Friendly Networks via Frank-Wolfe: One-Shot, Any-Sparsity, And No Retraining

[OpenReview](https://openreview.net/forum?id=O1DEtITim__)

(ICLR2022 Spotlight)
概要：One-shot pruning (反復や再学習が不要な枝刈り)の手法
新規性：One-shot pruningでSOTA
キモ：DNNの学習をpruning-awareにするために、ロスの最小化の探索空間$C$をK-sparse超多面体に制約を掛ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/d31e65b5-6cb6-bc04-c9f9-198e5f773e77.png)
この最適化問題を、SFW (Stochastic Frank-Wolfe) で解く。
評価：VGG, CIFAR-10で実験して比較した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/88613124-3931-0d1d-70be-1404f4d47c27.png)


# On Lottery Tickets and Minimal Task Representations in Deep Reinforcement Learning

https://arxiv.org/abs/2105.01648

(ICLR2022 Spotlight)
概要：強化学習における宝くじ理論
新規性：強化学習における宝くじ理論のメカニズムを詳しく調べた。
キモ：入力層の枝刈りの寄与を調べ、タスク依存な刈り方をしていることが分かった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/cf8da04c-7379-16be-4347-724b658e7adc.png)
マスク(刈り方)のみ学習した場合と、マスクと重みを学習した場合と比較して近いことから、マスクの寄与が大きいことが分かった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/1f57a060-6d71-ebd9-d47f-70310aaf0139.png)
Off-policyでもon-policyでも枝刈りに効果があることが分かった。
評価：様々なATARIタスクで実験した。


# SOSP: Efficiently Capturing Global Correlations by Second-Order Structured Pruning

https://arxiv.org/abs/2110.11395

(ICLR2022 Spotlight)
概要：SOSP. DNNのグローバルな情報を効率よく取れる2次枝刈り
新規性：Structured pruningで、2次の効率的な方法を提案した。
キモ：$M$がある時とない時のロスの差を小さくする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/027a136f-b7e7-cbec-2f7e-2a53ec4c3455.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/de086ffb-0dbb-8ca0-dc53-2012a97b9147.png)
SOSP-Iでは、HessianをGauss-Newton近似で、SOSP-Hでは、Hessian・ベクトル積を逆誤差伝播法で求める。
評価：VGG, ResNet, DenseNetでEigenDamage(2019)等と比較した。


# Prospect Pruning: Finding Trainable Weights at Initialization using Meta-Gradients

https://arxiv.org/abs/2202.08132

(ICLR2022 Poster)
概要：ProsPr. 初期化時の枝刈り(pruning at initialization). Single-shotもできる。
新規性：従来の初期化時の枝刈りより精度が良い。
キモ：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/28ec7197-f88c-6c14-1341-946aa7352a4a.png)
[SNIP](https://arxiv.org/abs/1810.02340)で、少し勾配を計算してからSNIP同様に、ロスに対するマスクの勾配からマスクの寄与度$s_j$を計算して刈る。SNIPとの差分は、Algorithm 1の3~8行目が存在していることである。
評価：VGG-19やResNetで、SNIP等と比較した。
ShodanのAcademic Upgradeを使ってみる

# 前説
IoTサーチエンジンの[Shodan](https://www.shodan.io/)では、[Academic Upgrade](https://help.shodan.io/the-basics/academic-upgrade)というメンバーシップが存在し、特定の教育機関向けドメインのメールアドレスを対象に、無償で利用できるサービスを提供している。

Shodanでvulnタグを利用する予定があり、対象となりそうなメールアドレスを持っていたため、このサービスを試してみた。

# Academic Upgradeメンバーシップの利用
高等教育機関向けメールアドレスを使って、通常のアカウント作成と同じ方法でアカウントを作成するだけ。特に申請などは必要なく、メール認証が済み次第Academic Upgradeメンバーシップが有効になっていた。おそらくac.jpドメインのメールアドレスであれば自動的に適用されると思われる。

# Academic Plus
通常のAcademic Upgradeメンバーシップではモニタ出来るIPアドレスは16が上限となるが、**university IT departments**を対象に16ビットマスク×2の範囲のIPアドレスを同時にモニタ出来るAcademic Plusが提供されている。
当初、アカウント作成時にはAcademicが割り当てられ、申請でAcademic Plusにしてもらう予定だったが、アカウント作成時に自動的にAcademic Plusとなっていた。同じメールドメインを持つ誰かによってすでに申請済みだったのだろうか？

# モニタ画面
監視したい対象のIPアドレスを登録すると下の画像のように表示される。インターネットからアクセス可能なポート一覧や確認されている脆弱性のリスト、IPアドレスごとの公開ポート数がヒートマップで表示されている。

![Screenshot 2022-04-25 at 22-15-47 Shodan Monitor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63695/c3549856-a469-cb52-373f-2f7b59b63da1.png)
herokuのpapertrailでタイムゾーン変更

### やりたいこと
herokuのpapertrailで表示されるログの左のタイムスタンプのタイムゾーンを変更したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691945/7a8316d3-a310-1950-76c4-a86d4c29e66e.png)

### できなかった方法
以下手順でherokuのタイムゾーンを変更するだけでできると思ったけど、できなかったのでメモ。

https://qiita.com/ikemura23/items/52ab8a5d260c7ee4d42b

まずは上記にしたがってタイムゾーンを変更する。
```
heroku run date
heroku config:add TZ=Asia/Tokyo --app アプリ名
heroku run date
```

アプリログのタイムスタンプのタイムゾーンは変わったけど、papertrailのタイムスタンプは変化なし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691945/65bd7a0d-b115-cc13-bbfa-24511e6b6322.png)

### できた方法
https://stackoverflow.com/questions/45981647/change-default-timezone-in-papertrail
コンソール上部のSettingsから以下の変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691945/beb265dd-f3fa-b0cf-d387-070809ca1c8c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691945/ddb279b5-6cbd-8d2f-3e34-75d7b356c56e.png)
上記設定をして「Update Preference」を押下。

コンソール下部の歯車から「UTC Timestamps」をOFF。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691945/a3b24f25-ae37-0e6d-e6e7-df37f55ab31d.png)
AWS SDK for PHPのVersion2とVersion3の主要ページへのリンク集


AWS SDK for PHPのVersion2とVersion3の主要ページへのリンク集。
咄嗟の時にすぐアクセスできる用にまとめました。

## AWS SDK for PHPドキュメント群 TOPページ

 [AWS SDK for PHP Documentation](https://docs.aws.amazon.com/sdk-for-php/index.html)

## 主要ページへのリンク集

||Version2|Version3|
|---|---|---|
|PHPのバージョン |5.3.3以上  |5.5以上  |
|要件  |[Requirements - AWS SDK for PHP 2.8.30 documentation](https://docs.aws.amazon.com/aws-sdk-php/v2/guide/requirements.html)  |[Requirements and Recommendations for the AWS SDK for PHP Version 3 - docs.aws.amazon.com](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/getting-started_requirements.html)  |
|ガイド  |[AWS SDK for PHP - AWS SDK for PHP 2.8.30 documentation](https://docs.aws.amazon.com/aws-sdk-php/v2/guide/)  |[What Is the AWS SDK for PHP Version 3? - docs.aws.amazon.com](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/welcome.html)  |
|インストール  |[Installation - AWS SDK for PHP 2.8.30 documentation](https://docs.aws.amazon.com/aws-sdk-php/v2/guide/installation.html)  |[Installing the AWS SDK for PHP Version 3 - docs.aws.amazon.com](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/getting-started_installation.html)  |
|インストール方法 |Composer, [phar（※）](https://github.com/aws/aws-sdk-php/tags?after=3.18.14), zip|Composer, phar, zip |
|API Reference |[AWS SDK for PHP - docs.aws.amazon.com](https://docs.aws.amazon.com/aws-sdk-php/v2/api/)   |[AWS SDK for PHP 3.x - docs.aws.amazon.com](https://docs.aws.amazon.com/aws-sdk-php/v3/api/index.html)  |

※version2系で最も最新の2.8.30をDLできるページへのリンクを掲載

## Version2からVersion3への移行ガイド
[Upgrading from Version 2 of the AWS SDK for PHP - docs.aws.amazon.com](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/getting-started_migration.html)