OmniAICreator/Qiita-1.07M huggingface dataset:
franka_hw実装調査

### franka_hw.h
libfrankaのヘッダファイルを使用
```cpp
#include <franka/control_types.h>
#include <franka/duration.h>
#include <franka/rate_limiting.h>
#include <franka/robot.h>
#include <franka/robot_state.h>
namespace franka_hw {
class FrankaHW : public hardware_interface::RobotHW {
  franka::RobotState robot_state_libfranka_{};
  franka::JointPositions position_joint_command_libfranka_;
  franka::JointVelocities velocity_joint_command_libfranka_;
  franka::Torques effort_joint_command_libfranka_;
  franka::CartesianPose pose_cartesian_command_libfranka_;
  franka::CartesianVelocities velocity_cartesian_command_libfranka_;
  std::unique_ptr<franka::Robot> robot_;
};
}  // namespace franka_hw
```
### franka_hw.cpp
```cpp
#include <franka_hw/franka_hw.h>
void FrankaHW::connect() {
  if (!robot_) {
    robot_ = std::make_unique<franka::Robot>(robot_ip_, realtime_config_);
    robot_->setCollisionBehavior(collision_config_.lower_torque_thresholds_acceleration,
                                 collision_config_.upper_torque_thresholds_acceleration,
                                 collision_config_.lower_torque_thresholds_nominal,
                                 collision_config_.upper_torque_thresholds_nominal,
                                 collision_config_.lower_force_thresholds_acceleration,
                                 collision_config_.upper_force_thresholds_acceleration,
                                 collision_config_.lower_force_thresholds_nominal,
                                 collision_config_.upper_force_thresholds_nominal);
  }
}
void FrankaHW::initRobot() {
  connect();
  model_ = std::make_unique<franka_hw::Model>(robot_->loadModel());
  update(robot_->readOnce());
}
```
Atomic Designについての個人的な解釈

# Atomic Designとは
要素をパーツやコンポーネント単位で分割して、定義するUIデザイン、設計手法のことです。

## 分割する単位

Atomic Designでは分割する単位は下記のように定義されています。

### atoms 原子 (Lv1)
アイコンや配色、フォント、ボタン、テキストエリアなど、
これ以上分割できないもの。

#### h1
![H1 - Regular 38px.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214617/3dca80af-fefc-d17f-e8f6-2fed0bad5082.png)

#### text
![Text - Regular 16px.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214617/705666e3-a8d2-95cb-aec3-3fb241361772.png)

#### color
![Informational Blue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214617/1f6eb266-78b3-9d0d-c247-0dc4c6bbb97c.png)

#### label
![Label.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214617/f5c49625-6f71-6960-d760-7e84083e13e8.png)

#### input text
![Default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214617/909f219c-2573-c3cd-232f-590fe00c0bc2.png)

#### icon
![Normal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214617/d89528e6-bf1a-c8d4-e2a9-173570910263.png)

#### button
![Normal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214617/85c0c09e-da3b-8ba4-c7cb-47cbb724f954.png)

### molecules 分子(Lv2)
atomを2つ以上のを組み合わせたもの。

#### buttonとicon
![Normal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214617/5166607e-bc1f-5e14-2f25-4512bdef6c45.png)

#### labelとinput text
![Default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214617/fa648e0c-1908-6639-e3dc-1714bdbc54b3.png)

### organisms 生体(Lv3)
atomsやmoleculesを組み合わせたもの。
汎用的に使用できるように組み合わせたorganismsにはmarginなどは指定しません。
atomsやmoleculesにスタイルを指定することはあります。
![Group 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214617/d8c18012-2bb1-7196-7492-4d3ba89717c1.png)

### templates テンプレート(Lv4)
organismsを組み合わせたもの。
レイアウトやorganismsの横幅、スペースなどを指定します。
![templates.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214617/7057b31a-532d-bbc8-a16c-d17b2a440824.png)

### pages ページ(Lv5)
取得したデータを反映したり、ページ固有の情報をtemplateを渡すもの。
また、ページ固有のスタイルなどもこちらで指定します。
![templates.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214617/f1c11f20-418f-e350-1e16-8258ed2816fd.png)

以上、僕のAtomic Designに関する解釈でした。

明確な答えがあるものではないと思っているのですが、
こうした方がいいのでは？？
自分はこうやって使っているなどあればお教えいただけますと幸いです。
【PHP】CSRF 対策【かんたん】

# はじめに

Laravelなどを使わず、シンプルなPHPでフォームを作る場合、csrf対策を自力で行う必要があります。

まあそんな機会は多くないかもしれませんが、覚えておいて損はない、、！
ということでやっていきましょう。



入力画面、確認画面、結果画面、3画面の一般的なフォームで実装していきます。


# 入力画面

ランダムな文字列で生成したトークンを、セッションに格納します。
すでにセッションに存在する場合は、そちらを使います。


```php:entry.php
<?php
session_start();  //セッション開始

  $token = '';
  if ( isset( $_SESSION[ 'token' ] ) || !empty( $_SESSION[ 'token' ] ) ) {
    $token = $_SESSION['token']; //セッションにすでにあるとき
  } else {
    $token = bin2hex(random_bytes(32)); //トークンを生成
    $_SESSION['token'] = $token;   //セッションにトークンを格納
  }
```


type=“hidden”で隠したinputに、トークンを置き、他の入力内容とともにsubmitします。

```php:entry.php
<form action="./confirm.php" method="POST">
   <input type="hidden" name="token" value="<?php echo $token; ?>"> //隠しフィールドにトークンを設置し、フォーム送信時に一緒に送る
   <input type="submit" value="確認">
</form>
```

# 確認画面
POSTで送られてきたトークンがセッションにあるトークンと一致するかをチェックしています。
一致しない場合は、入力画面に戻す。
一致する場合は、またinputに設置して送信します。

```php:confirm.php
<?php
session_start();  //セッション開始

//トークンチェック
if (isset($_POST['token']) && isset($_SESSION['token'])) {
    $token = $_POST['token'];
    if ($token != $_SESSION['token']) { //トークンが一致しない場合は処理を中止
        header("Location: entry.php");
        echo ('アクセスが中断されました。');
        exit();
        }
    } else {  //トークンが存在しない場合は処理を中止する
        header("Location: entry.php");
        echo ('不正なアクセスです');
        exit();
    }
```

```php:confirm.php
<form action='./complete.php' method='POST'>
        <input type='hidden' name='token' value='<?php $token; ?>'>  
        <input type="submit" value="送信する">
</form>
```

# 結果画面
結果画面でも、確認画面と同じようにチェックすればOKです。


```php:complete.php
<?php
session_start();  //セッション開始

//トークンチェック
if (isset($_POST['token']) && isset($_SESSION['token'])) {
  $token = $_POST['token'];
  if ($token != $_SESSION['token']) { //トークンが一致しない場合は処理を中止
      header("Location: entry.php");
      echo ('アクセスが中断されました。');
      exit();
      }
  } else {  //トークンが存在しない場合は処理を中止する
      header("Location: entry.php");
      echo ('不正なアクセスです');
      exit();
  }
```

最後に処理が完了したら、

```php
session_destroy();
```
で、セッションを破棄することをお忘れなきよう！

以上、これにて完成となります。

# おわりに
いかがだったでしょうか。
Laravelだと、@csrfと書くだけですが、Laravelが使えない場合でも、意外と簡単に作ることができます。

ぜひ参考にしてみてください！
python3.6 以降で変数を文字列に埋め込んで出力する  print(f "{variable}")

# 例

```py
name = "Alice"

print(f"My Name is {name}") # My Name is Alice
```



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
リポジトリのルートディレクトリにcdしやすくした

addしてcommitしてpushするためにリポジトリのルートディレクトリに戻らなきゃならないときに、何回も
```shell
cd ../
```
したり
もしくは今いるリポジトリをどこに置いていたかを思い出して
```shell
cd ~/hoge-repository
```
したりするのが面倒くさくなって調べてみたら
```shell
git rev-parse --show-toplevel
```
でリポジトリのルートディレクトリが取得できることがわかった
ので、
```shell
git config --global alias.root 'rev-parse --show-toplevel'
```
して
```shell
git root
```
でルートディレクトリを取得できるようした
これで
```shell
cd $(git root)
```
だけでリポジトリのルートディレクトリに戻れるようになった
快適！
EC2にCloudWatch エージェントを設定してCloudWatch Logsにログを送信する

# AutoScalingグループのEC2でログを取りたい
EC2でWEBアプリケーションなんかを運用していて発生するログを取得したいが、AutoScalingなどで運用しているとログが消えてしまうことがあると思います。
そういう場合はCloudWatch Logsを使いますう。すると随時ログをAWSにエクスポートするような形でAWSコンソールからほぼリアルタイムでログを確認できます。

