OmniAICreator/Qiita-1.07M huggingface dataset:
Java の static method でも型変数を使いたい！

「メソッドスコープでの型宣言」というらしい。
「static method 型変数」とかググっても、上記の言葉でググっても普通の変数のスコープの話とか「static method とはなにか」とかしか出て来ず、twitterで直接教えてもらって初めて知ったので似たような悩みを抱えてる人はきっといると思う

## 発端

~ツイッターにて~

自分『Javaで `List` の中身一括変換するのに `foreach` とかするのダルくない？？ `map` とか無いの？？？みんなどうやってるの？？？』 ← `List` のメソッドだけ見て `map` 関数が無いからキレてる

心優しい人「Javaにも `map` あるで!」

```java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

// 中略

Integer[] iArray = { 1, 2, 3, 4, 5 };
List<Integer> iList = Arrays.asList(iArray);
List<String> sList = iList.stream().map(i -> i.toString()).collect(Collectors.toList());

// 後略
```

___長え！！！！校長先生の話ぐらいには長え！！！！___

## で、

『適当にユーティリティクラス作るか……』

```java
public class Util {
  public static List<S> map(List<T> l, Function<T, S> f) {
    return l.stream().map(f).collect(Collectors.toList());
  }
}
```

```
T cannot be resolved to a typeJava(16777218)
S cannot be resolved to a typeJava(16777218)
```

＼デデーン／

『qあwsえdrftgyふじこlp;@:「」』

心優しい人2「メソッドスコープに型宣言ができるんやで」

```java
public class Util {
  public static <S, T> List<S> map(List<T> l, Function<T, S> f) {
    //          ^^^^^^ これ！！！！
    return l.stream().map(f).collect(Collectors.toList());
  }
}
```

なるほどぉぉぉぉぉぉ……なるほどぉぉぉぉ………知らんかった……

……JavaにもJSのunderscoreみたいなライブラリないかな……ばなな……
Macにpytorch1.8.1をインストールする

