OmniAICreator/Qiita-1.07M huggingface dataset:
1-3 統計学基礎～正規分布

# はじめに
統計学において最も頻繁に登場する重要な確率分布の正規分布について紹介する

# 目次
1. 正規分布
2. 正規分布の性質
3. 標準化


# 1. 正規分布
統計学において最も重要な確率分布で、別名**ガウス分布**といいます。
連続型の確率変数に対して定義され、確率密度関数は次のように表されます。

```math
f(x) = \frac{1}{\sqrt{2 \pi \sigma^2}}\exp \left(- \frac{(x - \mu)^2}{2 \sigma^2} \right)
```
正規分布は平均$\mu$と標準偏差$\sigma$の２つのパラメータで決まります。
以下の図は、正規分布の平均と分散を変化させて描画したものになります。
パラメータ$\mu$は分布の位置に対応し、$\sigma$は分布の幅の広さに対応することが見て取れる。

![複数正規分布２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779455/3e1d79dd-957a-9727-9924-48a62ca13ce5.png)

正規分布には次にような特徴があります。
・平均$\mu$を中心とした釣り鐘型であり、左右対称の分布
・平均$\mu$付近の値が最も現れやすく、平均から離れるほど現れにくい
・身長や体重など、正規分布で近似できる現象が多い

# 2. 正規分布の性質
正規分布には次のような性質があります。
・$\mu - \sigma$から$\mu + \sigma$までの範囲の値が起こる確率が約68%
・$\mu - 2\sigma$から$\mu + 2\sigma$までの範囲の値が起こる確率が約95%
・$\mu - 3\sigma$から$\mu + 3\sigma$までの範囲の値が起こる確率が約99.7%

この性質を図で示すと次のようになります。
![正規分布性質.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779455/69417ca7-f8a3-dbaf-08ff-bd5b7e6b6d4f.png)

例)成人男性の身長が、平均$\mu$=167.6(cm)・標準偏差$\sigma$=7.0の正規分布に従うとする。
すると正規分布の性質から次のようなことが言える。
・$\mu - \sigma$=160.6から$\mu + \sigma$=174.6の範囲に約68% 
・$\mu - 2\sigma$=153.6から$\mu + 2\sigma$=181.6の範囲に約95% 
・$\mu - 3\sigma$=146.6から$\mu + 3\sigma$=188.6の範囲に約99.7%
つまり、181.6cm以上の身長の人は約5%程度しかいないことがいえる。

# 3. 標準化
データを標準化すると、平均と分散を考慮した数値の大きさを得ることができる。
一般に確率変数$x$に対し平均と標準偏差を用いて
```math
z = \frac{x - \mu}{\sigma}
```
とすることで、平均０標準偏差１の値に変換することができる。
これを標準化という。

異なるデータから得られた確率分布を比較したいときに、標準化をしないと平均や標準偏差が異なるので比較することができないが、標準化を実施して平均０標準偏差１に統一することで比較できるようになる。
1-2 統計学基礎～データ分布

# はじめに
今回は得られたデータを可視化して、ざっくりとした分布を把握するところについて説明します。

# 目次
1. 量的変数
2. 質的変数
3. 統計量
4. 代表値 
5. 分散と標準偏差
6. 外れ値


# 1. 量的変数
数値で表される変数のことを言います。
つまり数値や量で測ることのできる変数です。

例えば、身長は「150cm」のように数値で表現できるため量的変数になります。
他には、体重・テストの点数・年齢・年収などがあります。

量的変数には２つの種類があります。

**離散型量的変数**
取りうる値が飛び飛びである変数を離散型量的変数という。
例えば、サイコロは取りうる値が１から６までの整数であるため離散型に分類されます。

**連続型量的変数**
身長173.4cmや体重65.8kgといった連続値で表される変数を連続型量的変数という。
飛び飛びの値ではなく精度の良い測定法を用いれば原理的にはいくらでも小数点以下に値が続く変数を指します。

# 2. 質的変数
変数が数値ではなくカテゴリで表される変数のことを言います。
つまり数値や量で測ることができない変数となります。

例えば、性別(1=男性、2=女性)やアンケート調査(5=大変満足、4=満足、3=普通、2=ひどい、1=大変ひどい)などです。
他にはコインの表/裏、ラーメンの味(醤油/塩/味噌)などもあります。

質的変数は別名**カテゴリ変数**とも呼ばれます。

![変数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779455/0e429e7a-cafb-a77e-67e6-064f57fb521b.png)

# 3. 統計量
得られたデータに対して何かしらの計算を実行して得られる値を統計量といいます。
データからいくつかの統計量を計算し要約することで、データがどのように分布しているかを定量的に特徴づけることができます。
このようにデータそのものの性質を記述し、要約するための統計量を**記述統計量**または**要約統計量**という。

代表的な記述統計量
・代表値：平均値、中央値、最頻値
・ばらつきを表す値：分散・標準偏差

# 4. 代表値
平均値、中央値、最頻値はおそらく皆さんご存じだと思いますので簡単な説明のみとさせていただきます。
代表値を用いることで、データがどのあたりを中心に分布しているかの情報を得られます

・平均値：各データの和をサンプルサイズで割った値
　母集団の平均を**母集団平均**、標本の平均を**標本平均**といいます。

・中央値：データを大きさ順に並べたときに中央に位置する値

・最頻値：データの中で最も頻繁に表れる値

この３つの値が大体同じ値をとるとき、データの分布は左右対称に近い山型となります。
またこの３つの値の内、外れ値の影響を大きく受けるのは平均値となります。

下の図は左右対称の平均０の正規分布となります。図から見てもわかるように、最頻値・中央値も０となります。
![正規分布2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779455/ea4f1642-e53a-9902-d2cb-c637652bb4cc.png)


# 5. 分散・標準偏差
分散・標準偏差を用いることで、分布の幅を捉えることができます。
つまり分散とは、各データ値と平均の値がその程度離れているかを評価することでデータのばらつき具合を定量化する統計量。
ばらつきが大きいほど分散の値も大きくなります。
また標準偏差とは分散の平方根をとった値となります。

下記キャプチャは平均０の正規分布の標準偏差を変化させたときの分布を描画したものです。
標準偏差が大きくなるにつれて、分布の幅が大きくなっていることがわかると思います。
![分散視覚化２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779455/6c7281ad-3eba-25ef-e1e1-a747680ebc05.png)

# 6. 外れ値
外れ値に明確な定義はありませんが、データには稀に極端に大きな値や小さな値をとることがある。
平均値から標準偏差２つ分または３つ分離れた数値を外れ値として扱うことがあります。(必ずこうなるとは限らない)

外れ値の中には、本来の値ではなく測定ミスにより発生する可能性がある外れ値もあります。これを**異常値**といいます。
異常値データが見つかった場合は、本来得られることのなかったデータなので速やかに取り除くようにしましょう。

# まとめ
データ分析においてデータを得られたら次の３点を実施してざっくりとした分布の形を視覚化するとよいです。
１．ヒストグラムを作成
２．代表値を求め、どこを中心に分布しているかを判断
３．分布の幅を計算
MySQLの正規表現検索とReDoS対策

MySQLに格納されているデータから正規表現のパターンに一致するものを取得するという機能を実装するため、MySQLの正規表現検索について色々調べたことをまとめました。

この記事では主に2つのことを書いています。
* MySQLで正規表現検索する方法
* ReDoS対策

# MySQLで正規表現検索する方法

MySQLには正規表現検索するための機能が備わっています。

https://dev.mysql.com/doc/refman/8.0/ja/regexp.html

例えば、下記のSQLではtitleに'はじめて'または'入門'が含まれているデータを取得できます。

```sql
SELECT title FROM books WHERE title REGEXP '(はじめての|入門)';
```

# ReDoS対策

ReDoSとは正規表現の脆弱性を利用した攻撃のことです。
QiitaでReDoSについて書かれている記事を見つけたので詳細は下記をご覧ください。

https://qiita.com/flat-field/items/f5b0c803ba0b7030d97a

MySQLのREGEXPにもReDoSの脆弱性があるので対策が必要です。

よくあるデータベース関連の脆弱性は事前に入力値をチェックしてSQL発行前にブロックしたり、危険な文字をサニタイズするなどて危険を取り除いたり、クエリー発行前に対策することができますが、ReDoSの場合は入力値は正規表現としては正しいため、事前に取り除くことが困難です。

そこでMySQLではReDoSなクエリーが実行された場合でも負荷がかからないようにする2つの仕組みが実装されています。

## regexp_time_limit
REGEXPなどを使った正規表現の照会時間の上限を設定します。
デフォルトでは32msとなっているので、少しでも検証に時間がかかるとすぐにタイムアウトします。
もし照会に時間がかかる正規表現も許可したい場合はここの値をある程度上げる必要があります。