# CloudWatch Logs エージェントではない
過去にCloudWatch Logsを利用した際はCloudWatch Logs エージェントを利用していたのですが、2022年現在ではCloudWatch Logs エージェントは非推奨となっています。文字表記が似ていて勘違いしやすいのですが、現在はCloudWatch エージェントを利用することが推奨されています。

非推奨

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/AgentReference.html

推奨

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html

# CloudWatch エージェントのインストール

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-EC2-Instance.html

リンクにあるとおりだが

```sh
sudo yum install amazon-cloudwatch-agent
```

で簡単にインストール可能です

# ログ取得の設定

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html

```sh
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
```

こちらのコマンドで設定ウィザードを開始できます。

>エージェントを Amazon EC2 インスタンスとオンプレミスサーバーのどちらにインストールするか。
>- サーバーで Linux と Windows Server のどちらが実行されているか。
>- エージェントがログファイルを CloudWatch Logs に送信するようにするか。持っている場合は､既存の CloudWatch Logs エージェント設定ファイルを持っているか。持っている場合､CloudWatch エージェントは､このファイルを使用してサーバーから収集するログを判別できます。
>- エージェントがログファイルを CloudWatch Logs に送信する場合、それらのログファイルを保持する必要がある期間。デフォルト値の -1 にすると、ログアイテムは無期限に保持されるように設定されます。
>- サーバーからメトリクスを収集する場合は、デフォルトのメトリクスセットの 1 つを監視するか、収集するメトリクスのリストをカスタマイズしますか。
>- StatsD または collectd プロトコルを使用して、アプリケーションまたはサービスからカスタムメトリクスを取得しますか。
>- 既存の SSM Agent から移行しますか?

聞かれるのは上記項目です。
設定しなければ行けないのはログを取得するを選択して、ファイルを指定、ロググループ名（わかりやすい任意な名前でOK）を設定します。
他のメトリクス等はわからなければ設定なしでOKです。

# エージェントの実行

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html#start-CloudWatch-Agent-EC2-commands-fleet

```
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:configuration-file-path
```

configuration_file_pathnameには設定ファイルのpathを入れます。設定ウィザードから実行したのであれば`/opt/aws/amazon-cloudwatch-agent/bin/config.json`というファイルが出来上がっているはずです。

実行後は
IAMロールなどの権限が問題なければCloudWatch Logsでログが確認できるようになります。
Openpyxlの基本操作（シート、セル、スタイル、背景色、書式付きフォーマット）及び性能について

# 経緯
Excelあまり好きじゃないですが、現場で色んなExcelの成果物がほしいなので、できるだけ自動化するために、Openpyxlを学習。
以下のソースの一部はソースからコピーしたので、クラス内部の部分もあって、selfなどがそのまま残っていますが、読み替えてください。

# workbook, worksheet, cellに関する基本操作
```python
import openpyxl
...
        # 新規Excelを作成して保存
        wb=openpyxl.Workbook()
        wb.save(self.fileName)
...
        # Excelを開いて新規シートを作成
        wb=openpyxl.load_workbook(self.fileName)
        wb.create_sheet(self.currentSheetName)
        wb.save(self.fileName)
...
        # Excelを開いて特定のシートを指定
        wb=openpyxl.load_workbook(self.fileName)
        ws=wb[self.currentSheetName]
...
        # 特定セルの中身と枠（後で説明）のスタイルを指定
        ws.cell(row=1, column=1).value='hello'
        ws.cell(row=1, column=1).border=self.border
...
        # Excelを開いて特定シートの最大行数を取得
        wb=openpyxl.load_workbook(self.fileName)
        ws=wb[self.currentSheetName]
        lastRowIndex=ws.max_row
...
        # 列の番号から列のアルファベットを取得（例：1からAを取得）、列のサイズを自動に変更
        colName=openpyxl.utils.cell.get_column_letter(idx)
        ws.column_dimensions[colName].auto_size = True
...
        # 特定のシートが存在すれば、削除
        if 'Sheet' in wb.sheetnames:
            wb.remove(wb['Sheet'])
            wb.save(self.fileName)
...
```


# border設定例
```python
from openpyxl.styles.borders import Border, Side
...
        # 黒の細目の実線
        self.border=Border(top=Side(style='thin', color='000000'),
        bottom=Side(style='thin', color='000000'),
        left=Side(style='thin', color='000000'),
        right=Side(style='thin', color='000000'))
...
        # 特定セルのborderを設定
        ws.cell(row=excelCurrentRowNum, column=colIdx+1).border=self.border
```

# fill（背景色）設定例
```python
from openpyxl.styles import PatternFill
...
        # 単色で黄色
        self.fill=PatternFill(fill_type='solid', bgColor='00FFFF00')
...
        # 書式付きフォーマットで式を指定して色を適用（例、A7とA4が一致しないと黄色に変更）
        rule=FormulaRule(formula=['A7<>A4'], fill=self.fill)
```

# fomular rule（書式付きフォーマット）設定例
```python
from openpyxl.formatting.rule import FormulaRule
...
        # 式と色を指定してルールを作成して、セルの適用範囲を指定
        rule=FormulaRule(formula=['A7<>A4'], fill=self.fill)
        ws.conditional_formatting.add('A7:Z10', rule)
...
```

# 性能について
①セルを1個１個で書き込みをするよりは、ws.append(data)のほうが速い。
　※dataは['1', '2', '3', '4']のようなリストであれば自動的に複数のセルに書き込み。

②wb.save(filename)はできるだけ避けること。
　※保存操作は１回だけでも数秒ぐらいかかる。
GitHubのIssueにFigmaデータを表示する拡張機能

## この記事の概要

GitHubのIssueでFigmaファイルを共有するとき、URLだけ貼っても中身が分からなくて少し見づらいですよね？
親切心からスクリーンショットを撮って添付するデザイナーも多いと聞きます。

しかし、スクリーンショットではある特定の時点でのスナップショットとなってしまい、Figmaの良さが半減してしまいます。[^1]

[^1]: スナップショットが相応しい場面もあると思いますが、一般論としての話です。

というわけでURLを貼るだけでライブプレビューを展開してくれる拡張機能を紹介します。

## 拡張機能

こちらの拡張機能です。

https://chrome.google.com/webstore/detail/figma-github/bieeiojdjdkkacfckmaamnbinloppgjf

インストールするだけで使えるようになるので、設定は不要です。
これにより、以下のように見た目が変わります。

| 通常時 | 拡張機能有効時 |
| --- | --- |
| ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/21a2c612-d322-fab3-c4a2-bc5c68ff9424.png) | ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/f2656d72-dc8e-82d2-d3da-11bce81fed3e.png) |

できることは以下です。

- ドラッグによる画面移動
- 拡大・縮小
- 全画面表示

ただし、複数Pageがある場合Page移動はできません。
1番上にあるPageが表示されるのみです。

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox
statsmodelsのadd_constantで切片項が付かない！？？

# 切片項が付かない

　そうです。切片項が付かないんです。何度コードを回してもエラーもないし、切片項もないんです。

# 背景

　kaggleのコンペのために回帰分析で予測モデルを作っていたところ、statsmodels.OLS(train_y, train_X).fit()のところで、よくエラーが生じていました。
　適用するデータには欠損値がないし、ダミー化もしている。処理も間違っていなさそうなのに、なんでじゃい！！とずっと困惑しておりました。

　そこで、あることに気づいたのです。そうです。直前のtrain_X = statsmodels.add_constant(train_x)のところでtrain_Xに切片項'const'が加えられていないのです。

　何回回しても付かない。なのにモデル作成時の方には'const'が付いている。モデル作成時と処理はほとんど変わらない。でもモデル当てはめ時のデータには'const'が付かない...。

　ネットという大海を浮遊、もしくは森林をさまよっていた際に、とあるオアシス(記事)にたどり着きました。

　そうです、「公式ドキュメント」です。

https://www.statsmodels.org/stable/generated/statsmodels.tools.tools.add_constant.html

# 解説

　まず、重回帰分析について簡単に御説明します。回帰分析とは、とあるデータの特徴について、そのばらつきから傾向を調べるために作られた手法です。要するに、バラバラになっている各データの全体像を説明できるような直線を探すのです。

![44733746bcbfcf9a35aaefc87a08cd4c.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475646/4785a339-1663-59e1-18b8-c9034aee1de1.jpeg)

　この全体の傾向を表す直線の、y切片にあたる部分が「切片項」です。この直線は
```math
y = α_1x_1 + α_2x_2 + ... + β 
```
　などと表されます。このβの部分が切片項です。

　で、なぜこの切片項が付かないかというと、付かないんじゃなくてもともと付いていたんです。

