OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScript(JavaScript)におけるnullとundefinedそしてfalsy値

# はじめに
JavascriptやTypescriptには従来言語のnullに値する表現が二つあります。
「null」と「undefined」です。今回はTypescriptにおけるこの二つの扱いについてまとめていきます。
既に詳しく説明されている方はたくさんいらっしゃるので、要点だけまとめました。

## 追記
* 例で出したプログラムが間違えていたので修正いたしました。(@t9hr4 さんありがとうございます！)
* 「null」や例外について追記しました。

# 結論
* 「null」は使わない。
*  比較するときは厳密等価演算子「===」を使うようにしよう
* 「falsy値」を比較せずに判定に使うのはやめよう

# 「null」を使わない理由

## null
* 「代入すべき値が存在しない為、値がない」という意味
*  自然発生しない
*  一部の ~~DOM系~~ APIがnullを返すことがある
*  リテラルなので、「null」という名前の変数を作成することはできない
```ts
const null = {}; // error
typeof null;     // 'object'
```

## undefine
* 「値が代入されていない為、値がない」という意味
*  言語仕様上自然に発生する
*  変数のため、「undefined」という名前の変数を作成することができる
```ts
const undefined = {}; // success
typeof undefined;     // 'undefined'
```
## nullを使わない理由
* それぞれの意味を考えて運用する場合、チーム全体で意味を理解し、
パターンAの場合は「null」、パターンBの場合は「undefined」のような取り決めをしなければならず
運用コストが高くなってしまう。
* チーム全体で「undefined」を使うで統一したほうが勘違いをしないで済む。
* 後述するが、比較する際にそれぞれを厳密等価演算子で比較しなければならず、バグの原因になってしまう。

# 比較するときは厳密等価演算子を使う
等価演算子(==)と厳密等価演算子(===)の詳しい違いはここでは取り上げないが、
上記のように「null」と「undefined」では型が違うので、
厳密等価演算子(===)ではないと同じものとして取り扱われてしまう。
```ts
null == undefined;  // true
null === undefined; // false
```

# 「falsy値」を比較せずに判定に使うのはやめよう

## 「falsy値」とは
「falsy値」とは「false」ではないが、「false」として認められる値のことである。
一般的には以下の値がfalsy値である。（ほかにもある）

* `false`
* `0` `-0` `NaN`
* `''` `""`
* `null`
* `undefined`

## if文やfor文などの扱い
if文やfor文の比較において、「false」以外の「falsy値」も判定として利用できる。
つまりこういった利用の仕方ができる。
また「!」を使うことで否定することもできる。
```ts
if (0) {}
if (null) {}
if (!undefined) {}
if (!'') {}
```

## 「false」以外の「falsy値」を判定に使うのはやめよう

### 「falsy値」を判定に使ったときの問題
たとえばこんなコードがあったとします。
```ts
const str = 'hoge';
const num = Number(str);
if (!num) { console.log('数値ではありません'); }
```
文字列をnumber型にパースして失敗(NaN)であれば数値ではないとログを出すプログラムです。
ですがもし最初の文字が`'hoge'`ではなく`'0'`だった場合、`num`の中身は`0`となり、
`!num`は`false`として扱われます。そのため、`'0'`の場合でも`数値ではありません`と出てしまいます。

### これからの「falsy値」の判定
「falsy値」を判定に使う時はそのまま使わず、一旦「false」にしてから判定に使いましょう。
先ほどの例の場合、
```ts
const str = 'hoge';
const num = Number(str);
if (Number.isNaN(num)) { console.log('数値ではありません'); }
```
このように「falsy値」を比較して「false」にしてから判定に使うことで先ほどの問題を回避することができます。

# 例外について
冒頭の結論で`null`を使わないとありますが、一部APIの戻り値や`json`のパースなど(ほかにもあるかもしれません)で、`null`が出てくるときがあると思います。
その場合は、それらを実行するラッパーを作成し、あくまでも自作しているプログラムの中では`null`を使わないといった運用をしていただければ、`null`を使わないを達成できると思います。
```ts
const getHogeAPI = (str: string) => {
  const result = hogeAPI(str); // nullが返ってくるAPI
  if (result === null) {
    // error処理
  }
  return result; // 適切な戻り値
}
```

# 最後に
自分自身の成長とこれからのTypescript初心者に向けて記事を書いてみました。
間違いや、改善点などありましたら、コメントやリクエストを送っていただけると助かります。

