OmniAICreator/Qiita-1.07M huggingface dataset:
C++ 環境構築メモ g++ （Mac）

# はじめに
大学の研究で普段，Windows PCでC++を扱うのですが，最近Macに買い換えて環境構築を行ったので，その時のことを軽くメモしました．

# 手順
基本は参考の記事に従って環境構築を行いました．

C++のコンパイラにはClangとgccがあるようですが，今回はgccを選びました．


## 1. VSCodeの拡張機能をインストール
以下のものをインストール．

* C/C++: コード整形，タグジャンプ，自動補完，InteiliSence機能
* Visual Studio IntelliCode: 上と同じ．
* code-runner: VSCode上でショートカット操作でshell scriptを実行

## 2. gccをインストール

terminalでbrewコマンドによりgccをインストール．

```

$ brew install gcc

```

## 3. path設定
インストール後，以下２つのコンパイラが同居している状態．

* /usr/bin/g++ (clang)
* /usr/local/bin/g++-10 (gcc)

-10の部分はversionによって異なるので注意(2021/4/9時点)．

現状だと，g++コマンドを実行すると，以下のようにclangのコンパイラが呼び出される．

```

$ which g++
/usr/bin/g++

```

そのため，ln -sコマンドによりシンボリックを作成して，g++コマンドでgccのコンパイラが呼び出されるようにする．

```

$ ln -s /usr/local/bin/g++-10 /usr/local/bin/g++

```

再度，g++コマンドの呼び出し元を確認して以下のようになればok. 変化がない場合は，terminalを再起動してみる．

```

$ which g++
/usr/local/bin/g++

```

## 4. コンパイル
code-runnerを用いてc++ファイルのコンパイルを行います．

### 4.1. code-runnerの設定
code-runnerをterminal上で実行できるようにするため，左側のExtensionタブを選択し，install済のCode Runnerを探す．
Code Runnerの歯車のマークをクリックし，Extension Settingsを選択．
右画面に設定画面が出てくるので
<b>Code-Runner: Run In Terminalのチェックボックスを入れる</b>．

### 4.2. 動作確認
テストのため，以下のコードを作成．

```c++

#include <iostream>
using namespace std;

int main(){

    string name;
    cin >> name;
    cout << "Hello, " + name << endl;

}

```

<b>control + option + n</b> キーを入力すると，コンパイルされる．nameをterminal上で入力して，"Hello, <name>"が出力されればok.


### 余談

なお，code-runnerは格言語（拡張子）に対して行う処理が規定されている．code-runnerの設定画面からCode-runner: Executor Mapを見ると，以下のようなcppに対応する処理が記載されている．

```

{
    "code-runner.runInTerminal": true,
    "code-runner.executorMap": {
        "javascript": "node",
        "java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
        "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        ~省略~
    }
}

```

上記より，内部では以下の処理が実行される．

```

cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"

```

このコマンドでは以下の3つの処理を実行．

1. ソースコードのあるディレクトリに移動
2. test.cppをコンパイルし、実行ファイルtestを生成する
3. 実行ファイルtestを実行する

# 補足
* 参考した記事では，#include <bits/stdc++.h>を使えるようにするためには，上記以外にもやることがあるみたいだったのですが，今回の手順でも特にエラーは起きませんでした．

# 参考
* [Visual studio codeで競プロ環境構築[mac OS]](https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6)
CoordinatorLayoutを使う(Snackbarをスワイプで消す)

Androidアプリを趣味程度にいじっています。

