OmniAICreator/Qiita-1.07M huggingface dataset:
Windowsで各ユーザのログイン状況を確認する方法

# はじめに
Windowsをメンテする際、再起動したいけど誰がログインしているか確認したいときがある。
そんなときユーザのログイン状況を確認する方法の備忘録である。

# quserコマンド
コマンドプロンプトを開き、コマンドを打ち込む。
ログオンしているユーザ一覧が表示される。RDP接続しているとセッション/ID・Activeと表示された。
RDPログインしていない場合、Discとなった。

Windows Server 2019 Standardで確認

~~~console:
C:\Users\Administrator>quser
                                                      アイドル
 ユーザー名            セッション名       ID  状態    時間       ログオン時刻
 user5                 rdp-tcp#51          2  Active         48  2022/08/10 17:48
 user1                                     3  Disc      8+19:14  2022/08/10 18:27
 user4                                     4  Disc      1+19:20  2022/08/15 9:58
>administrator         rdp-tcp#59          5  Active          .  2022/08/16 17:36
 user2                                     6  Disc        21:20  2022/08/17 16:17
 user3                                     7  Disc            4  2022/08/18 11:54
 user6                                     8  Disc        20:13  2022/08/18 17:01
~~~

Powershellで実行しても表示は同じだった。
~~~console:
PS C:\Users\Administrator> quser
                                                      アイドル
 ユーザー名            セッション名       ID  状態    時間       ログオン時刻
 user5                 rdp-tcp#51          2  Active         48  2022/08/10 17:48
 user1                                     3  Disc      8+19:13  2022/08/10 18:27
 user4                                     4  Disc      1+19:20  2022/08/15 9:58
>administrator         rdp-tcp#59          5  Active          .  2022/08/16 17:36
 user2                                     6  Disc        21:20  2022/08/17 16:17
 user3                                     7  Disc            3  2022/08/18 11:54
 user6                                     8  Disc        20:13  2022/08/18 17:01
~~~

# まとめ
ログインユーザを確認した上で再起動しましょう。
Windowsで yarn dev を実行した際に「このシステムでは〜」エラーが出た時の対処


