OmniAICreator/Qiita-1.07M huggingface dataset:
git resetコマンドで任意のpushまで巻き戻す

# はじめに
`git reset`はチーム開発の場合には無かったことにするため極力使わない方が良いです。
履歴を残しつつ取り消す方法`git revert`を使えばチームに迷惑にはならないはずです。

使う局面は、自分ひとりで触っている状態などで`git reset`する事はあります。
では`git reset`開始。

# 状態確認
- `push`の一覧を確認します

```console
$ git log --oneline
baa9043 (HEAD -> develop, origin/develop) テキスト変更３
fea4511 テキスト変更２
a40ce6b テキスト変更１
861e1b0 first commit
```

- 各pushのコミットIDがコミットした内容とともに表示されます。
- 任意のコミットIDの`push`まで巻き戻す
  - 例えば`first commit`時の`push`まで巻き戻して、テキスト変更１とテキスト変更2とテキスト変更3を消し去りたい場合

# 任意のpushまで巻き戻し開始
- 巻き戻したい任意のコミットIDを指定します
- オプションは次項目を参照してください

```console
$ git reset --mixed 861e1b0
Unstaged changes after reset:
M       test.txt
```

- ふたたび`push`の一覧を確認します
- 消えました

```console
$ git log --oneline
861e1b0 (HEAD -> develop) first commit
```

# ３つのオプション
- ※`git reset`には以下の３つのオプションがあります。

```console
$ git reset --soft コミットID      取り消すのはcommit
$ git reset --hard コミットID      取り消すのはcommitとaddとソース
$ git reset --mixed コミットID     取り消すのはcommitとadd
```

# 新しくpushする

- では巻き戻されたので新しく`push`いたします

```console
$ git add test.txt
$ git commit -m "テキスト変更4"
$ git push origin develop
 ! [rejected]        develop -> develop (non-fast-forward)
error: failed to push some refs to 'git@github.com:hogehoge/fugafuga.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

# 強制的にpushする
- 怒られたので強制的にpushすることになります
- `-f`で強制オプション

```console
$ git push -f origin develop
メッセージ省略
To git@github.com:hogehoge/fugafuga.git
 + baa9043...6860cec develop -> develop (forced update)
```

- 確認します
- 強制`push`ができました

```console
$ git log --oneline
6860cec (HEAD -> develop, origin/develop) テキスト変更4
861e1b0 first commit
```
以上
smartyでhtml形式の変数をhtmlとして表示する3つの方法

smartyでhtml形式の変数をhtmlとして
表示するための方法を調べていていくつかパターンがあり、
環境によって適応できる形式が異なるようなのでまとめました。

例えば

`$test = '<b>こんにちは<b>'`

というhtml変数があったとして

\<b>こんにちは\<b>

ではなく

<b>こんにちは<b>

というように太字で表示させたい(htmlを反映させたい)時の出力方法です。

いくつかのサイトを見ましたが以下の3つのうち、1つしか書いていない記事が多く混乱したのでまとめました。
以下の3パターンを試せばどれかでうまくいくと思います。

- `{$test nofilter}`

- `{$test|smarty:nodefaults}`

- `{$test|unescape}`

もし他のパターンがあれば教えてください！
Visual Studio 2019のキャプション バーを表示する

# 概要
WindowsのLook & Feelといえば、キャプション バーにアプリケーション アイコンである (懐古厨)。しかし、最近はUWPという誰得なLook & Feelのせいでキャプ ションバーが蔑ろにされており、Windowsのクラシック スタイルに思いを馳せ、React OSを検討したりすることもしばしば(苦笑)

Visual Studioでもデフォルトではキャプション バーがなく、ひじょーーーーーに使いづらいのだけど、設定で一応それっぽいのが表示できるので **キャプション バーを表示** して心の安寧を保つ。

# settings
``[ツール]`` ⇒ ``[オプション]`` ⇒ ``[環境]`` ⇒ ``[プレビュー機能]``
``コンパクト メニューと検索バーを使用する`` の **チェックを外す** 。
![settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/9c5a88dd-ceea-64c5-9be9-4f463030e21f.png)
(お前の名前って ``キャプション バー`` じゃなかったっけ？MSさん？)

# before
``キャプション バー`` がなくて掴むところが無い。。。
RDPで使っていると、接続バーも被って、ストレス倍増フル。。。
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/1d2423bf-62d8-47e0-67ba-90548434a450.png)

# after
若干検索バーという邪魔者がいるけど、まぁ幾分かまし。
(キャプション バーはウィンドウの移動に使うから、モノ置くのやめてほしい。。。)
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/8f6f3760-6fdb-7917-968b-29ad3d9a3960.png)

# 余談
Windows 7がサポート終了となり、クラシック スタイルが実装されているWindowsが一応無くなってしまった。私の愛したWindows(笑)が居なくなったので、最近はもうWindowsに固執しなくても良いかなぁと思っている。GPUをあまり使わないレガシーな描画時エンジン(GDI+)を捨てたいのはわかるけど、Look & Feelまで変える必要あったのかと。。。あの無骨なLook & FeelこそがWindowsの、Desktop OSとしての長年の魅力であったと思っている。Project ReunionでLook & Feelが戻ってくれると嬉しいのだけど (特にウィンドウ形状)。。。

あと、ウィンドウは左上のアイコンをクリクック(笑)で閉じることが多いので、無くなるとすっごい困る。。。

なお、システムカラーは `#C0C0C0` 派です。
julia v1.5から始めるJupyter Notebook