　は？と思われるかもしれませんが、とにかく、このstatsmodelsのadd_constant関数には、元々データに切片項が含まれていた場合どうするか、というところまで設定されていたのです。要するに、データのバラツキが原点から広がっていそうか(切片項が「0」)、すこし上の方の点から始まっているか(切片項が「存在する」)、みたいなことまで気にしていた、ということですかね。

　has_constantという引数のデフォルトが'skip'になっていて、元々切片項を含むデータの場合は切片項'const'を加えない、という設定になっていたようです。それで、データによっては、モデル作成時には切片項が加えられて、予測したいデータを当てはめる際には加えられなくて、'const'の有無による列数の不一致でエラー、みたいなことになっていたようでした。

　では、どうすればよいかというと、has_constant='add'とすればよいのです。これで、元々切片項を含むデータにもさらなる切片項'const'を加えるようになりました。また、元々切片項を含むかどうかを調べたい場合は、has_constant='raise'とすることで、切片項を含んでいる場合はエラーにより教えてくれるようになります。

```Python
import statsmodels.api as sm

# x = sm.add_constant(df, has_constant='raise') 既に切片項を持っている場合は、エラーを出す
x = sm.add_constant(df, has_constant='add') # 既に切片項を持っていても、さらに切片項を加える
```

# まとめ

　というわけで、statsmodelsの設定をデフォルトから変更すればよい、というだけの話でした。そもそも、元々切片項があるものにさらに切片項を加えてよいのか、元々切片項がないものとあるものに対して同じモデルを適用してよいのか、という疑問が残りますが、調べる限りでは、決定係数の性質に違いをもたらすわけではなく、複数モデルの比較時やモデルの当てはめ方を見る際に注意した方が良い、という程度でした。定数項自体は、除かないほうが良い、という研究論文もありました。

https://oshiete.goo.ne.jp/qa/6600527.html

https://senshu-u.repo.nii.ac.jp/index.php?active_action=repository_view_main_item_detail&page_id=13&block_id=21&item_id=1923&item_no=1

　現時点では、どちらの場合も切片項を加える設定にすることが最善の対処法と考えていますが、もしこの辺りの事情にお詳しい方がいらっしゃいましたら、御教示いただけると幸いです。それではまたごきげんよう～。
Kaggleで勝つデータ分析技術_3章の欠損値についてまとめてみた

[Kaggleで勝つデータ分析技術](https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94/dp/4297108437)の第3章 『特徴量の作成』の欠損値についてまとめてみました。

分析コンペでモデルの精度を上げるためにも、特徴量の作成は最も重要な要素の一つで、その中でも欠損値の取り扱いは大切です。
ここでは、Kaggleで勝つデータ分析技術の欠損値の言及がされているところをまとめてみました。




## そもそも欠損値とは
欠損値とは、値が入力されていない空の値のことを示します。
下記のテーブルの中で、名前が入力されていない行があります。
この入力されていない値が欠損値になります。

| 名前 | 年齢 |
|:-:|:-:|
|  安井 | 28  |
|   | 25  |
|  石崎 | 21  |


では、なぜ欠損が発生しているのでしょうか？
理由を一度、考えてみてください。
　
　
　
　
　
　
　

欠損が発生している理由には下記の分類で分けられます。
* 値が存在しない場合
    * 年齢が100歳を超えているが、100歳以上を選択ができない場合
* 何らかの意図があるケース
    * 痩せ過ぎているのを伝えたくないために、体重を記載しない
* 値を取得するのに失敗しているケース
    * 人為的ミスや観測機器のエラーなど


これらの欠損値の扱い方には様々な方法があります。
ここでは、下記の例をそれぞれ紹介します。

* 欠損値のまま取り扱う
* 欠損値を代表値で埋める
* 欠損値を他の変数から予測する
* 欠損値から新たな特徴量を作成する
* データ上の欠損の認識

## 欠損値のまま取り扱う
GBDTライブラリなどは、欠損値を埋めずにそのまま取り扱うことができます。
欠損値はその値がなんらかの理由で欠損しているという情報を持っていると考えると、その情報を捨ててしまうのはもったいないです。
なので、欠損値をそのまま取り扱い、モデルを作成することは自然な方法になります。

## 欠損値を代表値で埋める
欠損値を埋める最もシンプルな方法は、その変数の代表値で埋めることです。
代表値とは、平均や中央値、最頻値などが挙げられます。
たとえば、年齢が欠損していたら、年齢の平均で埋めるなどです。

| 名前 | 年齢 |
|:-:|:-:|
|  安井 | 28  |
|  上林| 30  |
|  石崎 |   |

上記の場合、石崎さんの年齢が欠損しているので、年齢の平均値 29歳で埋めるようにします。

| 名前 | 年齢 |
|:-:|:-:|
|  安井 | 28  |
|  上林| 30  |
|  石崎 | 29  |

実際は石崎さんは21歳なので、実のデータからかなりはずれてしまいました。
このように何も考えずに平均で穴埋めすると、実際のデータから大きくずれてしまうという懸念もあります。
なので、どのような代表値で穴埋めをするかをよく検討した上で、穴埋めをする必要があります。
ただ欠損があるとモデルが作成できない機械学習モデルは多いので、代表値で穴埋めを行うことはよくkaggleで行われています。


## 欠損値を他の変数から予測する
欠損している変数が他の変数と関連している場合には、それらの変数から本来の値を予測することができます。
例えば、下記の例です。

| 年齢 | 職業 | 
|:-:|:-:|
| 28  | 社会人  |
|  21 |   |
|  22 |  大学生 |
| 24  | 社会人  |
・・・・| ・・・・

上記の場合、年齢から職業を大学生と予測できるかもしれないです。

実際の予測による補完は以下のような流れになります。

1. 欠損を補完したい変数を目的変数とみなし(上の例だと、職業)、その他の変数を特徴量とした補完のためのモデルを作成します。(上の例であれば、年齢がその他の変数)
1. 補完のためのモデルで予測を行った欠損値で埋める


上記で作ったモデルに、21歳というデータを渡したときに、大学生という結果が返ってきたら、その返ってきた値 大学生で欠損値を埋めるという流れになります。


## 欠損値から新たな特徴量の作成
欠損の発生が完全にランダムに起こることはあまりなく、何らかの理由がある場合が多いです。
その場合、欠損している事自体に情報があるため、欠損かどうかが表す特徴量を作成することが有効になります。
シンプルな方法としては、欠損かどうかを表す二値変数を作成する方法です。
欠損値を埋めたとしても、この二値変数を別に作ることで情報を減らさないことができます。

例
| 年齢 | 年齢が欠損している | 
|:-:|:-:|
| 28  | False  |
|   |  True |
|  22 |  False |
| 24  | False  |
・・・・| ・・・・

## データ上の欠損の認識
欠損は基本的には、空白やNAと表現されます。
しかし、データによって数値データの欠損が-1や99999などの値で入力されていることがあります。
そのままの数値として扱うと、本来欠損値として扱うべき値を通常の数値として解釈するため、モデルの精度が上がらないなどの問題が発生したりします。
このような可能性を考慮して、最初の段階で変数の分布をヒストグラムで見て、欠損として認識すべき値がないかどうかを確認しておくことが望ましいです。


## まとめ
いかがだったでしょうか。
今回の記事はKaggleで勝つデータ分析技術での欠損値の取り扱いについてまとめてみました。
今年中に自分はKaggle Exeprtになることを目指して、頑張っていますので
もし誤りなどあればご指摘いただけると助かります。
お読みいただいてありがとうございました。
コードレビュー依頼された時に心がけていること

# まとめ

:::note info
コードレビューが早ければ早いほどチームのスループットは最大化する :rocket: 
:::

# コードレビュー依頼されたときのフローチャート

現時点の私のマインドです。※今後、みなさんのフィードバックを得て更新することもあります。

```mermaid
flowchart TD
A[レビュー依頼される] --> B[A.リアクションする]
B --> C{このコードレビューより<br>緊急度の高いタスクがある?}
C -->|Yes| D[他のレビュワーに<br>依頼する]
C -->|No| E[B.レビューの<br>難易度を<br>判断する]
E --> F{5分以内に<br>レビューが<br>終わる?}
F -->|Yes| G[すぐ見る]
G --> e[End]
D --> e
F -->|No| H{自分で<br>レビューできる<br>レベルか?}
H -->|Yes| I[自分のスケジュールに<br>レビュー時間を<br>組み込む]
I --> e
H -->|No| J[C.分からないことを<br>宣言する]
J --> K[教えてもらう]
K --> e
```

# 心がけているいること

## A. リアクションする

