OmniAICreator/Qiita-1.07M huggingface dataset:
Jenkinsのビルドが突然java.net.MalformedURLExceptionで落ちるようになった

# はじめに

JenkinsでGoで書かれたソースをビルドしているのですが、そのジョブが突然落ちるようになったので解決策を記載します。

~~この問題は、記載している時点(2020/07/01)で既に修正済み(リリース待ち)の状態です。
リリースまでの一時しのぎとして対応していますのでご注意ください。~~
現在は修正済みです。

# エラー内容

昨日(2020/06/30)あたりから、突然Jenkinsが以下の例外を吐いて落ちるようになりました。

```
java.net.MalformedURLException: no protocol: /dl/go1.11.2.linux-amd64.tar.gz
	at java.net.URL.<init>(URL.java:593)
	at java.net.URL.<init>(URL.java:490)
	at java.net.URL.<init>(URL.java:439)
	at org.jenkinsci.plugins.golang.GolangInstaller.performInstallation(GolangInstaller.java:57)
	at hudson.tools.InstallerTranslator.getToolHome(InstallerTranslator.java:69)
	at hudson.tools.ToolLocationNodeProperty.getToolHome(ToolLocationNodeProperty.java:109)
	at hudson.tools.ToolInstallation.translateFor(ToolInstallation.java:206)
	at org.jenkinsci.plugins.golang.GolangInstallation.forNode(GolangInstallation.java:44)
	at org.jenkinsci.plugins.golang.GolangInstallation.forNode(GolangInstallation.java:22)
	at org.jenkinsci.plugins.workflow.steps.ToolStep$Execution.run(ToolStep.java:152)
	at org.jenkinsci.plugins.workflow.steps.ToolStep$Execution.run(ToolStep.java:133)
	at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Finished: FAILURE
```

ググってみると以下のページがヒット。

https://issues.jenkins-ci.org/browse/JENKINS-62887

どうやらJenkins内でGoをインストールする際のURLが正しくないようです。
この修正は修正は完了していてリリース待ちの状態とのこと。とはいえ、実装したソースをすぐデプロイして確認したかったので、リリースまでの間取りあえず動く状態にします。

Jenkinsの管理 → Global Tool Configuration と遷移し、Goの設定を開きます。(`インストール済みGo...`のボタンをクリックします)
私は以下のようにGoを自動インストールする設定にしていたので、この自動インストール時に落ちていそうです。

<img width="1423" alt="スクリーンショット 2020-07-01 11.03.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56982/b2ff3516-77c7-57f4-5ecd-9e668302ef47.png">

よって、自動インストールを停止して、すでにインストール済みのGoのディレクトリを指定する形にして対処しました。
プラグインによって自動ダウンロードされたものは、`${JENKINS_HOME/tools/org.jenkinsci.plugins.golang.GolangInstallation`配下にインストールされているのでそれを指定します。

<img width="1401" alt="スクリーンショット 2020-07-01 11.12.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56982/abcf96ea-4109-fb1a-0370-c0c67688b150.png">

直近で他のバージョンのGoを新規インストールする予定はないのでこれで十分です。
UiPathでExcelを操作する（活用編 : Excelファイルが他人に開かれているか判定する)

#UiPathでExcelを操作する（活用編 : Excelファイルが他人に開かれているか判定する)

## 概要
UiPathでExcelのファイルが他の人に開かれているか判定する方法をご紹介します。
他の人が開いている場合、IsOnlyMe がFalseの値です。

## お約束事項（免責事項）
- この記事は2020年6月時点の情報を基に作成しております。
- 記事の内容は私個人の見解であり、所属する組織の公式見解ではありません。

## スキル
この記事には、C#によるカスタムアクティビティの開発が含まれます。
カスタムアクティビティの開発方法は、UiPath公式のドキュメントを参照ください。
（本記事では最低限のみ記載します。）
https://docs.uipath.com/activities/lang-ja/docs/creating-a-custom-activity

## 必要なソフトウェア
- Visual Studio
- Nuget または Nuget Package Explorer
- Microsoft Office


## 実装

```C#
using Microsoft.Office.Interop.Excel;
using System;
using System.Activities;
using System.ComponentModel;


namespace UiPathCustomLibrary
{
    public class UserStatus : CodeActivity
    {

        [Category("Input")]
        [RequiredArgument]
        public InArgument<Object> WorkbookApplication { get; set; }
        [Category("Output")]
        public OutArgument<Boolean> IsOnlyMe { get; set; }
        protected override void Execute(CodeActivityContext context)
        {
            // 引数(InArgument)より、WorkbookApplicationのオブジェクトを取得する
            // WorkbookApplicationの属性に必須（RequireArgument）を指定しているため、workbookappのnullチェックは不要
            object workbookapp = WorkbookApplication.Get(context);

            // WorkbookApplicationから、Microsoft.Office.Interop.Excel.Workbook型として（キャストして）、CurrentWorkbookを読み込む
            Workbook workbook = workbookapp.GetType().GetProperty("CurrentWorkbook").GetValue(workbookapp) as Workbook;

            // 型変換する 
            object[,] userStatus = (workbook.UserStatus as object[,]);

            // ブック共有のユーザ数を取得する
            int userCount = userStatus.GetLength(0);

            // ユーザ数が1の場合、自分自身のみとして判定する。
            // https://docs.microsoft.com/ja-jp/office/vba/api/excel.workbook.userstatus
            IsOnlyMe.Set(context,  userCount == 1);
        }
    }
}


```
MVCモデル + router(ルーター)

## 概要

MVCモデルとは、プログラムの処理を以下の3つの役割に分類して開発するモデル。

 - Model
 - View
 - Controller

それぞれの頭文字を取ってMVCモデルと呼ばれる。
router は 、MVCモデルではControllerの一部として考える事もできる。

※イメージ
![ITエンジニアホワイトボード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665389/9c8423ca-a88a-f729-76e7-80d4a67d05f0.jpeg)


## MVC +  router の役割

以下、それぞれの役割をまとめる。

### Model

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665389/fbf6d788-31bf-304f-a2bc-23b2e6da43ef.png" width="25%">


ビジネスロジック(=様々な処理を実際に実行するロジック)を担当。DBを操作する役割を担っている。

具体的には、

 - データをDBへ保存
 - DBからデータを取得
 - DBのデータの更新や削除

などの役割がある。基本的にDBを直接触るのはModelだけ。

データ処理(DBから取得したデータの変換など)を含む場合もあるが、DBを操作するイメージが強いため、Logicというディレクトリを作成してデータ処理のプログラムを切り離すこともある。

上司(Controller)からの司令を受けて走り回るパシリ的な役回り。

### View

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665389/f567e0aa-5567-4ddf-f8b6-a0281e817f82.png" width="25%">


ユーザーが実際に見る出面を担当。動的なサイト(ex. Twitter, ブログサイト, etc…)の出面を表すことが多い。表示や入出力を担っている。

 - Controllerから受け取ったデータ(レスポンス)を画面に表示
 - ユーザーからのリクエストをControllerへ送信

などを行ってる。ユーザーが触れられるのはViewだけ。

ユーザーの言うことを聞いたり上司(Controller)の指示に従ったりする受付の人。

### Controller

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665389/5bbeead2-4b0e-45fe-87ef-90ac597d62dd.png" width="25%">


ModelとViewを制御する司令塔を担当。ユーザーの入力に基づいてModelとViewに指示を出す。

 - Viewからリクエストを受け取ってModelに指示出し
 - Modelの処理を受け取ってViewへレスポンス

などを行う。

部下(ViewやModel)に指示を出すだけで自分は動かない上司。

### ルーター(router)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665389/548bb095-7d8d-e0a1-e842-36413b3df4aa.png" width="25%">


処理の振り分けを担当。httpアクセスが来たときにどのように処理するかを決めて適切なControllerにアクセスを流している。MVCモデルではControllerが受け取りもやるのでControllerに内包されているとも言える。

もしControllerとrouterを切り分けるとすれば

 - Viewからのリクエストを受け取って、適切なControllerに受け渡し

が主な役割になる。

Controllerを補佐する秘書のようなもの。

## 参考

 - https://qiita.com/s_emoto/items/975cc38a3e0de462966a
 - https://www.geekly.co.jp/column/cat-technology/1911_040/
 - https://snome.jp/framework/mvc-model/
 - https://rails-study.net/mvc-r/
 - https://qiita.com/right1121/items/cd19cbf36f91c057658a
 - https://qiita.com/Ken_Fujimoto/items/e852cb7a4a656c711e98
読書要点「プリンシプルオブプログラミング」第6章

# 手法

高度な知的作業であるプログラミングで重要になるのは脳のリソースの分散である。
この項目には問題解決の手法、あるいは問題を未然に防ぐための道具が詰まっている。

### 曳光弾