#  参考
* [undefinedとnullの違い](https://typescriptbook.jp/reference/values-types-variables/undefined-vs-null)
* [Falsy値を比較せずにそのまま判定に使うことはやめよう](https://zenn.dev/okunokentaro/articles/01fynkwmrkrbyzxgexvhv0hnez)
WinpythonでPytorchのnumpy errorが出た時の対処法

https://qiita.com/atsuinui/items/788cbb6f0826881f4ba7
の記事の補足になります。

windowsでpython環境をローカルで構築するのに便利なWinpython

https://winpython.github.io/

2022/8/30の時点の最新版である
https://sourceforge.net/projects/winpython/files/WinPython_3.10/3.10.5.0/
ダウンロードして解凍しjupyter labでpytorchのテスト用コードを入力したところ
```pytorch test.python
import torch
x = torch.rand(5, 3)
print(x)
```
numpy利用不可のエラーが出た
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/763e935c-ee6a-e4e6-258c-7207e526ca12.jpeg)
このパッケージではpython 3.10.50, torch 1.12.0を使用。

stackoverflowにも同様の記事あり、
[参考サイト1](https://stackoverflow.com/questions/71986643/userwarning-failed-to-initialize-numpy-module-compiled-against-api-version-0xf)
numpyのバージョンエラーらしい。

このバージョンのnumpyは1.22.4+mklだったので
jupyter labで
```upgrade_numpy.python
!pip install numpy --upgrade
```
としたが、管理者権限でupgradeしなさいとのことなので、、
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/3d913e99-f3e3-443e-c0c1-28b43e9907b0.jpeg)

```upgrade_numpy_user.python
!pip install numpy --upgrade --user
```
としてupgrade(↓下記参考にしました）。numpy 1.23.2が入りました。

[参考サイト2](https://minamino-heya.com/2020/02/pip-install-permissions-error/)

その後
```pytorch test.python
import torch
x = torch.rand(5, 3)
print(x)
```
でエラーが出ないことを確認。
ちなみに、
https://sourceforge.net/projects/winpython/files/WinPython_3.10/3.10.5.0/
にはopencv-pythonは入っていませんので、jupyter labから同様にインストールするか
Winpython Command Prompt.exeを開いて
```Winpython_command
pip install opencv-python
```
として利用してください。
システムの性能指標

システムの性能を評価する指標には、```スループット```、```レンスポンスタイム```、```ターンアラウンドタイム```がある。
こうした処理性能を評価する手法として```ベンチマークテスト```という。

# スループットはシステムの仕事量
```単位時間あたりに処理できる仕事（ジョブ）量```を表す。

# レスポンスタイムとターンアラウンドタイム
### レスポンスタイムとは？
コンピュータに処理を依頼し終えてから、```実際に何か応答が返されてくるまで```の時間のこと

### ターンアラウンドタイムとは？
コンピュータに処理を依頼し始めてから、```その応答が全て返されるまで```の時間のこと

### 上の違いとは？
レスポンスタイムはサーバの処理時間のこと
ターンアラウンドタイムは利用者が入力してその結果が表示されるまでの時間
出典 https://itmanabi.com/responsetime-turnaroundtime/

出典 https://gihyo.jp/book/2020/978-4-297-11781-8
Wasserstein距離に基づく分布的ロバスト最適化の凸最適化問題への帰着

# はじめに

Wasserstein距離に基づく分布的ロバスト最適化の凸最適化問題への帰着について手を動かして確認してみました。間違いがあればご指摘くだされば幸いです。

https://mathlog.info/articles/3448
2次元配列を複数キーで昇順/降順にソートする_VBAで

VBAで、2次元配列を複数キーで昇順/降順に並べ替えしたい時の処理
配列でせずにシート書き出してからsortメソッドで出来ればその方法も楽。
でも配列でもしてみたいので。

# 並び替えのコード
引数の説明
myArray
並べ替える対象の2次元
arraySort
並べ替えの条件を入れた2次元配列
(kry,order)の並びで入れる　複数可
keyは条件の対象にしたい列
orderは昇順か降順を決めるBoolean値
true:昇順
false:降順
arraySortに複数条件があった時は、
上から順に再帰で処理される。
titleFlag：省略したら規定値はfalse
trueにすると配列の一行目をタイトルとして並び替えの対象としない。

~~~vb
Private Sub バブルソート(myArray, arraySort, Optional titleFlag As Boolean = False)
'再帰処理で2次元配列を並べ替える
'myArray：2次元配列
'arraySort(key,order)：並べ替え条件の2次元配列
'key 列数
'order true 昇順 false 降順
'arraySortで複数条件あった場合は再帰処理する
'titleFlag：省略したら規定値はfalse
'trueにすると配列の一行目をタイトルとして並び替えの対象としない

    Dim i As Long
    Dim j As Long
    
    For i = LBound(myArray, 1) To UBound(myArray, 1)
        For j = LBound(myArray) To UBound(myArray) - 1
        
            Call バブルソート再帰(j, myArray, arraySort, LBound(arraySort, 1), titleFlag)
        Next
    Next

End Sub
~~~
~~~vb

Private Sub バブルソート再帰(j, myArray, arraySort, cnt, titleFlag As Boolean)

    '再帰の終了条件
    If cnt > UBound(arraySort) Then Exit Sub
    
    Dim k As Long
    Dim arrayChange
    Dim myKey As Long
    Dim myOrder As Boolean
    
    myKey = arraySort(cnt, 1)
    myOrder = arraySort(cnt, 2)
    
    'titleFlagがtrueでjが最初の行の時は、
    'タイトルとして飛ばすためにj+1する
    If titleFlag And j = LBound(myArray, 1) Then
        j = j + 1
    End If
    
    If myArray(j, myKey) > myArray(j + 1, myKey) = myOrder And _
        myArray(j, myKey) <> myArray(j + 1, myKey) Then
    
        For k = LBound(myArray, 2) To UBound(myArray, 2)
            arrayChange = myArray(j, k)
            myArray(j, k) = myArray(j + 1, k)
            myArray(j + 1, k) = arrayChange
        Next
        
    ElseIf myArray(j, myKey) = myArray(j + 1, myKey) Then
    
        Call バブルソート再帰(j, myArray, arraySort, cnt + 1, titleFlag)
        
    End If

End Sub
~~~

# 使用する
``` vb
Sub main()

    Dim array一覧表
    Dim arrayソート(1 To 1, 1 To 2)
    
    array一覧表 = ThisWorkbook.Worksheets("元表").Range("A1").CurrentRegion
    arrayソート(1, 1) = 4
    arrayソート(1, 2) = False
    
    Call バブルソート(array一覧表, arrayソート, True)
    
    ThisWorkbook.Worksheets("反映").Cells.ClearContents
    ThisWorkbook.Worksheets("反映").Range("A1").Resize(UBound(array一覧表, 1), UBound(array一覧表, 2)) = array一覧表

End Sub
```

# シート上での並び替えをする場合
~~~vb
Sub setSort(targetRng As Range, arraySort条件, myHeader As Long)
'対象とした範囲を並び替える
'arraySort条件 「key order」 の2次元配列
'Order 1 昇順　2　降順
'myHeader
'xlGuess 0   見出しがあるかどうかをExcelが自動特定します。
'xlyes   1   先頭行は見出しとして、並べ替えられません。
'xlNo    2   先頭行もデータとして並べ替えられます。
    
    Dim i As Long
    
    With targetRng.Parent.Sort

        With .SortFields
            .Clear
            
            For i = LBound(arraySort条件, 1) To UBound(arraySort条件, 1)
                
                .Add key:=targetRng.Parent.Range(arraySort条件(i, 1)), Order:=arraySort条件(i, 2)
            Next

        End With

        .SetRange targetRng
        .Header = myHeader
        .Apply

    End With

End Sub
~~~
【クエリビルダ：拡張表現】RowSkipExceptForTotals文を使ってみる

今回は、数値列の合計行のみを抽出する拡張表現を使用してみます。
関数名は、`RowSkipExceptForTotals()` といいます。

先ず元となるクエリを作成します。
SAP Business Oneを利用し、このようなクエリを準備しました。
売上伝票テーブルから作成日と金額を、年単位で集計するクエリです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9c6011b2-79b8-ea85-cfe5-a5a644024145.png)
実行結果はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cc42d03e-694e-e34c-c38b-4f4da55b1e83.png)
では上記の関数を利用して、年集計行は隠して総合計行だけを取り出してみます。
出力領域の右クリックから**拡張表現を追加**を選択します。出力オプションダイアログが開いたら、関数一覧より**RowSkipExceptForTotals**文を探し、ダブルクリックで上部エディタ領域にテンプレートを転送します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d565c95f-5522-f1c4-46ca-e456458714e4.png)
`一般`タブに移動して、`説明`を編集します。また、この拡張表現はクエリ結果としてそれ自体を出力する必要がないので**非表示**とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/40805512-f1cc-9930-aa3e-0da0950e6ce1.png)
このようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/300695c9-1aa8-cca2-6c7f-7ef429218c81.png)
ではプレビューしてみましょう。総合計行のみが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/dd205292-b668-1cbc-8f80-eea069b026ef.png)
レポートのデザイン上、総合計行のみ必要な場合は是非使用してみてくださいね。

では、失礼します。
連番の設定になっているNameフィールドの桁数を間違えた場合の修正方法【英語の回答例】

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)

--------------

英語でそう回答したらいいかを考えると拒絶反応が出たので答えなかった質問です。
ベストアンサーがあるので回答例として記録しておきます。
本当、英語は好かん、大嫌いだ... あっ、英語以外の外国語ももちろん嫌いです。

try the steps below then verify the challenge again.
1. Go into the Travel Approval object > Details, then click Edit.
2. Under "Enter Record Name Label and Format", change the Data Type from Auto Number to Text, then Save.
3. Go into your TA-0001 record and change the name to TA-00001.
4. Go back into Travel Approval object > Details again, then click Edit.
5. Under "Enter Record Name Label and Format", change the Data Type from Text back to Auto Number with the TA-{00000} display format, then Save.

[Hi, How to fix object? I cant pass the test because when creating the object in Travel Approval App i typed 4 zeros TA-{0000} instead of 5 zeros- TA{00000) and now while testing it won't find it. "We could not find the 'TA-00001' in Travel Approval objec](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000J7rXi)


技術的な内容云々でなくて、英語での回答の仕方が分からん。まぁ、読むほうも分からんことが多いけどね。
28ピンのEPROM

EEPROMライターのMEEPROMMERをEPROM用に改造するために28ピンのEPROMを調べてみました

|Type|Size|Address|Program|VPP|Time|
|:---|:---|:---|:---|:---|:---|
|2764|8KByte|A0-A12|VPP,PGM,CE|21V|50mS|
|27128|16KByte|A0-A13|VPP,PGM,CE|21V|50mS|
|27C256|32KByte|A0-A14|VPP,CE|13V|100uS|
|27C512|64KByte|A0-A15|CE,OE/VPP|13V|?|

だんだんアドレスピン増えて、使えるピンが無くなるので重層してます。512は無理やりな感じすらします。

SRAMの512Kビットは32ピンになっています。

最初の頃はNMOSのチップで後半はCMOSになります。

TIのTMS27C256の書き込みはVCCが6.5Vのようですが、STのM27C256は5VでOKのようです。

TMS27C256は5V/12Vでも書き込めました。

おそらくいろいろな仕様がありFlashになってからはCFIで情報が拾えるようにしたのかもしれません。

EEPROMの256ではVPPがなくなり128まであったPGMと同じ意味を持つWEがあります。

とりあえず手元に2764と27C256があるので、これをターゲットにします。

8Bitの頃はアドレス空間が64Kしかなかったので、27C256くらいまでが現実的な選択肢でした。

74HC595は8本使えるので、8x2で16ビット=64KByteまでは対応できます。

EPROMの頃は28ピンが一番良く使われたのではないか思われます。Flashになってからは64Kも32ピンになっています。EEPROMまでは28ピンがありましたが、Flashになってからは無かったと思われます。

EEPROMの28C256とEPROMの27C256はいくつかピンが違います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3c0a178c-4d2a-1ff9-cac0-bf7aaf4bab3f.png)

