OmniAICreator/Qiita-1.07M huggingface dataset:
haml-rails によるerb->haml変換

Gemfile書き方

```Gemfile
gem 'haml-rails'
```

変換コマンド

```
rails haml:erb2haml
```

元の.erbファイルを削除するか -> y

```
Would you like to delete the original .erb files? (This is not recommended unless you are under version control.) (y/n)
y
Deleting original .erb files.
```
未経験からエンジニアになる！ドメイン名を調べる方法について学ぼう！

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はドメイン名について調べてみましょう！
![インスタスライド_202301016.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/ebac17c6-1f47-14e0-b47e-9997e2eb34db.gif)
# ドメイン名調査
ドメイン名は、取得するため、誰が取得したのか公開されています。
フィッシング詐欺等に対して、怪しいドメイン名は調べてみる事で確かなサイトか確認できます。
やってみましょう！

# ネットで調べる
”whois“で検索してみましょう

# ”whois“で検索
”whois“で検索して、onamaeのサイトを表示します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/dc6b7f85-4e97-f244-ab16-0784ba7be51d.png)

# Whois検索
Whois情報を検索できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/7006c4a5-f813-88e5-a7f1-053d1af73165.png)

# 実際にやってみる
Googleで紹介実行してみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/aae01a96-7a59-0a4d-e8b0-2e75f449e791.png)

# 照会結果
結果が表示されます。会社名や更新日、取得日等色々確認できます。
昔は担当者名、電話、メアドとかも公開されてました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/7bdf5ccb-3681-ee0a-8aee-f46aa50de461.png)

# まとめ
怪しいドメインだと思ったらWhois で検索してみましょう！
誰でもスグに確認できます！

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
【Firebase】Cloud Storageのせいでエミュレーターの起動に失敗した

# はじめに

`firebase emulators:start`を実行して、エミュレーターを初めて起動した時に**Cloud Storage**に関するエラーに遭遇した。

```shell
Error: Cannot start the Storage emulator without rules file specified in firebase.json: run 'firebase init' and set up your Storage configuration
```

# Firebaseコンソール上でのCloud Storageの未設定によるエラー

とりあえず、`firebase init`を実行して`Cloud Storage`の設定を追加しようとした。

```shell
? Which Firebase features do you want to set up for this directory? Press Space to select features, then Enter to confirm your choices. (Pres
s <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to proceed)
 ◯ Functions: Configure a Cloud Functions directory and its files
 ◯ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys
 ◯ Hosting: Set up GitHub Action deploys
❯◉ Storage: Configure a security rules file for Cloud Storage
 ◯ Emulators: Set up local emulators for Firebase products
 ◯ Remote Config: Configure a template file for Remote Config
 ◯ Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision default instance
(Move up and down to reveal more choices)
```

またエラーが出た。

```shell
Cloud resource location is not set for this project but the operation you are attempting to perform in Cloud Storage requires it. Please see this documentation for more details: https://firebase.google.com/docs/projects/locations
```

# FirebaseコンソールでCloud Storageを設定

Firebaseコンソールで、Storageのページを開いて「はじめる」をクリックする。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/241aa83c-66a0-a7bb-60a1-d2b1c6e722f7.png)

とりあえず、テストモードを選択して次へ進む。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/70d33a46-b14a-6150-973e-fdb49aa8910a.png)

ロケーションを選択して完了をクリックする。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/fb874968-6a8a-d59c-5bb3-750f71e9c834.png)

次のような画面が表示された完了。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/47c4e2a6-9ce3-52fb-eec0-25b6df0d8b62.png)

# storage.rulesファイルを作成

FirebaseコンソールでCloud Storageの設定後、`firebase init`を再度実行した。

そのままエンターキーを押下して、ルートディレクトリに`storage.rules`を作成した。

```shell
=== Storage Setup

Firebase Storage Security Rules allow you to define how and when to allow
uploads and downloads. You can keep these rules in your project directory
and publish them with firebase deploy.

? What file should be used for Storage Rules? storage.rules
✔  Wrote storage.rules

i  Writing configuration info to firebase.json...
i  Writing project information to .firebaserc...
✔  Firebase initialization complete!
```

これで問題なくFirebaseエミュレーターを起動できる。
2023/1/13主にITとかセキュリティの記事

注意！　配送業者になりすました宅配便詐欺が増加中(1/11)
https://ascii.jp/elem/000/004/119/4119867/?rss

サイバー攻撃、復旧対策怠らず　田中良幸氏
ピュア・ストレージ・ジャパン社長(1/11)
https://www.nikkei.com/article/DGXZQOCD199EY0Z11C22A2000000/

「情報通信ネットワークにおけるサイバーセキュリティ対策分科会」の開催(1/11)
https://www.soumu.go.jp/menu_news/s-news/01cyber01_02000001_00155.html

サイバー攻撃に対する企業の回復力が重要に--Infinidat・山田代表(1/11)
https://japan.zdnet.com/article/35198138/

埼玉県の関連団体に不正アクセス メールが不特定多数に送信(1/10)
https://www3.nhk.or.jp/shutoken-news/20230110/1000088453.html

先週のサイバー事件簿 - アノニマスが渋谷区にサイバー攻撃(1/11)
https://news.mynavi.jp/article/20230111-security/

デジタルアーツ製 m-FILTER に認証不備の脆弱性(1/11)
https://scan.netsecurity.ne.jp/article/2023/01/11/48744.html

情報セキュリティの概要とトレンドをざっくり学ぼう(1/11)
https://atmarkit.itmedia.co.jp/ait/articles/2301/11/news001.html

5G、医療、クラウド、データ主権、メタバース　23年の「5大サイバー脅威予測」(1/11)
https://dempa-digital.com/article/392443

【注意喚起】東京大学基金を装ったフィッシングメールにご注意ください(1/11)
https://www.u-tokyo.ac.jp/focus/ja/articles/z0802_00028.html

偽ポケモNFTゲームがユーザーのコンピューターにマルウェアを感染させる(1/11)
https://nextmoney.jp/?p=55931

情報通信ネットワークにおけるサイバーセキュリティ対策分科会（第1回）開催案内(1/18開催)
https://www.soumu.go.jp/main_sosiki/kenkyu/cybersecurity_taskforce/02cyber01_04000001_00225.html

大学進学する子どものために購入した2in1ノートPCで発生した「タブレットモード」のトラブルとは(1/11)
https://atmarkit.itmedia.co.jp/ait/articles/2301/11/news006.html

IT化とDXの違いを、中小企業がDXに取り組む際のポイントと併せて教えてください(1/11)
https://j-net21.smrj.go.jp/qa/org/Q1460.html

Adobe Acrobat および Reader の脆弱性対策について(APSB23-01)(CVE-2023-21579等)(1/11)
https://www.ipa.go.jp/security/ciadr/vul/20230111-adobereader.html

DXCテクノロジーは、2023年以降の生活とビジネスに影響するサイバーセキュリティの5潮流を確認(1/11)
https://www.dreamnews.jp/press/0000273586/

Windows 11における「Moment Update」とは何か(1/11)
https://news.yahoo.co.jp/articles/ae5075641e17c76758f65c53d060f9a42d2df278?source=rss

個人情報漏えいに関するお詫びとお知らせ チューリッヒ保険会社(1/10)
https://www.zurich.co.jp/-/media/jpz/zrh/pdf/pr/2023/NewsRelease_20230110_ZurichInsuranceCompanyLtd.pdf?rev=56ae8db97a1547c2b53a0d56dafa68e3&sc_lang=ja-JP

「DX推進スキル標準」が公開　ビジネスアーキテクトを定義(1/12)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020900021/010600129/

AI養豚で個人向け販売に踏み出す　膨らむコストを下げる工夫に活路(1/12)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/040200037/010500075/
while read（ループ）へパイプライン出力を渡す（シェル）

こんにちは。
```while read```（ループ）へパイプライン出力を渡して処理しました。


```console
$ printf "a\n\nb\n" | while read -r line; do echo "$line"; done
a

b
$
```

#### 空行に対して特別な処理を行いたい場合

* 空行を処理しない場合は、

```console
$ printf "a\n\nb\n" | while read -r line; do [ -n "$line" ] && echo "$line"; done
$ printf "a\n\nb\n" | while read -r line && [ -n "$line" ]; do echo "$line"; done
a
b
$
```

* 空行ならば ```while``` ループを打ち切る場合は、

```console
$ printf "a\n\nb\n" | while read -r line; do [ -n "$line" ] && echo "$line" || exit; done
a
$
```
GithubにPushをしたが終わらない時の対処方法

## 状況

```bash
git push -u origin master
```
commitしたfileをpushする際に
```bash
Total 15 (delta 0), reused 0 (delta 0), pack-resued 0
```
上記の表示のまま止まりpushが完了しない。

## ファイル構成
```:ecsite
.
├── css
│   └── style.css
│
├── img
│    ├─ img1.png
│    ├─ img2.png
│    ├─ img3.png
│    ├─ img4.png
│    ├─ img5.png
│    └─ logo.png
│
└── index.html
```