曳光弾とは、通常弾の間に装填された軌跡の分かる弾丸である。
狙いを修正するのに役立つ。
プログラミングにおける曳光弾とは、優先的に検証したい部分を先行的に作ることである。
すなわち、最初に動作する土台を作ることである。

完成品の制度を高めるためには、開発の途中でできるだけ多くのフィードバックを得ることが重要である。
完成品の形態が見えない中でこれを達成するためには、曳光弾のアプローチが有用となる。
根幹となる部分を作っておけば、完成図を意識した開発が進められる上、クライアントからの意見をもらいやすい。

### 契約による設計

関数を呼び出す側が守るべき契約と、関数が守るべき契約を設定してプログラミングをすることを契約による設計と呼ぶ。
呼び出す側は関数を使うために必要な条件を用意しておき、関数側は受け取った入力に対して正しい引数を渡す必要がある。
関数の関係を整理することができ、シンプルさや保守の容易さにつながる。

契約の内容はあらかじめコメントで伝えておき、契約が果たせるか、果たせているかどうかはアサーションを使ったチェックを行う。

### 防御的プログラミング

自動車の防御運転、「かもしれない運転」と同じ姿勢でプログラミングを行う。
問題のあるやり取りが発生したときに被害を未然に防ぐコードを書く。
想定内のエラーはもちろん、想定外のエラーが発生したときに問題を波及させないチェックが必要になる。
厳重なチェックを行うためには、バリケードとクリーンルームを設定し、クリーンルームにチェックを行っていないものを入れないようにするとよい。

### ドッグフーディング

ソフトウェアを自ら使用するようにする。
ユーザー視点だからこそ得られる問題点、改善点、使い勝手の良し悪しは少なくない。
開発側がユーザー視点でソフトウェアに必要なものを把握できることは大きなアドバンテージである。

### ラバーダッキング

ラバーダッキングは、誰かに現在発生している問題を説明することである。
デバッグの一種ともいえる方法で、実際に説明をするだけで問題点が整理され、解決してしまう場合も少なくない。
アドバイスを貰わなかった場合でも説明するだけで十分な高価が得られるため、安価で高価の高い手法である。

### コンテキスト

コンテキストとは文脈のことである。
コードを書くときは、読む人のことを考えて文脈のあるコードを書くようにする。
思考の際も、文脈をおさえることで問題点の整理につながり問題解決にたどり着きやすい。
作業しているときはコンテキストを見失うことも少なくないが、常にコンテキストを自分の中で示しておくことでスマートな作業につながる。
meta-learningのベンチマークデータセットを簡単にloadできるtorchmetaについて

# はじめに
MNISTやCIFAR10といった画像分類タスクのベンチマークデータセットはtorchvisionで簡単に読み込むことができました。

meta-learningのベンチマークとして用いられるOmniglotやMiniImageNetなどのデータセットに対してもこのようなものはないのかと思い調べていたところtorchmetaというライブラリに出会ったのでご紹介することにしました。

meta-learningにおいては通常の学習に比べdataloaderの設計が少し面倒なのですが、それもtorchmetaではうまいことやってくれるので非常に便利です。

# meta-learningについて
ここではN-way K-shotのfew-shot learningにmeta-learningを用いるケースを考え簡単にmeta-learningについてご紹介します。
N-way K-shotのfew-shot learningとは、まず大規模な学習データセットでモデルを学習して、学習後に学習データに含まれていなかった新たなN-classの画像について各classについてK枚ずつの画像のみから再学習しN-class分類器を学習する問題です。通常はK=1やK=5とする場合が多く、少ない画像で学習することになります。

ここからはこれに対してmeta-learningを応用する手順について話します。
データセットはtrain setとtest setに分割します。
学習時にはデータはtaskと呼ばれる塊で管理し、taskにはN*K枚のmeta-train dataとQ枚のmeta-test dataが含まれています。meta-trainとmeta-testは共にtrain setからサンプリングされます。

各taskではN*K枚のmeta-trainで学習しQ枚のmeta-testで評価し、meta-test時の勾配を用いてmodelのパラメータを更新します(ここら辺は手法によって若干異なる場合があるのであくまでイメージだと思っていただければと思います)。
これを複数のtaskに対し繰り返すことで、N*K枚の画像から学習する方法を学習するという感じになります。

例えばOmniglotという手書き文字データセットは50の言語の計1623文字のデータセットになっており、各文字がclassに対応しています。これは日本語の「あ」「い」「う」などがそれぞれ1つのclassになっているということです。各classには20枚ずつ画像が含まれています。
この画像で学習する際には1623文字から例えば1100文字をtrain setに振り分け、各taskにおいて1100文字の中からN文字をランダムに選び、N*K枚の画像で学習するという流れになります。