50msecで8K書き込むと409秒かかります。

以前PLCC 32からDIP 28の変換基板を作りました。

![写真（2020-06-25 17.20）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/a7dca891-5f0e-3cd2-93a7-becf213a837b.jpeg)
Python,Ruby,PHP,Java,JavaScript,Perlの連想配列の比較 | プログラミング言語比較

<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlの連想配列の比較

# Python

https://qiita.com/hz1_d/items/407dd13f90a8a4533d23

# Ruby

https://qiita.com/ryouya3948/items/5ea2049abfd92eb1ded7

# PHP

https://qiita.com/shizen-shin/items/8383e27c7cf16c0ccb4a

# Java

https://qiita.com/taropon_wwwww/items/95477174ac16287c9744

# JavaScript

https://qiita.com/yrn03m/items/87e223acc6e733b50429

# Perl

https://perlzemi.com/blog/20161013147635.html
Karabiner-ElementsでUSキーボードがJIS入力になってしまう

## 現象

macのシステム環境設定でキーボードの種類をANSIにしてもJIS入力になってしまう。

## 解決策

1. Karabiner-ElementsのVirtual KeyboardをANSIにする
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311273/ee19b17a-d428-935d-e7b7-95783d5da426.png" width=800>

1. Karabinerを再起動
1. いつも通りmacのシステム環境設定 → キーボードの種類を変更からANSIを選択で解決
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311273/78af7cd6-da10-6809-a854-4851fff473fd.png" width=800>
【SwiftUI】Viewを引数にとるViewの作成方法

# 方法
今回の例は背景色を黄色にするViewを作成しています。
```swift
import SwiftUI

struct BackgroundView<T: View>: View {

    @ViewBuilder var content: () -> T

    var body: some View {
        ZStack(alignment: .center) {
            Color.yellow.edgesIgnoringSafeArea(.all)
            content()
        }
    }
}
```

# 使い方
```swift
struct ContentView: View {
    var body: some View {
        BackgroundView {
            Text("サンプル")
        }
    }
}
```

# 完成形
![simulator_screenshot_BB9BB8D8-FC4F-47E2-B416-190C4ABB6E08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5cb499ab-8616-4b8b-4263-58d723f9c18d.png)

# おわり
コードが綺麗になるので積極的に使っていきたいです
Vimのプラグインでよく使うキーマップ一覧

## はじめに

Vimのプラグインで私がよく使うキーマップを紹介します。

