OmniAICreator/Qiita-1.07M huggingface dataset:
Franka libfranka実行性能

### コールバック関数の時間的正確性

generate_cartesian_pose_motion.cpp にコードを追加して測定
https://frankaemika.github.io/libfranka/generate_cartesian_pose_motion_8cpp-example.html
結果は「count 9957 Zero 1 P001 9924 P002 20 P003 11」となる

```
int count = 0;
int tosecZero = 0;
int tosecP001 = 0;
int tosecP002 = 0;
int tosecP003 = 0;
robot.control([&time, &count, &tosecZero, &tosecP001, &tosecP002, &tosecP003, &initial_pose](const franka::RobotState& robot_state, franka::Duration period) -> franka::CartesianPose {
double tosec = period.toSec();
time += tosec;
if (time == 0.0) {
  initial_pose = robot_state.O_T_EE_c;
}
count++;
if(tosec == 0.0){
  tosecZero++;
} else if(tosec == 0.001){
  tosecP001++;
} else if(tosec == 0.002){
  tosecP002++;
} else if(tosec == 0.003){
  tosecP003++;
}
```

```
double tosec = period.toSec();
time += tosec;
struct timespec t;
clock_gettime(CLOCK_REALTIME,&t);
double realtime = t.tv_sec + (double)t.tv_nsec*1e-9;
if (time == 0.0) {
  initial_pose = robot_state.O_T_EE_c;
} else {
  double diff = realtime - lasttime;
  printf("%f ",diff);
}
lasttime = realtime;
count++;
if(tosec == 0.0){
  tosecZero++;
} else if(tosec == 0.001){
  tosecP001++;
} else if(tosec == 0.002){
  tosecP002++;
} else if(tosec == 0.003){
  tosecP003++;
}
```

```
FILE *fp;
fp = fopen("tick.txt","w");
if(fp == NULL){
  return -1;
}
struct timespec t;
clock_gettime(CLOCK_REALTIME,&t);
double lasttim = t.tv_sec + t.tv_nsec * 1e-9;
std::array<double, 16> initial_pose;
double time = 0.0;
robot.control([&time, &initial_pose, &fp, &lasttim](const franka::RobotState& robot_state, franka::Duration period) -> franka::CartesianPose {
struct timespec t;
clock_gettime(CLOCK_REALTIME,&t);
double tim = t.tv_sec + t.tv_nsec * 1e-9;
time += period.toSec();
if (time == 0.0) {
  initial_pose = robot_state.O_T_EE_c;
}
double diff = tim - lasttim;
lasttim = tim;
fprintf(fp,"%f\n",diff);
```
パスワード認証廃止の解決(アクセストークン生成)

コマンドラインでgit　pushしようとしたらいつもは入力しないユーザーネームを求められたので入力し、パスワードを入力したらエラーになりました。要約すると、

パスワード認証のサポートは2021年8月13日に削除されました。
代わりに個人用アクセストークンを使用してください。
https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ を参照してね。

ユーザ名とパスワードではなくアクセストークンを使用してね。
とのことでした。



```
$ git push origin ブランチ名
Username for 'https://github.com': ユーザー名記入
Password for 'https://ユーザー名@github.com': パスワード記入
↓ここからエラー
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: Authentication failed for 'https://github.com/ユーザー名/リポジトリ名.git/'
```




調べてみたところ、色々な記事が出てきて参考にしながら解消していきます。
早速設定してみます。