下記にタイムアウトになる例を載せます。

```sql
mysql> select title from books;
+------------------------------------------+
| title                                    |
+------------------------------------------+
| AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC |
+------------------------------------------+
1 row in set (0.01 sec)

mysql> select title from books where title REGEXP '(A+)+B';
ERROR 3699 (HY000): Timeout exceeded in regular expression match.
```

## regexp_stack_limit
REGEXPなどを使った正規表現の照会に使用可能な最大メモリーを設定します。
デフォルトでは8,000,000 Byte ≒ 7.6MBとなっています。

こちらもエラーになる例を載せます。
デフォルト値のままだとregexp_time_limitに先に引っかかってしまうのでデフォルトを小さくして実行しました。

```sql
mysql> SET GLOBAL regexp_stack_limit = 32;
mysql> select title from books where title REGEXP '(A+)+B';
ERROR 3698 (HY000): Overflow in the regular expression backtrack stack.
```

上記2つの仕組みについては下記ドキュメントの「正規表現のリソース制御」に記載されています。

https://dev.mysql.com/doc/refman/8.0/ja/regexp.html

また、各設定値のデフォルト値などはこちらに記載されています。

https://dev.mysql.com/doc/refman/8.0/ja/server-system-variables.html

## 正規表現がReDoSになるかどうかを判定する方法

前述しましたが、ReDoSの場合は入力値は正規表現としては正しいため、事前に判断することが困難です。
では、どう判定するか？ですが、MySQLの場合はタイムアウトなどReDoS対策がされているので、遠慮せずにクエリーを実行してみてタイムアウトするかどうかで判定すれば良いと思っています。

クエリーを実行してみて、regexp_stack_limitやregexp_time_limitのエラーが発生したらReDoSになる正規表現と判断できます。

この方法で検証する場合、1つ注意点があります。
ReDoSはデータと正規表現の組み合わせで発生するということです。
例えば、regexp_time_limitのエラーが発生する例として紹介したクエリーでも下記のようにデータによってはタイムアウトしません。

```sql
mysql> select title from books;
+-------+
| title |
+-------+
| AB    |
+-------+
1 row in set (0.02 sec)

mysql> select title from books where title REGEXP '(A+)+B';
+-------+
| title |
+-------+
| AB    |
+-------+
1 row in set (0.01 sec)
```

そのため、事前にクエリーを実行してReDoSではないと判定した正規表現でも、のちに追加されたデータによってはReDoSになり得るので注意が必要です。
1-1 統計学基礎～母集団とは？


# はじめに
統計学における母集団について簡単にまとめました。
統計学をなにも知らない人でもわかるように書きました～。

# 目次
1. 母集団とは
2. 有限母集団
3. 無限母集団 
4. 全数調査
5. 標本調査    


# 1. 母集団とは
母集団とは、興味の対象全体のまとまりのことを言います。
例えば日本人の成人男性の身長に興味があれば、今存在している日本人成人男性全員(約5000万人)を母集団と考えます。
他の例では視聴率について興味があれば、テレビを所有する全ての世帯が母集団となります。

母集団に含まれる要素の数を**母集団サイズ**といいます。
例えば上記成人男性の場合、母集団サイズ＝5000万人となります。
この母集団の性質を知ることが、興味の対象の説明・理解につながります。

![母集団２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779455/8cbc65e0-a174-11ed-231d-de4da5c8f000.png)



# 2. 有限母集団
**有限母集団**：母集団サイズが有限である母集団のこと


(例)
１で紹介した日本人成人男性や視聴率の母集団は有限母集団となります。



# 3. 無限母集団
**無限母集団**：母集団サイズが無限である母集団のこと

(例)
サイコロの出る目に対して興味がある場合、サイコロは永遠に振れるので出る目に際限はなく無限母集団となります。

# 4. 全数調査
母集団に含まれる全ての要素を調べる調査のことです。
例えば日本人成人男性の平均身長に興味があれば、日本人成人男性全員(約5000万人)の身長を測定しデータを取得後、平均値を計算することになります。

全数調査では、分析するデータ=母集団となります。つまり全てのデータを分析するだけで、母集団の性質や特徴を説明・理解できるようになります。このようなデータそのものの特徴を記述し要約することを**記述統計**といいます。

ただ全数調査を実施するには以下のようなデメリットがあります。
１．時間的コストがめちゃかかる
２．金銭的コストがめちゃかかる
３．無限母集団の調査はできない。

そのため基本的に統計学においては、全数調査よりも次に紹介する標本調査を実施することが多いです。


# 5. 標本調査
母集団の一部を分析することで母集団全体の性質を推測することを**推測統計**といいます。
推測統計で調査する母集団の一部を標本(サンプル)といい、標本を母集団から取り出すことを標本抽出(サンプリング)といいます。
標本から母集団の性質を調べることを **標本調査**といいます。

例えば、ＴＶの視聴率でいえば全世帯を調べるのではなく一部の世帯を対象にモニタリングを実施し、全世帯の視聴率を推測していたりします。
他にも日本人成人男性の平均身長に興味があれば、5000万人の全数調査を行うのではなく一部のサンプルを抽出し、そこから母集団全体の性質を推測します。

![全数調査と標本調査.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779455/7237f2ed-852e-2a7d-a5cc-9fef16f6690a.png)
vimのカスタマイズ

## 問題
vimを使ってテキストを編集することがある。Cで書かれている特定のファイルに対してハイライトしたかった。

## 仕組み
```vim```は、```.vimrc```に基本設定を書き込むと、開いたときにその設定が反映されるようになります。```.vimrc```は、ホームディレクトリを開いたときに自動的に読み込まれます。

配置場所は、下記の通りです。

|OS  | 配置場所|
|---|---|
|Unix|\$HOME/_vimrc/.vimrc、/_vimrc/.vim/.vimrc|
|MS-Windows|\$HOME/_vimrc、/vimfiles/vimrc、/VIM/_vimrc|

## 方法
### 1. .vimrcの作成
ホームディレクトリに.vimrcを作成する。
```
$ touch .vimrc
```
### 2. .vimrcファイルの編集

#### 2.1 特定のファイルを開いたときにファイルをセットする。
```*.txt```を開いた時は、txtファイルタイプの設定をする,
```*.c```のファイルを開いた時は、C言語likeのハイライトをする。
```.vimrc
au BufRead,BufNewFile *.txt set filetype=txt
au BufRead,BufNewFile *.c set filetype=C
```
#### 2.2 その他
下記のように、vimを開いたときにセットして設定するものを予め記載することで、基本設定を読み出すことができる。
```.vimrc
" Add numbers to each line on the left-hand side.
set number

" Highlight cursor line underneath the cursor horizontally.
set cursorline

" Highlight cursor line underneath the cursor vertically.
set cursorcolumn

" Do not wrap lines. Allow long lines to extend as far as the line goes.
set nowrap
```