## 試したこと
1. `git gc`コマンド
2. Github Desktopを使う
3. VS Codeの拡張機能を使う

## 解決策
```bash: globalな設定
git config --global http.postBuffer 157286400
```

```bash: localな設定
git config http.postBuffer 157286400
```

[引用した解決策 Stack Overflow](https://stackoverflow.com/a/68711337)

## 追記

git-configのドキュメントを参照すると

> Maximum size in bytes of the buffer used by smart HTTP transports when POSTing data to the remote system. For requests larger than this buffer size, HTTP/1.1 and Transfer-Encoding: chunked is used to avoid creating a massive pack file locally. Default is 1 MiB, which is sufficient for most requests.

> Note that raising this limit is only effective for disabling chunked transfer encoding and therefore should be used only where the remote server or a proxy only supports HTTP/1.0 or is noncompliant with the HTTP standard.  Raising this is not, in general, an effective solution for most push problems, but can increase memory consumption significantly since the entire buffer is allocated even for small pushes.

https://git-scm.com/docs/git-config#Documentation/git-config.txt-httppostBuffer

デフォルトは 1MiB で設定されていて http.postBuffer の値を上げる事で大抵の push を行う際に起こる問題を解決できるがメモリの消費が増加する。

<br>

```bash:http.postBufferが設定されているか確認するコマンド
git config --show-origin --get-all http.postBuffer
```

```bash:globalで解除する方法
git config --global --unset http.postBuffer
```

```bash:localで解除する方法
git config --local --unset http.postBuffer
```

[参照したサイト](https://learn.microsoft.com/ja-jp/azure/devops/repos/git/rpc-failures-http-postbuffer?view=azure-devops)
Tesseract OCRをvcpkgでインストールしてdllをRustで使う

Rust から Tesseract OCR（のライブラリ）を呼び出そうと色々やっていました。
ひとまず動くようになったので備忘録としてあげておきます。
vcpkg でインストールした DLL を Rust で使う、という場合にも使えると思います。

## vcpkg をインストールする

GitHubの説明に則ってインストールします。
https://github.com/microsoft/vcpkg

## Tesseract OCRライブラリをインストールする

以下コマンドでインストールします。
アニメ一本分くらいは時間かかります。
`./vcpkg install tesseract:x64-windows`

依存関係のあるパッケージも一緒にインストールしてくれますが、足りない場合は以下を実行してみてください。

`./vcpkg install leptonica:x64-windows`

## Rust プロジェクトで読み込む

tesseract クレートを利用しました。
https://crates.io/crates/tesseract

Cargo.toml に以下を追記してビルドします。
`tesseract = "0.12.0"`

main.rs は最低限の記述にします。

```rust:main.rs
let text = tesseract::ocr("test.png", "jpn").unwrap();
println!("Tesseract: {}", text);
```

## lib をプロジェクトのルートに設置する

vcpkg でインストールした .lib ファイルを Rust プロジェクトのルートフォルダに配置します。
lib ファイルは vcpkg\installed\x64-windows\lib 以下にあります。
tesseract のビルドに必要なファイルは以下のようです。

- leptonica-1.82.0.lib
- libcrypto.lib
- libcurl.lib
- tesseract52.lib

設置したらビルドしてみます。

`> cargo build`

エラーが出なければひとまずOKです。
ただし、ビルドは通っても cargo run すると DLL が足らないと怒られます。
`error: process didn't exit successfully: `target\debug\tesseract_rust.exe` (exit code: 0xc0000135, STATUS_DLL_NOT_FOUND)`

## 実行に必要な DLL を設置する

DLL はプロジェクトのルートではなく、exe と同じパスに設置する必要があります。
target\debug\ 以下に DLL を設置します。

lib ファイルとは違い、関連する DLL が全て必要です。
vcpkg\installed\x64-windows\tools\tesseract\ 以下にある DLL を全て target\debug\ 以下にコピーします。

動かしてみます。

`> cargo run`

言語ファイルが無いと言われます。
GitHub から jpn.traineddata を DL してプロジェクトのルートフォルダに設置します。
https://github.com/tesseract-ocr/tessdata

これで動作するようになりました。

## build.rs でビルドを自動化する

ビルドや実行の度に関連ファイルを設置するのは面倒なので、build.rs を書いて自動化してみました。

```rust:build.rs:
fn main() {
    let project_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
    println!("cargo:rustc-link-search=native={}\\lib", project_dir);

    let target_path = std::path::Path::new(&project_dir).join("target");

    if target_path.exists() {
        let debug_path = target_path.join("debug");
        let release_path = target_path.join("release");
        let dll_files = std::fs::read_dir(std::path::Path::new(&(project_dir + "\\dll"))).unwrap()
            .map(|res| res.map(|e| e.path()))
            .collect::<Result<Vec<_>, std::io::Error>>().unwrap();
        
        for path in dll_files {
            if debug_path.exists() {
                std::fs::copy(&path, debug_path.join(&path.file_name().unwrap())).unwrap();
            }
            if release_path.exists() {
                std::fs::copy(&path, release_path.join(&path.file_name().unwrap())).unwrap();
            }
        }
    }
}
```

今回は cargo:rustc-link-search=native= を指定して、プロジェクトルート以下の lib フォルダを参照するように設定しています。
vcpkg\installed\x64-windows\lib をフルパスで指定しても問題ないと思います。

更に、targetフォルダがある場合に dll フォルダ以下の DLL ファイルを全て debug、release フォルダにコピーするように設定しています。
こちらも、DLLフォルダはフルパスで vcpkd 以下を指定してもいいと思います。

GitHub にプロジェクトがありますので、必要な方はどうぞ。
https://github.com/sou1ka/tesseract_rust

Rustのビルド時にC++のソースも一緒にビルドしてFFIする方法もできるとは思いますが、Tesseract の構成が中々重たいので今回はvcpkg経由で試してみました。

## 参考

https://qiita.com/tenomoto/items/2f8e913a2ab3b0fe7d01

https://qiita.com/kjunichi/items/4d12e74be7c027c6e30b
VS Codeの拡張機能メモ

Dockerの勉強を始めて、超基本のコマンドは一通り使ってみました。
次は、VS Codeの拡張機能から操作してみようと思います。

ということで、Virtual Box上のUbuntuにVS Codeをインストールしました。

# 自分用にVS Codeの拡張機能のメモ

* Japanese Language Pack for VS Code
日本語化

* Code Spell Checker
英語のスペルチェッカー。変数名などのスペルミスを防ぐ。

* indent-rainbow
インデント毎に色分けしてくれる。

* Bracket Pair Colorization Toggler
対応するカッコを色分け。

* Material Icon Theme
ファイルのアイコンをわかりやすく表示。

* ZenKaku
全角のスペースをわかりやすく表示。

* Prettier - Code formatter
ソースコードの整形。

* Docker
dockerを操作する。

* Code Dev Containers
dockerを利用した開発環境を作るのに使う予定。


# 参考サイト
最速で Visual Studio Code devcontainer を体験する

https://blog.jp.square-enix.com/iteng-blog/posts/00002-starter-devcontainer/

【2023年最新版】VSCodeをPython超特化型にする 最高の拡張機能20選まとめ。 【VisualStudio Code】【プラグイン】

https://yurupro.cloud/767/
AWS CLI のインストール方法【ワンライナー】

[公式](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html#cliv2-linux-install)にも説明はありますが、より簡単なワンライナーを何度も忘れてしまうので備忘録として記載しました。

# 結論
```bash
pip3 install awscli
```

## 補足
```bash
sudo apt install awscli
```
でもインストール自体は成功しますが、
```
ImportError: cannot import name 'docevents'
```
というエラーが発生します。

```bash:エラー全文
Traceback (most recent call last):
  File "/usr/bin/aws", line 19, in <module>
    import awscli.clidriver
  File "/usr/lib/python3/dist-packages/awscli/clidriver.py", line 36, in <module>
    from awscli.help import ProviderHelpCommand
  File "/usr/lib/python3/dist-packages/awscli/help.py", line 23, in <module>
    from botocore.docs.bcdoc import docevents
ImportError: cannot import name 'docevents'
```
MB_プラグイン-マウスイベント編-

・カーソルオンの取得

```HTML
<!DOCTYPE html>
<html>
<head>
<title>CANVAS TEST</title>
<script>

window.onload = function() {

  const canvas = document.getElementById('test');    // 要素を得る
  const ctx = canvas.getContext('2d');               // 2D(平面)コンテキストを得る

  //カーソルオンのイベントを取得
  function m_over_out2() {
    var w = canvas.width;
    var h = canvas.height;
    var targetFlag = false;
    var rect = null;

    function onMouseOver(e) {
      rect = e.target.getBoundingClientRect();
      canvas.addEventListener('mousemove', onMouseMove, false);
    }
    function onMouseOut() {
      canvas.removeEventListener('mousemove', onMouseMove, false);
    }
    /* マウスが動く度に要素上にヒットしているかどうかをチェック */
    /* 実行するinitは間引きを噛ませて実行する */
    function onMouseMove(e) {
      moveActions.updateTargetFlag(e);
      if (targetFlag) {
        moveActions.throttle(moveActions.over, 50);
      } else {
        moveActions.throttle(moveActions.out, 50);
      }
    }

    /* mouseMoveで実行する関数 */
    var moveActions = {
      timer: null,
      /* targetFlagの更新 */
      updateTargetFlag: function(e) {
        var x = e.clientX - rect.left;
        var y = e.clientY - rect.top;

        var a = (x > w / 2 - 50);
        var b = (x < w / 2 + 50);
        var c = (y > h / 2 - 50);
        var d = (y < h / 2 + 50);

        targetFlag = (a && b && c && d);
      },
      /* 連続イベントの間引き */
      throttle: function(targetFunc, time) {
        var _time = time || 100;
        clearTimeout(this.timer);
        this.timer = setTimeout(function () {
          targetFunc();
        }, _time);
      },
      out: function() {
        drawRect();
      },
      over: function() {
        drawRectIsHover();
      }
    };

    function drawRect(color) {
      var _col = color || 'black';
      ctx.clearRect(0, 0, w, h);
      ctx.beginPath();
      ctx.fillStyle = _col;
      ctx.fillRect(w / 2 - 50, h / 2 - 50, 100, 100);
    }

    function drawRectIsHover() {
      drawRect('blue');
      //ctx.font = "26px 'HG正楷書体-PRO'";
      //ctx.fillText('Hello', 95, 60);
    }

    canvas.addEventListener('mouseover', onMouseOver, false);
    canvas.addEventListener('mouseout', onMouseOut, false);

    drawRect();

  }
  m_over_out2();

}

</script>
</head>
<body>
 <canvas id="test" width="300" height="300"></canvas>
</body>
</html>
```
【Kotlin】何気なく書いているsetOnClickListenerについて

Androidアプリを開発したくて、kotlinで勉強しています。
何気なく書いていたコードに、kotlinならでは？のコード変形があったので
自分と同じように、あまり気に留めていなかった人向けに。
あと自分でもまた見返せるように。。。

## まずは最終形態から
ボタンのクリックイベントにリスナー登録するときによく書く
```kotlin
    val btn = findViewById<Button>(R.id.btn)
    btn.setOnClickListener{
        Log.d("click","click!!")
    }
```
みたいなやつ。最終的にはこの書き方が多い。実はこの形態に行き着くまでに色々あるらしい。

## 形態１
```kotlin
private inner class MyClickListener : OnClickListener{
    override fun onClick(view: View?) {
        Log.d("click","click!!")
    }
}

～～～省略～～～

    val btn = findViewById<Button>(R.id.btn)
    btn.setOnClickListener(MyClickListener())

```
めちゃくちゃ丁寧に？書いたやつ。ここからスタート。

まず、setOnClickListener は引数に
OnClickListener を継承したクラスのインスタンスをとる。
だから、OnClickListener を継承した MyClickListener を定義してあげて
setOnClickListener には、そのインスタンスを渡す。

ちなみに、OnClickListener で実装しないといけないメソッドは
onClick メソッドの一つだけ。　←これが後で重要。

## 形態２
```kotlin
    val btn = findViewById<Button>(R.id.btn)
    btn.setOnClickListener(object : OnClickListener {
        override fun onClick(view: View?) {
            Log.d("click", "click!!")
        }
    })
```
イベントリスナーみたいなその場でしか使わないようなものに
いちいち MyClickListener なんて名前を付けてクラス定義するのは面倒くさい。
そこで「オブジェクト式」というのを使うらしい。
定義しつつそのインスタンスを渡す！って感じ。
これでカタマリ感も出てスッキリ！ただ、最終形態まではまだまだ遠い。

## 形態３
```kotlin
    val btn = findViewById<Button>(R.id.btn)
    btn.setOnClickListener({ view: View? ->
        Log.d("click", "click!!")
    })
```
オブジェクト式は便利な上に、今回のようなインターフェースが一つのメソッドしか持たない場合はさらに素敵な書き換えができる。
オブジェクト式　→　ラムダ式　となる。

引数にメソッドを渡している感が出ていて
この状態が個人的には分かりやすくて結構好きだが、Kotlinはまだまだ行くらしい。

## 形態４
```kotlin
    val btn = findViewById<Button>(R.id.btn)
    btn.setOnClickListener({
        Log.d("click", "click!!")
    })
```
ラムダ式の引数が一つなら
ラムダ式の中の「 引数 -> 」を省略できるらしい。さらにスッキリ！
ちなみに、この省略した引数はラムダ式の中で「it」で参照できるようです。

## 形態５
```kotlin
    val btn = findViewById<Button>(R.id.btn)
    btn.setOnClickListener(){
        Log.d("click", "click!!")
    }
```
ん？どこが変わった？って感じですが、ラムダ式が（）の外に出ています。
関数の引数の最後がラムダ式の場合、そのラムダ式は（）の外に出せるらしいです。
これの何が嬉しいのかなと思ったけど
パラメータ２つぐらい渡して、コールバック関数も渡して・・・みたいな関数があったときにスッキリするのかな？
```kotlin
    // 出さないパターン
    sampleFunc(para1,para2,{
        // 処理
    })

    // 出したパターン
    sampleFunc(para1,para2){
        // 処理
    }
```
・・・正直あんまり違いが分からない。
これにどういう嬉しポイントがあるのかどなたか教えていただければ助かります・・・！

## 形態６（最終形態）
```kotlin
    val btn = findViewById<Button>(R.id.btn)
    btn.setOnClickListener{
        Log.d("click", "click!!")
    }
```
最後は、関数の後の（）が消えています。
関数の引数がラムダ式１つの場合は、（）を省略できるらしいです。
（べ、別にそこまでしなくても良いんじゃ・・・）

## 最後に
こういう流れがあって、Kotlinでは素敵な書き方ができているようです。
setOnClickListenerの最終形態の書き方は
本とか見てても当たり前のように書かれているから、気にしていなかったけど
よく考えたら関数の後に｛｝を書いて、その中に処理書いてるのって変よね。

引数の最後がラムダ式の場合は・・・！とか
引数が１つの場合は・・・！とか
色々な条件が重なってのこの形だったんですね。

つまり逆に言うと
引数が１つでない場合とか、継承するクラスのメソッド複数ある場合とか
そういう時は、途中までしか形態変化できないことになりますね！

Kotlin、最近の言語って感じがして楽しい！！
【React】HTMLの<form>がjavascriptで送信されないように設定する方法

## この記事について
Reactを学習し初めて気づいた点や、学んだ点を記録として残します。

## HTMLの`<form>`がjavascriptで送信されないように設定する方法
`<form>`タグを使用すると、ブラウザのデフォルト機能として入力値が送信され、画面がリロードされます。

<br>

```react:qiita.js
<div>
  return (
    <div>
      <form onSubmit={addTodo}>
        <input
          type="text"
          value={enteredTodo}
          onChange={(e) => {
            setEnteredTodo(e.target.value);
          }}
        />
        <button>追加</button>
      </form>
    </div>
  );
};
```

<br>

例えば例の追加にある送信ボタンを押すと、その度に画面が更新されます。
このような送信イベントをキャンセルしたい場合は、formのonSubmitに設定されている関数に対して、**preventDefault**というメソッドを呼びます。

<br>

```react:qiita.js
const Form = ({ createList }) => {
  const [enteredTodo, setEnteredTodo] = useState("");
  const addTodo = (e) => {
    e.preventDefault();
    const newList = {
      id: Math.floor(Math.random() * 1e5),
      content: enteredTodo,
    };
    createList(newList);
    setEnteredTodo("");
  };
```

<br>

:::note info
結果
**preventDefault**メソッドを使うと送信イベントをキャンセルできる。
:::
エンジニアインターン2日目

今日はLPのチェックボックスの修正を行った。
JavasctiptやjQueryを使ってチェックの位置を変更しようとした。
そこでnet::ERR_ABORTED 404のエラーが発生した。
調べたところパスがずれていることが問題だった。
この前新しくjsのファイルを作成したところjsファイルを読み込ませようとlinkを読み込ませたところが問題であった。このことを先輩エンジニアに質問したところ一瞬で解決した。linkを消すだけのことだった。
簡単なエラーだったからこそ恥ずかしいし悔しかった。しかし、エラーを解決するための考え方を学ぶことができた。
今はとにかく何でも吸収することが大切であると思う。一日中コードに向き合えるこの機会を大切にしていきたい。
【Unity Hub】悪質なソフトウェアかどうかをAppleでは確認できないため、このソフトウェアは開けません。の対処法

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865650/7198bf5a-3329-86a5-c335-ba8513f819e6.png" width="300">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865650/d456f0b0-1218-ab02-4d8a-a6db0330c8e6.png" width="300">

# 解決策
プロジェクトファイルのLibraryフォルダを削除して、再起動すれば治った。
キャッシュファイル内の実行ファイルが原因。

# 環境
MacOS Big Sur 11.6.7
UnityHub 3.4.1

# 経緯
ダウンロードしてきたUnityのプロジェクトファイルを開こうとすると出るエラーだと思われる。

zipファイルに圧縮したプロジェクトファイルをGoogle Driveにアップロード。バックアップから巻き戻す必要があったのでGoogle Driveからダウンロード。開こうとするもエラー。

通常であれば、右クリックで開くを押せば解決するはずが、UnityHubではそれができない。
原因の実行ファイルがキャッシュフォルダ内にあるので、削除して再度Unityから起動すると、キャッシュファイルの再構成がされるので治る。

# 参考記事

https://joyplot.com/documents/unity-library-cache/
Windowsがデバイスからスリープ解除するのを阻止するバッチファイル

スリープしたはずなのに、いつの間にか勝手に電源がついているWindowsくん。

マウスやキーボードなどのデバイスによりスリープ解除できる設定がデフォルトでONであることが原因の一つです。デバイスマネージャからOFFにはできますが、windowsアプデが入るたびに設定がデフォルトに戻されるのが地味にストレスです。

本記事では、ログオン時にデバイスのスリープ解除状態を検知し、自動的にOFFするバッチファイルを組むことを目的とします。

## batファイルの作成

batファイルに関しては詳しくないですが、以下で無理やり組んでいます。

"powercfg"コマンドで、スリープ解除できるデバイスの一覧を取得します。
その後、デバイス名にマウスかキーボードが含まれている場合、スリープ解除権限を取り除きます。
こちらのbatファイルを適当に名前を付けて保存しておいてください。

:::note warn
必ずShift-JISで保存してください。
:::

```bat
@echo off
setlocal

for /f "usebackq delims=" %%A in (`powercfg -devicequery wake_armed`) do (

    echo %%A | find "キーボード" 1>nul
    if not errorlevel 1 (powercfg /devicedisablewake "%%A")

    echo %%A | find "マウス" 1>nul
    if not errorlevel 1 (powercfg /devicedisablewake "%%A")

)
```

## タスクスケジューラの設定

タスクスケジューラを開き、「新規タスク」の作成より、上記batファイルを管理者権限で自動実行させます。
単にスタートアップに登録するだけでは権限不足で実行できません。

まず初めに「全般」タブでは、タスク名と管理者権限を付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285702/eaf0b6dc-c646-db1e-ddaf-318f738a60ea.png)

次に、「トリガー」タブで特定のユーザのログオン時に実行するように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285702/867a4f50-3bd9-7c03-2bc5-7622bdfeabe0.png)

最後に、「操作」タブで実行するbatファイルを選択します。batファイルの場所は適当です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285702/2f961a83-17b1-3819-5dda-e7d6b6631b08.png)