ポップアップメッセージを出す手段として、[Toast](https://developer.android.com/guide/topics/ui/notifiers/toasts)に替わって[Snackbar](https://developer.android.com/training/snackbar)というのがあるそうです。

短い時間の通知に加え、アクションを追加できるのはいいなと思って使うことにしましたが、googleのドキュメントそのままにやってみたら失敗したのでそれについてメモします。

Android Studio 4.1.2
Runtime version: 1.8.0_242-release-1644-b3-6915495 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.15.7


## 失敗

https://developer.android.com/training/snackbar/showing

↑を参考に。『CoordinatorLayout を使用する』の章で「CoordinatorLayout にアタッチされている場合、Snackbar で次の追加機能が使えるようになります。……Snackbar をスワイプして消すことができる。…… 」とあるので書いてある通り、現在のレイアウトをCoordinatorLayoutでラッピングしました。

↑に載っているサンプルコードがこちら

```xml
<android.support.design.widget.CoordinatorLayout
        android:id="@+id/myCoordinatorLayout"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- Here are the existing layout elements, now wrapped in
             a CoordinatorLayout -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <!-- …Toolbar, other layouts, other elements… -->

        </LinearLayout>

    </android.support.design.widget.CoordinatorLayout>
```

すると`android.support.design.widget.CoordinatorLayout`が赤文字になって、赤ランプマークを押すと`Add dependency androidx.coordinatorlayout:coordina...`と出てきます。そこをクリックしたらgradleに

```
dependencies {
    ...
    implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0'
    ...
}
```
と追加されました。しかしレイアウトファイルのcoordinatorLayoutのところは赤文字のままで、うまく動きません。

## 解決

色々調べてみたのですが解決方法がわからないでいたところ、とある解説記事に遭遇しました

https://codeforfun.jp/android-studio-how-to-use-snackbar/

これをよくみると、レイアウトファイルのところで

```xml
<androidx.coordinatorlayout.widget.CoordinatorLayout
 ...
```
としています。

この通りに書き換え、つまり

```xml
<androidx.coordinatorlayout.widget.CoordinatorLayout
        android:id="@+id/myCoordinatorLayout"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- Here are the existing layout elements, now wrapped in
             a CoordinatorLayout -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <!-- …Toolbar, other layouts, other elements… -->

        </LinearLayout>

    </androidx.coordinatorlayout.widget.CoordinatorLayout>
```

としたら動作するようになりました。スワイプで消すのも無事できるようになりました。

## 参考

- [ポップアップ メッセージの作成と表示  |  Android デベロッパー  |  Android Developers ](https://developer.android.com/training/snackbar/showing)
- [【Android Studio4.1】Snackbar を表示する方法](https://codeforfun.jp/android-studio-how-to-use-snackbar/)
【Linux】ハイフンをいっぱい出したかっただけなのに【printfコマンド】

#初めに
実務で使ったコマンドの使い方を備忘録的にまとめます。
基本的な使い方は色んな方が書かれているので簡単に、
使っていて気付いた部分を重視して記述します。
実際の動きを見た推測等を含むため、仕様的に間違いがありましたら教えていただけると幸いです。

#printfコマンドとは
データを整形して、表示するコマンド。
整形して表示とは、

```
$ printf "%s" penpen
penpen[root@nagisa]
```
「""」の中でフォーマットを指定して、整形して表示しています。
実行結果を見て分かる通り、改行はしません。回り込んじゃってますね。

改行したい場合は「\n」をつけてあげます。

```
$ printf "%s\n" penpen
penpen
```
データを整形ってよくわからないんだけど？

```
$ printf "%x\n" 255
ff
```
「%x」でデータ(引数)の「255」のフォーマットを16進数に指定して、整形してあげています。
出力結果はしっかり16進数で表示されていますね。

#使い方備忘録
ここからは実務で使ったやりかたの備忘録です。
参考程度にご覧ください。

##ハイフンをいっぱい出したい！！
実務でシェルスクリプトを作る過程で、printfコマンドの動きを確認していました。
ハイフンを量産して区切りでも作ってみようか。

ハイフン量産方法の例

```
$ printf "%s-" {0..60} | tr -d '[0-9]' | awk '{print}'
-------------------------------------------------------------
$ printf "%s" {0..60} | sed -e s/[0-9]/-/g -e s/$/\\n/
----------------------------------------------------------------------------------------------------------------
$ printf "%.s-" {0..60} | awk '{print}'
-------------------------------------------------------------
```
ただハイフンを量産するだけには見合わない労力を費やした気がします。
そもそもこのやり方たちがメジャーなのか不明です。

printfコマンドの使い方なので、他のコマンドの説明は先に簡単に済ませます。
「tr」「sed」これらのコマンドは文字を置換、削除するコマンドです。
・trコマンド: 正規表現で数字を指定し削除。
・sedコマンド: 正規表現で数字を指定しハイフンに置換。
どちらのコマンドでも最後に改行を差し込んでいます。意外と奥が深いひと手間。

3つめのコマンドはシンプルで美しいです。
printfコマンドの精度を利用して、文字列を表示しないやり方です。
最小フィールド幅と精度は奥が深そうなので、別記事にして勉強してみるのもいいかもしれません。

###printfコマンドで繰り返し
話が脇道に逸れましたが、本題はprintfコマンドを使って、文字列を繰り返し出力できる使い方です。

```
$ printf "%s" {0..10} | awk '{print}'
012345678910
```
注目していただきたいのは
「{0..10} 」
この部分。
brace expansion(ブレース展開)というようで、
出力結果を見て分かる通り、ここでは0から10の数字を展開してprintfコマンドに渡しています。
この展開を利用して、ついでに数字にハイフンをつけて、先述したコマンドで数字を置換、削除します。回りくどい。
ハイフンをつけてみると

```
$ printf "%s-" {0..10} | awk '{print}'
0-1-2-3-4-5-6-7-8-9-10-
```
こんな感じ。
ハイフンが各数字にくっ付いていますので、
「012345678910」という文字列を渡しているのではなく、0から10まで繰り返していると推察できます。

###実は最初はエラーが出た
実は最初は上手くいきませんでした。

```
$ printf "-%.s" {0..10} | awk '{print}'
bash: printf: -%: invalid option
printf: usage: printf [-v var] format [arguments]
```
違いが判りますでしょうか。

ハイフンを数字の前につけようとすると怒られてしまいます。
エラー内容によると「-%」はオプションとして無効だそうです。
「""」で囲っているのに文字列として認識せず、オプションとして認識されているのでしょうか。
「""」を展開して解釈してくれているみたいなのですがよくわかりません。どなたかご教授を。。。

とにかく、正しい使い方を教えてくれているので実際に使ってみます。

```
$ printf -v var "%s" penpen
$ echo ${var}
penpen
```
「-v」というオプションで「var」という変数に、文字列を整形して格納しています。
このような使い方はしたことがないので詳しくはわかりませんが。。。

ではここでエラーから逆算した使い方を実践してみましょう。

```
$ printf "-v" var "%s" wanwan
$ echo ${var}
wanwan
```
正常終了し、「var」の値も書き換わっています。
オプションを「""」で囲んでもちゃんと認識してくれました。

###実は解決策もあった
先述した通り、ハイフンを数字の前につけるとエラーになるのですが、
ハイフンをエスケープすることで回避できます。

```
$ printf -- "-%s" {0..10} | awk '{print}'
-0-1-2-3-4-5-6-7-8-9-10
```
「--」をつけることで、後の「-」をエスケープできます。
しっかりハイフンが数字の前に付いてくれていますね。
このようなエラーは滅多に出会うことはなさそうですが、もしハマったら中々抜け出せなさそうな沼の予感がします。

#まとめ
printfコマンドで色々遊んでみました。
労力に見合うほど得るものがあったのかは疑問ですが、楽しかったからヨシッ。

この記事の説明には不足、間違い、推測違いがあるかもしれません。
是非教えて頂ければ新たな学びとなりますので、どうぞよろしくお願いします。

#最後に
ハイフンのエスケープは他のコマンドでも面白い動きが確認できたので、また記事にしたい思います。

[追記] trコマンドでもハイフンで遊んでみました！
[【Linux】trコマンド使ってみた【trコマンド】](https://qiita.com/nagisa_O/items/1180abb9acc06aa115f0)
vuforia buildの方法

1,iOSにSwitchし、playerSettingからname,version,orientationを設定する
![8520FF9E-8D54-494C-9CB0-4FCAA89B5F62.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/c12f7cf2-7ef0-27e6-5231-f56cea5bfab0.jpeg)

2, bundleIdentifier, cameraUsageを設定する
![F6FA902A-39D6-4449-87E4-8E94F7E9B734.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/15cad004-33d4-975d-115c-b3661bacb7cb.jpeg)

3,iOSのバージョンを設定する
![F2CEE155-B762-4356-8599-64C76A82FACE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/9f242d04-17b1-93e2-cf73-057870273793.jpeg)

4, Xcodeを開いてiPhoneにビルドする
AIのアルゴリズムの選択

ビジネス寄りでデータサイエンスに関わるには、目的に合ったアルゴリズムの選択ぐらいはできるようになった方がよさそう。

scikit-learnのアルゴリズムチートシートが参考になりそう。

後は自分でJupyter Notebookでゴリゴリ主要な機械学習アルゴリズムの実装をするぐらいかなあ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299677/633601b8-d51a-18d0-2351-e9bd92bcefd0.png)
msys2 で敢えて mintty を使わない方法

# 簡単に
```
C:\msys64\msys2_shell.cmd -mingw64 -defterm
```
とすれば mintty じゃなくて cmd で bash が上がるので winpty のお世話にならずに済むのではないでしょうか。

msys2_shell.cmd の中を見ると、-defterm オプションを付けると login-shell が Windows の start コマンドで実行されるので、login-shell が cmd.exe で動作する、というからくりです。

というわけで面倒ですが MSYS2 MinGW 64-bit などのショートカットのリンク先を編集して、
`C:\msys64\msys2_shell.cmd -mingw64`
となっているところを
`C:\msys64\msys2_shell.cmd -mingw64 -defterm`
にしておくと楽かな？　お好みでどうぞ、かな？ 

# いま開いてる PowerShell の上で実行したい場合
そもそも新たなウィンドウすら不要で、今動かしているCLI端末でmingw64環境に移行したいのであれば、

```
PS C:\Users\demouser> C:\msys64\msys2_shell.cmd -mingw64 -defterm -no-start 
demouser@demopc MINGW64 ~
$
```

ってな具合ですんなり移行してくれます。不慣れなbatファイルなんて書かなくていいんです。


# なんで捨てるの？
msys2 で C言語を勉強している初心者が地味にハマる問題として、printf( )とscanf( )を組み合わせて簡単な対話型プログラムを書いたとき、mintty で動作している mingw 環境でCLIバイナリを動かすと、入力と出力の表示が噛み合わず、printf( )の出力がscanf( )の入力すべて受け付けてからじゃないと表示されない、みたいな問題が発生するためです。

これについては コンパイルしたCLIバイナリを winpty を通して実行すれば解決することが分かっているのですが、まあ、インストールを含めて忘れてしまいがちです。何とかならないかな？　という一案でした。

なお、msys2は `C:\msys64` にインストールしたという前提です。念のため。
HTML・CSSのテンプレート

よく「あ！これHTML/CSSで作ってみたいなー」と思うことがあって、いまだにタグが曖昧なので、「文字コードの指定ってどのタグだっけ？」ってよくなるので、HTMLファイルおよびCSSファイルのテンプレートを投稿しておきます。

### HTML
```html:index.html
<!-- HTMLテンプレート -->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
		<!-- CSS読み込み -->
		<link href="https://fonts.googleapis.com/css2?family=Lato:wght@400;700&family=Noto+Sans+JP:wght@400;700&display=swap" rel="stylesheet">
        <link rel="stylesheet" href="style.css">
		<!-- JQuery読み込み -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    </head>
    <body>
        FINALFANTASY
    </body>
</html>
```

### CSS
```css:style.css
/* CSSテンプレート */
body{
	font-size:0.6in;
	font-family: 'Lato', 'Noto Sans JP', 'ヒラギノ角ゴ ProN', 'Hiragino Kaku Gothic ProN', 'メイリオ', Meiryo, 'ＭＳ Ｐゴシック', 'MS PGothic', sans-serif;
}
```

改善点があれば教えてください！
随時改善していきます！
husky v5 で消耗している人には simple-git-hooks がお薦め

Git の Hook を扱う husky というライブラリがあり、大変お世話になっていた。が、 v5 が登場してから、設定変更を余儀なくされた。

v4 とは大きく異なる設計思想のため、私達は今まで書いていた設定ファイルを変え、 `.husky` ディレクトリを作成し、 husky のコマンドドキュメントを読んで、確認した。

https://github.com/typicode/husky

正直 husky v5 のこの変更には失望した。もちろん正当な理由が合ったのだとは思うが、このようなツールの設定変更に時間を取られたくないと思った。このようなツールにはドキュメントが存在しないくらいの方がちょうどいいと思った。なんでこんな大きなドキュメントがあるのか不思議に思った。

https://typicode.github.io/husky/

なんか同僚の PC で pre-commit フックが動いてないっぽい。そんでコードがフォーマットされてなくてイライラする。 OSS にプルリクくれる人にも申し訳ない。

しかも husky の変更は個人的に改悪だと思った。 `.husky` ディレクトリを作成したり、 `husky install` で何が行われるのか？ `.husky` の中にある謎のファイル `_` は何なのか？

しかも、 Husky は **勝手に** .git/config を変更するから、他のツールと併用すると面倒なことになりそう。

自分はただ単に `git commit` の前に Prettier を実行したいだけなのに、なぜこんなことになってしまったんだ。

そこで見つけたのが simple-git-hooks

https://github.com/toplenboren/simple-git-hooks

超かんたん。基本これで終わり。

```
yarn add -D simple-git-hooks
```

```json:package.json
  "scripts": {
    "prepare": "simple-git-hooks"
  },
  "simple-git-hooks": {
    "pre-commit": "npx lint-staged"
  }
```

あーもうこれで生きてくわ。これで良い。これだけで良い。

ちなみに husky から移行する時は、下記コマンドを実行して husky が **勝手に** 変更した Git の設定をもとに戻そう。

```
yarn remove husky
rm -rf .husky
git config core.hooksPath .git/hooks/
```
[AWS] Route53　独自ドメインがバケットと紐付けされない！


今回はとあるホームページ（シングルページ・静的ページ）をAWSの

**S3**
**Route53**

を使ってwebサイトを構築し、独自ドメインでアクセスすると言うことをやる。

まず、
AWSのS3でバケットを作成する。
※バケット名は取得するドメイン名と完全一致させること
その後、バケットに対象のファイル関連ぶち込む。
アクセス許可を全て解除して、静的ウェブサイトホスティングを編集
・有効にする 
![9c0b0f74ce0b8311096d5a1abefbd4a6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276686/10c0f3cb-d9a3-a903-e61d-bea461720049.png)
静的ウェブサイトをホストする

その後、バケットポリシーを編集


```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::ドメイン名/*"
        }
    ]
}
```

Route53でドメインの購入
バケット名と合わせること。
ホストゾーンを作成する。レコードを作成して、エイリアスを有効にして
トラフィックのルーティング先をバケットを作成したリージョンを選択。
S3のエンドポイントを選択。

レコードを作成。

通常ならこれで独自ドメインでのサイトへのサクセスが可能になる。

だが自分の場合は『そうは問屋がおろしてくれなかった』

なぜか、ドメインでアクセスしても、アクセスができない。
アクセス権限がないのではなく、そもそもアクセス先が存在しないと言うことだ


**このサイトにアクセスできませんーーーーーー.com にタイプミスがないか確認してください。
DNS_PROBE_FINISHED_NXDOMAIN**

もしここまでの症状と一致してる人はほぼ１００%私と同じ現象だと思うので
whoisで対象のドメインを検索する。
その後、NSの対象URLが4つあるのでそこを探して欲しい。
Name Server:　に続く部分である。

その後それと、route53の登録したドメインという項目から
登録済みドメインをクリック。
ネームサーバーと先ほどwhoisで検索をかけたURLと一致するか確認。
私の場合、ここが異なっていた。
もちろん、実際whoisで検索したものが正しいネームサーバー名である。
なのでroute53で登録してるネームサーバーを編集して一致させることで正しく起動するようになる。
deviseを使用したログイン機能実装での注意事項

フリマアプリのログイン機能実装の際にターミナルに現れたエラーの解消方法です。
deviseを入れてログイン機能を実装中にターミナルに以下のエラーを発見しました。
１。赤いいつものエラー画面にはなりませんでした。
２。データーベースに記録されずに新規登録画面に戻ります。
３。ターミナルのエラーは以下です。


![20210409-235146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/05b73974-400c-5224-e9f8-8106a1a06eba.png)


```terminal:terminal
=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "first_name"=>"前田", "last_name"=>"卓大", "first_name_prono"=>"マエダ", "last_name_prono"=>"タクオ", "birthday(1i)"=>"1930", "birthday(2i)"=>"1", "birthday(3i)"=>"1"}, "commit"=>"会員登録"}
Unpermitted parameter: :encrypted_password
   (0.2ms)  BEGIN
  User Exists? (0.3ms)  SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'sample@aaaaaa' LIMIT 1
   (0.1ms)  ROLLBACK
```

##着目点
１点目：Unpermitted(許可されていない) parameter: :encrypted_password
許可されていないパスワードとは？？？
２点目：メールの後でロールバック（rollback）？？？
ここで
@magatama さん「deviseで登録できない疑うところ６点」を参照しました
（大変勉強になりました）
>https://qiita.com/magatama/items/c5705e45ce8d60f925ff


deviseを用いてログイン機能を実装した場合いは
❶view

```rails:views/registrations/new.html.erb
<%= f.password_field :password, class:"input-default",...... %>
```

### `①passwordをviewファイルに入力`

❷usersテーブル
![20210410-000813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/3b80456d-d041-f1b7-ca66-fe41fa2a25eb.png)

### `②encrypted_passwordをカラム名にする`

以下はdeviseに実装内容になります。
１.viewで`password`とpassword_confimationが同じかチェック
２.（同じならば）view受け取ったpasswordをdevise_controllerで'encryped_password'に暗号化した文字列を返す

実際に暗号化されてデータベースに入ったpasswordは以下です。
$2a$12$DH1OsQXerMUhOzVxW6T/Z.xnjabsf8unyo6OeeMZhOgWy57mexsJm

私の間違いはviewファイル内でencrypted_password入力としていた点です。
--

passwordにするとうまくいきました
VSコードの自動補完

# VSコードの自動補完機能

VSコードに自動補完機能があることを今更知った為、覚えたコードをまとめました。
自動補完機能を使うことで時間短縮だけでなく、記述ミスを減らしたりとメリットがたくさんあります。

覚えた時に都度更新していく予定です。

```
link:css
<link rel="stylesheet" href="style.css">

#container + tabキー　
<div id="container"></div>

.cls + tabキー　
<div class="cls"></div>

span.cls + tabキー　
<span class="cls"></span>
    
#container>cls + tabキー　
<div id="container">
  <cls></cls>
</div>

#container>cls*3 + tabキー　
<div id="container">
  <cls></cls>
  <cls></cls>
  <cls></cls>
</div>

#container>cls-$*3 + tabキー　
<div id="container">
  <cls-13></cls-13>
</div>

#container>cls-$$$*3 + tabキー　
<div id="container">
  <cls-001></cls-001>
  <cls-002></cls-002>
  <cls-003></cls-003>
</div>

```
【SASS・CSS】nth-of-typeを孫要素など配下の指定した要素のみに適用する簡単な方法

nth-of-typeを使ってネストした深い要素にスタイルを適用する方法について。

ある深い要素にスタイルを適用するには、繰り返す親要素に`nth-of-type`を適用し、その配下でタグを絞り込むと簡単に適用できる。

```css:.css
繰り返す親要素のセレクタ:nth-of-type() 対象のセレクタ { 処理 }
```

セレクタを繋ぐ**スペースは配下の絞り込み**。絞り込みは、直下を表す`>`や、且つを表す`.`も使える。

＞（参考）[cssセレクタの記号の意味](https://qiita.com/yuta-38/items/cde4cda3dfab29c20aa1)。


##実例
次のようなul > li > div > div > p　という深い階層の繰り返しがある場合に、`nth-of-type`を使って、一番深いpタグのみにスタイルを適用する。

```html:html
<ul>
  <li class="nth-test-li">
    liの要素
    <div class="nth-test-div1">
      li > div1の要素
      <div class="nth-test-div2">
        li > div1 > div2の要素
        <p class="nth-test-p">li > div1 > div2 > pの要素</p>
      </div>
    </div>
  </li>
  繰り返し
</ul>
```

<br>
繰り返す親要素は`li class="nth-test-li"`なので、これに`nth-of-type`を適用する。

その次にスペースを開けてスタイルを適用したい要素を指定する。

```css:.css
.nth-test-li:nth-of-type(2n) .nth-test-p {
  color: blue;
}
```

偶数番目のnth-test-liクラスの中のnth-test-pのある要素にのみスタイルを適用する指示になる。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/fdde7611-bb97-d0ae-a7dd-fa640b5c5539.png)|
|:--|


狙ったタグのみがスタイル適用されている。

<br>
##SASS(scss)を使うと簡単にかける。
scssを使うとわかりやすく記述できる。

```scss:.scss
.nth-test-li{
  &:nth-of-type(2n){
    .nth-test-p{
      color: blue;
    }
  }
}
```

↓↑同じ

```css:.css
.nth-test-li:nth-of-type(2n) .nth-test-p {
  color: blue;
}
```

`&`は外側のセレクタを代入する。内側の階層で記号がない場合はスペースを空けてつなげる（配下の意味）。

<br>
以上。
デストラクタが正常に呼ばれないことでメモリリークしまくった

# 経緯
ゲームを制作していました。僕は新たな変更をしていました。
データが幾らか含まれたクラスをテスト用にダミーでローカル変数で置いておいたのをメンバ変数に引っ越しました。これが悲劇の始まりだったのです……。




# ソース
↓に事故ったプログラムの簡易版を上げておいたので、見たい人は見て下さい。以降は例プログラムといいます。

https://github.com/Sankyuri/SKRPQ001_DTRCTR_MEMRK

#### 例プログラムの説明
Visual Studio 2019 のプロジェクトです。
`class Base` を継承する `class Child` があり、その中には `class Datas` メンバ変数があります。
この `class Child` は、 `class MyMain` の中で `Base * 型` として保持しています。
`class MyMain` に `Base *` メンバ変数を初期化する関数、解放する関数が含まれます。

`class Base` にデストラクタは含まれず、 `純粋仮想関数` が含まれます。
`class Child` には `virtual デストラクタ` が含まれます。

クラス名の適合性は気にしないでね。




# 何が起こるかな
`Windows 10 Pro x64`, `Visual Studio 2019`, `Debug x86` で検証します。
例プログラムを実行すると、

````text:実行結果
Datas のコンストラクタ
Child のコンストラクタ
````

<!--と表示され、次に**アサートがポップアップされそのまま何も起こらなくなって死にます。**
おかしなことに(？)、僕が嵌った方のプログラムでは、**アサートは出ず、デストラクタが呼ばれずにメモリリークしまくって正常終了(は？)しました**。-->

と表示されます。**アサートが出ることも無く、デストラクタが呼ばれずにメモリリークしまくって正常終了(は？)します**。
`class Datas` も `class Child` もデストラクタが呼ばれずに、 `class Datas` のメンバ変数が解放されずメモリリークするという具合です。




# 派生クラスのデストラクタの復習
基底クラス型として動的確保した派生クラスのヒープのポインタを使用した時に、基底クラスのデストラクタも派生クラスのデストラクタも呼び出す為には、どちらのクラスのデストラクタにも `virtual` 修飾子を付加しますね。あとは自分で調べてくれ(丸投げ)。




# 作ってるゲームで起こった異変
『経緯』で行った操作をした結果、前バージョン(GitHub で管理しています)で起こらなかったメモリリークがなんか大量に発生しました。メモリリークは `malloc()` や `new` で動的確保した場合にしかふつう発生しないのですが、僕はC言語スタイルで(※ヒープの管理を怖がって `new/delete` をさぼってるだけ)実体を扱うようにしています。なので、データクラス内の STL の解放失敗が原因だとすぐに察しました。

で、解放する為にデストラクタで解放関数を呼び出すようにしました。

```` cpp
デ　ス　ト　ラ　ク　タ　が　呼　び　出　さ　れ　な　い　で　は　あ　り　ま　せ　ん　か　！
````
※↑こういうことに使う機能ではありませんね。失礼しました。




# 解決方法
**基底クラスにも `virtual デストラクタ` をちゃんと実装しましょう。**……それだけでした。
いや、あのですね(言い訳タイム)、『何が起こるかな』で挙げたように、基底クラスに `virtual デストラクタ` が無かったにも関わらずアサートが出ずにアプリケーションが終了していたんですよ。なので全然気付かなかったんですよ。多態性クラスのデストラクタは `virtual` にしなければならないことも知っていましたが、まさか基底クラスにも `virtual デストラクタ` を**ちゃんと実装**しなければならないだなんて思っていませんでした。
**しかも肝になるのが基底クラスの `純粋仮想関数` の存在です。こいつが無ければアサートがポップアップされます。**嘘みたいな本当の話です。基底クラスが抽象クラスだと、例プログラムの様にしたときに何食わぬ顔をして想定と違う動作をするのですよ。(因みに例プログラムで最後までどうすれば完全再現できるのかと悩んだ部分です。)

…まあ、要するに僕のミスです。俺が悪いんだよ。




# まとめ
抽象基底クラスには必ず `virtual デストラクタ` を実装する。というかコンストラクタとデストラクタはとくにやることが無くても忘れずに実装した方が良いと思います。

あとたちの悪いことに、抽象基底クラスに `virtual デストラクタ` を実装し忘れると派生クラスのデストラクタすら呼ばれなくなります。恐らく、デストラクタに `virtual` を付けない場合は基底クラスのデストラクタしか呼び出されないのですが、抽象クラスの場合は謎の力でデストラクタが `デフォルト定義非仮想デストラクタ` として勝手に作られるんじゃないでしょうか。検索しても分からなかったし、関数の方はメモリレベルのデバッグ方法を知らないので結構大胆な予想になります。

**_【2021/04/30追記】_**
コメントでも頂きましたが、そういえば確かに、コンストラクタもデストラクタも暗黙定義はされるし仮想関数の方が高コストでした。暗黙定義のデストラクタはそういう理由で仮想にはならないようです。若干寝ぼけていたとはいえ、忘れていたのは結構痛く思います。
因みに、絶対使わないであろう面白豆知識も頂きました。




# 終わりに
なんやかんやあって予定が狂って大変だったところにこの事例が発生したので、今日(2021/04/29)は実質何も出来ませんでした。いやあ、折角の祝日というのに、一日無駄になった気がします…。
あと、記事を書いてる途中でタイトルは「抽象基底クラスにデストラクタを定義するのを忘れて事故った」にしようか迷いましたが、やっぱり変えないでおきました。
docker-compose + rails の環境構築

https://github.com/katoy/test-with-docker
に docker-compose + rails の環境構築する手段を記載しました。

現時点では、 system テストで スクリーンショット取得できるところまでです。
今後 request テスト、 models テスト例を追記していく予定です。
また、 metoric 計測レレポート、 profile 計測、 DB の GUI クライアントなどについても記載していきます。
eslintを実行した際に発生する'module' is not definedのエラーの消し方

# トラブルの内容
- eslintを実行したときに'module' is not definedと表示されてしまうが、このエラーの直し方がわからない。

# 作業環境
- Mac OS 
- VS Code
- node v12.15.0
- npm 6.14.8
- eslint 6.14.8

# トラブルの発生状況
- 初めてeslintを使うというレベルのユーザが対象です。
- eslintをWebを見ながら設定をしていき、いざeslintを実行をします。

```
// eslintの実行
./node_modules/.bin/eslint *.js
```
- すると、以下のエラーが表示されます。

```
/Users/[ユーザー名]/[作業ディレクトリ]/.eslintrc.js
  1:1  error  'module' is not defined  no-undef

✖ 1 problem (1 error, 0 warnings)

```
- これは、eslintrc.jsの１行目に書かれているmodule.exports = {の部分でエラーが発生しています。

# 解決方法
- .eslintrc.jsのファイルを以下のように変更すれば解決します。
- [-]の行を削除して、[+]の行を追加して下さい。

```
module.exports = {
  env: {
    browser: true,
[-] es2021: true
[+] es2021: true,
[+] node: true,
  },
  extends: "eslint:recommended",
  parserOptions: {
    ecmaVersion: 12,
    sourceType: "module",
  },
  rules: {},
};

```

- 再度、eslintを実行して、エラーが表示されないことを確認します。
- 以上です。


# その他

## 別のコマンドでeslintを実行する方法
- 以下のコマンドでもeslintを実行できます。

```
npm run lint
```

- ただし、このコマンドでeslintを実行させるためには、packeage.jsonを以下のように編集する必要があります。

```
{
　〜省略〜
  "scripts": {
[-]    "test": "echo \"Error: no test specified\" && exit 1"
[+]    "test": "echo \"Error: no test specified\" && exit 1",
[+]    "lint": "eslint *.js"
  },
  〜省略〜
}
```

## 参考サイト
- https://www.webprofessional.jp/up-and-running-with-eslint-the-pluggable-javascript-linter/
form_with使用の際model:を使ったときにエラーになった話

##はじめに
プログラミング初学者のため、自分の理解できている範囲内で言語化しています。
何か間違っている情報や改善点などありましたら、コメントいただけますと幸いです。🙇‍♂️

##何が起きたのか
```html.erb
<%= form_with model: @information, class: 'form' do |f| %>
```
簡単なお問い合わせ機能を作成しようとしたときに、
form_withの**model:**でモデルのインスタンスを指定したら、
**path**が違うというエラーが出たので、**url:**で指定したら、成功した。
が、、、データベースに情報を保存したかったため、**model:**でどうしてもやりたかったが
エラーがなかなか倒せなかったので、調べようと思った😭

##このエラーのよくある原因
1.『@モデル名』 の部分が記述ミス
2. コントローラーでインスタンス変数がうまく設定できていない
3. モデル自体を複数形で作ってしまっている
まずはそこをチェック。**

**それ以外の人はこの方法で行けるかも🏄‍♂️**

##最終的な解決策
**url:**も指定して、正しいpathを記述する

```html.erb
<%= form_with model: @information, url: informations_path, class: 'form' do |f| %>
```
**model:**を使うと、作ってもいないpathを使おうとしていたので、url:も指定して解決することができた。
モデルだけ指定して、変なpathや、うまくいかない人はこれを試すと良い

ちなみにモデルの名前を複数形にしたりすると、このようなエラーになるみたい、、、
私はいろんなとこを確認しても、原因がわからなかったので力技みたいですがこれで解決

##url: model:　の違い
大まかな違いは、データベースに情報を保存するかしないかである
保存する　→　**model:**
保存しない　→ **url:**
を使う。

これによって**コントローラー**の**ストロングパラメーター**の記述も変わる

**url: →　params.permit(:name, :email)**
**model: → params.require(:user).permit(:name, :email)**

##まとめ
今回は、エラーの原因がわからなかったが、とりあえず完成を優先したかったので解決してよしとしたが、原因を知らないのは悔しい、、、
また、仮に**url:**のままでお問い合わせ機能を作ったとして、うまく投稿できなかったときのバリデーションのエラーメッセージの表示はどうするのか気になった。
本来であれば、**if model.errors.any?** を使うから、modelの部分はどうなる？
疑問がさらに疑問を産んだため、いったんここで打ち切り😭
また次の機会で投稿してみようと思う腕
Cropper.jsのsetDataが動かない現象の解決

#はじめに

CropperjsのVueラッパーコンポーネントである、vue-cropperjsのsetDataメソッドが一部の環境で動かなず、苦戦したので記事にしました。

#起こった現象

setDataメソッドがPCでは問題なく動作するが、スマホだと動作したりしなかったりと不安定な挙動をしました。

#解決策

CropperjsのsetDataメソッドの説明で「Note: This method only available when the value of the viewMode option is greater than or equal to 1.」
つまり「viewModeオプションが1以上だと使用できる」と書かれています。

viewModeオプションはデフォルトだと0に設定されているため、この設定を2にしたら無事スマホでも安定して動作しました。

viewModeオプションの内容や、setDataに関しては、[公式ライブラリのREADME](https://github.com/fengyuanchen/cropperjs)を確認してください。
私は確認を怠ったため苦戦してしまいました...

#まとめ

PCでは問題なく動作していた機能をスマホで試したら全然動かなかったのでとても焦り、問題個所を探し出すのも大変になってしまいました。

今後は公式ドキュメントをちゃんと読んでから実装するよう心掛けたいと思います。

この記事は以下の情報を参考にして執筆しました。
- [fengyuanchen/cropperjs](https://github.com/fengyuanchen/cropperjs)
- [Agontuk/vue-cropperjs](https://github.com/Agontuk/vue-cropperjs)
SalesforceのIdが何のオブジェクトのものか調べる方法

Salesforceで何のオブジェクトのものか分からないIdがあるときの調べ方です。
# やり方
例えば「0062w0000040XbHAAU」というIdが何のオブジェクトのものか調べたいとします。

アドレスバーで、対象のIdをドメインの下にスラッシュ「/」を付けて入力、そのままEnter
![スクリーンショット 2021-04-29 231953.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707557/8350c4c5-6aca-7169-9ba9-e97050d9191c.png)
するとそのIdのレコードの詳細ページにリダイレクトされます。
![スクリーンショット 2021-04-29 232233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707557/4cb777a1-ccdf-6193-d512-ce3d4342b9b0.png)
この場合は商談オブジェクトのレコードであることが分かりました。

ちなみにこの方法はレコード以外のIdでも使えることがあるようです。

例えば「01I2w000000zKDh」というIdが何のIdか調べたいとします。
先ほどと同じように、対象のIdをドメインの下にスラッシュ「/」を付けて入力しそのままEnter
![スクリーンショット 2021-04-29 232838.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707557/2aaf6260-9454-af18-35ba-4cbb486b17ad.png)
オブジェクトマネージャのスケジュールポリシーオブジェクト（Salesforce Field Serviceという製品に含まれるカスタムオブジェクト）の画面にリダイレクトされました。
![スクリーンショット 2021-04-29 233132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707557/d76b74c2-7616-6e1e-3261-3fea6fd44416.png)
"IPアドレス"とは何なのか？

# 本記事について
* 開発未経験
* サーバーやネットワーク知識も座学程度(ITパスポート、基本情報技術者試験)

の人物が実際に手を動かして学んだことの振り返りで書いています。
更に効率の良い方法や認識違いの点がありましたらコメントください。

# 本記事で行うこと
* IPアドレスの自己解釈メモ

本記事を読む時間の目安は、**3m**です。

# 本記事の前提知識
なし

# 本編
## IPアドレスとは
携帯やPCなどのデバイス、サーバー(以下"エンドポイント")に割り振られる番号

## IPアドレスはなぜ必要なのか？
リクエストの要求元や要求先を正しく識別するため

## IPアドレスの種類
* グローバルIPアドレス/パブリックIPアドレス
* プライベートIPアドレス

### グローバルIPアドレス/パブリックIPアドレス
インターネットに接続する際に用いるIPアドレス

### プライベートIPアドレス
インターネットで使われないIPアドレス

## IPアドレスの構成
* IPv4
* IPv6

### IPv4
32ビットの数字を8ビットずつドットで分け、10進法で表す

### IPv6
128ビットの数字を16ビットずつドットで分け、16進法で表す

# 教材/参考文献
なし
cli(ターミナル)でもメトリック監視したくないっすか？


# まえせつ

人生の1/4位エンジニアやってきたけどメッセージ監視がここまで生き残るとは思ってもみなかった！

深夜とかに

Zabbix「エラー！」
ワイ「なんやろな・・調査始めるか・・ディスク枯渇か。削ってくしかないなー」
（調査して5分後・・）
ザビ家「OK」
ワイ「自然復旧かよ・・寝るか」
（30分後）
ザビ「エラー！(ニチャア)」

### というのを解消してくれるのが、このツール！

# 作ったわ！

<a href="https://github.com/yasutakatou/metricli"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/yasutakatou/metricli.png" width="460px"></a>

詳しくはリポジトリで。バイナリをダウンロードして即使いたいなら[こっち](https://github.com/yasutakatou/metricli/releases)

# つかいかたは？

要するにSSHでコマンド投げて、世代数で評価して閾値を越えたら任意のコマンドを実行するツールです。
なので最近、閾値付近でうろうろしているサーバーに絞って監視を仕込めるのがウリです。
あと突発的に跳ね上がる値もキャッチしてくれます！

SREの朝会、みんなでダッシュボード眺めるとしても台数が千台越えしてたらターゲット絞るしかないし、それを定量的にやるってのもなぁって思って。
各自でバッチで気になるとこチェックかけて、問題あった結果だけアクションすれば良くね？ってのが
このツールの着想です。安全な警告と危険な警告の総合評価ってまだ人間しか出来ないと思うしさ。

# あとがき

こういうのcronでブン回したら監視SaaSをクラウドに適用する意味も薄れるかもしれないと思う。
クラウド補完計画がkubernetesで実現するとしても、それはまた先の未来で今は人のインサイト頼りで当面それは変わらないだろな。。
バッチファイルでWindowsのイベントログをエクスポートする

Y子です。
Windowsのイベントログをエクスポートするバッチファイルを作ってみました。

障害発生時の原因切り分けや、保守期間の稼働状況調査のために、OSのイベントログを持ち帰る、という用途を想定します。
_【[確認環境：Windows 10 Home (Bld. 19042.928)](https://qiita.com/koiwaiwaiko/items/ef2d457ae1e1a7c8b698 "Windows10のバージョンを確認・表記する")】_

# 仕様
* システムログ、アプリケーションログをファイル化する
* 7日以上分をファイル化する
* EVTX形式とTXT形式でファイル化する

「7日以上分」は、今日が月曜としたら、「前の週の月曜の0時から現在まで」の期間とします。
「EVTX形式」とは、ダブルクリックするとWindowsの「イベントビューアー」で表示できる形式です。

# コード
```bat:export_evtlog.bat
@echo off
setlocal

rem ログを取得する日数(昨日=1)
set backday=7

rem ログを保存するフォルダ
set savedir=.

rem GMT→JST変換のため、さらに1日前の15時をログ取得開始時刻とする
set /a backday=%backday%+1

set str_date=%date%
set str_date=%str_date:~0,4%%str_date:~5,2%%str_date:~8%

set str_time=%time: =0%
set str_time=%str_time:~0,2%%str_time:~3,2%%str_time:~6,2%

rem ファイル名(前半部分)作成 …保存先フォルダ名も結合しておく
set file_name_pre= %savedir%\%computername%_%str_date%_%str_time%

rem 「x日前」の日付文字列を作成
for /F "usebackq delims=" %%a in (`powershell "(get-date).AddDays(-%backday%).ToString(\"yyyy-MM-dd\")"`) do set tgt_date=%%a

rem ファイル保存（EVTX形式）
wevtutil epl system      %file_name_pre%_sys.evtx "/q:*[System[TimeCreated[@SystemTime>='%tgt_date%T15:00:00']]]"
wevtutil epl application %file_name_pre%_app.evtx "/q:*[System[TimeCreated[@SystemTime>='%tgt_date%T15:00:00']]]"

rem ファイル保存（TXT形式）
wevtutil qe system      /f:text "/q:*[System[TimeCreated[@SystemTime>='%tgt_date%T15:00:00']]]" > %file_name_pre%_sys.txt
wevtutil qe application /f:text "/q:*[System[TimeCreated[@SystemTime>='%tgt_date%T15:00:00']]]" > %file_name_pre%_app.txt

endlocal
```

# 説明
ログの取得日数を、`backday`で7日間としてあります。必要に応じて変更してください。

ログを保存するフォルダは`savedir`で定義して使います。
今回のコードの「`.`」のままだと、実行時のカレントフォルダに保存されますので、必要に応じて変更してください。

保存されるファイル名は、`コンピュータ名_日付_時刻_種別.拡張子`という形式にしてあります。
複数のPCからログを集めた際に分からなくならないよう、`%computername%`を使ってコンピュータ名を付けてあります。
日付時刻は、バッチファイルを実行した時刻が入ります。
種別は、システムログが`sys`、アプリケーションログが`app`としてあります。
EVTX形式とTXT形式は、拡張子で区別してあります。

イベントログのエクスポートは`wevtutil`コマンドを使っています。
抽出期間の指定はGMTで行うため、日本時間の「7日前の0時」は、GMTの「8日前の15時」として指定します。
「n日前の日付」は、powershellを使って計算しています。

`wevtutil`コマンドに渡す条件式は文法が難しいですが、Windowsのイベントビューアーを使って作成できます。
イベントビューアーでシステムログ等を表示させ、「カスタムビューの作成...」から、条件に合うように「フィルター」を設定すると、そのフィルタの内容が「XML」タブに表示されます。
それが、そのまま条件式に使えます。

今回のコードでは、システムログ・アプリケーションログを例として扱っていますが、他にも多くのログをエクスポートすることができます。
Windowsのコマンドラインから`wevtutil el`を実行すると、指定できるログの候補が表示されます（わたしのPCでは1000種類以上！）。
ただし、権限がなかったり、蓄積していなかったりして、エクスポートできないログもあるようです。

EVTX形式とTXT形式の両方を保存するコードですが、正直なところ、どちらかがあればよいと思います。
使い勝手の良い方を残してお使いください。

# 使い方・実行結果
収集したいタイミングで実行したり、タスクスケジューラーに登録して定期的に実行したりします。
ログの蓄積状況によりますが、数秒で指定ファイルが保存されます。

# おわりに
どちらかと言うと、保守よりは開発が楽しいと思う性分なので、イベントログってあんまり見ないんですよね…。
ただまあ、アプリケーションが残すログで判断がつかない事象は、イベントログを確認することになるので、最後に頼るもの、というイメージがあります。
ローテートされて消えちゃう前にファイル化しておく、そのための今回のバッチファイルです。
だいじ。

ではでは！
indesign スクリプト 構造内の要素を選択（要素名から）

構造内の要素名から要素を選択するスクリプトはこれで良いのかな・・・？

~~~JavaScript
/*
 構造内の要素名から要素を選択
 更新 2021/6/03
*/

// アプリ指定
#target "indesign";

// スクリプト名
var scriptName = "構造内の要素を選択（要素名から）";

// 検索文字を入力
var findGrepText = prompt("構造内の要素名（JavaScriptの正規表現）\n（選択された構造内の要素がある場合はその中から検索）","",scriptName);

// キャンセルされた時の処理
if(findGrepText == null){

    // スクリプトを終了
    exit();
}

// エラーが発生した場合の処理
try{
        
    // 正規表現オブジェクトを作り検索文字に入れる
    findGrepText  = new RegExp(findGrepText,"g");
        
// エラーの場合
}catch(e){

    // 検索文字にnullを入れる
    findGrepText = null;
}

// 選択されているオブジェクト記憶用
var selectObjects = [];

// 選択が存在しない場合
if(app.activeDocument.selection.length == 0){

    // 構造内のすべての要素を選択する関数を使用
    selectObjects = selectAllElements(app.activeDocument.xmlElements,selectObjects);

// 選択が存在する場合
}else{

    // 選択されているオブジェクト
    selectObjects = app.activeDocument.selection;

    // すべての選択を解除
    app.activeDocument.selection = null;
}

// 選択の数だけ繰り返す
for(var i = 0; i < selectObjects.length; i++){

    // 選択が要素の場合
    if(selectObjects[i].constructor.name == "XMLElement"){

        // タグ名を検索して引っかかった場合
        if(selectObjects[i].markupTag.name.match(findGrepText)){

            // 選択に追加
            selectObjects[i].select(SelectionOptions.addTo);
        }
    }
}

// 結果表示
alert("選択数 " + app.activeDocument.selection.length,scriptName);

/* 構造内の全ての要素を選択する関数、引数（xmlElements,再帰的処理の為の選択を記憶する配列） */
function selectAllElements(hierarchyElements,selectObjects){

    // 要素の数だけ繰り返す
    for (var i = 0; i < hierarchyElements.length; i++) {

        // 要素に子要素が存在するか
        if(hierarchyElements[i].xmlElements.length > 0){

            // 存在する場合再帰的処理
            selectAllElements(hierarchyElements[i].xmlElements,selectObjects);
        }

        // 要素を選択を記憶する為の配列に追加
        selectObjects.push(hierarchyElements[i]);
    }

    // 選択する為のオブジェクトの値を戻す
    return selectObjects;
}
~~~
Railsチュートリアルまとめ 第4章

# 第4章について
この章では主にRubyのメソッド、クラスについて紹介している。Rails風となっているがRails特有のメソッドもあるのでRubyで同じようにが使えるとは限らないが、RailsにおけるRubyの使い方について学習した。なおシングルクオートとダブルクオートの違いや他と共通するような簡単な言語の仕様などについては省略する。

# 目次
[1.ヘルパーについて](#1-ヘルパーについて)
[2.rails console](#2-rails-console)
[3.rubyのクラス](#3-rubyのクラス)
[4.rubyのメソッドやシンボル](#4-rubyのメソッドやシンボル)
[5.おまけ](#5-おまけ)

#1. ヘルパーについて
Railsにおいてビューで使えるような関数を新規で作成する(カスタムヘルパー)にはapp/helpers配下にある〇〇.helper.rbに関数を定義する。もし仮に全てのページで使用するようなヘルパーを作るのならapplication_helper.rbに、StaticPagesコントローラ用のヘルパーを作るのならstatic_pages.helper.rbにヘルパーの内容を書く。
ちなみにRubyでは関数の引数は型宣言しなくても使用することができる。

#2. rails console
Railsアプリケーションを対話的に操作できるコマンドラインツール。
Rails consoleを使うとちょっとしたコードを試したり、データベースとのやりとりをここでしたりと開発において便利なツールとなっている。
Rails consoleを使う際デフォルトではdevelopment環境になっているが`rails console -e (developmentかtestかproduction)`のようにオプションに-e(--environment)を指定することで起動する環境を指定することができる。
また、そのままconsoleを使ってしまうとデータが変更できてしまうのでオプションに-s(--sandbox)を付けることデータを変更することなくコードを試すことができる。

#3. rubyのクラス
Rubyではnilを含めてあらゆるものがオブジェクトとして扱われる。
例: String < Object < BasicObject
Rubyの全てのクラスは最終的にはBasicObjectを継承している。
またRubyではStringクラスのような基本クラスを拡張することもできる。
`class String
   def palindrome?
     self = self.reverse
   end
 end
`
*selfはオブジェクト自身。

#4. rubyのメソッドやシンボル
Railsチュートリアルで出てきたメソッドは以下の通り。以下は全てRubyのメソッド。

* to_a ... 配列に変換する
* puts, print ... 文字列や変数などを出力する。(putsは改行あり、printはなし)
* nil? ... オブジェクトが存在するかどうか(そもそも変数が定義されていないなど)
* empty? ... オブジェクトが空かどうか(空白はfalseになる)
* blank? ... オブジェクトが空白かどうか(空白やnilはtrueになる)
* shuffle ... 配列オブジェクトの位置をランダムに移動させる
* reverse ... オブジェクトを左右反対に並べ替える
* split ... 文字列を１文字列切り分けて配列にする。引数()に文字を指定するとその文字を区切り文字とすることができる
* join ... 配列を繋げて一つの文字列にする。引数に文字を指定すると区切り文字と合わせて文字列にすることができる
* push() ... 配列に引数に指定された要素を追加する
* 0..9 .... 0~9までの範囲を指定することができる
* %w [] ... []内にある要素を文字列の配列に変換する
* length ... 文字列の長さを表示する
* each文 ... 配列や範囲オブジェクトの要素を一つずつ変数に取り出して命令を実行する。
オブジェクト.each {|変数| 命令文} あるいは オブジェクト.each do |変数| ~~~ endのように使う。

ハッシュではシンボルを使うことができる。シンボルは{:name => '名前'}か{name: '名前'}のように使う。
Rubyでは配列の要素は数字で指定するが、ハッシュでは文字列を要素に指定することができる。

#5. おまけ
consoleを使っていて気付いた事だがRubyの比較演算子は他の言語と違って厳密な比較はない。むしろ`===`は'=='に比べてゆるい比較を行う。`===`は左辺がクラスオブジェクトなら右辺がそのクラスのインスタンスであるかどうかを比較する。
以下の記事がわかりやすかったので参考にした。
[Rubyの===演算子についてまとめてみた](https://techracho.bpsinc.jp/hachi8833/2017_01_19/32941)

# 参考文献
[配列とハッシュとシンボルは紛らわしいので整理！！](https://qiita.com/iron-breaker/items/32710004f0bb2e2babb6)
[nil?empty?blank?present?の使い分け](https://qiita.com/somewhatgood@github/items/b74107480ee3821784e6)
便利なクラス指定方法

# こんな要素があります

divに囲まれたpタグ達

``` .html

<div>
  <p>要素１</p>
  <p>要素２</p>
  <p>要素３</p>
  <p>要素４</p>
  <p>要素５</p>
</div>

```

# nth系の擬似クラスを使う

特定要素配下の最初か最後の要素を指定して、スタイルを付けることができます。

``` .css
/* div直下の最初 */
div > p:first-child {
  background: yellow;
}
/* div直下の最後 */
div > p:last-child {
  background: tomato;
}
```

![8f5e64b094a4982135804a5457412d8c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681029/72f8c3d9-e11f-c4f4-96a9-6a4f6143b337.png)


偶数要素と奇数要素のみにスタイルを付与するには、

``` .css
/* 偶数（even） */
p:nth-child(even) {
  background-color: skyblue;
}
/* 奇数（odd） */
p:nth-child(odd) { 
  background-color: skyblue;
}
```

奇数の方を適用させたらこんな感じになります。

![d385eb01b2ba4b3d4a329fc6110a53de.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681029/3ecc3a4e-21e7-cdb3-ee5e-6e66eefb1a90.png)


基本的な `:nth-child(3)` のように順番を使用するパターンに加え、
下記のように、３番目から７番目、みたいなこともできます。
`p:nth-child(n+3):nth-child(-n+7)`


# [ ] かくかっこ を使う

[ ] は属性をあらわすセレクタで、^ を $ にすると「指定した文字列で終わる」、 ＊ にすると「指定した文字列が含まれている。という意味になります。

``` .css
body > [class*="btn"] {
    display: none;
}
```

クラスに `btn` という文字列を含む要素全て。
[Rails]deviseを使ったビューファイルの作成

## はじめに
RailsでWebアプリケーションを作る時にdeviseを使ったので備忘録として残しておきます。
今回はdeviseで作成できるビューファイルの作成をしていきたいと思います。


## ビューの作成方法
deviseでは認証周りが実装されたビューファイルを一行のコマンドで作成することができます。
作成する場合はターミナルで下記のコマンドを実行します。

```
$ rails g devise:views
```
すると`app/view`の下に`devise`フォルダが作成されます。
![スクリーンショット 2021-04-29 23.08.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991598/7fd75a72-9de9-9d86-e508-b5b392a9375c.png)

さらに`devise`フォルダ下に7つのフォルダが作成されています。
これらの各フォルダがどのビューに対応しているかは以下になります。

| フォルダ名 | フォルダの内容 |
|:-:|:-:|
|  confirmations |  パスワード再発行のフォーム |
|  mailer |  メール認証のフォーム |
|  passwords | パスワード関連のフォーム  |
| registrations  |  ユーザー登録やユーザー編集のフォーム |
| sessions  |  ログインフォーム |
|  shared | 各フォームに表示されている、リンクのパーシャル(部分テンプレート)が入っている  |
|  unlocks | アカウントロック通知を行うフォーム  |

これらのビューは簡素なデザインなので自分でアレンジすると良いです。
以上です。

## 参考
https://pikawaka.com/rails/devise
新人回路設計職におすすめの書籍

## はじめに
回路設計職として働きだした方向けに私が今まで読んでみて好印象だった書籍をまとめます。
独断と偏見しかありませんので参考程度に。

## 全般
基礎の基礎から解説してくれています。
この本に記載されている内容はスラスラ分かるまで反復してください。
基礎がしっかりしてれば応用も簡単に感じます。
https://shop.cqpub.co.jp/hanbai/books/46/46931.html

以下は「アナログ回路シミュレーション検定」という資格の出題範囲となっている問題集です。
問題解説とLTSPICEのサンプルまで付属してくれているという無料なのに素晴らしい内容です。
https://cc.cqpub.co.jp/system/contents/1630/

「アナログ回路シミュレーション検定」は何となく面白そうなのでそのうち受験してみようと思います。
追記21/6/13
受験してきました。合格しましたが初歩的な試験で80点って..基本的には上記の問題集から出題されます。
80点の私では偉そうな事は言えないですが、決して難しい試験ではないので興味のある方は受験してみて下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695279/a9865f7e-8067-339d-5bbc-5e2c79736a0e.png)

<font color="MediumSlateBlue">追記22/6/1</font>
「EMC設計技術者資格」という資格があります。以下の練習問題を見ていただくと分かるとおり、
EMCに特化したわけでもなく電子回路全般の試験です。実務寄りの内容ですので練習問題を解いてみることは新人さんにおすすめです。
この資格を取得後実務経験を積むことにより上位資格のEMC設計技術者（シニア）資格が受験可能になります。
https://www.kec.jp/wp/img/committee/2022/emcde22_005.pdf

<font color="MediumSlateBlue">追記23/2/23</font>
受験しました。結果通知はメールで届きます(謎の0.5点..)
書籍の持ち込みは可能ですが私が持ち込んだのは書籍一冊と電気無線高周波関連の公式を纏めたプリントのみです。(高得点でもない私が言うのもどうかと思いますが)実務でやってる概算計算や設計ルールで素直に解ける問題も多く、難易度は高くないです。上記の練習問題の理解度チェックに如何でしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695279/71c1f7d8-f27d-31fd-70bd-674c764ce9cd.png)

## 電源回路
電源回路はつぶしがきく(ほぼ全ての電子機器が搭載されているから)ので
興味がない方も是非覚えてください。

https://shop.cqpub.co.jp/hanbai/books/46/46371.html

https://shop.cqpub.co.jp/hanbai/books/46/46331.html

https://www.cqpub.co.jp/hanbai/books/42/42051.htm

## 計測関連
各種計測器の等価回路や計測時のテクニック、プローブの選択方法などなど
回路設計者必須の知識が書かれています。
書籍内に登場する計測基板はパネルdeボードで製作できます。


https://shop.cqpub.co.jp/detail/1645/

## EMC
EMI・EMC対策は開発の初期段階から手をうっておかないとどうしようもなくなります。
これはThe定番の書籍。知りたいことは大体載っています。

https://www.tdupress.jp/book/b349398.html

以下の書籍は理論のみならず実践に近い内容で興味深かったです。

https://shop.cqpub.co.jp/detail/2247/

<font color="MediumSlateBlue">追記22/6/1</font>
ＣＩＳＰＲ規格
https://www.tele.soumu.go.jp/j/adm/inter/cispr/cisprkikaku.htm

## CPU
今の電子機器は殆どの場合CPUが搭載されています。
ファームウェア設計者に仕様を提示したり実機評価時にデバックコマンドからCPUを制御する機会があります。そういった業務を円滑にこなすためにはCPUの基本的な構造、プログラミング方法を知っておかなければなりません。
以下の書籍はとても簡潔シンプルに要点がまとめられており入門者におすすめだと感じました。
[組込みエンジニアの教科書](https://www.c-r.com/book/detail/1308)
[組込み開発のための実践的プログラミング
](https://www.kindaikagaku.co.jp/information/kd0561.htm)

## FPGA/CPLD
FPGA/CPLDは一昔前に比べると需要がなくなってしまいました。
私はFPGA開発も過去に行っており個人的に大好きなので掲載します。
以下の書籍の中でもRTL設計スタイルガイドはSpyGlassのルールにも組み込まれている業界標準、一般常識です。
恐らくRTLレビューで誰もが指摘してくる内容なので内容理解は必須です。


[LSI設計の基本 RTL設計スタイルガイド Verilog HDL編]
(https://bookway.jp/modules/zox/index.php?main_page=product_info&products_id=809&cPath=)

https://shop.cqpub.co.jp/detail/1038/


https://www.ohmsha.co.jp/book/9784274218644/

## その他
アナログ・デバイセズ社様にてオペアンプ関連の書籍のPDFを無償でダウンロードできます。
内容は若干難しいと感じるかもしれませんが興味があればぜひ読んでみて下さい。

https://www.analog.com/jp/education/landing-pages/003/opamp-application-handbook.html

以下は書籍ではありませんが私が個人的に尊敬している石井聡さんが執筆されている技術ノート集です。
理論から実機での振る舞いまでとてもためになる内容ですので是非読んでみて下さい。

https://www.analog.com/jp/education/landing-pages/003/jp-web-lab.html
AWS EC2 の CPU 使用率を取得する方法（Ruby）

```ruby:Gemfile
gem 'aws-sdk-cloudwatch'
```

## 特定インスタンスの CPU 使用率(最大値)を1日分取得する例
```ruby
metric = Aws::CloudWatch::Metric.new(
  'AWS/EC2',
  'CPUUtilization',
  region: region, # 例: 'ap-northeast-1'
  credentials: Aws::Credentials.new(
    access_key_id,
    secret_access_key
  )
)

result = metric.get_statistics(
  start_time: Time.now.beginning_of_day,
  end_time: Time.now,
  statistics: ['Maximum'], # SampleCount, Average, Sum, Minimum, Maximum を指定可能です
  period: 60 * 60 * 24,    # 1 day
  dimensions: [{ name: 'InstanceId', value: instance_id }] # EC2 instance の Instance ID
)

result
=>
#<struct Aws::CloudWatch::Types::GetMetricStatisticsOutput
  label='CPUUtilization',
  datapoints=[
    #<struct Aws::CloudWatch::Types::Datapoint
      timestamp=2021-04-28 15:00:00 UTC,
      sample_count=nil,
      average=nil,
      sum=nil,
      minimum=nil,
      maximum=24.0,
      unit='Percent',
      extended_statistics={}
    >
  ]
>
```

## 参照
- [Class: Aws::CloudWatch::Metric | 公式ドキュメント](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/CloudWatch/Metric.html)
- [Rubyからaws-sdkを使ってCloudWatchのメトリックスを取得する | ぺけみさお](https://www.xmisao.com/2014/07/29/ruby-aws-sdk-get-cloudwatch-metrics.html)
[Android]RoomのRewriteQueriesToDropUnusedColumnsアノテーションについて

Room の 2.3.0 から [RewriteQueriesToDropUnusedColumns](https://developer.android.com/reference/androidx/room/RewriteQueriesToDropUnusedColumns) というアノテーションが追加されていたので、こちらについて調べてみました。

Room では以下のように Dao で `@Query` メソッドを定義することによって、データベースからデータが取得できます。

以下はユーザーのデータを取得する例です。

```kotlin
@Entity(tableName = "users")
data class User(
  @PrimaryKey val id: Int,
  val name: String,
  val age: Int,
  val gender: Gender,
  val address: String
)

@Dao
interface UserDao {
  @Query("SELECT * FROM users")
  fun getUsers(): List<User>
}
```

この時、例えばユーザーの名前と年齢だけあればよいのであれば、以下のように書くこともできます。

```kotlin
data class UserNameAndAge(val name: String, val age: Int)

@Dao
interface UserDao {
  @Query("SELECT * FROM users")
  fun getUsers(): List<UserNameAndAge> // 戻り値を List<User> から List<UserNameAndAge> に変更
}
```

ただ、この状態でビルドを実行すると、コンパイラが以下のような警告を出力します。

```
warning: The query returns some columns [id, address, gender] which are not used by UserNameAndAge.
```

クエリでは `id`, `address`, `gender` のカラムを返しているのに、`UserNameAndAge` では使われていないと警告しています。

続けて警告を読んでいくと、以下のような文が出力されています。

```
You can annotate the method with @RewriteQueriesToDropUnusedColumns to direct Room to rewrite your query to avoid fetching unused columns.
```

どうやらメソッドに `@RewriteQueriesToDropUnusedColumns` アノテーションを付けると、Room は不必要なカラムを取得しないようにクエリを書き換えてくれるようです。

まずはこのアノテーションが付いていない状態でコンパイルした際に生成される `UserDao_Impl.java` を見ると以下のようにコードが生成されていました。

```java:UserDao_Impl.java
@Override
public List<UserNameAndAge> getUsers() {
  final String _sql = "SELECT * FROM users";
  ...
}
```

次に、以下のようにアノテーションを付与してコンパイルしてみます。

```kotlin
@Dao
interface UserDao {
  @RewriteQueriesToDropUnusedColumns
  @Query("SELECT * FROM users")
  fun getUsers(): List<UserNameAndAge>
}
```

この状態でコンパイルして生成された `UserDao_Impl.java` は以下です。

```java:UserDao_Impl.java
@Override
public List<UserNameAndAge> getUsers() {
  final String _sql = "SELECT `name`, `age` FROM (SELECT * FROM users)";
  ...
}
```

確かにクエリが書き換えられているようです。

[ドキュメント](https://developer.android.com/reference/androidx/room/RewriteQueriesToDropUnusedColumns) を読む限りだと、このクエリは Sqlite 側では `SELECT name, age FROM users` と変更してくれるようです。

また、`@RewriteQueriesToDropUnusedColumns` アノテーションはメソッドだけではなく `@Dao` のインターフェース（もしくはクラス）や `@Database` のクラスにも付与することができ、適用する範囲を Dao 単位や Database 単位にすることもできるようです。
Spark2.1から3にしたときのメモ

<H1>動機</h1>
Spark2.1 + Zeppelinで解析基盤を構築してます。UnionByNameとかが使えないので、Spark3.0にアップデートすることにしました。

<h1>環境</h1>
Apache Hadoop 2.7.3
Apache Spark 2.1
Docker mySQL 5.7.3 (metastore)

<h1>課題</h1>
ダウンロードして
docker start mysqld
${HADOOP_HOME}/sbin/start-dfs.sh
${SPARK_HOME}/sbin/start-all.sh
したら、
spark hive Caused by: org.datanucleus.exceptions.NucleusException: Attempt to invoke the "BONECP" plugin to create a ConnectionPool gave an error : The specified datastore driver ("com.mysql.jdbc.Driver") was not found in the CLASSPATH

<h1>解決</h1>
色々調べてとりあえずhive.jarのバージョンがあっていない様子。
https://support.datafabric.hpe.com/s/article/Spark-Hive-Integration-failure?language=ja

hive-site.xmlに

```xml
<name>hive.metastore.schema.verification</name>
<value>false</value>
```
を記載して対処し、とりあえず無事動きました。

```xml
<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://XXXX/metastore_db?createDatabaseIfNotExist=true</value>
        <description>metastore</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
        <description>MySQL JDBC driver class</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>XXXX</value>
        <description>user name for connecting to mysql server </description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>XXXX</value>
        <description>password for connecting to mysql server </description>
    </property>
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>hdfs://XXXX</value>
        <description>location of default database for the warehouse</description>
  </property>
</configuration>
```
Qiita記事投稿のための必要最低限のMarkdown記法ノート

Qiitaに記事投稿するために最低限必要と思われるMarkdown記法のまとめです。

#目次
- [見出しを付ける](#見出しを付ける)
- [箇条書きする](#箇条書きする)
- [強調する](#強調する)
- [引用する](#引用する)
- [コードを貼る](#コードを貼る)
- [リンクを張る](#リンクを張る)
- [エスケープする](#エスケープする)
- [付録](#付録)

# 見出しを付ける
行頭に"#"を付けると見出し行として表示される。
"#"の数で見出しのレベルが決まる。
見出しのレベルは6段階ある。
7個目以降の#は普通に表示される。

```
#見出し1
##見出し2
###見出し3
####見出し4
#####見出し5
######見出し6
#######見出し7
```
**出力結果**
>#見出し1
##見出し2
###見出し3
####見出し4
#####見出し5
######見出し6
#######見出し7


# 箇条書きする
行頭に"-"をつけて半角スペースを空けると箇条書き(リスト)として表示される。

```
- 項目1
- 項目2
- 項目3
```
**出力結果**
>- 項目1
- 項目2
- 項目3


# 強調する
"**"または"__"で文字列を囲むと太字で強調表示される。

```
**強調表示**
__強調表示__
```

**出力結果**
>**強調表示**
__強調表示__


# 引用する
行頭に">"をつけると引用部分として表示される。
">"を重ねることで入れ子の引用を表現することも可能である。

```
>引用1
>>引用2
```

**出力結果**

>引用1
>>引用2


# コードを貼る
"\`\`\`"(3連バッククォート)でコード全体を囲うことでコード部として表示される。
また、はじめの"\`\`\`"の後ろにファイル名を記述できる。

```
    ```code.md
    コード
    ```
```

**出力結果**

>```code.md
コード
```


# リンクを張る
以下の構文でリンク付きテキストとして表示される。

```
[リンク先](http://qiita.com/)
```

**出力結果**
>[リンク先](http://qiita.com/)


# エスケープする
"\"でMarkdown記法の特殊文字をエスケープすることで、通常文字として表示される。

```
\>引用記号をエスケープ
```

**出力結果**
>\>引用記号をエスケープ
Modular versionのCASA 6.1をUbuntu 20.04に導入する


## TL;DL

電波天文学のソフトウェア [CASA](https://casa.nrao.edu/casadocs) がpythonのモジュールとしてimportできるようになったので、Ubuntu 20.04に導入しようとしたが、色々面倒臭かったので、後の遭難者のために記事にまとめておきます。
注：CASAは公式にはUbuntuをサポートしていません。

## 準備
pipenvで管理したいのでpipenvを導入しておく。
参考: [Ubuntu18.04にPython3.8 + Pipenv環境を構築](https://qiita.com/123h4wk/items/d5aece92d1ee47ce603c)

Ubuntuのpython version管理はupdate-alternativesが便利。デフォルトをpython3.6にしておく。
参考: [UbuntuでPythonのバージョンを変更する方法](https://codechacha.com/ja/change-python-version/)

## libgfortran3の導入
CASA 6.1 (modular)はlibgfortran3が必要だが、Ubuntu 20.04ではサポートされていないため、aptでinstallしようとしても、そんなものはないと言われる。

そこで、libgfortran3の.debファイルを直接ダウンロードしてinstallしようとするが、今度はgcc-6がないと言われる。Ubuntu 20.04ではgcc-9を利用しているので、古いgccを入れる必要があるようだ。

結局、gcc-6-baseの導入 -> libgfortran3の導入でうまくいくことがわかった。

```bash:gcc-6-baseとlibgfortran3の導入
wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-6/gcc-6-base_6.5.0-2ubuntu1~18.04_amd64.deb
wget http://ports.ubuntu.com/pool/universe/g/gcc-6/libgfortran3_6.5.0-2ubuntu1~18.04_arm64.deb

sudo apt install ./gcc-6-base_6.5.0-2ubuntu1~18.04_amd64.deb
sudo apt install ./libgfortran3_6.5.0-2ubuntu1~18.04_arm64.deb

```

これでlibgfortran3の導入完了です。

# pipenvで仮想環境をつくる。
以下のようなPipfileを用意する。

```pip:Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[[source]]
url = "https://casa-pip.nrao.edu/repository/pypi-casa-release/simple"
verify_ssl = true
name = "casa"

[packages]
numpy = "*"
pandas = "*"
scipy = "*"
matplotlib = "*"
astropy = "*"
ipython = "*"
casatools = "*"
casatasks = "*"

[dev-packages]

[requires]
python_version = "3.6"
```

なお、casatoolsとcasatasksのversionを具体的に指定すればpython 3.7でも動くらしい。
(参考: [Python 3.7になったGoogle ColabでCASAを動かしてみる](https://astropengu.in/posts/34/))

次に同じディレクトリでpipenvで環境構築。

```bash:pipenvでCASA6.1が入ったpython仮想環境を構築 
pipenv install
pipenv run ipython
```
ipython上でcasatoolsとcasatasksがエラーなくimportできれば成功です。お疲れ様でした。

```python:ipython
In [1]: import casatools
In [2]: import casatasks
```


## その他

Ubuntu 20.04に対応しているのはlibgfortran5だが、こちらはCASAのmoduleをimportするときに参照するlibgfortranが3じゃないと怒られてしまう。libgfortran.so.5のシンボリックリンクをlibgfortran.so.3として作るというよくある裏技も試してみたが、やっぱりだめで、どうしても古いlibgfortran3が必要らしい。

## 追記 (2021/05/01)
並列で走らせようとして、casampi packageを導入しようとしたが失敗。解決したら記事にします...。

## 参考

+ [CASA: the Common Astronomy Software Applications package](https://casa.nrao.edu/casadocs)
+ [Obtaining and Installing — CASA Documentation](https://casa.nrao.edu/casadocs/casa-6.1.0/usingcasa/obtaining-and-installing)
+ [Ubuntu18.04にPython3.8 + Pipenv環境を構築](https://qiita.com/123h4wk/items/d5aece92d1ee47ce603c)
+ [UbuntuでPythonのバージョンを変更する方法](https://codechacha.com/ja/change-python-version/)
+ [Python environment for testing modular CASA 6 installation](https://github.com/astropenguin/casa6-demo)
+ [Python 3.7になったGoogle ColabでCASAを動かしてみる](https://astropengu.in/posts/34/)