### link
参考になったlinkです。
[何も考えず~/.vimrcにこれを書くんだ！ 〜vim初心者によるvim初心者のためのvim入門〜](https://qiita.com/morikooooo/items/9fd41bcd8d1ce9170301)
[Vimrc Configuration Guide](https://www.freecodecamp.org/news/vimrc-configuration-guide-customize-your-vim-editor/)
seederを使ってDBにダミーデータを入れる

# DBのカラムにダミーデータを入れる
## seederを生成するコマンド



```

php artisan make:seeder ******TableSeeder

```
`******` の部分は事前に作成したLaravelのモデル名になりますが
モデルの命名規則に従う必要があります。


### モデルの命名規則

|記法|複数or単数|例|
|:---:|:---:|:--:|
|アッパーキャメル|単数|UserData|


## ダミーを実行するには



## seederファイルを編集する

```php

<?php

use Illuminate\Database\Seeder;

//動かすseederのファイル名（拡張子は外す）
class ********** extends Seeder


{

public function run()
    {
        DB::table('テーブル名')->insert([
            [
                'カラム名' => '入力する値または文字列',
                'カラム名' => '入力する値または文字列',
                'カラム名' => '入力する値または文字列',
                'カラム名' => '入力する値または文字列'
            ],
            [
                'カラム名' => '入力する値または文字列',
                'カラム名' => '入力する値または文字列',
                'カラム名' => '入力する値または文字列',
                'カラム名' => '入力する値または文字列'
            ],
            [
                'カラム名' => '入力する値または文字列',
                'カラム名' => '入力する値または文字列',
                'カラム名' => '入力する値または文字列',
                'カラム名' => '入力する値または文字列'
            ],
          ]);
}
    }

``` 

テーブルへデータを挿入（insert）するLaravelの`DBファザード`を実行します

一つの`[ ]`　の中身に1レコード分のダミーデータを記述します
レコードまたはダミーを増やす場合は　`,` 　（カンマ）で区切ります。


## DatabaseSeeder.phpを編集する

database/seeds/DatabaseSeeder.php
``` php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
    }
}

```

`DatabaseSeeder.php`ファイルが見つからない場合は、
新しいファイルを作成し`DatabaseSeeder.php`の名前にリネームしてから
上記のコードをコピーして利用してください。

### DatabaseSeeder.phpの変更箇所

``` php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(実行するseederファイル名を入力::class);
    }
}
```
DatabaseSeeder.php のコードを実行するseederファイルの名前に
書き換えなければ処理が実行されません。


## エラーの対策と対処方法

### カラム（列）のデータ型に注意
シーダーで入力しようとしている`値`と`カラム（列)`へ
設定されている`データ型`が異なる場合には
シーダーの処理にエラーが発生します

### カラム（列）は空にするとエラーになる
一つのレコードに存在するカラムは全て埋めなければエラーが発生します
例えば一つのレコードにカラム（列）が10個存在する場合は、
一つのレコードに10個のダミーを用意する必要があります

### 自動で出力される値のダミーは不要

自動増分されるIDなどの`increments`や
作成日時を出力する`timestamps`などのデータ型は
自動で値が埋まるためダミーで埋める必要がありません。
上記の例えに言い換えるならば、ダミーを8つ作り、2つは省略します

|データ型|種類|
|:---:|:---:|
integer|数値（整数）|
decimal|数値（精度の高い小数）|
float|数値（浮動小数）|
string|文字（短い文字列）|
text|文字（長い文字列）|
date|日付|
datetime|日時|
time|時刻|
timestamp|タイムスタンプ|
|binary|バイナリ|
|boolean|真偽|

## シーダーを実行する

```
php artisan db:seed
```
最後にコマンドを実行することで
seederファイルのダミーレコードを
データベースに反映することができます。
UnrealBuildTool : warning : Warning: Plugin 'A' does not list plugin 'B' as a dependency, but module 'A' depends on 'B'.


自分へのメモも兼ねて、Qita記事を残しておきます。


Visual Studioで作業中に、以下の警告が消せなくて、悩まされました。

```ruby:qiita.rb
UnrealBuildTool : warning : Warning: Plugin 'A' does not list plugin 'B' as a dependency, but module 'A' depends on 'B'.
```

## 原因

調べたところ、モジュールが他のプラグイン依存している箇所がある事が原因であるようです。
.upluginに記載してある、Pluginsを追加し、依存するプラグインを追加する必要があります。


## 対応方法

上の警告文だと、AのモジュールがBのプラグインに依存しているので、以下のように、Pluginsを追加する必要があります。


```ruby:qiita.rb
{
	"FileVersion": 1,
	"Version": 1,
	"VersionName": "1.0",
	"FriendlyName": "MyProject",
	"Description": "",
	"Category": "",
	"CreatedBy": "",
	"CreatedByURL": "",
	"DocsURL": "",
	"MarketplaceURL": "",
	"SupportURL": "",
	"CanContainContent": true,
	"IsBetaVersion": false,
	"IsExperimentalVersion": false,
	"Installed": false,
	"Modules": [
		{
			"Name": "A",
			"Type": "Editor",
			"LoadingPhase": "PostEngineInit"
		}
	],
	"Plugins": [
		{
			"Name": "B",
			"Enabled": true
		}
	]
}
```


### 参考
 * https://forums.unrealengine.com/t/unrealbuildtool-dependancy-warning/404128
【SpringBoot】デバッグモードでの実行ができない場合の対処法

# 環境
Eclipse Version: 2021-12 (4.22.0)
SpringBoot
Windows10


# やりたいこと
Eclipseデバッグモードで画面操作を確認したい。

# 事象
Eclipseから右クリック→実行で、画面動作の確認はできていたのだが、デバッグモードで起動すると、ブラウザ上で「ページを表示できません。」という表示が出てしまい、動かせない。

# 原因
Eclipseで、ブレイクポイントをはりまくっていたことが原因と考えられる。

# 解消法
[ウィンドウ->ビューの表示->その他->デバッグ->ブレイクポイント]

![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613261/5f02fc6c-9c0e-8f40-2ca5-bfbf1ddcdf34.png)

![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613261/da268504-31a7-faea-4452-76851453d909.png)

これにより、現時点で使われているブレイクポイントの確認ができる。
不必要なブレイクポイントを削除すれば、ok。
これでも解消しないなら、ブレイクポイントを一括で削除し、必要なものはまた設定しなおすとよいと思われる。


以上！
PythonでのSeleniumを使ったWEBサイト操作

個人的備忘録です。
自社の申請システムで入力がいつも同じなので使ってみました。

# 準備
## Webドライバーのダウンロード
自動操作したいWebブラウザのWebドライバを用意する。
ChromeならChromeの。EdgeならEdgeのWEBドライバーが必要。
### 重要
1. ブラウザのバージョンに対応したバージョンのドライバーが必要
1. EdgeのWebドライバーは32bitを使った方がよい。(64bitは不具合多めという話を聞いたことがある。)

##### Webドライバーのバージョンアップ自動化について
https://qiita.com/yoshiki_U/items/bb952bab19bcadda3d2f

## 実装
### 基本的な流れ
1. URLアクセス
1. 操作したい要素を探索・選択
1. 操作(入力やデータの収集など)
### URLアクセス
ブラウザによりimportモジュールが違うため注意(以下はEdge)
~~~python
# import
from selenium import webdriver
from selenium.webdriver.edge import service as fs  # edgeウェブドライバ

# Edgeドライバの作成
service = fs.Service(executable_path="msedgedriver.exe")
browser = webdriver.Edge(service=service)

# URLアクセス
browser.get("http://XXXXXXXXXXXXX")
~~~

### 操作したい要素を探索・選択
基本的に「.find_element」or「.find_elements」を使用
~~~python
# 例）最初に一致するimgタグの要素を検索
target_element = browser.find_element(By.TAG_NAME,"img")
# 例）imgタグに一致するすべての要素を検索(リストで取得)
target_elements = browser.find_elements(By.TAG_NAME,"img")

~~~

#### iframeが埋め込まれている場合
iframe内の要素を取得する場合、find_elementしても取得できない。
switch_to.frameでフレームを切り替えてあげる。
~~~python
browser.switch_to.frame("main")
~~~
#### 操作してる最中に新規ウィンドウが表示され、その新規ウィンドウを操作したいとき。
~~~python
browser.switch_to.window(browser.window_handles[-1])
~~~
### 操作(入力やデータの収集など)
~~~python
# クリック
target_element.click()

# テキストボックスクリア
target_element.clear()
# テキストボックス入力
target_element.send_keys("テキストボックスに入力したい文字")

# 要素の文字列を取得
target_element.get_attribute("value")
~~~

### 終了処理
~~~python
#　現在のウィンドウを閉じる
browser.close()
# Webドライバインスタンスを終了する。
browser.quit()
~~~
Apacheのconfファイルがいつ反映されるか検証してみた

### はじめに
Apacheのコンフィグファイルを誤って変更した際に、リアルタイムにサーバーに反映されるか気になったため、検証してみました。
※Apacheのコンフィグファイルとは、/etc/httpd/conf配下または/etc/httpd/conf.d配下にある
confファイルです。

以下のサイトが参考になりました。
https://into-the-program.com/apache-httpdconf-check/

#### Apacheのコンフィグファイル変更前のwebページの状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/03afac5b-193b-1315-1083-85ba8c7e1853.png)

#### Apacheのコンフィグファイルを更新する

Apacheのコンフィグファイルを変更前に、バックアップを取得しました。
```
# cp -p /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.confbk
```
Apacheのコンフィグファイルを開き、先頭にTESTという不要な文字を入れました。
```
# vi /etc/httpd/conf/httpd.conf
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/838b3176-92ba-5945-1523-575be32dd028.png)

Apacheのコンフィグファイルを変更前と変更後で差分を比較しました。
変更後のコンフィグファイルに不要なTESTという文字が入っていることを確認した。
```
# sdiff -s  /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.confbk
TEST ServerRoot "/etc/httpd"                                  | ServerRoot "/etc/httpd"
```
#### 文法チェックをしました
TEST文字列の部分にエラーが出ました。
```
# httpd -t
AH00526: Syntax error on line 31 of /etc/httpd/conf/httpd.conf:
Invalid command 'TEST', perhaps misspelled or defined by a module not included in the server configuration
```
#### Apacheのコンフィグファイル変更後のwebページの状態
シークレットウィンドウで確認したところ、問題なくwebページが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/f5c63fb7-20ba-ef38-78e4-67536bb23d7c.png)

#### 試しにApacheのサービスを再起動してみました
エラーが出ました。
```
[root@localhost conf]# systemctl restart httpd
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
```
シスログを確認しました。31行目にTESTの文字列によりエラーが出ていることを確認した
```
Aug  9 21:26:49 localhost systemd: Starting The Apache HTTP Server...
Aug  9 21:26:49 localhost httpd: AH00526: Syntax error on line 31 of /etc/httpd/conf/httpd.conf:
Aug  9 21:26:49 localhost httpd: Invalid command 'TEST', perhaps misspelled or defined by a module not included in the server configuration
Aug  9 21:26:49 localhost systemd: httpd.service: main process exited, code=exited, status=1/FAILURE
Aug  9 21:26:49 localhost systemd: Failed to start The Apache HTTP Server.
Aug  9 21:26:49 localhost systemd: Unit httpd.service entered failed state.
Aug  9 21:26:49 localhost systemd: httpd.service failed.
Aug  9 21:46:47 localhost systemd: Unit httpd.service cannot be reloaded because it is inactive.
Aug  9 21:47:03 localhost systemd: Starting The Apache HTTP Server...
```
#### Apacheサービス再起動後のwebページの状態
エラーページになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/15d760e8-605c-52e6-c3a4-523e4907506f.png)

### まとめ
viエディタでApacheのコンフィグファイルを修正した際に、誤って変更した場合は、
Apacheのサービスを再起動しない限り、サーバーに反映されないことが分かりました。

また、Apacheのコンフィグファイルをバックアップから戻したり、
一時的に別名にApacheのコンフィグファイルを変更しても、Apacheのサービスを再起動しない限り、反映されないことも分かりました。

今後、viエディタでApacheのコンフィグファイルを、誤って修正することがあるかもしれません。
その場合、上記の知識があれば、落ち着いて対応出来ると思います。

補足ですが、よくあるミスが、viエディタで編集した際に入力モードにする「i」をコンフィグファイルに、気づかないうちに入れてしまう事があるため、こちらも作業する際は気を付けた方が良いと思いました。

この記事を参考にして頂けたら幸いです。
【ポートフォリオ作成2日目】githubのissue活用とrspecのセットアップ

# 概要
- githubのissue機能を使ってタスク管理をする。
- rspec（Ruby用のテストフレームワーク）を使ってTDD（テスト駆動開発）を行うための準備をする。
# githubでタスク管理
- [GitHubのissueを活用した個人アプリの開発手順を書いてみた](https://qiita.com/tkmd35/items/9612c03dc60b1c516969)
- [Githubにissueのテンプレートを作成する方法](https://note.com/koushikagawa/n/n0dcc592d3045)
- [プルリクエストテンプレートの作成](https://docs.github.com/ja/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository)
# rspecのセットアップ
- [rspecをgemでインストール](https://zenn.dev/fu_ga/books/ff025eaf9eb387/viewer/f2c0c9)
# 参考
- [使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」](https://qiita.com/jnchito/items/42193d066bd61c740612)
- [Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)
# その他
- originとは、リモートリポジトリのアクセス先のこと
  例：https://github.com/username/app.git
- githubのpull requestのUIが参考サイトのものと変わっていた
  Merge pull requestのボタンを押した後にもう一段階確認がある
- rspecの設定は色々あるので、触っていくうちに必要に応じて追加する
個人開発でタスク管理した際、正確な見積もりができるように自分が工夫したこと

### はじめに
個人開発でタスク管理した際、正確な見積もりができるように
自分が工夫したことを書いていきます。

### 個人開発で正確な見積もりができるように工夫したこと
ポートフォリオの製作期間をどのくらいにするか決めました。
自分の場合、約1ヶ月〜1.5ヶ月で開発するようにスケジューリングをしました。

次に個人開発で必要な工程を上げ、各工程でかかる時間を算出しました。
さらに各工程で算出した時間の1.2倍ぐらいの時間を想定してスケジュールを算出しました。

スケジュールを組む際以下の記事を参考にして、各工程どのぐらいの時間がかかるか算出しました。
https://www.sejuku.net/blog/125043
Scala の shapeless について（Poly1, Coproduct, Generic）

# はじめに
今回の記事では、Scala の generic ライブラリである shapeless について調べてみたことをアウトプットしていきます。
誤っている点がございましたらコメントいただけると嬉しいです。
## shapeless とは
> shapelessは、Scalaの型クラスと従属型に基づいた汎用プログラミングライブラリです。
> https://github.com/milessabin/shapeless

この説明だと想像がつきづらいので、次項から主要概念に触れていきたいと思います。


scala プロジェクトに導入する際は、scala のバージョンを 2.11.x ~ 2.13.x に設定し、 build.sbt に下記を追加する必要があるようです。
```
scalaVersion := "2.13.5"
libraryDependencies ++= Seq(
  "com.chuusai" %% "shapeless" % "2.3.3"
)
```
## Poly1
> Shapelessは多相関数を表現するためにPolyという型を提供している。Polyはパラメータの型に依存して結果の型が決まる。
> https://books.underscore.io/shapeless-guide/shapeless-guide.html#polymorphic-functions

ポリモーフィズムという考え方が適用されていて、変換するという意味では scala の Tuple や Function と似ているが、扱い方は異なるそう。
型固有のケースを捉えることができるため、ジェネリックプログラミングに最適な変換が可能となるみたいです。
```scala
object size extends Poly1 {
  implicit def caseInt = at[Int](x => 1)
  implicit def caseString = at[String](_.length)
  implicit def caseTuple[T, U]
    (implicit st : Case.Aux[T, Int], su : Case.Aux[U, Int]) =
      at[(T, U)](t => size(t._1)+size(t._2))
}
scala> size(23)
res4: Int = 1
scala> size("foo")
res5: Int = 3
scala> size((23, "foo"))
res6: Int = 4
scala> size(((23, "foo"), 13))
res7: Int = 5
```
また、Poly 型には、Poly1～Poly22 のサブタイプがあるようです。
## Coproduct
> shapelessはScalaのEitherを一般化したCoproduct型を持ち、任意の数の選択肢を持つことができる。現在のところ、Coproductはマッピング、選択、単一化をサポートしている。
> https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#coproducts-and-discriminated-unions

scala の Either に似ているようで、こちらも概念的には別物で、unionと言われる共用体の方が意味合い的には近いようです。
https://ja.wikipedia.org/wiki/%E5%85%B1%E7%94%A8%E4%BD%93
```scala
scala> type ISB = Int :+: String :+: Boolean :+: CNil
defined type alias ISB

scala> val isb = Coproduct[ISB]("foo")
isb: ISB = foo

scala> isb.select[Int]
res0: Option[Int] = None

scala> isb.select[String]
res1: Option[String] = Some(foo)
```
一般的に、 `A :+: B :+: C :+: CNi` の形をとり、「A または B または C」を意味します。
## Generic
> ShapelessはGenericという型クラスを提供し、具象 ADT とその総称表現の間を行き来することを可能にしている。裏技的なマクロを使えば、定型文なしでGenericのインスタンスを呼び出すことができる。
> https://books.underscore.io/shapeless-guide/shapeless-guide.html#switching-representations-using-generic
```scala
import shapeless.Generic

case class IceCream(name: String, numCherries: Int, inCone: Boolean)
val iceCreamGen = Generic[IceCream]
// iceCreamGen: shapeless.Generic[IceCream]{type Repr = String :: Int :: Boolean :: shapeless.HNil} = anon$macro$4$1@6b9323fe
```
インスタンスは、Repr がつきまとう。
# おわりに
ここまで shapeless の Poly1, Coproduct, Generic について触れてみましたが、実装に落とし込めるほど理解できていないので、これからも学習を続けていきます。
# 参考にした記事
- https://github.com/milessabin/shapeless
- https://books.underscore.io/shapeless-guide/shapeless-guide.html
- https://qiita.com/ryoppy/items/476467a4b709f011fb8f
【Railsチュートリアル】しょっぱなからバージョンを間違えた話

どうもこんにちは
先日Railsチュートリアルを始めたtaku3ukatです。

Railsチュートリアルではver.6.0.4を使い、以下コマンドで指定します。

```
rails _6.0.4_ new (任意の環境名)
```
ただrailsのバージョン確認をすると6.0.5.1と表示されるではありませんか…

#### とりあえずRails 6.0.5.1を消してみる。
```ruby:削除コマンド
gem uninstall railties -v '6.0.5.1' 
```

```ruby:削除結果（ターミナル）
You have requested to uninstall the gem:
        railties-6.0.5.1

rails-6.0.5.1 depends on railties (= 6.0.5.1)
If you remove this gem, these dependencies will not be met.
Continue with Uninstall? [yN]  y
Successfully uninstalled railties-6.0.5.1

ubuntu:~/environment $ rails -v
Rails 6.0.4
```
Rails 6.0.4が掘り起こされました。
全然インストールした記憶がなかったのですが、入っていたんですね。

```
$ gem list
```
を実行すると
```
*** LOCAL GEMS ***

actioncable (6.0.5.1, 6.0.4)
actionmailbox (6.0.5.1, 6.0.4)
actionmailer (6.0.5.1, 6.0.4)
・
・
・
```
と色んなgemが6.0.5.1で入っていました。
最初からインストールやり直した方がいいかもですね。

------追記---------
やり直しても結果は同じでした。
Railsの6.0.5.1と6.0.4が共存している状態で、bundle及びGemfileで指定した6.0.4は
``bundle exec``で実行できるみたいです。
以下コマンドではGemfileで指定したRailsのバージョン確認です。
```
bundle exec rails -v
```
これを実行すると6.0.4が表示されました。
ひとまず不明点が多いので、先のチュートリアルを進めて解説がないか確認してみます。
【新規事業】SkyWayでモザイク加工したカメラ映像を送ってみるよ（完結編）【プロト開発】

【新規事業】SkyWayでモザイク加工したカメラ映像を送ってみるよ（完結編）【プロト開発】
https://shopee.vn/blake.vn	https://shopee.vn/techtra.vn?	https://www.lazada.vn/shop/techtra-shop	https://tiki.vn/cua-hang/shop-blake?
【ポートフォリオ作成1日目】開発環境とrailsアプリケーション作成

# 概要
Webエンジニア転職用のポートフォリオ作成の過程を記録する。
[Ruby on Rails チュートリアル](https://railstutorial.jp/)を1週した後のレベル感。
- PC：M1 MacBook Pro
- エディタ：Visual Studio Code
- ターミナル：iTerm
# rubyのインストール
- [homebrewでanyenvをインストール](https://brew.sh/index_ja)
- [anyenvでrbenvをインストール](https://github.com/anyenv/anyenv)
- [rbenvでrubyをインストール](https://github.com/rbenv/rbenv)
- [（参考）PATHを通すとは？ (Mac OS X)](https://qiita.com/soarflat/items/09be6ab9cd91d366bf71)
# railsアプリケーションの作成
- [gemでrailsをインストール](https://guides.rubyonrails.org/getting_started.html)
- [apiモードでrailsアプリケーションを作成](https://railsguides.jp/api_app.html)
# gitでバージョン管理
- [gitのインストールとバージョン管理](https://railstutorial.jp/chapters/beginning?version=6.0#sec-version_control)
# 参考
- [RailsとReactでSPA開発+AWS（Fargate・CloudFront）デプロイ解説チュートリアル](https://zenn.dev/prune/books/28c2d690e11e45)
- [【Rails×React】UberEats風アプリを作りながら、SPA開発を学ぼう](https://www.techpit.jp/courses/138)
TypedArrayをmapしようとしたら

普通の配列と同じ感覚で`TypedArray`を使っていたら、思わぬ形で引っかかってしまいました。

## `TypedArray`とは

JavaScriptが進化するに連れて、通信・画像・音声など巨大なバイナリデータを扱う場面も増えてきたので、そういったもののハンドリングに便利な、型やサイズを固定した`Uint8Array`、`Float32Array`などの配列オブジェクトが作れるようになっています。

なお、`TypedArray`はこれらの総称、あるいは仕様書上ほかの内部的な名称で、ソースコードに直接`TypedArray`と書くことは通常ありません。

## 実装されているメソッド

`TypedArray`は固定長である以上、破壊的に長さを変更するような`.push`や`.splice`は存在しませんが、それ以外は`.forEach`や`.reduce`、`.join`など、通常の配列にあるメソッドもだいたい揃っています。

### `.map`の罠

その中に`.map`も存在するのですが、`map`した結果は **同じ型の`TypedArray`** でなければならない、という大きな制約がついてきます。TypeScript+VSCodeで書いていたので型エラーとなりすぐに気付けたのですが、そうでなかったら気づかないままコードが思うように動かない、というハマりパターンに突っ込んでいたかもしれないです。

このような場合、`Array.from`を活用できます。`TypedArray`ももちろん`iterable`ですので`Array.from`の第1引数に渡せますし、第2引数に関数を渡せば`map`のように動作をします（`[...typedArr].map`のように一時的にコピーした配列が作られることもありません）。
【トリビアのDelta Lake】#8 Pysparkで、Dataframe内の値を省略せず全表示させたい

Google ColabなどでPysparkを動かし、Dataframeの中身を確認したいとき。
```Python:show_dataframe.py
<dataframeの変数名>.show()
```
で見ることになりますが、カラム内の値が長いと、このように省略されてしまうことも。
```Python:show_dataframe_2.py
df_include_json = spark.createDataFrame([
        (1, '{"year": 2021,"rank":"junior"}'),
        (2, '{"year": 2022,"rank":"senior"}')],
    ["no", "value"]
)
>>>
+---+--------------------+
| no|               value|
+---+--------------------+
|  1|{"year": 2021,"ra...|
|  2|{"year": 2022,"ra...|
+---+--------------------+
```
なぜ、こうなってしまうのでしょうか？

# df.show(truncate=False)
それは、sparkのshowメソッドが、デフォルトでは最大20文字までしか表示しないようにしているからです。

https://spark.apache.org/docs/3.1.3/api/python/reference/api/pyspark.sql.DataFrame.show.html

関係するのはtruncateという引数で、デフォルトではこれがTrueになっている。
値を全表示させたい場合は、**truncateをFalseに設定してあげる**だけでOKです。
```Python:show_all_values_in_dataframe.py

df_include_json = spark.createDataFrame([
        (1, '{"year": 2021,"rank":"junior"}'),
        (2, '{"year": 2022,"rank":"senior"}')
    ],
    ["no", "value"])

df_include_json.show(truncate=False)
>>>
+---+------------------------------+
|no |value                         |
+---+------------------------------+
|1  |{"year": 2021,"rank":"junior"}|
|2  |{"year": 2022,"rank":"senior"}|
+---+------------------------------+
```

# ちなみに、Pandasの場合は？
DataframeといえばPandasですが、ここでも同様なことが起こるし、その対策方法はあります。

Pandasでは、Sparkがコマンドごとに設定を決めるのとは違い、その場のインタープリタ内での全てに設定を影響させるようです。

```Python:display_all_values_with_pandas.py
import pandas as pd 
pd.set_option("display.max_colwidth",<表示させたい最大の数字>)
```

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.describe_option.html

とりあえず10000とかに設定すれば、大体の値は省略されずに表示できるのかなと。
ここの数値を大きく設定しすぎた場合の影響までは現時点で調べきれなかったので、また分かったら追記したいと思います。

# このシリーズの目的
クラウドストレージに蓄積された生データ（CSV,JSON等）を加工するのに必要なPysparkの知識を溜めていく、まさにPysparkに関するトリビアのDalta Lakeを目指しています。
Pysparkに関する記事はまだ海外のものが多く、このシリーズが私のような国内の駆け出しデータエンジニアの一助になることを願っています。
Raspberry Pi Pico WとM5 ATOM Liteの性能比較

Raspberry Pi PicoにもWi-Fi＆Bluetooth機能が搭載された[Raspberry Pi Pico W](https://prtimes.jp/main/html/rd/p/000000091.000064534.html)が発表されました。まだ技適を通っていないため、国内の販売店では売られていません。とはいえ、海外のサイトから購入し、実験のための特例制度を申請すれば、お試しはできるので、ちょっといじくり中です。

個人的には、Raspberry Pi Picoに搭載されているRP2040（マイコン）の特徴は低消費電力であり、採用される製品も単機能かつ電池駆動を前提だと思います。それなので、電力を使うWi-Fiでの通信は相性がイマイチとは思っています。（Bluetoothは期待）

とは言え、ホビーやプロトタイピングでの活用では、手軽にWi-Fiに繋がって、ネットと連携できるマイコンボードとしてはとても魅力的だと思います。

今回は、そんな[Raspberry Pi Pico W](https://www.switch-science.com/catalog/8171/)とESP32を搭載している[M5 ATOM Lite](https://www.switch-science.com/catalog/6262/)の消費電流を比較してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/b7c23510-edfa-9710-c73a-fcb21be5df34.png)

# スペックの比較
まずは、スペックを比較してみます。

| 項目 | Pico W | ATOM-L |
| --- | --- | --- |
| CPUクロック | 133MHz | 240MHz |
| CPUコア数 | 2 | 2 |
| RAM | 264KB | 520KB |
| FLASH | 2MB | 4MB |
| GPIO | 26 | 6+2 |
| その他I/F | BOOTSELボタンx1<br>LEDx1 | ボタンx1<br>リセットボタンx1<br>RGB LEDx1<br>赤外線LEDx1<br>Grove I/F
| 価格 | 1,199円 | 1,408円 |

GPIO以外は、M5ATOM Liteに軍配が上がりますが、どちらもマイコンとしては十分な性能だと思います。

# 消費電流比較（Wi-Fiスキャン）
まずは、Wi-Fiのアクセスポイントをスキャンするスケッチで消費電流を比較してみます。

## スケッチ
どちらもArduino IDEでプログラミングを行い、以下の同じスケッチを動かしました。
ちなみにRaspberry Pi Pico Wは、Arduino IDEでもすでに他のWi-Fiを搭載したボードと同じ様にスケッチを書けるようにアップデートされています。

```c++
#include "WiFi.h"

void setup()
{
    Serial.begin(115200);

    // Set WiFi to station mode and disconnect from an AP if it was previously connected
    WiFi.mode(WIFI_STA);
    WiFi.disconnect();
    delay(100);

    Serial.println("Setup done");
}

void loop()
{
    Serial.println("scan start");

    // WiFi.scanNetworks will return the number of networks found
    int n = WiFi.scanNetworks();
    Serial.println("scan done");
    if (n == 0) {
        Serial.println("no networks found");
    } else {
        Serial.print(n);
        Serial.println(" networks found");
        for (int i = 0; i < n; ++i) {
            // Print SSID and RSSI for each network found
            Serial.print(i + 1);
            Serial.print(": ");
            Serial.print(WiFi.SSID(i));
            Serial.print(" (");
            Serial.print(WiFi.RSSI(i));
            Serial.println(")");
            delay(10);
        }
    }
    Serial.println("");

    // Wait a bit before scanning again
    delay(5000);
}
```

## 計測結果
CPUのクロックスピードが異なるため、Raspberry Pi Pico Wを100MHz、M5 ATOM Liteを80MHzにクロックダウンした値も計測しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/87a37872-a505-0999-5e1b-28a414ac7119.png)

Raspberry Pi Pico Wは、Wi-Fiを使用するときだけ、消費電流が増え、M5ATOM Liteは一定となっていました。
スケッチは同じでも裏の制御が異なるので、単純に比較はできませんが、最大の消費電流を比較すると以下のようになります。

| 項目 | Raspberry Pi Pico W | M5 ATOM Lite |
| --- | --- | --- |
| 標準クロック | 67mA(133MHz) | 115mA(240MHz) |
| クロックダウン | 66mA(100MHz) | 93mA(80MHz) |

※計測が1秒間隔でしか行えなかったため、瞬間的な最大はRaspberry Pi Pico W 133MHzで`80mA`近辺ぐらいあるだと思います。



# 消費電流比較（Http Client）
追記予定

# 処理速度
追記予定
[Swift] SwiftUI で実装した searchable の見た目をカスタマイズする 


# 初めに

色々と調べたものの情報が全く見当たらず困り....
（あったが全く動作しないものが多く困った...）

英語の細かい文献でようやく見つけ、また機会があると思って残しておきます。

## SwiftUI の searchable に関して

`searchable`はiOS15から追加された、検索フィールドを簡単に実装できるものです。

https://developer.apple.com/documentation/swiftui/form/searchable(text:placement:)



## 今回の状況について

引数の`placement`という実装場所を指定できる引数があります。`.navigationBarDrawer（)`をセットすることで、ナビゲージョンバーに検索バーを設定することができます。

`UIKit`の時と比べて、**ナビゲーションにカスタマイズせずに検索バーを実装できる**のは大変ありがたいです。

![nav_01](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/6f3502b0-2927-44e4-4b08-dfdd9b2c2ee9.png)

```.swift
struct DemoView: View {
    
    @State var text = ""
    
    var body: some View {
        NavigationView {
            // Some View
        }
        .searchable(
            text: $text,
            placement: .navigationBarDrawer(displayMode: .always),
            prompt: Text("placeholder")
        )
    }
}
```

これを実装した際に、詳細にカスタマイズしたいと思ったので、記載していきます。

# 実装

動作するものを写真付きで列挙していきます。

今回紹介する方法は、`appearance`を操作します。
`UISearchBar`をラップしたカスタムViewを使いたくないためです。

※**全ての画面で反映されてしまうため、個別に実装したい場合は、要件にそぐわないかと思います。**※

## アイコンの画像と色を変更

今回は例として、画像にSF Symbols（`person`）を使っています。

![nav_icon](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/03157e39-20b1-c063-e628-e06f3e7b0b64.png)


```.swift
let person = UIImage(systemName: "person")
let image = person?.withTintColor(.red, renderingMode: .alwaysOriginal)
UISearchBar.appearance().setImage(image, for: .search, state: .normal)
```

## 検索バーの背景色を変更

![nav_back](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/0fe018cf-bbcf-96dd-5a84-51ea056c9b9d.png)


```.swift
UISearchBar.appearance().backgroundColor = .blue
```

## 検索バーのテキストフィールド背景色を変更

![nav_text_back](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/fffcec3e-4ac1-8dc6-5cfa-6ca0c0e00a06.png)

```.swift
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = .purple
```


## 検索バーの文字色を変更

この情報がなかなか見つからず大変でした。
`appearance`にある`tintColor`、`barTintColor`では**適応されません**。

![nav_text](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/c15eb95e-17c4-2f28-3769-d0a11b91a9bf.png)

```.swift
NavigationView {
    // Some View
}
.searchable(
    text: $text,
    placement: .navigationBarDrawer(displayMode: .always),
    prompt: Text("placeholder")
)
.foregroundColor(.white) // <- here
```

`foregroundColor`を設定することで色を変更することができます。

ただし、この実装はこの画面にある`View`に影響がでるので、`NavigationView`配下にある`View`では、色を個別に上書く必要があるので注意しましょう。

# 終わりに

今回は自分に必要だったものをまとめたので、
`UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self])`
で他にカスタマイズできるものがあると思います。

過去のバグとして上がっていましたが、`appearance`系のカスタマイズは、一部のOSで適応されないことがあるようです。OSが上がった場合に動作の保証はできないので、注意してくださいmm
【Rails】joinした先のテーブルで昇順降順のソートもしたい

## bad

joinした先のテーブルでソートする場合

```ruby
User.eager_load(:posts)
    .order('posts.title')
```

という例をよくみるが、これだと文字列を使う＆昇順・降順のソートができない。

## better

```merge```を使うことでjoinした先のテーブルで昇順・降順のソートができる。

```ruby
User.eager_load(:posts)
    .merge(Post.order(title: :asc))
```


## 参考

https://railsdoc.com/page/model_order

https://qiita.com/shshimamo/items/bd8150598cf2a157b980
えっ!? デプロイされた状態のコンパイル済 JavaScript にも Source Map を適用する方法があるんですか!?

イマドキのフロントエンド開発だと、TypeScript からのトランスパイルや圧縮をかけられた「コンパイル済」の JavaScript が成果物となっている場合が多いのではないでしょうか。著名なフレームワークが TypeScript をサポートするようになったり、デフォルトのビルド設定で圧縮が適用されていたりするからです。

一方、[webpack-dev-server](https://webpack.js.org/configuration/dev-server/) などの開発用サーバを利用していると、ブラウザの開発者ツールがコンパイル前の状態（ソースコード・フォルダ構成）を認識していることに気が付きます。これは、開発用サーバが [Source Map](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#) を自動生成し、ブラウザに参照させているためです。

プロダクションビルドの場合、意識的に設定しなければ Source Map を生成しない状態になっていると思われます[^1]。しかし、コンパイル済のコードのみがデプロイされている状況だと、本番環境でしか発生しない問題をブレークポイントを仕込んで確認したいときに困っちゃいますよね。もちろん、そんな必要がないようにすべきではありますが…。

[^1]: https://webpack.js.org/configuration/devtool/#production

## Source Map を生成する

何はともあれ、Source Map を生成しないと始まりません。Webpack の場合、`webpack.config.js` などのビルド設定ファイルに `devtool` を指定することで Source Map を生成できます：

```javascript
{
  // devtool: '[inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map' | false
  devtool: 'hidden-source-map'
}
```

`hidden-*` の場合、成果物の末尾に `//@ sourceMappingURL=min.js.map` のような Source Map への参照が付与されません。参照先の Source Map が存在しないと開発者ツールが 404 を出してしまい煩雑ですので、今回の用途でお勧めです。詳しくは[公式のマニュアル](https://webpack.js.org/configuration/devtool/)を参照してください。

## コンパイル済の JavaScript が読込されている状態で Source Map を適用する

Chrome / Edge の場合、開発者ツールでローカルの Source Map を適用できるのですが、需要が少ないからなのか動線があまり分かりやすくありません。以下 Chrome のスクリーンショット付きで説明しますが、Edge の場合は各項目が日本語化されていますので幾分わかりやすいです。

1. 開発者ツールで `Sources` 画面を開き、サイドバーの `Pages` タブでコンパイル済の JavaScript を開きます。

    ![source-map1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/50f27f1b-159c-88c4-413e-a5f88f7136c9.jpeg)

2. ここが分かりにくいのですが、**ソースコードが表示されている部分**を右クリックして、コンテキストメニュー内の `Add source map…` をクリックします。

    ![source-map2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/fd75cc0f-c21b-b61f-ea93-53dd6b6c701a.jpeg)

3. 表示された小窓に `Source map URL` を指定し、`Add` を押下します。このとき、`file:///` スキームでローカルのファイルも指定できます。

    ![source-map3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/e4919220-40d7-7c2b-998d-7e99d0600562.jpeg)

4. Source Map が読み込まれ、コンパイル前のソースが表示できました。当然、ブレークポイントの設定やステップ実行も可能です。

   ![source-map4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/1a4dd253-ce01-f566-c3b5-14ed90bfdb84.jpeg)

## 参考リンク

* [Source Map Revision 3 Proposal](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit)
* [SourceMap - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/SourceMap)
* [Source maps: languages, tools and other info](https://github.com/ryanseddon/source-map/wiki/Source-maps:-languages,-tools-and-other-info)
Github ActionでDB2コンテナの起動を待つcompositeなActionを書いてみました

[ibm/db2](https://hub.docker.com/r/ibmcom/db2)のコンテナは簡易的なテスト環境を作るときなどに便利ですが、DB2のセットアップから起動までに時間がかかるという欠点があります。

そのため、Github Actionのdocker上で利用しテストなどを実行しようとすると、DB2に接続できる状態を確認するためのShell Scriptを書く必要になることが多々あったため、DB2のデータベースが構築される状態になるまで待つだけの処理を書いたActionを作ってみました。


## Action
https://github.com/amanoese/db2-container-wait-action

## 使い方

シンプルに下記を書くだけです。

```yaml
- uses: amanoese/db2-container-wait-action@v1
```

dockerコンテナの名前やデータベース名は指定しない限り、
最初に見つかったものを採用するため設定不要です。

また、データベース名を指定したい場合や2つ以上DBを使う場合などのために、オプションで指定できるようになっています。
詳しくは「[usage-advanced-setting](https://github.com/amanoese/db2-container-wait-action#usage-advanced-setting)」を見てください。

### workflow例

[README](https://github.com/amanoese/db2-container-wait-action)にも書いていますが、下記のように利用されることを想定しています。

```yaml
name: workflow-example
on: push

jobs:
  simple-db2:
    runs-on: ubuntu-latest
    steps:
      - name: start db2 container
        run: docker run --name mydb2 --privileged=true -e LICENSE=accept -e DBNAME=testdb -dt ibmcom/db2

      - name: wait database create
        uses: amanoese/db2-container-wait-action@v1

      - name: check connect database
        run: docker exec -t mydb2 bash -c "sudo -i -u db2inst1 db2 'connect to testdb'"
```

## 備考
Action作るのおもしろいですね。

DB2詳しくないので、かんたんに待つ方法をご存知のかたがございましたらご教示いただけると幸いです。
.Net 6: C# で PostgreSQL の Delete

プロジェクトの作成

```bash
mkdir Delete01
cd Delete01
dotnet new console
dotnet add package Npgsql --version 7.0.0-preview.6
```

フォルダー構造

```text
$ tree -L 1
.
├── Delete01.csproj
├── Program.cs
└── obj
```

```cs:Program.cs
// ----------------------------------------------------------------
/*
	Program.cs

					Aug/09/2022

*/
// ----------------------------------------------------------------
using System;
using System.Data;
using System.Text;
using Npgsql;

// ----------------------------------------------------------------
public static class postgres_delete
{
// ----------------------------------------------------------------
static async Task Main (string[] args)
{
	Console.WriteLine ("*** 開始 ***");
	string	id_in = args[0];

	string server="localhost";
	string str_db="city";

	string user="scott";
	string password="tiger123";

	string str_connect = "Host=" + server + ";Username="
		+ user + ";Password="
		+ password + ";Database=" + str_db + ";";

	await using var conn = new NpgsqlConnection(str_connect);
	await conn.OpenAsync();

	delete_proc(conn,id_in);

	Console.WriteLine ("*** 終了 ***");
}

// ----------------------------------------------------------------
static void delete_proc
	(NpgsqlConnection connection,string id_a)
{
	StringBuilder sb_sql = new StringBuilder
			("DELETE from cities WHERE ID = '" + id_a + "'");

	string str_sql = sb_sql.ToString ();

	Console.WriteLine (str_sql);

	NpgsqlCommand command = new NpgsqlCommand (str_sql,connection);
	int rowsAffected = command.ExecuteNonQuery ();
	Console.WriteLine ("rowsAffected = " + rowsAffected);
}

// ----------------------------------------------------------------
}
// ----------------------------------------------------------------
```

実行結果

```text
$ dotnet run t3463
*** 開始 ***
DELETE from cities WHERE ID = 't3463'
rowsAffected = 1
*** 終了 ***
```
GitLabが502エラーで開けない

GitLabをインストールしてさあやるぞ！と思ったら502エラーで開けなかったときの戦ったメモです。
### 環境
* ホストOS - CentOS8
* Docker - 20.10.17
* GitLab - 3.0
### GitLabを設定したアドレスに入ったら502エラー
![20201110215126.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1873794/f734f510-d03f-c6f9-fce0-013264495e82.jpeg)
この子がお出迎えしてくれました。（うれしくない）
### 原因調査
まずDockerのコンテナに入って、、、
```
docker container exec -it 【コンテナ名】 bash
```
ログをみる。
```
cat /var/log/gitlab/gitlab-workhorse/current | less
```
怪しそうなログを発見。
`badgateway: failed to receive response: dial unix /var/opt/gitlab/gitlab-rails/sockets/gitlab.socket: connect: no su ch file or directory`
### 原因：`gitlab.socket`が無い
環境構築でごそごそやっている間に消してしまったようです…。
### 解決策：`.gitlab_workhorse_secret`の所有者変更で`gitlab.socket`を自動生成させる
とりあえず解決したコードです。
```
chown -h git:git /opt/gitlab/embedded/service/gitlab-rails/.gitlab_workhorse_secret
chown git:git /var/opt/gitlab/gitlab-rails/etc/gitlab_workhorse_secret
gitlab-ctl stop
gitlab-ctl restart
gitlab-ctl reconfigure
```
以下詳細なので気になる方はどうぞ。
#### 解決までの経緯
[同じように悩んでいる方](https://teratail.com/questions/60389)の回答をみると、
> いろいろ試行錯誤した結果、`gitlab.socket`ファイルが存在しなかったり、不正なものだったりした場合は、`/opt/gitlab/embedded/service/gitlab-rails/.gitlab_workhorse_secret`ファイルにアクセスを行い、再度生成しようとするらしいです。ですので、上記のファイルに対するアクセス権限が無いと`gitlab.socket`ファイルを作成することが出来ず、500エラーとなっていたようです。

とのこと。
というわけで`ls -l /opt/gitlab/embedded/service/gitlab-rails/.gitlab_workhorse_secret`で確認してみると、所有者がrootになっていました。これっぽい。
というわけで変更。
```
chown -h git:git /opt/gitlab/embedded/service/gitlab-rails/.gitlab_workhorse_secret
chown git:git /var/opt/gitlab/gitlab-rails/etc/gitlab_workhorse_secret
```
変更したので、再起動。
```
gitlab-ctl stop
gitlab-ctl restart
gitlab-ctl reconfigure
```
動いた！`gitlab-ctl reconfigure`が30分くらいかかったのでつらかった。
### 参考
参考にさせていただきました。ありがとうございます。
* https://teratail.com/questions/60389
.Net 6: C# で PostgreSQL の Update

プロジェクトの作成

```text
mkdir Update01
cd Update01
dotnet new console
dotnet add package Npgsql --version 7.0.0-preview.6
```

フォルダー構造

```text
$ tree -L 1
.
├── Program.cs
├── Update01.csproj
└── obj
```

```cs:Program.cs
// ----------------------------------------------------------------
/*
	Program.cs

					Aug/09/2022

*/
// ----------------------------------------------------------------
using System;
using System.Data;
using System.Text;
using Npgsql;

// ----------------------------------------------------------------
public static class postgres_update
{
// ----------------------------------------------------------------
static async Task Main (string[] args)
{
	Console.WriteLine ("*** 開始 ***");
	string	id_in = args[0];
	int	population_in = int.Parse (args[1]);

	string server="localhost";
	string str_db="city";

	string user="scott";
	string password="tiger123";

	string str_connect = "Host=" + server + ";Username="
		+ user + ";Password="
		+ password + ";Database=" + str_db + ";";

	await using var conn = new NpgsqlConnection(str_connect);
	await conn.OpenAsync();

	update_proc(conn,id_in,population_in);

	Console.WriteLine ("*** 終了 ***");
}

// ----------------------------------------------------------------
static void update_proc
	(NpgsqlConnection connection,string id_a,int population_a)
{
	DateTime dateNow = DateTime.Now;

	string str_date = dateNow.ToString("yyyy-MM-dd HH:mm:ss");
	Console.WriteLine (str_date);

	StringBuilder sb_sql = new StringBuilder
			("UPDATE cities SET population = "
			+ population_a + @" , date_mod = '" + str_date +
			@"' WHERE id = '" + id_a + "'");

	string str_sql = sb_sql.ToString ();

	Console.WriteLine (str_sql);

	NpgsqlCommand command = new NpgsqlCommand (str_sql,connection);
	int rowsAffected = command.ExecuteNonQuery ();
	Console.WriteLine ("rowsAffected = " + rowsAffected);
}

// ----------------------------------------------------------------
}
// ----------------------------------------------------------------
```

実行結果

```text
$ dotnet run t3466 8932100
*** 開始 ***
2022-08-09 20:04:38
UPDATE cities SET population = 8932100 , date_mod = '2022-08-09 20:04:38' WHERE id = 't3466'
rowsAffected = 1
*** 終了 ***
```
記事作成テンプレート


```
# 概要
- [リンクテキスト](URL)
- [リンクテキスト](URL)
# 1
- [リンクテキスト](URL)
- [リンクテキスト](URL)
# 2
- [リンクテキスト](URL)
- [リンクテキスト](URL)
# 参考
- [リンクテキスト](URL)
- [リンクテキスト](URL)
```
CUDAカーネルをC++クラスのメンバ関数に実装

C++のCUDAコードは、オブジェクト指向で書きづらいため、難解なコードが多い。

そこで、以下のコードを作ってみた。
https://github.com/rueiwoqpqpwoeiru/image-process-CUDA/blob/main/Basic.h

Basic.h の12行目のgeneric_kernelは、可変引数のテンプレート関数で、その中で、
(obj->kernel)(args...)　により、54行目や97行目にある「kernel」という名前の
メンバ関数を呼ぶ。

```C++:Basic.h の12行目
template<typename T, class... Args> __global__ void generic_kernel(T* obj, Args... args) {
	(obj->kernel)(args...);
}
```
```C++:Basic.h の54行目（メンバ関数）
__device__ __forceinline__ void kernel(const D_data<T_in> in, D_data<T_out> out) {
	unsigned int x = blockDim.x * blockIdx.x + threadIdx.x;
	unsigned int y = blockDim.y * blockIdx.y + threadIdx.y;
	if (in.w > x && in.h > y) {
		for (unsigned int k = 0; k < in.ch; k++) {
			out.val(x, y, k) = static_cast<T_out>(in.tex(x, y, k));
		}
	}
}
```
generic_kernelは、51行目や94行目の通り、自身のクラスの型を
テンプレート引数として与えて、クラス内から呼び出す。このとき
一つ目の引数は「this」で、その後の引数は可変。

```C++:Basic.h の51行目（メンバ関数）
void do_proc(const D_mem<T_in>& in, const dim3& block = dim3(32, 8)) {
	Proc_unit p(in.d_data.w, in.d_data.h, block);
	Stopwatch sw;
	K_func::generic_kernel<Cast_img> << < p.grid, p.block >> > (this, in.d_data, _out.d_data); // 51行目
	sw.print_time(__FUNCTION__);
}
```

この方法だと、CUDAカーネルを実装するメンバ関数の名前が「kernel」に限定され、
１つのクラスから１つのカーネルしか呼べない。しかし、クラスを入れ子にして
階層構造を作ることで、不便なくコードを作れた。むしろ、クラスが複雑にならない
メリットがあった。また、速度面も問題無かった。ただし「kernel」関数は、引数を
参照型にしたら動作しなかったので注意。

以上説明した方法によれば、CUDAカーネルをクラス内に閉じ込めてブラックボックス化できる
ため、クラスを作ってしまえば、部品を組み合わせる感覚で、容易にGPUを利用できる。

なお、ここで紹介した方法を使ったCUDAコードについては、以下で詳細に説明。
https://qiita.com/rueiwoqpqpwoeiru/items/69a931e4042a4f9d4434
共通接線「15年 福島大 人文社会 4」をWolframAlpha とsympyでやってみた。 

オリジナル
y=-2x^3+3,y=-2x^3-1　3次関数がy方向へ-4移動です。

https://kamelink.com/blog/2022/08/09/11-3-15-fukusimadai-zinnbunnsyakai-4/

大学入試数学問題集成＞

https://mathexamtest.web.fc2.com/2015/201510141/2015101410100mj.html#top-0106

# WolframAlpha で
プロット

https://www.wolframalpha.com/input?i=y%3D-2x%5E3%2B3%2Cy%3D-2x%5E3-1%2Cy+%3D+-3*2**%281%2F3%29*x+%2B+1&lang=ja

# sympyで
```python
from sympy import *
var('x yf yg s t ')
y1=-2*x**3+3
y2=-2*x**3-1
Sbs={x:s}
Sbt={x:t}
y1L=diff(y1,x).subs(Sbs)*(x-s)+y1.subs(Sbs)
y2L=diff(y2,x).subs(Sbt)*(x-t)+y2.subs(Sbt)
myCoff=Poly(y1L-y2L,x).all_coeffs()
ans=solve([myCoff[0],myCoff[1]],[s,t])
print("# y =",y1L.subs({s:ans[0][0]}).simplify())
# y = -3*2**(1/3)*x + 1
```
.Net 6: C# で PostgreSQL の Read

参考ページ
[Npgsql 7.0.0-preview.7](https://www.nuget.org/packages/Npgsql/7.0.0-preview.7)

プロジェクトの作成

```bash
mkdir Read01
cd Read01
dotnet new console
dotnet add package Npgsql --version 7.0.0-preview.7
```

フォルダー構造

```text
$ tree -L 1
.
├── Program.cs
├── Read01.csproj
└── obj
```

```cs:Program.cs
// ----------------------------------------------------------------
/*
	Program.cs

					Aug/09/2022

*/
// ----------------------------------------------------------------
using System;
using System.Data;
using Npgsql;

// ----------------------------------------------------------------
public static class postgres_read
{
// ----------------------------------------------------------------
// public static void Main (string[] args)
static async Task Main (string[] args)
{
	Console.WriteLine ("*** 開始 ***");
	string server="localhost";
	string str_db="city";

	string user="scott";
	string password="tiger123";

	string str_connect = "Host=" + server + ";Username="
		+ user + ";Password="
		+ password + ";Database=" + str_db + ";";

	await using var conn = new NpgsqlConnection(str_connect);
	await conn.OpenAsync();

	await using (var cmd = new NpgsqlCommand("SELECT * FROM cities", conn))
	await using (var reader = await cmd.ExecuteReaderAsync())
	{
	while (await reader.ReadAsync())
		{
		string out_str = "";
		out_str += reader.GetString(0) + "\t";
		out_str += reader.GetString(1) + "\t";
		out_str += reader.GetValue(2).ToString() + "\t";
		out_str += (reader.GetValue(3)).ToString();

       		Console.WriteLine(out_str);
		}
	}

	Console.WriteLine ("*** 終了 ***");
}

// ----------------------------------------------------------------
}
// ----------------------------------------------------------------
```

実行結果

```text
$ dotnet run
*** 開始 ***
t3461	広島	35867	2009-4-21
t3462	福山	52146	2009-7-9
t3463	東広島	29381	2009-9-19
t3464	呉	75836	2009-7-29
t3465	尾道	18924	2009-11-2
t3466	竹原	71456	2009-10-7
t3467	三次	92391	2009-9-9
t3468	大竹	75843	2009-8-16
t3469	府中	49123	2009-10-24
*** 終了 ***
```

次のバージョンで確認しました。

```text
$ dotnet --version
6.0.400
```