OKを押し、タスクを保存します。
これでログオン時にデバイスのスリープ解除状態を検知し、自動的にOFFに設定できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285702/29ea3d64-008a-93cf-afdd-2bb00d34f73f.png)

## 参考

- [Windows 10 - 管理者権限が必要なアプリを自動起動（スタートアップ）](https://pc-karuma.net/windows-10-task-schedule-without-uac-prompt/)
- [Windows がスリープしない、勝手に復帰する問題を powercfg でチェック･解決する](https://freesoft.tvbok.com/tips/windows_tips/powercfg-memo.html)
Windws10 プロダクトキーを変更しながらエディションのアップグレード行う

## はじめに

購入した端末のデフォルトのプロダクトキーでなく、自社のボリュームライセンスを使用して端末のアップグレードを行う機会があったため、その際の手順をまとめる
今回はインターネットに接続してアップグレードを行う方法と、接続せずにアップグレードを行う方法の二つを紹介する
※ドメインに参加できない制約があったため、この資料にまとめている手順にて実施
※プロダクトキーはMAK

## インターネット接続ありでのアップグレード

1. 検索バーにてライセンス認証を検索し、ライセンス認証の設定を開く
1. プロダクトキーの変更を押下
1. プロダクトキーを入力
1. ライセンス認証ボタンを押下

## インターネット接続なしでのアップグレード

1. コマンドプロンプトを管理者権限で起動し、以下コマンドを実施

    ```
        slmgr /ipk <変更したいプロダクトキー>
    ```

1. 変更できていることを確認
    ```
        slmgr /dlv
    ```

1. 電話番号を用いた認証を行うためのsluiを実行
    ```
        slui 4
    ```

1. 以降は出てきたポップアップにしたがって認証を実施

以上
olcAccessディレクティブの書式と主なパラメータ


Linuxシステムで、ログインしたユーザのアクセス権を制限できるように、OpenLDAPでも「slapd-config」のolcAccessディレクティブを用いて、バインドしたDN（ユーザ）に応じたアクセス権の設定を行う。

●olcAccessディレクティブの書式

olcAccess: to アクセス対象 by 要求者 アクセス権 ...

複数行にまたがって記述する場合は以下のように2行目以降の行頭にスペース。
途中にコメントを入れることは出来ない。

olcAccess: to アクセス対象
 by 要求者 アクセス権
 by 要求者 アクセス権
 ...

by以降に記述されている条件は順番に処理され、条件にマッチするとそれ以降の条件は処理されないので記述する順番には注意が必要。

●olcAccessディレクティブの主なパラメータ

■アクセス対照
・* 全てのエントリ
・dn=識別名　指定したエントリ
・attrs=属性名　指定した属性
・filter=検索フィルタ　検索フィルタにマッチするエントリ

■要求者
・* 全ての接続(全てのユーザ)
・anonymous 認識されていない接続(匿名ユーザ)
・users 認証された接続
・self エントリ自身の接続(接続済みのユーザ自身)
・dn=識別名　指定した識別名による接続

■アクセス権
・none アクセスできない
・auth 認証(バインド)が可能
・compare 比較が可能(+authの権限)
・search 検索が可能(+compareの権限)
・read 値の参照が可能(+searchの権限)
・write 値の更新が可能(+readの権限)

例）全てのエントリのデータはユーザ自身のみ変更可能で、他の認証済のユーザは参照のみを可能とする場合

olcAccess: to *
 by self write
 by users read
 by anonymous auth

デフォルトでは全てのユーザがデータを参照できる。
olcAccessディレクティブでマッチする条件がない場合は、「olcAccess: to * by * none」が適用され、アクセス拒否。
[Laravel]"Cannot declare class (クラス名), because the name is already in use"のエラー対処について

開発環境：Laravel8

## 事象
- Controllerを新規作成をして、アクションを定義する。その後ルーティングを設定して、ブラウザからアクションを実行した際、下記のエラーが発生しました。

```php
Cannot declare class (クラス名), because the name is already in use
```

- エラー文の意味は、「クラス名が既に使用されているため、クラス名を宣言できません。」
- つまり、「そのクラス名はすでに使われているので、クラス名を使用することが出来ませんよ」ということです。

今回、Contollerのクラス名が重複しているということだったので、エラー文でのクラス名が重複していないか他のControllerのクラス名を確認しました。
しかし、該当するクラス名は重複していませんでした。

## 原因
- エラーの発生原因は、Controller内での名前空間(namespace)でのコーディングが間違っていました。
```php
// 間違っていたコード
namespace App\Http\Controllers;
```

## 解決方法
- 正しい名前空間(namespace)に修正したところ、エラーが解決しました。
```php
// 正しいコード(一階層間違えていたので、修正)
namespace App\Http\Controllers\Doctor;
```
上記のようなエラーが発生した場合、「名前空間(namespace)」でのミスがないか確認をして下さい。
やりたいことの優先順位

# 読んで欲しい人
JSのclassについて詳しい方。
JSオセロを作りたいのですが、JSのclassをどのように学べば良いでしょうか？


# 自分が何をやるべきか忘れちゃうから
# やりたい事を書いてみる
<b>1位</b>
オセロ作りたい！

<b>2位</b>
映画館の座席予約表を作ってみたい！

<b>3位</b>
趣味サイト作りたい！
[Pixso](https://pixso.net/jp/)で見た目作る。
こんな感じのかっこいいサイト良いな。
・[サウナイキタイ](https://sauna-ikitai.com/)

<b>4位</b>
洋服を管理できてコーディネートが組めるサービスを作りたい！
似てるサービス（目標）
・[XZ(クローゼット)](https://apps.apple.com/jp/app/xz-%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%BC%E3%83%83%E3%83%88/id909369654)

<b>4位</b>
投票できるサービスを作りたい！
# 一歩、前進するためには
オセロ作ってる人のコードを写経してみる。
<b>Youtube</b>
[オセロ八段のプログラマーがオセロゲームを作る方法を教えたげるけどなんか質問ある？【JavaScriptプログラミング】](https://www.youtube.com/watch?v=EwGhVS-Y4LE&list=PLdYRFhfhNt_B583zw9EklZwmx8uj9C7qY)
JavaScriptのclassがわからないからアコーディオンボタンを作りながら理解してみる。
↓
[【JavaScript超入門】クラスとインスタンスを世界一わかりやすく解説！](https://www.youtube.com/watch?v=t7hLDtK8MO4&t=1813s)
↓
アコーディオンボタンを作れたからオセロに戻ってコードの理解を深める。
何を理解してないのか言語化してみる。
↓
classがわからない！
# HTMLで間違えたところ
divタグで A1.ああああああ を囲んでいなかったから　A1.ああああああ　が
枠の外になってしまった。
```html
<div class="accordion-contents"></div>
    A1.ああああああ
```
↓ブラウザ
![スクリーンショット 2023-01-13 0.20.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/f13811d6-12dd-81b6-db73-df7a6e3d3b24.png)

やりたかったこと
```html
<div class="accordion-contents">
    A1.ああああああ
</div>
```
↓ブラウザ
![スクリーンショット 2023-01-13 0.27.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/58d4fccb-f1e4-672a-defe-ecfd5a0e90eb.png)
あと95日でネットワークスペシャリストになるSE

<h3>ネットワークスペシャリスト試験まであと９５日</h3>

計算に使ったサイト

https://keisan.casio.jp/exec/system/1493173571

午前Ⅱの過去問に挑戦 12問/20問正解（ギリギリ...）
午前Ⅱは移動時間などにちょくちょく進めよう。

ネットワークスペシャリストの過去問サイト

https://www.nw-siken.com/nwkakomon.php

<h4>SNMP</h4>
Simple Network Management Protocol
UDP/IPベース
ルーター、スイッチなどのネットワーク機器、WindowsやUNIXサーバーなどの状態監視、
リソース監視、パフォーマンス監視、トラフィック監視を行うために使用

<h4>ICMP</h4>
 Internet Control Message Protocol 
TCP/IPベース
ネットワークの疎通がされているノード（サーバー、ネットワーク機器、PCなど）間で、通信状態の確認をするために使われる
Ping
【Shell】アーカイブを作成する方法

## アーカイブの作成
```:ターミナル
$  tar cvf アーカイブ名 対象ファイル1 対象ファイル2　...
```
```:ターミナル
$ tar cvf sample.tar test_1.txt test_2.txt
```

## アーカイブの展開
```:ターミナル
$  tar xvf アーカイブ名 対象ファイル1 対象ファイル2　...
```

```:ターミナル
$ tar xvf sample.tar
```

## 圧縮したアーカイブの作成
```:ターミナル
$  tar cvzf アーカイブ名 対象ファイル1 対象ファイル2　...
```

```:ターミナル
$ tar tar cvzf sample.tar.gz test_1.txt test_2.txt
```

## 圧縮したアーカイブの解凍及び展開
```:ターミナル
$  tar xvzf アーカイブ名 対象ファイル1 対象ファイル2　...
```

```:ターミナル
$ tar tar xvzf sample.tar.gz
```

## オプション
| オプション | 説明 |
|:-:|:-|
| c | アーカイブを新規作成 |
| x | アーカイブを展開 |
| v | 実行時に詳細を表示 |
| z | 圧縮処理を行う  |
| f | アーカイブファイルを指定 |
| t | アーカイブファイルの一覧を表示  |
おすすめな Macbook Air 設定５選

# MacOS へようこそ！

> :smiley:新しい一年に Macbook Air M1 を手に入れました。嬉しい同時に、初めての Macboo kとして MacOS と色々苦戦していました。
ネット上の Macbook 先輩たちの入門記事とガイドを読んで、今は何となく使えるようになっています。
Macbook の詳しい使い方や設定は先輩達の詳しいガイドを読むのがおすすめですが、ここでは個人的におすすめな初期設定を５つを紹介します。
初めてMacbookを購入した方や macOS Ventura の更新によって設定が分からなくなった方の力になると思っています。

# デバイス

- この記事では、Ventura１３.１の設定画面のスクリーンショットを撮っています。

```
    製　　　品　：　Macbook Air　２０２０
    MacOS　：　Ventura　１３.１
```

# おすすめな初期設定

## 指３本で物を移動する（ほかの機能あります）

```shell
設定の位置　：　
システム設定　→　アクセシビリティ　　→　操作　→　ポインタコントロール　→　トラックパッドオプション　→　３本指のドラック
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/14c9cc74-5780-46aa-7daf-744ceddadca7.png)

## バッテリー割合を表示

```shell
設定の位置　：　
システム設定　→　コントロールセンター　　→　その他のモジュール　→　バッテリー
```

![バッテリー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/3d5e6f82-95e5-d2b5-9d88-df618b2dd547.png)

## 蓋を閉じたすぐパソコンがロックされるように

```shell
設定の位置　：　
システム設定　→　ロック画面　　→　
スクリーンセーバの開始後またはディスプレイがオフになったあとにパスワードを要求　→　すぐに
```

![閉じたらすぐロック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/50abeff2-accd-26f7-ae90-ceacc078d619.png)

## Apple Watchを使ってアプリケーションとMacのロックを解除します。

```shell
設定の位置　：　
システム設定　→　Touch ID とパスワード　　→　Apple Watch
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/7241d9d5-b568-5585-337f-1f49ea2d7c25.png)

## Macbook のトラックパッドをWindowsのようにタップでクリック

```shell
設定の位置　：　
システム設定　→　トラックパッド　　→　タップでクリック
```

![タップでクリック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/f54950c8-56cf-c4b9-b080-711815321fe5.png)

# 最後

:writing_hand_tone1:この５つの設定は個人的にとても便利、そして探しにくいと思っていました。
シェアしながら、私個人のメモとしても今回の記事を書きました。
皆様の役に立ってたらとても嬉しいです。
まだまだMac初心者なので、もし他の便利なコツや設定を知っていれば、せひコメントで教えて頂ければ:yum:
喜んで試していきます。
マインドマップから始めるソフトウエアテスト　メモ

### テストを行う理由
開発過程で発生したバグを発見し、修正することで、ユーザが安心して商品やサービスを利用できる。また、サービス提供を行う企業は、バグによるイメージダウンの低下、修正コストを事前に避けることができる。

### テスターは医者のようなもの。
医者は、患者の状態を適切に判断し、正しい処置を行い、また改善のアドバイスを伝えます。そのために医者は病気や処置方法、ツールの使い方等について深い知識があります。ソフトウエアテストも同様で、ソフトウエアやテスト方法、ツールについて知識が必要となります。また、バグやその兆候を見つける分析力も必須です。

### テスト工程
#### 単体テスト
詳細仕様書に基づいてテストケースを作成し、プログラムと付き合わせて確認する。プログラムの内部構造に注目して、テストを行う。
#### 結合テスト
仕様書を基に、モジュール間やOS、他のシステムとの相互処が正しく行われるかをテストする。
#### システムテスト
システム仕様書に基づいて、ソフトウエアやシステム全体の動きをテストする
#### 受け入れテスト
お客様視点に立ち、システムやソフトウエアが使用できるものかテストする。

### 作業工程
#### 仕様分析
資料やサービスを把握し、どのようなテストが必要か検討する。またテストの開始/終了条件、人員体制などを洗い出す
#### テスト計画
仕様分析によって洗い出された情報を基に計画を作成する。またどのように攻めていくのかを考える。
#### テスト設計
対象物に対して、さらに詳しくどの部分を攻めていくのか考え、テストケースを作成する。DBに負荷をかけるのか、サーバに負荷をかけるのかなど。
#### テスト実装
テストデータを組み合わせて、テストケースを作成する。
#### テスト実行
テストを行う
#### テスト報告
お客様やマネージャーにテスト結果を報告する

### 感想
この本を通じて、テストに取り組むにはテスト手法だけでなく、サーバや開発技術、ソフトウエアに関する知識の必要性を感じた。ここから、テスト手法だけでなく、幅広い知識を身に付けていく。 

参考資料
マインドマップから始めるソフトウェアテスト
コンピュータ基礎技術②

■OSによるコンピュータの管理・制御機能
OSはコンピュータ（ハードウェア、ソフトウェア）の管理・制御する機能を提供している。

■デバイスドライバー：入出力装置等の周辺機器を扱うためには「デバイスドライバー」と呼ばれるハードウェア制御用のプログラムが必要となる。一般的にハードウェアデバイスにはデバイスドライバーがアタッチされており、利用するOSに対応したデバイスドライバーをインストールする必要がある。

・入出力管理：コンピュータの入出力装置などの周辺機器をデバイスドライバーで制御し、異なる速度の装置間でのデータ転送を効率よく行えるよう調整する仕組み。

■バッファ：機器やソフトウェアの間でデータをやり取りする際に処理や転送の速度差を吸収するために設けられた、メモリー上の一時的な記憶領域。

■キャッシュ：
使用頻度の高いデータへのアクセスを高速にするため、より高速な記憶領域に一時的に保管する仕組み。

■プロセス：OSからメモリ領域などの割り当てを受けて処理を実行しているプログラムのことをプロセスという。コンピュータで実行されるプログラムは、OSによってハードディスクなどの補助記憶装置から主記憶装置であるメモリー上に読み込まれ、プロセスと呼ばれる単位で管理される。

■時分割処理：OSは複数のプロセスを同時に動作させる為に、CPUを利用できる時間を細かく区切って複数のプロセスを順番に処理している。

■スケジューリング：プロセスは基本的に生成された順番にCPUの使用権が割り当てられるが、優先順位の高いプロセスが生成された場合は優先的にCPUの割り当てが行われる。

・プロセスの待ち状態：
実行状態のプロセスで入出力処理などCPUが処理できない状況の場合、プロセス待ち状態に移行させ処理完了次第実行可能な状態に戻す。

・メモリー管理：
プロセスに対するメモリの割り当てや仮想記憶を管理すること

・プログラムの読みこみ：
プログラムの実行、及び処理するデータはハードディスクからメモリーに読み込む必要がある。

・メモリーを効率的に使うための仕組み：
メモリーに空きがない時は、プロセスやデータを一時的に空いた領域（仮想領域）に保管する。

・仮想記憶：
仮想記憶によりメモリーとハードディスクを使い、実際のメモリーより大きな記憶領域が使用できる。

・ファイルシステム管理：
OSがファイルを階層構造でユーザーにわかりやすく補助記憶装置上で管理する。


・ファイルシステムの仕組み：
ファイルシステムは、ハードディスク上のどの場所にどのファイルを格納してあるかを管理するための仕組み。OSはこの情報を利用しハードディスクの管理を行う。
【git】error: unknown switch ` '　の解決方法とは（コミットディスクリプションの登録方法・コミットメッセージの文字数制限も）

# エラー内容
* `git commit`したら、以下のエラーメッセージが返された。

```terminal
error: unknown switch ` '
```

# 解決方法
* 上記エラーメッセージで検索しても全然記事が出てこない...と思ったが、commit description(説明文)に単純にタイプミスがあった。

```terminal
$ git commit -m "CommitMessage" -m "- Modified views.py"-m "- Modified urls.py"
```

↓↓↓
`-m "- Modified views.py"`の直後にスペースがなかった！汗
↓↓↓


```terminal
$ git commit -m "CommitMessage" -m "- Modified views.py" -m "- Modified urls.py"
```

* これで無事にコミットできました！

# 補足１：コミットディスクリプション（説明文）
* 上記の例でいうと、"CommitMessage"がコミットメッセージ（タイトル）です。
* その次に宣言されているのが、説明文(Description)。これは、`-m`で区切っていくことで改行されます。
* 自分は詳細の変更点も記載する時にこちらを利用しています。
* 参考記事：[Git：git commitとDescription部分の登録方法について](https://tyoshikawa1106.hatenablog.com/entry/2016/04/08/015920)

# 補足２：コミットメッセージの文字数
* そもそもディスクリプションに書かなくてもコミットメッセージに全部書いちゃえばいいじゃないか、という話もあるかもしれませんが、コミットメッセージは50文字以下が推奨されており、最大でも72文字までしか入りません。72文字を超えると、自動的に折り返される（=コミットディスクリプションの方に移行する）ので要注意。あまり長くしても分かりやすいとは言えませんしね。
GitHub ActionsでNGを検出した際にPRにコメントをする方法

# なぜするのか
GitHub Actionsでのチェックで失敗した場合に、Actionsのコンソールまで見に行くのが大変なので
PRを見るだけでわかるようにするため。

# やり方
- `permissions`で`pull-requests: write`設定をする
- PRにコメントするためPRの番号を取得する
- ghコマンドを利用するためGITHUB_TOKENを設定する
- コメントしたい内容をファイルに出力する
- ghコマンドでコメントをする

```gh-comment.yaml
name: main

on:
  pull_request:
    types: [ opened, synchronize ]

jobs:
  main:
    runs-on: ubuntu-22.04
    permissions:
      contents: read
      pull-requests: write
    timeout-minutes: 5
    steps:
      - name: CommentTest
        env:
          PR_NUMBER: ${{ github.event.number }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          echo "PRへのコメント内容をファイルに出力する" > /tmp/comment
          gh pr comment "${PR_NUMBER}" -F /tmp/comment
```

# 実行例
![Screenshot_1241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217092/99073f46-7e26-78aa-0fa8-6b8febeb2c2f.png)

# 実際のActionsに組み込んでみる
## 設定yaml
textlintなどで失敗すると、そこで処理が終了してします。
そのため`||true`としておき、その行は正常終了させる。
そして、ファイル出力があった場合には内容を出力して異常終了とする。
``` main.yaml（抜粋）
      - name: textlint
        env:
          PR_NUMBER: ${{ github.event.number }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          git diff origin/main HEAD |grep "^+++" |awk '{print $2}'|sed "s|b/||"| grep -e \.md$ -e \.md\"$ |xargs npx textlint > /tmp/comment || true
          if [ -s /tmp/comment ]; then
            gh pr comment "${PR_NUMBER}" -F /tmp/comment
            exit 1
          fi
```
## エラーがあった際
![Screenshot_1243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217092/1d5dbc7a-bd8a-714d-0b39-eab52755e80f.png)

# 参考

https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows

https://cli.github.com/manual/gh_pr_comment

https://qiita.com/osakiy/items/df80db383ce33b82c797

https://genzouw.com/entry/2021/01/29/192636/2153/

https://zenn.dev/hashito/articles/aef4de448f341b
SC-900: Microsoft セキュリティ、コンプライアンス、ID の基礎に合格した話

本エントリーはAdvent Calendar 2022「[NKC-UG Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nkc-ug)」の8日目のエントリーです！

# はじめに

こんにちは。[ノル](https://twitter.com/noll6451)です

今回は「NKC-UG」主催のアドベントカレンダー「[NKC-UG Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nkc-ug)」の8日目にエントリーしました
## きっかけ
Microsoftの資格を一通りとったので、備忘録代わりです。(いま調べたらMS900受験できるようになっているので、近いうちに取りに行く)
自分の合格したMicrosoftの資格一覧は[こちら](https://www.linkedin.com/in/rei-suzuki-22b443211/)で見れます。
~~NKC-UGの代表だから仕方なくではない~~

#この記事の対象者

- Microsoftの認定試験を受験予定の人
- Azure・Microsoft365に関するセキュリティを勉強したい初心者の方
- 学生向け

## この資格の説明
[公式](https://learn.microsoft.com/ja-jp/certifications/security-compliance-and-identity-fundamentals/)では
>Microsoft のセキュリティ、コンプライアンス、ID (SCI) ソリューションの知識を証明する。
Microsoft SCI ソリューションが包括的なエンドツーエンドのサイバーセキュリティ機能を提供する方法を理解していることを強調する。

となっております。

Microsoftにおけるセキュリティ・コンプライスがどうなっているのか理解を問う試験です。
ちなみに
この試験も、社会人、学生関係なく**無料**のバウチャーがもらえる方法があります。


## 試験予約編
社会人も学生も無料になる方法があります(社会人の方はこちらの方法ですが、学生の方は2通りあります)
まずは、下から有無言わさず予約してください。この時のメールアドレスはしっかりと保管してください(個人のメールアドレスが推奨です。)

https://www.microsoft.com/ja-jp/events/top/training-days/security?activetab=a1:primaryr3

前から録画してある動画を流すウェビナーなので、ぶっちゃけどんな状況でも受けれます。ただしっかりと出席だけはしてください。(バウチャーがもらえないので)

## 勉強方法
この試験ですが、前の記事と同様、ほとんど情報少ないです。
上記のウェビナーですが、合格したいなら、真剣に聞くことをお勧めします！(ほんとに！ここでしか言わない情報が多すぎる)

https://learn.microsoft.com/ja-jp/certifications/exams/sc-900/


まずは**ヒント**というところをしっかりとみてください(重要です)
実際の試験の操作も体験できます。
その次に下にスクロールすると、勉強できるようにラーニングパスがあるので
それに沿って勉強すれば十分です。(もちろん無料です)


# 試験を受けるときの注意点

- 日本語がおかしい場合がある(英語に直す、察する)
- 採点されない問題が出てくる
- 出題範囲にない問題が出てくる(たぶん採点されてない？)
- 人によって問題数が違う
- 意外と時間がないので、サクサク進める(後から回答し直せる)
- 分からなくてもとりあえず何かしら選ぶ(1000点中合格スコア700だけど、7割ではないらしい)


Microsoft試験基礎シリーズの6記事めです。
ぜひこれを機にとってみてはいかがですか？？(実は、基礎資格は有効期限はないです)
ちなみ学生ですが、実は単位認定される可能性があります。

https://learn.microsoft.com/ja-jp/certifications/college-credit


皆さんの合格をお祈りしてます。

Microsoft試験基礎シリーズ
1記事め

https://qiita.com/Rei1729/items/89d693c73e0156764beb

2記事め

https://qiita.com/Rei1729/items/d889385246886ec9dfa9

3記事め

https://qiita.com/Rei1729/items/f635ec940beaef6a6e6a

4記事め

https://qiita.com/Rei1729/items/b6b10aaef702763c0289

5記事め

https://qiita.com/Rei1729/items/6592e2c5b5cdede1fe36
CloudFormationテンプレート小ネタサンプル集

## パラメータのグルーピング・順番固定
パラメータ定義だけだと、入力項目がアルファベット順にソートされる。
固定したい場合は[AWS::CloudFormation::Interface](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-interface.html)を利用する。
```yaml
Parameters:
  PJPrefix:
    Type: String
  Environment:
    Type: String
  VPCCidr:
    Type: String
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: General
        Parameters:
          - PJPrefix
          - Environment
      - Label:
          default: Network
        Parameters:
          - VPCCidr
```

## 環境別定義
構築時に環境に合わせたパラメータを沢山入れるのが面倒！って場合。
```yaml
Parameters:
  Environment:
    Type: String
    AllowedValues:
      - production
      - staging
      - develop
Mappings:
  EnvironmentMapping:
    production:
      VPCCidr: 10.0.0.0/16
      InstanceType: t3.small
    staging:
      VPCCidr: 10.1.0.0/16
      InstanceType: t3.small
    develop:
      VPCCidr: 10.2.0.0/16
      InstanceType: t3.micro
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !FindInMap [EnvironmentMapping, !Ref Environment, VPCCidr]
```

## テンプレートファイル分割時の連携
OutputsでExportした値は、[Fn::ImportValue](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html) を使って別テンプレートから呼び出せる。
```vpc.yaml
Parameters:
  PJPrefix:
    Type: String
  Environment:
    Type: String
  VPCCidr:
    Type: String
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCidr
Outputs:
  VPCID:
    Value: !Ref VPC
    Export:
      Name: !Sub "${PJPrefix}-${Environment}-VpcId"
```
```subnet.yaml
Parameters:
  PJPrefix:
    Type: String
  Environment:
    Type: String
  SubnetAZ:
    Type: String
  SubnetCidr:
    Type: String
Resources:
  Subnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Fn::ImportValue:
          !Sub "${PJPrefix}-${Environment}-VpcId"
      CidrBlock: !Ref SubnetCidr
      AvailabilityZone: !Ref SubnetAZ
```

## 未入力パラメータの処理分岐
Conditionsに条件を定義し、[Fn::If](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)で処理分岐させる。
ある条件で未定義にしたい場合は、!Ref AWS::NoValue を設定する。
```yaml
Parameters:
  MailAddress1:
    Type: String
  MailAddress2:
    Type: String
Conditions:
  ExistMailAddress1:
    Fn::Not: [!Equals [!Ref MailAddress1, '']]
  ExistMailAddress2:
    Fn::Not: [!Equals [!Ref MailAddress2, '']]
Resources:
  Topic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Fn::If:
          - ExistMailAddress1
          - Endpoint: !Ref MailAddress1
            Protocol: email
          - !Ref AWS::NoValue
        - Fn::If:
          - ExistMailAddress2
          - Endpoint: !Ref MailAddress2
            Protocol: email
          - !Ref AWS::NoValue
```
React用仮想かなキーボード（フリック入力対応）

## ウェブ(React)用の仮想かなキーボードを作りました

予測変換は非対応です。ひらがな、カタカナ、濁点、半濁点、ゃゅょ、ャュョに対応しています。フリック入力対応です。

![img2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681892/dd1d6094-5441-1379-fa78-8fca7da6d868.jpeg)

## デモ動画

[YouTubeにアップロードしたデモ動画です](https://youtu.be/w-7aY4_mYgQ)

## Requirements

スワイプ検知に**react-swipeable**を使用しています。スタイリングには**React Native Web**を使用しています。

- react-native
- react-native-web
- react-swipeable

## レポジトリ

サンプルコードは以下レポジトリにあります。仮想キーボードコンポーネントは`src\components\KanaKeyboard`内にあります。

[react-virtual-kana-keyboard](https://github.com/kiyohken2000/react-virtual-kana-keyboard)

## 使い方

詳しい使い方は`src\screens\home\Home.js`を参照ください。

文字入力、エンターキー押下、バックスペースキー押下時の挙動は呼出側のコンポーネントで制御します。

### 文字入力時の制御

`val`に入力された文字が入っています。濁点、半濁点、小書き文字に変換した場合`isShiftInput`に`true`が入ります。

```javascript
const onInput = ({val, isShiftInput}) => {
  if(!val) return
  setText(prev => {
    if(isShiftInput) {
      const tempText = prev.slice(0, -1)
      return `${tempText}${val}`
    } else {
      return `${prev}${val}`
    }
  })
}
```

### エンターキー押下時の制御

```javascript
const onEnterPress = () => {
  if(!text) return
  setTextLines(prev => {
    return [...prev, text]
  })
  setText('')
}
```

### バックスペース押下時の制御

```javascript
const onBackspacePress = () => {
  if(!text) return
  setText(prev => prev.slice(0, -1))
}
```

### 仮想キーボードに各キー押下時の制御を渡す

```javascript
<KanaKeyboard
  onInput={onInput}
  onEnterPress={onEnterPress}
  onBackspacePress={onBackspacePress}
/>
```

## 仮想キーボードの設定

キーボードの設定は`src\components\KanaKeyboard\config.js`で行います。

```javascript
const keyboardStyles = {
  padding: 1, // キーの間隔 数値
  borderColor: colors.darkPurple, // キーの輪郭色 文字列
  borderWidth: 1, // キーの輪郭線幅
  borderRadius: 5, // キーの角丸 数値
  symbolLabelSize: fontSize.xxxxxLarge, // 文字キーのラベルフォントサイズ 数値
  symbolLabelColor: colors.black, // 文字キーのラベル色 文字列
  enterIconSize: fontSize.xxxxLarge, // エンターキーのアイコンサイズ 数値
  enterIconColor: colors.darkPurple, // エンターキーのアイコン色 文字列
  shiftSymbolSize: fontSize.xLarge, // 濁点半濁点キー、ひらがなカタカナ切替キーのラベルフォントサイズ 数値
  shiftSymbolColor: colors.black, //  濁点半濁点キー、ひらがなカタカナ切替キーのラベル色 文字列
  paletBackgroundColor: colors.floralwhite, // 文字キー展開時の背景色 文字列
  paletSymbolColor: colors.black, // 文字キー展開時のラベル色 文字列
  emptyKeyColor: colors.floralwhite, // 無効キーの色 文字列
  backspaceIconSize: fontSize.xxxxLarge, // バックスペースキーのアイコンサイズ 数値
  backspaceIconColor: colors.darkPurple, // バックスペースキーのアイコン色 文字列
}

const keyboardSettings = {
  shiftVisible: true, // ひらがなカタカナ切替キーの有効無効 真偽値 無効時は無効キーになります
  backspaceVisible: true, // バックスペースキーの有効無効 真偽値 無効時は無効キーになります
  trackMouse: true, //マウス操作でのスワイプを許可する場合はtrue
  keySize: width / 6, // 各キーのサイズ 数値
}
```

エンターキーとバックスペースキーのアイコンを変更する場合は以下のコンポーネントを編集します。

- `src\components\KanaKeyboard\EnterKey.js`
- `src\components\KanaKeyboard\BackspaceKey.js`

## スクロール

スワイプ操作とスクロール操作がコンフリクトするためCSSでスクロールを無効にしています。

`src\index.css`

```css
html{
  overflow: hidden;
}
```
UMLの基礎知識

<h4>・UMLとは</h4>
　UMLは、"Unfied Modeling Language"の略で、一言でいえばどんな人でも、又は、異なるプログラミング言語を習得している者同士でも、<b>システムを理解することができる図</b>のことです。<br>
　UMLの根底となる考え方で<b>モデリング</b>というものがあります。モデリングとはものごとを抽象的にすることです。<br>

<h4>・モデリングとは</h4>
　モデリングで必要なことは、<b>必要のない情報を削ること</b>です。
　たとえば、「Apexができるパソコンがほしい」といっているパソコン初心者の人がいるとします。しかし、世の中にはパソコンは多くあり、まずWindowsなのか, Macなのか、ノートパソコンなのか, デスクトップパソコンなのか、自作パソコンにするのか, BTOにするのかなどパソコン初心者にとっては情報が多すぎてわからないと思います。そこで、ApexがしたいといっていることからMac、ノートパソコン、さらに自作パソコンの選択肢を省きます。すると、WindowsのデスクトップパソコンでBTOと、限られた情報だけが残り、受け取る側がわかりやすくなります。

<h4>・UMLの図の種類と分類</h4>
 UMLの図には様々な種類があります。その図を大きく分けると<b>構成図</b>と<b>振る舞い図</b>があります。

<h5>・構成図</h5>
　構成図とは、オブジェクトやクラス、システムの部品などの静的構造を表現するときに使う。

<h5>振る舞い図</h5>
　振る舞い図とは、オブジェクトやクラス、システムの部品などの動的構造を表現するときに使う。
データサイエンス100本ノック　21～30

# データサイエンス100本ノック（構造化データ加工編）
https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess

GitHubにColaboratoryが用意されているので、自分のドライブにコピーするだけで簡単に始められます。

※協会が出している解答の書き方と異なる箇所もありますが、出力としては同じになっています。協会の解答はGitHubから確認してください。解説本も販売されています。

# 解答
### P021
>レシート明細データ（df_receipt）に対し、件数をカウントせよ。
```Python:P021
len(df_receipt)
```
### P022
>レシート明細データ（df_receipt）の顧客ID（customer_id）に対し、ユニーク件数をカウントせよ。
```Python:P022
len(df_receipt['customer_id'].unique())
```
### P023
>レシート明細データ（df_receipt）に対し、店舗コード（store_cd）ごとに売上金額（amount）と売上数量（quantity）を合計せよ。
```Python:P023
df_receipt.groupby('store_cd').agg({'amount':'sum','quantity':'sum'})
```
### P024
>レシート明細データ（df_receipt）に対し、顧客ID（customer_id）ごとに最も新しい売上年月日（sales_ymd）を求め、10件表示せよ。
```Python:P024
df_receipt.groupby('customer_id').agg({'sales_ymd':'max'}).head(10)
```
### P025
>レシート明細データ（df_receipt）に対し、顧客ID（customer_id）ごとに最も古い売上年月日（sales_ymd）を求め、10件表示せよ。
```Python:P025
df_receipt.groupby('customer_id').agg({'sales_ymd':'min'}).head(10)
```
### P026
>レシート明細データ（df_receipt）に対し、顧客ID（customer_id）ごとに最も新しい売上年月日（sales_ymd）と古い売上年月日を求め、両者が異なるデータを10件表示せよ。
```Python:P026
tmp = df_receipt.groupby('customer_id').agg({'sales_ymd':['max','min']}).reset_index()
tmp.columns.droplevel(1)
tmp.columns = ['customer_id', 'sales_ymd_max', 'sales_ymd_min']
tmp.query('sales_ymd_max != sales_ymd_min').head(10)
```
マルチインデックスのDataFrameで考えます。
[DataFrame.droplevel(level, axis=0)](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.droplevel.html)で列名をいじれます。

### P027
>レシート明細データ（df_receipt）に対し、店舗コード（store_cd）ごとに売上金額（amount）の平均を計算し、降順でTOP5を表示せよ。
```Python:P027
df_receipt.groupby('store_cd').agg({'amount':'mean'}).reset_index().sort_values('amount',ascending = False).rename(columns ={'amount':'amount_mean'}).head()
```
### P028
>レシート明細データ（df_receipt）に対し、店舗コード（store_cd）ごとに売上金額（amount）の中央値を計算し、降順でTOP5を表示せよ。
```Python:P028
df_receipt.groupby('store_cd').agg({'amount':'median'}).reset_index().sort_values('amount',ascending = False).rename(columns ={'amount':'amount_median'}).head()
```
### P029
>レシート明細データ（df_receipt）に対し、店舗コード（store_cd）ごとに商品コード（product_cd）の最頻値を求め、10件表示させよ。
```Python:P029
df_receipt.groupby('store_cd')['product_cd'].apply(lambda x:x.mode()).reset_index().head(10)
```
DataFrame.mode()を使おうとしたのですが、groupbyを使ってるとエラーになります。残念ながらmode()は使える組み込み関数一覧にありませんでしたが、mean()、count()あたりは使えます。

### P030
>レシート明細データ（df_receipt）に対し、店舗コード（store_cd）ごとに売上金額（amount）の分散を計算し、降順で5件表示せよ。
```Python:P030
df_receipt.groupby('store_cd').agg({'amount':'var'}).reset_index().sort_values('amount',ascending = False).rename(columns ={'amount':'amount_var'}).head()
```
Git　入門講座　基本コマンド編

## はじめに
Udemyのこちらの講座でGitHubの勉強をしたので、メモ代わりに書いていきます。
今回は、基礎的なコマンドを紹介していきます。
[もう怖くないGit！チーム開発で必要なGitを完全マスター](https://www.udemy.com/course/unscared_git/)


## よく使うコマンド
こちらのコマンドについて説明していきます。
|コマンド|　コマンド説明　|
|:--:|:---:|
|git init|.gitディレクトリを作る|
|git branch|ブランチを作る|
|git checkout|ブランチを切り替える|
|git status|ファイルの変更状況を確認する|
|git add|ステージにワークツリーのデータを持っていく|
|git commit|ステージのデータをリモートリポジトリに送る|
|git push|ローカルリポジトリのデータをGitHubのリモートリポジトリに送る|
|git diff|ファイルの変更差分を確認する|
|git fetch|フェッチをするコマンド|
|git merge|マージをするコマンド|


## 各コマンド説明
**init**

```
git init
```
.gitディレクトリが作成される。こちらのコマンドを打ち込まないと、Gitを使うことはできません。
忘れずに行いましょう。

**branch**

```
git branch hukuryo
```
ブランチを作成する時に使うコマンドです。この場合はhukuryoというブランチが作成されることになります。

**checkout**

```
git checkout hukuryo
```
ブランチを切り替えるコマンドです。ブランチ名は既存のブランチ名を指定。この場合はhukuryoブランチに切り替わります。

**status**

```
git status
```
ファイルの変更状況を確認するコマンドです。commitやpushをした後、しっかり変更がされているかを確認するときなどに使用します。

**add**
```
git add .
```
ワークツリーで編集したデータを、ステージに送るコマンドです。
よく使うのはピリオドをつけるやり方で、これをつけると、全てのデータをステージに乗せることができます。

**commit**

```
git commit -m "メッセージ"
```
commitは、ステージに乗せたデータを、ローカルリポジトリに送るコマンドです。
また、-m "メッセージ" とすることで、pushした時のメッセージを指定することができます。

**push**
```
git push origin main
```
commitでステージに上げたファイルを、GitHubのリモートリポジトリに記録するコマンドです。mainはブランチ名を指定しており、この場合は「mainブランチから記録する」という意味になります。

**fetch**
```
git fetch origin
```
こちらは、リモートリポジトリからデータをステージに持ってくるコマンドです。基本的にはmergeをする前にこちらのコマンドを使用し、mergeをして自分のワークツリーのファイルに変更を取り込むといった流れになります。originはリモート名を指しています。

**merge**

```
git merge main
```

ステージに乗せられているデータを取得して、自分のワークツリーに取り込むコマンドになります。
この場合は、「mainブランチにステージの情報を取り込む」という意味になります。


とりあえずは以上になります。また追記していきます。
tar ファイルをカレントディレクトリに展開してファイルが散乱してしまった。散乱したファイルを削除する方法

tar.gz ファイルをカレントディレクトリに展開してファイルが散乱してしまった。散乱したファイルを削除する方法

# 環境

```
# tar --version
tar (GNU tar) 1.30
```

# 困りごと

tar コマンドは `-C` オプションを指定しなければ、カレントディレクトリにファイルが展開される。ファイルが大量が展開されると、カレントディレクトリにもともとあったファイルと混在し困ったことになる。

:::note warn
警告
ファイルを上書きしてしまった場合はもとに戻せません。
:::

# 回避方法

tar.gz ファイルを展開したとき `-C` あるいは `--directory` オプションを付与すれば、展開するディレクトリを指定できる。


# 散乱したファイルを削除する方法

tar コマンドでファイルを散乱させてしまったときカレントディレクトリにあるファイルを見つけることすら大変になる。とりあえず tar で展開したファイルをすべて削除したい。

## 散乱させたファイルを一覧する

その場合 `-t` あるいは `--list` オプションが救世主となる。このオプションは tar ファイルに含まれるファイルを一覧表示する。

出力例を次に示す。

```
# tar -tf seq.tar
10.txt
1.txt
2.txt
3.txt
4.txt
5.txt
6.txt
7.txt
8.txt
9.txt
```

## 散乱させてしまったファイルを削除する

展開したファイル一覧が取得できればあとは次のコマンドで展開されたファイルを削除する。いきなり消すと怖いので `echo` で実行されるコマンドを確認しておく

```
tar -tf seq.tar | xargs -I {} echo rm -rf {}
```

問題なければ実行する

```
tar -tf seq.tar | xargs -I {} rm -rf {}
```

# 参考資料

* https://www.linuxquestions.org/questions/linux-newbie-8/undoing-a-tar-extract-267152/