レビュー依頼されたらすぐにリアクションをします。
これは依頼者に「あ、レビュー依頼伝わってる」と安心してもらうためです。
これがないと、「気づいてるかな？」とモヤモヤさせてしまい、依頼者が集中できる環境を作ることができません。

また、複数人のレビュワーがいた場合、自分が見ることを分かるようにする意図もあります。
これをすることで、他のレビュワーが忙しいときは「あ、◯◯さんが見てくれてるから滞ってない」と安心してもらえます。

## B. レビューの難易度を判断する

私がレビューを受け取ってからすぐにするのは下記の2点です。

- issueの内容と振られているweightを確認する
- diffのファイル数を確認する
  - diffが多くてもcommitが綺麗に分割されてるか確認する（diff多くてcommit分割されてなかったら難易度高め）

## C. 分からないことを宣言する

正直、自分が分からないレビューを依頼されることもあります。
そのとき **「レビュワーは自分。自分がボールを持っている」というマインドは大事です。** 
そのままレビューを放置すると、それだけユーザーに価値を届ける時間が長くなるだけです。

いっそのこと、これを学習の機会だー！と割り切ってしまいます。
例えば

- コメントに「これ、分からないので教えてください」と書く
- 時間あったら説明してもらう（そのとき、他にも分からない人を誘えば属人化の解消にもなる！ラッキー）

とか。楽観的にいきましょう！！　:relaxed: 


# コードレビューを放置したとき、レビュイーに与える影響は良くない

- レビュイーはコードを書いた後、時間がたつほど記憶が薄れてしまいます。そのため、指摘された内容の修正に時間がかかりやすくなります（スイッチングコスト高い）
  - 仕掛り1個、レビュー中 10個 とか地獄じゃない？（ 9個ならいいって？そんなバカな）
- コンフリクトの確率が高まる
  - merge/rebaseなどできればしたくない
  - ｳｷﾞｬｰってなることありますよね？それを自分が招きたくないなぁ

# おまけ

**レビュー早いとチームの雰囲気が良くなります**
帰る時に「今日もいい仕事した〜！おわったぁ〜！」という気持ちが高まるからかな？
[Power Automate] Teams "チャットの作成" アクティビティがエラーになる

# 起きたこと

> Error: Exception has been thrown by the target of an invocation., Exception has been thrown by the target of an invocation.

Power Automate の Teams "チャットの作成" アクティビティで複数メンバーのチャットを作成するとエラーが発生しました。

