OmniAICreator/Qiita-1.07M huggingface dataset:
gitの基本的な操作

# Gitを設定する
```
git config
```
Gitの設定ファイルにある変数の値を設定する。
設定ファイルの変数には３種類ある。

## gitの設定ファイル(の種類
### そのマシン全体に対する設定
```etc/gitconfig```
### ユーザーごとの設定
```~/.gitconfig```
### プロジェクトごとの設定
```.git/config```
## 思ったこと
ファイルの種類で設定が変わる。

これらのファイルの設定を変えるためにはオプション引数が必要となる。
## オプション引数
### --global
```~/.gitconfigの設定（ユーザーごとの設定)```を変えることができる。
### --system
```/etc/gitconfigの設定（そのマシン全体の設定)```を変えることができる。
### オプション引数なし
```.git/configの設定(プロジェクトごとの設定)```を変更できる。

## Gitを始める前にする設定
ユーザーごとの設定(~/.gitconfig)名前とメールアドレスは設定すると良い
```
git config --global user.name "hogehoge"
git config --global user.email "hogehoge@hogehoge"
```
また自分が普段使っているエディタ、画面表示の色を指定する。
```
git config --global core.editor emacs
git config --global color.ui auto
```
この場合エディタはemacs、画面表示の色は何かしらした。
しかし
画面表示に色がついて見やすいらしい。

# 演習
## git config --globalを使って名前とメールアドレスを設定しよう
```
**********@mbp training % git config --global user.name "*******"
+******@mbp training % git config --global user.email "****************"
```
## git config --globalを使って、普段使っているエディタを設定しよう。
```
***********@mbp training % git config --global core.editor ******
************@mbp training % git config --global color.ui auto
```

## git config --global -lを使って正しく設定されたかを確認する。
```
＊＊＊＊＊＊＊＊＊＊@mbp training % git config --global -l
user.name=*****
user.email=*********************
init.defaultbranch=*******
core.excludesfile=/Users/**********/.gitignore_global
core.editor=**********
difftool.sourcetree.cmd=***************
difftool.sourcetree.path=
mergetool.sourcetree.cmd=***************
mergetool.sourcetree.trustexitcode=********
color.ui=auto
```
なんだかわからないが設定されたらしい。