##取得手順
まず、
githubにログイン>Settings>Developer settings>Personal access tokens>Generate new token 
ここまでのリンク→(https://github.com/settings/tokens) の流れで進み、パスワードを入力して新しいトークンの設定画面に入る。

###設定画面
・noteに新しいトークンの名前を入力。
・有効期限を設定。
・権限を設定する。
---今回はrepo(リポジトリ)にだけチェック。
---他のチェックは後日追記。
・generate token(トークンを生成する)をクリック。
・トークンをコピーして保管(ページを離れたら戻れない)。

###改めてpush
再び、ターミナルでエラーになったファイルに移動してpush!!!

```
$ git push origin ブランチ名
Username for 'https://github.com': ユーザー名記入
Password for 'https://ユーザー名@github.com': ここのパスワード入力部分に生成したアクセストークンを入力。
```

結果、push成功!!!

有効期限を設定した場合は、入力した期限まで使えて、過ぎた場合はまた生成しなければならない。

改めてわかる事があれば随時追記していきます。

##参考記事

https://n.career-info.jp/contents/?id=10161

https://note.kiriukun.com/entry/20210904-github-password-authentication-was-removed

https://zaitakukinmu.com/2021/08/19/git-token/#index-3
アラームの後に逆モーニングコールする目覚ましアプリを作ってみた(かった)

# 作ろうとしたアプリ
![mezamashidenwa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1996013/bc453f68-0725-5e3a-a54d-362ed6783ddc.png)
簡単に言うとアラームを一定の時間までに止められないと連絡先の人に電話をかけちゃうアプリです。迷惑アプリです。

GitHub: [Stickers-hackathon/mezamashi-denwa](https://github.com/Stickers-hackathon/mezamashi-denwa)
このアプリの開発は3人で行いました。その進行についても記事にしています。
[チーム開発でアプリ作ろうとしたけど失敗した](https://qiita.com/YusukeTagawa/items/96b534598625d3ab2e1e)

# 機能
## アラームの追加
![スクリーンショット 2021-09-19 3.00.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1996013/41afda13-1ba6-7317-a8b8-87820b5150c8.png)
![スクリーンショット 2021-09-19 3.06.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1996013/23b9f6ae-6443-b64a-7b2f-191a3c9f44a4.png)

アラームをかける時間と電話をかける相手を決めて、それを一つのアラームとして追加します。かける相手は指定することもできますがランダムで指定するということもできます。

## アラーム一覧の表示
![スクリーンショット 2021-09-19 3.14.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1996013/377857f1-056b-3338-2345-01201e7f542a.png)

追加したアラームの一覧を表示します。ここでON/OFF切り替えと削除ができます。

## 通知と発信
指定された時間になったらアラームが鳴り、止められなかった場合は数秒後に設定された連絡先に電話がかかります。

# 使った技術
flutterを使いました。開発のメンバーは3人で全員flutterを使うのは初めてだったので、まずはMVP(Minimum Viable Product)の考え方に基づいてコアとなる最低限の機能を洗い出し役割を分担して開発しました。
## 状態管理
* StateNotifier, freezedを使用

## データの保存
* Shared preferencesを使用
 
## 通知
* flutter_local_notificationsを使用
* [flutter_local_notificationsで指定時刻にローカル通知](https://qiita.com/ysk-cpu/items/20f2095a7cb842bab4d9)

## 連絡先の取得
* contacts serviceを使用。
* 連絡先にアクセスするための権限の確認にpermission handlerを使用
* [こちらの記事](https://medium.com/xenon-labs/how-to-access-contacts-in-your-flutter-app-3f0158ce1ee7)を参考にして作りました。

# 完成には至らず...
アラームや連絡先の取得、電話をかける機能などはできたものの、バックグラウンドの状態から電話をかけるのが僕たちの技術ではどうにも実装することができず、ここで断念することになりました。

仕様としては「指定時刻に通知を出して60秒以内に操作をしなければ誰かに電話をかける」というのを目指していました。
flutter_local_notificationsでは通知を出せても他の処理を実行できなかったので、Androidのみ有効ですがandroid_alarm_manager_plusで電話をかける関数を呼び出すことにしました。しかし、これがエラーになってできませんでした。
世の中には多くのアラームアプリが出回っているので技術的には可能なはずですが、Flutterで可能かどうかは分かりません。

# PR受け付けます
チームで予定を合わせて開発することは止めましたが、個人で調べたり気になるところを改修する作業は続けます。Flutterのプラグイン頼りで進めてきたので、指定時刻に電話をかける処理についてはKotlin, SwiftのようなOSに合った言語であればまだアプローチできることがあるのではないかと考えています。もしくは仕様を変更して、連絡先から電話番号を使うのではなく、このアプリをインストールした人どうしのインターネット電話にすることも選択肢として考えています。 

初めてのflutterアプリ制作ということもあり、完成まで辿り着けなかったのは僕たちの知識不足によるところがあったのかもしれません。もし僕たちの行き場のない思いを鎮魂してくださる方がいれば、PRを受け付けていますのでよろしくお願いします。
AWS上のEC2インスタンスをコピーする

## はじめに
備忘の為。
Ec2インスタンスをコピーする方法を紹介します。

## 手順
1. 既存のEC2インスタンスからイメージを作成する。
1. AMIからEC2を作成する。

### 既存のEC2インスタンスからイメージを作成する。

既存のEC2を選択し、アクション>イメージとテンプレート>イメージを作成 を押下します。

![スクリーンショット 2021-09-17 143707.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/5f084618-689e-db99-e75f-dcea1e552fc8.png)

イメージ名を入力し、イメージを作成しましょう。
(結構時間かかります。10~20分くらい？)
![スクリーンショット 2021-09-17 143732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/03968f09-326b-9393-e097-7a2cee5dff42.png)

作成したイメージは、左ペインの イメージ>AMI から確認できます。
![スクリーンショット 2021-09-17 143759.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/2a16fd9d-40cc-f42c-60e6-073227e130e0.png)

### AMIからEC2を作成する。
次に、インスタンス一覧画面へ移動し、「インスタンスの起動」を押下します。

その後、マイAMIを押下し、先ほど作成したイメージを選択します。
![スクリーンショット 2021-09-17 145524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/a0be498c-c58c-da95-2efc-dc9d9af3323f.png)

その他もろもろの情報を入力すれば、既存のEC2インスタンスのコピーが作成できます。



## 参考
https://aws.amazon.com/jp/premiumsupport/knowledge-center/account-transfer-ec2-instance/
nodistでnodeとnpmのバージョンを合わせる

## はじめに
備忘のため。
nodistを使っていると、たまに下記のようなエラーに遭遇します。

```
$ npm i
Sorry, there's a problem with nodist. Couldn't resolve npm version spec match : Couldn't find any matching version
```

nodeのバージョンとnpmのバージョンに差異がある際に発生するっぽいです。

## 解決策

下記コマンドを実行します。

```
$ nodist npm match
npm match

$ npm -v
6.12.0
```

nodeバージョンに対応したnpmをインストールしてきてくれます。
Nuxt.jsでQuill（WYSIWYGエディタ）を使う（テーブルも使えるようにする）



# vue-quill-editorをインストール

`npm i vue-quill-editor`でvue-quill-editorをインストールします

https://www.npmjs.com/package/vue-quill-editor

### プラグインを作成

- [こちら](https://www.npmjs.com/package/vue-quill-editor#mount-with-global)に書いてある通りにインポートするプラグインを作成します

```plugins/quill.js
import Vue from 'vue'
import VueQuillEditor from 'vue-quill-editor'
 
// require styles
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
 
Vue.use(VueQuillEditor, /* { default global options } */)
```

- `nuxt.config.js`にプラグインを追加します
  - ※クライアントモードにするのを忘れずに！！！

```nuxt.config.js
  plugins: [
    ・・・
    { src: '@/plugins/quill', mode: 'client' },
  ],
```


### 使ってみる

```pages/index.vue
<template>
  <quill-editor v-model="editor" />
</template>
```

↓のような感じでリッチなエディタが表示されます！！！（editor変数にはサニタイズされたHTMLテキストが格納されます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/5bbdcde1-5560-68e7-cd4a-f662062a01e7.png)



# テーブルを使えるようにする

quillはデフォルトではテーブルオプションが使えないようなので、`npm i quill-table-module`でテーブルモジュールをインストールします

https://www.npmjs.com/package/quill-table-module

### プラグインを修正

`quill-table-module`をインポートし、ツールバーにテーブルオプションを追加します

```nuxt.config.js
import Vue from 'vue';
import VueQuillEditor from 'vue-quill-editor';
// 追加
import quillTable from 'quill-table-module';

// require styles
import 'quill/dist/quill.core.css';
import 'quill/dist/quill.snow.css';
import 'quill/dist/quill.bubble.css';

// 追加
VueQuillEditor.Quill.register(quillTable.TableCell);
VueQuillEditor.Quill.register(quillTable.TableRow);
VueQuillEditor.Quill.register(quillTable.Table);
VueQuillEditor.Quill.register(quillTable.Contain);
VueQuillEditor.Quill.register('modules/table', quillTable.TableModule);

/**
 * Quillエディターのツールバーに表示するアイテム設定
 * 参考：https://quilljs.com/docs/modules/toolbar/
 */
const editorOption = {
  modules: {
    table: true,
    toolbar: [
      ['bold', 'italic', 'underline', 'strike'],
      ['blockquote', 'code-block'],
      [{ list: 'ordered' }, { list: 'bullet' }],
      [{ indent: '-1' }, { indent: '+1' }],
      [{ header: [1, 2, 3, 4, 5, 6, false] }],
      [{ color: [] }, { background: [] }],
      ['clean'],
      // テーブルメニューを追加
      [{ table: ['newtable_1_1'] }, { table: 'append-row' }, { table: 'append-col' }],
    ],
  },
};

Vue.use(VueQuillEditor, editorOption);
```

これで↓のようにテーブル操作用のメニューが追加されます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/5b83cad9-aab6-ab03-22de-4fcab16f90b8.png)

※ツールバーモジュールの`newtable_1_1`を定義している配列に要素を追加すればより多くのテーブルを定義することもできます


# 参考

https://quilljs.com/docs/modules/toolbar/
https://www.npmjs.com/package/vue-quill-editor
https://www.npmjs.com/package/quill-table-module
https://codesandbox.io/s/kl25i?file=/Editors.svelte:911-920
【Git】pushしたら『error: src refspec master does not match any』が発生

##事例
・git hubにてリモートリポジトリ作成済み。
・ローカル環境で`git add`、`git commit`等使用しながらバージョン管理。
・一通り完了したので`git push origin master`を実行したところ下記エラーが発生。

```
% git push origin master
error: src refspec master does not match any
error: failed to push some refs to 'リポジトリパス'
```

##解決法
`git push origin master`を下記に変更

```
git push origin main
```

##原因
・以前は「master」ブランチが自動作成されていたが、2020/10以降新規レポジトリを作成すると「main」ブランチが作成されるため。

→作成しているレポジトリが`git push origin master`なのか、`git push origin main`なのか気をつける必要あり。

##ところで「ブランチ」とは
履歴の流れを分岐して記録していくための機能。
この機能を使うことで、他のメンバーと分担して作業を行うことができ、合流（マージ）することで1つのブランチにまとめることができる。

__今回の「masterブランチ」について__
・最初のコミットで生成されるブランチで、要するに主軸となるブランチ。
・個人で開発している場合など、ブランチを分岐させない場合、masterに対してpushすることになる。
※この名称が2021/10以降「main」に変更

##参考
[git push時のerror: src refspec master does not match anyについて](https://deepblue-ts.co.jp/git/git-push-error/)
[サル先生のGit入門](https://backlog.com/ja/git-tutorial/stepup/01/)
Doctrine QueryBuilderでMenyToMenyリレーションの検索

symfonyで例えば以下のエンティティがあったとき、タグに属する記事を取得する

```
class Tag
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=32)
     */
    private $name;
}
```

```
class Entry
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=32)
     */
    private $title;

    /**
     * @ORM\ManyToMany(targetEntity=Tag::class)
     */
    private $Tag;
}
```

`ManyToMany`でリレーションされているのでDQLでは

```
$qb
    ->andWhere(':tag MEMBER OF a.Tag')
    ->setParameter('tag', $tag)
;
```
の様になる。

# 複数のタグで検索するには？

調べてみたけど出てこなかったので試行錯誤した結果以下でいけた

```
$qb
    ->andWhere(':tags MEMBER OF a.Tag')
    ->setParameter('tags', [$tag1, $tag2])
;
```
Franka 操作あれこれ

### 梱包用ポーズ

The transportation pose can be described by the following joint angles of axis 1 to axis 7: [0°, -32.08°, 0°, -170.17°, 0°, 0°, 45°]
https://dentec.pl/pliki/Artykul/855_dentec-franka-instrukcja-uzytkownika.pdf
iOSDC 2021 「バックグラウンドでアプリがキルされても怖くない！アプリの状態を元に戻すリストア機能の全て」の補足

#はじめに
iOSDC 2021 Day2、[バックグラウンドでアプリがキルされても怖くない！アプリの状態を元に戻すリストア機能の全て](https://fortee.jp/iosdc-japan-2021/proposal/32884426-2602-445f-a456-42cd1b9838e7)について登壇させていただきました。
トーク賞を取ろうと色々な手段でコメントをもらえる策を講じていたのですが届かず。残念。

後日動画がYouTubeにアップロードされる予定なので、動画が公開されたら更新します。

https://speakerdeck.com/coe/iosdc-2021-restore

以下は伝えてなかったことや質問やコメントについての補足になります。

## SceneDelegate NSUserActivityのUserInfoについて

NSUserActivityのUserInfoは`[AnyHashable : Any]` となっていますが、入れられる値の型はドキュメントにあるとおり、 `NSArray, NSData, NSDate, NSDictionary, NSNull, NSNumber, NSSet, NSString, or NSURL` となっています。これらの値以外を入れた場合、クラッシュしたりするので注意してください。

https://developer.apple.com/documentation/foundation/nsuseractivity/1411706-userinfo

## SceneDelegate backなどでViewControllerが破棄された場合
ナビゲーションでbackなどが起きた時など、復元対象のViewControllerが破棄された場合、UserInfoに復元情報を載せている場合は復元されないようにその情報を削除する必要があります。
Appleのサンプルアプリでは`viewWillDisappear`の時にuserActivityをnilしています。

```swift
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        // This view controller is going away, no more user activity to track.
        if #available(iOS 13.0, *) {
            view.window?.windowScene?.userActivity = nil
        } else {
            userActivity = nil
        }
    }
```

## SceneDelegate 元に戻すビューコントローラーの選定
SceneDelegateのリストアはStoryboardと違って手作業で画面遷移を作らないといけないので、全てを元通りに戻そうとするとかなり大変です。

- アプリとして非常に価値が高い画面
- 長文入力、動画編集、画像加工など、ユーザーが長時間かけてコンテンツを作成する画面

などなど、重要と思われる画面だけ元に戻す対象にするのも一つの手かと思います。

## 日向さんとてもスリムになっててびっくりしてるのワイだけ？？
はい、そうなんです。
今年はHealthKitのトークがしたいなーと思って体作りから初めて、ナトリウムと食塩相当量、リボフラビンととビタミンB2の関係など、徹底的にHKQuantityTypeIdentifierの内容と日本栄養成分表示の関係などについて語る
[一年間で25Kg痩せた！現役エンジニアが教えるHealthKitメソッド](https://fortee.jp/iosdc-japan-2021/proposal/a56c31e3-9da9-46ae-bcba-1d5590042b87)というプロポーザルを出していたのですが、残念ながら非採択でした。
どこかで機会があれば違った形でアウトプットできればと思います。その際は25Kgという数字は下方修正される可能性大です。

#終わりに
Staff、Sponsor、Speaker、Sankashaの皆さんお疲れ様でした。
Databricks(Spark)のPySparkにてSpark Configの値をすべて取得する方法

## 内容
Databricks(Spark)のPySparkにてSpark Configの値をすべて取得するには`getConf().getAll()`関数を利用することで表示できます。

```python
sc.getConf().getAll()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/069100bc-03b2-2f23-0766-87a4173ee8dc.png)

個別の値を取得するには、`getConf().get()`関数を利用します。
```python
sc.getConf().get('spark.databricks.clusterUsageTags.sparkVersion')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/85d629f0-cf53-b08f-850c-e684f9238963.png)
改行や空行を無視してテキストファイルを処理するには

##記事の目的
今回は、改行や空行を無視してテキストファイルを処理するということについて、インターン中にチームメンバーに対しての情報共有のため書いています。

##共通のエラー
・なぜか入力した数値よりも先にFizzBazzが記入されてしまう
下記のコードが具体例です。これは処理後にFizzbazzが表示されてしまいます。

```php
$str1 = "Fizz";
    $str2 = "Buzz";
    $num = $_POST["num"];
    $filename="mission_1-27.txt";
    $fp = fopen($filename,"a+");
    fwrite($fp, $num.PHP_EOL);
    fclose($fp);
    echo "書き込み成功！<br>";
    if(!empty($_POST["num"])||isset($_POST["num"])){
    if(file_exists($filename)){
        $numbers = file($filename,FILE_IGNORE_NEW_LINES);
           foreach($numbers as $num){
        if ((int)$num % 3 == 0 && (int)$num % 5 == 0) {
    echo $str1.$str2;
    echo "<br>";
    } else if((int)$num % 3 == 0){
        echo $str1;
        echo "<br>";
    } else if((int)$num % 5 == 0) {
        echo $str2;
```

###エラーの原因
このエラーでは、txtファイル内の改行は無視して処理されているのですが、空文字は処理されてしまいます。
以下は上記のコードの一部分ですが、file()のところでフラグが改行についてしか指定されていないので、空文字はそのまま処理されてしまっていると思われます。

```php
if(file_exists($filename)){
        $numbers = file($filename,FILE_IGNORE_NEW_LINES);
   ~
}
```

なのでフラグの指定について理解を深めましょう！
file()、フラグ指定などで検索してみてください！
【Sphinx】Indexロールの使い方

「.. index::」と段落の前に索引ページの掲載を指定するだけでなく、``:index:`言葉` `` と書くことで文章中の単語を索引ページからアクセスできるようになる。

#📝書き方の例

次のrstファイルは、可能な記載方法を確認したもの。

```rst
indexロールの記載例
###################

標準的な書き方

- 副用語なし： :index:`やよ|用語`
- 副用語あり： :index:`やよ|用語; はふ|副用語`

タイトルと実体を分ける

- single（暗黙）

    - :index:`ようご|用語3^<ささ|索引3>`
    - :index:`ようご|用語4^<ささ|索引4-1; さくいん|索引4-2>`
    
- single（明示）

    - :index:`ようご|用語5^<single: さくいん|索引5>`
    - :index:`ようご|用語6^<single: さくいん|索引6-1^; さくいん|索引6-2>`
    
- pair

    - :index:`ようご|用語7^<pair: さくいん|索引7-1^; さくいん|索引7-2>`
    
- triple

    - :index:`ようご|用語8^<triple: さくいん|索引8-1^; さくいん|索引8-2; さくいん|索引8-3>`

- single（多数）

    - :index:`ようご|用語9^<ささ|索引9-1, ささ|索引9-2, ささ|索引9-3, ささ|索引9-4, ささ|索引9-5>`
    - :index:`ようご|用語A^<ささ|索引A-1, ささ|索引A-21; ささ|索引A-22, ささ|索引A-3>`
    
索引ページと見比べることで、それぞれ「single/pair/triple」として処理されていることがわかる.
```

#⚠補足

上記の「ようご」の指定を有効にするには、次の拡張が必要です。

https://qiita.com/koKekkoh/items/4563b63fdb8eaa3ef4f9

#以上
【CSS】親要素のサイズにブレークポイントを指定して、子要素のサイズを切り替える（calcを使ったレスポンシブ）

CSSでレスポンシブにサイズを変える時、メディアクエリで画面幅にブレークポイントを指定するのではなく、
親要素のサイズにブレークポイントを指定して、親要素のサイズに応じて子要素のサイズを切り替える方法について。

## なぜ画面幅でなく、親要素のサイズにブレークポイントを指定するのか
サイドメニューを250pxで画面左側に固定で作り、右側にコンテンツを配置するレイアウトとする。このようなレイアウトで、ボタンを押してサイドメニューを折り畳む機能を作ると、サイドメニューを表示した時はコンテンツの幅が縮小し、サイドメニューを折り畳んだ時はコンテンツの幅が広がる。

![css_calc5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027088/054f8b45-607c-e00f-0463-7bfb01b9c355.png)


メディアクエリで画面幅にブレークポイントを指定してスタイルを切り替える場合、このコンテンツ幅の拡大縮小に対応できないので、今回のcalcを使ったサイズの切り替えが必要。

## レイアウト
親要素の幅を800pxをブレークポイントとして、

- 親要素のサイズが799px以下 → 子要素の幅を100%にする
- 親要素のサイズが800px以上 → 子要素の幅を50%にする

また、サイズに応じて1列、2列の表示にする。

![css_calc4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027088/206e3991-1656-5095-0596-28d84aec8d64.png)

![css_calc6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027088/88441ae7-d5ab-e8ae-bbff-c41e300f8598.png)

## calcで親要素が指定の値を超えるか否かを判断
サイズを切り替えたい子要素に対して、下記のcssを記述。

```
min-width: 50%;
max-width: 100%;
width: calc((800px - 100%) * 800);
```

親要素が700pxの場合、```calc((800px - 700px) * 800)```で8000pxとなり、max-widthより大きいので、```max-width: 100%;```が適用される。

親要素が1000pxの場合、```calc((800px - 1000px) * 800)```で-16000pxとなり、min-widthより小さいので、```min-width: 50%;```が適用される。

あとは親要素に

```
display: flex;
flex-wrap: wrap;
```

を記述すれば、1列表示か2列表示かを切り替えられる。

## HTMLとCSS
### HTML
index.html

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <!-- style.cssの読み込み -->
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="side-menu"></div>
    <div class="container flex">
            <div class="card blue"></div>
            <div class="card gold"></div>
    </div>
</body>
</html>
```

### CSS
style.css

```
body {
    margin: 0;
}

.side-menu {
    width: 250px;
    height: 800px;
    position: absolute;
    top: 0;
    left: 0;
    background-color: brown;
}

.container {
    margin-left: 250px;
    height: 800px;
    background-color: darkgrey;
}

.flex {
    display: flex;
    flex-wrap: wrap;
}

.card {
    min-width: 50%; /* 親要素（container）が799px以下の時 */
    max-width: 100%; /* 親要素（container）が800px以上の時 */
    width: calc((800px - 100%) * 800);

    height: 300px;
}

.blue {
    background-color: cornflowerblue;
}

.gold {
    background-color: goldenrod;
}

```


## 参考サイト
参考にしたサイト
https://www.freecodecamp.org/news/the-fab-four-technique-to-create-responsive-emails-without-media-queries-baf11fdfa848/#.dtpllw1lf
ABC166 C - Peaks から恩情を受ける

https://atcoder.jp/contests/abc166/tasks/abc166_c

![abc166_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/4ea59b9e-484c-fa0d-e41c-c49da3fef079.png)
![abc166_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/aa88a3d9-17bf-48fb-d09c-fe446fe5e780.png)
![abc166_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/fcdd39c7-ea42-5566-ac09-5302524b2251.png)
![abc166_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/ce2810a9-7e1b-e301-b668-a3076018b8d2.png)

なんというか、グラフでやりたかった。
以下の記事も参考にしつつ、書いてみた。

https://qiita.com/yonedaco/items/d0f65ca3dad2e085a51d

```Peaks_r0.py
n,m = map(int,input().split())
H = list(map(int,input().split()))

memo = [[] for _ in range(n)]     #各展望台からつながる道をストック
lis = [False]*n                   #行ったことあるか、無いかを記録
for _ in range(m):
    a,b = map(int,input().split())
    memo[a-1].append(b-1)
    memo[b-1].append(a-1)
#print(memo)

cnt = 0
for i in range(n):
    if memo[i]:
        #print(memo[i])
        for j in range(len(memo[i])):# start / end 地点、両方を記録
            lis[i] = True            # start
            lis[memo[i][j]] = True   # end

        for j in range(len(memo[i])):#for else を使い、start 地点が一番高い事を確認
            if H[i] <= H[memo[i][j]]:
                break
        else:
            #print(memo[i])
            cnt += 1                 #一番高かったらカウント

#print(lis)
print(cnt+lis.count(False))          #一度も行ったことない所は False なので,False をカウントし、
                                     #cnt との合算が答え
```

とりあえず、やりたいことが出来て、かつ通ったので
嬉しかったが、本当にこれで良いのか、疑問が残った。
なぜなら、計算量が多いからだ。なぜ通った？？

```Peaks.py
n,m = map(int,input().split())
H = list(map(int,input().split()))

memo = [[] for _ in range(n)]     
lis = [False]*n                   
for _ in range(m):                   #O(10^5)
    a,b = map(int,input().split())
    memo[a-1].append(b-1)
    memo[b-1].append(a-1)
#print(memo)

cnt = 0
#ここから→#####
for i in range(n):                   #O(10^5)
    if memo[i]:
        #print(memo[i])
        for j in range(len(memo[i])):#O(10^5)
            lis[i] = True            
            lis[memo[i][j]] = True   

        for j in range(len(memo[i])):#O(10^5)
            if H[i] <= H[memo[i][j]]:
                break
        else:
            #print(memo[i])
            cnt += 1
#ここまで←###### O(10^5 * 2*10^5)

           
#print(lis)
print(cnt+lis.count(False))        
```

少なく見積もっても、O(2*10^10 + 10^5) のように見える。
恩情を受けた気がした。

見識を広げて、再度チャレンジしよう。

***

再チャレンジしたが色々最適化できた。

```abc166c.py
N,M = map(int,input().split())
H = list(map(int,input().split()))

lis = [[] for _ in range(N)]
dic = {}
for _ in range(M):
    a,b = map(int,input().split())
    x = str(a)+str(b)## => ココから
    if x not in dic:
        dic[x] = 0
    dic[x] += 1
    if dic[x] == 1:##<= ココまで
        lis[a-1].append(H[b-1])
        lis[b-1].append(H[a-1])

#print(lis)
cnt = 0
for i in range(N):
    if len(lis[i])==0 or H[i] > max(lis[i]):
        #print(H[i],lis[i])
        cnt += 1
print(cnt)
```

A,B の入力には重複が見られたので
コメントにある ココから、ココまでの領域で
重複を取り除く記述を追加している。

。。無くても、あっても一応通る。
[Unity] Unityビルド時エラーExecution failed for task ':app:lintVitalRelease'の対処 [gradle] 

# 概要
Unityビルド時以下のエラーがでた時の対処を記述しています。

```
Execution failed for task ':app:lintVitalRelease'
```

## 対応策1
プロジェクトルートファルダにある「temp」フォルダ削除、Unity再起動



## 対応策2
以下の設定を行う。
2019だと
File →　「Builde Setting」→ 「Project Setting」　→　「Pulishing Settings」　→ 「Custom Main Gradle Template」 のチェック入れるとandroidフォルダ以下に「maintemplate.gradle」ファイルが生成されるのでそれを修正する。

```maintemplate.gradle
android {
    lintOptions {
        abortOnError false
        disable 'InvalidPackage'
        checkReleaseBuilds false
    }
}
```
Java Silver 6章　クラスの継承とポリモフィズム

#継承
既存のクラスをもとに新しいクラスを定義する
継承元のクラスをスーパークラス、新たに定義されたクラスをサブクラスと呼ぶ
![スキャン 2021-09-17 12.38 ページ 2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601137/000f88b7-4382-9827-c3a1-2bfb0ea32a27.jpeg)
継承の役割：差分プログラミング
複数のクラスに共通する処理をスーパークラスに定義し、各クラスで実装したい機能をサブクラスで定義する。

スーパークラスから継承するもの
・変数（フィールド）
・メソッド

継承しないもの
・コンストラクタ
・privateな変数（フィールド）、メソッド

#抽象クラス
クラスを作成する際、その骨組みにあたるクラスを抽象クラス(abstractクラス)と呼ぶ
抽象クラスには処理内容を記述しない抽象メソッド(abstractメソッド)を作成可能
また普通のメソッドと抽象メソッドを混在して使用可能である

【アクセス修飾子】abstract class クラス名｛｝
【アクセス修飾子】abstract 戻り値 メソッド名 (引数);

抽象クラスのルール
・抽象クラスはインスタンス化できず、継承したサブクラスを作成しインスタンス化する
・抽象クラスを継承したサブクラスは、抽象クラスの抽象メソッドを全てオーバーライドする必要がある
・抽象クラスを継承した抽象クラスは、元となる抽象クラスの抽象メソッドのオーバーライドは任意

```java
// 抽象クラス
abstract class User{
  //具象メソッド：オーバーライドは任意
  public void sayHo(){
    System.out.println("HO");
  }

  //抽象メソッド：オーバーライドは必須
  public abstract void sayHi();
}

// 具象クラス
class JapaneseUser extends User{
  @Override //オーバーライド
  public void sayHi(){
    System.out.println("こんにちは");
  }
}

class AmericanUser extends User{
  @Override
  public void sayHi(){
    System.out.println("Hi");
  }

}

public class Sample{

  public static void main(String[] args) {
    JapaneseUser taro = new JapaneseUser();
    AmericanUser tom = new AmericanUser();

    taro.sayHi();
    taro.sayHo();
    tom.sayHi();

  }
}
```

#インターフェース
クラスを作成する際に公開すべき必要なメソッドと定数を定義するクラスの取り決め
抽象メソッド、デフォルトメソッド、staticな定数（final）のみ宣言できる

【アクセス修飾子】interface インターフェース名{}
【アクセス修飾子】defoult 戻り値 メソッド名（引数）{}

インターフェースのルール
・インターフェースに宣言できる変数(フィールド)はstatic、もしくは定数のみ
・アクセス修飾子がないと強制的にpublic static finalとなる
・メソッドはデフォルトと抽象クラスが宣言可能

##抽象クラスとインターフェースの違い
どちらもクラス作成のもととなる

抽象クラス：クラスの「骨組み」、共通処理を定める
インターフェース：クラスの「型」、扱い方を決める情報を定める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601137/08fa698b-b98a-0528-a688-05866e68e371.png)
上の図では内側になるほど基底、外側になるほど継承となる

インターフェースは複数のクラスが継承できる特徴がある
便利な面もあるが、あるクラスの仕様変更が及ぼす影響が複雑となるデメリットがある

インターフェースの概念が特にわかりずらい
例として「3」について、
int型の整数3と、floot型の浮動小数点数3.00のように型が違うと扱いも異なるが種類としては数字である。
同様にクラスにも型を定め扱い方を明言する際インターフェースを使用する
そのためpublicで公開しstaticで共通の変数やメソッドを宣言している

```java
//interface

interface Printable{
  //定数
  double VERSION = 1.2;
  
  //抽象メソッド
  void print();

  //defaultメソッド
  public default void getInfo(){
    System.out.println("I/F ver. " + Printable.VERSION);
  }
  //staticメソッド

}

class User implements Printable{
  //インターフェースをもとに実装クラスを作成

  //抽象メソッドは必ずオーバーライド
  @Override
  public void print(){
    System.out.println(
      "Now printing user profile...");
  }
}

public class Sample {
  
  public static void main(String[] args){
    User tom = new User();
    tom.print();

    //defaultメソッドは実装クラスに共通したメソッドとして使用可能
    tom.getInfo();
  }

}
```

#interfaceof演算子
参照変数名 innterfaceof クラス名・インスタンス名

インターフェースとクラス、インスタンスの継承関係の有無をboolen値で返す

```java
interface A { }
class B { }
class C extends B { }
class D { }
public class Main {
  public static void main(String[] args) {
    C obj = new C();
    System.out.println(obj instanceof A);
    System.out.println(obj instanceof B);
    System.out.println(obj instanceof C);
    //System.out.println(obj instanceof D); 継承なしはコンパイルエラー
  }
}
```

```
n
false
true
true
```
GitLab Runnerがpendingのままjobを開始しない時の対処法

# 結論
Pendingのままのジョブをキャンセル
![スクリーンショット 2021-09-21 13.19.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614389/7ec72d4c-d232-d14e-77bc-a9de3e43cf8b.png)

Clear runner caches

![スクリーンショット 2021-09-21 13.19.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614389/2f96d871-4d91-4951-77f3-7cf114566a64.png)

再度ジョブを投入
![スクリーンショット 2021-09-21 13.20.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614389/f74f95b1-2f4a-39e5-c2bc-a2cd08dc87f7.png)

これで行けました。なお、理由はわかりません。
Blue Prism でワークキューの中のデータを、ロックすることなく確認する

# はじめに

Blue Prism の開発では、頻繁にワークキューを利用しますが、セキュリティ上の観点からなのか、その中身のデータ（アイテムデータ）をコントロールルームで簡単に確認する方法は提供されていません（僅かに「キー項目」が確認できるだけです）。

この記事では、アイテムを処理対象としてロックすることなく、中身を確認する方法を説明します。

# 方法

手順はとても簡単で、下記の通りです。
1. 保留中のアイテムIDのコレクションを取得する
2. 取得したアイテムIDを使って、アイテムデータの中身を取得する

実装済みのプロセスは下記の通りです。

![process.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/d7b62d07-9859-abb4-ac60-d770031fb93a.jpeg)

* 「ワークキュー :: 保留中のアイテムを取得」 アクションで、保留中のアイテムIDのコレクションを取得しています。
* ループの中で 「ワークキュー :: アイテムデータを取得」 アクションで、アイテムの中身を取得しています。

※ 「ワークキュー :: 次のアイテムを取得」だと、処理対象としてロックもかかってしまうのですが、上記手順だと（下図のように）副作用なく、アイテムデータの中身を確認することができます。

![windows10_BluePrism__Running_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/f8c59c0f-98dd-6c93-f172-17929beb6f10.jpeg)
CentOS6+php7.1 Dockerfile

※未だにCentOS6のメンテナンスをしなくてはならない環境下で

CentOS6.10にphp7.1をパッケージインストールします。

しかし、リポジトリが諸々アーカイブ行きして今はvaultに落ちてます。

以前は、 

```shell
curl -sS https://setup.ius.io/ | sh -x
```

でIUSリポジトリから簡単にphp71uをインストールできましたが、もうできません。
（ちなみにCentOS7ならまだいける）

というわけで vault.centos.org と vault.ius.repo を参照してインストールします。

```dockerfile
FROM centos:centos6.10

# vault.centos.orgリポジトリを参照する
RUN sed -i -e "s/^mirrorlist/#mirrorlist/" -e "s/^#baseurl/baseurl/" \
        -e "s/mirror\./vault\./" /etc/yum.repos.d/CentOS-Base.repo \
        && yum update -y

# php7.1をインストールする為にvault.ius.repoリポジトリを登録する
RUN rpm --import https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6 \
                https://vault.ius.io/RPM-GPG-KEY-IUS-6 \
        && yum install -y epel-release \
        && sed -i "s/mirrorlist=https/mirrorlist=http/" /etc/yum.repos.d/epel.repo \
        && yum install -y https://vault.ius.io/el6/x86_64/packages/i/ius-release-2-1.el6.ius.noarch.rpm \
        && sed -i "s/repo\.ius\.io\/6/vault\.ius\.io\/el6/" /etc/yum.repos.d/ius.repo

# php7.1をインストール
RUN yum --enablerepo=ius,epel install -y \
        php71u-cli \
        php71u-common \
        ......必要なパッケージをインストール \
        && yum clean all

# 諸々設定が続く......
```
@wordpress/envを使ってみた

ローカルでの開発をするのに、@wordpress/envを使ってみました。

## ドキュメント
公式ドキュメント
https://ja.wordpress.org/team/handbook/block-editor/reference-guides/packages/packages-env/
  
インストールの参考にしたサイト
https://tomosta.jp/blog/wp-env/

作業的には、ただただ↑に書いてあることを実行したレベルなので、ちょっとした使い方と所感を下に書いていきます。

## インストール
まずは、プロジェクトのフォルダを準備し、そこに移動する。

グローバルにインストールするコマンド

```
npm -g i @wordpress/env
```

ローカルパッケージとしてのインストールコマンド

```
npm i @wordpress/env --save-dev
```

僕は、npm initして、package.jsonを作成したので、2つ目のコマンドを実行しています。
（「とりあえず」でグローバルのコマンドもやっちゃったかも）

## 起動
```
wp-env start
```
でWPが起動します。  
  
http://localhost:8888/wp-admin/
にアクセスして、
ユーザー名: admin
パスワード: password
でログインできます。

### —update
—updateした場合は、WP管理画面からインストールしたプラグインは消えてしまうので注意。

```
 npm run wp-env start —update
```

## .wp-env.json
.wp-env.jsonを用意することで、WPインストールやプラグイン、テーマをカスタマイズできます。
  
とりあえず、僕は、
"core": null → 	使用する WordPress のバージョンまたはビルド。null の場合、最新リリース版 ※ローカルとサーバー上でバージョン違うことにならないように注意
themes → 環境にインストールするテーマのリスト
plugins → 環境にインストール、有効化するプラグインのリスト  
この3つを設定しました。

```
{
  "themes": [
    "./themes/xxxxx"
  ],
  "core": null,
  "plugins": [
    "https://downloads.wordpress.org/plugin/xxxxxxxx.zip",
    "./plugins/xxxxx"
    ...省略
  ]
}
```

※ローカルのプラグインを設定したい場合は、zipではなくフォルダを設定する

## themes設定
.wp-env.jsonの、themesに設定してあるディレクトリのテーマが、WPの管理画面上に出ます。

## 結果
wp-configとかの設定はできなさそう（かも？）なものの、ローカルで触るのはthemes下のみでも良さそうな場合は、簡単に実装できて便利でした。  
  
ちょっとつまづいたところは、プラグインをローカルでインストールしようとした際、downloads.wordpress.orgからは、zipで指定していたので、zipで設定したら失敗しました。
ローカルの場合は、フォルダの指定になるようです。
VSCodeでSpringBootを開発する

# VSCodeでSpringBootを開発する
## VSCodeの環境構築
### 拡張機能をインストール
「Spring Boot Extension Pack」という拡張機能をインストールする。

### JDK11以上をインストール
VSCodeでJavaを開発するために必要な「Language Support for Java(TM) by Red Hat」が、
JDK11以上でないと実行することができない。
そのため、JDK11以上のインストールが必要になる。

### setting.jsonの設定
|項目|説明|
|:---|:---|
|java.home|JDK11以上の格納ディレクトリを指定|
|java.configuration.runtimes|プロジェクトで使用するJavaの実行環境を設定|

```
"java.home": "c:\\jdk-14",
"java.configuration.runtimes": [
  {
    "default": true,
    "name": "JavaSE-1.8",
    "path": "C:\\jdk-8",
  },
],
```

## SpringBootの実行
サイドバーに「SPRING BOOT DASHBOARD」というのが表示されるため、そこでプロジェクトの実行を行う。
![スクリーンショット 2021-09-21 130121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217445/f1b48572-1f8e-13b5-3599-d9e210e115ee.png)

左側の「▶」を選択すれば、通常の実行が可能。

### デバッグ実行
右側の「▶」マークをクリックするとデバッグ実行が可能。
行番号の左側にブレークポイントを設定できる。
![スクリーンショット 2021-09-21 130534.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217445/8b8e980f-e2a3-a615-39b8-2c5b2ebd129b.png)

### ウォッチ式
![スクリーンショット 2021-09-21 130836.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217445/93a38351-aabe-f10a-d879-732395cd0cde.png)
サイドバーの「ウォッチ式」に式を追加すれば、変数の中身を確認できる。

### ショートカットキー

|キー|内容|
|:---|:---|
|ステップオーバー|F10|
|ステップイン|F11|
|ステップアウト|Shift + F11|
scikit-learn メモ

## Linear Regression
<b>LinearRegressionを勉強するのに使った教材</b>
【世界で37万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜
[https://www.udemy.com/course/datascience365/](https://www.udemy.com/course/datascience365/)
### 基本事項
intercept_ : 切片
coef_ : 推定係数 (coef => coefficients)

score(x,y) : 線形回帰の決定係数を返す(単回帰分析にも重回帰分析にも使える）
predict(x) : 予測値の算出

### 自由度修正済み決定係数を求める

```math
R^{2}_{adj} = 1-(1-R^{2})*\frac{n-1}{n-p-1}
```

```python:adjusted_r2
reg = LinearRegression()
reg.fit(x, y)

# 決定係数
r2 = reg.score(x,y)

# データの数
n = x.shape[0] 

# 対象とする変数の数
p = x.shape[1]

# 自由度修正済み決定係数
adjusted_r2 = 1-(1-r2)*(n-1)/(n-p-1)

```
shape : numpyのメソッドで配列の形状を見つける
x.shape -> (20, )
データ数20の一次元配列

### 不要な変数を見つける (特徴選択と言われている)
feature_selection.f_regressionを用いる。
F-regressionはそれぞれの変数一つ一つに対して単線形回帰を行う。
F値を求めてからp値を求める

  1. f_regressionをインポートする
  2. f_regressionからp値を求める
  3. p値を比較する
 
### f回帰を行う際は、複数の変数同士の相互作用が考慮されていないことに注意する必要がある。
→ sklearnを用いてp値を見つける方法

### 標準化 -> Feature Scaling 
データを一般的な範囲に納める (平均が0、標準偏差1の分布に変える）
sklearnにおいてはStandardScalerを用いる
標準化せずにモデルを作ると問題が起こることがある。
-> 

### 過学習(Overfitting)と過少学習(Underfitting)
過学習(Overfitting) : 訓練がトレーニングデータに対して過剰に適合しており、本質を外してしまっている。
過少学習(Underfitting) : モデルがデータの裏にあるロジックを捉えることができない。
過学習対策 : データを訓練用とテスト用に分ける

### 訓練(Training)

### メモ
・sklearnは重回帰分析を行うことを前提にしている。
・決定係数はモデルの当てはまりの良さを知る上で重要。
・自由度修正済み決定係数はモデルに組み込まれた変数によって変化する
->説明力がほとんどない変数が組み込まれた場合、決定係数はほとんど変化しないが、
自由度修正済み決定係数は変化する。
・f回帰を行う際は、複数の変数同士の相互作用が考慮されていないことに注意する必要がある。
・p値はその変数が有意でないことを把握する上では非常に有用であるといえるが、その変数がどれほど有益かはわからない。
-> p値が同等だった場合にその2つの値が同等に重要であるということを示しているわけではない。
・特徴量は重みと呼ばれる(重みが小さければ小さいほどインパクトは小さく、大きければ大きいほどインパクトは大きいといえる。)
・機械学習において切片はバイアスと呼ばれる
・一般的には、最も影響が小さい重みは取り除いた方が良い

### 疑問
・fit()を行った後にパラメーターが出力されない。(デフォルトで出力しない設定？）
ex. LinearRegression() 
・自由度修正済み決定係数ってそこまで重要じゃないのか？(sklearnにデフォルトで搭載されていないので）
-> 場面によって使い分ける必要がある。
・自由度修正済み決定係数を用いる場合は？
・sklearnを使用しない場合の特徴選択はどのように行う？
・複数同士の相互作用を考えることも重要だが、見かけ上で相互に作用し合っていることにも注意する必要もあるのでは？
-> 統計的な基準だけで考えるのではなく変数同士の関係性を常識などから考える必要もある。

・自由度修正済み決定係数はsklearnでは求めることができない
・自由度修正済み決定係数の値から特徴量を減らすかを決める
・scikit-learnにおいてp値を計算する機能がデフォルトで入っていない理由
->　機械学習を実装する人はモデルを作成する前にfeature scalingをしている。ある変数の重みが小さくなることでその値があたかもペナルティを与えられたようになる。

・scikitlearnのtrain_test_splitは実際の現場でも使われているのか？
-> 状況によって異なる？ 温度などのデータは日付で分けたほうが良いな。
Pythonでマウスクリックされた画面座標を取得する

<<覚書>>
モジュール pynputでマウスクリックイベントを検出し、pyautoguiにてクリックした座標を取得する。

[参考リンク]
[pynput: "pynput Package Documentation"](https://pynput.readthedocs.io/en/latest/)
[pyautogui: "Welcome to PyAutoGUI’s documentation!"](https://pyautogui.readthedocs.io/)

コード例

```py
from pynput import mouse #module pynputをインポート
import pyautogui #module pyautoguiをインポート 

#マウスイベントハンドラを定義
def on_move(x, y):
    return

def on_click(x, y, button, pressed):
    if pressed:
        # Stop listener
        return False

def on_scroll(x, y, dx, dy):
    return

#リスナー起動
#Collect events until released
with mouse.Listener(
        on_move=on_move,
        on_click=on_click,
        on_scroll=on_scroll) as listener:
    listener.join()

recttop_x, recttop_y = pyautogui.position()
print('Pointer cliked at {0}'.format(
        (recttop_x, recttop_y)))

#クリックした座標を表示
print('recttop_x = ', recttop_x)
print('recttop_y = ', recttop_y)
```
Numo::NArray で二項演算としての最大値・最小値の計算

Ruby の多次元数値配列ライブラリ [Numo::NArray](https://ruby-numo.github.io/narray/) で**2つの配列を要素毎に二項演算したい**際、演算子のあるもの（例えば `ary1 + ary2` ）は直感的ですぐわかるのだが、そうではない**最大値や最小値**の演算はどうすればいいのかわからなかった。インスタンスメソッドの `#max` などは、その配列内の要素を返すものであり二項演算ではない。

あるときAPIリファレンスのメソッド一覧を眺めていたら、それらしい名前のメソッドが目に留まった。ドキュメントには何の説明も無く自信を持てなかったが、調べたところ合っていそうなのでメモとして残しておく。

確認バージョン： 0.9.1.6 （ AtCoder で使えるもの）

## 計算方法
クラスメソッド `Numo::Int64.maximun(*args)` の類を使う。数値の型は自動で決定（拡張、upcast）してくれず、クラスを指定しなければならない。

```ruby
require 'numo/narray'

ary1 = Numo::Int64[3, 1, 4, 1, 5, 9, 2, 6, 5, 3]
ary2 = Numo::Int64[2, 7, 1, 8, 2, 8, 1, 8, 2, 8]

p Numo::Int64.maximum(ary1, ary2)  # 要素毎の最大値
#=>
# Numo::Int64#shape=[10]
# [3, 7, 4, 8, 5, 9, 2, 8, 5, 8]
```

次元拡張（broadcast）については演算子のある二項演算と同様に働き、したがってスカラー（→ 0次元配列）も使える。

```ruby
p Numo::Int64.maximum(ary1, 3)  # 3未満の要素は3にする
#=>
# Numo::Int64#shape=[10]
# [3, 3, 4, 3, 5, 9, 3, 6, 5, 3]
```

メソッド定義の引数が任意個なので3項以上もできるのかと思ったが、さすがにそれはダメだった。

```ruby
p Numo::Int64.maximum(ary1, ary1, ary1)
# ArgumentError (wrong number of arguments (given 3, expected 2))
```

## ドキュメントを確認
APIリファレンスから得られる情報は以下のソースコードしか無い。 int64.c はGitリポジトリに無いので自動生成していると思われる。
https://ruby-numo.github.io/narray/narray/Numo/Int64.html

```c
# File 'ext/numo/narray/types/int64.c', line 4452

static VALUE
int64_s_maximum(int argc, VALUE *argv, VALUE mod)
{
    VALUE a1 = Qnil;
    VALUE a2 = Qnil;
    ndfunc_arg_in_t ain[2] = {{cT,0},{cT,0}};
    ndfunc_arg_out_t aout[1] = {{cT,0}};
    ndfunc_t ndf = { iter_int64_s_maximum, STRIDE_LOOP_NIP, 2, 1, ain, aout };

    
#line 60 "gen/tmpl/ewcomp.c"
    rb_scan_args(argc, argv, "20", &a1, &a2);
    

    return na_ndloop(&ndf, 2, a1, a2);
}
```

ewcomp.c は存在する。ERBでテンプレート化されているものの読みやすいし、**きちんとドキュメントがある**。これで心配は解消した。
https://github.com/ruby-numo/numo-narray/blob/master/ext/numo/narray/gen/tmpl/ewcomp.c

```c
/*
  Element-wise <%=name%> of two arrays.
<% if is_float %>
  @overload <%=name%>(a1, a2, nan:false)
  @param [Numo::NArray,Numeric] a1  The array to be compared.
  @param [Numo::NArray,Numeric] a2  The array to be compared.
  @param [TrueClass] nan  If true, apply NaN-aware algorithm (return NaN if exist).
<% else %>
  @overload <%=name%>(a1, a2)
  @param [Numo::NArray,Numeric] a1,a2  The arrays holding the elements to be compared.
<% end %>
  @return [Numo::<%=class_name%>]
*/
```

このファイルが作られたコミットは [60d6f2b](https://github.com/ruby-numo/numo-narray/commit/60d6f2b9505bbef18226a4851b5e45215aa89c2f) で、タグを見ると v0.9.1.1 でリリースされたらしい。テストコードも追加されている。
機能要件のプロトタイピングでUI作り込まれててハマった

## これこのまま作ってよ
みてくれがよいモノを見せてしまうと、そうなっちゃうんですよね。
だからこそ、機能要件のプロトタイピングはあえてかっこ悪く作るが正解。
かっこいいUIだと、機能要件がしっかりしてなくてOKなりがち。
逆に、その印象でカッコイイUI作り込んでおくのも戦術ですが。
2次元データの欠損箇所（nan値）の内挿

`scipy`の`interpolate`を使って2次元データの欠損値の内挿を行った。


```py
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt

np.random.seed(0)
#ランダムな値を持つ10x10の2次元データの作成
data = np.random.randint(0,100,size=(15,15)).astype(np.float64)
#画像のランダムな25箇所を欠損値に変換
nanind=np.random.choice(np.size(data), size=25)
data.reshape(-1)[nanind]=np.nan

#データのグリッド座標を取得
x, y = np.meshgrid(np.arange(data.shape[0]),
                   np.arange(data.shape[1]),
                   indexing = 'ij')

#欠損箇所のマスクを作成
ma_data = np.ma.masked_invalid(data)

#欠損していないデータのみを取得
val_x = x[~ma_data.mask]
val_y = y[~ma_data.mask]
val_data = data[~ma_data.mask]

#線形内挿
inp_line=interpolate.LinearNDInterpolator((val_x,val_y), val_data.ravel())
inp_line_data=inp_line((x,y))

#最近傍内挿
inp_near=interpolate.NearestNDInterpolator((val_x,val_y), val_data.ravel())
inp_near_data=inp_near((x,y))

#プロット
fig, ax=plt.subplots(1,3, figsize=(10,10))
datas=[data, inp_line_data, inp_near_data]
titles=['Original','Linear Inp','Nearest Inp']
for a,data, title  in zip(ax, datas, titles):
    a.imshow(data,cmap='jet')
    a.set_title(title)
```
##結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997363/18a39b65-bc3e-85f6-ac8c-c27364bec04a.png)
##その他
np.nanの箇所のマスクをつくるとき`mask=(data==np.nan)`はダメ。 
`np.nan==np.nan`は**False**。
`np.nan is np.nan`は**True**ですが、`data is np.nan`はデータ全体とnp.nanの比較なので**False**。
[`np.ma.masked_invalid`]("https://numpy.org/doc/stable/reference/generated/numpy.ma.masked_invalid.html") を使いましょう。
そもそも、"プログラミング"ってなに? #1

<p>初めまして、里芋のすり身です。とろろが好きでこの名前にしました(笑)。北海道在住の大学生で、最近アフィリエイトやQiitaなど、色々なことを発信し始めました！業界では新参者ですが、今後ともよろしくお願いします！
<h2>第一章 プログラムって難しそう...</h2>
<p>"プログラミング"という言葉を最近よく耳にするようになってきました。一番身近なところで言えば、「小学校でのプログラミング授業の開始」でしょうか。また、大学でもプログラミングは一般化してきてますね。そこで根本の疑問</p>
<h6>プログラミングってそもそも何なの？</h6>
<p>絶対誰もが一度思いますね。この答え、端的に言えば</p>
<h6>機械に、〇〇しろ！</h6>
<p>と、命令することです。人それぞれ、色々な捉え方がありますが、一つ、ここは「機械に命令すること」としましょう。(機械と会話するタイプの人も業界には結構います。割と普通です。後機械学習の進歩で、人間が自ら望んで作ってはいないものを機会が作っている場合があります。この辺の話は難しいので、今日はとりあえず触れないこととします。)
</p>
<p>第1章はここまでです。第2章では、プログラミングをすることで出来ることについて話したいと思います。</p>
AudioWorkletでレコーダーを作る

AudioWorkletで録音します。

```RecorderNode.js
export default class RecorderNode extends AudioWorkletNode {
  constructor(audioCtx){
    super(audioCtx, 'recorder-processor');
    this.buffers = []; //processorから受け取ったFloat32Arrayを貯める
    this.port.onmessage = e => this.buffers.push(e.data);
  }
  
  //Float32Arrayの配列を繋げて新しいFloat32Arrayを返す
  mergeBuffers(buffers){
    const sampleLength = buffers.reduce((acc, buf) => acc + buf.length, 0);

    const array = new Float32Array(sampleLength);
    let sampleIdx = 0;
    for (let i = 0; i < buffers.length; i++) {
      for (let j = 0; j < buffers[i].length; j++) {
        samples[sampleIdx] = buffers[i][j];
        sampleIdx++;
      }
    }

    return samples;
  }
  
  //this.buffersを繋げたFloat32Arrayを取得
  getData(){
    const samples = this.mergeBuffers(this.buffers);
    this.buffers = [];
    return samples;
  }
}
```

```RecorderProcessor.js
class RecorderProcessor extends AudioWorkletProcessor {
  process(inputs){
    const inputData = inputs[0][0];
    if(inputData instanceof Float32Array)
      this.port.postMessage(inputData.subarray());
    return true;
  }
}

registerProcessor('recorder-processor', RecorderProcessor);
```

```index.html
<html>
<script type="module">
import RecorderNode from 'RecorderNode.js';

window.onload = async ()=>{
  const audioCtx = new AudioContext();
  await audioCtx.audioWorklet.addModule('RecorderProcessor.js');

  //マイク入力を取得
  const stream = await navigator.mediaDevices.getUserMedia({video: false, audio: true});
  const streamNode = audioCtx.createMediaStreamSource(stream);
  const recorderNode = new RecorderNode(audioCtx);

  //マイクを接続した時点で録音が始まる
  streamNode.connect(recorderNode).connect(audioCtx.destination);

  //10秒後にAudioBufferSourceNodeで録音したデータを再生
  setTimeout(()=>{
    streamNode.disconnect();
    recorderNode.disconnect();
    const samples = recorderNode.getData(); //録音したデータ(Float32Array)
    const audioBuffer = audioCtx.createBuffer(1, samples.length, audioCtx.sampleRate);
    audioBuffer.copyToChannel(samples, 0);
    const source = audioCtx.createBufferSource();
    source.buffer = audioBuffer;
    source.start();
  }, 10000);
}
</script>
</html>
```
サーバーが遅すぎる。原因を解明する

#○Apacheのエラーログを確認

```
# tail /var/log/httpd/error_log

[Mon Sep 20 20:41:11.696658 2021] [proxy_fcgi:error] [pid 139115:tid 140257685120768] (70007)The timeout specified has expired: [client 182.167.223.71:58268] AH01075: Error dispatching request to : (polling), referer: https:〜〜〜〜〜〜〜〜
```

Apacheのエラーログを確認します。

ここに答えがありました。

```
The timeout specified has expired
```

```
Error dispatching request to : (polling), referer
```

#○解決していく

##php-fpmの再起動をする

```
# service php-fpm restart
```

###php-fpmとは？

https://www.php.net/manual/ja/install.fpm.php

https://uteee.com/system/966/

## php-fpmの設定ファイルの修正

php-fpmの設定ファイルです。

```/etc/php-fpm.d/www.conf
- pm.max_spare_servers = 35
+ pm.max_spare_servers = 10
```

アイドル状態でプーリングしているプロセス数の最小値を意味します。

こちらを、```35➡️10```に変更。

その後、ConoHa VPSのサーバーを再起動すると速度が戻りました。

https://pandanote.info/?p=3060
var vs let vs const 

<h2>はじめに</h2>
ふとvar let const の違いを聞かれたときにはっきりと分からなかったので、
調べてここにアウトプットします。

<h2>そもそもvar let constとは</h2>
全てJavascriptにて***変数宣言をする際に使うキーワード***

その中で、letとconstはECMAScript2015から採用された***新しい宣言記法***。

<h2>var let constの違い</h2>
全て変数宣言に使われる記述ですが、3つの要素に違いがあります。

<h4>１再代入、再宣言が可能か</h4>
再代入...すでに宣言していた変数に、値を再び入れなおすこと
再宣言...すでに宣言していた変数の名前を、キーワードごと丸っと宣言しなおして、上書きすること


<h5>再代入</h5>

var


```javascript
var techacademy = '代入1回目';
techacademy = '代入2回目' //再代入時にvarのキーワードを書かない
```

let

```javascript
let techacademy = '代入1回目';
techacademy = '代入2回目' //再代入時にvarのキーワードを書かない
```

const

```javascript
const techacademy = '代入1回目';
techacademy = '代入2回目' //エラーとなり実行できない
```


***constのみ再代入ができません***。
再代入をできるだけ少なくすることで、変数の中身が明確になり、見通しの良い読みやすいコードができます。そこから生まれる予期せぬ挙動を防ぐこともできるため、極力constを使うようにします。


<h5>再宣言</h5>
宣言の上書きを行うため、Javascriptで再宣言をしてしますと予期せぬエラーを招きます。
コードの読みやすさを低下させることからも、通常は避けられています。

***再宣言が可能なのはvarのみです。***

```javascript
var techacademy = '宣言1回目';
//一度宣言した後に、再度同じ変数名で宣言しなおせる
var techacademy = '宣言2回目'
```

letとconstでは、再宣言をするとエラーになります。
再宣言をして思わぬバグを生むことを防げるため、let,constを使うのが良いです。

<h4>２スコープの違い</h4>
スコープ...「変数の有効範囲」のこと
宣言した変数は、コードのどこでも使えるわけではなく、一定の決められた範囲でのみ使えます。

<h5>varは関数スコープ</h5>
varは、let constに比べて広いスコープを持っています。
ある関数内でvarを用いて宣言した変数は、その関数をどこからでも呼び出すことが可能です。


```javascript
const testFunc = () => {
if(true){
....
 var x = 1
}

console.log(x) //条件式の中で定義されたxも、条件外で呼び出しても、関数内なので1が表示される
```



<h5>let, constはブロックスコープ</h5>
ブロック...{}で括られた処理のこと

let,constの場合は、同じ関数内であってもブロック外側からは変数を呼び出せません。

```javascript
const testFunc = () => {
//ifが{}のブロック
if(true){
....
 let x = 1
 const y = 2
}

 console.log(x) //ブロックの外側なのでundefined(未定義)となる
  console.log(y) //constを使った場合も同様にundefinedとなる
```

より狭いスコープであると、その変数がどこから来たものなのか、どう使われているかが明確になります。バグを起こしずらい記述となり、let,constの方が望ましいです。



<h2>var let constの使い分け</h2>


<h4>基本的にconst</h4>
再宣言・再代入のどちらもできない事に加えて、スコープも狭いconstは最も制約が多いです。そのことより、予期せぬ実装を防ぐことができ、安全なキーワードといえまず。
基本はconstを使います。

<h4>constを使えないときにlet</h4>
基本的にはconstを使いますが、やむを得ずletを使う必要があるときもあります。

例えば、繰り替えし行われる処理に対して、合計で何回行ったかカウントを取りたい場合などは、letの再代入可能という仕様が活用できます。

```javascript
let totalClicked = 0;

window.addEventListener('click', () => {
 //++を使うと、現在の値に1足した数を再代入できる
  totalClicked++;
  console.log(totalClicked); //5回クリック済みであれば、5と表示される
})

```

<h4>varは基本使わない</h4>
varを使うべきケースはほぼありません。

ネット上でコードを読むときに出くわすことがあるため、その時に読めるように最低限の知識を持つだけで良さそうです。




<h2>注意点</h2>

<h4>constの配列の値は変えられる</h4>


>const 宣言は、値への読み取り専用の参照を作ります。その値が不変ということではなく、その変数識別子が再代入できないというだけです。たとえば、定数がオブジェクトのコンテンツの場合、オブジェクトのコンテンツ(例 その引数)自体は変更可能です。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/const

このように、
「配列そのもの」を交換するとエラーとなりますが、配列の「中身」を変えることはできます。
「再代入」は不可能ですが、***改変は可能***です。


```javascript
const test = []
test = [] //エラー

```
python初学者の備忘録　ビット演算子について

#### [←目次](https://qiita.com/dondondon/items/cd45224ca93e65c976cc)

:::note info
python,Qiita初心者なので、備忘録として記載していきます。
なにせ初心者なので、知識不足はご容赦ください。
知識を深めながら追記していきたいと思います。
:::

# ビット演算子とは
`基本`

+ 整数でのみ利用可能
+ 整数に対してビット単位で論理演算を行う演算子
+ 2進数で表した整数型の値の各ビットに対して、それぞれ論理積、論理和、排他的論理和、ビット反転、ビットシフトを行う

:::note info
・ビットとは二つの選択肢から一つを特定する情報量の最小単位
　※語源は "[ bi ]nary digi[ t ]" （二進法の数字）
・整数を2進数で表示したときの一桁、一桁のことをビット(bit)という
・2進数なので必ず0か、1になっており、2進数の桁ごとに論理演算することをビット演算という
:::

##### 以下の演算子がある

<table>
    <tr>
        <th style="text-align: center;">演算子</th>
        <th style="text-align: center;">式</th>
        <th style="text-align: center;">説明</th>
    </tr>
    <tr>
        <td style="text-align: center;"> & </td>
        <td>a & b</td>
        <td>AND:論理積(aもbも1のビットが1)</td>
    </tr>
    <tr>
        <td style="text-align: center;"> | </td>
        <td>a | b</td>
        <td>OR:論理和(aまたはbが1のビットが1)</td>
    </tr>
    <tr>
        <td style="text-align: center;"> ^ </td>
        <td>a ^ b</td>
        <td>XOR:排他的論理和(aまたはbが1のビットが1)</td>
    <tr>
        <td style="text-align: center;"> ~ </td>
        <td>~ b</td>
        <td>ビット反転</td>
    </tr>
    <tr>
        <td style="text-align: center;"> >> </td>
        <td>a >> b</td>
        <td>b ビット右シフト</td>
    <tr>
        <td style="text-align: center;"> << </td>
        <td>a << b</td>
        <td>b ビット左シフト</td>
    </tr>
</table>

##### 論理積（AND）、論理和（OR）、排他的論理和（XOR）の各ビットに対する入力と出力の関係は以下の表の通り

| 入力a| 入力b | AND | OR | XOR |
|:-:|:-:|:-:|:-:|:-:|
| 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 0 | 0 | 0 | 0 | 0 |

##### `AND（論理積）`：& 演算子
```python
>>> 1 & 1
1
```

##### `OR（論理和）`：| 演算子
```python
>>> 1 | 1
1
```

##### `XOR（排他的論理和）`：^ 演算子
```python
>>> 1 ^ 1
0
```

##### `ビット反転`：~ 演算子
```python
>>> ~ 1
-2
# 単純に各ビットを反転した値ではなく、~aは-(a+1)となる値を返す
```

##### `ビット右シフト`：>> 演算子

:::note info
指定した桁だけ右にずらして、最下位より先に押し出されたビットは消える
:::

| 入力| 出力 | 2進数 |
|:-:|:-:|--:|
| 5>>0 | 5 | '0b101' |
| 5>>1 | 2 | '0b10' |
| 5>>2 | 1 | '0b1' |
| 5>>3 | 0 | '0b0' |


##### <div>`ビット左シフト`：<< 演算子</div>

:::note info
指定した桁だけ左にずらして、空いたビットには0が入る
:::

| 入力| 出力 | 2進数 |
|:-:|:-:|--:|
| 5<<0 | 5 | '0b101' |
| 5<<1 | 10 | '0b1010' |
| 5<<2 | 20 | '0b10100' |
| 5>>3 | 40 | '0b101000' |