Neovim版は [こちら](https://qiita.com/uhooi/items/95435fdec0f090f7b3ce) です。

## 注意

- 表の見やすさを優先して `noremap` を省略している
  - 実際に設定するときは [私のdotfiles](https://github.com/uhooi/dotfiles) が参考になるはず
- 「カスタマイズ」は私が使いやすいように変更している

## Vimのプラグインでよく使うキーマップ一覧

Vimのプラグインでよく使うキーマップの一覧です。

### ノーマル

ノーマルモード（ `n` ）でよく使うキーマップの一覧です。

#### easymotion

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|前方に検索する|`<Plug>(easymotion-fl)`|`f`||
|前方に検索する（手前にジャンプする）|`<Plug>(easymotion-tl)`|`t`||
|後方に検索する|`<Plug>(easymotion-Fl)`|`F`||
|前方に検索する（手前にジャンプする）|`<Plug>(easymotion-Tl)`|`T`||

#### tcomment

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|対象行をコメントイン/アウトする|`gcc`|-||

#### previm

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|Webブラウザでプレビューを開く|`<Cmd>PrevimOpen<CR>`|`<C-p>`|preview|

#### open-browser

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|カーソル下のURIを開く|`<Plug>(openbrowser-smart-search)`|`gx`||

### 挿入

挿入モード（ `i` ）でよく使うキーマップの一覧です。

#### Emmet-vim

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|展開する|`<C-y>,`|-||

#### skkeleton

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|有効/無効を切り替える|`<Plug>(skkeleton-toggle)`|`<C-j>`|japanese|

#### copilot

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|補完を確定する|`copilot#Accept()`|`<C-g>`||

### ビジュアル、選択

ビジュアル、選択モード（ `v` ）でよく使うキーマップの一覧です。

#### open-browser

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|カーソル下のURIを開く|`<Plug>(openbrowser-smart-search)`|`gx`||

### ビジュアル

ビジュアルモード（ `x` ）でよく使うキーマップの一覧です。

#### tcomment

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|選択行をコメントイン/アウトする|`gc`|-||

### コマンドライン

コマンドラインモード（ `c` ）でよく使うキーマップの一覧です。

#### skkeleton

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|有効/無効を切り替える|`<Plug>(skkeleton-toggle)`|`<C-j>`|japanese|

#### kensaku-search.vim

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|アルファベットのまま日本語を検索する|`<Plug>(kensaku-search-replace)<CR>`|`<CR>`||

## おわりに

これでVimのプラグインをかんたんに呼び出せます :relaxed:
Databricksのメダリオンレイクハウスアーキテクチャとは？

[What is the medallion lakehouse architecture? \| Databricks on AWS](https://docs.databricks.com/lakehouse/medallion.html) [2022/8/17時点]の記事です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

メダリオンアーキテクチャは、レイクハウスに格納されているデータの品質を示す一連のデータレイヤーを表現します。企業のデータプロダクトに対して信頼できる唯一の情報源(single source of truth)を構築するために、Databricksではマルチレイヤーのアプローチを取ることをお勧めしています。このアーキテクチャは、公立的な分析に最適化されたレイアウトでデータ格納される前の検証、変換を行う複数のレイヤーをデータが追加する際の、原子性、一貫性、分離性、耐久性を保証します。[ブロンズ](#生のデータをブロンズレイヤーに取り込む)(生)、[シルバー](#シルバーレイヤーでデータの検証重複排除を行う)(検証済み)、[ゴールド](#ゴールドレイヤーを用いて分析を強化する)(拡張済み)という用語はそれぞれのレイヤーにおけるデータの品質を表現しています。

このメダリオンアーキテクチャは、他のディメンショナルモデリングの技術を置き換えるものではないことに注意することが重要です。それぞれのレイヤーのスキーマやテーブルは、データ更新の頻度や性質、後段でのデータのユースケースに応じて、様々な形態や正規化の度合いを選択することができます。

企業は組織内からアクセス可能な検証済みのデータセットを作成、維持するためにDatabricksレイクハウスを活用することができます。企業においてプロダクトとしてのデータを整理することにフォーカスしたマインドセットを持つことは、プロダクトとしてのデータデータレイクハウスの構築を成功させるキーのステップとなります。

# 生のデータをブロンズレイヤーに取り込む

ブロンズレイヤーには検証されていないデータが格納されています。ブロンズレイヤーに取り込まれるデータは通常は以下のようなものとなります。

- 生の状態のデータソースを維持します。
- インクリメンタルに追加され、時間と共に増加します。
- ストリーミングとバッチトランザクションの組み合わせとなる場合があります。

効率的なストレージフォーマットでデータセットごとに未処理の完全な状態で保持することで、特定のデータシステムの任意の状態を再作成することが可能となります。

検索可能性を強化したり、ソースデータセットの説明を追加したり、後段のアプリケーションのパフォーマンスを最適化するために、(ソースファイル名、処理時刻などの)追加のメタデータが取り込みの際に追加されることがあります。

# シルバーレイヤーでデータの検証、重複排除を行う

ブロンズレイヤーでは、ほぼ生の状態でデータ履歴全体を格納しますが、シルバーレイヤーは後段の分析で信頼できる検証済みかつ補強されたバージョンのデータを表現していることを思い出してください。

Databricksはブロンズ、シルバー、ゴールドレイヤーによって推進されるレイクハウスビジョンを強く信頼していますが、シンプルにシルバーレイヤーを効率的に実装することで、即座にレイクハウスの潜在的なメリットを解放することになるでしょう。

いかなるデータパイプラインにおいても、シルバーレイヤーには1つ以上のテーブルが含まれます。

# ゴールドレイヤーを用いて分析を強化する

このゴールドデータは、多くの場合は高度に洗練され集計され、分析、機械学習、プロダクションのアプリケーションを強化するデータを格納します。レイクアウスのすべてのテーブルは重要な目的に供するべきですが、ゴールドテーブルは単なる情報ではなく、知識へと変換されたデータを表現します。

アナリストは自身の主な責任によってゴールドテーブルに大きく依存していますが、顧客と共有されるデータがこのレベルで外部に格納されることはまず無いでしょう。

これらのテーブルに対するアップデートは、定期的にスケジュールされたプロダクションワークロードの一部として実行され、コストのコントロールの助けとなり、確立すべきサービスレベルアグリーメント(SLA)を実現します。

レイクハウスはにはデータウェアハウスで遭遇するかもしれないデッドロックの問題はありませんが、データリクエストにおけるクラウドの制限を回避するために、多くの場合ゴールドテーブルは異なるストレージコンテナに格納されます。

通常、データがゴールドレイヤーに書き込まれる前に集計、join、フィルタリングが適用されるので、ユーザーはゴールドテーブルにおいては低レーテンシーのクエリーパフォーマンスを体験することになります。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
翻訳の設定

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)

[「タブとラベルの名前変更」: ドイツ語の翻訳はオブジェクト定義を上書きします](https://salesforce.stackexchange.com/questions/333212/rename-tabs-and-labels-german-translation-overrides-object-definition)


これについてSalesforceサポートと話し合ったところ...「これはバグではなく、文書化されていない機能です」.

要約すると、組織の既定の言語です。私にとってはフィンランド語でした。ピックリストの値やカスタム フィールド ラベルとは異なり、タブには実際には既定値がないようです。

どうやらここでの問題点は、作成中にタブ名を X に設定している間 (UI 言語が英語であっても)、翻訳を Y として作成すると (私の場合はフィンランド語)、デフォルトが設定されていない場合はそれがデフォルトになることです。別々に。

回避策として私にとってうまくいったのは、タブを作成し、名前をXに設定してから、タブとラベルの名前を変更するセクションに進み、タブをXに「名前変更」して「英語の翻訳」を作成することです。フィンランド語訳。すでに英語の「翻訳」がある場合は、デフォルトで上書きされません。

# Apex Siteクラスが返すエラーメッセージの日本語化

+ [Apex Siteクラスが返すエラーメッセージの日本語化について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JgzCm)

:::note
英語ですが同じ質問があって回答がされています。

You need to move the Error Message from the apex class to Label and DO the translating .. Apex Classes Error Messages are not translated by default ...

Site Validation Password error message only ENGLISH
https://developer.salesforce.com/forums/?id=9060G0000005kRTQAY

調べてみるとカスタムラベルの翻訳は「完全な翻訳済み言語」が必要なように感じます。
https://www.oktana.com/translate-salesforce-custom-labels-cheat-sheet/

翻訳ワークベンチなんかもあるようですが、これも動的に翻訳しているのかがよく分からないですね。
https://salesforce.stackexchange.com/questions/376184/how-to-get-translation-of-field-label-based-on-language-and-locale

外部から利用できる翻訳サイトのAPIなどが使えるなら、都度エラーメッセージをリアルタイムに翻訳して(コールアウトして）結果を表示させるようなことも考えられます。

個人的には静的な変換表を用意しておいて、対象になかったら、管理者に通知して変換表を作り変えるのがいいのではと思います。
:::

# その他

+ [visualforceのメールテンプレートで翻訳設定を行う](https://qiita.com/Keiji_otsubo/items/32f6cc06bb500cc43ebb)
+ [トレイルヘッドが翻訳されて表示される](https://qiita.com/Keiji_otsubo/items/6bad8a7c076c22823e53)
+ [フローラベルはユーザー定義言語に基づいて変更されません](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007F4D4a)

:::note
これはユーザーのロケール設定が原因で発生しました。スクリーンショット 2 と 3 ではフローの名前が管理対象外だったため、別の言語に変更されませんでした。ただし、Salesforce によって生成された管理パッケージ フローの場合、名前はユーザーのロケール設定に基づいて変更されます。
:::


# 「商談名別の上位 10 件の金額」を開発組織で使用されている言語 (この場合はスウェーデン語) に翻訳するのは難しいと思います。

+ [【未解決】Struggle to find "top 10 amounts by opportunity name"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bKxIQ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4908ed4a-50ec-b13a-4977-8d3ade3e9ccb.png)
javascriptのクロージャ（Closures）とは

# クロージャ（Closures）とは
スコープを利用して外部からのアクセスを制限すること。

まずは、次の例文を見て説明します。

~~~javascript:javascript
class AnnualSalary {
   salary: number
   private bonus: number = 1000000
   constructor(salary: number) {
       this.salary = salary
   }

   public get annualSalary() {
       return this.salary + this.bonus
   }
}
~~~
このコードは関連する役割をするメソッドや変数を一つのクラスにまとめてカプセル化したクラスです。このコードを見ると、privateで設定されたbonusは外部からはアクセスすることができない状態で、getメソッドのannualSalaryのみが参照しています。
では、いつこのようなクロージャを使うでしょうか。

# クロージャの利用場面
### カプセル化した時
上記のコードでも紹介しました通り、同類の性質を持つ変数や関数などをまとめてカプセル化し、一部のメソッドのみがアクセスできるようにする際によく使われます。

### グローバル変数を減らしてバグを防ぐ時
~~~javascript:javascript
let count = 0
function handleCilck(){
  count++
  return count
}
~~~
↓
~~~javascript:javascript
function handleCilck(){
  let count = 0
  return function (){
    count++
    return count
  }
}
~~~
count変数を関数内に移動して、他のコードが参照できないようにするとバグを防ぐことができます。

### コードを再利用する時
~~~javascript:javascript
const newTag = function(open, close) {
    return function(content) {
        return open + content + close
    }
}

const bold = newTag('<b>', '</b>')
const italic = newTag('<i>', '</i>')

console.log(bold(italic("This is my content!")))
//<b><i>This is my content!</i></b>
~~~

# 注意点
### varでの宣言は避ける
varで宣言した変数はブロックスコープ外になるため、外部からのアクセスが可能になってしまいます。
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その008

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: 構成、設定とオブジェクト
構成と設定の学習　にある練習問題８問目をご紹介します。
https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-setup-and-objects/study-up-on-org-setup

なお、こちらの内容はYouTubeでも公開しております
https://www.youtube.com/watch?v=YEPyrTs1alg&list=PLz8HSF-SrLeH8jCOj9cfAljXfVNQkQlkS&index=8


<iframe width="560" height="315" src="https://www.youtube.com/embed/YEPyrTs1alg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



練習問題8問目はこちらです

![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/79512adb-578a-2250-fa51-bd67f73a0b85.png)



今回の画面のユーザライセンスはこちらです
![ユーザライセンス01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b5b19f6e-e924-bbb6-d6db-c4dd666e80b4.png)


正解はAです

それでは問題を深堀していきましょう

組織情報とはこちらです

組織情報からユーザライセンスの確認が可能です

ここのユーザライセンス数で割り当て可能なライセンスを確認することが可能です。

さて、今回のようにユーザを無効化した場合、ライセンス残数が増えます。

ユーザを無効にすると、無効にするととライセンス残数が増えることが分かりますね。
なのでライセンスは再割り当てが可能になることが分かりますね


その他のユーザ無効の考慮事項は以下のヘルプからご確認ください
https://help.salesforce.com/s/articleView?id=sf.users_deactivate_considerations.htm&language=ja&r=https%3A%2F%2Fwww.google.com%2F&type=5

今日の内容はここまでです。
皆さん楽しく元気にSalesforceを学びましょう！
navigator.clipboard.writeText()がユーザにパーミッション無く動作するのか検証してみた


# 本記事の目的

:::note info
8/31 readText()の動作確認を追記しました。
:::

以前navigator.clipboardについてこんな記事を書きました

https://qiita.com/arakawayasuaki/items/cc60a876dad4b3f8b15b

この時に、やけにChromeのclipboard APIの実装が他のブラウザと比べて緩いなーと思っていたのですが・・・

するとこんなニュース記事が発表されており

https://gigazine.net/news/20220829-chrome-clipboard/

>GitHubでtomayac氏が投稿した内容によると、画像をクリップボードにコピーするAPIのメソッド「navigator.clipboard.write()」および文字列をクリップボードにコピーするAPIのメソッド「navigator.clipboard.writeText()」は、FirefoxとSafariではユーザーによる操作が求められるのですが、Chromeではユーザーの操作なしで実行されるとのこと。Naleksuh氏は「これは以前から問題になっていたものです。この問題があるので、ランダムなウェブサイトでJavaScriptを有効にすべきではないのです」とコメントしています。

とのこと。以前利用したのはclipboard.readText()だったので気がつかなかったのですが、どうやら今の実装だと

**clipboard.writeText()はユーザにパーミッションを取らずに動作してしまうらしい?**

とのことなので、動作検証してみました。

# 検証環境

使用したのは以下のコード、ブラウザは
「Chrome バージョン: 104.0.5112.101（Official Build） （x86_64）]
を使用しました。以下のコードはVue.jsで記載しています。動作確認する場合は、「npm init nuxt-app」でプロジェクトを作成して、index.vueを下記コードに入れ替えてもらえれば動作します。

```vuejs
<template>
  <div id="app">
    <button v-on:click="showMessage">ボタン</button>
    <p>{{ msg }}</p>
  </div>
</template>

<script>
var parser = require("ua-parser-js");

export default {
  data() {
    return {
      name: "app",
      msg: "",
      currentfocus: false,
    };
  },
  created: function () {
    window.addEventListener("focus", this.focus);
    window.addEventListener("blur", this.blur);
  },
  destroyed: function () {
    window.removeEventListener("focus", this.focus);
    window.removeEventListener("blur", this.blur);
  },
  methods: {
    async showMessage() {
      var ua = parser(window.navigator.userAgent);
      if (ua.browser.name === "Chrome" || ua.browser.name == "Edge") {
        let newmsg = "";
        /* setInterval(async () => {
            try {
              if (this.currentfocus == true) {
                newmsg = await navigator.clipboard.readText();
                if (newmsg != this.msg) {
                  this.msg = newmsg;
                }
              }
            } catch (err) {
              console.log(err);
            }
          }, 5000);*/
        await navigator.clipboard.writeText("テスト書き込み");
        this.msg = "書き込み完了";
      }
    },
    focus() {
      this.currentfocus = true;
    },
    blur() {
      this.currentfocus = false;
    },
  },
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
```
以前使用したreadText()はコメント化しており、writeText()の処理は追加しています。今回はwriteなのでタイマー処理も外しました。

# 検証結果・対応策

結果は・・・

**「パーミッション無しで書き込み成功しました」**

readText()のときも初回のパーミッションだけで自由に使えてしまったので、違和感はあったのですが、writeText()だとユーザが知らない間にclipboardに自由に書き込めてしまいますね。

「readText()の時もパーミッションを取らないのでは」というコメントもあったのですが、動作確認した限りでは、許可が必要でした。

以下Chomeがクリップボードへのアクセスの際にパーミッションを取得する際のスクリーンショットです。

![スクリーンショット 2022-08-31 11.45.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269532/fe85bd9e-1704-1558-06a3-e396de3bcd7e.png)

:::note warn
ブラウザ利用時にこのダイアログが出たらWebサイトからクリップボードへアクセスしてるので気をつけましょう！
:::

今のところ本現象を防ぐにはjavascriptのオフしか対応方法を思いつかないのですが、writeであればそこまで大きな問題とはならない？という判断なのかもしれません。
sftp上でlsした結果をlessするにはsftpのバッチモードを使えばいい

### 課題

sftpで使えるコマンドは限りがあるのでlsした結果をlessしにくい。

### 解決サンプル

```bash
echo "ls -lt" | sftp  -b - user@host | less
```

### 解説

sftpにはバッチモード`-b`がある。普通はこの引数にコマンドをつらつら書いたファイルを指定するが、それも面倒なので標準入力から渡す。

コマンドラインツールはファイル名に`-` を指定すると標準入力（出力ファイル名に指定するときには標準出力）になるものが多い。

つまり上記のコマンドは

- `ls -lt` というsftpコマンドをsftpのバッチモードの入力にパイプで渡す
- sftp 上で`ls`した結果は標準出力に出される
- パイプで `less`コマンドに渡す

### 用途

会社間のファイルのやり取りはS3やsftpでやり取りされることが増えた。やりとりするディレクトリをポーリングするだけでいい。手動での操作であっても何かしらのディレクトリを見るときにはワンライナーにしておくことで、ヒストリから辿れて便利。
Visual Studioのデバックモードでパスを設定する

iRIC v3とv4の両方をインストールした環境でVisual Studioでデバックを行うと、以下のようなエラーが生じる場合がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90108/99282478-2141-1e60-ccd4-a80be784c7fb.png)

これはv3とv4で同じ名前のライブラリが存在していることで、v4用のプログラムを開発しているにもかかわらず、v3のライブラリを参照しにいってしまうことが原因である。

上記エラーはVisual Studio上で実行時に参照するライブラリのパスを設定することで回避することができる。設定方法は以下。

- [1] プロジェクト>プロパティを開く
- [2] Debugging タブを選択
- [3] Environmentに以下を記述する

```
PATH=%userprofile%\iRIC_v4_dev\guis\prepost;%PATH%
```
PostgreSQL立ち上げ（pg_ctl系コマンド）

# DBクラスタ作成
【オプション一覧】
- -D：DBクラスタを作成する空のdirを指定する。dirが存在しない場合は、新たに作成する。空でない場合は、エラー
- -o　''：''内に以下のオプションを指定することができる。
    - -E(--encoding=エンコーディング)：エンコーディングを指定。
        - 未指定の場合は、OSのロケールになる。
    - --locale=ロケール：ロケールを指定。
        - 未指定の場合は、OSのロケールになる。
    - --nolocale：ロケールを無効にする。推奨されている。--locale=Cと同じ。
    - -U(--username=初期DBユーザ名)：作成する初期DBユーザ（スーパーユーザ）名を指定。
        - 未指定の場合は、PostgreSQL管理ユーザと同名になる
```shell
$ pg_ctl initdb -D ./psql_test -o '--no-locale'
```
- 上記のコマンドを実行してDBクラスタを作成する
- 上記のコマンドを実行したOSユーザは、PostgreSQLの管理ユーザになる。作成したDBクラスタ(dir)にアクセスできるOSユーザは、PostgreSQL管理ユーザのみ
- PostgreSQL標準のpg_ctl系コマンドは、PostgreSQL管理ユーザのみ実行することができる
- また、pg_ctl系コマンドは、リモートでの実行はできず、ホストからしか実行することはできない

※PostgreSQL管理ユーザ = DBクラスタ(dir)を管理するOSユーザ

# PostgreSQLサーバ起動
【オプション一覧】
- -D：DBクラスタを作成する空のdirを指定する。dirが存在しない場合は、新たに作成する。空でない場合は、エラー
- -t：起動までの最大待ち時間を指定（デフォルトで60秒）
```shell
$ pg_ctl start -D ./psql_test
```

# PostgreSQLサーバ停止
【オプション一覧】
- -D：DBクラスタを作成する空のdirを指定する。dirが存在しない場合は、新たに作成する。空でない場合は、エラー
- -t：起動までの最大待ち時間を指定（デフォルトで60秒）
- -W：サーバの停止を待たずに、停止コメントを表示する
- -m：シャットダウンモードを指定する
    - s(smart)：クライアントからの接続が全て切断されることを待ってから停止する。
    - f(fast)：クライアントからの接続を全て、強制的に切断してから停止する。実行中のトランザクションは全てROLLBACKする。（デフォルト）
    - i(immediate)：クライアントからの接続を全て、強制的に切断してから停止する。次回の起動時には復旧処理が必要になる。クラッシュと同じ状態。
```shell
$ pg_ctl stop -D ./psql_test -m fast
```
# サーバの再起動
【オプション一覧】
- -D：DBクラスタを作成する空のdirを指定する。dirが存在しない場合は、新たに作成する。空でない場合は、エラー
- -t：起動までの最大待ち時間を指定（デフォルトで60秒）
- -m：シャットダウンモードを指定する
    - s(smart)：クライアントからの接続が全て切断されることを待ってから停止する。
    - f(fast)：クライアントからの接続を全て、強制的に切断してから停止する。実行中のトランザクションは全てROLLBACKする。（デフォルト）
    - i(immediate)：クライアントからの接続を全て、強制的に切断してから停止する。次回の起動時には復旧処理が必要になる。クラッシュと同じ状態。
```shell
$ pg_ctl restart -D ./psql_test
```

# サーバの起動状況を確認
【オプション一覧】
- -D：DBクラスタを作成する空のdirを指定する。dirが存在しない場合は、新たに作成する。空でない場合は、エラー
```shell
$ pg_ctl status -D ./psql_test
```

# 設定ファイルの再読み込み
【オプション一覧】
- -D：DBクラスタを作成する空のdirを指定する。dirが存在しない場合は、新たに作成する。空でない場合は、エラー
```shell
$ pg_ctl reload -D ./psql_test
```

# プロセスにシグナル送信
【シグナル一覧】
- TERM：「pg_ctl stop -D~ -m s」と同じ
- INT：「pg_ctl stop -D~ -m f」と同じ
- QUIT：「pg_ctl stop -D~ -m i」と同じ
- HUP：「pg_ctl reload -D~」と同じ
```shell
$ pg_ctl reload -D ./psql_test
```
ROC曲線からカットオフ値を求める(SPSS Modeler データ加工逆引き8-7)

# ROC曲線からカットオフ値を求める（Youden index)

![スクリーンショット 2022-08-19 13.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f30dae03-d9dc-dd46-9f81-6e3e674fe4db.png)

この記事は逆引き8-5,6(ROC曲線)と関連付いて書かれています。

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

・どの傾向スコアまでを故障/貸倒れ/不正/購入と予測するのが良いかを検討
・予測モデルの性能評価
・実装後のモデルメンテナンスのための性能指標の算出


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

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

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

![スクリーンショット 2022-08-19 13.47.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c50258ef-daad-71fc-5fef-2cad29109871.png)

a.入力するデータは以下の通りです。故障有無と予測、傾向スコアの3列のデータです。
![スクリーンショット 2022-08-18 8.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ff39ad43-5f8a-af31-c573-5af118503edc.png)

＊ROC曲線でカットオフポイントを決めるためこの時点では予測列[$&#xFFF0;R-故障]は全て1にしています。

#### カットオフポイントとは

図と表から、予測スコアの値がいくつを上回ったら故障を疑うか検討します。
例としてAとBのスコアで比較します。

A）スコア0.80以上で故障を疑うと感度1なので見逃しはないが1-特異度が0.58と故障でないのに疑う率が高い

B）スコア0.25以上で故障を疑うと1-特異度が0.08と故障でないのに疑う率が低いが感度は0.38で見逃し率が高くなる

このトレードオフにある感度と1-特異度の両方をなるべくバランスよく満たす地点（カットオフ値）を探索します。

![スクリーンショット 2022-08-19 14.21.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3d6b71fc-348b-63c5-c293-68cec39af5e8.png)

b.[評価グラフ]ノードを[実行]します。
![スクリーンショット 2022-08-18 9.06.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4bb6d9ed-f7af-1257-455f-2de5ccf5c294.png)

#### 感度と1-特異度の差が最大化するポイントを探す

c.この時点でのデータを確認します。赤枠は逆引き8-5を参照ください。
![スクリーンショット 2022-08-18 17.37.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/19aa6358-a0e3-a321-5664-d8e4d1d5439c.png)

d.[フィールド作成]ノードを編集します。
![スクリーンショット 2022-08-19 13.54.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a1bd08d1-50d4-84cf-5117-e5cbfc6af5cb.png)

e.[ソート]ノードを編集します。
![スクリーンショット 2022-08-19 13.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7426b23c-cff2-57bc-d72d-b10020f927b7.png)

f.[サンプリング]ノードを編集します。
![スクリーンショット 2022-08-19 13.55.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5853a6f8-2610-b3ad-a6e4-b3bd00efd8e3.png)

g.[フィルター]ノードを編集します。
![スクリーンショット 2022-08-19 13.55.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8af103f0-74be-6be8-8474-f42749d60704.png)

[プレビュー]します。感度と1-特異度が最大化するレコードが特定できました。 この方法(Youden index)では予測スコアは0.5をカットオフ値にします。
![スクリーンショット 2022-08-19 13.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f1dafdb8-1f0b-cd33-ebc4-546c41350b1a.png)

#### 注意事項

別の目的でストリームにアレンジしやすいように、今回は直接計算に不要な処理（TNとFN）をストリームに含めています。
実際には見逃し率や濡れ衣率などのバランスは業務の状況と現場の理解を考慮して確定します。

## 4.参考情報

#### モデルの性能指標について解説した記事

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

#### SPSS StatisticsでROC分析を行う

https://qiita.com/Makimaki2020/items/59aed89864ea21617bbd

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
レコードに存在する欠損値/有効の数をカウントする(SPSS Modeler データ加工逆引き5-11)

# レコード（行）に存在する欠損値/有効の数をカウント

![スクリーンショット 2022-08-10 9.09.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5790d29b-885a-e9c6-684a-ba19f3ec24b0.png)

レコードに含まれるNULLをカウントしています。フィールド（列）に含まれるNULL/有効数のカウントは[データ検査]ノード利用します。

https://qiita.com/416nishimaki/items/b5ebb7f0aca1ee7ec2cb#%E3%83%87%E3%83%BC%E3%82%BF%E6%A4%9C%E6%9F%BB%E3%83%8E%E3%83%BC%E3%83%89%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

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

・顧客行動予測のためのデータ理解
・設備の異常検知/故障予測のためのデータ理解

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

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

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

![スクリーンショット 2022-08-10 9.12.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c1f629c2-25b1-dc06-a6ea-ccbf5190f9ec.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-08-10 9.13.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d99e9479-0472-dff2-5748-9f818f58efb3.png)

b.[フィールド作成]ノードを編集します。関数count_nulls(フィールドのリスト)で算出します。フィールド（列）のリストには値の文字から始まるものを@&#xFFF0;FIELDS_MATCHINGで確定しています。
![スクリーンショット 2022-08-10 9.14.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/144ade4f-770b-3a20-201d-a98ebe83e5e3.png)

式ビルダーの比較関数と@&#xFFF0;関数を利用すると便利です。
![スクリーンショット 2022-08-10 9.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1e3a83ba-87ce-bbbd-e285-03e12351e090.png)

[プレビュー]します。
![スクリーンショット 2022-08-10 9.15.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4ba1697c-0fd3-6153-3d3e-6774981aa8e2.png)

c.[フィールド作成]ノードを編集します。先の関数の逆をcount_non_nullsで行います。
![スクリーンショット 2022-08-10 9.15.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b2ee1b62-4c48-2943-3f6d-3d7e9ad68280.png)

[プレビュー]します。
![スクリーンショット 2022-08-10 9.16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8a65f199-60c9-f082-dab6-52d801196091.png)

#### 注意点

フィールドのリストを宣言する方法はこちらを参照してください。

https://qiita.com/416nishimaki/items/27c322f7da4967d4caf3

## 4.参考情報

#### フィールド毎に欠損値を確認する

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

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
[Houdini学習8日目]パラメーターを共通化させる方法

# 使用するノード
nullノード

# 使用方法
・他ノードと線をつなげる必要はない
・プログラミング的に言えば、変数のようなもの。
・nullノードでパラメーターを定義し、その定義を使いたいところは相対パスで参照させる。
参照方法は
https://qiita.com/auwa/items/6f1625b4593bf0910047#%E5%AE%9F%E6%96%BD%E6%96%B9%E6%B3%95
を参照

# パラメーターをカスタマイズする方法
　※nullノード以外でも同様の方法でカスタマイズ可
　nullノードのParameters Viewを見ると、最初は何のパラメーターもない。
　自分で必要な型を定義する必要がある。

1. nullノードのParameters Viewで、右上にある歯車マークを押し、
Edit Parameter Interfaceを選択。
2. Create Parametersの枠から使いたい型を、
右隣のExisting Parameters内にドラッグアンドドロップ。
※Existing Parameterの右隣のParameter Descriptionで変数名や、
値の範囲など設定可。
3. Apply または　Aceptボタンで反映　

# nullノードで共通化できる範囲はどこまでか？
下記3パターンのTree構造を用意してみて検証してみる。
※いずれもサイズを定義する形で検証

>①
obj
　**・null**
　・geo1
　　　└box1

>②
obj
　・geo1
　　　└box1
　　　**└null**

>③
obj
　・geo1
　　　└box1
　・geo2
　　　**└null**

結果：全パターンで共通化できました。
Event listenerでのRecoil Value更新

# 自己学習メモ 
Recoilは状態管理として簡単に使えるが、たまにつまりポイントがあるのでそのあたりのメモ
※Recoilがどこでもよしなに更新してくれるだろうくらいで思っているとつまる

# 環境
- react": "^18.2.0"
- recoil": "^0.7.5"

# 例
コンポーネント描画時にイベント登録を行いRecoilが後で更新されたケース
以下では、resizeイベントを登録してボタンでRecoilを更新する

## Valueが更新されないコード
useEffectで一度だけイベント登録して、listenerで参照する場合
atomが更新されてもlistenerのなかでは古い情報が参照される

```tsx
import { useEffect } from "react";
import { atom, useRecoilState } from "recoil";

const isLoginAtom = atom({
  key: "isLogin",
  default: false,
});

const Test: React.FC = () => {
  const [isLogin, setIsLogin] = useRecoilState(isLoginAtom);
  const resizeEvent = (_e: Event) => {
    console.log("isLogin", isLogin);
  };

  useEffect(() => {
    window.addEventListener("resize", resizeEvent);
    return () => {
      window.removeEventListener("resize", resizeEvent);
    };
  }, []);

  return <button onClick={() => setIsLogin(!isLogin)}>LOGIN</button>;
};

export default Test;
```

## Recoil Valueが更新されるコード
useEffectのdependencyにlistenerを指定
listenerの中で最新のValueが取得される

```tsx
import { useEffect } from "react";
import { atom, useRecoilState } from "recoil";

const isLoginAtom = atom({
  key: "isLogin",
  default: false,
});

const Test: React.FC = () => {
  const [isLogin, setIsLogin] = useRecoilState(isLoginAtom);
  const resizeEvent = (_e: Event) => {
    console.log("isLogin", isLogin);
  };

  useEffect(() => {
    window.addEventListener("resize", resizeEvent);
    return () => {
      window.removeEventListener("resize", resizeEvent);
    };
  }, [resizeEvent]);

  return <button onClick={() => setIsLogin(!isLogin)}>LOGIN</button>;
};

export default Test;
```

## Recoil Valueが更新されるコード2
Recoilのsnapshotから最新Valueを取得

```tsx
import { useEffect } from "react";
import {
  atom,
  RecoilState,
  RecoilValue,
  useRecoilCallback,
  useRecoilState,
} from "recoil";

const isLoginAtom = atom({
  key: "isLogin",
  default: false,
});

const Test: React.FC = () => {
  const [isLogin, setIsLogin] = useRecoilState(isLoginAtom);
  const getRecoilStateSync = useRecoilCallback(
    ({ snapshot }) =>
      (state: RecoilState<unknown> | RecoilValue<unknown>): unknown => {
        return snapshot.getLoadable(state).contents;
      },
    []
  );

  const resizeEvent = (_e: Event) => {
    const isLogin = getRecoilStateSync(isLoginAtom);
    console.log("isLogin", isLogin);
  };

  useEffect(() => {
    window.addEventListener("resize", resizeEvent);
    return () => {
      window.removeEventListener("resize", resizeEvent);
    };
  }, []);

  return <button onClick={() => setIsLogin(!isLogin)}>LOGIN</button>;
};

export default Test;

```
Nokogiri を使う(XPath)



HTML 解析で Nokogiri を使ったので使い方を忘れないように自分用にメモしておく。

# 基本的な使い方

公式ドキュメントのサンプルコードを見ると分かりやすい

[Parsing and Querying](https://nokogiri.org/#parsing-and-querying)

```
#! /usr/bin/env ruby

require 'nokogiri'
require 'open-uri'

# Fetch and parse HTML document
doc = Nokogiri::HTML(URI.open('https://nokogiri.org/tutorials/installing_nokogiri.html'))

# Search for nodes by css
doc.css('nav ul.menu li a', 'article h2').each do |link|
  puts link.content
end

# Search for nodes by xpath
doc.xpath('//nav//ul//li/a', '//article//h2').each do |link|
  puts link.content
end

# Or mix and match
doc.search('nav ul.menu li a', '//article//h2').each do |link|
  puts link.content
end
```

以下より、自分用のメモ

# ファイルから読み込ませる

自分の場合、あらかじめダウンロード済みの HTML のパースだったので以下のように記載

```
doc = File.open("out.html") do |f| 
  Nokogiri::HTML(f, nil, 'UTF-8')
end
```

/html/body/div/table/tbody/tr[1]

# 検索

以下の方法がある模様

+ CSS
+ XPath
+ mix and match

何が良いのか分からないが、Chrome の DevTool を開き、 Elements から取得した要素を選択し、右クリック後に Copy->Copy XPath というように XPath の確認ができたので、今回は XPath を使うことにした。

今回取得してきた HTML で処理したい処理は以下のようになっていた

```
・・・
  <tbody>
      <tr class="">
        <td>ABC</td>
        <td>DEF</td>
        <td>GHI</td>
      </tr>
      <tr class="">
・・・
````

その為、「//」をつけてドキュメント全体から対象の要素(tbody/tr)を探し、その後、各 tr/td 要素をそれぞれ処理するようにした。

```
nodes = doc.xpath("//tbody/tr")
nodes.each do |node|
  informations = node.xpath("td")
  informations.each_with_index do |information, i|
  ・・・
  end
end
```

以下を参考にさせて頂きました。

[nokogiriの使い方メモ（XPathを使った場合）](https://qiita.com/nakamurau1@github/items/e5b91117877ba366fa6b)

## デバッグ

`p` や `pp` などを使って Nokogiri より取得した情報を確認しつつ、デバッグした
【夏休み企画】#IT用語一問一答【毎朝投稿16日目】ARIA

# この記事を読むと、、
- 「関連用語」を使って「ARIA」を説明できるようになる
- 「ARIA」がもっと好きになる(多分)

# 関連用語
Accessibility / semantic HTML

[**復習用**] 記事の内容を見る前に上記の言葉で「ARIA」を説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

昨日の記事はこちら↓

https://qiita.com/acta/items/908f86fdeebfbf87c397

# ARIAとは
ARIA = WAI-ARIA = Web Accessibility Initiative - Accessible Rich Internet Applications = Webページ内の動的要素を障がいを持つユーザーにも使いやすくする技術

- **Accessibility** = 障がいのあるユーザーを含め多くの人がサービスを利用可能な状態
    - SEO的にも大事
    - ex. 音声読み上げ
    - ex. マウスを使わずにキーボードで操作できる

- **semantic HTML** = 使用目的に適したHTML要素を使うこと
    - Accessibilityを考える上での基本、その上で必要ならARIAを用いる
    - ex. 脳死でdivを唱えない

- 「わい、ありあ」と読む
    - なんJとは無関係

- ARIAには3つの機能がある
    1. Roles = 要素が何であるか
        - ex. `role="navigation"`
    1. Properties = 要素がどんな属性を持つか
        - ex. `aria-required="true"`
    1. State = 要素が今どんな状態か
        - ex. `aria-disabled="true"`

# 参考資料
- https://en.wikipedia.org/wiki/WAI-ARIA
- https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA
- https://developer.mozilla.org/en-US/docs/Learn/Accessibility/WAI-ARIA_basics
HashableなDataclassを作る

PythonにはHashable,Unhashableという概念があり、辞書型の鍵にしようできるのはHashableなオブジェクトのみ。

割と便利なDataclassを使っていて辞書の鍵として使いたいときに、Hashableにする方法を調べたのでメモ。

## データクラス内にHashableな値しかない場合

デコレーターの`frozen=True`をつけると、データクラス内の値がHashableになる。

```python
from dataclasses import dataclass

@dataclass(frozen=True)
class Sample:
    a: int
    b: str
```

## データクラス内にHashableでない値がある場合

対応する値をHashableにする。
下記例では、`a`の値を`frozenset`にすることでHashableになる。
型変換の処理は`__post_init__`で行うことで自動的に行われる。

```python
from dataclasses import dataclass

@dataclass(frozen=True)
class Sample:
    a: int
    b: str
    c: list | frozenset
    def __post_init__(self):
        object.__setattr__(self, "c", frozenset(self.c))
```
vistaでandroid studio その6

# 概要
vistaでandroid studio 1.0.1やってみた。
練習問題やってみた。

# 練習問題
sin波を、表示せよ。

# 方針
- カスタムviewを、作る。

# 写真

![device-2022-08-29-172938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/eea7bdd5-35b2-0127-3ade-d49834b4a9ce.png)

# サンプルコード

```
package com.ohisamallc.ohiapp154.ohiapp154;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by ore on 22/08/29.
 */
public class SinView extends View {
	private Paint paint;
	public SinView(Context context, AttributeSet attrs) {
		super(context, attrs);
		paint = new Paint();
		paint.setColor(Color.BLUE);
	}
	public SinView(Context context) {
		super(context);
		paint = new Paint();
		paint.setColor(Color.RED);
	}
	public void setColor(int color) {
		paint.setColor(getResources().getColor(color));
		invalidate();
	}
	@Override
	protected void onDraw(Canvas canvas) {
		paint.setAntiAlias(true);
		int j;
		double angle;
		for (j = 0; j < 720; j++)
		{
			angle = ((double) j) / 360 * 2 * Math.PI;
			int k = (int)(100 * Math.sin(angle) + 150);
			canvas.drawLine(j, k, j, k + 1, paint);
		}
	}
}


```

# レイアウト

```
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:paddingLeft="@dimen/activity_horizontal_margin"
	android:paddingRight="@dimen/activity_horizontal_margin"
	android:paddingTop="@dimen/activity_vertical_margin"
	android:paddingBottom="@dimen/activity_vertical_margin"
	tools:context=".MainActivity">

	<TextView android:text="@string/hello_world"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content" />
	<com.ohisamallc.ohiapp154.ohiapp154.SinView
		android:id="@+id/change"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_marginLeft="10dp"
		android:layout_marginTop="10dp" />

</RelativeLayout>

```

以上。
技術系同人誌を書く基礎メモ

[技術系同人誌を書く人の味方「Re:VIEW Starter」の紹介 - Qiita](https://qiita.com/kauplan/items/d01e6e39a05be0b908a1) を参考にしつつ、技術系同人誌を簡単に作る手順のメモです。

https://kauplan.org/reviewstarter/

https://github.com/vvakame/docker-review/tree/master


以下では「start-review-starter」というプロジェクト名にする。
start-review-starter.zip をダウンロードする。

## 基本的な流れ

### Docker Desktop を使う

`C:\workspaces\books\start-review-starter`

という階層をここでは Win10 のPCに配置した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/1624e5e0-3d0b-02ad-e412-0b396155c681.png)



`cd start-review-starter`
`docker pull kauplan/review2.5` でイメージを取得。

### 起動

`docker run -v /c/workspaces/books/start-review-starter:/data/workspace -it kauplan/review2.5 /bin/bash`
`cd data/workspace`
`rake pdf`

で、`start-review-starter.pdf` がコンパイルされる。


### 執筆環境

[技術書典12で用いた同人誌の執筆環境とGitHub Oriented Writingの紹介](https://zenn.dev/drumath2237/articles/b65ef1f0587dfd#vscode-%E3%81%A8-re%3Aview-%E6%8B%A1%E5%BC%B5%E3%81%AB%E3%82%88%E3%82%8B%E5%9F%B7%E7%AD%86)


### VSCode・Atom

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/55811b55-88ec-873c-312d-41889df96b55.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/0efe3bb7-c9f2-d6cf-3791-61518b715bf0.png)

https://bibinbaleo.hatenablog.com/entry/2020/01/27/212751


### MarkdownからPandoc等

https://speakerdeck.com/loftkun/demo-of-write-slides-and-books-with-vscode-plus-markdown


## その他参考

[技術書典13の執筆環境にVivliostyleを採用しました](https://zenn.dev/typebase/articles/techbookfest13-vivliostyle)
[技術書典に初参加したら1時間で完売した話 - Qiita](https://qiita.com/choco_py3/items/5448070f749095a2e6bb)
[技術書典で技術同人誌を出そう！〜決意から頒布まで〜 - Qiita](https://qiita.com/choco_py3/items/6148a5665a13b4988f72)
[技術書にありがちな「IT技術は変化するけど、紙の本は更新できない問題」について僕なりの創意工夫を話してきました #DevReljp - give IT a try](https://blog.jnito.com/entry/2022/09/08/081931)
[Re:VIEWとGitHubを使って、技術書合同誌を書いた話（非エンジニア含む）](https://zenn.dev/orange634nty/articles/37a31875e8cc57e3c868)
[同人版TCP/IP入門第6版：AliceSystem](https://techbookfest.org/product/39250001)
![](https://techbookfest.org/api/image/71130029.png?size=432)

> Webアプリケーションやスマートフォンのアプリケーションなど、ネットワークを使う前提のコードを書いているけれどTCP/IPについてよくわかっていないけどいまさら言い出せないプログラマ、UTMとかサーバとかは設定しているんだけれどいまさらTCP/IP判ってないと言い出せないアプリケーションエンジニアetc.に向けた本

http://www5e.biglobe.ne.jp/aji/3min/

以上です～
Pythonの便利技と注意点:条件編

[目次に戻る](https://qiita.com/yuta-sanjyo/items/416b05f8498df1ed3f49)

# 範囲条件を簡単に
```py:数字 < 変数 < 数字
>>> num = int(input())
5
>>> if 1 < num < 10:
	print(num)

5
```

```py:数字 <= 変数 <= 数字
>>> num = int(input())
3
>>> if 1 <= num <= 5:
	print(num)
	
3
```

# 分岐が複数でmatch-caseを使わずに条件分岐させる技
辞書を活用することで、長い分岐をスッキリさせることが可能。
```py:if文を使う場合
born_month = int(input("生まれた月を入力してください。旧暦の月名に変換します。（1-12）"))
if born_month == 1:
    print("睦月")
elif born_month == 2:
    print("如月")
elif born_month == 3:
    print("弥生")
elif born_month == 4:
    print("卯月")
elif born_month == 5:
    print("皐月")
elif born_month == 6:
    print("水無月")
elif born_month == 7:
    print("文月")
elif born_month == 8:
    print("葉月")
elif born_month == 9:
    print("長月")
elif born_month == 10:
    print("神無月")
elif born_month == 11:
    print("霜月")
elif born_month == 12:
    print("師走")
else:
    print("1 から 12までの数字を半角英数で入力してください")
```

```py:if文を使わない技
old_months = {
    1: "睦月", 2: "如月", 3: "弥生", 4: "卯月", 5: "皐月", 6: "水無月",
    7: "文月", 8: "葉月", 9: "長月", 10: "神無月", 11: "霜月", 12: "師走"
}

born_month = int(input("生まれた月を入力してください。旧暦の月名に変換します。（1-12）"))
print(old_months.get(born_month, "1 から 12までの数字を半角英数で入力してください"))
```

[目次に戻る](https://qiita.com/yuta-sanjyo/items/416b05f8498df1ed3f49)