出典 わかるGIT(福永　和人著）
Amazon Linux 2 に MySQL 8.0 をインストールするメモ

手順を良く忘れるのでメモ。
記事執筆時の情報なので、時間経過と共に変わる点には注意。

```bash
# el7-6 の 6 の部分は今後数値が変わることがある
$ sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm
# yum が動かないケースがあったので、その場合は以下のコマンドで
# $ sudo rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm
# GPG鍵が 2022 年に更新されているのでアップデート
$ sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
# mysql をインストール (ここではクライアントのみ)
$ sudo yum -y install mysql
```

# 参考

https://blog.katsubemakito.net/mysql/mysql-update-error-gpg
【COBOL】COBOLのCALL・USING・LINKAGE  わかりやすく

# コード
```javascript
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.
DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 NUM PIC 9(3) VALUE 111.
PROCEDURE DIVISION.
CALL "SUB" USING NUM.
DISPLAY NUM.
END PROGRAM MAIN.


IDENTIFICATION DIVISION.
PROGRAM-ID. SUB.
DATA DIVISION.
  LINKAGE SECTION.
    01 NUM    PIC 9(3).
PROCEDURE DIVISION USING NUM.
MULTIPLY  NUM  BY  2  GIVING  NUM.
END PROGRAM SUB.


```

# 結果
```
222
```
selectで検索機能optionで選択した月のデータを保持しながら対象の月に遷移させるには

はじめに
---
先日、投稿検索機能を実装する機会があり、はまってしまったので備忘録として記載しました。


概要
--
Laravelでプルダウン検索機能のような実装依頼があり、実装にあたり以下の条件がありました。
・プルダウンを選択するタイミングで画面を遷移させる(検索ボタンを配置させない)
・現状、ある程度の検索機能は実装済み(コントローラ等)だが、対象の月を選択すると遷移時に選択した値が保持されない
（例えば、4月と５月を選択できるプルダウンがあり初期値は現在月）


解決コード
--
半日くらい費やしながら調べに調べ尽くした結果が、以下のコードです
```php:index.blade.php
 <form method="GET" action="{{ route('article.search') }}">
  @csrf
  {{-- プルダウンカテゴリ検索 --}}
   <div class="article-search-container">
      <div class="article-search">
       <select name="article_date" onchange="this.form.submit()">
           @foreach ($datemonths as $key => $datemonth)
              <option value="{{ $datemonth }}"  @if(old('article_date', $article_date ?? '') == $datemonth) selected @endif>
                 {{ $datemonths_kanji[$key] }}
              </option>
           @endforeach
       </select>
     </div>
   </div>
</form>

```
解説
--

### プルダウンを選択するタイミングで画面を遷移させる(検索ボタンを配置させない)

プルダウンを選択するタイミングで画面を遷移させる(検索ボタンを配置させない)ですが、こちらはJavaScriptのonchangeメソッドをselectタグに以下を記載すると動作しました。

selectタグのoptionが変更されるとJavaScriptのonChangeが検知してsubmitされるようになってます。
こちらのthisですが、Windowオブジェクトを参照してます。

```php
<select name="article_date" onchange="this.form.submit()">
```

### 対象の月を選択すると遷移時に選択した値が保持されない

現状、ある程度の検索機能は実装済み(コントローラ等)だが、
（例えば、4月と５月を選択できるプルダウンがあり初期値は現在月）

以下のコードで問題解決しました。

```php
 <option value="{{ $datemonth }}"  @if(old('article_date', $article_date ?? '') == $datemonth) selected @endif>
     {{ $datemonths_kanji[$key] }}
 </option>

```
こちらのコードを解説すると、old関数に第二引数を登録すると初期値を登録するとことができます。
つまり、oldの第二引数が存在していたら、＄article_dateと$datemonthを比較できます。

```php
    @if(old('article_date', $article_date ?? '') == $datemonth) selected @endif
```

まとめ
---
上記のコードで私は問題解決できました。
状況によっては解決できない場合は改善していくのが、ベストですね
jsPsychのシミュレーションモード

jsPsychのバージョン7.1より、新たに[シミュレーションモードが備わりました。](https://www.jspsych.org/7.2/overview/simulation/)

この記事ではシミュレーションモードとは何か、そしてその使い方について簡単に解説します。

# シミュレーションモードとは

jsPsychを使った実験（調査）プログラムが完成したあとに、予期したとおりにプログラムが動作しているか、そして適切にデータが保存されているかを確認するためのモードです。通常、プログラムが完成したあとに、自分自身が実験参加者になったつもりで動作確認をすると思いますが、シミュレーションモードでは、回答を自動化することができます。さらに「最初の試行ではFキーを500msの反応時間で押したことにする、次の試行ではJキーを700msの反応時間で押したことにする」というように反応を細かく指定することも可能です。

シミュレーションモードはプラグインごとに備わっています。もし利用中のプラグインがシミュレーションモードに対応していない場合、そのプラグインを使ったところだけ通常のプログラムとして動作します（つまり、実際にキー押しなどで反応する必要があります）。

jsPsychのシミュレーションモードには、データの記録だけを確認するdata-onlyモードと、実際に刺激が呈示されるvisualモードの2つがあります。

# data-onlyモード
データの記録だけを確認するモードです。利用しているすべてのプラグインがdata-onlyモードに対応してる場合、プログラムの起動と同時にプログラムが終了しますが、すべての試行に対して仮想的な反応が記録されます。

例えば条件分岐をしていたり、特定の試行を繰り返したりしている場合に、予期通りにプログラムが動作しているかを確認することができるので便利です。

# visualモード

このモードでは、刺激の呈示は通常通り行われます。通常の動作と異なるのは、キー押しなどの反応をする必要がないということです。実験プログラムが適切に完成しているかを確認したいときには、data-onlyモードよりもvisualモードのほうが有益かもしれませんね。

# 使い方

使い方はいたって簡単で、基本的には通常のプログラムで`jsPsych.run()`としているところを`jsPsych.simulate()`に変更するだけです。このまま（デフォルト）だと、data-onlyモードで動作します。以下のように記述することで、モードを指定することが可能です。なお`timeline`には、あらかじめすべての試行に関する情報が格納されているとします。

```javascript
jsPsych.simulate(timeline, "data-only");
jsPsych.simulate(timeline, "visual");
```

ある試行で反応時間を500msとしてシミュレートしたいときには次のように記述します。この場合、反応キーはランダムに選ばれます。

```javascript
const trial = {
  type: jsPsychHtmlKeyboardResponse,
  stimulus: '<p>Hello!</p>',
  simulation_options: {
    data: {
      rt: 500
    }
  }
}
```

反応時間について特に記述をしない場合にはランダムな数値が割り当てられます。もし細かく設定を行いたい場合には、[sampleExGaussian関数](https://www.jspsych.org/7.2/reference/jspsych-randomization/#jspsychrandomizationsampleexgaussian)を使用します。ex-Gaussian分布について、私はあまり詳しくはないので専門書を参考にしてもらいたいのですが、正規分布と指数分布を足し合わせた分布で、実際の反応時間の分布（正の歪みを持つ分布）によくあてはまることが知られています。参考になりそうなウェブサイトをご紹介しておきます。

- [分布のフィッティングによる反応時間データの解析](http://noucobi.com/neuro/RTanalysis/S2.html)
- [RT分布のex-Gaussianによる分析 ―データ解析演習―](https://cogpsy.educ.kyoto-u.ac.jp/personal/Kusumi/datasem13/hiroi.pdf)

# デモプログラム
jsPsychのexamplesフォルダに、次の2つのデモプログラムが入っています。
- [simulation-data-only-mode.html](https://github.com/jspsych/jsPsych/blob/main/examples/simulation-data-only-mode.html)（プログラムを実行するとすぐに終了します）
- [simulation-visual-mode.html](https://github.com/jspsych/jsPsych/blob/main/examples/simulation-visual-mode.html)（テキストボックスに自動で回答が埋め込まれる動作がカッコイイです）

# まとめ

正直なところ、自分で作ったプログラムがきちんと動くかどうかを確認することが目的であれば、シミュレーションモードを使用するよりも、どのような刺激が画面に呈示されたか、またどのような反応をしたかを紙にメモをしてプログラムの出力結果と照らし合わせたほうがよいと思います。反応時間についても、ストップウォッチを使って実測値とプログラムの結果に大きなずれがないかを確認することをお勧めします。

私は詳しくないのですが、心理モデルを検証したいときなどに今回ご紹介したシミュレーションモードを活用できるかもしれません。

ところで私は[jsPsychで心理物理学実験を行うためのプラグイン](https://jspsychophysics.hes.kyushu-u.ac.jp/)の開発者なのですが、このプラグインの最新版（バージョン3.3.0以上）でシミュレーションモードに対応しましたので、あわせてご連絡をしておきます。
Spatie laravel-data ライブラリ 導入方法

# 概要

- laravel-dataの導入方法をまとめる。

# 方法

1. アプリケーションディレクトリで下記コマンドを実行する。

    ```terminal
    $ composer require spatie/laravel-data
    ```

1. 下記コマンドを実行して設定ファイルを使える状態にする。

    ```terminal
    $ php artisan vendor:publish --provider="Spatie\LaravelData\LaravelDataServiceProvider" --tag="data-config"
    ```

# 参考文献

- [https://spatie.be/docs/laravel-data/v1/installation-setup](https://spatie.be/docs/laravel-data/v1/installation-setup)
forEach 第二引数　 }, list);　のやつ

foreachの第二引数とは、と調べたら良いのを見つけたので張っておく。

https://it-kyujin.jp/article/detail/1539/

>let array = ['東京','大阪','仙台','名古屋'];
array.forEach(function(value) {
   console.log(value + 'のローマ字表記は'+ this[value] +'です');
 },list);
WindowsにSikuliX 2.0.5をインストールする

Windows PC に SikuliX 2.0.5 をインストールしてみたんですが、2.0.4 と 2.0.5 では少し手順が変わっているようでしたので、忘れないうちに手順をまとめます。

# SikuliX とは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/012c911d-f0aa-7fee-e373-0f035d57a531.png)

SikuliX とはGUI操作を自動化するツールです。
これを使うと、 **GUI操作のテストを自動化できます！**


# インストール手順

## JDK のインストール

まずは、Java8 に対応した JDK のインストールが必要です。
OracleJDK はライセンス的に微妙なので、 Amazon Coretto 8 を私は導入しています。（この辺は好みで変えてください）

Coretto のインストール方法は、私が以前記事を書いていたので、こちらをご参照ください。

https://qiita.com/segur/items/0f799a61e4ee793d75d6

## SikuliX IDEのダウンロード

https://raiman.github.io/SikuliX1/downloads.html を開きます。

`Download the ready to use sikulixide-2.0.5.jar (SikuliX IDE for all systems)` をクリックし、 `sikulixide-2.0.5.jar` をダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/4d4225e4-d267-0564-ede9-4080520e170b.png)

## SikuliX IDEのインストール

Cドライブ直下に `sikuli` フォルダーを作成し、その中に `sikulixide-2.0.5.jar` を設置してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/83d122c9-3a3b-de09-0cfd-fdb95065dffa.png)

設置した `sikulixide-2.0.5.jar` をダブルクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/4d04fb0c-4518-b9c3-b78b-275a99077f82.png)

上記のように `SikulixIDE-2.0.5` というウィンドウが表示されれば成功です！


# さいごに

同僚でQAエンジニアの [uechan](https://twitter.com/uechang16) さんがテストの自動化を推進しており、その過程で SikuliX を導入しました。

私が開発を担当しているWebアプリは、単体テストが多少あるものの、GUI操作のテストは手作業に頼っている状況でした。
SikuliX を導入したことで、手作業が減ったため、重宝しています！

本記事作成にあたり、以下の記事を参考にさせていただきました。ありがとうございました。

- [SikuliX Downloads](https://raiman.github.io/SikuliX1/downloads.html)
- [【2020 年最新版】Sikulix インストール・セットアップ方法！入門者向けに図説](https://auto-worker.com/blog/?p=61)
RANSACで直線検出

## RANSACとは
外れ値の影響を除外してモデルのパラメータを推定する手法。[こちら](https://qiita.com/smurakami/items/14202a83bd13e55d4c09) に最小二乗法とRANSACの比較があり分かりやすいです。

## アルゴリズム
ここでは直線検出を例にします。
1. 検出範囲内の点群データから2点をランダムサンプリング
1. 選んだ2点を結ぶ直線の傾きと切片を算出
1. 検出範囲内の点群データの1点にコスト関数を適用
1. コスト関数の結果が、閾値以下となったデータ数をカウント
1. 1~4を繰り返し、カウント数が最大となった傾きと切片を推定値とする
### コスト関数
直線検出では、[点と直線の距離の公式](https://www.google.com/search?q=%E7%82%B9%E3%81%A8%E7%9B%B4%E7%B7%9A%E3%81%AE%E8%B7%9D%E9%9B%A2&source=lmns&bih=587&biw=1280&hl=ja&sa=X&ved=2ahUKEwjwi6ionK31AhX_yIsBHXKBC5wQ_AUoAHoECAEQAA)を用いる。
$$
d=\frac{|ax+by+c|}{\sqrt{a^2+b^2}}\tag{1}
$$
コスト関数次第で、どんな形状も検出することができる。
## 実装
2DLidar点群から壁までの距離と角度を推定するプログラムを作りました。
LidarはUTM30LXを使用しています。

```py
#!/usr/bin/env python
import rospy
from sensor_msgs.msg import LaserScan
import random
import numpy as np
import math

# UTM30LX
reso = math.radians(0.25)
bias = math.radians(45)
# parameter
min_range = 440 # Lidarの探索範囲
max_range = 640 # Lidarの探索範囲
interation = 100
threshold = 10 # 閾値[mm]

def ransac(msg):
    best_p_cnt = 0
    for i in range(interation):
        ## 全データから2点をランダムサンプリング
        rp1 = np.random.randint(low = min_range, high = (len(msg.ranges) - 1) / 2 - 1)
        rp2 = np.random.randint(low = (len(msg.ranges) - 1) / 2 , high = max_range)
        rp1_dist = msg.ranges[rp1] * 1000.0
        rp2_dist = msg.ranges[rp2] * 1000.0
        rp1_y = rp1_dist * math.sin(rp1 * reso - bias)
        rp1_x = -1.0 * rp1_dist * math.cos(rp1 * reso - bias)
        rp2_y = rp2_dist * math.sin(rp2 * reso - bias)
        rp2_x = -1.0 * rp2_dist * math.cos(rp2 * reso - bias)
        ## 選んだ2点から傾きと切片を算出
        slope = (rp2_y - rp1_y) / (rp2_x - rp1_x)
        intercept = rp1_y - slope * rp1_x
        p_cnt = 0
        ## 全データにコスト関数を適用
        for j in range(rp1, rp2):
            p_dist = msg.ranges[j] * 1000.0
            p_y = p_dist * math.sin(j * reso - bias)
            p_x = -1.0 * p_dist * math.cos(j * reso - bias)
            ## コスト関数
            d = math.fabs(slope * p_x - p_y + intercept) / math.sqrt(slope**2 + 1**2)
            ## コスト関数の結果が、閾値以下となったデータ数をカウント
            if d <= threshold:
                p_cnt += 1
        if p_cnt > best_p_cnt:
            best_p_cnt = p_cnt
            best_slope = slope
            best_intercept = intercept
    deg = math.degrees(-math.atan(best_slope)) 
    dist = best_intercept * math.cos(-math.atan(best_slope))
    print(deg, dist)

rospy.init_node('ransac')
scan_sub = rospy.Subscriber('scan', LaserScan, ransac)
rospy.spin()
```
カラム名に予約語を使ってしまっている場合のインサート方法

メモ

カラム名に予約語を使ってしまっている場合に、データをインサートしようとすると以下のエラーがでてしまった。

"SQLSTATE[42000]: Syntax error or access violation: 
to your MariaDB server version for the right syntax to use near 'fro line 1"



Entityファイルの

        /**
         * @var string
         *
         * @ORM\Column(name="`from`", type="decimal", precision=12, scale=2, options={"unsigned":true})
         */
        private $from;

name="" の中のカラム名に`を付けるだけ

カラム名を変更したくないと思い、解決策を探していたら1時間以上かかった。。。

予約語って名前自体聞いたことがなかったので調べるのに苦労しました
「反応しないカラム名」、「カラム名　効かない」、「カラム名　構文エラー」とか・・・。
Next SWCエラーによる解決方法(本題はESLint)

# 初めに
今回はNext.jsがversion12になったことによって、SWCエラーの解消方法を備忘録として以下に記載したいと思います

本題は`yarn eslint`実行時にエラーになってしまうときの解消方法ですが、良く出るエラーについても記載しておきます

# SWCエラー
`create-next-app`でプロジェクトを作成後に`yarn build`または`npm run build`を実行すると
```
error - Failed to load SWC binary
```
と出る方がいると思います。

解消方法は以下の通りです


まず`swcMinify: false`を`next.config.js`に追記することでSWC挙動を停止させます。

```js
// next.config.js

module.exports = {
  swcMinify: false // 追記
}
```

SWCを停止させるとコンパイルするものがなくなるので、代わりとなるもの（ここではbabel）を用意します
公式サイトでも`.babelrc`を使用した方法が記載ので詳細はそちらをご覧ください

```
// .babelrcファイルを作成し以下を追記
{
  "presets": ["next/babel"]
}
```

# SWC→babelに変更したことによるeslintのエラー
ここで本題ですが、babelに変更したことによって正しく設定をしないとエラーが発生してしまい、eslintに関しても同様です
ここに関しては、色んなサイトを参照したのですが、解決策を見つけることができませんでした
なので、色々試した結果以下の記載方法で解決できたので備忘録として残します

`yarn eslint`を実行したら以下エラーが出ました
```
Parsing error: Cannot find module 'next/babel'
```

まずは色んなサイトに記載されていた解決方法で試してみます

```json-doc
// .eslintrc
{
  "extends": ["next", "next/core-web-vitals", "prettier", "next/babel"]
}
```

また`yarn eslint`で実行。。。
```
Parsing error: Cannot find module 'next/babel'
```

同じエラーが出る。なぜ？

### 解決方法
`.eslintrc`の`next/babel`を消去する
```json-doc
// .eslintrc
{
  "extends": ["next", "next/core-web-vitals", "prettier"]
}
```

これでできました！
他の`yarn dev`などのコマンドでもエラーが出ていないことも確認できました

どれも`next/babel`を追記したら問題ないとの記事が多く四苦八苦しました

StackOverflowの記事で同じような問題になった方がいたのでご参考までにURLを後で載せておきます

根本的な原因は不明ですが、同じような問題で解決策が見つからないという方は、こちらの記事を解決策の一つとして試してみては如何でしょうか？

# 参考記事
公式：https://nextjs.org/docs/advanced-features/customizing-babel-config
StackOverflow：https://stackoverflow.com/questions/68163385/parsing-error-cannot-find-module-next-babel
Zenn：https://zenn.dev/shimotaroo/articles/c8f2e751cd7877
Kaggle Titanic問題 初投稿の作業メモ

## 概要
「ゼロから作るDeep Learning」をやって少しDeep Learningの世界に興味を持ったので、KaggleのチュートリアルであるTitanic問題をやってみた。
目的は、Kaggleの参加・分析・提出までの流れの把握で、分析精度はあまり求めていない。 
(今回はクイックに「各変数と目的変数の'Survived'との相関係数のチェック」⇒「上位2~3変数を特徴量としてLogisticRegressionを用いて予測」し、予測モデルの発射台として作成)

## 分析流れ
* trainデータの概要(型・中身等)の確認
* 各変数と目的変数(Survived)の関係を確認
* trainデータの前処理
* モデリング
* 結果出力


## trainデータの概要(型・中身等)の確認
```py
# ファイル読み込み
train = pd.read_csv("dataset/train.csv", sep=",", index_col=0)  # 学習用データ
test = pd.read_csv("dataset/test.csv", sep=",", index_col=0)  # 評価用データ
submission = pd.read_csv("dataset/gender_submission.csv", sep=",", index_col=0, header=0)  # 応募用サンプルファイル

# trainデータの概要(型・中身等)の確認
train.info()
print(train.head())
print(train.describe())

```
train.info()によって、あー'Age'はNull補完しないとな～とか気づく。
|#|Column|Non-Null|Count|Dtype|
|:--|:--|:--|:--|:--|
|0|Survived|891|non-null|int64|
|1|Pclass|891|non-null|int64|
|2|Name|891|non-null|object|
|3|Sex|891|non-null|object|
|4|Age|714|non-null|float64|
|5|SibSp|891|non-null|int64|
|6|Parch|891|non-null|int64|
|7|Ticket|891|non-null|object|
|8|Fare|891|non-null|float64|
|9|Cabin|204|non-null|object|
|10|Embarked|889|non-null|object|


train.describe()によって、客室の等級('Pclass')の中央値は3だから過半数は一番下の3等客室に乗船していたんだ～とかデータのイメージがつかめる。
|-|Survived|Pclass|Age|SibSp|Parch|Fare|
|:--|:--|:--|:--|:--|:--|:--|
|count|891|891|714|891|891|891|
|mean|0.383838|2.308642|29.699118|0.523008|0.381594|32.204208|
|std|0.486592|0.836071|14.526497|1.102743|0.806057|49.693429|
|min|0|1|0.42|0|0|0|
|0.25|0|2|20.125|0|0|7.9104|
|0.5|0|3|28|0|0|14.4542|
|0.75|1|3|38|1|0|31|
|max|1|3|80|8|6|512.3292|

## 各変数と目的変数(Survived)の関係を確認
```py
# 各変数と目的変数(Survived)の関係を確認
print(pd.get_dummies(train).corrwith(train["Survived"]))
print(train[['Sex', 'Survived']].groupby(['Sex']).mean())
print(train[['Pclass', 'Survived']].groupby(['Pclass']).mean())
```

相関係数をざっくり見た結果、'Sex', 'Pclass'が生存率との相関が高いと判明。
|変数|相関係数|
|:--|:--|
|Pclass|-0.338481|
|Sex_female|0.543351|
|Sex_male|-0.543351|

たしかに性別毎の生存率を見てみると女性の方が圧倒的に助かっているのでレディーファーストで避難船に乗り込んだんでしょう(そういえば映画でもそういうシーンあったな)。
|Sex|Survived|
|:--|:--|
|female|0.742038|
|male|0.188908|

## trainデータの前処理
前項までで、Sex, Pclassを変数としてモデリングしようと判断したため、あとはDeep Learningの対的なNullに対して埋める作業を実施
```py
# trainデータの前処理
data = pd.concat([train, test])
data['Age'] = data['Age'].fillna(data['Age'].mean())  # Ageの欠損値は平均値を補完
data['Embarked'] = data['Embarked'].fillna(data['Embarked'].mode())  # embarkは最頻値を補完
data['Cabin'] = data['Cabin'].fillna(data['Cabin'].mode())  # Cabinは最頻値を補完
data = pd.get_dummies(data)

train = data.loc[train.index]
test = data.loc[test.index]
test = test.drop(["Survived"], axis=1)
```

## モデリング
LogisticRegressionを利用。
```py
# モデリング
train = train[["Survived", "Sex_female", "Sex_male", "Pclass"]]
test = test[["Sex_female", "Sex_male", "Pclass"]]
y = train["Survived"]  # 目的変数
X = train.drop(["Survived"], axis=1)
model = LogisticRegression()
model.fit(X, y)  # 学習
```

## 結果出力
出来たcsvファイルを提出していみると、Scoreは0.76555でした。
あとはハイパーパラメータの作成やアンサンブルをしてスコアを伸ばしていくというイメージでしょうか。
```py
# 結果の出力
pred = (model.predict_proba(test)[:, 1] >= 0.5).astype(int)  # 離散値化
print(pred[:5])
submission['Survived'] = pred
submission.to_csv('submit/submit_2.csv', header=True, sep=',')
```
【IAM】MFA設定するまでその他の機能を使わせないポリシー【AWS】

## MFA設定ユーザーのみに各操作権限を与えたい
新規にIAMユーザーを発行したが、MFAを設定するまでは各機能を触らせたくない（確実にMFA設定をしてもらいたい）場合がありました。

## ちょうどいいポリシーを公式で発見

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_iam_mfa-selfmanage.html

上記リンクよりピッタリのポリシーがありました。下記は引用なので変わる可能性があるので必ずリンク先をご参照ください。
中身を見てみると
`Allow~` というポリシーでMFAを設定できるようにしています。
最後の`BlockMostAccessUnlessSignedInWithMFA`ポリシーでMFAの設定がないとその他の機能をブロックするようにしています。
MFAの設定と書きましたが、正確にはMFAを利用したログインをしなかった場合にブロックをするので、MFA設定後、MFAを利用して再ログインする必要があります。
これで確実にMFAユーザーのみにAWSコンソールを触らせることが可能となりました。


```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowListActions",
            "Effect": "Allow",
            "Action": [
                "iam:ListUsers",
                "iam:ListVirtualMFADevices"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowIndividualUserToListOnlyTheirOwnMFA",
            "Effect": "Allow",
            "Action": [
                "iam:ListMFADevices"
            ],
            "Resource": [
                "arn:aws:iam::*:mfa/*",
                "arn:aws:iam::*:user/${aws:username}"
            ]
        },
        {
            "Sid": "AllowIndividualUserToManageTheirOwnMFA",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice",
                "iam:DeleteVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice"
            ],
            "Resource": [
                "arn:aws:iam::*:mfa/${aws:username}",
                "arn:aws:iam::*:user/${aws:username}"
            ]
        },
        {
            "Sid": "AllowIndividualUserToDeactivateOnlyTheirOwnMFAOnlyWhenUsingMFA",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice"
            ],
            "Resource": [
                "arn:aws:iam::*:mfa/${aws:username}",
                "arn:aws:iam::*:user/${aws:username}"
            ],
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        },
        {
            "Sid": "BlockMostAccessUnlessSignedInWithMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:ListMFADevices",
                "iam:ListUsers",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}
```
codepenの埋め込み　その２


# 概要

codepenの埋め込みをテストする。

# 参考にしたページ

https://qiita.com/flatsato/items/a4be862831372f881694

# サンプルコード

```
<p data-height="265" data-theme-id="0" data-slug-hash="RBXVQo" data-default-tab="css,result" data-user="harumi-sato" data-pen-title="選択の背景色をCSSで指定" class="codepen">
See the Pen 
<a href="https://codepen.io/harumi-sato/pen/RBXVQo/">
選択の背景色をCSSで指定
</a>
 by harumi-sato (<a href="https://codepen.io/harumi-sato">@harumi-sato</a>) on 
<a href="https://codepen.io">
CodePen
</a>.
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
```

# 結果

<p data-height="265" data-theme-id="0" data-slug-hash="RBXVQo" data-default-tab="css,result" data-user="harumi-sato" data-pen-title="選択の背景色をCSSで指定" class="codepen">
See the Pen 
<a href="https://codepen.io/harumi-sato/pen/RBXVQo/">
選択の背景色をCSSで指定
</a>
 by harumi-sato (<a href="https://codepen.io/harumi-sato">@harumi-sato</a>) on 
<a href="https://codepen.io">
CodePen
</a>
.
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# リンク

https://codepen.io/harumi-sato/pen/RBXVQo

以上。
【Ruby】二項係数(nCr)の素数modを求めるコード

# 結論
```Ruby:Ruby
# r<=0の挙動には注意
def nCrMod(n, r, mod)
  numerator = ((n - r + 1)..n).inject { |result, item| result * item % mod } # 分子
  denominator = (1..r).inject { |result, item| result * item % mod } # 分母
  puts numerator * (denominator.pow((mod - 2), mod))
end
```
急ぐ方が多いと思うので始めに持ってきました。
このコードに至る経緯や解説は下に書いていきます。

# はじめに
はじめまして、糸井と申します。
2022年4月に友人と競プロを始めてハマっています！
言語はRubyです。競プロで高みを目指すということも目標ですが、Rubyの経験を積むためにC++ではなくRubyを使っています。（競プロで高みを目指すだけなら、間違いなくC++を覚えた方がいいですね）

今回はAtCoderでたまに見るnCrの求め方と、それの素数のmodを求めたので記録しておこうと思います。

# 実際の問題
Knight [AtCoder Beginner Contest 145 D]
https://atcoder.jp/contests/abc145/tasks/abc145_d
```
問題文
二次元グリッドの原点 (0,0) にチェスのナイトの駒があります。
ナイトの駒はマス (i,j) にあるとき (i+1,j+2) か (i+2,j+1) の
どちらかのマスにのみ動かすことができます。
ナイトの駒をマス (X,Y) まで移動させる方法は何通りありますか？
10^9+7 で割った余りを求めてください。


制約
1≤X≤10^6
1≤Y≤10^6
入力中のすべての値は整数である。
```

ざっくりと解釈すると、"上に進んだ回数"と"右に進んだ回数"の二項係数問題になります。

# 10^6クラスの二項係数の求め方
壁となるのは計算時間です。愚直に計算するとTLEになりました。
解答はC++で書かれており、QiitaなどでRubyで書かれているものもコードを解読し切れませんでした。
その中で、なんとか真似できる解答を高級言語で書かれている記事を見つけました。

<b>Pythonで逆元を使ってnCr mod 1000000007を計算　</b>（コッコさん）
https://cocoinit23.com/ncr-mod-1000000007/

正直に言うと、逆元の定義や求め方、使い方に関しては完璧には理解できていません。かろうじて「かけ算の途中でmodを積極的に求めて良い」ということは理解しました。

コッコさんのPythonのコードからRubyに書き換えてみました。
```Ruby:Ruby
def nCrMod(n, r, mod)
  numerator = ((n - r + 1)..n).inject { |result, item| result * item % mod } # 分子
  denominator = (1..r).inject { |result, item| result * item % mod } # 分母
  puts numerator * (denominator.pow((mod - 2), mod))
end

```
これをコピペしてn, r, modを渡せばそのまま使えます。

「injectとpowって何だっけ？」という方はメモをどうぞ。
<details><summary>injectについて</summary><div>
Ruby 3.1 リファレンスマニュアル

https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/inject.html
list.injectはlistのたたみこみ演算をしてくれます。
```Ruby
p [2, 3, 4, 5].inject {|result, item| result + item }        #=> 14
```
リファレンスの例では2+3+4+5をしていますね。
　
</div></details>

<details><summary>powについて</summary><div>

Ruby 3.1 リファレンスマニュアル
https://docs.ruby-lang.org/ja/latest/method/Integer/i/=2a=2a.html
powはint.pow(x, y)でintをｘ乗し、計算途中でmod yを求めてくれます。
</div></details>

# 解答
上記を使って解いたのがこちらです。
```Ruby:Ruby
def knights()
  arr = gets.split(" ")
  x = arr[0].to_i
  y = arr[1].to_i

  if (x + y) % 3 != 0
    puts 0
  else
    # nCrMod
    n = (x + y) / 3
    r = x - n
    if r < 0 || y - n < 0　# rが負のとき(1..r)で実行時エラー。実際の解は0
      puts 0
    elsif r == 0 # r = 0 のとき同様にエラー。実際の解は1(nC0)
      puts 1
    else
      mod = 10 ** 9 + 7
      numerator = ((n - r + 1)..n).inject { |result, item| result * item % mod }
      denominator = (1..r).inject { |result, item| result * item % mod }
      puts numerator * (denominator.pow((mod - 2), mod)) % mod
    end
  end
end

knights()

```


nCr mod問題で詰まっているRuby使いさんに届けば幸いです。
【モンキーパッチ】管理画面生成gemのAdministrateで、NameError uninitialized constant


問題
-
Administrate gem
`0.16.0`

コントローラー
`app/controllers/admin/students/users_controller.rb`

モデル
`app/models/students/user.rb`



```
NameError: uninitialized constant Student::User
  File "/app/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.3/lib/active_support/inflector/methods.rb", line 284, in const_get
  File "/app/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.3/lib/active_support/inflector/methods.rb", line 284, in block in constantize
  File "/app/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.3/lib/active_support/inflector/methods.rb", line 280, in each
  File "/app/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.3/lib/active_support/inflector/methods.rb", line 280, in inject
  File "/app/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.3/lib/active_support/inflector/methods.rb", line 280, in constantize
  File "/app/vendor/bundle/ruby/2.6.0/gems/administrate-0.16.0/lib/administrate/resource_resolver.rb", line 16, in resource_class
  File "/app/vendor/bundle/ruby/2.6.0/gems/administrate-0.16.0/lib/administrate/resource_resolver.rb", line 24, in resource_title
  File "/app/vendor/bundle/ruby/2.6.0/gems/administrate-0.16.0/app/controllers/administrate/application_controller.rb", line 186, in translate_with_resource
  File "/app/vendor/bundle/ruby/2.6.0/gems/administrate-0.16.0/app/controllers/administrate/application_controller.rb", line 75, in destroy
  File "/app/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.3.3/lib/action_controller/metal/basic_implicit_render.rb", line 6, in send_action
```

backtraceを見ると、`Administrate::ResourceResolver#resource_class`あたりで例外が発生しているようだ。

解決策
-
`Administrate::ResourceResolver#controller_path_parts`にモンキーパッチをあてます。

```ruby
# lib/monkey_patches/administrate.rb

require 'administrate/version'
raise "Consider removing this patch" unless Administrate::VERSION == "0.16.0"

module Administrate
  class ResourceResolver
    def controller_path_parts
      path_parts = controller_path.split("/")[1..-1]
      path_parts[-1] = path_parts[-1].singularize
      path_parts
    end
  end
end

```


モンキーパッチの詳細について

https://techlife.cookpad.com/entry/a-guide-to-monkey-patchers


解説
-

gemのソースコードをみると、`Administrate::ResourceResolver`というクラスの機能で、コントローラーのパスから自動でリソースクラス(モデルクラス）を解決しているようです。

https://github.com/thoughtbot/administrate/blob/main/lib/administrate/resource_resolver.rb

例えば、`app/controllers/admin/students/users_controller.rb`というコントローラーであれば、自動で`Student::User`というクラスを使用するようになっています。

そう、全て単数形になってしまうんですね。以下の箇所が原因です。

```ruby
    def controller_path_parts
      controller_path.split("/")[1..-1].map(&:singularize)
    end
```

もし名前空間が複数形の場合(`Students::User`のように)、`Student::User`のような名前空間が単数形のクラス名が自動生成されると、名前解決できず`NameError uninitialized constant`が発生してしまうんですね。

そういうわけで、コントローラーのパスからモデル名を推測するさいに名前空間を単数形に変換しないようにすれば解決できるというわけです。
[GCP]GCPのMarketplace wordpressで作成したDBパスワード等の確認方法

GCPのMarketplaceで提供されているwordpressで環境を構築しました。
DBはCloud SQLではなく、Compute Engineのvmインスタンス内のmysqlに作成される模様。

GCEのDBのrootパスワードがわからなくなってしまい確認方法に困ったので自分用にメモ。

# 確認方法（2022/5/24時点）
マーケットプレイスから過去のデプロイ時の情報が見れるとのこと。

1. WEBブラウザでGCE管理コンソールにアクセスする
1. 確認したいプロジェクトを選択してクリックする
1. GCE管理コンソールのメニューバーにある検索入力ボックスで`marketplace`と入力する
1. 検索結果からショッピングカートアイコンの`マーケットプレイス`をクリックする
1. 「Wordpress」をクリックする
1. 「過去のデプロイメントを表示」ボタンをクリックする
1. テーブルの名前列で確認したい対象の名前リンクをクリックする
1. `Overview - 対象の名前`の下にあるWordpressロゴがついてるテキストをクリックする
1. 右側にパスワードなど各種情報が表示されます


# 余談：phpMyAdminのパスを変更する方法

phpMyAdminも入っているのですが、URLを変更する方法でも困ったのでついでにメモ

デフォルトのURL
`httpd://ドメイン名.com/phpmyadmin`

vmインスタンスにsshでログイン後、ルートディレクトリ内を確認します
```bash
ls -la /var/www/html
```

ルートディレクトリ内にシンボリックリンクがある場合、以降のコマンドを実行する。
ない場合は、この手順が違うので実行しないでください。
```bash
lrwxrwxrwx  1 root     root        30 May 24 04:23 phpmyadmin -> /opt/c2d/downloads/phpmyadmin/
```

新しくシンボリックリンクを貼る
```bash
ln -s /opt/c2d/downloads/phpmyadmin/ phpmyadmin-wordpress
```

初期のシンボリックリンクを削除する
```bash
unlink phpmyadmin
```

下記でアクセス出来るようになりました。
`httpd://ドメイン名.com/phpmyadmin-wordpress`
Wordpressが改ざんされる例

# 具体的にWordpress が改ざんされる方法を調べてみました

ここでは、以下のドメインを使用しています。
- qiita.com - 正常なリンクの例
- example.org - 異常なリンクの例

## Wordpressのシステム、及び wp-config.phpを書き換える

## テーマのaリンクの書き換える

```original.html
<a href="https://qiita.com/">Qiita</a>
```

```cracked.html
<a href="https://qiita.com/">Qiit</a><a href="http://example.org/">a</a>
```

## テーマに勝手にaリンクを追加する

```original.html
&copy; 2011-2022Qiita Inc.
```

```cracked.html
&copy; 2011-2022Qiita Inc<a href="http://example.org/" style="text-decoration:none">.</a>.
```

## 簡易対策方法
「アップグレードされない、自作のテーマ」の
*.php や *.css、*.js をすべて shaでハッシュを取り、
それをcrontabで毎日shaを取り直して、diffして違ってたら
クラッキングされてるのでは？と判別できるのかもしれない
cscの作法 その170

# 概要
cscの作法、調べてみた。
base64やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/27eec5dc-7300-a605-be82-e58bc5ba9d43.png)


# サンプルコード

```
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Text;

namespace app
{
	public class Form1 : Form {
		private Button button1;
		private Button button2;
		private TextBox textBox1;
		private TextBox textBox2;
		private TextBox textBox3;
		public Form1() {
			this.button1 = new Button();
			this.button2 = new Button();
			this.textBox1 = new TextBox();
			this.textBox2 = new TextBox();
			this.textBox3 = new TextBox();
			this.button1.Location = new System.Drawing.Point(300, 130);
			this.button1.Name = "button1";
			this.button1.TabIndex = 0;
			this.button1.Text = "enc";
			this.button1.Click += new System.EventHandler(this.button1_Click);

			this.button2.Location = new System.Drawing.Point(300, 270);
			this.button2.Name = "button1";
			this.button2.TabIndex = 0;
			this.button2.Text = "dec";
			this.button2.Click += new System.EventHandler(this.button2_Click);

			this.textBox1.Location = new System.Drawing.Point(30, 20);
			this.textBox1.Multiline = true;
			this.textBox1.Name = "textBox1";
			this.textBox1.Size = new System.Drawing.Size(300, 100);
			this.textBox1.TabIndex = 2;
			this.textBox1.Text = "base64 テストコード";

			this.textBox2.Location = new System.Drawing.Point(30, 160);
			this.textBox2.Multiline = true;
			this.textBox2.Name = "textBox2";
			this.textBox2.Size = new System.Drawing.Size(300, 100);
			this.textBox2.TabIndex = 2;
			this.textBox2.Text = "";

			this.textBox3.Location = new System.Drawing.Point(30, 300);
			this.textBox3.Multiline = true;
			this.textBox3.Name = "textBox3";
			this.textBox3.Size = new System.Drawing.Size(300, 100);
			this.textBox3.TabIndex = 2;
			this.textBox3.Text = "";

			this.ClientSize = new System.Drawing.Size(400, 500);
			this.Controls.AddRange(new Control[] {
				this.button1,
				this.button2,
				this.textBox1,
				this.textBox2,
				this.textBox3
			});
			this.Name = "Form1";
			this.Text = "base64";
		}
		private void button1_Click(object sender, System.EventArgs e) {
			this.textBox2.Text = Convert.ToBase64String(Encoding.UTF8.GetBytes(this.textBox1.Text));
		}
		private void button2_Click(object sender, System.EventArgs e) {
			this.textBox3.Text = Encoding.UTF8.GetString(Convert.FromBase64String(this.textBox2.Text));
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}





```

以上。
エンジニアに基本情報技術者資格は不要です

# 不要な理由 : 資格がなくても仕事は出来る

日本のエンジニア業界は実力とキャリアの世界なので、あくまで資格はおまけ程度である。
業務キャリアやポートフォリオのなどの成果物の方がずっと役に立つ。

試験に使う時間がもったいなくてたまらない。
無用の長物を長大な時間を使って獲得するなど。

# 不要な理由 : エンジニア力と相反する能力が求められる

即答が求められる。

https://se-piyopiyo.com/jobs/fe-jikanhaibun/#toc3

>「基本情報技術者試験が、時間が足りない試験である」ということが、試験前に分かっているだけでも試験勉強が進んでいる証。

エンジニアに即答力は要らない。
むしろ立ち止まって考えたり、Googleなどで調べる力が必要だ

試験とミスマッチであることが分かる。

# 不要な理由 : 資格取得独特の適応力が求められる

とにかく問題文が分かりにくい。

ちゃんと読めば分かるような問題も、とにかく読むのが疲れる。
エンジニアの知識というよりは、問題文解釈能力のようなものが求められる気がする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/714afaac-e9e5-abe4-1f75-b56d04e6c897.png)



# 不要な理由 : 不要な知識が求められる


マーケティング手法のことなど知ったことか。

確かにエンジニアもビジネスやマーケティングに興味を持つべきかもしれない。
だが百歩譲ってビジネスに興味を持つとしても、マーケティングはいかがだろう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/62afcf42-3f36-3997-c553-aff93196b30d.png)

一般的なビジネス手法よりも、関わる開発のビジネス本体、ドメインに詳しくなるだけで良いのでは？

>もはやエンジニアをただのパソコンの大先生だと思っている

のでは？

 (LINEオープンチャットメンバーの発言より)


# 資格試験のメリット

様々なジャンルの知識をまんべんなく付けられる効用はあるという。それにしても。


# この記事に別タイトルを付けるとするなら

- 「ココがダメだよ！」日本の基本情報技術者試験
- 基本情報技術者試験がクソ試験な件




<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Photoshop｜カスタムシェイプの「名前を変更・削除」ができない

【トラブルシューティング】Adobe Photoshop バージョン : 23.3.2

Photoshopのカスタムシェイプを整理しようとしたら、「シェイプの名前を変更」「シェイプを削除」ができない状態に。色々と触って、「シェイプの名前を変更」「シェイプを削除」ができるようになったので、その方法をメモ。



# 状態の確認

**ヘッダーのシェイプ枠で**、該当シェイプを右クリックしてメニューを開いても「シェイプの名前を変更」「シェイプを削除」がグレーアウトして無効に。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/5c478f97-b04e-7545-9b68-4cd77833b7ef.png)

ギアマークでもダメ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/5127e31d-19d9-a137-2e5a-00d85b9b5742.png)


# 解決方法

**シェイプウィンドウ**を開いたら、何故か正常に・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/ab681f9a-fdcf-3633-cf18-0ac812ccafad.png)

一度シェイプウィンドウを開いた後なら、**ヘッダーのシェイプ枠でも**正常に表示・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/8ca6531f-f1e4-0fc9-0906-0bca297ca0a4.png)

バグなんだろうか...なぞ...
改行(\n)とカンマ(,)の置き換えをコマンドで

```bash
$ cat ports.txt
22
25
80
9929
12345
31337
```

# awkで可能

```
$ cat ports.txt | awk '{print $1}' ORS=','
22,25,80,9929,12345,31337,
```

`awk`の方が、一度に複数の処理ができる：

```
$ cat results.txt
22/tcp
25/tcp
80/tcp
9929/tcp
12345/tcp
31337/tcp

$ cat results.txt | awk -F '/' '{print $1}' ORS=','
22,25,80,9929,12345,31337,
```

このカンマ以外でも置き換え可能：

```
$ cat results.txt | awk -F '/' '{print $1}' ORS='test'
22test25test80test9929test12345test31337test
```

# 今まではtr使ってた

```
$ cat ports.txt | tr '\n' ','
22,25,80,9929,12345,31337,
```

`awk`の方が一度で色々処理できるから楽だな。
[Solidity] 構造体について〜NFTに使われる!?〜

![Solidity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/c4e167e6-4ffd-9705-c467-bc383c972715.png)



いつもはflutterを書いているのですが、ブロックチェーンに興味をもち勉強を始めました。
アウトプットのために書こうと思います。
自分用のメモにも使います。


今回は構造体についてです。
動画によると、<b>NFT</b>などで使うらしいです！！これは使いこなしたいところ！

# 構造体を作る

`Kitty`という構造体３つのデータを入れることにしました。

・名前(string)
・オーナー(adreess)
・ID（uint256）

```solidity
struct Kitty {
    string name;
    address owner;
    uint256 id;  
}
```

# 追加する処理

```solidity
pragma solidity >= 0.4.0 < 0.8.9;

contract MyContract {

    //型として使うために、Kittyという構造体の配列（kitties）を作る
    Kitty[] kitties;

    //どのキティを見るには,loopしなければならない　→遅い　->mappingを使う。
    mapping(address=>uint256[]) ownerToKitty;

    function addKitty(string memory _name, address _owner) public {
         //idを作成（最初は、０番目、次は一番目）
        uint id = kitties.length;

        //追加するキティを定義する
        Kitty memory newKitty = Kitty(_name,_owner,id);

        //追加する。
        kitties.push(newKitty);

        //mappingにも記録する必要がある。
        //onwerの配列にIDを追加してあげる。
        ownerToKitty[_owner].push(id);
    }

```

# 取得する処理

```solidity
pragma solidity >= 0.4.0 < 0.8.9;

contract MyContract {

    function getKitty(address _owner) public view returns(string[] memory) {
        //猫の匹数を定義する。　→ 長さを返してあげる
        uint numberOfKitties = ownerToKitty[_owner].length;

        //numberOfKittiesの大きさを持ったstringの配列ができる
        string[] memory names = new string[](numberOfKitties);

        //numberOfKittiesをLoopする
        for(uint i = 0; i < numberOfKitties; i++) {
            uint id = ownerToKitty[_owner][i];
            names[i] = (kitties[id].name);
        }
        return names;
    }
}
```


# 最後に

あれですね。理解するのが難しかったですね。記事として書くために自分も理解しようとすると時間がかかりますね。でも理解が深まるのでいい勉強になっています。まだ、これを使ってものを作れていないので楽しさがわかっていないですが、ものを作り出そうとすると楽しめると思います！

まずは基本からやっていこうと思っています。
修正点があれば、コメントください！！
特定のサイトだけVue Devtoolsが動かない時

chromeのVue Devtoolsが突如動かなくなった。

色々ググって対処したが何をやってもダメだった。

しかしサイトによっては動くことがわかり途方にくれていました。

結果論ですが、どうやら開発中のサイトのjQueryでエラーがあり、そのせいでvue.jsの処理が中断されたために起動できなかったみたいです。
jQueryのエラーを直したらVue Devtoolsも復活しました。

エラー修正後のキャッシュか何かで即時反応しない時があるので、修正後はブラウザ開き直したり、Networkタブのcache disableにチェック入れたりと他の解説ページにあることを再度試す必要があるみたいです。
Javascript Splice構文, Reduce　まとめて

引用が多いです。
https://www.sejuku.net/blog/69622

Reduce funciton ↓
配列.reduce(function(累積値, 要素) { })

累積値はtotalと考えたらいい


https://www.delftstack.com/ja/howto/javascript/javascript-splice-vs-slice/

>splice(start)
splice(start, deleteCount)
splice(start, deleteCount, item1)
splice(start, deleteCount, item1, item2, itemN)
avaScript splice メソッドには 3つのパラメーターがあり、最初のパラメーターは start です。これは、アレイの変更を開始するアレイの開始位置/インデックスを指定する必須パラメーターです。配列の長さより大きい場合、開始は配列の長さに設定されます。

>この場合、要素は削除されませんが、メソッドは合計関数のように動作し、[n *]要素と同じ数の要素を追加します。負の場合は、配列の最後にあるその数の要素から始まります。

>2 番目のパラメーターは deleteCount で、これはオプションのパラメーターです。このパラメーターは、最初から削除する配列内の要素の数を指定します。deleteCount が省略されているか、その値が array.length - start 以上の場合、配列の最初から最後までのすべての要素が 0 または負に削除され、アイテムは削除されません。この場合、少なくとも 1つの新しい記事を入力する必要があります。

>3 番目のパラメーターは、オプションのパラメーターである item1, item2, ... です。このパラメーターは、最初から配列に追加される要素を指定します。項目を指定しない場合、splice()は配列の要素のみを削除します。



https://programmer-life.work/javascript/array-splice

>let nums = [1,2,3,8,9,4,5];
nums.splice(3, 2);
console.log( nums );

>■結果
[1, 2, 3, 4, 5]
インデックスの3番目から２つ削除しています。追加する項目はないので未記入です。


<h5>SetTimeoutについて</h5>
1つめの引数：指定した時間が経過した後に実行するプログラムをファンクションの型<br></br>
2つめの引数：1つめの引数に設定したプログラムの実行を開始するまでの時間

setTimeout(function(){console.log("5秒経過しました")},5000);

https://techplay.jp/column/548#:~:text=setTimeout%E9%96%A2%E6%95%B0%E3%81%AF%E3%80%81%E9%96%A2%E6%95%B0%E3%81%8C,%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%99%E3%80%82

thenの引数はresolveの値が入る。

https://tcd-theme.com/2021/09/javascript-promise-then-catch.html
Java Byte Code

Java Byte Code
Java Virtual Machine
を知るためのリンク

Java class file
https://en.wikipedia.org/wiki/Java_class_file

The class File Format
https://jcp.org/aboutJava/communityprocess/maintenance/jsr924/JVMS-SE5.0-Ch4-ClassFile.pdf

Java bytecode
https://en.wikipedia.org/wiki/Java_bytecode

Java virtual machine
https://en.wikipedia.org/wiki/Java_virtual_machine

List of Java bytecode instructions
https://en.wikipedia.org/wiki/List_of_Java_bytecode_instructions

Java仮想マシン
https://ja.wikipedia.org/wiki/Java%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3

■クラスファイルレイアウト
File layout and structure
Sections
There are 10 basic sections to the Java class file structure:

Magic Number: 0xCAFEBABE
Version of Class File Format: the minor and major versions of the class file
Constant Pool: Pool of constants for the class
Access Flags: for example whether the class is abstract, static, etc.
This Class: The name of the current class
Super Class: The name of the super class
Interfaces: Any interfaces in the class
Fields: Any fields in the class
Methods: Any methods in the class
Attributes: Any attributes of the class (for example the name of the sourcefile, etc.)
Power Queryでの正規表現置換で、特殊文字に対応する

# 0. はじめに
[Freeradical](https://www.freeradical.jp)の中の人、[yamarah](https://qiita.com/yamarah)です。
Power Queryで正規表現を使いたいという要望は少なくないようで、検索すると国内外の記事がヒットします。例えば、[Power Query で正規表現を使って置換したい](https://qiita.com/baku2san/items/8041d0259fe0db680e7e)など。
しかし、これらの記事は、JavaScript, HTMLエンジンが反応する特殊文字をエスケープしていないので、入力によっては誤動作します。これを改良しようというのが、本記事の目的です。
私自身は、M言語, JavaScript, HTMLについては初心者なので、間違いや、もっと良い方法があれば、是非ご指摘願います。

# 1. エスケープすべき特殊文字
まずは、エスケープすべき特殊文字を確認しておきましょう。
## JavaScript
スクリプト中の`'`で囲われる文字列は、以下のようにエスケープする必要があります。
|特殊文字|エスケープ後|
|:-----:|:----------:|
| \\ | \\\\ |
| ' | \\' |
## HTML
JavaScriptの出力はHTMLエンジンによって解釈されてしまうので、タグ表記に用いる文字などをエスケープします。
後に出てくるコードを含めて、記事 : [JavaScriptでHTMLエスケープ処理](https://qiita.com/saekis/items/c2b41cd8940923863791)を参考にさせて頂きました。
|特殊文字|エスケープ後|
|:-----:|:----------:|
| & | \&amp; |
| ' | \&#x27; |
| ` | \&#x60; |
| " | \&quot; |
| < | \&lt; |
| > | \&gt; |
## M言語
JavaScriptをM言語中に埋め込むにあたって、以下をエスケープして記述する必要があります。 
|特殊文字|エスケープ後|
|:-----:|:----------:|
| " | "" |
| # | #(#) |

# 2. コード
入出力のインターフェースについては、各自調整されたし。

```vb:RegExReplace
= (str as text, pattern as text, newSubStr as text) as nullable text =>
let
   strEscaped = Text.Replace(
      Text.Replace(str, "\", "\\"),
      "'", "\'"),
   patternEscaped = Text.Replace(
      Text.Replace(pattern, "\", "\\"),
      "'", "\'"),
   newSubStrEscaped = Text.Replace(
      Text.Replace(newSubStr, "\", "\\"),
      "'", "\'"),
   html = 
      "<script>
         var str='"&strEscaped&"';
         var pattern=new RegExp('"&patternEscaped&"','g');
         var newSubStr='"&newSubStrEscaped&"';
         var result=str.replace(pattern,newSubStr);
         document.write(
            result.replace(
                /[&'`""<>]/g,
               function (match) {
                  return {
                    '&': '&amp;',
                    ""'"": '&#(#)x27;',
                    '`': '&#(#)x60;',
                    '""': '&quot;',
                    '<': '&lt;',
                    '>': '&gt;'
                  }[match]
               }
            )
         );
      </script>",
   webPageResult = Web.Page(html)[Data]{0}[Children]{0}[Children],

   result = if (List.Count(webPageResult) <= 1) then
   { 
      null
   } else if (webPageResult{1}[Text]{0} = null) then
   {
      "" as text
   }  else {
      webPageResult{1}[Text]{0} as text
   }
in 
   result{0}
```
注意点の1つ目は、JavaScript中で`'`で括られる文字列のエスケープは2段階ありますが、この順番でやること(そうしないと`'`をエスケープした`\'`のバックスラッシュに反応してしまう)です。
2つ目は、JavaScript中の
```PowerShell
'>': '&gt;'
```
の後ろに`,`を置かないことです。近代的なJavaScriptエンジンは最終行の後に`,`を許容するようですが、PowerQueryが内部で使うエンジン(IE7相当?)ではエラーになります。
ESP32のホスト名を設定する

現在ESP32を使用して製品開発をしているが、
ESP32をネットワークに接続する際、
ホスト名がデフォルトでは「arduino-esp32」になってしまっている。

しかし、今回の製品はESP32を複数台同じネットワークに接続するので
それではホスト名が同じになってしまっているので、端末の識別が難しくなる。

そこで今回は海外サイトをほじくってホスト名の設定方法を
調べました。

## 設定方法
```c
#include <WiFi.h>

const char* ssid = "****";
const char* password = "****";
String hostname = "hostname";

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE);
  WiFi.setHostname(hostname.c_str());//ここでホスト名を設定します

  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
}

void setup() {
  Serial.begin(115200);
  initWiFi();
  Serial.print("RRSI: ");
  Serial.println(WiFi.RSSI());
}

void loop() {
  // put your main code here, to run repeatedly:
}
```
現在監視カメラにデジタル出力をできる機能をつけた製品を
開発しています。（WiFiによりネットワーク接続）
スマホやPCから操作が可能です。
気になる方はお気軽にご連絡下さい。
100日後くらいに個人開発するぞ！day032

## 今日もHTML＆CSS中級編を復習してみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/2bac0d4a-b646-f945-302a-cb000a8d12aa.png)

## HTML＆CSS中級編を修了！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/9586a743-111f-678a-ae39-9df86a9b5fd9.png)



## 今日の備忘録


### 影をつける方法
- box-shadowプロパティを用いて「影の位置」と「影の色」を指定することで影をつけることができます
    - 例：20px左で10px真下に黒の影を付けたい場合
        - `box-shadow:20px 10px #00000d`

### マウスのカーソルの形を変える方法
- cursorプロパティを用いることでマウスのカーソルが要素に乗った時の形を変えることができる
    - 例：I字型のカーソルに変えたい場合
        - `cursor:text;`
    - 例：指型のカーソルに変えたい場合
        - `cursor:pointer;`
    - 例：矢印型のカーソルに変えたい場合
        - `cursor:default`

### クリック時に変化をつける方法
- セレクタに:activeを用いると要素がクリックされる間のCSSを指定できる

    - 例：クリック時にbuttonクラスの影を無くして要素を10px下げたい場合
        - `.button:active{`
        - `box-shadow:none;`
        - `position:relativel;`
        - `top:10px`

- プロパティにnoneを指定することでCSSを打ち消すことができる
    - 例：影を消したい時
        - `box-shadow:none`
- `position:relative`を用いることで要素の位置を変えることができる
    - 例：要素を下に5px左に10px動かしたい時
        - `position:relative`
        - `top:5px;`
        - `left:10px;`
Chromeで、TableをCSVで取得(楽天証券積立設定取得)(自分向けメモ)

# 楽天証券の積立設定を取得
複数ページにまたがる場合は、手動で切り替えてから取得。。。

```javascript
var downloadAsTextFile = function(fileName, content) {
    var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
    var blob = new Blob([bom, content]);
    var url = window.URL || window.webkitURL;
    var blobURL = url.createObjectURL(blob);

    var a = document.createElement('a');
    a.download = fileName;
    a.href = blobURL;
    a.click();  
};
var downloadAsCSVFile = function(fileName, rows) {
  var content = "";
  for( var i in rows) {
    var ary = rows[i];
    for (var j = 0, m = ary.length; j < m; ++j) {
      content += '"' + ("" + ary[j]).replace('"', '""') + '"';
      if (j !== m) {
        content += ',';
      }
    }
    content += '\n';
  }
  downloadAsTextFile(fileName, content);
};
var Queue = function() {
  this.promise = Promise.resolve(true);
  this.async = (action)      => this.promise = this.promise.then(() => new Promise((resolve) => action(resolve)));
  this.sync  = (action)      => this.async((resolve) => { action(); resolve(); });
  this.delay = (delay)       => this.async((resolve) => setTimeout(resolve, delay));
  this.open  = (url, action) => this.async((resolve) => {
    var w = window.open(url, "dummy", 'width=100,height=100');
    $(w).load(() => { action(w); w.close(); resolve(); });
  });
};

var rows = []
var q = new Queue()
$("tr td > a[href*='/app/info']").each((i, e) => {
    var a = $(e)
    var tr = $(e).closest('tr')
    var td1 = tr.find('td:eq(0)').text().trim()
    var td3 = tr.find('td:eq(2)').text().trim()
    var td4 = tr.find('td:eq(3)').text().trim()
    var td5 = tr.find('td:eq(4)').text().trim()
    q.open(e.href, (w) => {
        
        var t = $(w.document)
        var isinCd = t.find("div.isinCd").first().text().trim()
        var type = t.find("span.fund-type").text().trim()
        var fee = t.find(".trust-fee td").text().trim()
        rows.push([a.text(), e.href, td1, td3, td4, td5, isinCd, type, fee])
    })
})
q.sync(() => downloadAsCSVFile("hoge.csv", rows))
```

# ISINコードから協会コードに
楽天は[ISIN](https://www.nomura.co.jp/terms/english/i/A02453.html)で管理してるけど、SBIは[協会コード](https://www.daiwa.jp/glossary/YST0397.html)で管理しているみたい。
対応表みたいのは見つからず、kakaku.com でISINから協会コードを引けるので、ここで変換。

## Chromeで kakaku.com上でJavascriptを実行

Excelから楽天証券の積立設定のテーブルをコピペ。
```javascript
tbl_org = `eMAXIS Slim 国内株式(TOPIX)	(...)	JP90C000ENA9
(...)
eMAXIS Slim 米国株式(S&P500)	(...)	JP90C000GKC6
`
```

ISINコードを取り出して、協会コードを抜き出し。
なお、jQueryが古いので、"on"がなく、"load"を使用。loadもversion 3からなくなるので面倒。。。

```javascript
var q = new Queue();
var rows = [];
tbl = tbl_org.split("\n").map((l) => l.split("\t"))
tbl.forEach((row) => { 
    if(row.length <= 1) return
    console.log(row[6])
    var url = "https://kakaku.com/fund/detail.asp?si_isin=" + row[6]
    q.open(url, (w) => {
        var t = $(w.document)
        var code = t.find('.fundCode').text().replace(/.*：/, "")
        row.push(code)
        rows.push(row)
    })
})
q.sync(() => downloadAsCSVFile("hoge.csv", rows))
```
webpackの各機能について（Tree Shaking, Minify, Code Splitting）

## はじめに
`Tree Shaking`, `Minify`, `Code Splitting`というキーワードについて簡単に調べてみたので記録する。

### 詳細
## `Tree Shaking`
- 実行されないコードを削除すること(木を揺らして余計なものを振り落としているイメージ)
- JavaScriptの文脈で利用される用語です。
- ESモジュール形式で書かれたコードをbundleして一つのファイルにする時に、exportしているけどどこからもimportされていない、使われていないコードを削除する機能のこと.


## `Minify`
- ホームページの表示を高速化する目的で、ホームページのファイル（HTMLファイル、CSSファイル、JavaScriptファイルなど）のサイズを小さくすること
- 不要なスペースやインデントなどを削除したり、関数名や変数名を短いものに置き換えたりすることでソースコードのサイズを圧縮する。
- minifyされたソースコードは人間には読みにくくなってしまうが、プログラムとしては問題なく実行できる。
(ソースコードは開発者が記述しやすいように、また、後で保守する際に読みやすいように、人間にとって分かりやすい表記法などを用いて記述されることが多いが、長い変数名や関数名、タブ文字や連続した空白文字（スペース）など、動作には直接影響しない冗長な要素が含まれる)
- 人間には読解しにくい酷い見た目のコードになるが、同じ動作を維持したままサーバのデータ転送量を削減できるため、多くの人に同じファイルを配布する場合などに用いられる。
- 変換の過程で変数名などの情報は欠落して元に戻すことはできなくなるため、ある種の非可逆圧縮となっている。この特徴を逆手に取り、コードを盗み取られたり解析されにくくなるよう難読化（obfuscation）する用途を兼ねる場合もある。
- webpackではいくつかのminify用プラグインが用意されているが、webpack 4系では前述の「–mode」オプションで「production」を指定するだけで自動的に出力コードがminifyされる。

## `Code Splitting`
- その名の通り「コードを分割し別ファイルとすること」を指します。分割されたコードはユーザのアクションに応じて非同期に読み込まれます。
- webpackのこの機能により、コードを様々なバンドル（塊）に分割し、オンデマンドまたは並列でロードすることができるようになる。
- より小さなバンドルを実現し、リソースの負荷の優先順位を制御するために使用することができ、正しく使用すれば、ロード時間に大きな影響を与えることができる。
- webpackのコード分割には、一般的に3つのアプローチがあります。
    - `Entry Points`: エントリーポイント。エントリーポイントの設定により、手動でコードを分割する
    - `Prevent Duplication`: 重複を防ぐ。エントリーの依存関係やSplitChunksPluginを使用して、チャンクの重複排除と分割を行う。
    - `Dynamic Imports`: 動的なインポート。モジュール内のインライン関数呼び出しでコードを分割します。


## おわりに
調べてみた結果、大体は想像していたとおりであったが、`Minify`で変数名も短くなることなど周辺の細かい情報は読んでいた楽しかった。
今後もwebpackの機能に関する情報があればこちらに追記していきたい。