[前回](https://qiita.com/doorei/items/bac598bac28af074edab)、juliaをインストールしたあと環境をきれいにしたところ、juliaがバージョンアップしていた。インストールしたらまた少しだけ前回通りではいかなかったので再々度書いてみる。
※[Julia1.5.3対応版](https://qiita.com/doorei/items/4498eb558e88f8fb378f)はこちら

# やってみた環境
- Windows 10 Home (64bit) Ver 1909
- julia v1.5 (64bit)

# やり方
0. juliaがインストール済みの前提(インストーラー版)
1. juliaのコンソールを起動(緑字のプロンプト)
2. `]`キーを押してパッケージモードへ(青字のプロンプトになる)
3. `add IJulia`を実行(Cloning～となり、しばらく時間がかかる)
4. `build IJulia`を実行(Building～となり、しばらく時間がかかる)
5. バックスペースでパッケージモードを抜ける(緑字のプロンプト)
6. `using IJulia`を実行(Precompilingされる)
7. `notebook(detached=true)`を実行
8. 「install Jupyter via Conda, y/n? [y]:」と聞かれるので`y`を入力
9. 関連パッケージがダウンロードとインストールされる。(結構時間がかかるので気長に待つ)
10. Jupyterが起動する！「New」のプルダウンにはJulia 1.5.0とpython 3が出てくる

juliaからインストールしたcondaはjulia専用(?!)なのでDisk容量がもったいないといえばもったいないけど、面倒なことを考えないでJupyterが使えるようになるのでまずやりたいことをやる！という場合にはいいんではないでしょうか？

ちなみにjuliaからインストールしたcondaでインストールしたパッケージの確認などは次のようにします。

```julia
julia> using Conda                    
Julia> Conda.list()                   # Condaでインストールしたパッケージ一覧 
Julia> Conda.update()                 # Condaでインストールしたパッケージのアップデート
Julia> Conda.install("package_Name")  # Condaで"package_Name"をインストール⇒「conda install -y package_Name」を実行
```

上記の`using Conda`でエラーが出る場合は一回だけ次のようにパッケージを追加する必要があります。
`]`キーを押してパッケージモードへ(青字のプロンプトになる)

```julia
Julia> add Conda
```

# 普段のjupyter起動
念のためですがインストールが終われば次からは下記だけでjupyter Notebookが起動します。

```julia
julia> using IJulia
julia> notebook(detached=true)
```
【Git】【GitHub】リモートの追加とリモート名の変更

###リモート名のTypoによって変な名前に・・・

Gitでバージョン管理する上でリモートの追加が必須。ということでリモートの追加をしてみましょう。

```
$ git remote add origin Gitのurl
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/8cf0ee6d-bcd4-b811-a4d6-6128c65f7e4b.png)

これでローカルで作業をする準備ができた！って感じですかね。

ここでoriginをoringinとしてしまった。
nが一つ多かった。


Gitの使い方の説明を探すと、だいたいoriginなので、oringinだと、「あれ、おかしいな。ちゃんとやってるのにエラーが出るよ？」という状態に。

よくよくみると
originなんてないよ！っていうエラーメッセージだったので、コマンドの履歴を見ると

```
$ git remote add oringin Gitのurl
```

というぐらいに、add の後ろ！oringinになっていました。


###リモート名を変更することでoringinをoriginに変更

リモートの詳細をみてみよう

```
$ git remote -v
```
これで
リモート名　url
というぐらいに表示される。

ここでリモート名がおかしいものを確認しよう。
ちなみにherokuにデプロイした時のgitの情報も表示されました。


renameで名前を変更

```
$ git remote rename 変えたいリモート名　新しいリモート名
```

これでうまく変更できました。

変更はできますが、タイプミスしてしまった時限定です。

originは変更しないようにしましょう。

必要ないリモートは削除した方がいいみたいです。
[Rails]ngrokを使ってローカル環境でLINEBotを動かす


# 　概要
前回は、LINEのMessagingAPIを用いてechoBotを作成しました。 
https://qiita.com/shizu9d/items/2bd2618409c9e5c93e0f
コードを編集した場合、Herokuにデプロイしなくては反映されないので、
ローカル環境で動かすことで、デバック等を容易にすることができます。

# 　環境

・Ruby 2.6.5
・Rails 6.0.3.2
・PostgreSQL
・Heroku

# 　ngrok
ngrokを使用することでローカルで起動中のwebサーバーを簡単に外部公開できるようになります。
デプロイをせずに、開発環境でBotを動かせるようになります！

## 　ngrokのインストール

```
$ brew install ngrok
```

もし上記でインストールできない場合は cask オプションを使用してください。

```
$ brew cask install ngrok
```

## 　実行

ローカルでの起動ページのポート番号を指定します。

```
  http://localhost:3000
```
このような場合は、

```
 $ ngrok http 3000
```
とコマンドしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696964/90f2e6c8-8088-887e-0fa3-b595fcbc8d42.png)
このように表示されればOKです！

## 　環境変数の設定
ローカル環境での環境変数を設定します。
今回は、dotenvを使い.envファイルで管理したいと思います。

## 　gem dotenv-rails
'dotev-rails'というgemを使用します。

```Ruby:Gemfile
 gem 'dotenv-rails'
```
```
 $ bundle install
```
アプリケーションのルート直下に.envファイルを作成する。

```
 $ touch .env
```
作成した.envファイル内にアクセストークンとchannel secretを設定する。

```Ruby:.env
 LINE_CHANNEL_SECRET=ここにChannel Secretを貼り付ける
 LINE_CHANNEL_TOKEN=ここにアクセストークンを貼り付ける
```
gitignoreに.envファイルを追加し、アップしないように設定します。

```Ruby:gitignore
 /.env
```
# 　Webhook URLの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696964/f373be17-ef34-c72e-a775-73f92549e20d.png)

先ほどのngrokのURL(2つめのForwarding)に/callbackをつけ、WebhookURLに設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696964/fa4c111c-0210-7aac-748b-b7155d5e3bdb.png)

以上で、ローカル環境でLINEBotを動かす準備は終わりました！
Rails 6以外のみなさんお疲れ様です！

## 　ブロックされる
Rails 6ではIPアドレス表記のサーバーとlocalhost以外のサーバーはブロックされるみたいです。
そこでngrokのアクセスを許可するように設定します。

```Ruby:config/environments/development.rb
Rails.application.configure do
 〜中略〜
 config.hosts << '.ngrok.io'
end
```
# 　まとめ
ローカルで動かせるおかげで、デバッグが容易になりアプリの動きが良くわかり、
効率よく学習できるようになりました。
現在はぐるなびのAPIを使って飲食店検索のBotを作成しました。

## 　参考文献
以下の記事を参考にさせていただきました。
https://qiita.com/hirokisoccer/items/7033c1bb9c85bf6789bd
https://qiita.com/suketa/items/f00570e6f171cb987ddd
YoLo v3 v4 ちょこっと気になるトコ

物体検出で、とくに速度が必要な場合、Real-time object detection を謳う YoLo(https://pjreddie.com/darknet/yolo/) がよく利用されます。

2020年になって登場した YoLo の v4 の変更点の私家版 (https://www.nakasha.co.jp/future/ai/vol15_darknet_yolov3yolov4.html) が公開されていて、個人的に気になった点のちょこっとメモです。

#### ネットワークに動画対応が追加

> ・added the ability for training recurrent models (with layers conv-lstm[conv_lstm]/conv-rnn[crnn]) for accurate detection on video
　動画検出のためのリカレントモデル学習に対応

これですと、連続する画像(動画)向けのように見えますが、なんだかよくわかりません。。

issue を見ると、#3114 で説明があります。
https://github.com/AlexeyAB/darknet/issues/3114

ビデオフレームの学習として、blinking の問題(フレームごとに検出したりしなかったりという問題でいいの?)を解消するとあります。

conv_lstm に関して言うと、#3326 にも説明があり、下記論文の Convolutional LSTM を取り込んだ点を言っています。 
https://github.com/AlexeyAB/darknet/issues/3326
> Did you implement the same "Convolutional LSTM" proposed in the following document? I want to study Convolutional LSTM using the paper and your code.
(http://arxiv.org/abs/1506.04214v1)

> 1.-2. Yes, 

ここまでくると日本語の解説も参考にできます。
https://qiita.com/masataka46/items/0c77fef1e48446c7d329

LSTM は v3 ベースから試していて、このあたりは v4 の新しい取り組みというより、darknet のレポジトリとしての説明のようですね。

#### data augmentation

Self-Adversarial Training というデータ拡張の手法もありとのこと。adversarial attack という言葉からすると、通常の学習は loss が下がるように学習するところ、loss が上がるような画像で誤認識させる攻撃が発想のもとで、そういった画像で学習させて誤認識するような画像も認識出るようになる、でしょうか。

あと上記と別で、全く新機能ではありませんが darknet では data augmentation がフレームワークの段階で動作する実装となっているそうです。
https://demura.net/robot/athome/15558.html

#### おまけ

> And added manual - How to train Yolo v4-v2 (to detect your custom objects)

＾＾

いままでなかったんでしたっけ。。
Gitで削除したブランチを復活する方法

##はじめに

Railsチュートリアルの学習中、不要なブランチを作りすぎたので整理していたら、誤って必要なブランチを削除してしまいました。。。
復活できたので備忘録として記事を書きます！

##ブランチを削除する方法

なんかいつの間にブランチ作りすぎちゃったな、、、
よーし、いらないブランチを削除するぞ〜

```
git branch -D ブランチ名
```

あれ！いま削除したブランチってRailsチュートリアルを見て６時間かけて作ったブランチじゃない！！？？
エーン〜どうしよ～（泣）

##Gitの過去の変更履歴を遡る方法

そんな時はまずGitの変更履歴を遡ります。
下記コマンドで参照できます。

```
git reflog
```
上記コマンドを入力したら下記のレスポンスが返ってきました。

```
537c709 HEAD@{1}: commit: Use SSL and the Puma webserver in production
f7be562 (origin/sign-up, sign-up) HEAD@{2}: merge sign-up: Fast-forward
d06141b HEAD@{3}: checkout: moving from sign-up to master
f7be562 (origin/sign-up, sign-up) HEAD@{4}: commit: Create signup test
```

HEAD@の後ろにある｛｝の中に入ってる数字がログ番号、その後が変更内容となります。


##削除したbranchを復活する方法

変更履歴で調べたログ番号を使って、下記コマンドでブランチを復活させます。

```
git branch ブランチ名 HEAD@{ログ番号}
```

なんとか復活できました！！
よかった〜

以上！！
EOLとEOSについて

サーバーリプレースの観点では、たとえ性能に不満がなくても、保守廃止日を迎えるサーバーはリプレースしなければならない。その際に押さえておくべきポイントが、EOLとEOSの２つある。

#EOLとは？

- **E**nd **o**f **L**ifeの略で、**`保守廃止日`**のこと。

- 保守サービスにおけるEOLは、その日以降の修理ができないことを意味する。

- EOLはサーバーメーカーが決定しており、有償の保守サポートサービスを契約している間は、メーカーが発表するEOL情報を入手できるように普段からアンテナを広げておく必要がある。

#EOSとは？

- **E**nd **o**f **S**alesの略で、**`販売終了日`**のこと。

- 指定日以降の製品の出荷・販売といった営業活動を終了することを意味する。(つまり販売が終了するので、それ以降は同じ製品が手に入らなくなる。)

- EOS後の製品は徐々に流通在庫が少なくなっていくので、サーバー保守を契約していない場合、部品調達に影響が出てしまい、最悪の場合部品が枯渇して修理ができない状況に陥ることもある。

- EOLによってはっきりと「サーバーが使える期間」が可視化された契約をしておくことが望ましい。
【Android】Daggerで注入するクラス内で引数を使いたいとき

ここでは、HogeRepositoryImplクラス(HogeModuleで注入するクラス)内で `context` を使用したい場合を想定。


1. HogeModule内にcontext引数を追加

    ```kotlin
    class HogeModule(private val context: Context){
        @Provides
        fun provideRepository(): HogeRepository = HogeRepositoryImpl(context)
    }
    ```
2. HogeComponent内のcreate関数の引数にhogeModule:HogeModuleを追加。
    
     ```kotlin
    interface HogeComponent : FragmentComponent<MainFragment> {
    
        @Component.Factory
        interface Factory {
            fun create(hogeModule: HogeModule): HogeComponent
        }
    }
    ```

3. Fragment内のcreate関数にhogeModule引数を作成

    ```kotlin
        DaggerHogeComponent.factory()
            .create(HogeModule(context))
            .inject(this)
    ```
Pythonでゆっくりボイスを作ろう

PythonからSofTalkを利用したいのです

# 環境

- Python 3.8.3
- SofTalk 1.93.46
- Windows10


# 準備

SofTalkをダウンロードしておきましょう
以下のページから最新バージョンをダウンロードしておいてください
https://w.atwiki.jp/softalk/pages/15.html


# コマンドラインからSofTalkを使ってみる

同梱されている `help.chm` にも記載されていますが、コマンドラインからSoftalkを利用する方法があります
DLしたzipを解凍して

```
start ..\softalk\Softalk.exe
```

これでSofTalk本体を起動するとともに、以下の引数が利用可能です

### SofTalk引数早見表
ゆっくりボイスでは利用できない(Aquestalk10でのみ利用可能)な引数は除いています

|種類|値|効果|詳細|備考|
|:----|:----|:----|:----|:----|
|/NM:|文字列|声指定|声を名前で指定|例）/NM:女性01|
|/M:|0～?| |声を番号で指定| |
|/PR:|文字列|プリセット指定|プリセットを名前で指定|例）/PR:初期設定|
|/N:|0～?| |プリセットを番号で指定| |
|/O:|0～300|音程|声の音程|低くすると読む速度が落ちるだけなので、速度との違いがあまりないかも|
|/P:|読み|読み追加|読み(ひらがな),単語,全/半角を区別(True/False)|例）/P:てすと,Tｅst,True|
| | | |登録済みの単語の場合は以前の単語を更新| |
|/Q:|0～5|読み上げ方|0:平仮名変換無・抑揚無|選択中のライブラリに対して設定|
| | | |1:平仮名変換無・抑揚有| |
| | | |2:平仮名変換有・抑揚無| |
| | | |3:平仮名変換有・抑揚有| |
| | | |4:平仮名変換有・抑揚無・空耳有| |
| | | |5:平仮名変換有・抑揚有・唄詠有| |
|/R:| |録音|読み上げた文章の録音|例）/R:c:\test.wav|
|/S:|1～300|速度|読み上げの速度| |
|/T:|7～11|ライブラリ指定|ライブラリ（エンジン）の指定|0でゆっくり霊夢、1でゆっくり魔理沙ボイス|
| | | |7:AquesTalk| |
| | | |8:SAPI| |
| | | |9:Speech Platform| |
| | | |10:AquesTalk2| |
| | | |11:AquesTalk10| |
|/U:|0～?|声指定|ライブラリ（エンジン）から声を指定|選択中のライブラリに対して設定|
|/V:|0～100|音量|声の音量| |
|/W:|文章|文章|読み上げたい文章|このオプション以降の文字は全て文章とみなす|
|/X:|0～1|画面表示|0:表示　1:非表示|起動時のみ有効、終了する場合は/close|
|/Z:|パス|XML出力|指定可能な声をXML形式で出力| |


/Wの位置にさえ注意すれば特に難しいことはなさそうです

# Pythonから実行してみる

毎回コマンドラインから入力するのは面倒です
面倒なことはPythonにやらせましょう

Pythonからコマンドを実行したい時は、subprocessモジュール[^subprocess]を利用します

本記事を書くまで知らなかったのですが、Python3.5以降では ```subprocess.call()``` ではなく ```subprocess.run()``` を利用すべきだそうです

>**サブプロセスを起動するために推奨される方法は、すべての用法を扱える run() 関数を使用することです。**より高度な用法では下層の Popen インターフェースを直接使用することもできます。
>**run() 関数は Python 3.5 で追加されました**; 過去のバージョンとの互換性の維持が必要な場合は、古い高水準 API 節をご覧ください。

### コードを書いてみる

>yukkuri
>├yukkuritest.py
>└softalk(解凍フォルダ)
>　└ SofTalk.exe

こんな感じのディレクトリ構成を想定します

コマンドをスペースごとにリストにしてrun()関数に渡せばOK
…と思っていたのですが、どうやら一度リストを半角スペース入りで結合しなければいけない模様
というわけで、簡単に書くと以下のようになります

```python:yukkuritest.py
import os
import subprocess

os.chdir(os.path.dirname(os.path.abspath(__file__)))

_start = "start SofTalk.exeのPath"
_speed = "/S:120"
_word = "/W:おはようございます"

_command = [_start, _speed, _word]

subprocess.run(' '.join(_command), shell=True)


```

これでゆっくりボイスをPythonから出力できるようになりました

[^subprocess]: subprocess --- サブプロセス管理
 https://docs.python.org/ja/3/library/subprocess.html
git commit時のエディタをvimにする

#git commit時にnanoが開くのは嫌だ
nanoではなくviで編集したい

#これを実行するだけ
```
$ git config --global core.editor vim
```

参考
[git commitで使用するエディタを指定する](http://horie1024.hatenablog.com/entry/2015/11/20/160052)
OAuth 2.0 トークン無効化のタイミング

トークンを適切に無効化することはセキュリティの面において非常に重要です。ただ、OAuth 2.0 の仕様を読むと、こういう時にはトークンを無効化すべきだ、と書かれている箇所が何箇所もあって難しいなと感じたので、まとめてみました。

（まとめてみると意外とシンプルでした😊）


# トークンを無効化するタイミング

- クライアントからトークンの取り消しの要求があったとき
- リソースオーナーから認可の取り消しの要求があったとき
- トークンの有効期限が切れたとき
- リフレッシュトークンが更新されたとき
- 古いリフレッシュトークンが使用されたとき
- 認可コードが２度以上使用されたとき
- クライアントシークレットを無効化するとき


## クライアントからトークンの取り消しの要求があったとき

エンドユーザーがログアウトするときやアカウントの切り替えを行う時など、クライアントにとってトークンが必要なくなったときには、トークンの無効化を行うのがよいとされています。理由は、不要になったアクセストークンの乱用防止やユーザーからの信頼につながるためです。

そのため、[OAuth 2.0 Token Revocation](https://openid-foundation-japan.github.io/rfc7009.ja.html) には、以下のようにトークン無効化のエンドポイントを用意するよう記載されています。

> 実装はリフレッシュトークンの無効化はサポートしなければならなく（MUST）、アクセストークンの無効化はサポートすべきである（SHOULD）。

また、無効化の際には関連するトークンや認可自体の無効化についても検討する必要があります。

- 特定のトークンを無効化するときは、関連したトークンとその元となる認可の無効化を行ってもよい（MAY）
- リフレッシュトークンを無効化するときは、アクセストークンも無効化すべきである（SHOULD）
- アクセストークンを無効化するときは、リフレッシュトークンを無効化してもよい（MAY）



## リソースオーナーから認可の取り消しの要求があったとき

リソースオーナーは上記の「トークン無効化エンドポイント」の仕組みとは別に認可を無効化してよいです。OAuth 2.0の仕様には明示的には記載されていませんが、認可を無効化する際には、リフレッシュトークン、アクセストークンもセットで無効化するべきでしょう。

## トークンの有効期限が切れたとき

トークンには有効期限が設定されます。アクセストークンの有効期限は短く、リフレッシュトークンの有効期限は長めに設定されます。有効期限切れのトークンを用いたリクエストは拒否されるようにすることで、明示的な無効化の処理なしにトークンの無効化を実現できます。


## リフレッシュトークンが更新されたとき

リフレッシュトークンが更新されたときには、古いリフレッシュトークンを無効化してもよいです（MAY）。必須でない理由は、古いリフレッシュトークンが使用された場合にはトークンを無効化することでセキュリティ上の危険を防ぐことができるためです。

ちなみに、新しいリフレッシュトークンが発行された場合、クライアントは古いリフレッシュトークンを破棄し、新しいリフレッシュトークンを使用しなければいけません (MUST).

## 古いリフレッシュトークンが使用されたとき

上記の「[リフレッシュトークンが更新されたとき](#リフレッシュトークンが更新されたとき)」に関連しますが、古いリフレッシュトークンを用いたリクエストがあった場合は、リフレッシュトークンが盗まれた可能性があります。認可サーバー側からは攻撃者と正当なクライアントのどちらがアクセスしようとしているのか判断できないため、有効なリフレッシュトークンとそれに関連するアクセストークン全てを無効化する必要があります。

## 認可コードが２度以上使用されたとき

仕様には以下のように記載されています。

> もし認可コードが2回以上使用された場合は, 認可サーバーはリクエストを拒否しなければならず (MUST), この認可コードを基に発行されたこれまでのすべてのトークンを無効化すべきである (SHOULD).

認可コードが２度以上使用された場合は認可コードが盗まれている可能性があるとみなし、「[古いリフレッシュトークンが使用されたとき](#古いリフレッシュトークンが使用されたとき)」と同様にトークンの無効化を行う必要があります。

そのため、クライアントは２回以上認可コードを使用してはいけません（MUST NOT）。

## クライアントシークレットを無効化するとき

シークレットの漏洩がわかった時などは、悪用を防止するためシークレットを無効化する必要があります。このときは、発行したリフレッシュトークンやアクセストークンも全て無効化すべきでしょう。

## まとめ

|無効化タイミング|重要度|
|---|---|
|クライアントからトークンの取り消しの要求があったとき|リフレッシュトークンの無効化のサポート: MUST<br>アクセストークンの無効化のサポート: SHOULD<br>認可自体の無効化 : MAY|
|リソースオーナーから認可の取り消しの要求があったとき|認可取り消しに伴うリフレッシュトークンの無効化: SHOULD<br>認可取り消しに伴うアクセストークンの無効化: SHOULD|
|トークンの有効期限が切れたとき|有効期限切れのトークンの無効化: MUST|
|リフレッシュトークンが更新されたとき|リフレッシュトークンの無効化: MAY|
|古いリフレッシュトークンが使用されたとき|リフレッシュトークンの無効化: SHOULD<br>関連するアクセストークンの無効化: SHOULD|
|認可コードが２度以上使用されたとき|認可コードを元に発行された全てのトークンの無効化: SHOULD|
|クライアントシークレットを無効化するとき|リフレッシュトークンの無効化: SHOULD<br>アクセストークンの無効化: SHOULD|

※ 仕様に明確な記載がない項目の重要度に関しては、筆者の考えで重要度を記載しています。間違っている箇所がありましたら、ご指摘いただけますと幸いです。


## 参考

- [RFC 7009 - OAuth 2.0 Token Revocation（日本語）](https://openid-foundation-japan.github.io/rfc7009.ja.html)
- [RFC 6749 - The OAuth 2.0 Authorization Framework（日本語）](https://openid-foundation-japan.github.io/rfc6749.ja.html)
- [RFC 6819 - OAuth 2.0 Threat Model and Security Considerations（日本語）](https://openid-foundation-japan.github.io/rfc6819.ja.html)
[javascript]要素に対してなぜ[0]を付ける？

#はじめに
`javascript`を学ぶ過程で取得した要素に対して`[0]`の表記が出てきて理解できなくて調べた内容です。例えば以下のような記述↓

```javascript

document.getElementsByClassName("red")[0].classList.remove("red");
```
内容は`red`クラスを取得し、クラス名から`red`を削除となります。

#理由
なぜ必要かというと要素を複数取得するようなメソッドを使用するときは（要素が一個でも）要素番号を指定する必要があるということです！

`getElementsByTagName`や`getElementsByName`などは要素が複数返ってくるので添字が必要。
`getElementById` の場合は単要素が返ってくるので添字は不要です！
（※コメントにあるご指摘を引用してます）

#ちなみにjQueryでは
`javascript`のライブラリである`jQuery`では要素の指定は`eq()`を用います。

```javascript

 $("p").eq(2).addClass("red");
```
pタグの中からポジションが2（ゼロから数えて3番目）のものにredのクラス名を付与。
ということになります。



自分のコードが`javascript`と`jQuery`がごっちゃになって意味不明になってました。。。


理解してしまえば何てことない内容ですが、初期段階ではなかなか理解しがたい部分でした。
任意の円の内部の格子点の数を求める

任意の円の内部にある格子点を求めるＣ言語のプログラムコードを以下に示す。

```c
#include <stdio.h>
#include <math.h>

/*天井と床を求める*/
void cf(double x, double r, int *low, int *high){

*low = ceil(x-r);
*high = floor(x+r);
}

int main(void){

double a,b,r,p;
int start,end,top,bottom,i,j,num;

num=0;

printf("a b r =");
scanf("%lf %lf %lf",&a,&b,&r);

cf(a,r,&start,&end);

for(i=start;i<=end;i++){

p = sqrt(pow(r,2)-pow((a-(double)i),2));

cf(b,p,&bottom,&top);

for(j=bottom;j<=top;j++){
num = num + 1;
}

}
printf("中心:(%lf,%lf) 半径:%lf 格子点の数: %d \n",a,b,r,num);

return 0;
}
```

aは円の中心のx座標,bは円の中心のy座標,rは円の半径を表し、その円の内部にある格子点の数が出力される。使用するときはターミナルからa,b,rを打ち込んでから使う。

以下、このプログラムの説明を書いていく。

まず、最初に定義された関数cfは天井(ceiling)と床(floor)を求める関数である。これだけでは何をいっているわかりにくいので図を用いて説明する。

天井とはある数を超える最小の整数のことである。例えば3.5の天井は4、-2.1の天井は-2である。床とはある数を超えない最大の整数のことである。例えば3.5の床は3、-2.1の床は-3である。

下の図を見てみるとa-rの天井(start)が格子点のx座標の最小値となっていることがわかる。この図の例ではそれは-3である。
また、a+rの床(end)が格子点のx座標の最大値となっていることがわかる。この図の例ではそれは0である。

![za2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697232/345f1d26-2c6f-d97b-495a-2f0e0edb754e.png)

格子点のx座標は$\rm start\leqq i \leqq end$を満たす整数iに限られることがわかったので、各iごとに格子点の数を求めて足し合わせればよいとわかる。
下の図で三平方の定理より
$$p=\sqrt{r^2-(a-i)^2}$$
となるとわかるので、b+pの床(top)がx座標がiの格子点のy座標の最大値であり、b-pの天井がx座標がiの格子点のy座標の最小値であるとわかる。この図の例ではi=-2のときtop=4,bottom=-1とわかる。

![za.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697232/e14e1c29-422d-8fa8-9e84-94ac7facdd1c.png)


格子点のx座標がiのとき、そのy座標jは$\rm bottom \leqq j \leqq top$を満たすとわかるので各iごとにjの数をカウントアップし、すべてのiについてそれを行えば格子点の数(num)が求められる。

実行結果は以下の通り

```
中心:(3.000000,2.000000) 半径:6.000000 格子点の数: 113
中心:(3.450000,-9.310000) 半径:5.510000 格子点の数: 93
中心:(0.000000,0.000000) 半径:1.100000 格子点の数: 5
```
###備考
半径rの円内部の格子点の数をN(r)とすると
$$\lim_{r \to \infty}\frac{N(r)}{r^2}=\pi$$
という面白い関係式が成り立つそうなので$r=10^4$としてみる。実行結果は

```
中心:(0.000000,0.000000) 半径:1.000000e+004 格子点の数/半径の2乗:3.141591
```

となり、確かに$\pi$に収束しそうだとわかる。
【Windows】IMEのトラブルで日本語入力できなくなった時の解決法

# 日本語入力できなくなったときにIMEを再起動する
Windows10を使っていて日本語入力が突然できなくなった時にIMEを再起動したらあっさり解決したので、備忘録として残しておくことに。

おそらく、Windows自体を再起動すれば解決すると思うが、PC再起動したくない場合などの解決法として有用かも。
具体的にやることはIMEのプロセスをkillして、プロセスを再度実行するだけの簡単な話。

## IMEを再起動する方法
まず、PowerShellかコマンドプロンプトを開いて、稼働しているIMEのプロセスを探します。
IMEのプロセスは`ctfmon.exe`という名前なので、これを`tasklist`という稼働中のプロセスの一覧を表示するコマンド（UNIX系だと`ps`コマンドに相当）を使って探します。

コマンドの説明をすると`/fi`オプションは、結果をフィルタリングするオプション（UNIX系での`grep`のようなもの）です。
`"imagename eq ctfmon.exe"`の部分はctfmon.exeという名前のイメージ（プロセス）と一致するという抽出条件を意味してます。

`tasklist`の使い方は[LinuxのpsコマンドみたいなWindowsのコマンド](http://hironemu.hatenablog.com/entry/20090408/1239163437)が参考になりました。

```powershell
# ctfmon.exeのプロセスを探し出す

tasklist /fi "imagename eq ctfmon.exe" 

<# 出力例
イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
ctfmon.exe                   21532 Console                    1    105,616 K
#>
```

次にプロセスを`taskkill`コマンドで強制終了させます。
この例だとPIDは21532なので、`/pid`オプションを使って次のようにkillします。
※プロセスをkillするには管理者権限が必要です。

```powershell
# ctfmon.exeをkillする
taskkill /pid 21532
```

最後にプロセスを再度実行します。

```powershell
# ctfmon.exeプロセスを起動してIMEを再起動
ctfmon.exe
```

これで日本語入力できるようになるはず。
（これでダメだったらPCを再起動するしかないか。）
【Auth0】管理画面からManagementAPI用のアクセストークンを取得する

# はじめに
Auth0を使い込んでいるとManagementAPIを使う機会が出てくるかと思います。
しかしManagementAPIを使うためには専用のアクセストークンが必要になります。

アプリケーション等からManagementAPI用のアクセストークンを取得するときはアプリケーションから`audience`パラメータに`https://{テナント名}.auth0.com/api/v2/`を設定してトークンを取得していると思いますが、管理画面からアクセストークンを取得することもできます。
テストや検証用途に少しだけ使いたい場合は便利なので管理画面からアクセストークンを取得してみます。

# テスト用アプリケーションの作成

管理画面を開いて`Auth0 ManagementAPI`の設定画面からテスト用アプリケーションを作成します。

![スクリーンショット 2020-08-18 16.51.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653972/cd52c094-53d3-54fb-3e5b-9eefdb3b6411.png)

ボタンを押すと`Auth0 ManagementAPI (Test Application)`という名前のM2Mアプリケーションが自動的に作成されます。

# テスト用アプリケーションのPermission設定

続けて`Auth0 ManagementAPI`の設定画面から先ほど作成したテスト用アプリケーションのPermission設定をします。
自分が使いたいManagementAPIに必要なPermissionを[API仕様](https://auth0.com/docs/api/management/v2)から確認し、必要なPermissionのチェックを入れて更新します。

![スクリーンショット 2020-08-18 17.27.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653972/e41b4028-b24d-f491-3bc8-56f6a48b68b0.png)

# アクセストークンの取得

`Auth0 ManagementAPI`の設定画面の`Test`タブの中に表示されているアクセストークンをコピーします。

![スクリーンショット 2020-08-18 16.56.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653972/3f2781f0-f951-efe5-3790-9bf3968ebfb6.png)

# ManagementAPIを呼び出す

コピーしたアクセストークンを`Authorization`ヘッダーに設定することでManagementAPIが使えるようになります。
下記はテナントに登録されているアプリケーション（client）の一覧を取得するAPIです。

```
GET https://{テナントのドメイン}/api/v2/clients
Authorization: Bearer {アクセストークン}
```

[API仕様](https://auth0.com/docs/api/management/v2)のWebページからAPIを呼び出すことも可能です。
`SET API TOKEN`でアクセストークンを設定し、`TRY`でAPIが呼び出せます。

![スクリーンショット 2020-08-18 18.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653972/e5ed049f-3eb7-7fff-6f99-f14ce69d7ccd.png)

# おわりに
管理画面の中だけでアクセストークンの発行が完結するので、ManagementAPIの動作を確認したいときはとても便利です。
Permissionを過剰に付与してアクセストークンを濫用したりしないようにだけ注意してください。
初心者がまとめる初心者のためのWebサーバ その① Webサーバーとは？

## はじめに
　初心者エンジニアが勉強したWebサーバーの知識をまとめていこうと思います。初心者がまとめたものなので、これからWebサーバーを勉強する人の足掛かりになればと・・・。


##Webサーバとは
僕が思うにWebサーバは「Web」＋「サーバ」という二つの言葉から成り立っているような気がするのでまずは二つの言葉の意味をさらっとみてみます。

####Webとは
　Web（ウェブ）とはインターネットを利用して情報を発信したり閲覧したりするための仕組みのことで正式名称が「World Wide Web」で、URLにある「www」がそれにあたります。[参照](https://livewireee.com/web-003/#:~:text=%E6%99%AE%E6%AE%B5%E3%81%AF%E6%84%8F%E8%AD%98%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8,%E3%81%93%E3%81%A8%E3%82%92%E6%8C%87%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)


###サーバとは
　コンピュータネットワークにおいて、他のコンピュータに対し、自身の持っている機能やサービス、データなどを提供するコンピュータのこと。[参照](http://e-words.jp/w/%E3%82%B5%E3%83%BC%E3%83%90.html)

###つまり？
　**Webサーバとは「インターネットを利用して情報を発信したり閲覧したりする機能やサービス、データなどを提供するコンピュータ」**のことです。



一般的な解説↓
>Webサーバ（ウェブサーバ、英:Web server）は、HTTPに則り、クライアントソフトウェアのウェブブラウザに対して、HTMLやオブジェクト（画像など）の表示を提供するサービスプログラム及び、そのサービスが動作するサーバコンピュータを指す。
https://ja.wikipedia.org/wiki/Web%E3%82%B5%E3%83%BC%E3%83%90



##Webサーバソフトウェア
　サーバを自体はただのコンピューターなので、それだけではWebサーバとして機能しない。サーバにWebサーバソフトウェアをインストールすることで、Webサーバとして機能するようになります。（今お持ちのPCにもインストールするとWebサーバとして使うことができる。）

![Webサーバ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663044/32d129bf-77af-7123-57fc-d60abacdc39e.jpeg)


###Webサーバーソフトウェアの種類（ざっくり特徴）

####Apache(Apache HTTP Server)の特徴[(参考資料)](https://www.atmarkit.co.jp/ait/articles/0012/01/news001.html)

 * 無料で使える
 * 無保証・無対応
 * 一番メジャー

######起動してみる（Macの場合）

```
$ php -v
PHP 7.3.11 (cli) (built: Apr 17 2020 19:14:14) ( NTS )
（後略）

$ httpd -v
Server version: Apache/2.4.41 (Unix)
（後略）

$ sudo apachectl start　
Go to http://localhost:80/server-status in the web browser of your choice.
Note that mod_status must be enabled for this to work.

$ cd /private/var/log/apache2/

$ tail -f access_log

http://localhost:80/にアクセスする。
access_logに追記されていることを確認する。
（Ctrl＋Cで終了する）

$ sudo apachectl stop(止める時)
```

参考資料
[ApacheとNginxについて比較](https://qiita.com/kamihork/items/49e2a363da7d840a4149)
[MacのApacheのサーバーログとエラーログの場所](https://www.shigemk2.com/entry/20120824/1345795386)
 

####nginxの特徴[(参考資料)](https://www.ossnews.jp/oss_info/Nginx/2)

 * 無料で使える
 * 無保証・無対応
 * 負荷分散


######起動してみる（Macの場合）

```
$ brew install nginx
インストールが開始される。（Homebrewは入れておく）

$ nginx
nginxが起動する。

$ cd /usr/local/etc/nginx/

$ cat nginx.conf
(前略)
http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8080;　←確認する。
        server_name  localhost;
（後略）

$ cd /usr/local/var/log/nginx/

$ tail -f access.log 

http://localhost:8080/　にアクセスする。
access.logに追記されていることを確認する。
（Ctrl＋Cで終了する）

$ nginx -s stop
```


####IISの特徴[(参考資料)](https://www.kagoya.jp/howto/rentalserver/iis/)
 * Microsoft制作
 * 無料
 * 視覚的にマウス操作できる
 * 比較的やさしい	

[NginxとApacheのWEBサーバー比較そのメリットデメリット](https://lpeg.info/webworks/nginx_apache.html)


* * *
AWS Certified Solutions Architect - Associate合格記


AWS 認定 ソリューションアーキテクト-アソシエイトに合格したので、その記録を書いてきたいと思います。

# 勉強開始時のスキルセット
- エンジニア歴1年
- 普段はバックエンドやフロントエンドがメイン
- インフラ周りの知識はほぼ０の状態
- EC2、S3は聞いたことはあるくらい


# 動機
- インフラ周りの知識が乏しかったので、勉強するために目標が欲しかった
- AWSの基本知識は現段階でエンジニアとして必須だと思った

資格をとるのが目的ではなく、あくまでインフラ周り・AWSの知識を習得するのを目標として資格の勉強を始めました。


# やったこと
２０２０年７月中旬から１ヶ月間を勉強期間に充てました。
知識習得が目的とはいえ、期間が長くなるとモチベーションが保てなくなる可能性があるので、受験する日程を決めて短期集中して勉強することにしました。

使用した教材は以下です。
① [これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）](https://www.udemy.com/course/aws-associate/)
②[【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)
③ [AWS サービス別資料(AWS Black Belt)](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)

## 勉強開始〜２週目
ひたすら①の動画教材を使って、AWSサービスをハンズオンしていました。
平日は最低２時間、休日は８時間くらいの使いました。

実際に触ったサービスは、
IAM / AWS Organizations / EC2 / VPC / S3 / S3 Gracier / ELB / RDS / Route53 / DynamoDB / Aurora / EFS / Kinesis / Redshift / ElastiCache / CloudFront / SNS / SQS / SES / Lambda / API Gateway / CloudFormation / KMS / ACM / CloudWatch
でした。

扱うサービスがとても多いので、実際に触りながら学ぶことで知識が定着しやすかったと思います。

## ３週目〜４週目
- ①の教材に付属している模擬試験（２回分）
- ②の模擬試験の教材（６回分）

以上を使って、ひたすら問題演習を繰り返しました。
それぞれ２周ずつ反復しました。
各模擬試験の正答率は以下の結果でした。

```
【①の模擬試験１】　１回目：６４％　２回目：９０％
【①の模擬試験２】　１回目：５３％　２回目：86％
【②の模擬試験１】　１回目：78％　２回目：９０％
【②の模擬試験２】　１回目：55％　２回目：９5％
【②の模擬試験３】　１回目：55％　２回目：９０％
【②の模擬試験４】　１回目：58％　２回目：９2％
【②の模擬試験５】　１回目：６1％　２回目：89％
【②の模擬試験６】　１回目：６7％　２回目：なし
```

１回目解いた後は、正解不正解に関わらず全ての問題の解説を読んで、自分の考え方が正しいか確認するようにしていました。
また、後から復習ができるようにマークダウン形式で軽くまとめてながら解説を読んでいました。
ハンズオンしていないAWSサービスに関する問題もあったので、解説だけでは良くわからないところは、③「Black Belt」を読んだり、記事を見つけて補足していました。
その成果もあり、２回目解いた時はスラスラ解けるようになったと思います。


# 試験当日

西新宿のテストセンターで受験しました。
人が少なく空いていたので、最初の手続きもすぐに済みました。

本番の問題は、教材の模擬試験で解いた問題よりは難しく感じました。
教材の模擬試験に慣れてしまっていたせいもあると思いますが、迷わず解答できた問題は少なかったです。
各問題ごとに見直し用のフラグをつけることができたのでフラグを付けながら進めましたが、一通り解いた段階では全体的に自信がなかったので全ての問題を見直していきました。
時間的には余裕があるので、じっくり問題や選択肢を読むことをおすすめします。


# 結果発表

公式のアナウンスでは、5日以内に結果発表されるということでしたが、その日のうちに結果が出ました。
下の画像がスコアレポートです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308386/03f7a0fe-80ef-6f70-df2a-0c8e0d4f7676.png)

最低スコアに７２０対して、獲得スコアが７７８だったのでちょっとギリギリでした。

合格したので、以下の特典を獲得しました。
- AWS限定商品を購入できる
- 無料で模擬試験を受験できる
- AWS資格試験を半額で受験できる
- AWS認定サブジェクトマターエキスパート（SME）プログラムに参加できる

試験代は結構お高いので半額になるのは嬉しいですね。
せっかくなので、AWS Certified Solutions Architect-Professional を目指したいと思います。

## 受験してみて

今回受験した目的は、「インフラ周りの知識習得」と「AWSの基本知識の習得」だったので達成できたかなと思います。
今後は、今回得た知識を使って実際にアーキテクチャ構成を考えて構築してみて、業務や個人サービス作りに運用してみたいなと思います。

これから受験する方にアドバイスするなら、実際にサービスを触りながら勉強したほうが記憶に残りやすいと思います。
特に私のようなインフラ周りの知識０からだと、解説を聞いているだけではイメージしにくいだろうなと思います。

最後まで読んでいただきありがとうございました。
VBAで例外処理 try-catch-finally を使う方法

# やりたい事
VBAで例外処理のtry-catch-finally構文みたいな事をやりたい。

# サンプルコード
try-catch-finally構文のサンプルコードです

```VB
Sub test()
'エラーが起きたときはErrorHandler:へ飛ぶ
On Error GoTo ErrorHandler
	
	'何かの処理
	XXXXX
	XXXXX
	XXXXX
	XXXXX
	
	'Finally:へ飛ぶ
	GoTo Finally
	
'例外処理
ErrorHandler:
	
	'エラーメッセージを表示する
	Msgbox "[No:" & Err.Number & "]" & Err.Description, VbCritical & VbOkOnly, "エラー"
	
	'Finally:へ飛ぶ
	Resume Finally
	
'最終処理
Finally:
	
	'必ず通る処理
	XXXXX
	XXXXX
	
	'変数の開放をするetc..
	If Not XXXXX Is Nothing Then
		Set XXXXX = Nothing
	End If
	
End Sub
```

# 解説
VBAにはtry-catch-finally構文がありません。
なので、「行ラベル」と「On Error ステートメント」を用いてtry-catch-finally構文のようなことをします。

## 行ラベルとは
[Office VBA リファレンス - 行ラベル](https://docs.microsoft.com/ja-jp/office/vba/language/glossary/vbe-glossary#line-label)

1コード行を示すために使用される。

```VB
'指定した行ラベルまでジャンプすることができる。
GoTo 行ラベル名
```

```VB
'ラベルは、文字で開始してコロン (:) で終了する必要がある。
行ラベル名:
```

```VB
'行ラベルを使用したサンプルコード
Sub test()

	MsgBox ("hoge1")

	GoTo Label	'Label:に飛ぶ

	MsgBox ("hoge2")	'実行されない

'ここに飛ぶ
Label:

	MsgBox ("hoge1")

End Sub
```

## On Error ステートメントとは
[Office VBA リファレンス - On Error ステートメント](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/on-error-statement)

エラーが起きたときに、エラーを無視したり、別の処理に分岐したりできる。

```VB
'エラーが無視される
On Error Resume Next
```

```VB
'エラーが起きたときに、指定した行ラベルまでジャンプすることができる。
On Error GoTo 行ラベル名
```

```VB
'On Error ステートメントを使用したサンプルコード
Sub test()
'エラーが起きたときはErrorHandler:へ飛ぶ
On Error GoTo ErrorHandler

	MsgBox ("hoge1")

	MsgBox ("hoge2")
	
	'何もエラーが起きなければここで処理を終了する
	Exit Sub
	
'もしエラーが起きたらここにとぶ
ErrorHandler:

	MsgBox ("hoge1")

End Sub
```

## おまけ finallyで変数を解放する
VBAでExcelオブジェクトを操作するようなコードを書いていると、気づいたらプロセスにExcelが大量に溜まってしまうことがあると思います。
![0001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/f8fd5316-7946-2d5a-2a75-b9e160732724.jpeg)


プロセスが溜まっていくのは、プログラムの実行中にエラーなどで処理が止まってしまい、プロセスが正しく終了されないまま放置されるのが原因です。
なので、エラーが起きたときにもプロセスを解放してあげる必要があります。

try-catch-finally構文を使用すれば、例外が起きようと起きまいとfinallyは必ず通るので、この中で変数の解放をしてあげるとよいと思います。
【rails】form_withの使い方

form_withとは、railsで情報を送信するためのヘルパーメソッド。
これを使うことによって、簡単に入力フォームに必要なHTMLを作成することができる。

form_withは情報をデーターベースに保存する場合と、保存しない場合で少し形が異なる

データベースに情報を保存しない場合

```
<%= form_with url: "パス" do |form| %>
フォーム内容
<% end %>
```

データベースに保存するときは

```
<%= form_with model: モデルクラスのインスタンス do |form| %>
フォーム内容
<% end %>
```
【Android】uses-featureってなに

## 背景
- [CameraX](https://developer.android.com/training/camerax?hl=ja)の[codelabs](https://codelabs.developers.google.com/codelabs/camerax-getting-started/#0)で、AndroidManifestにuses-featureを記述していたのですが、何者ってなったので調べました。
  - 公式を見てもらえたら…笑 [公式のリンク] (https://developer.android.com/guide/topics/manifest/uses-feature-element?hl=ja#features-reference)

## なにをするものか

> Google Play は、アプリのマニフェストで宣言された <uses-feature> 要素を使用して、ハードウェアおよびソフトウェアの機能要件を満たさない端末からアプリをフィルタします。

- 要は、ここで宣言しておくと要件を満たしていない端末ではGoogle Playに表示されなくなる? 


## 例
- 以下では、カメラを宣言しています。これでは、背面カメラがついていない端末をはじけます。

``` AndroidManifest.xml
<uses-feature android:name="android.hardware.camera" />
```
CustomHandで物をつかんだ時の処理の方法③（複数処理をしたい！）

#１．はじめに
　この記事は前記事CustomHandで物をつかんだ時の処理の方法１，２を読んでいることを前提としています。

　前回は物を掴んだ時に効果音を鳴らすようにしましたね。

　今回はシーン内で以前のスクリプトを使いまわすときの注意点を書いていきたいと思います。

#２．物をつかんでgameObjectを非表示にしたけど二つ目のgameObjectが消えてくれない（泣）
　わかりにくいと思うので例を用いて説明します。

　シーン内に掴んで消したいgameObjectが二つあったとします。一つ目のgameObject1を掴んだ時はスクリプト通り非表示になるのに、続けてgameObjectを掴んでもスクリプト通りにならない。といった状況です。（私がはまりました）

##なぜ？
　考えられることとしてはgameObjectを非表示にしているだけなので、まだgameObjectがシーンに残っていると評価されて、次のオブジェクトを掴んでも反応しないかもしれない点でしょうか。

　複数のオブジェクトを消したいのであればSetActiveを使うのはあまりよくないのかもしれませんね。（SetActiveを覚えたばっかで使いまくりたかっただけです笑

###改善

　SetActiveをどうしても使わないといけない（例activeSelfで非表示か否かで分岐させる方法）以外はDestroyを使うといいかもしれません。

```C#
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using UnityEngine;


public class custom : OVRGrabbable
{
    public AudioClip sound001;

    //掴まれた時に実行
    public override void GrabBegin(OVRGrabber hand, Collider grabPoint)
    {

        base.GrabBegin(hand, grabPoint);//この行は消しちゃだめ

        //ここにやりたいことを書きましょう
        AudioSource.PlayClipAtPoint(sound001, transform.position);
        Destroy(gameObject);

    }
}
```
　こんな感じにしてもらえば、たとえ消したいオブジェクトが100個あろうが全部消えてくれると思います。
　効果音をそれぞれ変えたいのならsound001のほかにsound002,sound003のように追加していってくださいね！

#最後に
　まだまだc#素人ですので知らない機能がたくさんあります。成長していきたいですね。
pythonでグラフを作ってみよう！！

#この記事の対象読者
今日はpythonで初めてのグラフ作りに挑戦します。pythonでどのようにグラグを作るのか気になった人は暇つぶしがてら見にいていって下さい。参考までに説明しますが今回の開発環境はgoogle diveのサービスを拡張した**Colaboratory**を使いますが、他の環境でも使えるはずです。もし今回の環境でやりたい人は[こちら](https://qiita.com/lot-uni/items/294cc6642e4605017469)を参考にして下さい。下準備は基本的に飛ばしてもらっていいんですが、もしグラフが表示できなかったら下準備を見直して見て下さい。

#下準備
始める前に大まかにどうな流れでグラフを作るのか説明しておきます。まずpython
の外部ライブラリーの**matplotlib**というグラフ作成などに役立つライブラリーをインストールして、x軸とy軸の点のデータをリスト型で格納して、最後に外部ライブラリーのplotと言う機能に先ほどのデータを代入してグラフが生成されると言う流れです。今回の環境では必要あませんが、ライブラリーのインストールをターミナルでして見ましょう。次のコマンドを実行してくだいさい。

```pip
pip install matplotlib
```
これでライブラリーのインストールが完成です。上手く行かない場合はこちらのコマンドを入力して見て下さい。これで下準備は完了です。

#実際に作画して見よう。
始めにコードを出すので試して見て下さい。その後一行ずつ解説して行きます。

```python
# 外部ライブラリーを使う事を定義する
import matplotlib.pyplot as plt

# リストに0~9の数をリストで順番する。
x = list(range(10))
y = list(range(10))

# xとyを元にグラフを作成する。
plt.plot(x, y);
```
コードはこんな感じで実際に実行するとこんな感じのグラフが手に入ります。
![スクリーンショット 2020-08-25 22.42.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/390cd797-dc55-4b8e-e28c-4b48a18a30df.png)
しっかりグラフが作成できました！早速コードを解説して行きます。
一行目は**import**を使ってライブラリーを読み込みます。最後の**as**はライブラリーをpltと言う名前で呼び出すからよろしくといった感じです。

２〜３行目はxとyにリスト型で０〜9連続した数を格納してます。rangeのカッコ内の数で、連続する数を生み出して、listで一つずく格納していっています。

４行目はさっき定義した**plt**にxとyを読み込ませてグラフを作成させています。
これで説明は終わりです。

#終わりに
最後まで記事を見てくれてありがとうございました。初心者なので間違っている所があったらコメントで教えてくれたら嬉しいです。


今回参考にさせてもらった素晴らし記事：https://techacademy.jp/magazine/17472
The lifecycle method [methodName] must not throw a checked exception.となったときの対応方法

- 環境
    - Windows10 64bit バージョン1909
    - openjdk 11 2018-09-25
    - Eclipse IDE for Enterprise Java Developers Version: 2020-03 (4.15.0)
    - JSF 2.3.9

# 事象 : Payaraを起動したらエラーメッセージが表示された

```bash:ダイアログのエラー
cannot Deploy app-name
deploy is failing=Error occurred during deployment:
 Exception while deploying the app [app-name] :
 The lifecycle method [methodName] must not throw a checked exception. Related annotation information:
 annotation [@javax.annotation.PostConstruct()] on annotated element [private void jp.co.ponsuke.controller.HogePreviewController.methodName() throws jp.co.ponsuke.core.dto.HogeCd$HogeException] of type [METHOD].
 Please see server.log for more details.
```

## 原因 : @PostConstructをつけたメソッドで例外をthrowしているから
> PostConstruct注釈の適用先のメソッドは、次の基準をすべて満たす必要があります。
> (省略)
> このメソッドが非チェック例外をスローする場合は、EJBで例外の処理および例外からの回復が可能である場合を除いて、このクラスを使用してはいけません。
> [PostConstruct (Java Platform SE 8)](https://docs.oracle.com/javase/jp/8/docs/api/javax/annotation/PostConstruct.html)


```java:HogePreviewController.java
    /**
     * 初期化処理.
     * @throws HogeException 例外.
     */
    @PostConstruct
    private void methodName() throws HogeException {
        // 例外が発生する処理...
        // その他の処理...
    }
```

### 対応 : 処理をf:viewActionのメソッドに移動する

```java:HogePreviewController.java
    /** 初期化処理. */
    @PostConstruct
    private void methodName() {
        // その他の処理...
    }

    /**
     * 画面表示処理.
     * @throws HogeException 例外.
     */
    public void viewAction() throws HogeException {
        // 例外が発生する処理...
    }
```

```xml:hogePreview,xhtml
<h:head>
  <f:metadata>
    <f:viewAction action="#{hogePreviewController.viewAction()}" />
  </f:metadata>
</h:head>
```
【初心者でもわかる】疑似要素が表示されない時に確認する7つの事 ＆ 確認方法

# どうも7noteです。疑似要素が効かない時の確認事項（永久保存版）

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/giji_check/
DockerでPostgresの環境構築少し苦戦したのでメモ 

下記を参考にDockerでDjangoの環境構築するかーと思ったところ少し詰まったのでメモ程度に残します。
https://docs.docker.jp/compose/django.html

docker-compose up -d でコンテナ立ち上げ用としたところDBのコンテナだけうまく立ち上がらず...

```
toruchan:~/work/py-work$ docker-compose up -d
Starting pywork_db_1 ...
Starting pywork_db_1 ... done
Creating pywork_web_1 ...
Creating pywork_web_1 ... done
```

```
toruchan:~/work/py-work$ docker-compose ps
    Name                  Command               State            Ports
-------------------------------------------------------------------------------
pywork_db_1    docker-entrypoint.sh postgres    Exit 1
pywork_web_1   python3 manage.py runserve ...   Up       0.0.0.0:8000->8000/tcp
```

```
toruchan:~/work/py-work$ docker-compose logs
Attaching to pywork_web_1, pywork_db_1
db_1   | Error: Database is uninitialized and superuser password is not specified.
db_1   |        You must specify POSTGRES_PASSWORD to a non-empty value for the
db_1   |        superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
db_1   |
db_1   |        You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
db_1   |        connections without a password. This is *not* recommended.
db_1   |
db_1   |        See PostgreSQL documentation about "trust":
db_1   |        https://www.postgresql.org/docs/current/auth-trust.html
db_1   | Error: Database is uninitialized and superuser password is not specified.
db_1   |        You must specify POSTGRES_PASSWORD to a non-empty value for the
db_1   |        superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
db_1   |
db_1   |        You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
db_1   |        connections without a password. This is *not* recommended.
db_1   |
db_1   |        See PostgreSQL documentation about "trust":
db_1   |        https://www.postgresql.org/docs/current/auth-trust.html
```

どうやらパスワードの設定がされていないとエラーになるらしい...？

そこで思いついたのは下記2つ
1. パスワード設定を無効化
2. パスワードを設定

とりあえずローカル環境で立ち上げたいだけだし1のパスワード無効化を選択

1の場合の対応方法としてdocker-compose.ymlファイルに`POSTGRES_HOST_AUTH_METHOD: 'trust'`の一行を追記
全体としてはこんな感じに

```
version: '3'

services:
  db:
    image: postgres
    environment:
      POSTGRES_HOST_AUTH_METHOD: 'trust'
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
```

これでコンテナ立ち上げ直したらいけた
後ほどパスワードはちゃんと設定しようと思う...
Linux  環境構築について(CentOS)

Cenosのダウンロード方法を記載します。

①https://www.centos.org/ を開いて、CentOS　Linux　をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/0c1fb5a1-99c0-2cd6-9c15-714dfb9a65fd.png)

②ISOのX86_64をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/ce747409-9d11-5477-31de-adba01bb2559.png)

③何でもいいので、パスをクリック。(一番上とかでいいです)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/2afae1d4-8481-a895-fe11-deb2fae80c1d.png)

④拡張子がisoのファイルをダウンロードしましょう。結構時間がかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/9bacbbde-d66e-26cb-93b3-0ab559dc07a9.png)

⑤ダウンロード完了後、CentOSを立ち上げていきましょう。
 Virtual Boxを開いて、新規(N)をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/66dfc183-7be8-5ed4-3a03-157c7dcba30c.png)

⑥タイプとバージョンを画像の通り、設定してください。
 名前は何でもいいです。マシンフォルダは適当にユーザー配下のフォルダを指定していいかと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/617549ff-6353-fd9d-1c9a-01de9a762ce6.png)

⑦メモリもデフォルトで、次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/71f98973-7cc2-72f0-ba03-fc472bb32ed2.png)

⑧仮想ハードディスクを作成するを選択し、「作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/92e45668-bb87-9b03-1583-3d0f4e9576ba.png)

⑨ファイルタイプはVDIで次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/4a3ccf88-0689-0573-4d27-20a95bb425c0.png)

⑩可変サイズを選択し、次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/6f25bd30-a150-e12e-95b8-6adda10cf05a.png)

⑪フォルダ設定を行い、作成へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/a46ad412-9d70-9797-7930-4f0ea1498d63.png)

⑫アダプターの設定を行います。
 設定/ネットワーク/アダプター２を開き、画像のような設定を行ってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/a02a0f21-75fe-773c-ba73-9c4dd8cc6f92.png)

⑬isoのセットを行います。
 設定/ストレージ/IDEコントローラーにダウンロードしたISOファイルを追加しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/269e8cfd-2473-c5b0-4e38-e8b4c73e14c5.png)

⑭CentOSを立ち上げましょう。
 立ち上げたら、黒い画面が出てきて設定が行われていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697209/eb85a8e6-bcc0-1f34-2e5f-ed8c89267974.png)


後は諸々の設定です。そこら辺は直接お会いした時に色々やりましょう。
※ユーザ概念があるので、いい勉強の機会となります。
Open棟梁_テンプレートベースのサンプルを実行（Webページ表示編）

<h1>はじめに</h1>　この記事の目的は、Open棟梁を導入したC#用のプロジェクトテンプレートを動かし、Webページを表示させることです。

<h1>Open棟梁とは</h1>

　日立ソリューションズからオープンソースとしてリリースされた、.NET用のアプリケーションフレームワークです。C#とVB向けに作られています。
　くわしくは以下のサイト様をご覧ください。

< https://opentouryo.osscons.jp/index.php?FrontPage >

<h2>環境</h2>
OS:windows10
IDE:Visual Studio2019
言語:C#

<h2>手順</h2>
1.githubからプロジェクトテンプレートをダウンロード。
< https://github.com/OpenTouryoProject/OpenTouryoTemplates >

2.ダウンロードしたzipフォルダを解凍。プロジェクトテンプレートは以下の三種類。使用するVisual Studioによって使うフォルダが違います。

 フォルダ名|対象
 ---|---
 root_VS2015|Visual Studio2015用
 root_VS2017|Visual Studio2017用
 root_VS2019|Visual Studio2019用

3.フォルダ（筆者の場合はroot_VS2019）を選択し、Cドライブ直下にコピー。
コピーしたフォルダの名前を「root」に変更。

4."C:\root\programs\CS"にあるバッチファイルを使って、ビルドを行います。機能によって使用するバッチファイルが違います。詳しくは以下のサイト様をご覧ください。
< http://www.osscons.jp/jo1tfc2ll-537/#_537 >
★とりあえず動けばOKの人は、「0_ExecAllBat」を実行すればOKです。全機能ビルドしてくれます。


5."C:\root\programs\CS\Frameworks\Infrastructure"を
"C:\root\programs\CS\Samples\WebApp_sample\WebForms_Sample\WebForms_Sample"配下に移動
※Build_net48がない人は、以下をビルドすると生成されます。仕様なのかわかりませんが、筆者もバッチファイルではビルドされませんでした。
"C:\root\programs\CS\Frameworks\Infrastructure\Business\Business_net48.csproj"

6.管理者権限でコマンドプロンプトを開き、ASP.NETを起動する
![ASPコマンド.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697198/372ce5f5-4354-7d7b-9bed-37d671e8db9c.jpeg)


7.Visual Studioで以下を開く
"C:\root\programs\CS\Samples\WebApp_sample\WebForms_Sample\WebForms_Sample.sln"

8.以下の画像のように、追加したフォルダのみプロジェクトに含ませる。（ソリューションエクスプローラーでフォルダを選択後右クリックし、「プロジェクトに含める」を選択）
![画像1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697198/503288ff-e37e-5a77-5771-efbf88f481c0.jpeg)
9.実行すると、Edgeが立ち上がる。適当に入力しログイン（テンプレでは特にチェックは実装されていないようです。）

　※CustomControlがどうのこうのエラーでている人は、以下をビルドしてdllファイルを生成し、プロジェクトに追加しましょう。仕様なのかわかりませんが、筆者もバッチファイルではビルドされませんでした。（二回目）
"C:\root\programs\CS\Frameworks\Infrastructure\CustomControl\CustomControl_net48.csproj"
![ログイン画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697198/27c0d716-6e28-043f-1556-6555d22a3248.jpeg)

<h1>感想</h1>
　ログインページが表示できるまで一週間くらいかかりました。
他サイト通りに手順を踏もうにも、バージョンの違いか書いてある内容と差異がありなかなかうまくすすみませんでした。フレームワークに限らず、環境構築等の作業は回数を重ねれば得意になれるんでしょうかね。
　今回の手順ではDBをセットアップしていないので、ログイン後の操作でエラーをはいて止まります。
次の機会に、DBとの連携についての記事を書けたらと思います。

<h1>参考文献</h1>
+ https://www.osscons.jp/joq6z3xoj-537/?block_id=537&active_action=journal_view_main_detail&post_id=709&comment_flag=1
+ https://www.osscons.jp/jo0fvy2af-537/#_537
+ https://www.osscons.jp/jo1tfc2ll-537/#_537
+ https://opentouryo.osscons.jp/index.php?FrontPage
Windows 10でemacs風キーバーインド。AutoHotKeyの設定をちょい足し編。

元々はKeyhacを数年使っていたのだけれど、勝手にキーが入力されて永遠に止まらない不具合で
マシンが頻繁にハングするようになってしまったので、重い腰を上げてAutoHotKeyへの引っ越しをすることにしました。

xkeymacs → keyhac → autokeyhacの順に引っ越しているので、これでWindowsのキーバインドの設定は3種類目。
久々の変更です。

以下の記事を参考にEmacsキーバインドをセットアップ。

Windows 10でも「Emacs風キーバインド」を使おう【AutoHotKey】
https://linuxfan.info/windows-emacs-keybindings

を参考にインストール。

こちらから設定ファイルをダウンロードしました。
https://github.com/usi3/emacs.ahk

ほぼ設定ファイルは網羅されていたのですが、個人的に若干足りない設定があったので追加。

* IMEの切り替えをCtrl+Oで
* 画面の一番上までカーソル移動を　Alt+Shift+<　　
* 画面の一番下までカーソル移動を　Alt+Shift+>

下の２つのカーソルの移動のキーバインドがemacs風なのか個人でemacsに追記したのか自信がないけども、
とても不便に使っていたので、追記することに。

```
; IMEをon/offで切り替え
ime_switch()
{ 
  global
  If is_pre_spc 
     Send +{vkF3sc029}
  Else
     Send {vkF3sc029}
  Return
}

;　画面の一番上までカーソルを移動
pageup_top()
{
  global
  If is_pre_spc
     Send +^{Home}
  Else
     Send ^{Home}
  Return 
}

; 画面の一番下までカーソルを移動
pagedown_bottom()
{
  global
  If is_pre_spc
     Send +^{End}
  Else
     Send ^{End}
  Return 
}

; Ctrl+OでIMEをON/OFF　
^o::
  If is_target()
    Send %A_ThisHotkey%
  Else
    ime_switch()
  Return

;Alt+Shift+<でカーソルを一番上に移動
!+<::
  If is_target()
    Send %A_ThisHotkey%
  Else
    pageup_top()
  Return 

;Alt+Shift+>でカーソルを一番下に移動
!+>::
  If is_target()
    Send %A_ThisHotkey%
  Else
    pagedown_bottom()
  Return 
```

IMEのON/OFFはCtrl+O派の方に参考になれば。
初めてのGit Github Sourcetree

#はじめに
この記事では、Sourcetreeを用いてRemote環境にPush(アップロード)するまでを解説したいと思います。
Sourcetree意外にもGitを用いてもできますが、私は、Sourcetreeがおすすめです！


#Sourcetreeとは？
簡単の解釈で言うと、**プログラムのソースコードを管理するGitを簡単に取り扱うためのツール**
がSourcetreeである。
(https://tracpath.com/bootcamp/learning_git_sourcetree.html)

まず、Gitはまず、コマンド画面で作業することになります。黒い画面で指示や命令文を記述していきますが、この作業に抵抗がある方は、少なくありません。😓

ですが、Sourcetreeは,GUI  (Graphical User Interface　グラフィカル・ユーザ・インターフェース）を用いて作業していくことになるのでGitよりは、抵抗なく進めることができると思います。😄

GUIについてはこちら→https://wa3.i-3-i.info/word1371.html

# Sourcetreeをインストール
まずは、Sourcetreeをインストールしましょう！
こちらは、ATLASSIAN社から開発されたサービスです！無料で使えますのでインストールしてみてください

URLはこちらから→https://www.atlassian.com/ja/software/sourcetree

インストールが完了すると、ATRASSIANのアカウント作成を求められます。しかし、アカウント作成しなくてもGoogleアカウントをお持ちであれは、Sourcetreeにログインできますので是非！



#Githubのリポジトリーをクローン

次に、Githubの画面に移行します。

まずは、Githubのアカウントをお持ちでない方は、
                ↓(詳しく説明しているので是非！)
https://qiita.com/okumurakengo/items/848f7177765cf25fcde0

Githubにログインしたら









![スクリーンショット 2020-08-25 18.57.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669384/5f7809cb-5c37-4b00-8b14-00dfe81b5b60.png)

NewRepositryを作成してください


![スクリーンショット 2020-08-25 19.25.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669384/57701a33-fc65-f4d2-13db-7e0fe61d5f54.png)

画像に沿って記述し、create repositryをTAP










![github_new_repo3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669384/f0b06819-5e93-b438-0838-fdf4b7ea9470.png)




画像に沿ってUrlを保存。リモートUrlはHttpsを選択しましょう！
SSHは認証の際にSSHキーを作成するので少々厄介。。。

SSHにしたい場合は、https://qiita.com/shizuma/items/2b2f873a0034839e47ce
SSHキーはコマンドでの作業になりますのでお許しを🙇‍♂️

これで、githubの作業は以上です！

sourcetreeの画面で



![スクリーンショット 2020-08-25 21.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669384/f2667589-9f12-b63f-8819-0c6cd916ff5d.png)

UrlからクローンをTAP

![スクリーンショット 2020-08-25 21.33.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669384/02503614-a28b-aafa-cc95-8fba5fa9ec41.png)

ソースUrlにGithubで入手したHttpsのUrlをペースト　ファイルの保存先と　名前を記述し、クローン

sourcetree上に設定したリポジトリーがローカル上にクローンされました！
ローカルは、自分の使用しているPC環境のことです。まだリモートには上がっていないので次は
リモートにクローンしたデータをPushしていきましょう

#RemoteRepositryにPush

では、Pushしていきましょう！！
その前に**ステージング**と**コミット**していきましょう！


ステージング　コミットの準備段階!


![スクリーンショット 2020-08-25 21.50.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669384/ce4e2289-de63-0224-1023-e6278478a281.png)



ステージングすることによりコミットできるようになる。

![スクリーンショット 2020-08-25 21.59.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669384/8f86278c-7e94-ac1d-0acb-c1bc7368a3a9.png)


コミットメッセージを入力(変更した箇所を文章にする)





![スクリーンショット 2020-08-25 22.09.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669384/31f52d68-917f-d034-263a-c246494a98e2.png)


コミットした状態の画面を参照するとプッシュボタンに①のマークがあるのがわかる
ではプッシュしてみよう

![スクリーンショット 2020-08-25 22.14.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669384/0eb02c81-4e20-7450-96ce-8c0e52b3f52a.png)

ブランチを全て選択(基本、ローカルとリモートのブランチは統一すること)
し、Pushしてみよう!
エクセルの行の高さ最適化するマクロ

* 行の境界線ダブルクリックするやつを自動で
* 対象は全シート、全行
* 除外したいシートを指定できる

```vb:module1

Sub rowfix()
    '行の高さ最適化する
    Dim Ws As Worksheet
    Dim x As Long
    
    For Each Ws In Worksheets
        '除外したいシート（demo1シート）はスキップ
        If Ws.Name = "demo1" Then
            GoTo CONTINUE
        End If
        'Ws.Rows.AutoFit '全行の高さ最適化する
        
        x = Ws.Rows.Count 'A2以下だけ最適化する
        Ws.Range("A2", "a" & x).EntireRow.AutoFit
        
                
CONTINUE: 'シートをスキップしたら飛んでくるラベル
    Next Ws
    MsgBox "終了"
End Sub

```
```
        'できない
        'Ws.Range("A2", Cells(Rows.Count, 1)).EntireRow.AutoFit
        'Ws.Range(Cells(2, 1), Cells(3, 1)).EntireRow.AutoFit
```