# torchmeta
ここから本題の[torchmeta](https://pypi.org/project/torchmeta/#description)の話に移りたいと思います。
torchmetaはOmniglotやMiniImageNetといったデータセットの読み込みだけでなく、上記のようなtaskをサンプリングするdataloaderを提供しています。

インストールは簡単で

```zsh
pip install torchmeta
```
とやればできます。

例えば5-way 5-shotでMiniImageNetを読み込みたい場合は

```python

from torchmeta.datasets.helpers import miniimagenet
from torchmeta.utils.data import BatchMetaDataLoader

dataset = miniimagenet("data", ways=5, shots=5, test_shots=15, meta_train=True, download=True)
dataloader = BatchMetaDataLoader(dataset, batch_size=1, num_workers=4, shuffle=Flase)
```
とするとdataloaderができます。実際に学習する際にはミニバッチで学習するのでBatchMetaDataLoaderによってバッチを作成しています(ここではバッチサイズを1としています)。
また実際の学習時にはshuffle=Trueとすべきですが、ここでは後ほど5-way 5-shotでデータが読み込まれていることを確かめるためにFalseとしています。

データの取り出しは

```python
dataiter = iter(dataloader)
data = dataiter.next()
train_images, train_labels = data['train']
```
とすることででき、ここで取り出されたtrain_imagesの形状は[1, 25, 3, 84, 84]となっています(第一次元がbatch数、第二次元がtaskに含まれる画像の枚数N*K、第三次元が画像のチャンネル数、第四次元、第五次元が画像の縦横のピクセル数)。

```python
import numpy as np
import matplotlib.pyplot as plt
import torchvision

def imshow(img):
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1,2,0)))
    plt.show()

imshow(torchvision.utils.make_grid(train_images[0]))
```

とすると先ほど取り出した画像が次のように表示されます。
![5way5shot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359175/59d33edc-3538-9a50-f300-1dd7026037b2.png)
左上から順番に5枚ずつ同じclassに含まれる画像が取り出されていることがわかるかと思います(一部よくわからない画像もありますが)。

# 終わりに
[公式の紹介記事](https://pypi.org/project/torchmeta/#description)と[GitHub](https://github.com/tristandeleu/pytorch-meta)を参考に動かしてみてとりあえず最低限学習に使えそうな状態にはこれたので紹介記事を書かせていただきました。
GitHubの中にドキュメントも用意されているみたいなので、そちらも併せて参照されると良いと思います。
またmeta-learningについてはかなり緩く書いてしまったので、何かあればご指摘いただけたらと思います。
git clone 前にリモート先の HEAD を取得して確認したい

> **`git clone` を実行する前**に、リモート先（リポジトリ URL 先）の `HEAD`（現在の最新コミット・ハッシュ値）を取得したい。

[「git clone リモート先の HEAD 取得 確認」でググって]()もドンピシャのタイトルの記事がなかったので、自分の備忘録のググラビリテとして。

## TL; DR

> `git` の **`ls-remote` コマンドで、リモート先の諸情報を得られます**。例えば、ヘッダー情報は `--heads` オプション。

```bash:ロング・オプション
git ls-remote --heads [ リポジトリのURL ]
```
```bash:ショート・オプション
git ls-remote -h [ リポジトリのURL ]
# URLが指定されていない場合はヘルプ表示になるので注意
```

```shell-session:使用例
$ git ls-remote --heads https://github.com/KEINOS/TPL-PHP-HelloWorld.git
b05c14a0ee5651990eec41e6bd397a19726d9440        refs/heads/master
```

## TS; DR

[Travis](https://travis-ci.org/) CI／[Circle](https://circleci.com/ja/) CI／[GitHub Actions](https://github.co.jp/features/actions) といった [CI](https://ja.wikipedia.org/wiki/%E7%B6%99%E7%B6%9A%E7%9A%84%E3%82%A4%E3%83%B3%E3%83%86%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3) の実行処理で、いくつかのリポジトリを `git clone` する必要がありました。

ローカルではなく、CI の処理上で各々のリポジトリを `clone` し、必要なデータをコピー＆マージしてから[デプロイ](https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%83%A1%E3%83%B3%E3%83%88)（リリース）する必要があったからです。特に `cron` などでスケジュール実行される[自動化されたデプロイ](https://ja.wikipedia.org/wiki/%E7%B6%99%E7%B6%9A%E7%9A%84%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%83%A1%E3%83%B3%E3%83%88)です。

しかし、各々のリポジトリのサイズが大きいため、**対象のリポジトリに変更があった場合のみ** `clone` するように限定したいのです。そのため、最終コミットのハッシュ値（`HEAD`）を比較するのが合理的です。

`git pull` など `clone` 済みの場合のヘッダを確認する記事は多いのですが、`git clone` 前にヘッダを取得する記事がなかなか見つからず。`git` の公式ドキュメントを読み<ruby>漁<rt>あさ</rt></ruby>ってたらドンピシャの情報がありました。

> **NAME**
> git-ls-remote - List references in a remote repository
> <sup>（git-ls-remote - リモートリポジトリの参照情報を表示する）</sup>
> 
> **SIMPSONS**
>
> ```bash:構文
> git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]
>               [-q | --quiet] [--exit-code] [--get-url] [--sort=<key> ]
>               [--symref] [<repository>[<refs>…​] ]
> ```
> 
> **DESCRIPTION**
> Displays references available in a remote repository along with the associated commit IDs.
> <sup>（関連するコミットIDとともに、リモートリポジトリで利用可能な参照情報を表示します）</sup>

- [git-ls-remote](https://git-scm.com/docs/git-ls-remote.html) | Document @ Git
Seleniumでnavigator.webdriverの対策をしてアクセスする

# enable-automationとかuseAutomationExtensionは期待通りの動作しなかった

とある理由でスクレイピングしたいけど、`navigator.webdriver=true`なブラウザだとNGなサイトだった。
対応したい。できるらしいので。
参考：[navigator.webdriver=trueだとロボットだとバレる。その回避法はあるか？puppeteerなら出来そう
](https://cfautog.tokyo/2020/03/04/navigator-webdriver-delete/)
でもSelenium使っているしpuppeteer使ったことないし、どうにかできないものか。。

## 動かなかったときの設定

どうやらSeleniumでもできるらしい記事をいくつか見つけた。

参考1：https://stackoverflow.com/questions/53039551/selenium-webdriver-modifying-navigator-webdriver-flag-to-prevent-selenium-detec

参考2：https://help.applitools.com/hc/en-us/articles/360007189411--Chrome-is-being-controlled-by-automated-test-software-notification

やってみた。

```rb
    capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
      accept_insecure_certs: true,
      chromeOptions: {
        args: [
          '-window-size=1920,1080',
          '--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
        ],
        excludeSwitches: ['enable-automation'], # 追加
        useAutomationExtension: false # 追加
      }
    )
    driver = Selenium::WebDriver.for(
      :remote,
      url: 'http://chrome:4444/wd/hub',
      desired_capabilities: capabilities,
      http_client: Selenium::WebDriver::Remote::Http::Default.new
    )
```

実際に動かしてみてもtrueが帰ってくる。ダメだった。

```rb
driver.execute_script('return navigator.webdriver')
>>> true
```

## 動いた設定
`enable-automation`とか`useAutomationExtension`は削除。
今まで通りにdriverを設定。

```rb
    capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
      accept_insecure_certs: true,
      chromeOptions: {
        args: [
          '-window-size=1920,1080',
          '--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
        ],
      }
    )
    driver = Selenium::WebDriver.for(
      :remote,
      url: 'http://chrome:4444/wd/hub',
      desired_capabilities: capabilities,
      http_client: Selenium::WebDriver::Remote::Http::Default.new
    )

    # 以下を追加
    driver.execute_script('const newProto = navigator.__proto__;delete newProto.webdriver;navigator.__proto__ = newProto;')
```

実際に動かすとundefinedが帰ってくる。
puppeteerと似たような動作する。
良かった。

```rb
driver.execute_script('return navigator.webdriver')
>>> undefined
```
UiPathでExcelを操作する（活用編 : ブック共有のExcelファイルか判定する)

#UiPathでExcelを操作する(活用編: ブック共有のExcelか判定する)

## 概要
UiPathでExcelのファイルがブック共有されているか判定する方法をご紹介します。
ブックが共有リストとして開かれている場合、IsMultiUserEditがTrueの値です。

## お約束事項（免責事項）
- この記事は2020年6月時点の情報を基に作成しております。
- 記事の内容は私個人の見解であり、所属する組織の公式見解ではありません。

## スキル
この記事には、C#によるカスタムアクティビティの開発が含まれます。
カスタムアクティビティの開発方法は、UiPath公式のドキュメントを参照ください。
（本記事では最低限のみ記載します。）
https://docs.uipath.com/activities/lang-ja/docs/creating-a-custom-activity

## 必要なソフトウェア
- Visual Studio
- Nuget または Nuget Package Explorer
- Microsoft Office


## 実装

```C#
using Microsoft.Office.Interop.Excel;
using System;
using System.Activities;
using System.ComponentModel;


namespace UiPathCustomLibrary
{
    public class MultiUserEditing : CodeActivity
    {

        [Category("Input")]
        [RequiredArgument]
        public InArgument<Object> WorkbookApplication { get; set; }
        [Category("Output")]
        public OutArgument<Boolean> IsMultiUserEdit { get; set; }
        protected override void Execute(CodeActivityContext context)
        {
            // 引数(InArgument)より、WorkbookApplicationのオブジェクトを取得する
            // WorkbookApplicationの属性に必須（RequireArgument）を指定しているため、workbookappのnullチェックは不要
            object workbookapp = WorkbookApplication.Get(context);

            // WorkbookApplicationから、Microsoft.Office.Interop.Excel.Workbook型として（キャストして）、CurrentWorkbookを読み込む
            Workbook workbook = workbookapp.GetType().GetProperty("CurrentWorkbook").GetValue(workbookapp) as Workbook;

            // ブック共有の状況を返す
            // https://docs.microsoft.com/ja-jp/office/vba/api/excel.workbook.multiuserediting
            IsMultiUserEdit.Set(context, workbook.MultiUserEditing);
        }
    }
}


```
bitとかbyteとかメモる

65535なんかの数字にピンとこないと、プログラマとして「あっ...察し」って思われそうなのでまとめる。


# bit, Byte

- 1Byte = 8bit = 0~255
- 2Byte = 16bit = 0~65535
- 3Byte = 16bit = 0~16777215

KB, MBとの換算は[これ](https://mathwords.net/kbmb)を参考に


# 1文字は何バイトか？
[参考](https://wa3.i-3-i.info/word16700.html)によると

- 半角文字：1バイト
- 全角文字：2バイトとか3バイトとか4バイトとか

# MySQLとbyte

## varchar型

- 65535 byte が上限 ※
- すなわち**半角文字**で65535byte=65535文字まで収納可能

※ つまり、１つの値あたり、64KBの容量を占有する。

## text型

無字数無制限
Windowsに入れられる好きなフォントとターミナル、シェル

# Dockerが普通に使える
Windows 10 May 2020 Update適用後のWindowsであればHome/Pro関係なくDocker Desktop for Windowsが使えます。

詳しくはこちら。
https://qiita.com/Denpa_Ghost/items/caeddaa29bd9d7514cce

# Powershell v7
オープンソースでクロスプラットフォームなPowershellの最新版。
Windowsでshellを使うならコマンドプロンプトよりベターだと思います。

GitHubからインストーラをダウンロードできます
[Releases · PowerShell/PowerShell](https://github.com/PowerShell/PowerShell/releases)

# Windows Terminal
複数のバージョンのPowershellやコマンドプロンプトを使い分けられるターミナルアプリ。
これ自体にshellは含まれていないクライアントという感じ。

タブを複数開けたり、色々設定できたりして便利そうです。

GitHubからインストーラをダウンロードできます。
[Release Windows Terminal v1.0.1401.0 · microsoft/terminal](https://github.com/microsoft/terminal/releases/tag/v1.0.1401.0)


# Cascadia Codeフォント
MIcrosoftお手製のリガチャー（合字）フォント。`->`が`→`みたいにくっついたりしてくれます。
まぁまぁ見やすい。ちょっと線幅が太目な感じがします。

GitHubからダウンロードできます。
[Releases · microsoft/cascadia-code](https://github.com/microsoft/cascadia-code/releases)

# JetBrains Monoフォント
JetBrains MonoフォントがJetBrains製IDEではもともと採用されるようになったのでCascadia Codeをわざわざ用意する必要がなくなってしまった...
こちらもリガチャーフォントです。

GitHubからダウンロードもできますが、JetBrains製品のみで使える状態でバンドルされてます。
[Releases · JetBrains/JetBrainsMono](https://github.com/JetBrains/JetBrainsMono/releases)
varとletとconstの違いメモ

自分的なメモです。
varとletとconstの違いを説明してみろと言われた時のための

* varはES6より前で使われていた宣言方法。
* letとconstは、ES6から採用された、新しい宣言方法。

#再宣言、再代入に関する違い

###var

再宣言、再代入が可能。

```javascript

//再代入できる
var hoge = 'りんご';
hoge = 'みかん';

console.log(hoge); // 結果：みかん

// 同じ変数名を使って別のデータを再宣言できる
var hoge = 'すいか';

console.log(hoge); // 結果：すいか

```

###let

letは代入し直すことはできるけど、同じ変数名を使って別のデータを再宣言するとエラーが出る。

```javascript

// 再代入できる
let hoge = 'りんご';
hoge = 'みかん';

console.log(hoge); // 結果：みかん

let hoge = 'すいか';

console.log(hoge); // 結果：シンタックスエラー

```
再宣言はできないので

`Uncaught SyntaxError: Identifier 'hoge' has already been declared`
っていうシンタックスエラーが出ますよ

###const

constは変数の中でも一番厳格で、再代入も再宣言もできない。constのことを変数ではなく「定数」と定義する場合もある
一度しか代入できないので、長いプログラムを書いた時に変数名が被らない。

```javascript

// 再代入できる
const hoge = 'りんご';
hoge = 'みかん';

console.log(hoge); // 結果：シンタックスエラー

const hoge = 'すいか';

console.log(hoge); // 結果：シンタックスエラー

```

こちらもシンタックスエラー
`Uncaught SyntaxError: Identifier 'hoge' has already been declared`
が出ます


# スコープの違い

var,let,contはそれぞれ影響範囲（スコープ）が異なります。

###varの場合

関数スコープなので、関数の外にある変数に格納されているデータを関数内で出力することができません。

```javascript
var hoge = 'りんご';
console.log(hoge); // 結果：りんご

function fugafuga(){

  console.log(hoge); // 結果：エラー
  
  var hoge = 'みかん';
  console.log(hoge); // 結果：みかん
}
fugafuga();
```

###letの場合

* 関数の外から呼び出すことは可能。外から呼び出した値を上書きすることもできる。
* だけど再宣言は禁止されているのでエラーがでる
* if{}やfor{}内で宣言したらその中でしか使用できなくなるブロックスコープなので、影響範囲が少なくなる

```javascript
let hoge = 'りんご';
console.log(hoge); // 結果：りんご

function fugafuga(){

  console.log(hoge); // 結果：りんご

  hoge = 'みかん';
  console.log(hoge); // 結果：みかん
  
  let hoge = 'みかん';
  console.log(hoge); // 結果：Uncaught ReferenceError: Cannot access 'hoge' before initialization 

}
fugafuga();
```

###constの場合
* 関数の外から呼び出すことは可能。
* 再代入もできず再宣言もできないのでエラーがでる。より厳格に定数内に収められた値を扱うことができる。
* if{}やfor{}内で宣言したらその中でしか使用できなくなるブロックスコープなので、影響範囲が少なくなる

```javascript
const hoge = 'りんご';
console.log(hoge); // 結果：りんご

function fugafuga(){

  console.log(hoge); // 結果：りんご

  hoge = 'みかん';
  console.log(hoge); // 結果：Uncaught TypeError: Assignment to constant variable. 
  
  const hoge = 'みかん';
  console.log(hoge); // 結果：Uncaught ReferenceError: Cannot access 'hoge' before initialization  

}
fugafuga();
```

とりとめのない感じになったけど、頭の中では整理できたので良しとする。
結論としては、今後はvarできるだけ使わないほうが良いよということでしょうか。以上です。
metabase環境構築メモ

#環境構築に手間取る
AWSにmetabaseを導入する場合、ElasticBeanstalkが推奨となっており、QuickLaunchも用意されていたにもかかわらず、構築に少し手間取りました。基本的には初期値で設定されているので、必要最低限の部分を自社の環境に合わせることで利用可能となります。ここでは注意点だけ記載します。

公式サイト：
https://www.metabase.com/docs/v0.35.4/operations-guide/running-metabase-on-elastic-beanstalk.html#running-metabase-on-aws-elastic-beanstalk

#QuickLaunchでElasticBeanstalkに環境構築する際の注意点

###リージョンの確認
初期値は"バージニア北部"が選択されます。
適切なリージョンを選択し直しましょう。
![2020-07-01_09h30_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359386/e2e4d1ae-a564-3a25-1420-5195514eff2c.png)

###ソースコードの事前ダウンロード
ソースコードをS3に公開してくれているのですが、初期値で設定されているURLを指定しても、リージョンが違うという理由でダウンロードできません。
![2020-07-01_09h33_021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359386/b1a717a1-d47d-31c0-c6c0-6808b7c8cfb8.png)

###初期値のURLからもダウンロードできない
初期値に設定してあるS3のURLから先にソースコードをダウンロードしようとすると、証明書エラーとなりダウンロードできません。HTTPにすることでダウンロードできますので、ローカルに保存しておきます。

× https://downloads.metabase.com.s3.amazonaws.com/v0.35.4/metabase-aws-eb.zip
○ http://downloads.metabase.com.s3.amazonaws.com/v0.35.4/metabase-aws-eb.zip

###ソースコードをローカルからアップロードする
先程ダウンロードしたソースコードをローカルファイルからアップロードします。
ソースコードがアップロードされたことを確認したら「確認して起動」ボタンを押します。
![2020-07-01_09h46_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359386/385fa801-06ed-3459-22e2-020530521a21.png)

#おわりに
以後は公式サイトの案内に従うことで設定可能でした。あとは自社の環境に合わせての設定となります。また機会があれば続きも書きます。
【cygwin】nkfをインストール

# ダウンロード

以下のページから最新の「nkf-2.1.5.tar.gz」をダウンロード

https://ja.osdn.net/projects/nkf/releases/

# インストール

```
$ cd src
$ tar xvzf nkf-2.1.5.tar.gz
$ cd nkf-2.1.5
$ make
$ make install
```

# makeの実行結果

```
$ make
cc -g -O2 -Wall -pedantic -c nkf.c
関数 ‘get_backup_filename’ 内,
    inlined from ‘main’ at nkf.c:7164:28:
nkf.c:1035:3: 警告: ‘strncat’ output truncated before terminating nul copying as many bytes from a string as its length [-Wstringop-truncation]
 1035 |   strncat(backup_filename, filename, filename_length);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
nkf.c: 関数 ‘main’ 内:
nkf.c:1024:27: 備考: length computed here
 1024 |     int filename_length = strlen(filename);
      |                           ^~~~~~~~~~~~~~~~
cc -g -O2 -Wall -pedantic -c utf8tbl.c
cc -g -O2 -Wall -pedantic  -o nkf nkf.o utf8tbl.o
```

# make installの実行結果

```
$ make install
mkdir /usr/local/bin
mkdir: ディレクトリ `/usr/local/bin' を作成できません: File exists
make: [Makefile:49: install-main] エラー 1 (無視されました)
cp -f nkf /usr/local/bin/
mkdir /usr/local/man
mkdir /usr/local/man/man1
cp -f nkf.1 /usr/local/man/man1/
mkdir /usr/local/man/ja
mkdir /usr/local/man/ja/man1
cp -f nkf.1j /usr/local/man/ja/man1/nkf.1
```

# 4. 追加インストールしたcygwinパッケージ

- make
- gcc-core
Dockerでsar実行する際につまづいたこと

# 結論、cronをinstallしたら解決した
dockerにsarコマンドをinstallして、計測間隔を設定、"vi /etc/default/sysstat"でfalseをtrueに変更しても動かなかったが、cronがそもそもinstallされていなかったことが原因でした。

## 設定フロー

### apt-get のupdate
```
apt-get update
```

### cronのinstall
```
apt-get -y install cron
```
### sysstat(sar)のinstall
```
apt-get install sysstat -y
```
### 計測を許可
```vim
vim /etc/default/sysstat
```
ENABLED="false"
　　↓
ENABLED="true"

### 10分間隔を1分間隔にした。
vim /etc/cron.d/sysstat

### サービス起動
```
service cron start
/etc/init.d/sysstat start
```

### サービス起動確認
```
service cron status
service sysstat status
```

### 計測されていること確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155984/610eed16-ac84-f011-56f6-686cf06e70ca.png)
Docker基本コマンド集

![docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/3ad2e49d-616f-74a6-3b6f-4acdb92c542d.png)

#Dockerとは

Dockerとは、コンテナ技術を使い、アプリケーション開発・実行をするためのプラットフォームです。詳細は[What is Docker?](https://www.docker.com/why-docker)をお読みください。

**Dockerプラットフォーム**

- [Docker Engine](https://www.docker.com/get-started)
- [Docker Hub](https://hub.docker.com/)
- [Docker Registry](https://docs.docker.com/registry/)
- [Docker Machine](https://docs.docker.com/machine/overview/)
- [Docker Swarm](https://docs.docker.com/engine/swarm/)
- [Docker Compose](https://docs.docker.com/compose/)
- [Kinematic](https://kitematic.com/)

#コンテナとは

コンテナとは、ホストOS上にアプリケーションの起動に必要な**アプリケーション本体**、**必要なライブラリ**、**設定ファイル**などをひとまとめにした「コンテナ」を作成し、「コンテナエンジン」上で動作させる技術のことです。

仮想化技術と似ていますが、仮想マシンに比べて少ないリソースでのアプリケーション実行が可能となるため、メモリやCPUリソースを余分に使うことがありません。

新しい技術なのでプログラミング初心者には学習コストが高いですが、扱えるようになればこんなに便利なものはありません。

Dockerを使うメリット／デメリットは以下の通り。

| メリット                  | デメリット                                                       |
|:-------------------------|:----------------------------------------------------------------|
| 処理が軽量                | 複数のホストでのコンテナ運用が煩雑になる                            |
| 環境構築の手間が省ける     | カーネルを他のコンテナと共有するため、個別に変更できない              |
| DevOpsと相性が良い        | コンテナ環境でベースとなるOSと異なるOSのシステムを動かすことはできない |

※DevOps：開発チームと運用チームが協力しあって開発・運用を進めていく手法

#Dockerの基本コマンド一覧

##イメージ作成

カレント・ディレクトリ内のDockerfileをビルドしてイメージを作成する。

```
$ docker build ./
```

ビルドを最初からやり直す。

```
$ docker build --no-cache .
```

##コンテナ作成

イメージからコンテナを作成する

```
$ docker create イメージ名
```

イメージからコンテナを起動・接続する

$ docker run -it イメージ名 bash

##確認

イメージを確認する。

```
$ docker images
```

起動中コンテナの一覧を表示する。

```
$ docker ps
```

起動中コンテナのIDのみを表示する。

```
$ docker ps -q
```

ポートフォワードの関係性を確認する。

```
$ docker port コンテナ名
```

##操作

ホストの/var/wwwをコンテナ内の/var/htmlからアクセスできるように共有する。

```
$ docker run -it -v /var/www:/var/html イメージ名 bash
```

ホスト8080番portへの通信をコンテナ80番portへ転送する。

```
$ docker run -it -p 8080:80 イメージ名 bash
```

##停止

コンテナを停止する。

```
$ docker stop コンテナID
```

起動中コンテナをすべて停止する。

```
$ docker stop $(docker ps -q)
```

コンテナを再起動する

```
$ docker restart コンテナ名
```

##削除

コンテナを削除する。

```
$ docker rm コンテナ名
```

イメージを削除する。

```
$ docker rmi イメージ名（またはイメージID）
```

##DockerHub

イメージをpullする。

```
$ docker pull ユーザー名/リポジトリ名
```

イメージをpushする。

```
$ docker push ユーザー名/リポジトリ名
```
【Windows】システムファイルチェッカーツール

#システムファイルチェッカーでの修復

コマンドプロンプトを [管理者として実行] で起動し以下コマンドを実行

```console:WindowsUpdateでの修復
DISM.exe /Online /Cleanup-image /Restorehealth
```

```console:システムファイルチェッカーでの修復
sfc /scannow
```

# 参考
[Microsoft:システムファイルチェッカーツールを使用して不足または破損しているシステムファイルを修復する](https://support.microsoft.com/ja-jp/help/929833/use-the-system-file-checker-tool-to-repair-missing-or-corrupted-system)
AWS初心者がAWS 認定ソリューションアーキテクト アソシエイトを取得するまで

どうもAWS初心者のくせにAWS使用率100％の会社に転職したSATO論外です！
この度AWS初心者だった私ですがなんとかAWS認定ソリューションアーキテクトアソシエイトに合格することができました！！
その時に使用した勉強法と対策について簡単ですが紹介しようかと思います

# 使用した教材  
 - Udemyの教材  
   - [これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）](https://www.udemy.com/course/aws-associate/)
   - [【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)
 - 書籍
   - [徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E2%80%93-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8/dp/4295005495/ref=asc_df_4295005495/?tag=jpgo-22&linkCode=df0&hvadid=295658337340&hvpos=&hvnetw=g&hvrand=7945767638960917940&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009283&hvtargid=pla-595366187700&psc=1&th=1&psc=1)

# 勉強時間
 - 学習期間：約一ヶ月(業務中でのAWS操作は除く)  
 ※ただし勉強できない日などもあったので学習期間2週間ほどあれば取れそうな感触がありました

# やったこと
- 前半1周目〜3周目：Udemyのアソシエイト試験突破講座を一通り流してみる  
   - 概要の説明をうける&ハンズオンで実際にサービスを触りながらサービスを覚えていくことに集中する
   - 各セクション毎に小テスト(サービスの概要レベル)があるので全問正解できるまで挑戦  
- 後半4周目〜：アソシエイト試験突破講座に付属している模擬試験にチャレンジ  
   - ひたすら模擬試験にチャレンジ！最初の方は全然点数が取れないので試験結果を見て理解が不足しているサービスの概要動画だけUdemyで確認  
   - 合間合間でアソシエイト教科書をペラペラめくる
- 試験2日前：アソシエイト試験突破講座に付属している模擬試験と別で買ったアソシエイト模擬試験問題集をひたすら再復讐  
   - アソシエイト試験突破講座に付属している模擬試験は90点以上取れるようになるまで繰り返し解く  
     - 模擬試験後に各問題の回答・解説と出てきたサービスについての概要が見れるのでひたすら正解するまで繰り返す
   - アソシエイト模擬試験問題集の通常問題は上記同様に90以上取れるまでくりかえして、高難易度問題については間違えた箇所の解説を読み込む

# 使用した教材の良かった点・悪かった点
- Udemyの各教材について
 - 良かった点  
     - SAAで知る必要があるサービスやユースケースについてわかりやすく解説してくれる
     - ハンズオンを行いながら学習できるので実際の操作方法を理解しながら学べる
     - **SAA-C02(新バージョン)に対応している**
     - 模擬試験が付属&別途販売しているので不足している知識がわかりやすく復讐もしやすい
     - アソシエイト模擬試験問題集を購入すれば高度な内容まで理解できる
 - 悪かった点  
     - ハンズオンを含めると22.5 total 時間かかるため時間がない時は難しい
     - 実際にサービスを動かせる環境が必要(ハンズオンを省く場合は不要)
     - 買うタイミングを間違えるとかなり割高(通常時だと12,000円しますので割引タイミング(1600円ぐらいで買える)を狙って買った方が良いです)
- アソシエイト教科書について
 - 良かった点 
     - 各サービスについての説明などが乗っており概要を理解するにはちょうど良い
 - 悪かった点  
     - サービスの実際の使い方などは理解できない
     - **SAA-C02(新バージョン)に対応していないので古い記述が一部ある**

# 学習を振り返ってみて
現状販売している書籍などはどうしても**SAA-C02(新バージョン)**に対応していないため、Udemyの教材の方に力を入れました
ただし、サービスの種類や概要を抑えるレベルであればアソシエイト教科書で補えるかと思います
主軸をUdemyにおいてサブツール的にアソシエイト教科書を使うのが良いと感じました

また最後に総復讐として模擬試験を行い、解説を読み込むことがサービスを理解するのに大いに役立ちます
※ただし、試験問題＝模擬試験内容と言うわけではないのでキーワードだけで覚えるのはあまりおすすめしません

試験の内容的には各サービスを使うべきタイミングを覚えておくのが良いかと思います(EBSのボリュームタイプとかS3でどのストレージタイプをコスト面・パフォーマンス面など考えて使うべきなどの問題が出てきます)

# 追加でこれをやっておくとさらに合格率が上がりそう
 - 主要なサービスのAWSブラックベルトを確認する(概要類)
 - 時間とお金に余裕があればAWSの模擬試験を受けてみる
【HTMLのみでOK】class/id必要なしの超手軽で軽量なCSSを利用する

# はじめに
「bootstrap」に代表されるCSSフレームは、とても便利ですので利用してきました。普段から使い倒しており、もう身についた、という方であれば問題ないと思いますが、たまにしか使わない私のようなものにとっては、指定するclassを調べながら指定していくのは少々面倒だな、と思っていました。（簡単なHTMLを作成するときなどは、特にそう思いました）

classやidを指定しなくてもよい方法があるということを知りましたので試してみました。
**classless CSS framework** というそうです。

**用意するのはHTMLのみで、class/idの指定は必要ありません。とにかく簡単で、HTMLのheadタグに1行追加するだけでいい感じにしてくれます。**

- **①new.css**

https://github.com/xz/new.css

- **②mvp.css**

https://andybrewer.github.io/mvp/


# ①new.css

#### 追加するコード

~~~ sample.html
<head>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@exampledev/new.css@1/new.min.css">
</head>
~~~

デモサイト

https://newcss.net/demo/

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/59e05601-acc6-aea5-bac9-01e427ad9872.png)

npm/yarnにも対応している。

`npm i @exampledev/new.css`
`yarn add @exampledev/new.css`

また、テーマもありナイトモードやターミナルモードがあり、爆速で変更・適用が可能。

- ナイトテーマを適用

~~~ samle.html
<head>
  <link rel="stylesheet" href="https://newcss.net/theme/night.css">
</head>
~~~

- ターミナルテーマを適用

~~~ sample.html
<head>
  <link rel="stylesheet" href="https://newcss.net/theme/terminal.css">
</head>
~~~

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/b4e705a1-d732-9a46-db79-a2d7540c50fc.png)

# ②mvp.css

#### 追加するコード

~~~sample.html
<head>
  <link rel="stylesheet" href="https://unpkg.com/mvp.css">
</head>
~~~

デモサイト

https://andybrewer.github.io/mvp/

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/b3ea6b6f-5480-ff60-091e-c1efd897d119.png)

サンプルサイトはこちら

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/3d1f8752-5279-9a7b-aa69-1744230d5435.png)

# まとめ
- classless CSS frameworkは、簡単なHTMLでスタイルを整えたい場合、とても便利だと思いましたので、積極的に使っていきたいなと思いました。



# おまけ
CSSフレームワークを適用して確認するのは、レスポンシブに対応できているかどうかだと思います。同時にデバイスを確認するサイト・ツールは、こちらが便利です。（IDの登録などは不要）

everysize

https://everysize.kibalabs.com/

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/592978bb-3057-8fdc-b547-203c7c63b7e5.png)

# 参照URL
### new.css

公式ページと参考URL

https://newcss.net/

https://coliss.com/articles/build-websites/operation/css/classless-css-framework-newcss.html

### mvp.css

公式ページと参考URL

https://andybrewer.github.io/mvp/

https://coliss.com/articles/build-websites/operation/css/minimalist-stylesheet-for-html-elements-mvpcss.html
【初心者向け】cronを利用したプロセス監視

## はじめに
- 今回のこの記事を書こうと思ったのは、前回の[cronについてのまとめとよくあるエラー](https://qiita.com/shark_No95/items/4525ece23f2d5d3199a3)でcronについてのまとめを書いたので、前回に続いてcronを利用したプロセス監視について書こうと思います。

- 前回と同じく初心者向けの記事になります。

- cronについては細かく書かないので、cronについてあまり知らない方は前回の記事を閲覧するか、調べて頂いてから見ると分かりやすいかと思います。

## スクリプト概要

- プロセス監視

 - pgrepで対象のプロセス一覧を表示し、その一覧から監視しているスクリプトが何個起動しているか確認する。
 - その結果をif文で分岐して、分岐内の必要な処理をする。

### コード

``` :vi
crontab -e 

*/5 * * * * /bin/sh shell.sh


```

``` :ShellScript
#! /bin/bash

PROCESS_NAME=nginx

count=`pgrep $PROCESS_NAME | wc -l`

if [ $count = 0 ]; then

    echo "$PROCESS_NAME is stop"

    systemctl start nginx

    echo "$PROCESS_NAME is Start"

else
    echo "$PROCESS_NAME is running"
fi

```

## 解説

``` :vi
crontab -e 

*/5 * * * * /bin/sh shell.sh
//crontabの中に上記のように記述すると5分毎に設定したシェルを実行するようになります。

*/5 * * * * /bin/sh shell.sh　>> /任意の場所/log.txt 2>&1
//もしファイルとして実行した内容を残したければこのように記述することもできます。
//2>&1で標準出力とエラーを混ぜて出力されます。

```

``` :ShellScript 
#! /bin/bash 
//これはシェルを書く上での決まり文句みたいなものですね。

PROCESS_NAME=nginx
//ここで監視したいプロセスを定義します。今回だとnginxですね。

count=`pgrep $PROCESS_NAME | wc -l`
//動作しているプロセスをカウントしたいのでプロセスの数を数えて変数に代入します。
//pgrepでパターンにマッチしたプロセスIDの一覧を取ってくる。
// |(パイプライン)でwc -lを繋いでプロセスの行数を取ってくる。
※余談ですが、wcはword countが名前の由来で行数以外にも単語・バイト数なども表示できます。

if [ $count = 0 ]; then

    echo "$PROCESS_NAME is stop"

    systemctl start nginx

    echo "$PROCESS_NAME is Start"

else
    echo "$PROCESS_NAME is running"
fi

//このif文で先程定義したプロセスの数が0の場合はnginxが停止していることが分かるので上記のような起動するシェルを書きます。
//そうでない場合は、nginxのプロセスが正常に起動しているので、それに対してecho "$PROCESS_NAME is running"と返します。

```
- このcronの設定と解説したシェルスクリプトを組み合わせると簡単ですが、5分毎にシェルを実行してプロセスの確認を行い、もしプロセスが停止していた場合は自動で起動するようにできます。

## 参考サイト

- 下記の記事などを閲覧するとシェルスクリプトについて理解が深まると思います。

[初心者向けシェルスクリプトの基本コマンドの紹介](https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337)
[UNIX&Linuxコマンド・シェルスクリプトリファレンス]
(https://shellscript.sunone.me/tutorial.html)

## 最後に
今回は前回書いた記事の続きでcronを利用したプロセス監視についての記事を書きました。
間違いなどありましたらコメント等で教えて頂けると私の勉強にもなるので是非お願いします。
次回はVagrantやミドルウェアの設定などについての記事が書けたら良いなと思っています。
【Powershell】Windows Update 一覧取得コマンド

## Windows Update 一覧取得

##### 検証環境
　・Windows10

##### Component Based Servicing(CBS)経由でアップデートした一覧のみ取得
```console:cmd
wmic qfe
```

```powershell:PowerShell
Get-Hotfix
```
　

##### 全てのアップデートを取得
```powershell:PowerShell
# Microsoft Update Session オブジェクトのインスタンスを作成
$Session = New-Object -ComObject Microsoft.Update.Session  

# Update Searcher オブジェクトを作成
$Searcher = $Session.CreateUpdateSearcher() 

# システムに適用された更新プログラムの合計数を取得
$HistoryCount = $Searcher.GetTotalHistoryCount()

# QueryHistory(開始点,終了点)メソッドで開始点から終了点までの更新プログラムを取得
$Searcher.QueryHistory(0,$HistoryCount) | Select-Object Date,Title,Operation,HResult

```

参考：[Hey, Scripting Guy!](https://gallery.technet.microsoft.com/scriptcenter/04d35e17-dbcd-4453-a939-7ad19c18983c)
mkdocsでの数式の表示

まず、pymdown-exensionsをインストールします。

```
pip install pymdown-extensions
```

以下のファイルを、docsと同じ階層に、javascriptsというフォルダを作り、extra.jsという名前で保存します。

```extra.js
window.MathJax = {
tex2jax: {
inlineMath: [ ["\\(","\\)"] ],
displayMath: [ ["\\[","\\]"] ]
},
TeX: {
TagSide: "right",
TagIndent: ".8em",
MultLineWidth: "85%",
equationNumbers: {
autoNumber: "AMS",
},
unicode: {
fonts: "STIXGeneral,'Arial Unicode MS'"
}
},
displayAlign: "left",
showProcessingMessages: false,
messageStyle: "none"
};
```

mkdos.yamlに、以下を追加します。

```
extra_javascript:
  - javascripts/extra.js
  - https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-MML-AM_CHTML

markdown_extensions:
  - pymdownx.arithmatex
  - pymdownx.betterem:
      smart_enable: all
  - pymdownx.caret
  - pymdownx.critic
  - pymdownx.details
#  - pymdownx.emoji:
#      emoji_index: !!python/name:materialx.emoji.twemoji
#      emoji_generator: !!python/name:materialx.emoji.to_svg
  - pymdownx.inlinehilite
  - pymdownx.magiclink
  - pymdownx.mark
  - pymdownx.smartsymbols
  - pymdownx.superfences
  - pymdownx.tasklist:
      custom_checkbox: true
  - pymdownx.tabbed
  - pymdownx.tilde
```
今回は、emoji の対応はしていません。

例：ブロック

```
$$
\frac{n!}{k!(n-k)!} = \binom{n}{k}
$$
```
$$
\frac{n!}{k!(n-k)!} = \binom{n}{k}
$$

例：インライン

```
Lorem ipsum dolor sit amet: $p(x|y) = \frac{p(y|x)p(x)}{p(y)}$
```

Lorem ipsum dolor sit amet: $p(x|y) = \frac{p(y|x)p(x)}{p(y)}$

以上

Documents：
[pymdown-extensions](https://pypi.org/project/pymdown-extensions/)
[PyMdown Extensions](https://squidfunk.github.io/mkdocs-material/extensions/pymdown/)
GitLab(on docker) restore 後の 再起動で ActiveRecord::IrreversibleOrderError


# 概要

PC交換に伴い gitlab/gitlab-ce:13.0.1-ce.0 向けのバックアップデータをリストアしたところ、ActiveRecord::IrreversibleOrderError が発生し、GitLab自体起動できなくなった際の備忘メモ。

[こちら](https://docs.gitlab.com/ee/raketasks/backup_restore.html#restore-for-docker-image-and-gitlab-helm-chart-installations)を参照し

```shell
## sudo docker-compose up -d ＆ブラウザからの起動確認後 ＆ tarボール配置後
sudo docker exec -it gitlab-container gitlab-backup restore
```

上記restoreコマンド実行完了後、ブラウザからのアクセスすると一見リストアが成功したように思えたが、その後

```shell
sudo docker-compose restart
```

してみると 起動途中で ActiveRecord::IrreversibleOrderError が発生しGitLabが起動できない状態となった。
ちなみに、12.x.x(バージョン不確か) では上記手順で、問題なくリストア＆再起動できていた。。記憶がある。。

また、tarボールは定期的に

```shell
docker exec -t gitlab-container gitlab-backup create BACKUP=dump
```
で、data/backups配下から吸い出したもの。

## 環境

```
image: gitlab/gitlab-ce:13.0.1-ce.0

NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
```
# 対処
[こちら](https://gitlab.com/gitlab-org/gitlab/-/issues/36405) を参考に [for Omnibus](https://docs.gitlab.com/ee/raketasks/backup_restore.html#restore-for-omnibus-gitlab-installations) のリストア方法を勘案し、以下手順で回避できた。

1. gitlabの再配置＆起動確認
2. gitlab-ctlで特定サービスを停止(& tarボールのコピー)
3. リストア
4. gitlab-ctl reconfigure 他
5. docker-compose restart

## gitlabの再配置＆起動確認

image 及び data / config / logs などのローカル情報を削除し、

```shell
sudo docker-compose up -d
```

で素のGitlabが立ち上がりブラウザからのアクセスが行えることを確認する。

##. gitlab-ctlで特定サービスを停止(& tarボールのコピー)

先の起動確認後、tarボールを/var/opt/gitlab/data/backups配下にコピーし、特定のサービスを停止する。

```shell
$ sudo cp dump_gitlab_backup.tar data/backups/.
$ sudo docker exec -it {コンテナ} /bin/bash  ← 以降コンテナ側で作業
# chown git.git /var/opt/gitlab/backups/dump_gitlab_backup.tar
# gitlab-ctl stop unicorn
# gitlab-ctl stop puma
# gitlab-ctl stop sidekiq
# gitlab-ctl status ← 一応ステータス確認
```

## リストア

特定サービス停止後、コンテナ側で、リストアコマンドを実行する。

```shell
# gitlab-backup restore BACKUP=dump
```

## gitlab-ctl reconfigure 他

reconfigure他を実施し、コンテナを抜けて、ブラウザよりリストアが完了していることを確認する。

```shell
# gitlab-ctl reconfigure
# gitlab-ctl restart
# gitlab-rake gitlab:check SANITIZE=true
# exit
```
## docker-compose restart

最後に、再起動してもGitLabが正常に立ち上がることを確認する。

```shell
sudo docker-compose restart
```

# 参考URL

- https://docs.gitlab.com/ee/raketasks/backup_restore.html
- https://gitlab.com/gitlab-org/gitlab/-/issues/36405
Dockerコンテナをまとめてストップさせるやり方

開発用コンテナを立ち上げようとしたら
他プロジェクトで使っていたのコンテナにportを取られて立ち上がらないなんて経験ありますよね。


ただいちいちdocker-compose.yamlがあるところまで移動して停止していくのですか？
面倒くさいですよね


```
docker ps -q | xargs docker stop
```

よし！
共通jsの発火位置を秒で特定する

# はじめに
.js-accordionとクラス名に当てるとアコーディオンになるみたいな、
良く使われるjs処理がどこで記述されてるかを一瞬で見つける方法です。

結論を先に書くと
**Networkタブで検索かけたら一瞬で見つかりました！**

# 使い所
サイト全体で共通のjsファイルなんかを読み込んでおいて、
その中で良く使われるアコーディオンなり、アンカーリンクなりの処理を書いておいて、どこでも呼び出せるようにみたいなことって良くあるかと思います。

ただ、ある程度長く運用を続けているサイトになってくると、
共通で読み込んでるjsファイルが数が増えてきちゃって

- base.js
- share.js
- utilty.js

みたいな後から入った人からするとどこに何が書かれてるか分かんない状況になっちゃうんですよね。
で、アコーディオンの挙動に問題があった場合とかまず調査するためにその処理がどこに書かれてるか探すところから始めるかと思いますが、これを僕は検証機能の「source」タブを使って読み込まれたjsファイルを一つ一つ開いて「.js-accordion」で検索かけたりして探してたんですよね。

これを「Network」タブの方でCtrl+fしたら左側にこんな検索メニューでてくるんですよ。
![スクリーンショット 2020-07-01 8.35.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67190/90ffe261-4414-a68d-f710-7a9e96b798d4.png)
ここで「.js-accordion」とかって検索すると、
それが書かれてるファイルと行数がパッと出てくるんでそれで解決です。

誤操作でたまたまこの探し方発見したんですけど感動しました。
【PostgreSQL】using内で複数のテーブルを参照してdeleteする方法

# はじめに
あるテーブルのdelete文を書いている時に、「あれ、usingの中って複数テーブル書けるんだっけ？」となったので調べて簡単に実験してみました。
# 【復習】PostgreSQLでテーブルを参照してdeleteをする方法
PostgreSQLで他のテーブルを参照してdeleteを行うには、以下のように2つの方法がありました。
#### IN区を使う方法
```SQL
DELETE
FROM
    TABLE_A A
WHERE A.NAME in (SELECT B.NAME FROM TABLE_B B)
```
#### USING句を使う方法
```SQL
DELETE
FROM
    TABLE_A A
USING 
    TABLE_B B
WHERE A.NAME = B.NAME
```
# 【本題】PostgreSQLでusingで複数テーブルを参照してdeleteをする方法
[PostgreSQL公式](https://www.postgresql.jp/document/12/html/sql-delete.html)から引用すると、下のように書いてあります。
>[ WITH [ RECURSIVE ] with_query [, ...] ]
DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
    [ USING using_list ]
    [ WHERE condition | WHERE CURRENT OF cursor_name ]
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

>（中略）

>using_list
WHERE条件内に他のテーブルの列を記述できるようにするための、テーブル式のリストです。 これは、SELECT文のFROM句において指定できるテーブルのリストと似ています。 例えば、テーブル名の別名も指定することができます。 自己結合を設定する目的以外ではusing_listに対象のテーブルを繰り返さないでください。

`using_list`は名前からしても、説明をみても複数のテーブルを書けるようです。
よって例えば次のように書けます。

```SQL
DELETE
FROM
    TABLE_A A
USING 
    TABLE_B B,
    TABLE_D D
WHERE A.NAME = B.NAME AND A.ID = D.ID
```

`using_list`にはサブクエリが入ってもいいのかな？と疑問に思ったので、次のような文も試しましたが大丈夫なようでした。

```SQL
DELETE
FROM
    TABLE_A A
USING 
    TABLE_B B,
    (
        SELECT
            ID
        FROM
            TABLE_D D
        WHERE D.FOO = 'FOO'
    ) AS E
WHERE A.NAME = B.NAME AND A.ID = E.ID
```

# まとめ
- USING句で指定するテーブルはカンマ区切りで複数指定可能
- 複数書く場合でも、通常のUSING同様サブクエリを使用可能

あまり具体的なコードを書いている例が出てこなかったので、備忘として残しました。
誰かのお役に立てば何よりです。
VScodeでPHPdocコメントを作成する手順

備忘録として

## 開発環境
・ホストOS: Windows10 Home
・ゲストOS: WSL2 Ubuntu20.04
・VScode 1.46.1
・PHP 7.4
・laravel 7.x

##実行手順

① 拡張機能「PHPDocBlocker」をインストールする。インストール後に拡張機能を有効化するためにVScodeを再起動します。

② docコメントを追加したいクラスやメソッドの上に「/**」と入力してからEnterキーを押すとdocコメントが追加されます。

![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598747/c374115a-a28f-d728-7179-cf6ff803e5dc.png)

![スクリーンショット (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598747/56e5afe2-8f43-6b51-a466-ee85f847ad6a.png)

無事docコメントが追加されました。
viewportを調査

viewport関連のWebサイト記事や書籍を読んでも理解できないので

書籍[『レスポンシブWebデザイン入門』](https://book.mynavi.jp/ec/products/detail/id=22978)のサンプルを使って試行してみました。

やったここと
でサンプルからcssを削除しviewportの設定ありなしで違いを確認

```html
//viewportは有りと無し2種類を確認
<meta name="viewport" content="width=device-width, initial-scale=1">
//<meta name="viewport" content="width=device-width, initial-scale=1">

//cssは削除
<!-- <link rel="stylesheet" href="css/style.css"> -->

```

結果
『viewポートなし』は一部しか表示されずスクロールする必要が生じる
『viewポートあり』は画面サイズに応じて文字は折り返される。画像は画面サイズより大きいままとなる。

結論
文字を設定したviewportサイズで折り返してくれる機能
※違っていたら今後修正します
【統計学】ふつうのエンジニアが統計学の勉強を始めてみた


# はじめに
数学がちょっとデキル
ふつうのバックエンドエンジニアが
統計学を勉強してみたという話


---
# 学びのキッカケ
Python3のデータ分析試験で
統計系の問題がイマイチ解けなかったこと

---

# 統計学とは
データのよりよい使い方を探る学問
またはそういう分野

---

# データとは
なんかしらの情報。ここでは
デジタルデータについて扱う

---

# データの種類

主に２種類存在する。
既に手に入れているデータ
まだ手に入れていないデータ

---

# 確率(Probability)

あるデータが登場する頻度、割合のこと
例）サイコロを10回振ったら6の目が何回出るか

---

# 確率変数
ある確率によって登場した値
確率(P)に影響して算出される値
例）サイコロの6の目

---

# 母集団
まだ手に入れていないデータを含む
すべてのデータをいう
例）この世すべてのサイコロの目

---

# 標本
手持ちのデータのこと

---

# サンプリング(標本抽出)

母集団から標本を得ること
また、標本の大きさを**サンプルサイズ**と呼ぶ

---

# 統計の種類

記述統計：既にある手持ちのデータを要約すること
推測統計：まだ手に入れていないデータを推測すること

---

# 統計学のすごいとこ
将来的に得られるデータを
予想したり、傾向を分析できる。

---

# まとめ
用語が多くて大変だけど
ちゃんと紙を用意して数学の勉強をしようと
思いました。


---

#おわり
超小縮尺のきれいな画像タイルを作った

国連ベクトルタイルツールキットを使ったウェブ地図の、小縮尺の表示を改善するために、Natural Earth II with Shaded Relief and Water を画像タイルにしました。

<img width="1186" alt="Natural Earth image tiles" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102082/92c4f4a9-fda2-ef08-5a2b-38a4fd57a6d4.jpeg">
https://optgeo.github.io/relief/#3.68/23.47/86.92

もともとパブリックドメインのデータでもありますし、ご自由にお使いください。

技術情報は、 https://github.com/optgeo/relief に置きました。
vistaでquartus その13

#概要

vistaでquartusやってみた。
俺cpuのシミュレータをplunkerで作ってみた。

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/27c73e70-9f70-d6b0-f55f-4cf8acab0a10.png)


#成果物

https://embed.plnkr.co/plunk/NIFo8n12wue6KniB

#アセンブラにコメント入れてみた。

aからzを印字。


```
  push  0　スタックに０を積む。
  set  i　　変数iにスタックトップを入れる。スタックは減る。
loop:　　　　ここは、ループのラベル。
  get  i　　変数iの値をスタックに積む。
  push  25　　スタックに２５を積む。
  >　　　　　　スタックトップとネクストを比較する。２つ減らして、結果をスタックに積む。
  if  pass 　スタックが真なら、ラベルに飛ぶ。
  get  i　　変数iの値をスタックに積む。
  push  97　スタックに９７を積む。
  +　　　　　スタックトップとネクストを加算。２つ減らして、結果をスタックに積む。
  out　　　　文字コードで印字。スタックは減る。
  get  i　　変数iの値をスタックに積む。
  push  1　　スタックに１を積む。
  +　　　　　スタックトップとネクストを加算。２つ減らして、結果をスタックに積む。
  set  i　　変数iにスタックトップを入れる。スタックは減る。
  jp loop　　ラベルに飛ぶ。
pass:
  end

```


以上。
2020年の浮動小数点数

##はじめに
2020年5月半ばに発表されたNVIDIAのAmpereアーキテクチャの記事を眺めているとBF16とかTF32とか聞きなれない用語が出てくるのでざっと調べてみた。

##浮動小数点数
簡単には計算機上において符号+指数部+仮数部で数値を表す形式。
多くの言語の型にfloatとあるのはFloating Point Numberから。FP16,FP32なんて型のFPもFloating Pointの略。

##IEEE754
まずは広く使われている浮動小数点数の整理から。
IEEE754、正式にはIEEE Standard for Floating-Point Arithmetic (ANSI/IEEE Std 754-2008)として規格されている浮動小数点数のうちいくつかを下記表に挙げる。

|IEEE754名|一般名|指数部|仮数部|合計|
|:--|:--|:--|:--|:--|
|binary16|半精度(half,FP16)|5 bits|10 bits|16 bits|
|binary32|単精度(single,FP32)|8 bits|23 bits|32 bits|
|binary64|倍精度(double,FP64)|11 bits|52 bits|64 bits|

FP16はNVIDIA Pascalアーキテクチャからサポートされる。
IntelのCPUもIvy BridgeからFP32との変換命令セット(F16C)をサポートする。

##BF16

|名称|指数部|仮数部|合計|
|:--|:--|:--|:--|
|bfloat16(BF16)|8 bits|7 bits|16 bits|

FP32と同じ8bitsの指数部により、-256〜256の範囲の整数を正しく表現できる。それによりINT8から変換しても精度を失わない。
GoogleのTPUでも採用されている様子。

##TF32

|名称|指数部|仮数部|合計|
|:--|:--|:--|:--|
|Tensor Float 32(TF32)|8 bits|10 bits|19 bits|

FP32,BF16と同じ8bitsの指数部、半精度と同じ10bitsの仮数部を持つ。
合計19bitsは内部処理で用いられ、入出力は32bitsになるからTF32という名称らしい。

##おわりに
Tesla A100いじってみたい。

##参考
- IEEE754(Wikipedia EN)
  - https://en.wikipedia.org/wiki/IEEE_754
- F16C(Wikipedia EN)
  - https://en.wikipedia.org/wiki/F16C
- TensorFloat-32 in the A100 GPU Accelerates AI Training, HPC up to 20x(NVIDIA Blog)
  - https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/
- TensorFlow モデルでの bfloat16 の使用(Google TPU Document)
  - https://cloud.google.com/tpu/docs/bfloat16
- BFloat16の適用と実装状況(Qiita @sakaia)
  - https://qiita.com/sakaia/items/8173978e0edd31d8eaba
- FP64, FP32, FP16, BFLOAT16, TF32, and other members of the ZOO(medium.com @moocaholic)
  - https://medium.com/@moocaholic/fp64-fp32-fp16-bfloat16-tf32-and-other-members-of-the-zoo-a1ca7897d407

##免責
記事の内容は個人の見解であり、所属組織を代表するものではありません。
分散の加法性

# はじめに
ふと、材料AとBを接合した後の寸法誤差はどうなるんだっけ・・・と思い復習しました。

# 導出
簡単のために以下のように記号を定義します。
X：確率変数、確率で変動するAやBの寸法と考えると分かりやすいです。
E(X)：確率変数Xの期待値
V(X)：確率変数Xの分散
Cov(X,Y)：確率変数Xと確率変数Yの共分散

2つの確率変数の和の期待値は簡単です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/28218ec7-fd21-efb0-a9d9-db965a38fdb2.png)


次に分散ですが、以下のように式変形していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/0a282f30-2929-cdb7-aae2-81d820c6b62b.png)

結論として、材料AとBの寸法の共分散が0であれば、それぞれの分散を足すだけで良いです。

共分散Conv(X,Y)は、XとYのデータ間の関係を表す数値で、0であれば、XとYは無相関ということを意味します。
そして、無相関であれば材料Aと材料Bを接合した後の寸法誤差は分散V(X)+V(Y)に従うということですね。
ですが、実際の製造現場では同じ鋼板のロールやロッドから切り出した部材や消耗した加工機などを使うので共分散が0でないことが多々ありそうですね。

ちなみに、ここでいう"XとYが無相関"と"XとYが独立"であることは異なる意味を持ちます。無相関とはあくまで、分散に注目してXとYの関係を評価しているだけなので、XとYの確率分布が独立であるとは限りません。