[こちら](https://pytorch.org/)からpytorch1.8.1(LTS)のダウンロードコマンドを確認してインストールするだけ

```
pip3 install torch torchvision torchaudio -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html
```

```
$ python3 -c 'import torch; print(torch.__version__) '
1.9.0
```

# 参考
[PyTorchのインストール](https://qiita.com/mine820/items/c3046a44359bee9944e1)
[https://pytorch.org/](https://pytorch.org/)
vscodeでHTML DOMからurlを抽出する

例として、Qiitaトップページの記事一覧 (https://qiita.com/) のurlを抽出します。
手順通りに進めると、このようにurlのリストを作成できます。
imgタグにも応用が可能です。
![スクリーンショット 2021-07-08 22.27.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831027/200e5d86-233b-92ca-6656-e7f04ff5dcb5.png)

## 1. Chromeの検証ツールでDOMをコピー
検証ツールを開き、該当のhtmlをコピーします。
`Command+Shift+C` を押して、ページの該当の箇所にカーソルを合わせると簡単にDOMを特定できます。
親要素(添付赤枠)をコピーすれば、入れ子になっている子要素もまとめてコピーされます。
![スクリーンショット 2021-07-08 21.40.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831027/9a3f76f5-44a0-5070-27b0-c38d4f4e95e0.png)

## 2. vscodeに貼り付ける
![スクリーンショット 2021-07-08 21.55.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831027/f010f4e3-f46a-ed68-e124-2e44da779dfe.png)

## 3. 改行されていない場合: 改行させる
`<` を `\n<` に置換します。
※検索窓にある「.*」を押して正規表現で置換
![スクリーンショット 2021-07-08 22.02.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831027/d623c15b-8c79-3ff4-356b-b6a5fbaca295.png)

## 4. aタグのurlを抽出
aタグのhrefの中身を抽出
`(?<=href=").*?(?=")` で検索
![スクリーンショット 2021-07-08 22.21.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831027/c4bd0a92-9d06-d0fa-3765-142233a2683b.png)

imgタグのソースを抽出したい場合は、 `href` を `src` に変更すれば抽出できます。

2. `command+Shift+L` で検索結果を全選択

3. コピー

以上
Dockerイメージ取得の失敗例→Docker Hubでイメージ検索して解決

Dockerイメージをうまくダウンロードできないで小一時間悩んだが、Docker Hubを使ってれば問題なかった、という話。

## そもそもイメージ名が違っていた
WindowsのDockerイメージを探していた時に、以下の記事を読んで、nanoserverを入れてみようかと考えた。(結局使わなかったが…)
[Windowsプログラムを実行するWindowsコンテナ](https://www.atmarkit.co.jp/ait/articles/1702/02/news039.html)

記事の通りにpullコマンドを入れるとエラーが。

```
> docker pull microsoft/nanoserver
Using default tag: latest
Error response from daemon: manifest for microsoft/nanoserver:latest not found: manifest unknown: manifest unknown
```

[Docker Hub](https://hub.docker.com/)でイメージを検索する。
![スクリーンショット 2021-07-08 215631.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/626478e9-5ec2-9281-fdac-cef4b7dbeea6.jpeg)


検索結果
![スクリーンショット 2021-07-08 215839.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/8e66b7e0-651a-8db7-f638-a664007c39a7.jpeg)

正しいイメージ名を入れましょう。(記事が古かったか…)

## Tagをちゃんと指定する
Docker Hubに指定の通りのイメージ名でTagを指定せずにPullした場合

```
> docker pull mcr.microsoft.com/windows/nanoserver
Using default tag: latest
Error response from daemon: manifest for mcr.microsoft.com/windows/nanoserver:latest not found: manifest unknown: manifest tagged by "latest" is not found
```
デフォルトのlatestで検索され、存在しないという結果になる。  
latestで取得できないものはPullの際にTagを指定する必要があるので、Docker HubのイメージのページのTagリストを参照して指定する。

```
> docker pull mcr.microsoft.com/windows/nanoserver:(ここでTag指定)
```
![スクリーンショット 2021-07-08 220800.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/70ecd37f-52f4-554c-d7b6-384b3538fe16.jpeg)


### manifest的な問題
とりあえずリストの一番上に書かれていたTagを指定する。

```
> docker pull mcr.microsoft.com/windows/nanoserver:20H2
20H2: Pulling from windows/nanoserver
no matching manifest for windows/amd64 10.0.19041 in the manifest list entries
```
amd64 10.0.19041だからダメ的なことを言われた。ので、別のTagを指定してやると、無事ダウンロードが始まった。

```
docker pull mcr.microsoft.com/windows/nanoserver:10.0.19041.1052-amd64
10.0.19041.1052-amd64: Pulling from windows/nanoserver
```

## 参考
[Docker Imageを検索する場所と取得・一覧表示・削除する方法](https://techpr.info/environment/docker-image-get-list-delete/)
Mac環境でpython3.9.1にアップデートする

[こちら](https://www.python.org/downloads/release/python-391/)からインストーラを取得してインストールするだけです

```
$ python3 --version
Python 3.9.1
```

# 参考
[Python 3.9.1](https://www.python.org/downloads/release/python-391/)
[[Python] MacOS に Python 3.9.1 をインストールする](https://blog.hiros-dot.net/?p=10284)
【SwiftUI】タップで値を変更できるSlider

# 環境

【Xcode】11.7
【Swift】5.2.4
【iOS】13.7
【macOS】Catalina バージョン 10.15.7

# 実装方法

通常のスライダーはタップで値を変更できませんが、可能にする方法がありました。

```swift

struct TappableSlider: View {
    var value: Binding<Float>
    var range: ClosedRange<Float>
    var step: Float

    var body: some View {
        GeometryReader { geometry in
            Slider(value: self.value, in: self.range, step: self.step)
                .gesture(DragGesture(minimumDistance: 0).onEnded { value in
                    let percent = min(max(0, Float(value.location.x / geometry.size.width * 1)), 1)
                    let newValue = self.range.lowerBound + round(percent * (self.range.upperBound - self.range.lowerBound))
                    self.value.wrappedValue = newValue
                })
        }
    }
}
```

```swift
TappableSlider(value: $sliderValue, in: 1...7, step: 1.0)
```

参考記事

https://stackoverflow.com/questions/58687298/setting-the-value-of-a-swiftui-slider-by-tapping-on-it
【Swift】ボタンの選択・未選択で透明度を変える

ある項目の「選択・非選択」を判別できるボタンを実装したくて、
「押したら半透明になって、もう一回押したらもとに戻る」ボタンを作りました。

## 問題

最初に以下のコードでボタンを作りましたが、
標準のUIbuttonのEffectに重なって**透明度の変更が反映されない**様子。

```swift

var tappedButton: Bool = true
@IBOutlet weak var selectingButton: UIButton!

@IBAction func tappedButton(_ sender: Any) {
        tappedButton = tappedButtonEffect(toggle: tappedButton, button: selectingButton)
    }

func tappedButtonEffect(toggle: Bool, button: UIButton) -> Bool {
        if toggle {
            button.alpha = 0.4
            return false
        } else {
            button.alpha = 1
            return true
        }
    }
```

## 解決策

処理が重なってしまうならディレイをかけてズラせばいけるのでは？


```swift
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    //ここに処理
}
```
標準のbuttonのEffectにが**終わったあとに**透明度変更の処理を実行させるようにしました。


### 全体のコード

```swift

var tappedButton: Bool = true
@IBOutlet weak var selectingButton: UIButton!

@IBAction func tappedButton(_ sender: Any) {
        tappedButton = tappedButtonEffect(toggle: tappedButton, button: selectingButton)
    }

func tappedButtonEffect(toggle: Bool, button: UIButton) -> Bool {
        if toggle {
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.005) {
                button.alpha = 0.4
              }
            return false
        } else {
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.005) {
                button.alpha = 1
              }
            return true
        }
    }
```

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「選択・未選択で透明度を変える」ボタン作りました <a href="https://t.co/L2Nrf1eOj0">pic.twitter.com/L2Nrf1eOj0</a></p>&mdash; まえけん@iOSエンジニア転職内定獲得 (@maeken_Swift) <a href="https://twitter.com/maeken_Swift/status/1413125583567945730?ref_src=twsrc%5Etfw">July 8, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Pythonでリスト型のコマンドライン引数を受け取る

# リストのコマンドライン引数を受け取る
やり方は色々あるかもしれませんが，今回はArgumentParserを使います．
ArgumentParserの主な使い方については，「[ArgumentParserの使い方を簡単にまとめた](https://qiita.com/kzkadc/items/e4fc7bc9c003de1eb6d0)」をどうぞ．

### プログラム例

コマンドライン引数にfloat型のリストとint型のリストを与え，それを表示させるプログラムです．

```python:test.py
import argparse

parser = argparse.ArgumentParser(description='an example program')

parser.add_argument('--flist', required=True, nargs="*", type=float, help='a list of float variables') 
parser.add_argument('--ilist', required=True, nargs="*", type=int, help='a list of int variables')

args = parser.parse_args()

print(args.flist)
print(args.ilist)
```

### 実行例

``` 
$ python test.py --flist 1 2 3 --ilist 1 2 3
[1.0, 2.0, 3.0]
[1, 2, 3]
```

## 注意点やポイント

- コマンドライン引数にリストを与える時は，[1,2,3]の形ではなく1 2 3のように空白を空けて渡すようにしてください
- わざわざオプション引数（e.g. --flist）とした上で，required=Trueを付けています
Pythonを使って黄色い線の輪郭検出

# Pythonを使って黄色い線の輪郭検出
## 環境
・Ubuntu18.04
・Python2.7
・使用する画像

![yellow_line.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403932/8888d2df-57ad-0d27-f7d5-029ac7fc202f.jpeg)

## コード
```Python:
import cv2
from matplotlib import pyplot as plt


img = cv2.imread('yellow_line.jpeg', 1)

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, img_binary = cv2.threshold(img_gray,
                                140, 255,
                                cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(img_binary,
                                       cv2.RETR_EXTERNAL,
                                       cv2.CHAIN_APPROX_NONE)
contours = list(filter(lambda x: cv2.contourArea(x) > 100, contours))

img_contour = cv2.drawContours(img, contours, -1, (0, 255, 0), 5)


fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.imshow(cv2.cvtColor(img_contour, cv2.COLOR_BGR2RGB))
ax1.axis('off')
plt.show()
plt.close()
```

## 結果
綺麗に黄色の線のみ囲うことができた。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403932/ff2cfa47-3064-9206-a5d8-8fa05c5d0333.png)

## 参考サイト
> https://watlab-blog.com/2020/03/19/find-contours/
https://pystyle.info/opencv-find-contours/

## 一言
コードの解説等は気が向いたら行っていきます。
SMSをCRMや管理システムのメールから配信する方法

# 利用しているメールからSMS配信はできるのか
今使っているCRMシステムからSMSを配信できたら管理が楽になって使い勝手が非常に良いがSMS配信API連携が現実的だが、弊社が利用しているCRMツールにSMS配信APIで連携するとなると、配信画面をメールとは別に構築しなければならないので非常に何度が高い、、、、
かと言ってSMS配信サービスからSMSだけ配信するのも顧客情報をエクスポートしたり開封結果から顧客データを紐づけるのが非常にめんどくさい、、、
SMSのメリットである高開封率という点を最大化するためにCRMシステムから配信したい。。。

今SMS認証を利用しているCM.comさんに相談してみたらとてもいいサービスがあったので紹介する。
https://www.cm.com/ja-jp/sms/mail-sms/

## メール配信機能からそのままSMSが送れる！！
CM.comさんに相談したところメール配信機能からそのままSMSが送れるサービスがあるとか。
長年SMS認証を利用していてなぜ気付かなかったのか。

SMSは電話番号宛に配信するメッセージツールなので、メール配信機能から配信でができるというのはよくわからないサービスなので、詳しく聞いてみるとSMSの宛先である電話番号をCM.comさんが提供するドメインを使ってメールアドレスを作ってメール配信ツールから配信するとメールとしてCM.comさん側が受信をし、そこから電話番号の部分だけを抽出しSMSを配信するとのこと。

## 驚くほど簡単にメールからSMSを配信できる
詳しく解説すると
１,利用したい顧客はCM.comと契約する
2,CM.comの管理画面から配信したいメールアドレスを登録
3,登録したメールアドレスから電話番号@mail-sms.comとして送信
これだけでSMSをメールから配信ができてしまう

## どんなメール配信からもSMSが送れる
メール配信機能に制限はないのかという疑問に関しては制限がないとのこと。
outlookやGmailをはじめとして、マーケティングで使うメール配信ツールや顧客管理のための管理ツール、自社で開発をしているメール送信システムなどあらゆるシステムから利用できるとのこと。

## メール配信機能には設定要らず
当初気にしていたのはメール配信をするシステム側に設定が必要かどうかであるが、基本的にはメール配信側には設定が入らない。
基本と書いたのは、UTF-8に対応していないメール配信機能の場合にはUTF-8にする必要があるから。
ほとんどのメール配信機能は世界標準であるUTF-8をエンコードで使用しているがたまに対応のないサービスが存在する。その場合にはシステム側の設定でUTF-8にするか、CM.comさんの方でランディングページを活用した専用サービスがあるのでそちらを利用することになるそう。
それに関しては使ってみて詳述する

## 2022年11月追記　全ての文字コードに対応
以前UTF-8にのみ対応と記載していたが、久々に確認してみたところ全ての文字コードに対応だそう。
それによってセールスフォースなど多様なCRMツールやメール配信ソフト、管理ツールのメール配信機能からSMSを配信することが可能となった

## 追加料金はかからない
このサービスは基本的にSMS配信料のみで利用できるとのことで、CM.comさんは従量課金で月額利用料などはかからないので是非一度試してみて欲しい

使ってみたい人は
https://www.cm.com/ja-jp/sms/mail-sms/
ここから問い合わせをすると教えてくれるとのこと
Reactでのtypescriptを用いた関数コンポーネントの型定義

#はじめに
大学でC言語を使っていたのでtypescriptはjavascriptを厳密に出来るので非常に好きです。しかし多くの人が型推論に頼っており、引数や戻り値の型が分からずに困っていました。そこですべて型定義を行うことにしました。個人的な備忘録も兼ねているので更新するかもしれないのでよろしくお願いします。

#方針
・anyは基本的に使わない
・関数コンポーネント（アロー関数）しか使わない
・propsの型は基本的にinterfaceで定義
・定数、変数、引数、戻り値すべてに型を（可能な限り）つける

#変数
一応備忘録として載せておきます。配列はCの名残でこちらの記法の方が好きです。

```tsx:
let num: number;
let str: string;
let flag: boolean;
let array: string[]
let multiArray: string[][];
```

#関数コンポーネント

```tsx
export const App: VFC = (): React.SFCElement<any> => {
      return (<></>);
};

```
createReactAppのプロジェクトのAppコンポーネントはこうなる。返り値はrender関数にホバーして出てきた型を使ったが、さすがにこれは型推論で良さそう。あとC言語みたいに引数でvoid入れられないかなーと思ったけど調べた範囲では無理だった。void型の引数が存在することになるのかよく分からなかったので、何も書かないことが引数がないということを示すと思った方が良さそう。あとVFCをつける意味は関数コンポーネントであることと、childrenを最初からは持たないことを明示的に示したいからつけている。正直Appにはいらないけど多少冗長でも統一させたい派なのでつけておく。

```tsx
interface Props {
  str: string[];
  onClick: (index: number) => void;
}
export const component: VFC<Props> = (props):React.ReactElement => {
   return(<></>);
}
```
propsを持つ関数コンポーネントの場合、interfaceでpropsの型定義を行う。stateを更新する関数などは上のように定義できる。返り値はこれかJSX.Elementになるそう。この返り値も型推論で良さそう。

```tsx
 todos.map(
          (todo: string, index: number): React.ReactElement => {
            return (
              <div key={todo}>
                <li>{todo}</li>
              </div>
            );
          }
```
.mapなどもこのように書ける。引数については書いておきたいがやはり返り値はいらないように感じる。

#おわりに
関数コンポーネントの返り値の型は書かずに型推論に任せた方がいい。

#参考文献
[1]:https://qiita.com/Takepepe/items/0bbe4ab6ff4858a4e186
[2]:https://qiita.com/hida/items/fb0379353bbb71f8191b
[3]:https://qiita.com/Takepepe/items/f1ba99a7ca7e66290f24
[4]:https://qiita.com/tttocklll/items/c78aa33856ded870e843

[[1]]:雰囲気で使わない @types/react
[[2]]:TypeScript のオブジェクト型リテラルいろいろ
[[3]]:any型で諦めない React.EventCallback
[[4]]:【TypeScript】React.VFCとは何ぞや
Power Query で正規表現を使って置換したい

# 何のため？
Delimiterが無く、可変長の部分文字列の抽出がしたい時にやっぱり正規表現で、いつも通り使いたいなぁ・・と思ったわけです。

で、探してみたら [Power Query Regular Expression Hack](https://www.mathscinotes.com/2020/02/power-query-regular-expression-hack/) JavaScript使う方法があったので自分用に改造してみました。

# 変換の実装例

```powershell:ReplaceAsRegEx
(expression as text, optional original as text,  optional replacement as text) as text =>
let
   originalText = Text.Combine({original, ""}),
   expressionText = Text.Replace(expression, "\", "\\"),
   replaceText = Text.Combine({replacement, ""}),
   replaceResult =  Web.Page("<script>var originalText="&"'"&originalText&"'"&";var replacement="&"'"&replaceText&"'"&";var expression=new RegExp('"&expressionText&"','g');var result=originalText.replace(expression,replacement);document.write(result);</script>")
      [Data]{0}[Children]{0}[Children],

   result = if (List.Count(replaceResult) <= 1) then
   { 
      "" as text // 変換して何も残らない場合
   } else if (replaceResult{1}[Text]{0} = null) then
   {
      originalText   as text// 何も見つからない場合
   }  else {
      replaceResult{1}[Text]{0} as text
   }
in 
   result{0}
```

### 見た目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/ae565383-3286-e0c9-4410-6f1eb58e12af.png)

# 変換テスト例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/d755b7df-7f0d-ba45-42c0-eb0e9ed24dc2.png)

```powershell:上記のテストコード
let
    ソース = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("lZLRDoIgFIafJdZFqWyY3XTVeo3QGGHlhZsXXbT19B1Q1LYDHhnC5v9x+Pl3pGT6bupHfiiOzxfLWFl+Uti0+6osINuJifV41goa/gYpDwUYd03XbIYVReZEfOI2trAp72MQUHDOKRgoJwU/Vda1yD0r8kjFKSYYES4alGy6t7t0+R0OJZG3nXHwPj2v4xPPq4UDPZ8Qy/c01YxZkckA0/IzvJlI6AKrKIV3QvFXE+BQb7VEo2RSav4dX997xKgLv+IZVT8=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [OriginalText = _t, Expression = _t, Replacement = _t, Correct = _t]),
    呼び出されたカスタム関数 = Table.AddColumn(ソース, "RexExReplace", each ReplaceAsRegEx([Expression], [OriginalText], [Replacement])),
    追加されたカスタム = Table.AddColumn(呼び出されたカスタム関数, "Assertion", each [Correct]=[RexExReplace])
in
    追加されたカスタム
```

# あとがき
[Power Apps での IsMatch、Match、および MatchAll 関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-ismatch)
これ見つけて、正規表現あるじゃん！って思ったんですが・・Appsでした・・悲しい
どっかに実装されててもおかしくないと思うんですけどね・・

# description 
how to use regular expression in powerquery

# 参考情報
[Power Query M 式言語](https://docs.microsoft.com/ja-jp/powerquery-m/)
[Regular Expressions support in Power Query](https://ideas.powerbi.com/ideas/idea/?ideaid=1395c308-7f92-4321-8e35-6cd04d7108bf) python とかRでってのも出来るのかな？
~情報理論~

#情報理論
**【概念】**
　ある事象が起こる確率$P(x)$が起こりにくいとき、その稀な事象を表現するのに必要な情報量は多い。一方で、確実に起こる事象($P(x)=1$)の情報量は無いものと考えられる(表現する必要すらない)
**【表現式】**
 　情報量$I$は$I(P(x))=-\log{P(x)}$と表現され、これは確率が小さいほど情報量が多いという性質を直接表現している。一般的にこの単位はnatsとされるがこの底を2で取ると情報量の単位はbits, eで取るとshannonsとされる事が多い。
　　この情報量の乱雑さを表す指標としてエントロピー$H(x)$があり、特に底がeのときにシャノンエントロピーと呼ばれ、$H(x)=E[I(x)]=-\underset{x}\Sigma P(x)\log{P(x)}$と表現される。
**【種類】**
1. Kullback-Liebler divergence
★同じ確率変数$x$に対して異なる確率分布$P(x), Q(x)$があるとして、元々想定していた分布$Q(x)$と新たに判明した結果から導き出した分布$P(x)$の差を見るのがこのKLダイバージェンスである。このKLダイバージェンスを用いて2つの分布の間にどれほどの差があるのかを測ることが出来る。$$D_{KL}(P||Q)=E_{x～P}[I(Q(x))-I(P(x))]=E_{x～P}[\log{P(x)}-\log{Q(x)}]=-\Sigma P(x)\log{\frac{P(x)}{Q(x)}}$$

2.交差エントロピー
　KLダイバージェンスの一部を取り出したもので、$Q$についての事故情報量を$P$の分布で平均をとっている。主に分類問題の損失関数として用いられる。$$H(p,q)=-\Sigma P(x)\log{Q(x)}$$
3.JSダイバージェンス
　敵対的生成ネットワーク(GAN)の損失関数に用いられることで有名$$D_{JS}(P||Q)=\frac{1}{2}(\underset{x}\Sigma p(x)\log{\frac{P(x)}{R(x)}}+\underset{x}\Sigma q(x)\log{\frac{Q(x)}{R(x)}}), R(x)=\frac{P(x)+Q(x)}{2}$$

4.モンテカルロ積分
 　交差エントロピーの積分(離散値ならシグマ和だが連続値なら積分なのは自明とする)をモンテカルロ積分で求める。
(公式)$$E[f(x)]=\int f(x)p(x)dx \simeq \frac{1}{S}\sum_{s=1}^{S} f(x_{s})$$
より、以下が成り立ちます。$$-\int p(x)\log{q(x)}dx\simeq -\frac{1}{n}\sum_{i=1}^{n}\log{q(x)}$$


【参考資料】
「杉山将ら(2021), "徹底攻略ディープラーニングE資格(第二版)", 株式会社インプレス」、「Ian Goodfellow et al.(2020), "DEEP LEARNING", Ascii Dwango」、「ラビットチャレンジ(Study-AI)」
【Node.js】dependenciesとdevDependenciesの違い

#package.jsonとは
　依存関係を示したファイルで、このファイルにプロジェクトに必要なパッケージの名前とバージョンを記述すればnpmが必要なパッケージをインストールする。
　package.jsonはnode環境のアプリの設定が書かれたファイルみたいなもので、Bundlerのようなもので、開発に使う依存ライブラリと本番で使う依存ライブラリを書くことができる。
　詳しくは[こちらの記事](https://qiita.com/mzmz__02/items/dfa7abb4237a3842a2a8)に書いてある。

#dependenciesとdevDependenciesの違い

dependencies：本番環境でも利用するパッケージやその依存関係。
devDependencies：テスト環境と開発環境で利用するパッケージやその依存関係。本番用にビルドするときは含まれない。

　開発者が`npm install`を行うと、dependenciesでもdevDependenciesでもすべてnode_moduleにインストールされる。しかし、開発者以外の人が`npm install`するとdependenciesに書かれているパッケージのみインストールされ、devDependenciesに書かれているパッケージはインストールされない。

#参考文献
[【package.json】dependenciesとdevDependenciesの違いとnpmとyarnのコマンド解説](https://mo-gu-mo-gu.com/about-dependencies-devdependencies/)
2021/07/07開催 Connpassイベントランキング

# 申込数TOP5

|順位|イベント名|グループ|申込数|定員|
|:---:|:---|:---|:---:|:---:|
|:one:|[【オンライン・無料】ベイジの業務システムのデザインプロセスを徹底解説](https://connpass.com/event/214784/)||500|500|
|:two:|[【LT満員御礼！】リーダブルコード LT会 - vol.2  #readablelt](https://rakus.connpass.com/event/215225/)|[ラクス](https://rakus.connpass.com/)|356|370|
|:three:|[【デザイナー学生向けオンライン合説】ReDesigner Online Meetup vol.12](https://redesignerforstudent.connpass.com/event/217449/)|[ReDesigner for Student](https://redesignerforstudent.connpass.com/)|253|270|
|:four:|[UIT Meetup vol. 13 『知っておきたいFront-end Toolingの今』](https://uit.connpass.com/event/216043/)|[UIT](https://uit.connpass.com/)|204||
|:five:|[COO vs CTOとその仲間たち 〜開発チームがビジネスチームの質問に答えまくる祭〜](https://smarthr.connpass.com/event/216408/)|[株式会社SmartHR](https://smarthr.connpass.com/)|198|200|
AtCoderログ：0010 - ABC 081 A

# 問題

https://atcoder.jp/contests/abc081/tasks/abc081_a

## 問題文
> すぬけ君は $1, 2, 3$ の番号がついた $3$ つのマスからなるマス目を持っています。 各マスには $0$ か $1$ が書かれており、マス $i$ には $s_i$ が書かれています。
> すぬけ君は $1$ が書かれたマスにビー玉を置きます。 ビー玉が置かれるマスがいくつあるか求めてください。

## 制約
> ・$s_1, s_2, s_3$ は 1 あるいは 0

## 収録されている問題セット
- [AtCoder に登録したら次にやること](https://qiita.com/drken/items/fd4e5e3630d0f5859067) ([第02問](https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-2-%E5%95%8F--abc-081-a---placing-marbles-100-%E7%82%B9))

- [AtCoder Beginners Selection](https://atcoder.jp/contests/abs)

# 回答
## 回答1 (AC)
$s_i$ の値を変数 s に取り込み、i 文字目 s.at(i) に $1$ が書かれているかどうかをチェックし、見つけた個数 answer え出力します。以下のコードでACとなりました。

```C++:abc081a-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string s;
  cin >> s;
 
  int answer = 0;
  for ( int i=0; i<3; i++ ) {
    if ( s.at(i)=='1' ) {
      answer += 1;
    }
  }
  cout << answer << endl;
}
```

## 回答2 (AC)
文字列の長さが $3$ であることに着目し、文字列そのものを判断して答えを出力するようにしてみました。

```C++:abc081a-2.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string s;
  cin >> s;
 
  if ( s=="111" ) {
    cout << 3 << endl;
  } else if ( s=="011" || s=="101" || s=="110" ) {
    cout << 2 << endl;
  } else if ( s=="100" || s=="010" || s=="001" ) {
    cout << 1 << endl;
  } else {
    cout << 0 << endl;
  }
}
```

# 調べたこと
## [AtCoder に登録したら次にやることの解説] (https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-2-%E5%95%8F--abc-081-a---placing-marbles-100-%E7%82%B9)
A 問題は for 文を使わなくても解けるようになっていることを示すために、for 文を使わずに、インライン展開した方法が紹介されていました。

## [AtCoder の解説](https://atcoder.jp/contests/abc081/tasks/abc081_a/editorial) → [コンテスト全体の解説](https://img.atcoder.jp/arc086/editorial.pdf)
こちらも for 文を使わない方法が紹介されていました。

# 学んだこと
- C++ の標準入力 (文字型)

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0009 - ABC 208 C](https://qiita.com/RoadLynton/items/7e7a580ae843e60f8b2f)
- 次の記事 → [AtCoderログ：0011 - ABC 095 A](https://qiita.com/RoadLynton/items/d2821a27e55fad832b79)
powerapps

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183229/63d32850-ee90-1e65-7b66-fa0756b4d738.png)
レベル,所要時間,タイトル
10010時間,テスト

入力フォームを作成
https://tech.la-fra.com/2018/08/16/post-283/
wordpress管理画面のcssが適用されてない

朝起きると、wordpressの管理画面がこんなになりました

![wordpress_manage_screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/881650/5557296b-320e-8ce1-8060-3d6974339e1a.png)


#筆者の開発環境
wordpressのバージョン: 5.7.2
MYSQL:5.7
プラグイン：
・Advanced Custom Fields
・Breadcrumb NavXT
・Contact Form 7
・Custom Post Type UI
・Smash Balloon Instagram Feed
・WP-PageNavi

docker-composeを使用して、ローカルにて開発環境を構築


#結果

cssがなんかあったんだろうと思い調査。

結論から申しますと、キャッシュの削除で解決。
※右上の「:」マーク→「その他ツール」→「閲覧履歴を削除」から「cookieと他サイトデータ」と「キャッシュされた画像データ」を削除

ただ解決できない方のために、試した経緯を共有。

2021/7/18更新
<font color="Red">原因</font>
下記プラグインが直接的な原因
無効にした所、解消を確認
・Smash Balloon Instagram Feed



#経緯その1

・「.htaccess」

調査していた所、「.htaccess」に「PHP_value default_charset none」「PHP_value output_handler none」を設定すれば解決できますよと、記載あり。

正直[wordpress公式](https://ja.wordpress.org/support/article/htaccess/)、[apache公式](http://httpd.apache.org/docs/trunk/ja/howto/htaccess.html)を見てもよくわからんかったのですが、要はapaheの設定ファイルかと

「PHP_value default_charset」はデフォルトの文字列を無しに設定。
「PHP_value output_handler」は[公式](https://www.php.net/manual/ja/outcontrol.configuration.php)見てもわからん！

<h4>コマンドにて、修正</h4>
```
# viコマンドにて、ファイル修正（注意：隠しファイルなので、lsコマンドでは表示されません）
$ vi /var/www/html/.htaccess
```
※wp-config.phpやwp-adminフォルダと同階層にあり

```
# dockerでやっている方向けに、viエディタない場合はこちらのコマンドからインストール
apt-get update
apt-get install vim
```

~~フォルダ構成の関係上だと思いますが、apache公式は修正推奨してないのに、wordpress公式はガンガン修正するんですねこのファイル~~

#経緯その2

・wp-config.php

さらに調査していた所、
調査していた所、「wp-config.php」に「define(‘CONCATENATE_SCRIPTS’, false);」を設定すれば解決できますよと、記載あり

「CONCATENATE_SCRIPTS」は[wordpress公式](https://ja.wordpress.org/support/article/editing-wp-config-php/)の記載では、管理画面でJavaScriptが機能しない場合、無効にする設定

別件で「define('SCRIPT_DEBUG', true);」にした場合、「開発」バージョンを強制的に読み込む
※デベロッパーツールで確認しましたが、「styles.min.css」ではなく、開発用の「styles.css」を読み込む

cssを読み込まれてなければ、「define('SCRIPT_DEBUG', true);」試してみても良いかと


以上です！

参考URL：
[PHP バージョン変更後、レイアウトが崩れたり文字化けが発生する。](https://www.nahema.net/2016/07/15/how-to-wordpress-layout-repair/)
[WordPress管理画面でCSSがおかしくなった時の対処法について]
(https://line-brand-up.com/wordpress-css-erorr/)
[apache公式](http://httpd.apache.org/docs/trunk/ja/howto/htaccess.html)
[wordpress公式(.htaccess)](https://ja.wordpress.org/support/article/htaccess/)
[wordpress公式（wp-config.php）](https://ja.wordpress.org/support/article/editing-wp-config-php/)
複数のストアドを順次実行し、任意のストアドをデバッグ実行させて結果を返すストアドを動的SQLで組んでみた

# 1. 概要

最近業務でデータ移行ツールを作成することがあった。
私が担当する業務の中の、移行対象のテーブル数は約20くらい。
データ数もはっきりとは数えないけど10万件は軽く越すので、手作業での以降はまず不可能()
対象業務が同じで、別システムからの乗り換えとなり、異なるシステムのテーブルからの移行が発生するので、それをSQLで行う必要があるということになる。

最初は何も考えず以下のようにしていた。

1. 対象のテーブル毎でストアドを組む
2. 別システムであれば業務に対するテーブルの仕様が異なることがあるので、整合性を取るための処理をする(別テーブルの移行後データを参照して別テーブルの値を整形するなど)
3. `1,2`までで作成しているストアドを順次実行するストアドを作成する

この時、3で作成しているストアドを流しても途中でエラーが返ることがあった。
このときはその都度3で作成していたストアドからエラーになるストアドまでを切り取って実行し、エラーの原因を特定するなどしていた。

#### 。。。すごい手間

ということで、今回は上記の1,2までのストアドを順次実行するためのストアドを作り替えることにしました。

# 2. 前提

-  1,2までに作成しているストアドは、第一引数としてデバッグ実行を制御する真偽値を有していること。

これでそのストアドをデバッグ実行する場合は最終的にストアドを実行した際の移行後データを返す作りにする。

-  第１引数以降にそれぞれのストアドで扱うパラメータを有していること

第１引数以降は任意のものとする。(なくてもOK)

## これ以降の内容の前提知識

テーブル作成やストアドの中のリソースを`SELECT`〜で指定するまでは割とSQL標準なのですが、それ以降のカーソルを使用した反復処理が`SQLServer`の独自拡張である`T-SQL`を使用しているのでもしかしたら理解しづらいかもです。
ですがそんなに難しい話じゃないので、読んでみてください。

# 3. 仕様

まず、動的SQLで実行するために考えたことは実行するストアドを補完するテーブルを作ることです。
このテーブルをリソースにして、カーソルで処理させることで順次実行制御を行います。

## 3.1. テーブル仕様

- テーブルには、実行順連番とストアド名、オプションパラメータを文字列で格納するようにしました。

```sql
create table sample_stored_execsequence (
  exec_id      int           IS NOT NULL,
  stored_name  nvarchar(max) IS NOT NULL,
  some_params  nvarchar(max) IS NOT NULL
);
```

`exec_id`で実行順序を指定し
`stored_name`に動的SQLで読み込むストアド名
`some_params`にストアドで使用する第一引数以降のパラメータを文字列で持たせる
ようにしました。
また、`some_params`に格納するパラメータは後述するストアドの使用上カンマから始めて、パラメータの間にパラメータを挟んで格納することが必要です
時間があれば外部キーを挟んでsome_paramsを一つずつ指定できる構成でもよかったんですが、めんどくさかったので今回はこれで。

## 3.2. ストアドの実装

後は上記のテーブルにストアドやパラメータ等を挿入すれば、それをリソースにストアドを組むだけです。
下記にサンプルを載せておきます。

```sql
create procedure sample_sequential_exec

--実行時のパラメータ
@debug_flg int = 0, --本来はbit型にするのが正なのですがbitを文字列変換の方法がなぜかわからなかったのでintにしました
@debug_id int = 0,

--カーソルで使用するパラメータ
@exec_id int = 0,
@stored_name nvarchar(max) = N'',
@some_params nvarchar(max) = N''

as 
begin transaction

--データソースを取得
declare sample_cursor cursor for
select 
  exec_id
, stored_name
, some_params
from
sample_stored_execsequence
order by exec_id --保険

--カーソルで１行ずつ処理
open sample_cursor;

fetch next from sample_cursor
into
  @exec_id
, @stored_name
, @some_params

while @@fetch_status = 0
begin
  
  if @exec_id = @debug_id
    begin
      exec(@stored_name + str(@debug_flg) + @some_params)
      goto endloop
    end
  else
    exec(@stored_name + '0' + @some_params)

fetch next from sample_cursor
into
  @exec_id
, @stored_name
, @some_params

end
endloop:
close sample_cursor
deallocate sample_cursor

commit transaction
end
```

# 4. どうなったか

- `@debug_flg`と`@debug_id`で任意の位置で処理を止めて、実行結果を確認できる

元来の実装では、手続き型のような感じでただストアドを並べていただけだったので、それを任意の位置で実行するとすると、いちいち切り取って実行したりして面倒だったけど、その手間がなくなった。

- 作成したテーブルの中でレコードの`exec_id`を入れ替えれば実行順をすぐに変更できる

ストアドの実行順を変更するのに順次実行するストアドの中身をイジる必要がなくなった。

# 5. まとめ

今回は`SQLServer`での実装であり、その中でカーソルなどは　`T-SQL`という`SQLServer`の独自拡張のため、そのまま転用はできないと思うが、少しは効率化できたのではないかと思う。
Ansible Tips: taskがスキップされてもレジスター変数設定はスキップされない

備忘

# taskがスキップされても、レジスター変数設定はスキップされない

## 例

```yaml:tasks
- shell: id
  register: r

- when: false            # <= このtaskはskipされる
  shell: date
  register: r            # <= しかし、register変数設定はskipされない。

- debug:
    var: r.sdtout_lines  # <= VARIABLE IS NOT DEFINED!となる
```

これは、スキップ時、レジスター変数に以下のような内容が設定される為。

```json
{
  "changed": false,
  "skip_reason": "Conditional result was False",
  "skipped": true
}
```

レジスター変数名を使い回す場合には注意。
Swift Optional型をざっくり理解する

オプショナル型とは
--
値がない状態(nil)を許容する型。nilも入れてくれる箱なんだと理解しておけばOK


なんのためのオプショナル型
--

そもそも前提としてSwiftは値がないnilを許容しない。だからこそnilを許容するためにOptional型が必要になった

宣言
--
```swift:オプショナル.swift
var optional: String?
//もしくは
var optional: Optional<String>
```
「？」を最後につけて変数の宣言と同時に```nil```を代入される

ただ、Optional型の値はnilが含まれている可能性があるためアンラップする必要がある。
方法として
①オプショナルバインディング
②？？演算子
③！演算子で強制アンラップ



①オプショナルバインディング
　```if let ```のやり方で記述し、Optional型の値が存在する時はtrue,nilの場合はfalseを返す。

```swift:オプショナルバインディング.swift
var x: Int?
if let y = x {
 print(y)
 } else {
print("ニルだよ")
}
```
```if let```ではなく```gurad let ```構文も使われる。

```swift:gurad.swift
guard 条件式 else {
	処理
	returnまたはbreakまたはthrow
}

//具体例
func test(num: Int?) {
    // nilだとreturnする 
    guard let unwrappedNum = num else { return }

    print(unwrappedNum)
}

test(num: 5)  
```

guard→条件を満たさない場合の処理を記述する構文
returnや　ｂreak,throw,continueでスコープを抜ける処理を書かなくてはならない。
良いところは条件分岐とアンラップを同時に行えること。
中身がnilだった場合はfalseを返してくれる。そのときはreturnをしてスコープを抜ける。




②？？演算子
値が存在しない場合（つまりnil)の際にデフォルトの値を代入することができる（？？　の右辺を代入する）


```swift:??.swift
var x:Int?
var y = x ?? 3
print(y) //３
```

③!演算子で強制アンラップ

```swift:!.swift
var x: Int? = 1
var y = x! + 2
print(y) //3

```
強制アンラップはプログラムの実行の際に発生するので意図しないバグが多い。値が明らかに入っている場合はいいが、nilの場合もアンラップしてしまうので
あまり好ましくない。


オプショナルチェイニング
--

補足としてオプショナルチェイニングを使用してアンラップする方法もある
アンラップせずにメソッドやプロパティにアクセスできる応用的方法。

そもそおオプショナルバインディングが何個もあると可読性が悪くなってしまう。
そこできれいに書けるのがOptionalChainingである。
結果はOptional型として帰ってくるので、（Optional（〇〇）みたいな）
OptionalBindingを併用してアクセスする


```swift:オプショナルチェイニング.swift
var chain: String?  = "chain"
var chain2: String? = "chain2"
print(chain.uppercased())//CHAIN
print(chain.uppercased())//CHAIN2"
```
チェーンのようにつないで一括してオプショナル型を使用できるのコードを整理することができる。またnilが値として入ってきても
nilを返してくれるのでエラーにはならない




暗黙的オプショナル型
---
通常であればオプショナル型であれば宣言時に？をつけてアンラップする際は！をつけて強制アンラップするのが通常の流れだが、
アプリが大きくなると絶対、値が入っているのにわざわざ！を付ける作業をしてアンラップしないといけない事例がでてくる。
→今こそ暗黙的アンラップを使用する時だ！！

```swift:暗黙.swift
var x: Int! = 10
var y = x + 10　//20
```
！をつけなくてもアンラップできるすぐれものだが、強制アンラップと同様、nilが入ってきたらエラーになってしまう。

map（）、flatMapを使ったアンラップもあるので次回記述予定。
【Firebase Functions】トランザクション処理を実装したのでまとめました

## 概要

業務で使用していた`firebase functions`をトランザクション処理に修正するようになったのでざっくりと内容をまとめた
[公式ドキュメント](https://firebase.google.com/docs/firestore/manage-data/transactions?hl=ja)

## トランザクション処理(transaction)とは

以下のような特徴があります。

- 複数の処理を一括で行う
- 常に最新のデータに対して処理を行う
- 全ての処理が成功することが保証されてから処理を行う
    - どれか一つの処理が失敗した場合、他の全ての処理も実行されない

---

### 複数の処理を一括で行う

以下のようなトランザクション処理では`ref1`と`ref2`の更新が同時に実行され、それぞれの`time`は必ずイコールになる

```javascript
db.runTransaction((transaction) => {
    const ref1 = db.collection('sample').doc('1')
    const ref2 = db.collection('sample').doc('2')
    transaction.update(ref1, {
        time: firebase.firestore.FieldValue.serverTimestamp()
    })
    transaction.update(ref2, {
        time: firebase.firestore.FieldValue.serverTimestamp()
    })
    return
})
```

---

### 常に最新のデータに対して処理を行う

トランザクション処理を実行中に他の処理でデータが更新された場合、再度トランザクション処理を実行する

例えば、以下のような流れのトランザクション処理があった時

1. `ref1`のデータを読み取る
2. `ref2`のデータに読み取った`ref1`のデータをコピーする

```javascript
db.runTransaction(async (transaction) => {
    const ref1 = db.collection('sample').doc('1')
    const ref2 = db.collection('sample').doc('2')
    const doc = await transaction.get(ref1)
    
    // このタイミングで読み取ったデータが外部の処理で更新される
    
    transaction.update(ref2, doc.data())
    return Promise.resolve()
})
```

1と2の処理の間に`ref1`のデータが更新された場合、再度`ref1`を読み取る
つまり上記のトランザクション処理は以下のような流れになる

1. `ref1`のデータを読み取る
2. 外部の処理で`ref1`が更新される
3. 再度`ref1`のデータを読み取る ← 更新後の最新のデータを取得している
4. `ref2`のデータに読み取った`ref1`のデータをコピーする

---

### 全ての処理が成功することが保証されてから処理を行う

firestoreのルールで`ref2`に対しての書き込み処理が禁止されているなど、何かしらの要因で`ref2`の更新が失敗した場合、`ref1`の更新も実行されない

```javascript
db.runTransaction((transaction) => {
    const ref1 = db.collection('sample').doc('1')
    const ref2 = db.collection('sample').doc('2')
    transaction.update(ref1, {
        time: firebase.firestore.FieldValue.serverTimestamp()
    })
    // この処理が失敗するとき、`ref1`の更新も実行されない
    transaction.update(ref2, {
        time: firebase.firestore.FieldValue.serverTimestamp()
    })
    return
})
```

---

## まとめ

いくつかメリットはありますが、特に「**常に最新のデータに対して処理を行う**」の恩恵が大きいと感じました。
`funcitons`はトリガーごとにそれぞれ非同期で実行されるので、通常のドキュメント操作の処理ではデータの整合性を取るのが難しいですがトランザクション処理を実装することで解決できました。
PowerBIでGoogle Analyticsのデータを可視化

## 対象

* PowerBIでグラフや表は作ったことがある
* Google Analyticsはよくわからない（メトリクス？ディメンション？？）
* Google AnalyticsのデータをPowerBIで可視化したい

## まずはGoogle Analytics を少しだけ理解する

* [wikipedia](https://ja.wikipedia.org/wiki/Google_Analytics)より

> Google Analytics（グーグルアナリティクス）は、Googleが無料で提供するWebページのアクセス解析サービス

* たとえば、「PV数[^1]を日ごとに見る」「ユーザ数を流入経路[^2]ごとに見る」といった分析ができます

* **「●●を▲▲ごとに見る」**と表現しましたが、**●●がメトリクス(指標)、▲▲がディメンション**です

* メトリクス、ディメンションは他にどういったものがあるのかは以下が参考になりました

https://gaiq.jp/ga/8568

https://wacul-ai.com/blog/access-analysis/google-analytics-method/ga-index/


## 本題 PowerBIで可視化してみる

### 前提

* Google Analytics にアクセスできるGoogleアカウントを持っていること
* PowerBI Desktopをインストールしていること
* PowerBIライセンスは無料版でもOK

### 接続

接続手順は公式ページを参考にしてください
OAuthでGoogleにサインインします

https://docs.microsoft.com/ja-jp/power-query/connectors/googleanalytics

接続するとナビゲーター画面が表示されます
ここで取り込むデータを選びます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104230/d6d84d60-842d-70af-16c4-3022f2ef5f98.png)

### 取り込むデータを選ぶ

`Page Tracking`を展開してみましょう。ずらっと並んでいるのがメトリクスとディメンションです
すべて英語表記ですが、上で紹介したページをヒントに眺めると、だいたい意味は掴めると思います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104230/8ee8488c-4f75-f2c0-9af9-3998d13cf4c7.png)

`Landing Page`というディメンションを選ぶと、エラーが出ました

> Expression.Error: Google Analytics では、少なくとも 1 つのメジャーを指定する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104230/b02bc252-ae1f-c95b-3ade-83fc79cf7a07.png)

`Pageviews`というメトリクスを選ぶと、エラーが消えてプレビューが表示されます
**ディメンションだけ選んでも、どの値(=メトリクス)を表示するかわからない**というエラーでした
**「●●を▲▲ごとに見る」**でいうと「●●を」の部分を指示しないとダメ。言われてみれば当たり前ですね

### 可視化

後はデータを選んでビジュアルを作成していくだけです
ビジュアルを作成するところはGoogle Analytics だからといって変わらないので割愛します

### 小ネタ

ナビゲーター画面で「表示オプション」をクリックして**「技術名」**というのを表示してみましょう
メトリクスやディメンション名の横に`ga:xxxxxx`みたいな文字がうっすら表示されましたね
[Google Analytics のAPI](https://developers.google.com/analytics?hl=ja)を使う際に、メトリクスやディメンションを表す文字のようです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104230/a7599241-c996-de4f-ef38-e06a04fa181d.png)


[^1]: Page View数、閲覧されたWebページの数
[^2]: google検索で探したのか、URLを直接入力したのか、SNSから来たのか等、どういう経路でWebページを訪問したか
業務で出た分からない単語集

##　はじめに
　こんにちは！今回は実際に働いているときに先輩方から色々な単語が出てきます。その意味を調べてまとめようと思います。

　よろしくお願いします(｡･ω･)ﾉﾞ
##　エビデンス
　簡単にいうと**「証拠」「根拠」**といった意味でつかわれる言葉。例えばシステム開発の過程でシステムが正しく動作している、または不具合が生じた際の証拠として画面キャプチャを保存しておき、証拠資料として活用します。このことを「エビデンス」という。
　
##　ディスクライブ
　英単語の意味では**描写する・言葉で述べる・説明する**という意味。物の形や図など言葉で説明しにくい特徴をあえて言葉で説明する場合に使用する。
　
##　PoC
　PoC（Proof of Concept：概念実証）とは、**新たなアイデアやコンセプトの実現可能性やそれによって得られる効果などについて検証すること**です。これによって事前に検討したアイデア／コンセプトの実現可能性を見極め、期待した効果が得られると判断できれば実プロジェクトを進めていくという形が一般的です。

たとえば新規性の高いビジネスを立ち上げる、あるいは革新的な技術を利用するといったとき、本当にそれが実現できるのか、それによって効果が得られるのかを机上の議論のみで判断するのは困難です。そこで実際に小規模で試作や実装を行い、できあがったものを用いて検証を行うことにより、実現可能性の判断の精度を高めることが可能になります。
　
　PoC環境とよく読んでました。

##　トランスファー
　**情報やデータ、信号などを伝える、送り続けるという意味**
　日常語としてトランスポートは「運輸」「輸送」、トランスファーは「移動」「転勤」「乗り換え」トランスミッションは「（熱などの）伝導」「放送」「変速機」などの意味でつかわれる

##　プラットフォーム
　**機器やソフトウェアを動作せるのに必要な基盤となる装置やソフトウェアやサービス、動作環境**のこと
　アプリケーションを実行する、データを保存するといったことが可能なものは全てプラットフォームと呼ぶ
　
　その語源は、「壇上」や「（高い）足場」といった意味を持つ英語です。コンピュータにおいては、ソフトウェアが動作するための土台（基盤）として機能する、例えばアプリケーションやソフトウェアにとってのオペレーティングシステム（OS）、またOSにとっての、CPUをはじめとするハードウェア、といったもののことを指します。

##　コンシューマ
　コンシューマとは**消費者・最終使用者の意味を持ち、サービスや商品を利用する人のこと**を指す
　
##　サイジング
　大きさを調整する意味を持つ英単語でIT分野では**システムやその構成要素について必要とされる規模や性能を見積もったり、状況に応じて適切な規模に拡張あるいは縮小する**ことを指します。
　
　システムの設計や調達に際し、利用規模に対して性能や容量が過小だと負荷に耐えられず障害を引き起こすが、過大だとコストの無駄が大きくなる。ピーク時に必要となる性能などについて適正な見積もりを行いサイジングに反映させることが重要となる。

##　インシデント
　インシデントとは翻訳すると「出来事」「事変」などを意味する語で**セキュリティの分野ではコンピューターやネットワークのセキュリティを脅かす事象の意味**で用いられる。
　詳しくは[これおすすめ](https://www.resm.jp/faq/answer09/)

##　エスカレーション
　エスカレーションとは**発生した問題に対処できないから上司に報告し対応を要請すること**の意味で用いられる。

　システム運用や利用者サポートなどの業務で、システムの障害や利用者からの質問・クレームなどに担当者・チームが対処できない場合に、上位の組織や担当者、管理者などに連絡し、対応を引き継ぐことをエスカレーションという。この用法はIT分野以外でも一般のビジネス用語として用いられる。
##　キュレーション
　**インターネット上の情報を特定の視点で収集、選別、編集することで新しい価値を持たせ、それを公開することを指す。**

　博物館や図書館などで所蔵物などの展示を企画・運営する役職がその語源であるといわれている。
　インターネット上には大量の情報があり、その中から自分の求める情報を見つけるには相当な労力を要する。そこで、自分の代わりに必要な情報を選別してくれる「キュレーションメディア」が重宝されるようになった
##　おわりに
　業務で設計書を見る機会があり分からない単語だらけだったのでまとめました。
　
　(｡･ω･)ﾉﾞバイバイ
next.jsでantd利用時にModule not foundとなるエラーの対処

### 前提

next.js  `v11.0.0`
node.js  `v14.16.1`
antd     `v4.16.6`

### 現象と解決方法

わりとまっさらなnext.jsアプリケーションに、[antdのgithub readme](https://github.com/ant-design/ant-design)通りにinstall、importすると、importした箇所で`Module not found: Can't resolve 'antd'`のエラー。

[こちら](https://github.com/ant-design/ant-design/issues/12169)を参考に、`styles/globals.css` や `pages/_app.js` に CSSファイルのimportを書いてもエラー。

```javascript
@import '../node_modules/antd/dist/antd.css';
@import '~antd/dist/antd.css';

// 次のようなエラーが出る。
// Error: Can't resolve '~antd/dist/antd.css' in '/app/styles'
```

`.babelrc` とか`next.config.js`とかごにょごにょしていると、どうもwebpackerの挙動が怪しい。。

途中見かけたエラーの例。

```
#10 126.6 ./node_modules/antd/dist/antd.css
#10 126.6 Module parse failed: Unexpected token (13:6)
#10 126.6 You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
```

```
#9 178.6 ./node_modules/antd/lib/layout/style/index.less
#9 178.6 Module parse failed: Unexpected character '@' (1:0)
#9 178.6 You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
#9 178.6 > @import '../../style/themes/index';
#9 178.6 | @import '../../style/mixins/index';
```

### 解決方法
結論から言うと、webpack5がcompileしてくれてなかった。
next.js v11 からデフォルトでwebpackが4から5になるよう。
`next.config.js` に以下を追加し、webpack4を使うと、正常に動作した。

```js
// next.config.j
 module.exports = {
   reactStrictMode: true,
+  webpack5: false,
 }
```
cssファイルの読み込みも必要。

```js
// pages/_app.js
import 'antd/dist/antd.css'
```

以下の通りやれば良い。
[How to use Ant Design in a Next\.js project \- Kindacode](https://www.kindacode.com/article/how-to-use-ant-design-in-a-next-js-project/)

### webpack5対応プラグイン？

そして後からこんなものを見つけてしまったので、落ち着いたら試してみるかな。
webpack5 でうまくいくならこちらが良いかな。
githubのreadmeに載せといてくれ。。
https://www.npmjs.com/package/next-plugin-antd-less

### webpack5とかnext.js11とかのメモ
- [babel\-plugin\-import \- npm](https://www.npmjs.com/package/babel-plugin-import)  
このプラグインはトラップだった。。
- [webpack5 \| Next\.js](https://nextjs.org/docs/messages/webpack5)  
 @zeit/next-css / @zeit/next-sass のpackageが非推奨になったよう。
- [Next\.js 10\.0\.6以降のwebpack5設定方法](https://zenn.dev/kodai/articles/67ae0b8cf018ed)
- [Upgrade Guide \| Next\.js](https://nextjs.org/docs/upgrading)
- [Next\.js の Ver\.11 で発表された新機能を１分で読めるまとめ \| fwywd（フュード）](https://fwywd.com/tech/nextjsconf-next11)
Firebase Authenticationでエラーnull:'dart.global.firebase.auth、firestore追加で画面が読み込まれない、webアプリのデプロイ

登録ボタンで
null:'dart.global.firebase.auth
が出る場合

index.htmlに加える
```
<script src="https://www.gstatic.com/firebasejs/7.8.0/firebase-auth.js"></script>
```

firestoreで画面が読み込まれない

index.htmlに加える
```
<script src="https://www.gstatic.com/firebasejs/5.5.4/firebase.js"></script>
```
webアプリのデプロイ
https://qiita.com/fukusin/items/c5f5592b50101dfaea25
[Vuetify]エラー発生時にモーダルダイアログを出す

# 概要
app.vueにおいてerrorCapturedによりv-dialogを表示させる。
[![Image from Gyazo](https://i.gyazo.com/adaef5a0a222e5a8a0a9bb7eac5845f2.png)](https://gyazo.com/adaef5a0a222e5a8a0a9bb7eac5845f2)

```vue:app.vue
<template>
  <v-app id="app">
    <v-main>
      <router-view />
    </v-main>
    <v-dialog
      v-model="dialog"
      persistent
      width="360"
    >
      <v-card
        align="center"
      >
        <v-card-title>
          最初からやり直してください
        </v-card-title>
        <v-card-text>
          不正な操作により入力データが破損しています。
        </v-card-text>
        <v-btn
          @click="recover"
          outlined
          color="red lighten-2"
          class="mb-3"
        >OK</v-btn>
      </v-card>
    </v-dialog>
  </v-app>
</template>

<script>
export default {
  data() {
    return {
      dialog: false,
    }
  },
  errorCaptured() {
    this.dialog = true
  },
  methods: {
    recover() {
      this.dialog = false
      // その他の処理
    }
  }
}
</script>
```
# 挙動
1. Vueのすべてのページにおいて、発生したエラーは子孫コンポーネントから親コンポーネントへ伝播する（[公式](https://jp.vuejs.org/v2/api/index.html#errorCaptured)）。つまり最終的にすべてapp.vueまで伝播してくる。
1. app.vueのerrorCaptured内の処理が行われる。（コンポーネントによって処理を分けたい場合は[こちら](#追記-コンポーネントによってerrorcapturedの処理を分岐させる)を参照）
2. dialogがfalse→trueに変わり、ダイアログが表示される。v-dialogでdialogをバインドしているため。
2. ダイアログ内のボタンをクリックするとrecoverメソッドが発火する
2. ダイアログが閉じられその他諸々の処理が行われる


# 他のエラーハンドリング方法との比較
Vueコンポーネントに仕込んでvuetifyを動かすならerrorCapturedが最も手軽。

Vue.config.errorHandlerやwindow.onerrorでは、v-dialogにバインドしたdataプロパティの値を変更したり、それに関連するメソッドを発火させることが難しい。

# 【追記】 コンポーネントによってerrorCapturedの処理を分岐させる
errorCapturedの第二引数vmからエラーが発生したコンポーネントの情報を取得できる。
```vm.$root.$el.baseURI```でエラーが発生したページのURLが取得できる

```vue:app.vue
<script>
...
  errorCaptured(e, vm, info) {
    if (vm.$root.$el.baseURI.match(/result/)) {
      // '/result'でエラーが発生した場合の処理
    } else {
      // その他のページでエラーが発生した場合の処理
    }
  },
...
</script>
```

# 参考文献
https://jp.vuejs.org/v2/api/index.html#errorCaptured
代入式の左辺には、省略可能なプロパティ アクセスを指定できません。 ts(2779)

## コード例とエラー表示内容
```typescript
 type TestType = {
    param?: {
      prop: string
    }
  }

  const someTestType: TestType = {}
  someTestType.param?.prop = 'fafa'　// 代入式の左辺には、省略可能なプロパティ アクセスを指定できません。ts(2779)
```

## エラー原因
上記の例でいうと、`someTestType.param?.prop`の存在が保証されないので値を代入できない可能性がある。

## 対策
代入するプロパティが存在することを確定させる。

```typescript
  if (someTestType.param?.prop) {
    someTestType.param.prop = 'fafa'
  }
```

プロパティが存在することが、すでに明らかである場合は、以下の感じでもOK。

```typescript
  const someTestType: TestType = {}
  someTestType.param!.prop = 'fafa'
```
ハッカソンに出てみた！！

# はじめに
今回、サポーターズさんのハッカソンにTEAM_真水として参加させていただきました！
テーマは「開発を効率化するアプリケーション」でした。

私事ですが賞もとれていないですが初めてのハッカソン参加でいろいろ感じたことを伝えたいなと思い、書かせていただきました。

# アジェンダ
1. [何を作ったか](#何を作ったか)
1. [開発フロー](#開発フロー)
1. [苦労した点・ハッカソン初心者に向けて](#苦労した点ハッカソン初心者に向けて)
1. [感想](#感想)

# 何を作ったか
## Baby Step Up
なにか決めたモノゴトに手を付けるまでの行動を支援するアプリです！
フロントはFlutterでバックエンドはRuby on Railsで開発しました。

## 開発における問題点
開発を効率化するために挙げられる問題点として進捗の管理や人のコードがよめないとかいろいろあると思いますが、まず**開発をはじめる**のに時間がかかりませんか？
ちょっと布団から出れなかったり、PCを開いたもののYouTubeを見てしまったりとかあるあるですよね～
そんな時間を減らして開発に向き合う時間を増やせたら当然効率化につながりますよね！
ということでこのアプリを作りました。

## アイコン
どうでもいいですが自分でアイコンを作りました。
かわいい^^
![babystepup (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524257/c7491ab1-e692-bdc9-9b36-8d8a744f5531.png)

## スライド
[当日の発表スライド](https://docs.google.com/presentation/d/1jtaeJlHquEPW1yU_4u5R1FFClaxeayWLuyzhvB3u3wY/edit?usp=sharing)です！
よかったら見てみてください！

# 開発フロー
人数も二人と少なかったのでバチバチにアジャイルで開発しました。

## 手を動かすまで
アイデア出しが終わった後の流れとしては以下のようになります。

1. 何の機能が必要かの案出し、整理（要件定義,機能設計）
2. データ設計、ER図の作成
3. 担当を分けて手を動かす


結構自然にこの流れができたのでめちゃくちゃよかったです！

## 挑戦
サポーターズさんから挑戦をしてほしい、とのことで自分の中でちょっとした挑戦ではなくやったことがないことをやろう！

ということで freezed + state_notifier + riverpod　で状態管理をする手法をとってみました。

バックエンドの @mukusuke421 はRailsという保険もやるけどgo + ginで挑戦することにしました。

## コーディング
保険もかねたRailsでAPIをサクッと作ってもらいそれをMock扱いして開発していきました。

しかしながら大した知識もなくやり始めたのでかなり難しい挑戦となりました。
ここで複数のリスト的なものは取得できたけどid指定の単独なものを取得できないみたいな悲しいことが起こってしまいました。。。
なのでそういうところは現在では古典的であろう FutureBuilder でごり押しました笑

# 苦労した点・ハッカソン初心者に向けて
苦労したところしかなかったのでハッカソン初心者には注意してほしいことがいっぱいあります。

## 事前準備がＯＫならしっかり準備しておけ
すでにチームができていてテーマも発表されている場合に限りますが、アイデアだし自体は前もってやっていていいと思います。
あとは本番発表するようのアプリではないテストアプリでやり方を学んでおくべきです。
きちんといつから開発していいかはルールにのっとりましょうね！

## 扱う技術についての勉強をしておこう
私はクリーンアーキテクチャに則ってやればいいんだなあ的な意識があったのでちょっと時間はかかりつつも流れを理解できたのでいいのですが、例えば Rails を使うならMVCってなに？くらいの理解はしておきましょう。
意識があるくらいではついていけないところが出てきてしまいました。。。

## スケジュールをしっかりたてよう
これが一番大事かもです。
きちんと寝て、きちんと開発をしましょう。
一人でやっているならいいんですが、あくまでチームです。
一人ではなくチームだからこそ軌道修正が難しいのでスケジュールはしっかりたてましょう。
あとは私みたいに2徹しましたみたいになると口内炎いっぱいできます。

軌道修正がむずかしいのになんでチームっていいの？みたいな話はここじゃないところでしたいと思います。

# 感想
ハッカソン自体はめちゃくちゃ楽しかったです！
あんま思いつきもないので技育展には出ない予定なのですが、今後もこういうことをやっていきたいとは思いました！
あとは就職してからもこういうのにかかわっていけると楽しそうです！

楽しいことの裏には辛いことも当然あるのですがやり方次第で乗り越えられるものなのでハッカソンに参加したい人は徹夜して口内炎にならないように頑張ってください！
あとは、ハッカソンに参加するならやっぱりチームみんなで頑張れるといいです！

ちなみに舌の横側と下の歯の歯茎の裏と上唇の裏側の3か所に口内炎ができました。。。
舌にできた口内炎がバカ痛すぎてしんどいです。。。

あとがきみたいなものですが、NUTMEGという団体名をもっと広められると嬉しいです。

サポーターズさん、ハッカソンに出させていただいてありがとうございました！
また、ハッカソンに関してでも開発に関してでもコメントや質問くださるとうれしいです！
OpTaliX で PSF を export するメモ

## 背景

OpTaliX で PSF の数値データを出力したい.

## 方法

一応 GUI からもできますが, めんどいのでコマンドでやります.

Manual 10.80 14.2.2.2 Exporting PSF-Data にあります.

形式は ASCII(.txt, .dat), .xls があります.
ASCII は CSV 的なものなのでこちらのほうが楽でしょうか.

```
PSF fk FIL C:\Users\<user>\psf.txt
```

などとします. ASCII はヘッダなどがないですが単純なフォーマットですので python なりで簡単に読めます!
xls で pandas で読むのも手かもしれません.

## 注意点

xls だとサイズに制限があります! Ray grid size を上げた場合は ASCII にしましょう.
また, xls は吐き出しが遅い感があります.



## TODO

* Geometric PSF も吐けるか調べる.
*
VMware Workstation上のLinuxでLogicoolマウスを使う

VMware WorkstationのLinuxでLogicoolマウスを使うときにはまったのでメモ。

## 親指ボタンが動かない場合

1. 仮想マシンの電源をOFFにします。
1. 仮想マシンのvmxファイルをテキストエディタで開き、次の3行を末尾に追記します。

    ```[MyLinux.vmx]
    usb.generic.allowHID = "TRUE"
    mouse.vusb.enable = "TRUE"
    mouse.vusb.useBasicMouse = "FALSE"
    ```

1. 仮想マシンの電源をONにします。

## マウスホイールが動かない場合

WindowsにインストールしてあるはずのLogicool Optionsアプリで、
スムーズスクロールを無効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/81074b91-4246-f7ba-00d3-89950e3990e0.png)
AtCoder Beginner Contest 208　備忘録

https://atcoder.jp/contests/abc208

A,B,C:AC
D:時間切れ
E,F:未着手


https://atcoder.jp/contests/abc208/tasks/abc208_b
階乗計算をして割っていくだけ。
割った商が枚数になるので、カウントしていく。
問題の通り1!硬貨があるので必ず割り切れるから、10回ﾙｰﾌﾟさせて商を加算する。
階乗計算がごちゃごちゃするとうっとおしいので、関数にして外に出した。


```php
#include <stdio.h>
#include <bits/stdc++.h>
#include <math.h>
#include <iostream>
using namespace std;
typedef long long ll;

ll culc(ll a){
    ll ans=1;
    for(int i=a;i>0;i--){
        ans=ans*i;
    }
    return ans;
}

int main(void){
    ll p;
    ll count=0;
    cin>>p;
    
    for(int i=10;i>0;i--){
        count=count+p/culc(i);
        p=p%culc(i);
    }
    cout<<count<<endl;
}
```



https://atcoder.jp/contests/abc208/tasks/abc208_c

未ソート配列を残しといて、それをキーにしてmapから検索する形にした。
均等に渡すのはk/nの商、1個ずつ配る個数はk%nの余り。
余りの数を国民番号若い順に配り、配り終わったところで終了。
未ソートの国民番号配列でmapから検索して出力。


```php
#include <stdio.h>
#include <bits/stdc++.h>
#include <math.h>
#include <iostream>
using namespace std;
typedef long long ll;


int main(void){
    ll n,k;
    map<ll,ll> A;//国民番号:お菓子

    cin>>n>>k;
    ll B[n];
    ll C[n];
    ll base=k/n;//均等に分ける数
    ll amari=k%n;//割り振っていく残りの数

    for(int i=0;i<n;i++){
        ll d;
        cin>>d;
        B[i]=d;//ソートする配列
        C[i]=d;//ソートしない配列も用意
    }

    sort(B,B+n);//国民番号でソート

    ll count=0;
    for(int i=0;i<n;i++){
        if(count<(amari)){
            A[B[i]]=base+1;//小さい番号順から、配り終えるまで加算
            count++;
        }
        else{
            A[B[i]]=base;//配り終えた以降の番号は均等割り振り分のみ
        }
    }
    for(int i=0;i<n;i++){
        cout<<A[C[i]]<<endl;//未ソートの国民番号をキーにして表示
    }
}
```



https://atcoder.jp/contests/abc208/tasks/abc208_d
ワーシャルフロイド法。

s⇒tのコストをdist[s][t]とする。
初期化として、
s=t ⇒ dist[s][t]=0
入力無　⇒　dist[s][t]=inf (1e10くらい)
入力有　⇒　dist[s][t]=C :入力値
として配列を整備する。

そのあと、kについて考える。
k=1、つまりs,t,1が通れるときは、
dist[s][t]=min(dist[s][t], dist[s][1]+dist[1][t])
になる。
s⇒t経路が定義されてる時は、s⇒1経路と1⇒t経路の和の小さい方
s⇒t経路が定義されない時は、s⇒tがinfになるので、s⇒1経路と1⇒t経路の和
s=tの時は0なので、答えは0となる。

これをk⇒n;s⇒n,t⇒nでインクリメント、加算していくと答えになる。
考え方も実装ｺｰﾄﾞもとてもシンプルで美しい。

```php
#include <stdio.h>
#include <bits/stdc++.h>
#include <math.h>
#include <iostream>
using namespace std;
typedef long long ll;


int main(void){
    int n,m;
    cin >> n >> m;
    ll dist[500][500];
    ll inf=1e10;
    ll ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            dist[i][j]=inf;
        }
        dist[i][i]=0;
    }

    for(int i=0;i<m;i++){
        ll a,b,c;
        cin>>a>>b>>c;
        dist[a][b]=c;
    }

    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
            dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
            if(dist[i][j]<inf){
                ans=ans+dist[i][j];
                }
            }
        }
    }
    cout<<ans<<endl;

}
```