OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeの拡張機能Live Shareをつかって「しりとり」できるようになるまで

# 目標
しりとりできる = しりとり用ファイルを共同編集できる状態
とする。
(つまり、本記事はLive Shareの環境構築と使用方法を伝える記事)

# 環境
Live Share v1.0.3046 (October 13th, 2020)

# 環境構築

VSCodeで以下の拡張機能をインストール
![スクリーンショット 2020-10-22 16.53.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/6ae8d853-bc7c-f81b-5aff-c538fe8b6a32.png)

インストールしたらVSCodeを再起動する必要あり。

共有したいプロジェクトを開く。

![スクリーンショット 2020-10-22 21.44.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/50cd516a-b16e-6817-6899-d5fea754795f.png)

すると、左下にLive Shareと表示されるのでこれを押す。
![スクリーンショット_2020-10-22_17_38_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/8103ea58-cbb2-79ac-db52-7becf9e0f169.png)

GithubかMicrosoftアカウントでSigninしてねと出るのでする。
![スクリーンショット 2020-10-22 17.39.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/9d6c44f5-3221-3395-6667-380f7db832d9.png)

すると、Live Shareの左にアカウントの名前が表示されるようになる。
![スクリーンショット 2020-10-22 17.56.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/5083c081-f5e8-e462-5ac1-bb1b4e2a3960.png)

ここまでを共有する側、される側両方でやっておく。

# 共有

手順は簡単。

1. 共有する側: 共有開始&リンクコピー(勝手にされる)
2. 共有する側: リンクをslackなりで共有先に伝える
3. 共有される側: もらったリンクで「JOIN」する

## 共有する側のやること
Live Share押す
![スクリーンショット_2020-10-22_17_56_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/e8836a18-a252-8db4-9c4b-6822c2bf9c8e.png)

すると、共有が開始されて右下に以下のように表示される

![スクリーンショット 2020-10-22 17.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/03ad3733-0977-7902-d078-c4c1526e9106.png)
共有用のリンクコピーしたよ！とのこと。

そのままslackにはりつけ
![スクリーンショット_2020-10-22_21_56_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/edc1b86d-f7f9-dee0-ea23-e51a37d698c0.png)

共有する側はこれで完了　あとは待機

## 共有される側のやること
VSCodeを開く。

Command + Shift + Pでコマンドパレットを開き、joinと打って検索。

`Live Share: コラボレーションセッションに参加する`を選択
![スクリーンショット 2020-10-22 22.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/36c3f3fd-cd70-cd09-3a69-04c72c8720ea.png)

すると、リンクを入力してねと言われるので、
![スクリーンショット 2020-10-22 22.02.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/12e98bca-6be7-6db2-341d-84724c04a223.png)
共有されたリンクをいれてEnterをおすと、参加することができる。

> 共有されたリンクをクリックしてブラウザからリダイレクトでもできるが、ポップアップが出てくるときと出ない時がある

# やめる時
停止ボタン押す
![スクリーンショット_2020-10-22_21_58_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/5b074032-602a-c5bb-33bd-e00a37378431.png)

# まとめ
![スクリーンショット 2020-10-22 22.06.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/07278ef8-5b09-92f6-ea4c-8e6da6c96bd1.png)

ルールとマナーを守って楽しくしりとりしよう!!