> [チャットの作成 \| Power Automate Docs](https://docs.microsoft.com/ja-jp/connectors/teams/#%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022607/4a704fc1-47c9-1910-f5f5-3b22f5d3f9d4.png)

# 解決法

`追加するメンバー` パラメータの指定に誤りがありました。
複数メンバーを指定するときは、 セミコロン（ `;` ）で区切った文字列と書いてありますが、文字列末尾にセミコロンが来てはダメなようでした。

`taro@example.com;jiro@example.com` のような文字列にしてあげることでチャットグループを作れました。
【Ruby】0埋めに失敗するケースについて

# はじめに
Rubyの0埋め処理においてエラーが発生したので、原因と対応策を備忘として残しておきます。

# エラーになる場合がある0埋め処理
```
# 月を0埋めして2桁にしようとした
# monthには「09」と言う文字列が設定されていた
val = sprintf('%d/%02d/01', year, month)
```
# 結果
```
invalid value for Integer(): "09" (ArgumentError)
```
【原因】
Rubyに限ったことではないが、整数リテラルの前に0があると8進数と認識されることがある。
（「されることがある」としているのは使用する関数や前後の処理で変わってくるため。）
今回の場合、「09」を8進数と認識され、8進数で9は存在しないよ！といった感じでエラーになった。

【対応策】
"%02d"の部分に文字列を渡さず、整数化してから渡す。
```
val = sprintf('%d/%02d/01', year, month.to_i)
```

# おわりに
8進数では8も使用できない。
扱える数値は各々調べてみて下さい。
[GrowiWiki]サーバーのリストア（復元について）

お品書き
---

1. 復元をしてみよう



初めに
---
前回、バックアップをしてアーカイブファイルを作成しました。<br>
では、次は、実際に壊れてしまって復旧する方法をまとめます。

事前知識
---
 ### リストア
バックアップしたデータをパソコンに戻し、復元をすること<br>
詳しくは、下記URLまで。

[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
](https://wa3.i-3-i.info/word17817.html)





実際に復元してみよう
---
<span style="color: red; ">注意：これを実行するときは、緊急時もしくは、自身のパソコンで実際に立ててみておこなってください</span>
### 復元する
復元したいアーカイブファイルがあるディレクトリーで実行する。
Growiは実行した状態で行いましょう

```
＄　docker cp {復元したいアーカイブファイル}{MongoDB のコンテナ名}:/
＄　docker exec -d {MongoDB のコンテナ名}　mongorestore --drop --archive={復元したいアーカイブファイル}
```

これで無事に復元されました。

GrowiWikiシリーズ
---
https://qiita.com/harutiro/items/7393a7784c24d10522ac

https://qiita.com/harutiro/items/68a11b01b05727735fee

https://qiita.com/harutiro/items/422731b554401d45e99d

参考文献
---
参考にした記事を貼っていこう

##### 主なURLリンク
[dockerで動いているgrowiのmongodbをバックアップ・リストアする
](https://nomusicnolife.hatenablog.com/entry/docker-growi-backup)
[GrowiWiki]サーバーのバックアップについて

お品書き
---

1. MongoDBについて
2. 実際のコマンドについて
3. 定期実行について



初めに
---
今運用しているやり方ではいざ消えてしまったら、泣いてしまうので、バックアップをとって安心しよう！

事前知識
---
 ### MongoDB
MongoDBとはDBのひとつで、MySQLに似たものです。


>MongoDB（モンゴDB）は、Server Side Public License（英語版） (SSPL) で提供されるドキュメント指向データベースである。開発とサポートはMongoDB Inc.が行なっている
###### 引用: [wiki MongoDB](https://ja.wikipedia.org/wiki/MongoDB)

今回はMongoDBについて特に理解する必要はないため名前を知っておく程度で留めておく。


 ### リストア
バックアップしたデータを復元することです




コマンドについて
---

### Dockerのコンテナ名を検索しよう

コマンドプロンプトで自動で実行するために、このコードを書こう！！


 まずMongoDBのコンテナ名を確認しましょう！！
```
$ 　sudo　docker ps -a
```
↓出力結果↓
```
CONTAINER ID   IMAGE                 COMMAND                  CREATED        STATUS        PORTS                                       NAMES
c2f4ba897e40   growi_app             "dockerize -wait tcp…"   41 hours ago   Up 24 hours   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   growi_app_1
bdf7248b2f4d   mongo:4.4             "docker-entrypoint.s…"   41 hours ago   Up 24 hours   27017/tcp                                   growi_mongo_1
9efaf2af9286   growi_elasticsearch   "/bin/tini -- /usr/l…"   41 hours ago   Up 24 hours   9200/tcp, 9300/tcp                          growi_elasticsearch_1
```

この中のNAMESのところがコンテナ名ですので、今回は{growi_mongo_1}となります。


### シェルファイルを作って一発でバックアップをとってみる
好きな場所で以下のコマンドを実行してみましょう。
```
$ nano growi_backup.sh
```
エディタ画面が表示されるので、以下の文章をコピペしましょう！！

<span style="color: red; ">{MongoDBのコンテナ名}と{保存したい場所のパス}を変更しましょう</span>

```
#!/bin/sh

BKDIR={保存したい場所のパス}

# Creating backup archive
sudo docker exec -d {MongoDB の　コンテナ名} mongodump --archive=mongodb.archive
sudo docker cp {MongoDB のコンテナ名}:mongodb.archive $BKDIR/$(date --date '1 day ago' "+%s_%Y_%m_%d_3.7.1_mongodb.archive")

# Create config backup archive

# Delete old backups
find $BKDIR -mtime +6 | xargs rm -rf
```
終わるときは、<span style="color: blue; ">Ctrl＋ｘ → ｙ　→ enter</span>で編集を終わりましょう

自動実行について
---

crontabにバックアップを取りたい時刻を設定し、スクリプトを実行しましょう


おそらく、このタイミングで、エディターの選択画面が出てくる時もありますので、適宜選択してください。
```
$ sudo crontab -e
```
下記を最後の行に追加して、保存をしましょう。
```
0 2 * * * 　{ｓｈファイルがある絶対パス} CRON=1
```

これでアーカイブファイルが保存されました。

次回、リストア（復元編）でお会いしましょう。

GrowiWikiシリーズ
---
https://qiita.com/harutiro/items/7393a7784c24d10522ac

https://qiita.com/harutiro/items/68a11b01b05727735fee

https://qiita.com/harutiro/items/422731b554401d45e99d



参考文献
---
参考にした記事を貼っていこう

##### 主なURLリンク
[Growiの定期バックアップ - AWSを利用しない場合](https://qiita.com/TomoyukiSugiyama/items/937b396f314781601685#cherry_blossom%E3%81%94%E5%8F%82%E8%80%83)

[dockerで動いているgrowiのmongodbをバックアップ・リストアする](https://nomusicnolife.hatenablog.com/entry/docker-growi-backup)


##### Crone
[Ubuntu で crontab から root 権限でコマンドを実行したい](https://ja.stackoverflow.com/questions/62135/ubuntu-%E3%81%A7-crontab-%E3%81%8B%E3%82%89-root-%E6%A8%A9%E9%99%90%E3%81%A7%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%84)

[crontabの書き方](https://www.server-memo.net/tips/crontab.html)
[GrowiWiki]Dockerを用いたGrowiの建て方について

お品書き
---

1. Dockerのインストール
2. Growiのインストール
3. 起動させてみよう



初めに
---
企業内WIKIというのが世の中にはあるらしいですね、実際に自分たちで立ててみて、その仕組みを理解してみようと思います。
Dockerを用いて開発をおこなうと素早い構築ができてとても便利です。

事前知識
---
 ### Docker
仮装的なパソコンを、パソコンの中で起動して、パソコンによって起きる開発環境の相違を解消してくれる、便利なアプリです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1209385/a34d7c68-71cc-eb60-4cef-71b3837679ab.png)



詳しくは、Wikiや他のブログを見てみてください。


>Dockerはコンテナ仮想化を用いたOSレベルの仮想化（英語版）によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする。かつその環境自体をアプリケーションと同じようにコード（イメージ）として管理可能にする[5]。Dockerを開発・テスト・デプロイに用いることで「コードを書く」と「コードが製品として実行される」間の時間的ギャップを大きく短縮できる
###### 引用: [wiki Docker](https://ja.wikipedia.org/wiki/Docker)


 ### Growi
Wikiエンジンのひとつです。
今回は、手軽に、なおかつ今時のUIなものを探したかったため、Growiを用いた。

PukiWikiはださいから嫌だ<br>
OutLineは構築が難しかったです。

[【2022年版】オープンソースの社内情報共有ソフト・ツール おすすめ9選（無料でwiki構築）](https://notepm.jp/blog/6574)




実際に立ててみよう
---
MacとUbuntuなどでDockerのダウンロードの仕方が変わります、OSを確認してダウンロードの方をよろしくお願いします。

### DockerDesktopをインストールする（Mac）
下記URLより、dmpファイルをダウンロードして、アプリケーションフォルダーに入れてください。
https://www.docker.com/products/docker-desktop/
### Dockerをインストールする (Ubuntu)


```
$ sudo apt install docker
$ sudo apt install docker-compose
```

### Growiをインストールする
https://github.com/weseek/growi-docker-compose (opens new window)の「Clone or download」ボタンから、ソースコードをダウンロードもしくは git コマンドにより clone します。
```
$ git clone https://github.com/weseek/growi-docker-compose.git growi
```

### GROWI の起動確認
ダウンロードしたフォルダ内にて以下のコマンドを実行します。
```
$ cd growi
$ sudo docker-compose up
```
http://localhost:3000/ にアクセスし、初回セットアップ画面(/installer)の表示が確認できれば GROWI 起動完了です

### localhost 以外からのアクセス
docker-compose.yml ファイル内の ports を変更することで localhost 以外からのアクセスを許可できます。

- 変更前
```
services:
  app:
    ports:
      - 127.0.0.1:3000:3000
```

- 変更後
```
services:
  app:
    ports:
      - 3000:3000
```

### Growiを止める

```
$ sudo docker-compose stop
```

GrowiWikiシリーズ
---
https://qiita.com/harutiro/items/7393a7784c24d10522ac

https://qiita.com/harutiro/items/68a11b01b05727735fee

https://qiita.com/harutiro/items/422731b554401d45e99d

参考文献
---
参考にした記事を貼っていこう

##### 主なURLリンク
[docker-compose
](https://docs.growi.org/ja/admin-guide/getting-started/docker-compose.html#growi-%E3%81%AE%E3%82%A2%E3%83%83%E3%83%95%E3%82%9A%E3%82%AF%E3%82%99%E3%83%AC%E3%83%BC%E3%83%88%E3%82%99)

[Docker + Growiでイントラ向けWikiを立ち上げる](https://corgi-lab.com/linux/docker-growi-wiki/)


##### Docker
[Ubuntu20.04へのDockerのインストールダウンロード使用方法](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-ja)

###### DockerError関係

[docker-compose エラー - Couldn't connect to Docker daemon](https://qiita.com/matsuo7005/items/acad88643e4148ab77a8)

[DockerでCouldn't connect to Docker daemonが出る場合の原因と解決方法](https://virment.com/how-to-fix-couldnt-connect-to-docker-daemon/)
PowerAutomateでSPOのページライブラリ配下の一覧の取得

# 概要
PowerAutomateでSharePointOnlineのページライブラリ配下の一覧を取得したい。

ただし、SharePointOnlineのサーバに入ることはできない。

PnP.Powershellも使えない。

# SharePointListNameの取得
ページライブラリのトップへ行き、「エクスポート」→「Excelにエクスポート」を実行。

ダウンロードされたquery.iqyをテキストエディタで開きます。

SharePointListNameのところにあるものです。
![ページライブラリ1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482068/519f05a5-dec3-7257-3d64-6cf7548b78aa.jpeg)

# PowerAutomateのファイルの取得（プロパティのみ）にて
取得したSharePointListNameを「ライブラリ名」のところに設定。

これでページライブラリの一覧が取れるようになると思います。

 ![ページライブラリ2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482068/551b6f41-0bc1-227d-92bb-ee69ad227518.jpeg)


# 参考
- [PowerAutomate: Get SitePages](https://www.youtube.com/watch?v=379lE3opmgs)
- [Power AutomateでSharePointリストをCSV出力する方法](https://tech-blog.cloud-config.jp/2021-10-04-power-automate-sharepoint-csv/)
- [SharePointで使えるアクション〜ファイル・フォルダ関連〜](https://techuplife.tech/powerautomate-spoaction1/)
- [Power Automate の「JSON の解析」でよくあるエラーを回避する](https://idea.tostring.jp/?p=6412)
MoveIt実装調査

moveit::planning_interface::MoveGroupInterface Class Reference
http://docs.ros.org/en/melodic/api/moveit_ros_planning_interface/html/classmoveit_1_1planning__interface_1_1MoveGroupInterface.html
```cpp
#include <moveit/planning_interface/move_group_interface.h>

class moveit::planning_interface::MoveGroupInterface

moveit::core::MoveItErrorCode moveit::planning_interface::MoveGroupInterface::move()
{
  return impl_->move(true);
}

class moveit::planning_interface::MoveGroupInterface::MoveGroupInterfaceImpl

moveit::core::MoveItErrorCode move(bool wait)
{
略
  move_action_client_->sendGoal(goal);
  if (!wait)
  {
    return moveit::core::MoveItErrorCode::SUCCESS;
  }
  if (!move_action_client_->waitForResult())
  {
    ROS_INFO_STREAM_NAMED("move_group_interface", "MoveGroup action returned early");
  }
  if (move_action_client_->getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
  {
    return move_action_client_->getResult()->error_code;
  }
  else
  {
    ROS_INFO_STREAM_NAMED("move_group_interface", move_action_client_->getState().toString()
                                                      << ": " << move_action_client_->getState().getText());
    return move_action_client_->getResult()->error_code;
  }
}

namespace moveit
{
namespace planning_interface
{
class MoveGroupInterface
{
private:
  class MoveGroupInterfaceImpl;
  MoveGroupInterfaceImpl* impl_;
};
}  // namespace planning_interface
}  // namespace moveit
```
djangoで使うコマンド集（基礎編）

仮想環境作成

windows
virtualenv 仮想環境名
cd 仮想環境名
Scripts\activate.bat

Mac
mkdir 仮想環境名
cd 仮想環境名
python3 -m venv 仮想環境名
source 仮想環境名/bin/activate

インストール
pip install Django

プロジェクト作成
django-admin startproject プロジェクト名

簡易サーバー立ち上げ
python manage.py runserver
アクセス先
http://127.0.0.1:8000/

データベースモデル反映
python manage.py makemigrations

python manage.py migrate

管理ページ作成
python manage.py createsuperuser
アクセス先
http://127.0.0.1:8000/admin/
gitのデフォルトエディタを指定する


gitのデフォルトエディタは`nano`になっています。
revert等のコマンドを実行したとき、コメント編集のためにエディタが立ち上がりますが、その際に慌てふためかないために。


vimに慣れているなら以下のコマンド。
```
git config --global core.editor "vim"
```
否定論理積の計算の一例

例 ((X NAND Y) NAND X) NAND Y
- 出題(応用情報技術者試験ドットコム)
  - https://www.ap-siken.com/kakomon/20_haru/q5.html
- 前提
  - $X\cap Y \neq\phi$
- 否定論理積(NAND)
  - https://ja.wikipedia.org/wiki/%E5%90%A6%E5%AE%9A%E8%AB%96%E7%90%86%E7%A9%8D

|X  |Y  |X NAND Y |
|---|---|---|
|0  |0  |1  |
|0  |1  |1  |
|1  |0  |1  |
|1  |1  |0  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104697/1177fde8-6dcd-bbb8-3d88-3733b4385dac.png)
Flutterダイアログによる画像プレビューの実現

# 要件
画像をタップするだけで、画像プレビュー表示できます。 画像をピンチアウトで拡大、縮小することができます。 だた、画像の拡大、縮小はSimulatorやEmulatorでは試すことができず、実機のみの反映となります。

# 実装
考え方としてはdialogにInteractiveViewerウェジェットをラッパし、クローズアイコンを加えて、プレビューを閉じやすくする。

ソースコードはご参考まで
```dart
void showPreviewImage(
  BuildContext context, {
  required Uint8List image,
}) {
  showDialog(
    barrierDismissible: true,
    barrierLabel: '閉じる',
    context: context,
    builder: (context) {
      return Stack(
        alignment: Alignment.topCenter,
        children: [
          Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Expanded(
                child: InteractiveViewer(
                  minScale: 0.1,
                  maxScale: 5,
                  child: Image.memory(
                    image,
                  ),
                ),
              ),
            ],
          ),
          Row(
            children: [
              Material(
                color: Colors.transparent,
                child: IconButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                  icon: const Icon(
                    Icons.close,
                    size: 30,
                  ),
                ),
              ),
            ],
          ),
        ],
      );
    },
  );
}
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/cbefe293-a966-c9a7-d123-657fd97836b7.png"width=180><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/e107520b-5875-7564-e5cb-3d0ef3bcd731.png"width=180>


# ズーム
画像の拡大、縮小を実現するのはInteractiveViewerウェジェットです。minScaleとMaxScaleを定義してあげれば、拡大縮小の範囲制限できます。デフォルトは0.8倍~2.5倍です。
```
InteractiveViewer(
  minScale: 0.1,
  maxScale: 5,
  child: Image.memory(
    image,
  ),
),
```

# 参考
https://api.flutter.dev/flutter/widgets/InteractiveViewer-class.html
擬似要素で設置したSVGの色を変えたい

# はじめに
擬似要素（before,after）でSVG画像を設置したけどhoverで色も変えたい！
そんなときに使えるちょうどいいCSSがありましたのでご紹介します。

## とにかくすぐにコードを確認しながら試したい方はこちら
**Codepen**
https://codepen.io/takuma348/pen/vYRKZJm
![hover.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249131/dcdeda60-f2ea-202e-f93f-93db22362711.gif)

## 今回キーとなるCSSプロパティ
- background-color
- mask-image
- mask-size:

## コード

### HTML
```html
<div class="wrapper">
  <button class="button"></button>
</div>
```

### CSS(SCSS)
```scss
.wrapper {
  height: 100vh;
  width: 100%;

  display: flex;
  justify-content: center;
  align-items: center;
}

.button {
  background-color: #fff;
  border: 2px solid #000;
  border-radius: 50%;
  cursor: pointer;
  position: relative;
  transition: background-color 0.4s;

  height: 60px;
  width: 60px;

  &::before {
    display: block;
    content: "";
    background-color: #000;
    transition: background-color 0.4s;

    -webkit-mask-image: url('data:image/svg+xml;utf-8,<svg xmlns="http://www.w3.org/2000/svg" fill="%2332CD32" viewBox="0 0 16 16"><path d="M12.736 3.97a.733.733 0 0 1 1.047 0c.286.289.29.756.01 1.05L7.88 12.01a.733.733 0 0 1-1.065.02L3.217 8.384a.757.757 0 0 1 0-1.06.733.733 0 0 1 1.047 0l3.052 3.093 5.4-6.425a.247.247 0 0 1 .02-.022Z"/></svg>');
    -webkit-mask-size: contain;
    mask-image: url('data:image/svg+xml;utf-8,<svg xmlns="http://www.w3.org/2000/svg" fill="%2332CD32" viewBox="0 0 16 16"><path d="M12.736 3.97a.733.733 0 0 1 1.047 0c.286.289.29.756.01 1.05L7.88 12.01a.733.733 0 0 1-1.065.02L3.217 8.384a.757.757 0 0 1 0-1.06.733.733 0 0 1 1.047 0l3.052 3.093 5.4-6.425a.247.247 0 0 1 .02-.022Z"/></svg>');
    mask-size: contain;

    height: 35px;
    width: 35px;

    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
}

@media (hover: hover) and (pointer: fine) {
  .button:hover {
    background-color: #000;

    &::before {
      background-color: #fff;
    }
  }
}

```

スマホ対応もしたい方は```:active```や```ontouchstart=""```を使って応用してみてください。
最後まで読んでいただきありがとうございました！
raise_conflict_error　enumに定義できない命名について

## 経緯
`Ruby on Rails`でアプリ作成中にenumでこのような定義し、`rails c -s`で動作確認をしたところエラーが発生しました。
今回の記事ではこのエラー発生原因と解決方法までを残します。同じプログラミング初心者へのヒントになれば幸いです。
```rb:model
class Present < ApplicationRecord
  with_options presence: true do
    validates :present_name
    validates :present_score
    validates :present_review
  end
      
  enum present_score: {
        poor: 1,
        average: 2,
        good: 3,
        verygood: 4,
        excellent: 5
    }
end

```
```:ターミナル
~~~省略~~~~
`raise_conflict_error': You tried to define an enum named "present_score" on the model "Present", but this will generate a class method "average", which is already defined by Active Record. (ArgumentError)
```
## 分析
 - エラー文を翻訳してみる
__raise_conflict_error__
`Presentモデル`で`present_score`という名前の列挙型を定義しようとしたが,`ActiveRecord`によって既に定義されているクラスメソッド`average`が生成されます。 （ArgumentError）

## 分析結果
enumの定数名である`average`が、既に`ActiveRecord`によって既に定義されているクラスメソッド`average`をしようとしてしまうコンフリクトを起こしエラーとなっているようだ。
つまり`予約語`を定数名に定義したことがエラーの原因。

## 解決策
 - 命名規則に則った定数名に変更
```rb:model
class Present < ApplicationRecord
  with_options presence: true do
    validates :present_name
    validates :present_score
    validates :present_review
  end
      
  enum present_score: {
~~~~~~`下記修正`~~~~~~
        Very_Bad: 1,
        Bad: 2,
        Medium: 3,
        Good: 4,
        Very_Good: 5
~~~~~~`上記修正`~~~~~~
    }
end

```
`rails c -s`で動作確認し、無事にエラーなく動作できた。

## 以下参考資料

https://www.tom08.net/2016-11-09-141349/

https://techracho.bpsinc.jp/konaga/2020_10_23/99079
上位/下位1％を外れ値と定義して削除/抽出する(SPSS Modeler データ加工逆引き3-7)

# 上位/下位1％を外れ値と定義して削除/抽出（外れ値の処理）

![スクリーンショット 2022-07-10 10.39.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a4d4fd00-7c55-4b9d-8937-fd8653a31096.png)

## 1.想定される利用目的

・予測モデルの精度安定化のための前処理
・異常検知のためのデータ理解

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/outliers_pt.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-07-10 10.44.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/cc9ffab4-824c-d4a6-add4-2c49639d8a25.png)

a.入力するデータは以下の通りです。平均50、標準偏差10、サンプル数10,000レコードで正規分布するようにデータを発生させています。
![スクリーンショット 2022-07-10 11.03.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/81112aad-e4d9-f466-3605-18838c35f0b8.png)

シミュレーションノードを利用して正規分布を作成する方法は以下で解説しています。

https://qiita.com/416nishimaki/items/f627ed943e6457eb85d2

b.[データ分割]ノードを編集します。[データ分割手段]を[分位]にして[パーセンタイル]を指定します。
![スクリーンショット 2022-07-11 8.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/131090b7-92c1-2560-2493-ed4219914bfa.png)

[プレビュー]をします。[FIELD_TILE100]の[1]が最も値の小さい1％を[100]が最大の1%を示します。レコード数が10,000なので上位1％と下位1％にそれぞれ100レコードが該当します。
![スクリーンショット 2022-07-11 8.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ea11d078-9624-3963-682e-efef59fc0253.png)

c.[グラフボード]ノードを編集します。
![スクリーンショット 2022-07-11 9.04.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/49a7c661-ef56-008f-f127-c0e7a7c99910.png)

[グラフボード]ノードを実行します。100色の凡例がそれぞれのパーセンタイルを示します。
![スクリーンショット 2022-07-11 9.05.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6595f32f-6a40-abcb-baef-0ef66249b6cd.png)

d.[条件抽出]ノードを編集します。外れ値のパーセンタイルを1と100と確定して破棄しています。
![スクリーンショット 2022-07-11 9.09.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/761b0acc-fbe9-4cde-8ec8-b4b3594a8276.png)

[プレビュー]をします。[外れ値]を破棄した9,800レコードが抽出されました。
![スクリーンショット 2022-07-11 9.09.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1e046f02-d08d-f5dc-d49b-769d960f5338.png)

e.[条件抽出]ノードを編集します。外れ値のパーセンタイルを1と100と確定して抽出しています。
![スクリーンショット 2022-07-11 9.10.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e835fe47-0624-514f-b336-f2da2f0b5081.png)

[プレビュー]をします。[外れ値]の200レコードが抽出されました。
![スクリーンショット 2022-07-11 9.11.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/40b4b94a-8230-d9ad-1194-236e1ead05d7.png)

#### 注意点

値が同じレコードが多数存在すると分位グループが統合されるため、分位数が指定した数にならない場合があります。

## 4.参考情報

#### 正規分布やワイブル分布を生成する

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-20/

#### デシル分析（10分位）を解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-17/

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
Node-RED3.0の新機能

株式会社日立製作所 
サービスコンピューティング研究部
西山博泰

## はじめに

 [Node-RED](https://nodered.org/)はノードと呼ばれる機能ブロックを画面上でつなぎ合わせることでフローと呼ばれるプログラムを簡単に作成できるOSSのプログラミングツールです。Raspberry PiのOSに標準搭載されるなどIoT分野で幅広く活用されるとともに、Web APIの呼び出しやデータベースアクセス、データ処理を行うノード、ダッシュボードによるGUI作成機能などを備えており、幅広い分野で活用が進んでいます。部品として利用可能なノードもOSSとして多数[公開](https://flows.nodered.org/)(この記事の執筆時点で約3900ノード)されています。
![node-red-editor-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546217/aced197e-85d7-81f3-ad36-ae30bfbc7336.png)
 Node-REDプロジェクトでは毎年4月にメジャーバージョンをリリース、一年を通して3ヶ月毎にマイナーリリースを出す[リリースプラン](https://nodered.org/about/releases/)を想定しています。
 予定されていたスケジュールより少し遅れる形となりましたが、2022年7月にNode-REDの最新版であるバージョン3.0がリリースされました。Node-RED 3.0では、フローの編集機能などさまざまな新機能が実装されています。この記事でNode-RED 3.0の新機能を紹介します。

## ノード間ワイヤの合流点: ジャンクション

 ノード間の結線(ワイヤ)はノードの出力と入力を接続します。この経路はNode-REDエディタが自動的に描画するため、ノードの配置によっては線の繋がりが分かりにくくなることがありました。

 そこで、ジャンクション(Junction; 結節点)という要素をワイヤに導入し、複数のワイヤの合流点を一箇所でまとめる機能が追加されました。ジャンクションは小さな丸で表現されたワイヤの合流点で、マウスを上に置くと左右にワイヤ接続用のポートが表示されます。ワイヤ接続用のジャンクションを適宜挿入することにより、ノード間のワイヤの配置を細かく制御することができます。

 シフトキーとALTキー(Macの場合optionキー)を押しながら、ジャンクションで   纏めたいワイヤ上をマウス左クリックでドラッグすることで複数のワイヤをまとめたジャンクションを挿入することができます。
![Junction.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546217/24d37975-8c41-b4ad-c4bd-c9b12740d400.gif)
 これまで複数のノードの出力がノードの入力へ接続されている場合、その入力を別のノードにも送るように変更しようとすると、ワイヤの接続を何度もやり直す必要がありました。ジャンクションを用いることでノードの接続を容易化することができます。

 ジャンクションは内部的には入力メッセージをそのまま出力する1入力、1出力の特殊なノードとして実装されています。

## ノード間接続の分割容易化

 アプリケーションを構成するノードが多くなるとノード間の接続が複雑化します。このような場合、Linkノードを使うことでノード間のワイヤを明治的に表示することなくデータのやりとりを行うアプリケーションを構成できます。

 Node-RED 3.0では、ワイヤを選択してAltキーとlキーを押し、続いてlキーを単独で押すことでワイヤをLinkノードによる接続に変換できるようになりました。
![wire-to-link.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546217/ada42720-f45a-2dfb-b505-3042f60805ed.gif)

## 右クリックメニュー

 ワークスペース上のマウス右クリックで次のようなメニューが表示されるようになりました。よく利用する操作を簡単に呼び出すことが可能になります。
![right-click-menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546217/e719277a-74ac-1b34-0d25-50b2400cde7c.png)

## デフォルトエディタの変更

 厳密には新機能ではありませんが、FunctionノードのJavaScriptコードや、Templateノードのデータを編集するために利用するテキストエディタがACEからMonacoに変更されました。Monacoエディタは2.0から設定を変更することで利用可能でしたが、デフォルトで利用するエディタになりました。
![editors.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546217/0c6da5fd-9262-199e-6e25-f6e5c54b6afd.png)

## デフォルトノード名

 DebugノードやFunctionノードをワークスペースに配置した際、デフォルトで「debug 1」、「function 3」といった名前が自動的に設定されるようになりました。これにより、デバッグサイドバーの出力や検索の際にノードを識別することが容易になります。

## その他の主要新機能

- Linkノードをサブルーチンのように呼び出すLink Callノードの呼び出し先を入力メッセージ(`msg.target`)で指定できるようになりました。
  
- デバッグサイドバーの出力ログからデータを出力したノードを識別することが容易になりました。

## 注意点

 Node-RED 3.0ではサポートするNode.jsのバージョンが14以上となりました。推奨バージョンは16.Xです。

## おわりに

 この記事ではNode-RED 3.0で導入された新機能を紹介しました。Junctionによるフローの整理など便利な新機能が追加されていますので、ぜひ使ってみてください。

## 参考

*Node-RED: Node-REDは，OpenJS Foundationの米国およびその他の国における登録商標または商標である。*

*JavaScript: JavaScriptは、Oracleの米国およびその他の国における登録商標または商標である。*
100日後くらいに個人開発するぞ！day057


## 今日は継承を学んでみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/0d95f7fb-14cd-a3ab-8a5c-9c498f3157da.png)


## 今日の学び

### 継承
* 継承とはあるクラスを元にして新たなクラスをつくること
    * `class 新しいクラス名 < 元にするクラス名`で他のクラスを継承できる
    * 新しいクラスを「子クラス」、元にするクラスを「親クラス」と呼ぶ
* 継承すると親クラスのインスタンス変数やインスタンスメソッドを小クラスでも使える

### 子クラスにインスタンス変数を追加する
* `attr_accessor`を用いると子クラスにインスタンス変数を追加することができる
【C++】基礎を学ぶ⑱～コンストラクタ～

# コンストラクタ
**コンストラクタ**とは、クラスの**オブジェクト作成**において**初期化**を行うための特別な**関数**のこと
**初期値**を代入する役割を担う
**コンストラクタ**はクラス名と同じ名前にする

## コンストラクタの構文
```cpp
class クラス名 {
  public:
    型1 メンバ変数1
    型2 メンバ変数2
    ...
    // メンバ変数1を初期化するコンストラクタ
    クラス名(型a 引数a) {
      メンバ変数1 = 引数a
    }
    // 複数のメンバ変数を初期化するコンストラクタ
    クラス名(型a 引数a, 型b 引数b, ...) {
      メンバ変数1 = 引数a
      メンバ変数2 = 引数b
      ...
    }
}
```

## コンストラクタを用いたプログラム
```cpp
#include <iostream>
using namespace std;
 
class Student {
  public:
    string name;
    int score;

    Student(string str) {
      name = str;
    }
    Student(string str, int x) {
      name = str;
      score = x;
    }
};

int main() {
  Student Taro("Taro");
  cout << Taro.name << endl;
  Student Jiro("Jiro", 100);
  cout << Jiro.name << endl;
  cout << Jiro.score << endl;
}
```
```
Taro
Jiro
100
```

# デストラクタ
オブジェクトが**破棄**されるときに自動的に実行される**関数**
**デストラクタ**はチルダ記号を使って`~クラス名`と定義する

## デストラクタの用途
* 動的に確保したメモリの解放
* ファイルのクローズ処理

## デストラクタの構文

```cpp
~クラス名(){
  // デストラクタの処理
}
```

## デストラクタを用いたプログラム
```cpp
#include <iostream>
using namespace std;
 
class Student {
  public:
    Student(){
      cout << "コンストラクタの処理" << endl;
    }
    ~Student(){
      cout << "デストラクタの処理" << endl;
    }
};

int main() {
  Student student;
  return 0;
}
```
```
コンストラクタの処理
デストラクタの処理
```

# コピーコンストラクタ
オブジェクトを**コピー**したときに実行される関数

## コピーコンストラクタの構文
```cpp
クラス名(const クラス名 &引数) {
  // コピーコンストラクタの処理
}
```

## コピーコンストラクタを用いたプログラム
```cpp
#include <iostream>
using namespace std;
 
class Student {
  public:
    Student(){
      cout << "コンストラクタの処理" << endl;
    }
    Student(const Student &obj){
      cout << "コピーコンストラクタの処理" << endl;
    }
};

int main() {
  Student Taro;
  Student Jiro = Taro;
  return 0;
}
```
```
コンストラクタの処理
コピーコンストラクタの処理
```

## 次の記事
[【C++】基礎を学ぶ⑲～継承～](https://qiita.com/rapirapi/items/a53ab24c0c3964cb8328)
mysqldump コマンド & mysqlコマンドでデータベースをバックアップ・復元する ( そもそもmysqldumpとは？ )

# バックアップのコマンド例

例: 全てのデータベースをバックアップする場合

```
mysqldump -u root -p --all-databases > db.dump
```

mysqldumpコマンドは現在のデータベースの状態を、SQLコマンドとして標準出力する。
(SQLコマンドが出力されるところがツボだ！ バックアップ用の特殊形式のデータとかではないのだ)

## ファイルへの記録

上のコマンド例では、それをシェルのリダイレクト ( `>` ) で、ファイルとして記録してバックアップにしている。ファイル名やファイルの場所は何でも良い。

リダイレクト ( `>` ) をしないと、単に標準出力にSQLコマンドが吐き出されるので、見てみると良いだろう。

# 復元のコマンド例

```
mysql -u root -p < db.dump
```

これは先程のバックアップファイルをリダイレクト ( `<` ) で読んで、mysqlコマンドとして実行しているだけだ。

復元の場合はmysqldumpコマンドではないことに注意。
なぜならmysqldumpで作ったファイルは「SQLコマンドの羅列」なので、SQLコマンドを実行することが復元になるからだ。

## なぜデータベースが復元できるのか？

mysqldumpで出力されるSQLの例を見てみよう。

テーブルを削除してから、元のスキーマ通りに再度テーブル作成をするSQLコマンドが出力されているのが分かる。

さらにその後に、INSERTで元のデータを追加している行も分かるだろう。
こうやってSQLコマンドをうまく使って、データ復元ができるわけだ。(スマートな仕組み！)

```sql
...
DROP TABLE IF EXISTS `posts`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `posts` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `content` varchar(255) DEFAULT NULL,
  `avatar` varchar(255) DEFAULT NULL,
  `created_at` datetime(6) NOT NULL,
  `updated_at` datetime(6) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;


--
-- Dumping data for table `posts`
--

LOCK TABLES `posts` WRITE;
/*!40000 ALTER TABLE `posts` DISABLE KEYS */;
INSERT INTO `posts` VALUES (1,NULL,NULL,'2022-07-14 22:44:00.105766','2022-07-14 22:44:00.105766'),(2,NULL,NULL,'2022-07-14 22:44:01.466996','2022-07-14 22:44:01.466996'),(3,'AAA',NULL,'2022-07-14 22:44:07.754683','2022-07-14 22:44:07.754683'),(4,'AAA',NULL,'2022-07-14 22:44:08.422140','2022-07-14 22:44:08.422140'),(5,'AAA',NULL,'2022-07-14 22:44:08.854483','2022-07-14 22:44:08.854483');
/*!40000 ALTER TABLE `posts` ENABLE KEYS */;
UNLOCK TABLES;
...
```

上の例は一部だが、全文を見るとスキーマデータの復元も含めて色々やってくれているのが分かると思う。

ちなみにコメント行にはもちろん動作には影響がない。

# 参考

https://tex2e.github.io/blog/database/mysql-dump-restore


https://qiita.com/PlanetMeron/items/3a41e14607a65bc9b60c


<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Arduino UNOでI2C EEPROで遊ぶ2(連続読み)


目的
I2C EEPROMのテスト

秋月で買ったichgojam用のやつ


![o_con576.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2d7be999-d8e9-7fe5-b60f-d24d706864c5.jpeg)


![o_con577.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/11c77d73-8408-cf87-e580-ddfa65fd8b93.jpeg)



```c++



//SER_I2C_EEPROM_0_15_read2_UNO_1
//連続して読み込む

#include <Arduino.h>
#include <Wire.h>

//初期化処理
void setup() {

  //シリアルの初期化
  Serial.begin(9600);

  //I2Cの初期化
  Wire.begin();


  //読み込みアドレスの設定
  //ダミー書き込み
  Wire.beginTransmission(0x50);
  //アドレス
  Wire.write(0x00);     //H
  Wire.write(0x00);     //L
  //データ
  Wire.endTransmission();
  delay(1);


  //16バイト連続読み
  unsigned int ii=0;
  unsigned char s[32+1];
  Wire.requestFrom(0x50, 16);
  //データが続くだけ読む
  while(Wire.available())  {    // 要求より短いデータが来る可能性あり
    s[ii++] = (int)Wire.read(); // 1バイトを受信
  }//while


  //受信データの表示
  for (int jj = 0; jj < 16; jj++) {
    //データ
    Serial.println( (int)s[jj] );
  }//for

}//setup

//メインループ
void loop()
{
}//loop




```
Airflow資料抄訳(12)：ローカル・エグゼキューター（Local Executor）

恥ずかしながら最近になって知ったワークフローエンジン [Apache Airflow](https://airflow.apache.org/)。日本語の紹介記事もちらほら出てきていますが、[公式ドキュメント](https://airflow.apache.org/docs/)をちょっとずつ抄訳しながら読んでいこうと思います。
ら読んでいきます。

12回目の今回は[ローカル・エグゼキューター](https://airflow.apache.org/docs/apache-airflow/stable/executor/local.html)（Local Executor）。
バージョン2.3.3時点のものです。

---

# ローカル・エグゼキューター（Local Executor）

`LocalExecutor` はさまざまモードでプロセスを生成しタスクを実行するエグゼキューターです。

親クラスの`BaseExecutor`は生起するプロセスの数の上限を定めるパラメーター` parallelism `を受け取ることができます。このパラメーターに`0`が設定されている場合、`LocalExecutor`は無制限にプロセスを生起することができます。

次のストラテジーが利用可能です：

* **無制限の並列度** （`self.parallelism == 0`）：このストラテジーにおいては、エグゼキューターは` execute_async  `が呼び出される都度新たなプロセスを生起します。`LocalExecutor `に送信されたタスクはすべて専用のプロセスで実行されるということです。ひとたびタスクが実行され結果が` result_queue `に格納されると、プロセスは終了します。このアプローチにおいて` task_queue `は不要です。なぜならタスクには速やかに新しいプロセスがあてがわれるからです。このストラテジーにおいてプロセスはクラス`LocalWorker`を利用します。
* **制限された並列度** （`self.parallelism > 0`）：このストラテジーにおいては、プロセス数は`start`時点で指定された` self.parallelism `の値と等しくなります。タスクを受け取り、その処理をワーカー群に分配するために、` task_queue `を利用します。ワーカーは準備ができ次第速やかにタスクを処理し始めます。` LocalExecutor `の生存期間にわたってワーカー・プロセス群はタスクを処理したり待機したりします。` LocalExecutor `は停止命令を受け取ると、ワーカー群を停止します。このストラテジーにおいてプロセスはクラス`QueuedLocalWorker`を利用します。

細かな違いに目を瞑れば、` SequentialExecutor `は並列度を1に制限（つまり` self.parallelism = 1`）された` LocalExecutor  `といって差し支えないでしょう。このオプションのおかげでローカルで実行されるエグゼキューターの実装が単一のものとなるかもしれません。

---

あるクラス（LocalExecutor）について説明しているさなかに別のクラス（BaseExecutor）に言及しだしたり。。。あるクラスと別のクラスは似ていて大は小を兼ねるから統合されうるだろうと（仕様ではなく）可能性のロードマップを語りだしたり。。。
こういう奔放でフランクで分かりにくいドキュメントはApache系らしいよね、と苦笑いしてしまいました。