# 前提条件
[Windowsでnvmをインストールし、Node.jsとyarnも入れた手順](https://qiita.com/katsu17/items/af5d06baf7f56d5840a2)
↑こちらで環境構築をした前提


1. `yarn : このシステムではスクリプトの実行が無効になっているため～`
エラーが出た場合、Windows Power shellを管理者権限で開く。
※ windowsスタートボタン → Power shell → 右クリック → 管理者として実行を選択

    `Get-ExecutionPolicy`をPower shellで実行
`Restricted`と表示された場合、
`Set-ExecutionPolicy -ExecutionPolicy RemoteSigned`を実行しポリシーを変更する

`yarn dev`を実行後、
```
error - Failed to load SWC binary for win32/x64, see more info here: https://nextjs.org/docs/messages/failed-loading-swc
```

上記エラーが出た場合、

**対処１**
next.json.jsファイルを開き
```
module.exports = {
  swcMinify: false 
}
```
上記を記載して保存する。

ルートディレクトリに「.babelrc」という名前のファイルを作り、
```
{
  "presets": ["next/babel"]
}
```

上記を記載して保存する。


**対処２**
VScode内のターミナルで
`yarn add next@11.1.1-canary.7`
と入力し、再度`yarn dev`と入力して`local host:3000`が開けるかどうか確認する。


**対処3**
yarn dev を実行した際に、
`'next' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。`
というエラーが出た場合

`npm -g update`
を実行し、
`npm ci`
を実行し、必要パッケージをインストールする。

その後
`yarn add next@11.1.1-canary.7`
を実行し、
`yarn dev`
を実行。
Windowsでnvmをインストールし、Node.jsとyarnも入れた手順

# 実行環境
Windows10 バージョン20H2

## 必要ソフト
ChromeとVScodeを使用する前提での構築になります。

### Chromeのインストール
バージョン: 104.0.5112.81（Official Build） （64 ビット）
[Google Chrome インストール](https://www.google.com/intl/ja_jp/chrome/)

### VScodeのインストール
Version: 1.70.1
OS: Windows_NT x64 10.0.19042

[VScode インストール](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)

### nvmのインストール
version: 1.1.9

[nvm インストール](https://github.com/coreybutler/nvm-windows/releases)
※nvm-setup.exe をダウンロード、実行

# 構築手順

1. 管理者権限でコマンドプロンプトを開く
スタート→ windows システムツール → コマンドプロンプトを右クリック → その他 → 管理者として実行

2. nvmのコマンドでnode.jsをインストールする
`nvm ls`を実行し、インストールされているnodeを確認。
`No installations recognized`と表示されればインストールされていない状態。

3. インストール可能なバージョン一覧を表示
`nvm list available`を実行し、バージョン一覧が表示したら、LTSの欄に記載されている最新バージョンをインストール。

4. nodeのインストール
`nvm install 16.16.0`と入力(数字部分は必要とするバージョン)し、指定したバージョンをインストール。

5. インストールしたnodeを使用する宣言
`nvm use 16.16.0`と入力し、使用するバージョンを宣言する。

6. 使用中のバージョンを確認
`node –version`を実行して、`nvm use`で指定した数字が表示されればOK

7. yarnをインストール
`npm install -g yarn`
Symfony(6.0) で Hello World!

## 概要

SymfonyのWebアプリでいわゆるHello Worldを行います。
SymfonyはPHPのMVCフレームワークの1つとなります。

Symfony6.0を対象としていますが、現行バージョンである6.1(PHP8.1以上)でも同様の操作で構築可能です。

## 環境情報

Windows10
[PHP8.0](https://windows.php.net/download#php-8.0)
[Composer](https://getcomposer.org/download)
[Symfony CLI](https://symfony.com/download)

(本記事ではDockerを扱いません。ローカルにインストールされているPHPを利用しております。)

### Symfony CLIのダウンロード

https://symfony.com/download


Windows > Binaries > amd64(または386)をクリックすると、zipでダウンロードされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575914/d259a0b8-c35a-2c16-40f2-11c0d3509163.png)

symfony.exeを任意のフォルダに配置し、環境変数のPathに追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575914/78783022-dab7-ffab-44f1-d1ffd11c74ec.png)


## プロジェクト作成

コードを配置したいフォルダで次のコマンドを実行します。

```
symfony new my_project_directory --version="6.0.*" --webapp
```
my_project_directory は作りたいプロジェクトのフォルダ名にします。

![構築後のディレクトリ構成
](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575914/9a465db2-b369-53d7-82f5-920699233360.png)

## PHPビルトインサーバー起動(Symfony CLI経由）

以下コマンドを実行することで、開発用Webサーバーを起動出来ます。
```
symfony server:start
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575914/f2179875-bacc-8eae-ba50-c5786ff39cda.png)

終了するときはctrl+cを入力します。

表示されているURLをブラウザで開くと、SymfonyのWelcomeページが表示されます。
https://127.0.0.1:8000/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575914/6f2730c6-6d62-a24e-e354-41ee7f506a75.png)

（Welcomeページの内容はtemplates/base.html.twigとなります。）

## ページ追加

### Controller

src/Controller以下にHelloController.phpを作成します。

``` php
<?php
// src/Controller/HelloController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HelloController extends AbstractController
{
    // ルーティングを定義しています。
    #[Route('/hello')]
    public function index(): Response
    {
        return $this->render("hello/index.html.twig", 
            ["name" => "Alice"]);
    }
}

```


### View

templates以下にhello/index.html.twigを作成します。

``` twig
{# templates/hello/index.html.twig #}
<h1>Hello, {{ name }} !</h1>
```

### 表示

/helloをブラウザで開くと、Controllerで渡した値(Alice)が
Viewに適用されて表示されます。
https://127.0.0.1:8000/hello

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575914/ed89db62-7d3a-417a-d091-2821b8d22430.png)

## 公式ドキュメント

https://symfony.com/doc/6.0/index.html

必要に応じて、画面左上のVersionを変更して御覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575914/e26daed0-7b66-1fac-678e-a310c2d7f56e.png)

## 余談

symfony6系の日本語記事が少なく、業務で困ったため自分で書いてみることにしました。
(古いバージョンの記事や、Laravel9のPHP対応バージョンがSymfonyの影響で……みたいな記事がヒットします。）
Dockerでの環境構築や、基本的なWebシステムの機能を一通り記事にしていければと思います。
【SwiftUI】Bindingの初期化方法

# 初期化方法
```swift
struct SearchView: View {
    @Binding private var searchText: String

    init(searchText: Binding<String>) {
        self._searchText = searchText
    }

    var body: some View {
        Text(searchText)
    }
}
```

:::note info
ポイント1
`init(searchText: Binding<String>)`
Binding<型名>で定義する
:::

:::note info
ポイント2
`_searchText`
変数名の前に`_`を付けることでBindingを示す
:::
M1Macでdocker buildがエラーになる

備忘録。考えれば当たり前のことですが。。

## エラー

※ECRにアップロードして、ECSで動かす前提です

Dockerfileに記載していた`RUN pip install -r requirements.txt`でgccが存在しないエラーを吐いていた

gccとgcc+を事前にapt-getするようにしても、起動後に停止してしまう

## 対応内容

`docker build`実行時に`--platform linux/amd64`オプションを追加する
[保存版]JavaScriptのOOPをより深く理解するために[prototype基礎]

# はじめに
本記事は __Udemy著者『 _CodeMafia_ 』様の「【JS】ガチで学びたい人のためのJavaScriptメカニズム」__ の内容を参考にしています。
JavaScriptの基礎的な文法から応用的な使用例まで備忘録・復習を兼ねて記事にしていこうと思います。
特にUdemy「【JS】ガチで学びたい人のためのJavaScriptメカニズム」の質問内容に目を通しています。Jsの学習を共に解決していけたら幸いです。
__その他のQuiitaの記事やMDNの構文は積極的に引用しようと思います。__

## この記事の対象読者
+ Javascript入門者
+ Class構文を理解したい
+ prototype という"特別"なオブジェクトについてデバックしながら理解したい。
+ JavaScriptの[参照]について確認したい。

### コードから追っていきます

```javascript
//1.コンストラクター関数を定義します
function Cat(name, age) {
    this.name = name;
    this.age = age;
}

//2. new演算子でインスタンス化します。引数は任意です。
const tama = new Cat('tama',12);

//3.tamaの情報をコンソールで見ます。
console.log(tama); //Cat {name: 'tama', age: 12}
````

次にCatから生成されるインスタンスにメソッドを付与していきます。
今回は、tamaに「ニャアと言ってもらいます」
JavaScriptでは「関数もオブジェクト」ですので.記法でprototypeオブジェクトを繋げてかけます。

```javascript
//1.Catのprototypeというオブジェクトにアクセス。
//2.使用したいメソッドを追加できる「.shout()」、無名関数を代入して処理を書き込こむ。
Cat.prototype.shout = function () {
    console.log(this);//このthisはCatなので
    console.log(`${this.name} say ニャア`);//3.変数は「this.name」を使用。
}
tama.shout(); //=>  tama say ニャア


```

次に 「protype.メソッドで設定した関数の状態(参照)」がどうなっているのかを調べるために、新たなインスタンスをCatから生成してみます。

mikeというインスタンスをCatから生成し、メソッドを呼び出してみます。

```javascript
const mike = new Cat('mike',12);
mike.shout(); //=> mike say ニャア
```

さて、このメソッドはなぜ使えるのかと思わないでしょうか？

現在のコンソールの中身を見ればわかります。

consoleにtamaと打ってenter
```javascript
Cat {name: 'tama', age: 12}
age: 12
name: "tama"
[[Prototype]]: Object  //=>>ここのPrototypeの中のshout：f（）をCatから生成した
                       //他のインスタンスも参照しできる
shout: ƒ ()
constructor: ƒ Cat(name, age)
[[Prototype]]: Object
```

ことに起因します。
```javascript

Cat.prototype.shout = function () {
    console.log(`${this.name} say ニャア`);
}


```
つまり、この式の「追加されたshoutメソッド(左辺)」が「(右辺の)functionを参照」しているので、Catから生成された他のオブジェクトでも

:::note info
[[Prototype]]: Objectを介して、メソッド参照できるという仕組みになっています。
:::

## 参照のコピーに関して
ちなみに[[Prototype]]というのはCat.prototypeの参照のコピーになるので、実体のオブジェクトは一致します。
コードでそれを証明すると以下のようになります。
```javascript
console.log(Object.getPrototypeOf(tama) === Cat.prototype);
console.log(Object.getPrototypeOf(mike) === Cat.prototype);
```

これらはどちらもtrueになります。

[Object.getPrototypeOf():MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf)





# まとめ

今回はコンストラクタ関数、インスタンス化、prototypeの参照を確認しました。
+ 参照に関する記事
ポートフォリオとして家事×バトルというwebアプリを作った。

# はじめに
ポートフォリオとして作成したWebアプリケーションの紹介記事です。

作成したアプリの概要
- 「家庭内の家事分担割合を可視化する」ことを目的に作ったWebアプリケーションです。
- サービス名は「家事×バトル」としました。
![スクリーンショット 2022-08-19 9.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948501/343208f9-01bb-2b68-0dae-be9e1cc9e3ca.png)

日々家事をこなしていると、夫と妻どちらが家事を多く実施しているか、客観的に評価することが難しいと思い、
実施した家事の量を集計して、比較することができるアプリを作成しました。

アプリのURLはこちらです。
https://kazi-battle.herokuapp.com/

githubのソースコードはこちらです。
https://github.com/shosuke1989/kazi-battle

# アプリの使用方法
別ページにまとめました。以下のリンク先に説明があります。
https://www.heburushu.com/entry/kazi-battle

# 使用技術
使用技術についてフロントエンド、バックエンド、インフラで分けると以下のとおりとなります。
### フロントエンド
HTML
CSS,Sass
Bootstrap
### バックエンド
Ruby
sqlite3
PostgreSQL
Ruby on Rails
chartkick
### インフラ
VScode
Heroku
github

以上です。
最後まで読んでいただきありがとうございます。
SourceTreeとGithub連携手順

# SourceTreeでのGithub認証手順

## 対象者
+ Mac版 SourceTreeでGithub認証をしたい方向け

## 手順
1. Github設定画面にてトークンを発行しておく 
1. SourceTreeのアカウント設定画面にて、認証設定をBasicに設定してパスワードの欄にトークンを貼り付ける。
1. 完了
【Rails】nilを最後にソートしたい

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16 


## 状況
```User```を```Post```の```category_id```の降順かつ```nil```を最後にソートしたいとき、このように書くと

```ruby
User.eager_load(:posts)
    .order('posts.category_id IS NULL')
    .merge(Post.order(category_id: :desc))
    .select('users.*', 'posts.category_id AS posts_category_id')
```

下記のエラーと
```
for SELECT DISTINCT, ORDER BY expressions must appear in select list
```

下記の警告が出る。
これについては伊藤さんの記事がとても参考になりました。

```
DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): "posts.category_id IS NULL". Non-attribute arguments will be disallowed in Rails 6.1. This method should not be called with user-provided values, such as request parameters or model attributes. Known-safe values can be passed by wrapping them in Arel.sql().
```

https://qiita.com/jnchito/items/5f2f00c93c0ba68e4d31

エラー文についてはよく```select```に```order```したいカラムを指定すると解決するというようなことが書かれている事が多かったが、私の場合はすでに指定しているのにエラーが…。

## 解決法

降順で```nil```を最後にソートするには```DESC NULLS LAST```を使う。
```ruby
User.eager_load(:posts)
    .order('posts.category_id DESC NULLS LAST')
    .select('users.*', 'posts.category_id AS posts_category_id')
```

## 参考

Rails6.1からは```nulls_first```と```nulls_last```が使えるのですごく便利そう。

https://www.bigbinary.com/blog/rails-6-1-adds-nulls-first-and-nulls-last-to-arel
PythonとCの連携で高速処理！！(ctypes)

# Pythonが好きだ
こんにちは、Laddgeです。


みなさんはどのプログラミング言語を普段使っていますか？
自分はPythonが大好きです。


「ああああああああPythonが好きだあああああああ」


# Pythonの弱点
Pythonの弱点といえば、やっぱり実行速度の遅さですよね。
遅さの原因は、Pythonが「インタプリタ言語」であることにありそうです。

プログラミング言語には大きく分けて「コンパイラ言語」と「インタプリタ言語」があります。

||コンパイラ言語|インタプリタ言語|
|---|---|---|
|特徴|最初に全てを機械語に変換してから実行する|一行ずつ機械語に変換しながら実行する|
|速さ|速い|遅い|
|開発のしやすさ|コードを書き換えるたびにコンパイルしなおす必要があってめんどい|コードを書き換えたら即実行できる|
|例|C系, Java, Goなど|Python, JavaScript, PHP, rubyなど|


という感じになっていて、Pythonは右の方ですね。
いちいちコンパイルしなくていいインタプリタ言語は初心者には扱いやすいです。
エラーが起きた時のデバッグもインタプリタ言語の方がやりやすいと思います。

書きやすいのはいいのだけど、実行速度はどうしてもコンパイラ言語には敵いません。


# ctypesでCと連携！？
実は、PythonはC言語とめちゃくちゃ相性がよくて、C言語と連携するためのライブラリが標準で用意されています。

それが、「ctypes」です。
これを使うとC言語で書いた関数や構造体などをPythonから使うことができるようになります。

今回はこいつで、重い処理はCに投げちゃえばよくねってのを検証していこうと思います。

# いざ検証
検証方法としては、再帰ループでフィボナッチ数列の項を求めるプログラムの実行時間で比較します。
(こういうときに相応しい検証方法かわからないけどとりあえずこれで行きます)

環境は以下の通りです。
![676CA763-872E-408A-A7DB-92B0949F54E9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637875/4848c8ff-3602-0c24-5360-23ca090bb92c.jpeg)

Pythonのバージョンは以下の通り。


```
Python 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0] on linux
```


## Pythonだけのプログラム
以下のプログラムでいきます。

```python:fib_py.py
def fib(n):
    if n <= 1:
        return n
    return fib(n - 1) + fib(n - 2)


def main():
    fib(40)


if __name__ == "__main__":
    main()
```

以下のサイトを参考にしています。


https://ictsr4.com/py/m0240.html

このプログラムでフィボナッチ数列の第40項を求めることができます。
ちなみに答えは102334155ですね。

試しに実行時間を測ってみます。

```bash:shell
$ time python3 fib_py.py
```

結果は、

```
python3 fib_py.py  31.89s user 0.00s system 99% cpu 31.895 total
```

32秒ね、まあそんなもんでしょう。

## ctypes併用
まずはC言語で再帰ループ部分を作ります。

```c:fib.c
int fib(int n) {
    if (n <= 1) {
        return n;
    }
    return fib(n - 1) + fib(n - 2);
}
```

めっちゃ単純ですね。
今回は標準入出力もないただの関数なので、いつもおまじない的に書いていた`#include <stdio.h>`もいりません。

これを共有ライブラリとしてコンパイルします。

```bash:shell
$ gcc fib.c -shared -o fib.so
```

これで、Pythonから読み込める共有ライブラリができました。

> 追記: コメントで、「コンパイル時に最適化を行うとより速くなる」との声をいただきました。実際に"-O2"オプションをつけてコンパイルしたところ、3.6倍ほど速くなりました。


Python側のプログラムは以下の通りです。

```python:fib_c.py
import ctypes

libc = ctypes.cdll.LoadLibrary("./fib.so")


def main():
    libc.fib(40)


if __name__ == "__main__":
    main()
```

Cで書いた関数をそのまま使えるのが分かると思います。

こちらも実行時間を測ってみます。

```bash:shell
$ time python3 fib_c.py
```

結果は、

```
python3 fib_c.py  0.97s user 0.01s system 99% cpu 0.974 total
```

1秒かからんかった。すげぇ。

## 比較
最後に、同じ条件でちゃんと比較したいので、比較用のスクリプトを書いていきます。

```python:time.py
import time
import fib_py
import fib_c

py_start = time.time()
for _ in range(10):
    fib_py.main()
py_time = time.time() - py_start

c_start = time.time()
for _ in range(10):
    fib_c.main()
c_time = time.time() - c_start

print("python: {}s, ctypes: {}s".format(round(py_time, 2), round(c_time, 2)))
```

さっきの処理を10回繰り返すのにかかる時間を計測します。

結果は、

```
python: 316.07s, ctypes: 9.48s
```

差は歴然ですね。
Python単体だと5分かかってるのに、ctypes併用では10秒以内に抑えています。

# 結論

ctypes便利ですね。

今後は、メインの処理をPythonで書いて、重い処理はC言語で、みたいな臨機応変な対応ができそうです。

ctypesにはこれ以外にも色々できることがあるので調べてみてください！
MySQL8.0 でのデータインポート時に使うコマンド 

皆さん、こんにちはこんばんは。
今回は私がデータベースを操作するうえで毎回忘れたりしてしまうコマンドや設定を備忘録的な感じで残します。
<h1>前提条件</h1>
mysqlはバージョンが8.0であること。<br>
CSVファイルをインポートするにはセキュリティで許可されたディレクトリに配置すること。<br>
CSVファイルは必ず文字コードは"UTF-8"改行コードは"LF（ラインフィールド）"であること。<br>
<h1>データのインポート</h1>
データのインポートを行う前にデータベースの作成を行う.

```sql:Sql
create database データベース名;
```
これを実行しデータベースの作成を行う。<br>
この時sql文は大文字でも小文字でも区別はないので気にしなくてよい。
<br>
<h1>使用するデータベースの指定と確認</h1>
先ほどはデータベースの作成を行った。<br>
しかし、それはあくまでも作成しただけなのでこれから使用するデータベースを指定する。

```sql:Sql
use データベース名;
```
これで使用するデータベースの選択が行える。<br>
選択したデータベースを確認する、もしくは選択されているデータベースを確認するには以下のsqlを実行することができる。
```sql:Sql
select database();
```
<h1>テーブルの確認</h1>
データベースは先ほどのsqlを実行することで使用可能になった。<br>
次は、データベースにテーブルの確認を行う。

```sql:Sql
show tables();
```
この時”Empty　set(**sec)"と表示されれば中身は空で、何か表示されたら中のテーブルが確認できる。
<h1>Sqlをファイルから読み込んで実行</h1>
Sqlをいちいち打つのが面倒になった方はメモ帳などでSql文をまとめておいて実行するのがおすすめ。
使いたいSqlをメモ帳などでまとめて<b>[hogehoge.sql]</b>と保存する
そういったものを実行するときには以下のSqlを実行する。

```sql:Sql
source ファイルパス＋ファイル名
```


この時注意としては[;]（セミコロン）は必要ない。
<h1>CSVファイルインポート時の注意</h1>
CSVファイルからのインポート時にはいくつか注意点がある。<br>
[hogehoge.csv]として保存する際は<b>”文字コード</b>”と<b>”改行コード”</b>に注意。
文字コードは<b>"UTF-8"もしくは"UTF-8N"</b>改行コードは<b>LF</b>とすること。<br>
mysql5.7以降はセキュリティの観点から既定のディレクトリからしかインポートできない。

規定のディレクトリを間作する時は下記のコードで調べられる。<br>

```sql:Sql
select @@secure_file_priv;
```


既定のディレクトリに配置してなお、にエラーが発生した場合はファイルパスを￥から/に変更するもしくは下記のコマンドを入力する。<br>

```sql:Sql
set persist local_infile=1;
```

このコマンドを打って解決しない場合はmy.iniを編集することで解決する。<br>
有効にできているか確認するには下記のコマンドで確認できる。
```sql:Sql
select @@local_infile;
```
実行結果がこのようになっていれば成功です。<br>
```sql:実行結果
+---------------+
| @@local_infile|
+---------------+
|              1|
+---------------+
```

<h1>最後に</h1>
私がMySQLを触る上で毎回ドツボにハマるデータのインポート関連の項目がこれになります。<br>
もし、この記事が私と同じような問題に悩んでいる方のお役に立てば幸いです。
XAMLでTextboxプレースホルダー表示

IsFocusedなしでvalueがない場合はプレースホリダーのように表示するメモ

``` xml
<MultiDataTrigger>
  <MultiDataTrigger.Conditions>
    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TextBox}}, Path=Text}" Value="" />
    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TextBox}}, Path=IsFocused}" Value="False" />
  </MultiDataTrigger.Conditions>
  <Setter Property="Foreground" Value="#33000000" />
  <Setter Property="Visibility" Value="Visible" />
</MultiDataTrigger>
```

### 参考URL

https://qiita.com/kazuma0720/items/6b402c3616254729fddc

https://social.msdn.microsoft.com/Forums/vstudio/en-US/8827b5a8-b488-4bc0-b2b5-da981d38e806/using-trigger-to-set-textbox-selectedtext-property?forum=wpf

http://gootara.org/library/2017/01/wpfao.html
maven配置、maven wapper配置

##### 目録
- maven配置
- maven wapper配置
- 簡単なspring boot項目構築方法
---

##### maven配置
1. オフィシャルページでmavenをダウンロード
2. 圧縮を解凍し、user/liberary/フォルダーの下に置く（他の場所でもいい）
3. terminal（mac OS）で`vim ~/.bash_profile`を入力
4. ファイルの中に：
  ```
  export M2_HOME=/Library/apache-maven-3.8.6
    （ここのversionはダウンロードversionを入れ、pathをフォルダー置く場所に合わせる）
  export PATH=$PATH:$M2_HOME/bin
  ```
5.　修正内容保存後、`source ~/.bash_profile`でpathの設定を使用（vscodなどのzshを使う場合、zshの操作画面でもう一回このコマンドを実行）　
6.　コマンド`mvn -v`でversion情報が表示される場合、配置完了
細かい紹介文は以下を参考 [環境構築](https://www.jianshu.com/p/bb0c81bec337)　[maven由来](https://blog.csdn.net/wohaqiyi/article/details/118996570?spm=1001.2014.3001.5501)　[maven基本概念](https://blog.csdn.net/wohaqiyi/article/details/119235116)　[maven versionの読み方](https://blog.csdn.net/wohaqiyi/article/details/119322984)　[scopeタグ](https://blog.csdn.net/wohaqiyi/article/details/119631500?spm=1001.2014.3001.5501)　[プロジェクトフォルダの構造](https://blog.csdn.net/wohaqiyi/article/details/119882077?spm=1001.2014.3001.5501)

##### maven wapper配置
ローカル環境でmavenをインストールしなくても、mavenも働く様に、プロジェクトフォルダー内部にmaven wapperを入れる
1. まずはmavenがインストールされたローカル環境で、spring bootプロジェクトフォルダを作る
2. mainフォルダの下、`mvn -N wrapper:wrapper`コマンドでこのプロジェクトのmaven wapperを配置。詳しくは[A Quick Guide to Maven](https://www.baeldung.com/maven-wrapper)を参考
3. そしてこのspring bootのフォルダを他のローカル環境で移し、mainフォルダの下で`./mvnw clean install`（macOs）コマンドを実行、当前プロジェクトに必要なpackageが揃える（”./mvnw: Permission denied”のエラーが出たれ、`chmod +x ./mvnw`で権限を追加）
4. `./mvnw spring-boot:run`コマンドでspring bootプロジェクトを走る

##### 簡単なspring boot項目構築方法
以下のサイトをアクセス：
https://start.spring.io/
図のように欲しいパーツを設置し、左下の「generate」でzipファイルをダウンロード、解凍した後は、一つのspring　bootプロジェクトのフレームワークが貰える、その中で直接`./mvnw`コマンドを使用できる
![スクリーンショット 2022-08-19 11.54.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/f43773ed-eb33-2591-c946-9512615b6252.png)
PyTorch DataLoader で tarを展開せずに読込む

### tarファイル
Deep Learning で用いる公開データセットには tar 形式(tar.gzなど含む)のものが存在する.  
データ分析やデバッグなどを行うという観点では1枚1枚の画像が見えた方がよいとは思う.
だが tar にしているということはデータ量が多いということであり、
それはつまり、ストレージに優しくないことを指す.
そのため tar のまま扱えた方が取り回しがよいのではないかと考えた.  
  
画像ファイルが格納された tar があるとして、それを展開せずに利用する例を書いた.
```python
import cv2
import numpy as np
import tarfile

arc = tarfile.open('test.tar')
print(arc.getnames())
for i in arc.getnames():
    buf = arc.extractfile(i).read()
    # openCVで画像を読込
    img = cv2.imdecode(np.frombuffer(buf, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    print(img.shape) # 例: (256, 256, 3)
    #
    # TODO: 画像処理など
    #
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    cv2.imwrite(f'output_{i}.png', img)
```
なお、出力された画像が元の tar に入れた画像と同じであることから、
変数 img にはRGBが反転している状態(imreadと同じ形式)で得られる.
そのため通常は cvtColor() でRGB反転を実施する必要がある.

### with PyTorch Dataset
上記スクリプト例と同様に画像データを処理したいため、
Deep Learningのフレームワークで扱うことを考える.  
PyTorchのDatasetで記述する場合は例えば以下の形で記述できる.
```python
import cv2
import numpy as np
import albumentations as A
import tarfile
import torch
from torch.utils.data.dataset import Dataset

class SampleDataset(Dataset):
    def __init__(self, filename, augment):
        self.arc = tarfile.open(filename)
        self.files = [ i for i in self.arc.getnames() if self.arc.getmember(i).isfile() ]
        self.augment = augment

    def __len__(self):
        return len(self.files)

    def __getitem__(self, idx):
        buf = self.arc.extractfile(idx).read()
        img = cv2.imdecode(np.frombuffer(buf, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        img = self.augment(image=img)['image'].astype(np.float32)
        img = img.transpose(2, 0, 1)
        img = torch.from_numpy(img)
        return img
```

先と異なる点としてファイルの持ち方がある.
tarにはディレクトリ構造も保持でき、ディレクトリを含んだtarを読み込むと、
getnames() で取得する名前一覧にはディレクトリ自体も追加される.
具体例として testdir というディレクトリが存在する tar であれば下記のようになる.
```python
import tarfile
tar = tarfile.open('test.tar')
files = tar.getnames()
print(files)
# ['sample1.jpg', 'sample2.jpg', 'testdir', 'testdir/sample3.jpg']
```
PyTorchのDataLoaderなどでの使用を考えるとファイル以外は取得したくない.
そのため getmember(name) で取得できる TarInfo の isfile() のプロパティを参照.
isfile() が True であるものだけを用いてリスト作成している.
```python
import tarfile
tar = tarfile.open('test.tar')
files = [ f for f in tar.getnames() if tar.getmember(f).isfile() ]
print(files)
# ['sample1.jpg', 'sample2.jpg', 'testdir/sample3.jpg']
```

エラー処理やI/O実行効率の計測はできていないが、
ひとまず目的である tar のまま画像を取り扱うということは実現できる.  

#### 参考文献
* [tarfile](https://docs.python.org/ja/3/library/tarfile.html)
【ServiceNow】San Diegoリリース「フロー実行開始時間」について

San DiegoへのバージョンアップでFlow Designerに新規追加/変更された機能についてまとめます。

今回はフローの実行開始時間に関する機能に新規追加と変更が入っていたのでご紹介します。


## 「実行開始時間日時」データピル（新規追加）
ローカルのタイムゾーンでフローの実行開始時間が取得できるようになりました。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/dc5cbc0b-6a4e-eb2b-7510-7eec308051eb.png">


Romeバージョンでは以下のとおり、UTCの時刻のみが格納されていました。
<img width="350" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/dea89f54-0ab3-d2d6-a3cc-59594ed486fb.png">


またデータピルも用意されているのでフローでも使用することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/2468d642-d9a4-3efc-ca9f-856619081931.png)
このデータピルは以下のトリガーの際に使用できます。
　・レコード
　・日付
　・サービスカタログ

タイムゾーンの変換をする必要がなくなり、より便利になりました。



## 旧実行開始時間データピルの名称変更（変更）
Romeバージョンまで「実行開始時間」として表示されていた項目が「実行開始時間 UTC」という名称に変更になりました。

フローの実行結果には以下のように表示されます。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/596f7198-29aa-15bb-ead3-70fa509148ef.png">

フロー実装画面のデータピルでも同じようにUTCが追加された名称になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/6d4de135-33e8-8791-eff1-bcea2e08eed1.png)
人事のおじさんプログラミングを学ぶ Day3「ダイアログボックスの表示」「HTMLを書き換える」

書籍『確かな力が身につくJavaScript「超」入門 第2版』に沿ってやってみた。
繰り返し書かないと確実に忘れてしまうでしょうが、
まずは考え方だけちゃんと理解しておかねば。

![2022-08-19 (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783084/40aeb75a-28a0-05df-3fb2-98945f336fc7.png)

![2022-08-19 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783084/45cdfa8a-2f09-849f-1bf6-2a6141bc5628.png)
Google ChromeのデベロッパーツールでエレメントのCSSセレクターやXPathを取得する

## Google Chromeのデベロッパーツールとは
Google Chromeに標準搭載されている開発者用の検証ツールです。デベロッパーツールを使用することで、htmlやCSSの確認・編集や通信状況の確認などを行うことができます。


## Google Chromeのデベロッパーツールの起動、取得したいエレメントのソースコードの特定
Google Chromeのデベロッパーツールを起動する方法はいくつかあります

### 1. マウスの右クリック
Webブラウザ上でマウスを右クリックし、検証を選択すると、デベロッパーツールが起動されます。
![デベロッパーツール起動画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737895/7349ec73-2bce-90d3-7359-3c00cb5f905c.jpeg)
取得したいエレメント上で右クリックすることで、そのエレメントの「Elements」タブのソースコードに色が付き選択されていることになります。


### 2. ショートカットキー
F12キーもしくはCtrl+Shift+iでもデベロッパーツールを起動することができます。

ショートカットキーの場合、取得したいエレメントのソースコードを自分で探す必要があります。その時に便利なのが"select an element in the page to inspect it"です。「Element」タブの左にあるアイコン(以下の写真)のクリックもしくはCtrl+Shift+Cを押した状態で、マウスを取得したいエレメント上にもっていくことで、そのエレメントの「Elements」タブのソースコードに色が付き選択されていることになります。
![デベロッパーツール.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737895/bb622808-1820-6786-f272-a6a1cf159337.jpeg)


## 取得したいエレメントのCSSセレクターの取得方法
マウスの右クリックもしくはショートカットキーを使い、取得したいエレメントの「Elements」タブのソースコードに色が付き選択されている状態で、そのソースコード上で右クリックする。"Copy > Copy Selector"を選択することで、CSSセレクターをコピーすることができます。
![デベロッパーツールCopyCSS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737895/74939b31-dc6e-c971-56c8-7053263cfcfd.jpeg)


## 取得したいエレメントのXPathの取得方法
CSSセレクターの取得の時と同様に、取得したいエレメントのソースコード上で右クリックする。"Copy > Copy XPath"と選択することで、XPathをコピーすることができます。
![デベロッパーツールCopyXPath.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737895/97050c68-5434-85a4-d499-095c9cbe714f.jpeg)



<br>
お読みいただき、ありがとうございました。
Delta Live Tablesで特定のテーブルのみをアップデートできるようになりました

[Delta Live Tables](https://www.databricks.com/jp/product/delta-live-tables)で[特定のテーブルのみをアップデート](https://qiita.com/taka_yayoi/items/e4f877a64c3ae8b8c2c8#%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%9F%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%AE%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88)できるようになりました。処理を変更した場合やエラーが発生したテーブルのみをアップデートすることができます。

部分的なアップデートを行う前に、一度パイプライン全体を実行する必要があります。
![Screen Shot 2022-08-19 at 11.21.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/27fb7d80-36eb-b235-3c36-8a5a4029c54e.png)

パイプラインの処理が終了すると**Select tables for refresh**ボタンが表示されるようになります。
![Screen Shot 2022-08-19 at 11.24.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cd802d22-b43c-edc8-0eca-58c2cc88df17.png)

**Select tables for refresh**ボタンをクリックします。ここではデモのため、特にロジックの変更は行いませんが、実際にはロジックの変更、エラーの修正を行った上で対象のテーブルを選択することになります。
![Screen Shot 2022-08-19 at 11.25.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5c69ec70-9eb0-d322-7c9e-200d6852ecd2.png)

処理を実行したいテーブルを選択します。ここでは、`pii`はビューのため選択することはできません。選択したテーブルには**Selected**とタグがつき、右下の**選択箇所を更新**ボタンには選択されているテーブルの数が表示されます。
![Screen Shot 2022-08-19 at 11.26.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e3e92359-656f-3323-f529-da4a0fae53ca.png)

**選択箇所を更新**ボタンをクリックすることで、選択されたテーブルのみがアップデートされます。
![Screen Shot 2022-08-19 at 11.28.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f5ed3211-a4e0-04ae-e197-3690a7edf9bc.png)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
【Linux】printfコマンドの使い方

## 基本的な使い方
`printf`コマンドは以下のように使用することで文字列などの整形ができます。
```:ターミナル
$ printf [-v 変数名] 書式 [数値, 文字列 など]
```
`-v 変数名`を入力することで整形した内容をシェル変数にセットできます。

## 書式指定の記号
書式指定の際に使用する記号は以下のとおりです。
`%`の後に数字を記述することで桁数を指定できます。
`%`の後に`'`を記述することで3桁区切りにできます。
|   記号   | 説明                                              |
| :------: | :------------------------------------------------ |
|    %s    | 文字列                                            |
|    %c    | 1文字                                             |
|  %d, %i  | 10進数の整数（符号付き）                          |
|    %u    | 10進数の整数（符号なし）                          |
|    %o    | 8進数の整数（符号付き）                           |
|    %x    | 16進数の整数（符号付き、アルファベット小文字）    |
|    %X    | 16進数の整数（符号付き、アルファベット大文字）    |
|  %f, %F  | 小数形式の浮動小数点数                            |
|    %e    | 指数形式の浮動小数点数（指数記号"e"部分が小文字） |
|    %E    | 指数形式の浮動小数点数（指数記号"E"部分が大文字） |
|    %g    | 指数形%eまたは%f（適した書式を自動選択）          |
|    %G    | %Eまたは%F（適した書式を自動選択）                |
|    \\"    | 「"」                                             |
|    \\\    | バックスラッシュ                                  |
|    \a    | アラート                                          |
|    \b    | バックスペース                                    |
|    \e    | エスケープ                                        |
|    \f    | フォームフィード                                  |
|    \n    | 改行                                              |
|    \r    | キャリッジリターン                                |
|    \t    | 水平タブ                                          |
|    \v    | 垂直タブ                                          |
|    %%    | 「%」                                             |
| \x1b[4m  | 下線                                              |
| \x1b[1m  | 太字                                              |
| \x1b[7m  | 背景色と前景色を反転                              |
| \x1b[41m | 背景色を赤                                        |
| \x1b[43m | 背景色を黄                                        |
| \x1b[42m | 背景色を緑                                        |
| \x1b[44m | 背景色を青                                        |
| \x1b[31m | 文字色を赤                                        |
| \x1b[33m | 文字色を黄                                        |
| \x1b[32m | 文字色を緑                                        |
| \x1b[34m | 文字色を青                                        |
活動オブジェクトのWhoId、WhatIdを参照する時にできないこと。


以下のようにWhatIdがアカウントオブジェクトであっても、数式からはアカウントのフィールドを参照できないです。

```
IF (BEGINS (WhatId, "001"),TEXT(Account.S_VA_Account__c),NULL)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e9942e67-2385-ec9f-f973-263bfcff9e15.png)


自動化処理で行うと
You're gonna need a Flow, Process, or Custom Code to do that

[Formula to pull in Lead object data on Activity](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HFAySSAX)

+ [フローでも同じ](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000QMplN)

:::note
数式では参照できないと思います。
よって、Idが006で始まる場合に　レコードの取得で商談を検索してください。
これで商談名を得ることができます。
:::

+ [Switch RelatedTo (WhatId) or Validate?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000R8bO5)

:::note
Formulas cannot reference other fields from WhatId. I believe it can be implemented using Apex triggers.

https://salesforce.stackexchange.com/questions/119669/apex-task-what-type

https://developer.salesforce.com/forums/?id=9060G0000005a24QAA
:::

+ [フローを使ってメールを送信したいです。Todoの項目をトリガーとして、関連先にある取引先の情報をメールテンプレートの差込項目に入れています。ただデバッグの際にこの取引先の情報が差し込みができていないような状態です。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KBiTJ)

:::note
取引先のレコードですが、以下の数式みたいに関連先を参照していますか？

WhatIdは特別みたいなので、このような参照はできないです。

WhatIdを使ってレコードの取得要素で取引先のレコードを取得してから使ってみてください。

```
IF (BEGINS (WhatId, "001"),TEXT(Account.S_VA_Account__c),NULL)
```

:::
Gatsby学習～その１～

# Gatsby静的サイトジェネレーターでポートフォリオ作成  

友人から教えてもらったGatsby。  
Gatsby Starter Libraryからキットを使えばサイトが簡単に作れるという事で、早速作ってみました。  
Gatsby＋Contentfulでサイトを作成したかったのですが、Pluginが足りない、GraphQLの知識が必要など、うまく作成できなかったため、Gatsby初心者の手習いという事で、ポートフォリオのキットから作成する事にしました。 

### 1. Gatsbyサイトからスターターキットを選択  
それでは、GatsbyのGatsby Starter Libraryからキットを選択していきましょう。  
https://www.gatsbyjs.com/starters/  
![Gaysby_Library.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788780/3833d879-0558-60b8-f872-2a86ace1528a.png)  

この中から、ポートフォリオのキットを選択。  
![portfolio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788780/de8f963b-e308-daeb-e592-58c85046613b.png)  

### 2. Gatsbyの開発環境をセットアップ  
#### 2.1 Node.jsのインストール 
GatsbyはNode.jsの環境下で作成されているため、Node.jsをインストール。  
Node.jsの公式 Web サイトから最新の Node.js バージョンをダウンロードしてインストールします。  

#### 2.2 Gatsby CLIのインストール  
ターミナルから `npm install -g gatsby-cli` を実行。  
以下のコマンドを実行し、正しくインストールされているか確認。  
`gatsby --version`  

#### 2.3 Gatsby Starter Libraryで選択したフレームを作成  
Gatsby Starter Libraryで選択したフレームの作成コマンドをターミナルで実行。  
`npx gatsby new gatsby-starter-portfolio-cara https://github.com/LekoArts/gatsby-starter-portfolio-cara`  

#### 2.4 ローカル環境にBuild  
ターミナルから`Gatsby develop`を実行して、ローカル環境にポートフォリオを作成。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788780/27e625c9-0f64-7125-9402-b50ae8e89dbc.png)  

簡単でしたね。  
他にもフレームはあるので、全種類試していきたいなと考えています。
Postgresのチューニングを始める人の基本の「ほ」

:::note info
この記事はPostgresのＳＱＬチューニングの基本的な仕組みを知ってる事を前提に次のステップに行く際に読んでもらえればと思って書いています。SQLって概要でいうとそんな風に処理されるんだ～って思ってもらえれば幸いです。
:::

PostgresでSlowQueryが発生して困った経験がある方ってかなり多いんじゃないでしょうか。
複雑じゃないSQLについてはネットで少し調べればWHERE句に書く順番、JOINのやり方を見直したりとかで大抵解決します。
また基本的な設定値の変更なんかも含めて基本の「き」かと思います。

ただ「もっと改善したい！これが本当にベストなのか！？」と追及していくと行き着く先はPostgresのプランナーなのではないでしょうか。
複雑なＤＢだったり、ユーザの利用方法が定まっていないようなシステムの場合、適切なＳＱＬを自動生成する事は非常に困難です。
そんな時最終的に合理的な判断をしてくれるのがプランナーです。
今日はそのプランナー周りを書いておこうっ

## SQLの処理はこんな順番に処理されてます

```
みんなが書いたSQLはパーサーにより機械が理解しやすい形に変換され、
リライターにより一定ルールの書き換えが行われ、
プランナーが統計情報をもとに実行計画が立てられ、
エグゼキューターによって実行され結果が返されます。
```

上に書いた文字が全てなんですが、以下の説明を読んだ後にまたこの上の文字の説明を読んで気持ちがスッキリ出来て下さいね！
以下に細分化して説明します。

### リライター

例えば ```created_at BETWEEN 昨日 AND 今``` と書いてもプランナーが立てた計画をEXPLAIN ANALYZEで確認すると
```created_at >= 昨日 AND created_at <= 今``` という変換が行われている事がわかります。
こういった変換を行うのがリライターです。チューニングには直接的な関係はおそらくないですが、知っていて損はないですね。

### プランナー

こいつが難しい。まず```統計情報ってなんですか？```から始まります。
深追いするとこの勉強だけに何時間も費やしますので簡単に説明しますね。

###### 統計情報とは？
定期的に自動バキュームが走ってるのはご存知ですかね。とある設定値を基準として満たした場合にデータベースの空箱を掃除したり、データ量やデータの偏り具合を調べたりしています。このデータ量や偏りの調査結果がまさしく統計情報というものになります。

###### 実行計画とは？
統計情報がわかればそんな複雑な話ではないです。
つまりプランナーは「こんな風にデータ偏ってるんだったら、この条件に該当するデータは少ないはず。ならここはBitmap Index Scanが良さそうだな！」とか考えてるわけですね。
当然プランナーは「データ数の多さや偏り具合に応じてスキャン方法は何が妥当か？」とか考えるプロフェッショナルです。
つまり、```SQLが求めてる内容を返すためにどの方法でスキャンしてマージして絞って並び替えたらコストが一番低いのか？```を色々なパターンを検討して１つの最適解を実行計画として導き出すわけです。すごいぞプランナー！

## どうすればプランナーが良い仕事をするのか

プランナーの仕事を理解できたら次はここですね。
結論からいうと以下です。

* 良質な統計情報を準備する事
* 良質な実行計画を考えさせてあげる事

書き出すと長くなるので省略しますが、統計情報であればサンプリング数がものを言います。
デフォルトではサンプルとなるレコード数は３万レコードが対象となっており、最大３００万レコードまで設定変更が可能です。
```default_statistics_target```とかで調べてみると良いかもしれません。

実行計画なら例えば、```join_collapse_limit```とかでしょうか。
SQLの実行計画を考える際に結合処理の順番をプランナーが考えるわけですが、その計算コストも決して安くはありません。
この設定値は結合順を考えるのに何個のテーブルまでを対象とするのかの上限値になります。
これを上げる事で実行計画を考える時間は伸びるものもあるが、良質な実行計画になる可能性も秘めています。
条件次第ではありますが、デフォルト値の８より高い値にするのも良いかもしれませんね！

今日はここまでっドロン（殴り書きで失礼しました）
Linux Btrfsとファイルシステムmkfs・mke2fsについて（自分用メモ

●Btrfs（B-tree File System: バターエフエス、またはビーツリーエフエス）は比較的新しく高機能なLinuxのファイルシステム。Btrfsはカーネル2.6.29に取り込まれ、次世代のLinux標準ファイルシステムとなるべく現在も開発が続けられている。

Btrfsの機能：

・マルチデバイスへの対応
これまでのext2/ext3/ext4は、単一デバイスの単一パーティションにしかファイルシステムを作成できませんでした。その後「論理ボリュームマネージャ（LVM）」によって複数デバイスを論理的に1つのデバイスとして扱うことで、複数のデバイスにまたがってファイルシステムを作成することができるようになりました。
しかし、Btrfsはファイルシステム自身が複数のデバイス（マルチデバイス）を直接扱えるようになっています。

・サブボリューム
Btrfsは、ディレクトリの一部を「サブボリューム」として個別のファイルシステムのように扱えます。サブボリュームを使うことで、ある時点のファイルシステムの状態を「スナップショット」として取得することができるようになります。

・圧縮
Btrfsは、ファイルシステムが自動でデータを圧縮できるようになっています。圧縮用の特別な操作を必要とせず、マウント時に自動圧縮を有効にするオプションを指定するだけで動作します。

●ファイルシステム

・ext2 以前のLinuxで標準的に使用されていた規格
・ext3 ext2の後継。ジャーナリングファイルシステム
・ext4 ext3の後継。ジャーナリングファイルシステム
・XFS シルコングラフィクス社(SIG)が開発。ジャーナリングファイルシステム。動的inode
・JFS IBMが開発。ジャーナリングファイルシステム。動的inode

※動的inodeの機能とは、ファイル作成時にinode番号を動的に割り当てる機能のことです。inodeを動的に割り当てるため、inodeの数に制限はありません。
動的inodeの機能がないファイルシステムでは、inodeはファイルシステム作成時に作成され、増やすことはできません。そのため、ファイルの数が増えるなどして使用可能なinodeがなくなると、ディスクに空き容量があってもファイルを新規に作成することができなくなります。


●ファイルシステムを作成する「mke2fs」

mke2fs [オプション] デバイス名

オプション
・-j ext3ファイルシステムを作成
・-t ファイルシステムの種類　ファイルシステムの種類を指定(ext2/ext3/ext4)
・-c ファイルシステムを作成する前に不良ブロックを検査

※mke2fsコマンドでext2/ext3/ext4ファイルシステムを作成できます。
また、mkfsコマンドでは「-t」オプションで、ext2/ext3/ext4のみならずxfs、jfsなどのファイルシステムを指定し、作成できます。mkfsコマンドはmke2fsコマンドなどのフロントエンドとして統一的に使えます。


●mkfsコマンドでファイルシステムを作成

mkfs [オプション] デバイス名

オプション
・-t ファイルシステムの種類　ファイルシステムの種類を指定
・-c ファイルシステムを作成する前に不良ブロックを検査

※「-t」オプションで、ext2/ext3/ext4のみならずxfs、jfsなどのファイルシステムを指定できます。
※「-t」オプションを使用しない場合は、デフォルトでext2ファイルシステムが作成されます。

※なお、ext2は古いファイルシステムであり、ジャーナリング機能（更新履歴をジャーナル（ログ）に記録しておく機能）がないなどの理由で現在は積極的に利用されることはありません。



・ZFS
Oracle Solaris用に開発された高機能なファイルシステムです。Linuxカーネルには取り込まれておらず、直接サポートされていません。

・XFS
Red Hat Enterprise Linux7でデフォルトで採用されているファイルシステムで、元はSGI社のIRIXというOS用に開発されたファイルシステムです。
雪山で取得したGPSデータを3Dマップで表現してみる。


# はじめに

先日、[HERE Raster Tile API](https://developer.here.com/documentation/raster-tile-api/dev_guide/index.html) をQGIS上で背景図として利用する手順をまとめました。
この背景図を活用して、スキー場で取得した滑走データをQGIS上でプラグインのみ、ノーコードで3D表現してみました。

# QGISの事前準備
- QGISの準備
QGISをまだインストールされていない方、MIERUNEさんの動画が、非常にわかりやすいのでご活用ください。
https://youtu.be/PITL2mens9Y

- QGISプラグインの追加
今回、Qgis2threejsを利用して、3D表現します。
プラグインウインドウで検索していただき、インストールしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725955/7e6c4394-24df-20fa-789a-900ec11688fa.png)

- 背景図の準備
QGIS上でHERE Raster Tileの背景図として利用する手順は、下記を参照ください。
https://qiita.com/kekomat/items/18a94ba9d9c36d8caf23

# GPSデータの準備
今回、Google Maps [タイムライン](https://timeline.google.com/maps/timeline) で保存されていたGPSデータをKML形式でエクスポートし利用します。

ちなみに、岩手県にある夏油高原スキー場は、累計積雪量が日本一になることも多い最高のパウダースノーが味わえる`豪雪`スキー場です。

タイムラインで右下に表示されている歯車マークからデータをエクスポートできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725955/8d097e00-f48c-5e4b-8948-546b3a32b9d6.png)

`history-YYYY-MM-DD.kml`といった日付が入ったKMLファイルがローカルにダウンロードされていると思うので、そのKMLデータをQGISにドラックドロップすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725955/790320ce-fc60-9bab-5b23-1a02b15dada4.png)
`Add Layers(レイヤ追加)`をすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725955/73b434a4-6d5f-399b-f18a-8b6a7ab9130c.png)
KMLデータがレイヤとして表現されました。
ベースマップ、衛星画像の透過設定は、自分好みに調整してみてください。私は、30-50％の間で使っています。

# 3Dマップ化
プラグインをインストールしていると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725955/29828fc5-2b48-a25f-119a-997e95f7b8fd.png)
の様なQgis2threejsのアイコンがツールバーに追加されていると思うので、こちらをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725955/c640f5a4-081a-cb8a-6204-e91a528cb92a.png)
3Dで見える様になりました。
QGIS側で場所を移動したり、縮尺を変更した利するとリロードされますので、自分好みのポジションを見つけてグリグリ回していただければと思います。
また、衛星画像をモノクロにして透過させてあげると雪山風になりますので、スキーヤー、ボーダの皆さんにはおすすめです。

# まとめ
これまで、アウトドアアクティビティの記録は、Google Mapsのタイムラインを活用していたのですが、最近、雪山でツリーランを楽しむ様になり、沢や崖がどこにあるのか高低差が必要となってました。
QGISとプラグインだけのノーコードかつフリーで高低差を表現できる様になり、大変ありがたいのと、滑走データを重ねることで、この時はこうだったなとニヤニヤすることができます。

登山、トレッキング、自転車、ゴルフなど様々なスポーツ、ガーミンなどGPSウォッチなどで取得したデータでも活用いただけると思いますので、ぜひ遊んでみてください。
標準画面で正常に保存されてから別の画面を起動させたい

元の質問：[グローバルアクション画面を表示する方法](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000J6guBSAR)


要件を読むとカスタムコンポーネントしかないな。

そのためには標準画面で正常に保存されたというイベントを拾う必要あります。

コンポーネント

```
<aura:handler event="force:showToast" action="{!c.reload2}"/>
``` 

念のためイベントのメッセージを拾って正常に保存された場合を判定させています。

コントローラ
```
 reload2 : function(component, event, helper) {  
        if (event.getParams().message =="☆発注 が保存されました。") {
            helper.getRecordALL(component, event);  
        }          

    },
```



|操作|name="init"|event="force:refreshView"|event="force:showToast"|備考|
|:-------------------|:---------------|:---------------|:---------------|:---------------|
|初期表示|○| | ||
|chatterの投稿| | | |投稿のイベントは受信できなかった
|関連レコード| |○| |標準の関連レコードコンポーネント
|活動| |○|○|標準の活動コンポーネント
|所有者の変更| |○|○| 
|レコードタイプの変更|○|○|○|name="init"を最後に受信する
|編集画面から保存| |○| | 
|関連リストから登録| | |○| 
|関連リストから更新| | ○|○| 
|関連リストから削除| | |○| 

[Salesforce: Lightningページ上に配置したコンポーネントでよく使う aura:hander](https://crmprogrammer38.hatenablog.com/entry/2020/04/28/090000)

----------------------------
やっと3100になった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5252dfda-f004-d93d-6298-8f1ddd3eacff.png)
bashでOSを判定する方法

```bash
unameOut="$(uname -s)"
case "${unameOut}" in
    Linux*)     machine=Linux;;
    Darwin*)    machine=Mac;;
    CYGWIN*)    machine=Cygwin;;
    MINGW*)     machine=MinGw;;
    *)          machine="UNKNOWN:${unameOut}"
esac
echo ${machine}
```

# refs

https://stackoverflow.com/questions/3466166/how-to-check-if-running-in-cygwin-mac-or-linux
node-red上のダッシュボードのボタンを押してnode-red-node-ui-tableの表示を他の接続にも反映させる

 # 困ったこと
ダッシュボードのText inputやLabelは複数の端末からアクセスしても一貫性のある表示が出来る
でもlenode-red-node-ui-tableは画面のボタン等がトリガーになっているとトリガーを押した端末の画面でしか反映されない。

例えば表示クリアボタンを用意しても、別の端末では表示がクリアされない
グローバルやflowコンテキストの値を更新して表示しているようなケースだと困る。

 # 検討したこと
インジェクトボタンから操作すると一貫性のある表示が出来た。
よって各端末毎とグローバル操作のいずれも出来ると判断した。
なので双方の操作をしてmsgの違いを比べ、
端末毎の情報を消してインジェクションボタンを押したとき相当の動作に出来ないか検討した

 # 対策
node-red-node-ui-tableに入れる前にmsg.socketidを削除する
Salesforceで動的フォーム設定を確認しよう～項目値により動的に表示項目を設定する方法

動的フォームの動きを確認します

動的フォームの設定はこちら

動的フォームでレコードの詳細を分割
https://help.salesforce.com/s/articleView?id=sf.dynamic_forms_overview.htm&type=5



今回やりたいこと
・カスタムオブジェクトに選択リスト「依頼種別」があります
・選択リスト「依頼種別」が「回線申請」の場合「項目01」表示。（「項目02」非表示）
・選択リスト「依頼種別」が「請求関連」の場合「項目02」表示。（「項目01」非表示）
です



### まずは動的フォームを設定しよう

編集ページから
![アップ01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a0dc1e08-bec1-4ea3-ced9-c29e695efcd4.png)



### 選択リスト「依頼種別」が「回線申請」の場合「項目01」表示 設定をしよう

設定方法は以下の画像となります
![アップ02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b47648be-a862-440f-12b0-347b245b18fe.png)

### 選択リスト「依頼種別」が「請求関連」の場合「項目02」表示 設定をしよう

設定方法は以下の画像となります
![アップ０３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/802b3083-9556-7b9c-8016-a7e1fd4b89cb.png)


これえ設定は完了です

### レコードの新規作成をしよう

実際に新規作成をおこないます

まず、「新規」ボタンをクリックしましょう。
選択リストが空欄なので項目01も項目02も確認できません

![新規01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/bb92594b-c8de-ef0c-30d6-98c127d422c9.png)

では、選択リスト「依頼種別」が「回線申請」の場合どうなるでしょうか
「項目01」が表示されます。（「項目02」は非表示）
![新規02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e3bad795-ae4b-4a82-e777-c9f0c38288ef.png)


では、選択リスト「依頼種別」が「請求関連」の場合どうなるでしょうか
「項目02」が表示されます。（「項目01」非表示）

![新規03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/523c0643-376d-cd1c-57f9-745a2aa5cef8.png)


このように、動的フォームを設定すれば新規作成時に項目の値により項目の表示や非表示が可能です
【React】パスワード入力画面で表示と非表示を切り替えるメモ

# Reactでパスワードの表示と非表示を切り替える

## 実現したいこと
目のアイコンをクリックすることでパスワードの表示を切り替える

- 非表示
![スクリーンショット 2022-08-19 8.00.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789548/b5ccdf57-8a76-0ea7-1d68-b05ad8b168cc.png)
- 表示
![スクリーンショット 2022-08-19 8.00.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789548/2db499a0-a854-9dcd-4933-69d83479e43b.png)



## 実行環境
- macOS Monterey
- React 18.1.0

## 手順
1. パスワードの変数を`useState()`で宣言
2. 表示 or 非表示の判定用変数を`useState()`で宣言
3. 目のアイコンと判定用変数の紐付け
4. `onClick()`で表示・非表示を切り替える

## コード
```Password.js
import React, { useEffect, useState } from "react";
import VisibilityIcon from "@mui/icons-material/Visibility";
import VisibilityOffIcon from "@mui/icons-material/VisibilityOff";

function Password(){
    const [password, setPassword] = useState("");
    const [passwordType, setPasswordType] = useState("password");

    return (
        // 入力フォーム
        <input 
            value={password}
            type={passwordType}
            placeholder={"Type New Password"}
            autoComplete="new-password"
            required
            onChange={(e) => {
              setPassword(e.target.value);
            }}
            className="Password"
         />
        // 非表示
        {passwordType === "password" && (
            <VisibilityOffIcon
              onClick={() => setPasswordType("text")}
              className="Password__visual"
            />
        )}
        // 表示
        {passwordType === "text" && (
            <VisibilityIcon
              onClick={() => setPasswordType("password")}
              className="Password__visual"
            />
        )}
    );
}
```

## ポイント
`input`タグの`type`でパスワードの表示と非表示を切り替えている
- `<input type="password">` ---> `******`
- `<input type="text">` ---> `asdfgh`

## 参考文献
- Material UI:  https://mui.com/material-ui/material-icons/
Web ページの更新履歴を調べる

いつも忘れてしまうので備忘録として

Ctrl+Shift+J のキーボードを押して、以下のコードを入力する
```
javascript:alert(document.lastModified);
```
更新日時が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/e54b36bf-4a02-7aa5-7242-0fc110f081d3.png)
2021年1月のKBに対して、2022年8月に既知の問題が見つかり追記したためと思われます。

https://support.microsoft.com/ja-jp/kb/4535680

参考

https://qiita.com/mucho0623/items/9ffb842d9710b16a8527

https://upquark.hatenadiary.org/entry/20121224/p1
レコードを無作為に/層別にサンプリングする(SPSS Modeler データ加工逆引き7-10)

# 無作為に/層別にサンプリング(バランス/コンプレックス)

![スクリーンショット 2022-08-03 17.34.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/437228f3-89e9-88c8-4df6-04ab39fabc37.png)

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

・サンプリングの精度を確保
・学習データとテストデータの品質確保

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

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

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

![スクリーンショット 2022-08-03 17.37.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5fa2caf2-06d9-3f78-dd51-002c54797533.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-08-03 17.39.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/98d1452a-9eef-ecb2-7605-875841bda3fa.png)

b.[棒グラフ]ノードを編集します。
![スクリーンショット 2022-08-03 17.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/59565750-208b-c41f-1af2-d04e48cae83a.png)

[実行]します。
![スクリーンショット 2022-08-03 17.29.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1b3136b4-19bc-0fed-bf49-9df8b6dbdcad.png)

#### ランダムにサンプリング

c.[サンプリング]ノードを編集します。3割を無作為抽出します。
![スクリーンショット 2022-08-03 17.40.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/514e5173-5335-271f-82cd-f4529efc5457.png)

d.[棒グラフ]ノードを実行します。元データの規模があるため無作為でも分布はほぼ維持されます。
![スクリーンショット 2022-08-03 17.40.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5aea12e3-34c5-2e28-ca8f-bb739d52545f.png)

#### 層別にサンプリング

e.[バランス]ノードを編集します。それぞれの値の比率を確定します。
![スクリーンショット 2022-08-03 17.41.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1320b89d-b170-0c32-cbc9-ba798d6b538e.png)

f.[棒グラフ]ノードを実行します。
![スクリーンショット 2022-08-03 17.29.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bff96cdc-a95c-ccda-a4fb-1ce3ca1044b5.png)

#### サンプリングノードのコンプレックスを利用する

g.[サンプリング]ノードを利用するとeと同じことやさらに複雑な設定が可能です。
![スクリーンショット 2022-08-03 17.42.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/117e572c-dbeb-d091-d786-7b87e1b42de3.png)

#### 注意事項

Mac版の18.3と18.4ではコンプレックスサンプル機能の動作が安定しないので注意してください。

## 4.参考情報

#### [サンプリング]ノードを扱った記事

https://qiita.com/kawada2017/items/7b79cb5d201928a65a7e

https://qiita.com/kawada2017/items/ac67d75e64cd65a0ba95

https://qiita.com/416nishimaki/items/98648cf8bf3fdbb0c3aa

#### [バランス]ノードを扱った記事

https://qiita.com/kawada2017/items/88071f2148d150b9267f

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

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
【環境構築】Selenium, Chrome Driver のインストール

# はじめに
Python で自動ログイン操作する環境を作成します。

本記事を進めるには以下が PC にインストールしている必要があります。
- [Jupyter lab](https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html) 
- [Python](https://www.python.jp/install/windows/install.html)
- [Google Chrome](https://support.google.com/chrome/answer/95346?hl=ja&co=GENIE.Platform%3DDesktop)

まだ、入っていない方はインストールをお願いします。

# 環境
- Windows 11 Pro: 22000.856
- Powershell: 5.1.22000.832
- Jupyter lab: 3.4.5
- Google Chrome 104.0.5112.82

# 環境構築

## Jupyter Lab の起動
Powershell で以下のコマンドを実行します。
```
jupyter lab
```

## Selenium の インストール

```
! pip install selenium
```

##  Chrome Driver のインストール
### Chrome の version を確認
- 画面右上の三つの点をクリックします。
- Setting をクリックします。
![スクリーンショット 2022-08-19 132221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709866/03626e8b-70a5-25d1-892f-e52da3ee17ba.png)
- About Chrome をクリックします。
![スクリーンショット 2022-08-19 132345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709866/c9e5f846-d05f-184f-7585-a4fd4a32cc76.png)
- version を確認します。
![スクリーンショット 2022-08-19 132425.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709866/5312538e-13fc-4824-fcc7-d0a0397ac0c0.png)

- [ChromeDriver の サイト](https://chromedriver.chromium.org/downloads)にアクセス 。確認した version より古くて近いものをコピーまたはメモします。

- 下記のコードを実行します。
```
!pip install chromedriver_binary==<バージョン番号>
```

- 使用するライブラリを呼び出します。
```
from selenium import webdriver
```
- Chrome Browser を起動します。
```
browser = webdriver.Chrome()
```
- 以下の画面になったら完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709866/4e33f613-ae0f-353e-a68c-c932c770aba0.png)


# 最後に
次回は Docker 上に構築してみます。

# 参考
[[selenium向け] ChromeDriverをpipでインストールする方法（パス通し不要、バージョン指定可能）](https://qiita.com/hanzawak/items/2ab4d2a333d6be6ac760)