# 参考
[Visual Studio Live Shareで始める快適なエンジニア間コミュニケーション](https://qiita.com/mh4gf/items/8f072b2faabba90937d3)
【Java】オーバーライドとオーバーロードってなに

今一つアウトプットの勘所というのがわかりませんが、まぁ備忘録替わりです。
書き方云々で悩むよりはよいでしょうということであまり考えずにやっていきましょう。

IT系(?)新卒一年目、学生時代にコンピュータ系の経験なしという死海に投げ込まれたナメクジのようなもんです。
JavaSE11Silverとりたくて黒本やってるのですが、個人的躓きポイントとしてあるのがオーバーライドとオーバーロードというものです。紛らわしい。名前つけた人はそうとは思わなかったんでしょうか。思わなかったでしょうな。人の心がない。大体６文字あって４文字同じなのですから多数決で言えば同じでしょう。

＊以下の記述は精密性、正確性ともにかけているであろうざっくりメモです。信じてはなりません。

端的に
【オーバーライド】
・スーパークラスで定義されているメソッドをサブクラスでも使えるように再定義したもの。
ちなみに、スーパークラスは継承された側でサブクラスは継承した側のクラスです。
・オーバーライドされた側、した側について、戻り値、メソッド名、引数が同じが同じでなければならない。
・アクセス制限レベル(publicとかprivateとかabstractとかfinalとか)について、オーバーライドする側はオーバーライドされた側より緩いアクセス制限でなければならない
(スーバークラスのオーバーライドされる側がpublicで、サブクラスのオーバーライドする側がprivateとかはできない。)
・finalがついているメソッドをオーバーライドすることはできない。
・オーバーライドされるメソッドのアクセス修飾子がabstractであるとき、そのメソッドはオーバーライドされなければならない。
　されなかった場合、クラスそのものがabstractクラスになる。(ところでabstractクラスってどんなだっけ...)

【オーバーロード】
・同一クラス内で、同一のメソッド名で、引数の方、引数の数、並びが異なるメソッドを複数作ること。
・戻り値の方、アクセスレベル、引数名、throw節が異なるとオーバーロードできず、コンパイルエラーになる。

＊オーバーロードは継承されたクラスのメソッドを継承したクラスでも使えるようにするもの。
＊オーバーロードは、同一クラス内で、引数の型や数を変えたメソッドを作るもの。

みたいです。

ちなみに、それぞれ英訳すると
overrideは　…の上に乗る。
overloadは　過負荷にする。加重積載する。
という意味だそうで、

オーバーライドは親クラスの上に乗っかるイメージ、オーバーロードはクラスに同じメソッドを過積載するイメージにすると覚えやすかったりするんでしょうかね。

最後に、これ記事書いてるとき右側にプレビュー見えるんですけど可読性死ぬほど低いっすね。
【Microsoft Azure】Azure DevOpsの主な機能

# はじめに
現在、AZ-400(Designing and Implementing Microsoft DevOps Solutions)について勉強しております。
その中で学んだAzure DevOpsの機能についてアウトプットしていきたいと思います。
(ざっくりになります。)

# そもそもDevOpsとは？
「開発者と運用者が協力しあってユーザーに迅速かつ継続的にプロダクトやサービスの提供を行う」という概念です。

**「新サービスを展開したい」という開発側**と**「安定したサービス稼働を維持したい」という運用側**は対立しがちです。
(運用監視をやっていたので、よくわかります。)

この開発側と運用側の問題を解消し、ビジネスの価値をより確実かつ迅速にエンドユーザーに届ける取り組みが**「DevOps」**です。

# Azure DevOpsの主な機能

AzureDevOpsの主な機能は、こちらになります。

- **Azure Overview(プロジェクト概要等)**
- **Azure Boards(プロジェクト管理)**
- **Azure Repos(ソース管理)**
- **Azure Pipelines(CI・CD)**
- **Azure Test Plans(手動・探索テスト)**
- **Azure Artifacts(パッケージ管理)**


<br>
※下の画像は、Azure DevOpsの項目になります。

![スクリーンショット 2020-10-21 12.29.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/08ada413-002e-71c1-50ab-3b0fb3590f4f.png)


# 各機能についての説明

上記にて紹介した機能について掘り下げていきたいと思います。

## Azure Overview

**プロジェクトの概要やダッシュボードを表示する機能になります。**
他にWikiも作成することが可能です。

![スクリーンショット 2020-10-22 21.03.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/562a8b81-c6fb-851f-41a8-932d803240e0.png)


## Azure Boards

**Azure DevOps上のタスク・プロジェクト管理機能になります。**
アジャイル開発におけるタスクやバグなど、プロジェクト内のあらゆる作業をWebブラウザ上で一括管理するためのツールになります。

![スクリーンショット 2020-10-22 20.41.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/1dfe6522-4b37-b31e-9ddf-c4e63bdfd7ba.png)


## Azure Repos

**プライベートなリポジトリを無制限に使用することができるサービスになります。**
アクセスできるユーザーを一部に限定して、システムやソースコードを管理。
Azure Pipelinesも使用することで、Azure内で完結したCI/CD環境を構築することが可能。


![スクリーンショット 2020-10-22 21.34.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/ee00d303-9298-e3e3-6afc-35845f51922d.png)


## Azure Pipelines

**Azureが提供している、CI/CDを構築できるサービスになります。**
ビルドからテスト、デプロイまで自動化することができ、迅速にリリースを行うことができます。

※CI/CD(継続的インテグレーション/継続的デリバリー)
アプリケーション開発のステージに自動化を取り入れて、顧客にアプリケーションを提供する頻度を高める手法

![スクリーンショット 2020-10-22 21.34.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/7409ac4e-09c2-6681-565d-edfe3a701ff1.png)



## Azure Test Plans

**テストケースに基づいた手動テストや探索的テストをサポートするためのサービスになります。**
コードに問題がないか、システムの動作に問題がないかのテストを自動で行います。

![スクリーンショット 2020-10-22 21.34.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/9b415f43-5074-a2fc-6f1b-04b6a54fc33e.png)


## Azure Artifacts

**コード共有を行うサービス。**
NuGetやnpmなどのパッケージマネージャーののフィード(パッケージを配信するサーバー)を簡単に作成し、公開することができる。

![スクリーンショット 2020-10-22 21.34.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/80d23624-a428-da00-6bc3-db0afabe2706.png)

# 最後に

AZ-400について勉強を始めたばかりでわからないことが多いです。
そのため、DevOpsやSRE等の学習したことは、どんどんアウトプットしていきたいと思います。

# 参考リンク

[DevOps とは何ですか?](https://azure.microsoft.com/ja-jp/overview/what-is-devops/#overview)
[DevOpsとは何か？ そのツールと組織文化、アジャイルとの違い](https://www.buildinsider.net/enterprise/devops/01)
[Azure Reposの設定方法について](https://cloudsteady.jp/post/11041/)
[Azure DevOpsとは？サービスや料金について](https://www.acrovision.jp/service/azure/?p=546)
Vuforiaを使用したアプリを作る場合の注意点

ARCoreより対応端末の多いVuforiaのARマーカーを使った簡単なARアプリを開発しようと考えており、$504/年 のBasicライセンスで開発し、アプリをリリースしてから更新予定はなかったので、ライセンス更新は必要ないと思いましたが念の為Slackで質問したところ、営業担当から返信があり契約更新の問題以前に**Vuforiaのライセンスにはかなり危険な部分が多い**ことが分かったので注意喚起のために投稿します。

まず契約ですが、年商によって金額が大きく変わるようです。

***
■コンシューマーフェイシングスタンダード
年商10億～年商1,000億円
￥3,707,000/年

■コンシューマーフェイシングエンタープライズ
年商1,000億円以上
￥7,414,000/年
___

私が依頼されたクライアントは年商10億以下の会社からの案件だったので、$504/年のBasicライセンスで良いと思っていましたが、以下のような利用シーンではプロライセンスが必要と回答がありました。

###利用シーン

>
+ 社内従業員向けの業務用途としての利用されるアプリケーションへの使用
+ 企業やサービスまたは製品に対するプロモーション/マーケティングを目的としたアプリケーションへの使用
+ 自社サービスまたは開発ツールとしての外部向けサービスに対しての使用
+ 物理製品にプリインストールしたアプリケーションへの使用

https://developer.vuforia.com/legal/vuforia-developer-agreement

#####え？これに適用されないアプリってなんてあります？
#####逆にBasicライセンスだとどのような使用用途があるのか教えてほしい…。


![2020-10-22_21h30_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152372/594bca0f-08dd-220d-9e54-1a41d750e024.png)
![2020-10-22_21h31_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152372/2c1354a5-df96-4085-3b53-1fde94dbe71c.png)
https://www.ptc.com/en/products/vuforia/vuforia-engine/pricing


---
###結論
+ $504/年のBasicライセンスでできることは皆無。
（透かしを消すだけ？）

+ 売上が10億以下の会社でも高額なライセンス契約はほぼ必須。

+ リリース後アプリを更新しないとしてもそのアプリをユーザーが使い続けるのであればライセンス更新は必須。
しかしクラウドマーカーなどのネット接続が必要ないARアプリの場合、Vuforia側がライセンスの状態を把握する方法はないのでアプリストアから消してもアプリをダウンロードしたユーザーはアプリは使用し続けられる。

+ Apple Developerはリリース時に契約していれば、契約を更新しなくても、OSのアップデートで使用できなくなることがない限りアプリを使用し続けることは可能だが、Vuforiaの契約はそうではない。このあたりはVuforiaは管理できないのでかなり曖昧。

---

Vuforiaは開発者ライセンスは無料なのでお金を払うことなく開発でき、リリースのタイミングで$504/年 のライセンス購入すれば良いと思っていましたが、ほとんどの場合プロライセンスが必要でその金額がかなり高額だったので驚きました。

アップデートの頻度も高く、新機能がどんどん追加され、高度な3Dモデルトラッキングなどが魅了のVuforiaですが、簡単なARマーカーアプリやクラウドマーカーを使ったアプリでもほとんどの場合、高額なライセンス契約が必要そうなので、みなさんもご注意ください。

Basicライセンスで問題ないと思いVuforiaを使ったARアプリを開発して配布していたら***規約違反で高額な請求される***事案が発生しそうです。

このような高額ライセンスになったのはいつからなのか知りませんが、Vuforiaを使い名刺をARマーカーにしてARで自己紹介が出るようなアプリを作っている人がいましたけど、これもプロモーション用途だからBasicライセンスだと規約違反ですよね。

今はARKitやARCoreがあり、Vuforiaを使ってARアプリを作る人はあまり多くはないかもしれませんが、確かUnity 2017あたりではデフォルトでVuforiaが入っており、それで知名度が上がり色々ARアプリを作っていた人は多かったと思いますが、ライセンスの詳細を知っていた人ってどれだけいたんでしょうか。普通は$504/年 払ったら問題なく配布できると思いますよね。

---

#####追記：
上記のプロライセンスは委託された日本の代理店が管理していて、Basicライセンスは本国で管理されているようなので、情報が統一されていないとのことでした。
SETチームの立ち上げ

ここ数年で **「SETエンジニア」** の認知度も高くなり、**QAチーム**とは別に**SETチーム**の立ち上げが**ミッション**となってきました。

ちなみに **「SETエンジニア」** とは、**Software Engineer in Test**の略になります。

そこで重要となるのが、**QAチーム**とどう一緒に取り組んでいくのかだと思います。

下記が**一例**となります。


また、対象プロダクトが多い場合、SETエンジニアは**チームでいる方が**よりよく**パフォーマンス**を発揮できる（単独だと社内で何をするエンジニアなのかが見えにくく、動き方が難しい。）

**※1つのプロダクトしかない場合は、特に問題はないと思います。**

```ruby: 取り組み
1.プロダクト全体の機能や煩雑度、ユーザーの想定利用機能頻度を加味
2.自動化すべき機能が明確化、リリース頻度が高。また、リリース伴うリグレッションテストが多く工数の削減
3.QAチームのリソースとROI数値の改善
4.非機能オートメーション（例、非機能テストの自動実施（セキュリティテスト）など）
5.プロダクトの関わりをどうするかのフローを用意
```

次に**対象プロダクト**について考えます。
二つ以上あれば意味のあるものではないかと。

```ruby: 対象プロダクト
1.全てもしくは、70%は自動化できそうである
2.そもそもプロダクト自動化する意味がある
3.プロダクトに対し（社内）に品質という定義がきちんとある
4.リリース頻度が高い
5.現状のリグレッションテストコスト

```
**SETエンジニア**については [こちら](https://qiita.com/jun2014/items/80e24a8e994c4bed6437)に記載しております。

![スクリーンショット 2020-10-22 21.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55160/fd5f90f3-89f1-a9c8-d0f4-c61cec3ceb6a.png)


```ruby:まず初めに組織構築や、現状調査、人員確保から着手します。
「SETチームを構築する」ことで何を求めるのか。
報告例
1.定常的にレポート（アウトプットは定常的に）
2.SETチーム立ち上げ前と立ち上げ後の品質についてまとめ
3.自動化することによる工数やコストの削減を上層部にアピールする
4.エンジニアの品質に対する意識
```


また、どこの所属になるのかで多少は変わります。
システム開発部（開発チーム）の下なのか、SETチームになるのか、組織は大事です。

組織と言いましたが、プロダクトや会社規模にもよります。
CircleCI×fastlaneで証明書を更新したらExit status: 65エラーでこける。



## 経緯

今の現場では、developブランチにコミットされたタイミングでcircleCIが動き、Fastlaneが動き、deployGateにアップされるという仕組みになっているのですが、
証明書を更新したらなぜかfastlaneが`Exit status: 65`で落ちてしまいました。

CircleCIにssh接続してログを見たところどうやら codesignで`errsecinternalcomponent`エラーで落ちているようでした。

## やったこと

### circleCIに登録するp12ファイルに権限追加

キーチェーンアプリで対象の秘密鍵をダブルクリック→アクセス制御→常に許可するリストに /usr/bin/codesign と xcode を追加する。

参照：https://qiita.com/sekitaka_1214/items/61d68d603ee1c1b7adf1

### キーチェーンをunlockする

CircleCIにssh接続して↓のコマンドを叩く。
`security unlock-keychain login.keychain`

参照：https://stackoverflow.com/questions/24023639/xcode-command-usr-bin-codesign-failed-with-exit-code-1-errsecinternalcomponen

この2つでは解決しませんでした。。

## 解決

いろいろ考えた結果、どうやら新しい証明書は今までの証明書と中間証明書（Apple Worldwide Developer Relations Certification）が変わっており、CircleCIが新しい中間証明書を読み込めなかったのが問題でした。

### 対応内容

1.中間証明書（.cer）をダウンロードします。
2.中間証明書をbase64エンコードし、CircleCIに環境変数として設定します。
`base64 -i （中間証明書）| pbcopy`
（今回は、APPLE_RELATION_CERTとして設定しました。）
3.CircleCI上で中間証明書をデコードします。

```yml:.circleci/config.yml
- run: 
   name: Decode releation certificates
   command: base64 -D -o AppleWWDRCAG3.cer \<<< $APPLE_RELATION_CERT
```

4.Fastlaneで中間証明書をキーチェーンに登録します。

```yml:fastlane/Fastlane
import_certificate(
  keychain_name: ENV["MATCH_KEYCHAIN_NAME"],
  keychain_password: ENV["MATCH_KEYCHAIN_PASSWORD"],
  certificate_path: 'AppleWWDRCAG3.cer',
  certificate_password: ''
)
```

これでうまく行きました！

## まとめ

このバグに丸1日はまりました。。
CircleCIかfastlaneが新しい中間証明書を読み込む方法を知ってる方がいたらぜひ教えていただきたいです(>_<)

この対応すごくがんばったのでよかったらLGTMお願いしますᕦ(ò_óˇ)ᕤ
LinuxをUSBブートしてHDDを見ようとしたとき、Authentication Required と出てはねられたときの回避法

・原因の発生
　Windowsであるソフトをインストールしたとき、「Windowsサービスに登録」というメニューが出てました。
　そのPCはActiveDirectory下にあるので「権限のあるユーザーのパスワードを入力してください」と出てきました。ルートのパスワードを入れたにもかかわらず、失敗で認めてもらえませんでした。
　そこから、異常が出だします。再起動をかけて、いざパスワードを入力して入ろうとするや
<b>　「このワークステーションとプライマリドメインの信頼関係に失敗しました」</b>
　との表示。Windowsにログインすらできなくなってしまいました。

　「さて困ったな」

　とりあえず、必要なデータはLinux経由で救出することにしました。

・症状の様態
　ということで、USBに仕込んであったLinuxの出番。(OS: Tails 4.12)
　USBでTailsを起動させて、そこからWindowsのHDD(sda2)を覗こうとしたのですが、そのときに、Authentication Required　というメッセージが出て、そのWindowsのHDDが覗けない・・・！！

　30分ほど格闘して、無事データを救出できたので、その方法を書き残しておくことにします。

・解決方法
　1．USBを刺して、起動ボタンをポチ

　2. ブート画面でF2を押して（PCによってはF10だったりF11だったりします、起動ボタンを押して一瞬出てくる画面を確認のこと）Tailsの起動画面に。

　3. Tailsがオープンするときの「ようこそ画面」では、オプションでルートのパスワードを設定することができるので、適当にパスワードを設定。

　4. [Home]-[Persistent]以下に、以下の内容のテキストファイルを作って、 10-local.rules という名前で保存する。

```10-local.rules 
KERNEL=="sda2", ENV{UDISKS_IGNORE}="1"
KERNEL=="sdb2", ENV{UDISKS_IGNORE}="1"
KERNEL=="sdc1", ENV{UDISKS_IGNORE}="1"
```
 ( sda2 とか sdb2 という名前は、その人の状況によって異なると思いますので、開きたいHDD名を指定してやってください)
　Persistent以下に保存するのは、電源切って再起動しても残るようにするためです。（これは USB上の Tails OS で Persistent Volume を既に作成しているものとして話をしています）

　5. [System Tools]-[Terminal]を起動、``` sudo -i``` と打つと、パスワードが要求されるので、3.で設定したパスワードを打ち、ルート権限獲得！

　6. ターミナルで、4.で作成したテキストファイルをシステム領域(<b>/etc/udev/rules.d</b> 直下)に移行させます。
　``` mv /home/amnesia/Persistent/10-local.rules /etc/udev/rules.d```
　（```mv 移動させたいファイルのフルパス　移動させたい場所``` という構文です）

　7. Enterを押すと、10-local.rules　が、/home/amnesia/Persistent/　から/etc/udev/rules.d　に移っているはず。
　（ルート権限がないと、システム領域に読み書きすることができないから、わざわざこんなことをやっています）

　8.　10-local.rules がシステム領域に移った時点で、<b>Authentication Required</b> と出てはねられたHDDにアクセスすることができるようになっています。

　9.  別の外付けUSBを付けて、そこに保存したいHDDの中身を全部コピーして終了！

　めでたし、めでたし:relaxed:


-----------

・ポイント
　Linuxのシステム領域に「HDD全部読ませてくれ！」という命令を書き込むことで、強制的にアクセスを可能にする、という方法です。　　

　ActiveDirectoryが入っているとセキュリティ的なものが入ってくるのでしょうか？
　「USB Linuxがあるもんね～、さあ救出だ～」とウキウキしていたところに、Authentication Required と出てはねられたときの絶望感たるや:tired_face:

　そんなときでも、強引にHDDを覗いてデータ救出する際、非常に役に立つテクニックだと言えます。自信を持って言えます。

　これがないと、途方に暮れるところでした。

　もっとも、HDDが物理的にダメになっていたら、これでも無理ですが。
　しかし、今私が経験したような、あくまでもソフトウェア的なエラーでログインできないだけのときには、最後の救世主です。

　<b>ドメインの信頼関係は、月一度取ってあったバックアップをそのままHDDごとコピー</b>して、無事に回復。あとは救出した最新のデータだけ書き込んで、復旧終了。
　(OSごとのHDDのバックアップって、こういうときに真価を発揮します)


　こういう危機的なエラーは滅多に出ないのですが、出たときにものすごく困惑し、狼狽します。もうその時点でパソコンが使えなくなってしまいますから。

　私の仕事の中でも最重要テクニックの一つとなりました。

　備忘録的に、書き残しておくことにします。
C++で作成したDLLでAPIではなくクラスを提供する方法

# はじめに
2020年現在、Windowsのアプリ開発をC++でする人はほとんどいないと思いますが、
**C++で作成したクラスをdllで提供する方法**を調べる機会がありましたので、備忘録を兼ねて記事に残します。

# このエントリで身につくこと

- C++で作成したクラスをdllで提供する方法

# 活用事例について
[この記事](https://qiita.com/fan2tamo/items/2604b6f2edf8e918ee34 "Qiita")でC++で作成したdllをC#で使う方法を記載しました。
他社製のSDKを扱うクラスをC++で作成した場合などに、それをC#側から扱うというシーンを想定しています。

# 環境
このエントリを書いている私の環境は以下です。

- OS : Windows10 Pro x64 20H1(2004)
- Visual Studio Pro: 2019

# コード一式
**[ここ](https://github.com/fan2tamo/ClassInDLL "Github")に置きました。**

# ざっくりポイント
- Aという抽象クラスを定義  
クラスのメンバ関数は純粋仮想関数とする。
- Aという抽象クラスを継承したBというクラスを定義＆実装  
このBが実際に提供するクラスとなる。
- Aという抽象クラスのインスタンスを取得するAPIを定義＆実装  
取得するインスタンスはAを継承したBとする。


# 説明追記(2020.10.26追記)
@SaitoAtsushi さんにコメントいただき、私の理解と記載が不足していた部分について記載します。
[ざっくりポイント](#ざっくりポイント)でAという抽象クラスを定義している理由ですが、
dllが提供するクラスのサイズ変更に対応するためです。

抽象クラスを経由しない場合は、dllのクラスに変更を加えた場合にクラスのサイズが変更になります。
そうすると、dllを使う側も再ビルドが必要になります。
これを防ぐために抽象クラスを経由します。
[ここ](http://www2s.biglobe.ne.jp/~ragnarok/program/win32/class_of_cpp_in_dll.htm)に詳しい説明がありますので気になる人はご確認ください。


# 相手に提供するもの
- dll本体
- ヘッダファイル

# dll作成手順
1. 外部に提供するヘッダファイル(.h)の作成
このヘッダには以下を定義する。
 - 提供したいクラス  
   ここで定義するクラスのメンバ関数は純粋仮想関数とする。
 - 提供したいクラスを取得させるAPI

2. 提供するクラスを継承したクラスを定義＆実装
　　1.のヘッダファイルに定義したクラスを継承して実装する。

3. クラスを取得させるAPIを実装
　　1.のヘッダファイルに定義したAPIを実装する。

## 外部に提供するヘッダの作成
``` dll_export_def.h
#ifdef DLL_EXPORT
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif

// 提供したいクラス
class  dll_class
{
public:
    // 提供するメンバ関数
    virtual void print(void) = 0;
};

// 提供したいクラスの実態を取得させるAPI
extern "C" DLL dll_class* CreateInstance(void);
```

## 提供するクラスを継承したクラスを定義＆実装

継承したクラスの定義は以下となります。

``` dll_class_impl.h
#include "dll_export_def.h"

class dll_class_impl : public dll_class
{
public:
	dll_class_impl();
	~dll_class_impl();
	void print(void);
};
```

継承したクラスの実装は以下となります。

``` dll_class_impl.cpp
#include <stdio.h>
#define DLL_EXPORT
#include "dll_class_impl.h"

dll_class_impl::dll_class_impl()
{
	printf("コンストラクタ\n");
}

dll_class_impl::~dll_class_impl()
{
	printf("デストラクタ\n");
}

void dll_class_impl::print(void)
{
	printf("print()\n");
}
```

## クラスを取得させるAPIを実装

今回は面倒だったので、dll_class_impl.cppの末尾に記載しました。

``` dll_class_impl.cpp
#include <stdio.h>
#define DLL_EXPORT
#include "dll_class_impl.h"

dll_class_impl::dll_class_impl()
{
	printf("コンストラクタ\n");
}

dll_class_impl::~dll_class_impl()
{
	printf("デストラクタ\n");
}

void dll_class_impl::print(void)
{
	printf("print()\n");
}

// クラスの実態を取得するAPI
DLL dll_class* CreateInstance(void)
{
	return new dll_class_impl;
}
```

## dllを使う
dllの作成ができたので、サクッとdllを使っていきましょう。
今回の目的はdllでクラスを提供する部分なので、dllを使う側はUIなしのコンソールプログラムにします。
ヘッダファイルは提供されているので、作成するのは以下のみです。

```
#include <Windows.h>
#include "dll_export_def.h"

typedef dll_class* (*FUNC)(void);

int main()
{
    // dll名は"ClassInDLL.dll"
	HMODULE hHandle =  LoadLibrary(L"ClassInDLL.dll");;
	FUNC func = (FUNC)GetProcAddress(hHandle, "CreateInstance");

	dll_class * instance = func();
	instance->print();

    return 0;
}
```

実行すると以下が表示されるはずです。

```
コンストラクタ
print()
```

# 終わりに
サクっと作成したクラスをdllで提供する方法を記載しました。
コードも置きましたので、拙い説明よりはコードを見たほうが早いかも。

やり方としては単純なのですが、意外に調べるのに時間がかかりましたので、私以外の誰かの助けになれば幸いです。
Laravelで日本語化

##はじめに
Laravelバージョン5,6,7で対応。
ログイン画面、エラーメッセージなどを英語表記から日本語表記へ変更する。

##app.phpの記述を変更

```php:config/app.php
'locale' => 'en',

// 変更

'locale' => 'ja',
```

##GitHubで日本語化ファイルをダウンロード
<a href="https://github.com/Laravel-Lang/lang">こちら</a>からダウンロード。
```Code(緑色のアイコン)``` → ```Download ZIP```でダウンロードできる

##日本語化ファイルを配置
1.ダウンロードしたファイルを解答し、開く。（ファイル名：lang-master）

2.```src```フォルダ内の```ja```フォルダをプロジェクト内の```resoueces/lang```フォルダ直下に配置。

3.```json```フォルダ内の```ja.json```ファイルをプロジェクト内の```resoueces/lang```フォルダ直下に配置。


<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663132/10f80641-5a5a-d589-eaec-719eacd6e4df.png">

上記のように配置されていればOK！
コードリーディングのコツ

・ソースコードを読む上での心構え👨‍🏫
　ー自分にとって必要な部分に集中して読むようにする。
　　（完璧にすべてを細かく読もうとはしない。必要に迫られたら、そのときに読めばいい）
　ーそのソースコード（ファイル）の役割はなにか。
　（なんのためのソースコードなのか。扱うデータ（構造）と処理フローを意識する）

・ゴール（何をしたいのか）を明確にする（例. 注文取込の実装を理解したい）🏁
　ー何が実現できればいいのかをしっかり確認しておく

・ドキュメント（仕様書・設計書など）を読む📗

・目的になっている箇所（ファイル）を読む👀
　ーざっくり全体の構造や、どういう分類分けをしているかを把握する
　　この時分からない英単語は、リストアップして調べておく

・ソースコードを読む手順📚
　動的にソースコードを追う（byebugなどを仕込んで、実際に入っている値を確認しながら理解していく）
　→　静的にソースコードを追う
　　　→この時メモを取る（クラス関係図やコードの行番号と該当処理など
　　　　　　　　　　　　　　自分が必要だと思ったことについて簡潔にメモを取っていくようにする）
　　　　理由
　　　　　　作業が中断したときに内容をすぐ思い出せるようにするため
　　　　　　休日などを挟んで、後日続きをやる時に忘れないようにするため

・関数や変数の名前から意味を推測する🤔
　ー関数名や変数名は、何を意味しているのかが明確にわかるようにつけられている
　　例. function convert_int_to_string(number)などを見れば、<br>　　int型からstr型に変換をする関数かな？と予想することが出来ます。

・if文やfor文のスコープ（範囲）に気をつける❗️
　　if文やfor文など入れ子構造を持つものは、どこからどこまでがスコープとなっているのか<br>　　見落としがちなので、「○○行目のforが何行目から何行目まで続いているのか」といったことをメモする
[AWS SAM] Lambda関数からS3アクセス

1. [[AWS SAM] 概要、Hello World](https://qiita.com/takmot/items/27f7145f953fc62bdf6b)
2. [AWS SAM] Lambda関数からS3アクセス （※本記事）
3. [[AWS SAM] Swaggerを使用したAPI定義](https://qiita.com/takmot/items/19b4cffdc8815d24fa0a)

# Lambda関数からS3にアクセスする

変更必要点

- Lambda関数にS3アクセス権限を与える
- Lambda関数から参照するバケット名を環境変数に追加する

変更後テンプレートは以下のようになる

```yaml
Parameters:
  DataBucketName:
    Type: String
    Default: 'for-dev-bucket'

Resources:
  GetAllDataFunction: # リソース名
    Type: AWS::Serverless::Function # Lambda
    Properties:
      CodeUri: get-all-data/ # Lambdaソースコード格納パス
      Handler: function.lambda_handler # 関数実体：ファイル名function.pyの関数名lambda_handler 
      Runtime: python3.8
      Environment:
        Variables:
          BUCKET_NAME: !Ref DataBucketName # Lambda関数から参照する環境変数
      Events: # Lambdaをキックするイベント設定
        getAllData:
          Type: Api
          Properties:
            Path: /api/devices
            Method: get
      Policies:
        - S3ReadPolicy: # S3リードポリシー設定
            BucketName: !Ref DataBucketName # Parametersで定義した値を参照
```

テンプレート変更点

- Parametersセクションにバケット名を定義
- PoliciesにS3のバケットを指定してリード権限を追加
- EnvironmentにLambda関数から参照できるようにバケット名を設定

その他定義可能なセクションは[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-specification-template-anatomy.html)参照
その他ポリシーに関しては[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-policy-templates.html)参照
[S3ReadPolicy](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-policy-template-list.html#s3-read-policy)のようにプレースホルダー値（`"Ref": "BucketName"`）があるものは指定が必要

## Lambda関数からの環境変数アクセス

Lambda関数（Python）からは以下のようにアクセス可能

```python
import os
BUCKET_NAME = os.getenv('BUCKET_NAME')
```

# Lambda関数で外部ライブラリの使用

変更必要点

- Layerの追加

```yaml
Parameters:
  DataBucketName:
    Type: String
    Default: 'for-dev-bucket'
  PandasLayerArn:
    Type: String
    Default: 'arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-python38-pandas:18'

Resources:
  GetAllDataFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: get-all-data/
      Handler: function.lambda_handler
      Runtime: python3.8
      Layers: # Layer追加
        - !Ref PandasLayerArn
      Environment:
        Variables:
          BUCKET_NAME: !Ref DataBucketName
      Events:
        getAllData:
          Type: Api
          Properties:
            Path: /api/devices
            Method: get
      Policies:
        - S3ReadPolicy:
            BucketName: !Ref DataBucketName
```

テンプレート変更点

- ParametersセクションにLayerのARN追加
- Layersを追加

外部ライブラリのLayer ARNについては[以前の記事](https://qiita.com/takmot/items/4e75e3d823f2b9a30acd)で記載しているのでそちらを参照

続き（[[AWS SAM] Swaggerを使用したAPI定義](https://qiita.com/takmot/items/19b4cffdc8815d24fa0a)）
[AWS SAM] 概要、Hello World

1. [AWS SAM] 概要、Hello World （※本記事）
2. [[AWS SAM] Lambda関数からS3アクセス](https://qiita.com/takmot/items/6c8cefe94f80a214aeb0)
3. [[AWS SAM] Swaggerを使用したAPI定義](https://qiita.com/takmot/items/19b4cffdc8815d24fa0a)

# AWS SAM（AWS Serverless Application Model）

## サーバレスアプリケーション

Lambda関数、トリガとなるイベントリソース、およびLambda関数から操作するリソース等を組み合わせたもの

## AWS SAM

サーバレスアプリケーションのデプロイに特化したAWS CloudFormationの拡張機能
CloudFormationと比べて簡潔にテンプレートを記述可能
SAMはCloudFormationの拡張機能のため、CloudFormationの文法と共存可能
SAMでサポートしていないサービスについてはCloudFormationの文法で対応

CloudFormationと同様にYAMLまたはJSONでSAMテンプレートを記述する
デプロイ時にCloudFormationによってSAMテンプレートはCloudFormationテンプレートに変換される
テンプレート内の`Transform: AWS::Serverless-2016-10-31`で変換方式を指定している

# AWS SAM CLIのインストール

[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)を参考にAWS SAM CLIをインストール

# Hello Worldアプリケーションの導入

[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html)を参考に`sam init`でアプリケーションを作成、
今回はRuntimeにpython3.8、アプリケーションテンプレートにhello-worldを選択
python3.8をインストールしておく必要あり、バージョン違いも不可

```
-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: python3.8
Dependency Manager: pip
Application Template: hello-world
Output Directory: .
```

デプロイは、`aws cloudformation package`、`aws cloudformation deploy`を使用
パッケージのアップロード先S3バケットは事前に作成しておく必要あり

```
$ aws cloudformation package \
    --template-file ./template.yaml \
    --s3-bucket ${YOUR_BUCKET_NAME} \
    --output-template-file ./packaged_template.yaml

$ aws cloudformation deploy \
    --template-file ./packaged_template.yaml \
    --stack-name ${YOUR_STACK_NAME} \
    --capabilities CAPABILITY_IAM \
    --region ${YOUR_REGION}
```

`aws cloudformation package`で実装ファイルをzip圧縮し、S3の指定バケットにアップロード、
`aws cloudformation deploy`でCloudFormationのスタックとして、指定された名前でデプロイ

スタックはデプロイされるリソース一式で、スタックを削除すると紐づいているリソースすべてが削除される、
存在しないスタック名でデプロイすると新規作成、すでに存在するスタック名の場合は更新される
デプロイしたLambda関数、API GatewayのAPI名に指定したスタック名で含まれる（明示的にFunctionName, Nameを指定しなかった場合）

hello-worldアプリケーションをデプロイすると、
API Gateway にスタック名でAPIが生成、
Lambdaに`${YOUR_STACK_NAME}-HelloWorldFunction-XXXXXX`のような名前で関数が生成される

## テンプレート内容

```yaml
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/ # Lambda関数ファイルの場所、※packageコマンドで実際のS3パスに置き換えれる
      Handler: app.lambda_handler # Lambda関数実体（ファイル名app、関数名lambda_handler） 
      Runtime: python3.8
      Events: # Lambdaのトリガとなるイベント
        HelloWorld:
          Type: Api # API Gatewayの以下パス、メソッドコール時にLambdaをキック
          Properties:
            Path: /hello
            Method: get
```

[続き（AWS SAM Lambda関数からS3アクセス）](https://qiita.com/takmot/items/6c8cefe94f80a214aeb0)
Docker Gradle クイックリファレンス 日本語訳

[Docker Hub の Gradle 公式イメージの説明書き](https://hub.docker.com/_/gradle) の日本語訳。

# Gradle とは?

Gradle は、ビルドの自動化と多言語開発のサポートに重点を置いたビルドツールです。
任意のプラットフォームでソフトウェアを構築、テスト、公開、デプロイする場合、 Gradle はコードのコンパイルとパッケージ化から Web サイトの公開までの開発ライフサイクル全体をサポートできる柔軟なモデルを提供します。
Gradle は Java, Scala, Android, C/C++, Groovy などの複数の言語とプラットフォームにわたるビルド自動化をサポートするように設計されており、Eclipse, IntelliJ, Jenkins などの開発ツールや継続的インテグレーションサーバーと緊密に統合されています。

# このイメージの使い方
## Gradle プロジェクトの構築

ビルドする Gradle プロジェクトのディレクトリから下記を実行します。

```bash
docker run --rm -u gradle -v "$PWD":/home/gradle/project -w /home/gradle/project gradle gradle <gradle-task>
```

上記のコマンドは root として実行されるのを避ける為に uid/gid 1000(ユーザー gradle)を使用して実行されることに注意してください。
ボリュームをマウントしており、 Docker を実行している uid/gid が 1000 でない場合は、ユーザー root( ``-u root`` ) として実行する必要があります。
root もデフォルトであるため、単純にユーザーを指定しないこともできます。

# ライセンス

このイメージに含まれているソフトウェアのライセンス情報を表示します。
すべての Docker イメージと同様に、これらには他のライセンスの下にある可能性のある他のソフトウェア(ベースディストリビューションの Bash など、含まれているプラ​​イマリソフトウェアの直接的または間接的な依存関係)も含まれている可能性があります。
自動検出できたいくつかの追加のライセンス情報は、 repo-info リポジトリの ``gradle/`` ディレクトリにある可能性があります。
ビルド済みのイメージの使用に関しては、このイメージの使用が、そこに含まれるすべてのソフトウェアに関連するライセンスに準拠していることを確認するのはイメージユーザーの責任です。
共有ライブラリで共有メモリを使用する

共有ライブラリ上のデータをアタッチしているプロセス間で共有したいと思い色々と試行錯誤したが, 少しハマったので記事にしておきます.

### 共有ライブラリ上のグローバル変数
WindowsのDLLと異なりUNIX系の共有ライブラリはグローバル空間に変数を配置しても, プロセスごとのメモリ空間に配置されるため, 共有ライブラリを使用するだけではプロセス間通信は行なえません.  
共有ライブラリで使用するデータを共有するには, 共有メモリを使用するのが最も容易です.　　
という訳でサンプルコードを示します. 

```c:lib_shared_memory.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/shm.h>

static void *sharedmemory; // 共有メモリへのポインタ
static int seg_id;         // 共有メモリID
static int* pnumattachproc;// 共有メモリにアタッチしているプロセス数(共有メモリ上に配置)

__attribute__ ((constructor))
void attach_shmem(void)
{
    int isfirstproc = 0;
    key_t key = 10;
    size_t size = 1000;
    // 共有メモリを作成
    seg_id = shmget(key, size, IPC_CREAT | IPC_EXCL | 0660);
    // 作成に失敗し, かつ同じキーの共有メモリが存在する場合
    if ((seg_id == -1) && (errno == EEXIST)){
        // その共有メモリのidを取得 
        seg_id = shmget(key, size, 0);
    }else if(seg_id > 0){
        // 共有メモリの作成に成功した場合は初期化処理を行うフラグを立てる
        isfirstproc = 1;
    }
    if (seg_id == -1)
        exit(1);
    // 共有メモリをアタッチ
    sharedmemory = shmat(seg_id, NULL, 0);
    if(isfirstproc){
        pnumattachproc = (int*)sharedmemory;
        // アタッチしているプロセス数を初期化
        *pnumattachproc = 0;
    }
    (*pnumattachproc)++; //アタッチしているプロセス数をインクリメント
}

__attribute__ ((destructor))
void detach_shmem(void)
{
    (*pnumattachproc)--; //アタッチしているプロセス数をデクリメント
    if(*pnumattachproc == 0){
        //もしアタッチしているプロセス数が0になったら,
        // 共有メモリを開放属性を付与しておく
        shmctl(segid, IPC_RMID, NULL);    
    }
    // 共有メモリデタッチ
    (void) shmdt(sharedmemory);
}

int get_attachproc_num(void){
    return *pnumattachproc;
}
```
となります. ビルドは共有ライブラリ用のオプションを使用します.

```console
gcc -fPIC -shared -o libshm.so lib_shared_memory.c
```

注意点として, 

```c
shmctl(segid, IPC_RMID, NULL); 
```
はアタッチしているプロセスが0になり開放が確定してから実行しましょう.  
もしアタッチしているプロセスが存在している段階で実行してしまうと, 新たなプロセスが共有メモリにアタッチしようとした場合に, 同じキーにも関わらず新たな共有メモリを作成してしまいます.  
これを防ぐために共有メモリにアタッチしているプロセス数を共有メモリ上に変数として置いて管理することで, 最後に共有ライブラリをデタッチするプロセスが開放できるようにしてあります.   


私はこれを理解しておらず, 共有メモリ作成時に開放要求を追加しており, 共有メモリにアタッチすることができていませんでした.

以上です.
Power BI を含む Microsoft Fabric Supportへの問い合わせ方法（備忘録）

2023/08/10 以前と方法が変わったので最新化

## 参考

https://learn.microsoft.com/ja-jp/power-bi/support/service-support-options

https://jpbap-sqlbi.github.io/blog/powerbi/support_boundary/


## Power BI ライセンス持ちの人向けの手順
前提条件：
有効なライセンスを持っている方向けの問い合わせ方法です。なお、

1. https://support.fabric.microsoft.com/ にアクセスし対象の製品を選択してください。ここでは有効なライセンスをもったユーザでサインインしてください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/026b8d30-c9b7-1044-eeff-726d9efaf30d.png)

2. 対象の問題で検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/00cf15b8-6d92-5c7a-2d11-997d5931c127.png)



3. 関連の問題の種類とカテゴリを選択して「ソリューションを見る」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3814083c-0731-76a4-12c4-0818be865d41.png)


5. ソリューションにほしい情報がない場合は、「サポートに問い合わせる」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5a0e057d-6859-000a-3e12-65d5bdb2431f.png)


6. ここから先は順に情報を記載して、チケットを発行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/be790960-8b62-f6d3-f704-8570d8f2814c.png)


## Azure サポート利用の場合

参考：https://learn.microsoft.com/ja-jp/azure/azure-portal/supportability/how-to-create-azure-support-request

Fabric ファミリーが選択可能であることを確認済み

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5713726f-9217-bbf9-bd11-4cd9bcc40b80.png)
【Ruby on Rails】Rubocop-airbnbを使用して、コードチェック

# 開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

# RuboCopとは
RuboCopとは、rubyコードが「コーディング規約どおりに書かれているか」をチェックする静的コード解析ツールです。

# rubocop−airbnbとは
airbnb社が作成した解析となり、今回はこちらを使用しコードチェックを行います。
gitは下記の通りです。
https://github.com/airbnb/ruby/tree/master/rubocop-airbnb

# Rubocop-airbnb」のインストール
下記の通りに追加します。

```rb:Gemfile
group :development do

...

  gem 'rubocop-airbnb'
end
```
```:ターミナル
$ bundle install
```

# 設定ファイルの作成
アプリケーションフォルダ配下に
「.rubocop.yml」と「.rubocop_airbnb.yml」ファイルを作成します。
これらを作成することによりrubocopでコード解析したくないファイルやフォルダを指定します。
※ファイル名の「.」は必要なため忘れず記載してください。

```:.rubocop.yml
inherit_from:
  - .rubocop_airbnb.yml

AllCops:
  Exclude:
    - 'db/**/*'
    - 'bin/*'
    - 'config/environments/*'
    - 'config/application.rb'
    - 'config/initializers/*'
    - 'config/spring.rb'
    - 'lib/tasks/*'
    - 'vendor/**/*'
    - 'path/ruby'
```
```:.rubocop_airbnb.yml
require:
  - rubocop-airbnb
```

# Rubocopでコードのチェック
ターミナルでアプリケーションフォルダに移動し、下記を実行。

```:ターミナル
$ bundle exec rubocop --require rubocop-airbnb

...

50 files inspected, 150 offenses detected
```
このように表示されます。
50ファイルをチェックして150箇所のコーディング違反があったことを意味しています。
このように数が膨大になると一つ一つチェックは難しいため、下記を実行。

```:ターミナル
$ bundle exec rubocop --require rubocop-airbnb -a

...

50 files inspected, 150 offenses detected, 150 offenses corrected
```
このように150個すべてを修正してくれました。
これでも修正が出来ていない場合は、目視での確認になります。


# まとめ
このようにコードの自動修正が簡単にできます。
すごく便利なのでぜひ使ってみてください。

またtwitterではQiitaにはアップしていない技術や考え方もアップしていますので、
よければフォローして頂けると嬉しいです。
詳しくはこちら　https://twitter.com/japwork
情報処理安全確保支援士試験 勉強の備忘録

令和２年度春期試験が新型コロナの影響で中止になり、およそ１年ぶりにIPAの情報処理技術者試験が実施されました。筆者は情報処理安全確保支援士試験(以下SC試験)を受験しました。応用情報に合格していたお陰で午前Ⅱから(午前Ⅰ免除)の受験でした。感触はよく分からないというのが実情です。。。:scream: 合否の結果は:santa_tone1:が運んでくる[^santa]ことになっているので、大人しく待つこととします。もし再勉強が必要になった場合に備えて、備忘録をまとめておこうと思います。

# 総合対策
## マスタリングTCP/IP 情報セキュリティ編
オーム社より出版されているネットワーク技術書シリーズの情報セキュリティ編。コンパクトにまとまっており、重要な用語の解説も詳しく、試験範囲の知識を浅く広く身に付けるための参考書として利用。

* [Amazon.com](https://www.amazon.co.jp/dp/B01IGW5H1U/)

![マスタリングTCPIP](https://m.media-amazon.com/images/I/41rYnVTPv0L.jpg)

## 情報セキュリティ10大脅威 2020
IPAが毎年発表している情報セキュリティ脅威に関する資料。個人、組織別に被害の多かったセキュリティ脅威に関する解説が掲載されている。午後対策として目を通した。資料は80P程度のPDFで公開されている。

* [IPAのページ](https://www.ipa.go.jp/files/000080871.pdf)

![10大脅威](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/93081373-df3b-94b7-ccca-0fcf3c04ee15.png)


# 午前Ⅱ対策
## 過去問道場
情報セキュリティの問題は基本情報や応用情報でも必答問題となるなど、なじみ深い分野です。そこで、午前Ⅱについてはいきなり問題を解いていくスタイルで臨みました。過去問道場はゲーム感覚で問題演習ができ、成績に応じて「段位」が付きます。筆者は最終的に「名人」になりました。

![過去問道場.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/0cb0fac4-719a-f671-7969-394019ff90f4.png)

![SCAM2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/5c6f7e17-4966-bdf2-0ed6-fd8732700053.png)

## 要点解釈 情報処理安全確保支援士

# 午後対策

## 午後問題の重点対策
午後頻出テーマについて過去問演習を行うための演習書として購入。解答用紙がダウンロードでき、本番さながらに演習が出来た。しかも、しばしばネットで午後対策の良書として取り上げられている。しかし、解説が文章中心(長文)で読んでいてくたびれてしまうことは否めない。(本番の練習にはなるかもしれない。。。)

* [Amazon.com](https://www.amazon.co.jp/dp/4865751831/)

![重点対策](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/4b25969c-33ac-16c6-fedf-353d30b73aab.png)

## 午後の17問
解説は詳しいものの重点対策の様に長文が続くということも無く、取り組みやすい演習書だった。強いて言えば、重点対策の様に解答用紙が付いてこず、自分でノートに解答用紙を作らなければならない点が少し手間が掛かる。。。

* [Amazon.com](https://www.amazon.co.jp/dp/B07B7LHCVN/)

![重点対策](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/73f5c4cb-8c9a-41e9-0aea-2d47b500fe3f.png)

## ALL IN ONE 情報処理安全確保支援士
Amazonで見掛けて購入したが、結局午前の問題を確認程度に解いて、午後問題を最後の2週間ぐらいの追い込み演習に用いただけとなった。。。午後の17問を解き直す方針でも今思えば良かったかもしれないが、午後の解き方といった解説が載っているのは大変良かった。

* [Amazon.com](https://www.amazon.co.jp/dp/4813279902/)

![all in one](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/1137a8fb-a743-2936-7ad9-eccd57131f55.png)

# まとめ
これらの書籍を活用して今回SC試験を受験しました。:cherry_blossom::cherry_blossom::cherry_blossom:となってくれれば願うばかりです。再挑戦となった場合は、主に午後対策をやって臨むことになりそうなので、午後の17問と重点対策を中心に勉強しようと思います。

# 2020/12/26追記: 合否結果
昨日正午合否結果が発表されました。午前Ⅱ、午後Ⅰは突破しましたが、午後Ⅱが後もう少しの所で及ばず。。。:scream:午後Ⅱは試験時間が2時間と言うことも有り、実践演習をあまりやらなかったことが裏目に出てしまいました。但し、今回の受験でSCの間隔はつかめました。春期試験での合格を目指します。

[^santa]: 合格発表は１２月２５日クリスマスの日です。良いクリスマスになって欲しいものです。
データ損失なくRAWパーティションを無料で復元する方法

   データ損失なしでRAWドライブをNTFSかFATファイルシステムに変換する方法は誰もが非常に心配している問題です。今日、この記事では、<a href="https://jp.bitwar.net/course/format/1261.html">RAWパーティションからデータを復元する方法</a>について説明しました。


<dt>Windowsのrawパーティションとは何ですか？なぜrawパーティションがあるのですか？</dt>

 

   一般的に、我々が知っている共通のWindowsファイルシステムはexFAT、FAT16、FAT32またはNTFSであり、他の未知のファイルシステムはRAWとマークされます。つまり、RAWは、データを直接格納できるファイルシステムではなく、使用する準備が整っていない、ハードディスクパーティションまたはその他の正しくパーティション化されていないストレージデバイスです。


   RAWパーティションの理由はよくあります。たとえば、ディスクを正しくフォーマットできない場合や、パーティションを誤って暗号化しようとした場合、通常のパーティションがRAWパーティションに変更されることがあります。


<dt>それでも、RAWパーティションエラーには他の理由があります。</dt>


  1.パーティションに多くのエラーがあります

  2.ウイルスやトロイの木馬による悪意のある攻撃

  3.デバイスのファームウェアが破損している

 4.ファイルシステムエラー


<dt>パーティションがRAWであるかどうかを知る方法は？</dt>

パーティションを開こうとしたときに突然このようなWindowsが表示された場合は、そのパーティションにアクセスできず、RAWパーティションになっています。

ファイルシステムセクションではRAWとして表示され、ローカルディスクの「使用済みスペース」または「空きスペース」セクションに0バイトが表示されます。


パーティションを右クリックして[プロパティ]を選択してファイルシステムのタイプを確認します。

また、ディスクの管理でパーティションのステータスを確認します。

 
さらに悪いことに、パーティションを開いて貴重なデータにアクセスし、「ドライブを使うにはフォーマットする必要があります。フォーマットしますか?」というメッセージを受け取ることができない場合があります。

   詳しくは、「<a href="https://jp.bitwar.net/course/format/1261.html">データ損失なくRAWパーティションを無料で復元する方法</a>」をご参照ください。
ESXiにてghettoVCBを利用したコールドバックアップをやった件

# 概要
- ESXiにてghettoVCBを利用したバックアップする方法を記載

# 方法
## ghettoVCBの導入

- [http://blog.andromeda.jp/archives/3160] を参考に実施

## バックアップスケジュールをcronに登録（起動スクリプトで設定)

cronに登録するのだが、ESXiの制約でcron直書きしてもESXi起動時にクリアされてしまう

したがって起動スクリプト```/etc/rc.local.d/local.sh```に記載しておいて、起動都度追記されるようにする

### パススルーなしの仮想マシン

- バックアップ実行：```/bin/echo "35 15 * * 1,3,5 /bin/sh <ghettoVCBのshファイルパス> -f <VM名を記載したファイルパス>" >> <ログファイルパス>```のみを記載

### パススルーありの仮想マシン

パススルー(GPUなど)がある場合はスナップショットが取れないため、コールドバックアップとなる

したがって仮想マシンの停止と起動のスクリプトも必要

- バックアップ実行：```/bin/echo "35 15 * * 1,3,5 /bin/sh <ghettoVCBのshファイルパス> -f <VM名を記載したファイルパス>" >> <ログファイルパス>```
- 仮想マシン停止：```/bin/echo "05 15 * * 0,2,4 vim-cmd vmsvc/power.off <仮想マシンID>" >> /var/spool/cron/crontabs/root```
- 仮想マシン起動：```/bin/echo "35 21 * * 0,2,4 vim-cmd vmsvc/power.on <仮想マシンID>" >> /var/spool/cron/crontabs/root```

### 実際の例

テストサーバ

```sh
#!/bin/sh

# local configuration options

# Note: modify at your own risk!  If you do/use anything in this
# script that is not part of a stable API (relying on files to be in
# specific places, specific tools, specific output, etc) there is a
# possibility you will end up with a broken system after patching or
# upgrading.  Changes are not supported unless under direction of
# VMware support.

sed -e "/ghettoVCB.sh/d" /var/spool/cron/crontabs/root -i
sed -e "/vim-cmd vmsvc/d" /var/spool/cron/crontabs/root -i
/bin/echo "35 15 * * 1,3,5 /bin/sh /vmfs/volumes/datastore1/ghettoVCB-master/ghettoVCB.sh -f /vmfs/volumes/datastore1/JBS/vmlist.txt" >> /var/spool/cron/crontabs/root
/bin/echo "35 15 * * 0,2,4 /bin/sh /vmfs/volumes/datastore1/ghettoVCB-master/ghettoVCB.sh -f /vmfs/volumes/datastore1/JBS/vmlist2.txt" >> /var/spool/cron/crontabs/root
/bin/echo "05 15 * * 0,2,4 vim-cmd vmsvc/power.off 19" >> /var/spool/cron/crontabs/root
/bin/echo "35 21 * * 0,2,4 vim-cmd vmsvc/power.on 19" >> /var/spool/cron/crontabs/root
/bin/kill $(cat /var/run/crond.pid)
/bin/crond
exit 0
```
メソッドについて

#メソッド

**プログラムにおける命令のことをメソッドと呼びます。
メソッドとは、プログラミングにおける何らかの処理をまとめたものです。
メソッド名をプログラム中に記述することで、そのメソッドの処理を実行できます。**


![メソッド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762918/560959d3-6d08-e96a-6f43-06ba8df3303d.png)

Rubyには便利なメソッドがたくさん用意されています。
たとえば、ターミナルで文字入力モードを起動する、指定した文字を
ターミナルに出力する、などのメソッドです。
また、特定の値にのみ使用できるメソッドもあります。

文字列にも、使用できるメソッドが用意されています。

#まとめ

**メソッドとは、プログラミングにおける何らかの処理をまとめたもの。**

#####以上。
Agile Tech EXPO mini #1 -終わらないEpisode0- (川口耕介さんの発表) まとめ

# イベント概要
- [セッション動画](https://www.youtube.com/watch?v=ZnA6lcpW4vw)
- [発表資料](https://kohsuke.org/private/2020/%E3%82%A2%E3%83%A1%E3%83%AA%E3%82%AB%E5%BC%8F%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E6%96%B9%E5%BC%8F.pdf)
- [connpass ページ](https://agiletechexpo.connpass.com/event/192289/?utm_campaign=event_message_to_selected_participant&utm_source=notifications&utm_medium=email&utm_content=title_link)

# 発表で印象に残ったこと

### 日本とアメリカのスタイルの違い
- 欧米のシステム開発のスタイルは「Product Mindset」
  - ソフトウェアは生きている、子育てのように世話をしなければならない
- 日本のシステム開発のスタイルは「Project Mindset」
  - 建物を建てるようなスタイル、ゼネコンに依頼し、それぞれの職人が並列作業で効率よく作業する
  - 改築は別口

### 品質保証の考え方
- 品質保証の考え方が横割り組織によって変わってきた
 - 障害を起こさないように取り組むだけでなく、障害が起きても影響を局所化する、早期復旧するといったことも注目されるように (SRE)
 - 品質保証課のように縦割りの組織しか存在しなかったら、このような考えは生まれなかっただろう

### 垂直分業によるスケールメリット
- では横割りで完全に独立したチームがポツポツとある状態が望ましいかというと、そうではない
- 「垂直分業によるスケールメリット」
  - Container の中は横断的チーム、Container の外は SRE チームといった疎結合な分業
- 疎結合な分業をサポートするような技術が発展し、それによりまた疎結合な分業をすることにメリットが生まれるという正のループ
    - MicroService
    - Service Mesh
    - k8s
- このようなスケールメリットの恩恵を受けている企業とそうでない企業の二極化が進みすぎている

### 文化をどう扱うか
- 欧米の文化をそのまま日本に適応してうまくいくはずはない
  - 日本の寿司とカルフォルニア寿司、クリスマスの文化などは両国で全く異なる
  - それでももし日本がガラパコス化しているなら、出島のようなもの作る必要が出てくるだろう
- 文化は一部を真似してもうまく行かない。福沢諭吉はアメリカに留学し慶應義塾をまず作った。企業にとどまらず、政府なども巻き込んでこのような取り組みをする必要がソフトウェア業界にもあるのかもしれない。
文字列の連結方法

#文字列の連結

文字列を連結させるには、文字列同士を<font color="DeepPink">**+(プラス)**</font>で繋ぎます。数式と同じような書き方です。

以下の例では、**Hello**と**World**の文字列が繋がっています。

```java:【例】irb
# 文字列を連結
irb(main):001:0> "Hello " + "World"
=> Hello World
```

#irbでコードを実行してみましょう！！

文字列を連結してみましょう。
以下の例のようにirbでコードを実行してみて下さい。

```java:irb
# 文字列を連結
irb(main):001:0> "Good" + " morning"

# 続けてこのように表示されれば成功
=> "Good morning"
```
そうすることで、上記のように文字列の連結ができます!!


#まとめ

**irbとは、ターミナルから直接Rubyのプログラムを動かすことができる機能のこと。
文字列とは、プログラミングの中で文字を扱うための値のこと。
文字列は、<font color="DeepPink">+（プラス）</font>で連結できる。**


#####以上。
select2を、[ rails6 + webpacker + jquery ] で使用してみる

[select2](https://select2.org/)
-
- yarn pkg で webpackerにインストールし使用する
- 47都道府県を分類する selectbox を作成しました。とにかく見づらいし、選択しづらいという事で！導入にいたりました。

![スクリーンショット 2020-10-22 19.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449720/fcdb0e54-861c-5d59-d4a3-a54f6cca4331.png)

- ↑こんな感じで都道府県をスクロールすると、大変なのでキーワード入力で探せるようにします！

## yarnで必要pkgをインストールする。

```text:select2を操作するjqueryが必要
yarn add select2
yarn add jquery
```

## view側
```text:classやid名は、{　}で括る必要有
<%= search_form_for @map_key do |f| %>
  <%= f.select :address_cont, Map.ride_areas.keys, {}, {class: 'pref'} %>
  <%= f.button '検索' %>
<% end %>
```

```text:layout/application.rb
<head>
  <%= javascript_pack_tag 'select2',      'data-turbolinks-track': 'reload' %>
</head>
```


## model側
```text:enumで47都道府県は格納
class Map < ApplicationRecord
enum ride_area:{
    北海道:0,青森県:1,岩手県:2,宮城県:3,秋田県:4,山形県:5,福島県:6,
    茨城県:7,栃木県:8,群馬県:9,埼玉県:10,千葉県:11,東京都:12,神奈川県:13,
    新潟県:14,富山県:15,石川県:16,福井県:17,山梨県:18,長野県:19,
    岐阜県:20,静岡県:21,愛知県:22,三重県:23,
    滋賀県:24,京都府:25,大阪府:26,兵庫県:27,奈良県:28,和歌山県:29,
    鳥取県:30,島根県:31,岡山県:32,広島県:33,山口県:34,
    徳島県:35,香川県:36,愛媛県:37,高知県:38,
    福岡県:39,佐賀県:40,長崎県:41,熊本県:42,大分県:43,宮崎県:44,鹿児島県:45,沖縄県:46
  }
end
```

## webpacker側
```javascript/packs/select2.jsを作成
global.$ = require('jquery')
import "../src/javascripts/form/select1.js";
```
```text:javascript/src/search/select1.jsを作成
import 'select2';                       // globally assign select2 fn to $ element
import 'select2/dist/css/select2.css';  // optional if you have css loader

jQuery(function ($) {
  $('.pref').select2({
    dropdownAutoWidth: true,
    width: 'auto'
  })
})
```

## webpacker設定
```text:config/webpack/environment.rbに追記
const { environment } = require('@rails/webpacker')
const webpack = require('webpack')
environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery',
    jQuery: 'jquery',
    Popper: 'popper.js'
  })
)
module.exports = environment
```

## select2が適用されない！

- jqueryが使用できているが、select2が適用されない。

なぜだろう？

もう一度、select2の公式を見てみる。

あった！　たぶんこれが原因っぽい。↓

![スクリーンショット 2020-10-23 11.06.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449720/985ae58a-32ac-e7e3-1c27-7148b4178176.png)

#### select2はyarnでインストールして使用できていると思っていたけど、、
1. `yarn add select2`　実行
2. jsファイルで`import select2` してる呼び出しているはずなんだが、

#### ~~結論 ： 別で、jsとcssファイルが起動には必要てことかな？？~~

#### 原因: select2のmin.cssが適用されず、viewに反映されていなかった

```text:fronts/src/stylesheets/application.scss
// yarnでインストールした、node_modules以下のselect2.min.cssを読み込むように指定する。
@import "select2/dist/css/select2.min.css";
```

docker-compose の再起動で無事yarn addしたselect2がjqueryによって適用された。
【備忘録】MVCモデル　簡単なまとめ

#はじめに
筆者の漁った色々な知識を備忘録としてまとめ、残しています。

##MVCとは
モデル（Model）頭文字「M」、ビュー（View）頭文字「V」、コントローラー（Controller）頭文字「C」の略であり、アプリケーション設定を整理するための概念。イメージはユーザーがブラウザで入力(クリック)した内容をWebアプリケーションで処理する流れ。

RubyonRailsは、MVCモデルで構成されている。

###Model（モデル）
アプリケーション固有のデータを扱う部分です。Controllerからの依頼を受けて処理する（Modelに直接処理を記入することもある(例：「特定の文字列を探して抽出して」とか、「データベースのこの項目には空白入れないで」 等)）。データベースに対して、データの登録や取得、更新、削除などの処理を行う。

###View（ビュー）
PCの画面に関わる部分。データベースの情報を表示する場合、Controllerから情報を受け取り、ブラウザに表示させるHTMLを実際に組み立てる。

###Controller（コントローラ）
ModelやViewを制御する部分です。ユーザーからのリクエスト（例：TOPから商品一覧（データベースに登録されてる商品）をみたい 等）を受けて、Modelと連携したり、どのView（画面）を表示するのかといったことを制御します。

##RubyonRailsでは
プログラムの構造をMVCの役割によって分けることで、プログラムのメンテナンス性を向上させたり、複数人で開発するときに影響する箇所を限定できるようになっています。


###抽象化すると
Viewが営業
Controllerが事業推進
Modelが事務

Veiw（商品一覧）を表示する時
View　　　 　：問い合わせがあったので、Controllerさんお客さんに見せるプレゼン用のカタログください！
Controller　　：了解！Viewさん！　Modelさん！キャビネットからもってきて！
Model　　 　 ：controllerさん、了解しました。今とってきます。

Viewでユーザーが新規会員登録された時
View　　　　 ：Controllerさんお客さんから依頼とってきました！
Controller　　：ありがとう！Viewさん！　Modelさんに渡しとくね！
Model　　 　 ：controllerさん、了解しました。記録残しておきますね。

そして各役割ごとに、業務をルーチン化して効率を向上させている。
※viewとcontrollerには、実は課長（application_controller.rbとapplication_html.erb））がいて、課（フォルダ）内にまとめて命令を出せたりする。

みたいなイメージを持っています。
バーでマジシャンをやっていたオタクが「未経験からエンジニアに！」に釣られてIT系人間になったときのおぼえがき。

雑記です。オチはない。

# プログラムもマジックも似たようなもん

プログラムってすごいですよね。
ボタンを押したらお買い物が出来る。

マジックってすごいですよね。
指を鳴らしたらトランプが上に上がってくる。

ひとつのやりたいことを実現するために、裏ではいろんな処理が行われてるんですよ。
それが手先で行われてるか、機械で行われているかの違いだけです。
そう気づいた瞬間から双方の理解がグッと楽になったような気がしたのでメモしておきます。
めちゃくちゃニッチ。ｗ

# 細かい実装、大きい挙動

いざ新しくもの作ろうと思ったとき、とりあえずは似たようなことをしてる人がいないか調べますよね。

「この部分はそのまま使ってもいいけど、この部分は変えたいな...」
「考えてた実装と全然違うけど、こういうアプローチもあるのか...」
なんてことはよくあることだと思います。

マジックでもプログラムでも。

トランプを一番上に上げるだけでも、いくつもの実装方法があります。
手先の技を使うもの、仕掛けのあるトランプを使うもの、その他いろいろ。
基本的な実装があって、応用的な実装もあって、それぞれにメリット・デメリットがあります。

これを念頭に置いてからプログラムを読むと、難解だったプログラムも多少はとっつきやくすなります。
ああこれは某プログラミングスクールのところにもあった基本的な実装だな、とか
この人の実装はこのケースに対応して書いた応用的な実装なんだな、とか。

そして本当に細かい実装についてはとりあえず理解しなくていいな、って部分も見えてきます。
自分は初め、ライブラリの中まで見て挙動を把握しようとしようとしていましたが、
マジック道具の材質にこだわるようなもので、一旦動く段階までは必要無い場合が多いです。
それはどういう道具（ライブラリ）でどういうインターフェースなのかをしっかり把握すればよかったり。
動き始めてから更に挙動を改善するためには見る場合もよくありますが...
買ったマジック道具がちゃちくてうまく動かなくて結局自作したりしますしね...似ている...

	
# UXについて
	
それで苦心して作ったものは、観客（利用者）の体験によって評価されます。
そこで一番大事なのはUX（重言そう）だと思うんですよね。
業務アプリとかなら当然「やるべきことが行われている」のは大前提なんですが。
マジックで言えばこれは「失敗しない」とかそういうレベルなので。ありえない話としてよさそう。
でもまぁ失敗することもありますから、そのケースに対応出来るようにしておくのもプロですよね。
それも全部ひっくるめて、UXだと思います。

# まとめ

何が言いたいかというと、どちらもUXを良くするのが至上命題なんですよね。
お客さんが「意識して / 無意識に」、「見るもの / 聞くもの」全てをきちんと考えて実装すれば、おのずと良いものになると思います。
無意識に見ているマーク、ちょっとした誘導の言葉端、そんなに深く考えずに選ぶであろう選択肢。
ひとつひとつに配慮して実装していきたいですね。

マジックでもプログラムでも。
Excel　保護機能を使わず、隠シートを実現する

Excelの保護機能というものがあるが、行挿入やスタイルなど色々と制限されてしまって個人的にはあまり好きではない。
ただ、業務上お金に絡む部分とか一部のメンバーにしか見せたくない情報があったりもする。
それが全く別の情報ならブックを分ければよいが、予実管理とかみたいなのになれば、それはなかなか難しい。
いちいち同期させるのは手間で、形骸化の要因でもあるので、同じフック内にほしいところ。

ということで、マクロでできるだけのことをやってみた。

# 結論

先に結論まとめておく。
サンプルはGitにあるので好きに持って行ってください。
https://github.com/kometsubu/Excel/tree/main/01_SecretSheet



![img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663051/b9600537-26f2-9c6e-0e1d-f9e05d1b5bb9.png)
こんな感じでパッと見、シートが一つしか見えないようになっているが

![img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663051/9d2464ab-28e5-1317-c63e-54388e5de438.png)
ボタンを押すと、マクロが動いてパスワードを聞かれる

![img03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663051/334b793b-993e-f41e-3dfc-a040013039f8.png)
でパスワードが正しければ、シートが切り替わる。
ちなみに、この原価管理シートから別のシートに移動すると、最初ようにシートが見えない状態になる。

# 実現方法

ということで実現方法を紹介
## 手順1.ブックを開いたときのイベントを定義
標準モジュールに下記の関数を定義
説明にもある通り、ブックを開いたときにメインになるシートに強制的に飛ばして
隠しておきたいシートを非表示設定にする。

ちなみに Visibleプロパティ だが下記のようになっているので間違えてfalseにしないように。

* true：表示
* false：非表示（非表示リストに出てくる）
* xlSheetVeryHidden（非表示リストにでてこない）

```vb:標準モジュール
' ------------------------------------------
' フックを開いたときのイベント
'   メインシートを強制的に表示する
' ------------------------------------------
Sub Auto_Open()
   Sheets("原価管理").Visible = xlSheetVeryHidden
   Sheets("予実管理").Activate
End Sub
```
## 手順2.非表示シートから離れた際のイベントを定義
非表示にしたいシートから離れるとそのシートをを非表示にする関数を非表示にしたいシートに追加します。

```vb:非表示シート(原価管理)
' -----------------------------------------------------
' 原価管理シートがアクティブでなくなったときのイベント
'   原価管理シートを非表示設定にする
' -----------------------------------------------------
Private Sub Worksheet_Deactivate()
    Sheets("原価管理").Visible = xlSheetVeryHidden
End Sub
```

## 手順3.ボタン押下時の遷移イベントを定義
ここまでで、非表示シートを非表示にする処理を入れたので、最後に表示する処理を追加する。
これはどこでも良いのですが、標準モジュールに入れておきます。

```vb:標準モジュール
' ------------------------------------------
' 原価管理ボタンが押されたときのイベント
'   原価管理シートを表示できるように設定して
'   アクティブ状態にする
' ------------------------------------------
Sub onClick_ToCost()
    If InputBox("パスワードを入力してください") <> PASSWORD Then
        MsgBox "パスワードが違います"
        Exit Sub
    End If
    
    Sheets("原価管理").Visible = xlSheetVisible
    Sheets("原価管理").Activate
    
End Sub

```
IE11で使用できないJavaScriptの記法

## 背景
何も気にせずJavaScriptを書いていたらIEで正しく動作しないものにいくつか当たったので、エラー内容とその修正方法を記録します。

## メソッド記法
### エラー内容
`SCRIPT1002: 構文エラーです。`

### 原因
```js
const question = {
  getAnswer() {
    console.log('回答だよ');
  }
}
```
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Method_definitions
メソッド定義の短い構文はIEでは使えない。

### 解決方法
```js
const question = {
  getAnswer: function() {
    console.log('回答だよ');
  }
}
```
`function`を省略しない。

## テンプレート文字列
### エラー内容
`SCRIOPT1014: 文字が正しくありません。`
### 原因
```js
const massage = `メッセージは${text}です。`
```
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Template_literals
バッククォートを使用した記法はIEではできない。

### 解決方法
```js

const message = 'メッセージは' + text + 'です。'
```

## for...of
### エラー内容
`SCRIPT1004: ‘:’ がありません。`
### 原因
```js
for (let answer of Answers) {
  console.log(answer);
}
```
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...of
for...ofを使った配列のループはIEではできない。
### 解決方法
```js
for (let i=0; i < Answers.length; i++) {
  const answer = Answers[i]
  console.log(answer);
}
```

## アロー関数
### エラー内容
`SCRIPT1002： 構文エラーです。`
### 原因
```js
element.addEventListener('click', () => {
  console.log('クリックされたよ');
};
```
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions
アロー関数でのfunctionの省略はできない。
### 解決方法
```js
element.addEventListener('click', function() {
  console.log('クリックされたよ');
};
```

## NodeListに対するforEach
### エラー内容
`SCRIPT438： オブジェクトは 'forEach' プロパティまたはメソッドをサポートしていません。`
### 原因
```js
element = document.querySelectorAll('.test');
element.forEach(function (item) {
  console.log(item);
};
```
https://developer.mozilla.org/ja/docs/Web/API/Document/querySelectorAll
`querySelectorAll()`メソッドは`NodeList`を返す。

https://developer.mozilla.org/ja/docs/Web/API/NodeList/forEach
IEではNodeListに対するforEachはサポートしていないのでエラーになる。

### 解決方法
```js
elementNodeList = document.querySelectorAll('.test');
// Arrayに変換している
element = Array.prototype.slice.call(elementNodeList, 0);
element.forEach(function (item) {
  console.log(item);
};
```
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
Arrayに対するforEachはIEでも使用できる。のでArrayに変換してからforEachを使用。


他にもいくつかの解決方法があるらしい。

- [IEで NodeList を forEach するとエラーになる問題の対処方](https://qiita.com/snjssk/items/8d179566b023703c0663)
- [NodeListをforEachしたいときのパターン](https://yuheiy.hatenablog.com/entry/2015/11/01/092356)

## まとめ
解決方法は一例です。
正しく動かない記法はまだまだあると思いますが、自分が使用した段階で追加します。
IEで正しく動かないJavaScriptについてのまとめ記事は探すとたくさん出てくるので、困った際はエラー文でググると、すぐに原因が見つけられると思います。

### 参考記事
- [注意！IE11で使えない最新JavaScritコード（ES6）](https://blog.capilano-fw.com/?p=1273)