OmniAICreator/Qiita-1.07M huggingface dataset:
COVID-19向けに作ったグラフの見方

１年以上、COVID-19の感染状況を見ていますが、新規陽性者数や死亡数を単独で見ていも、なかなか地域間の比較ができません。きっと、新規陽性者数（実数, 人口当たり）、死亡数（実数,人口当たり）、実行再生産数、感染者数に対する死亡数の割合といった指標を、まとめて一つのグラフにしたら、パッとわかるんじゃないかと考えて、このグラフのフォーマットを作りました。
日次で更新しているグラフは、こちらのリンクからご覧いただけます。

- [Yet Another COVID-19 data analysis](http://plus-sum-lab.jp/cov19/index2.html)

日本では、緊急事態宣言や、まん延防止等重点措置が行われていますが、それぞれの地域の状況を理解するためのツールとして、そこそこ使えてます。しかし、そもそも無理のあるグラフフォーマットなので、自分でも意味が分からなくなることがあります。
忘れる前に、グラフの構成をまとめておくことにしました。

# グラフの例と要素について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/cc27278d-70c2-dbfb-5a20-a6b2542d9efa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/a5f39661-c0f3-817c-0ad1-89479ce830bf.png)


- Head line
    - pp:　New cases（新規陽性者数） / 100K (max, last)
        - 日本の(5.1, 5.0)に対して、USは(78.9, 10.3)となっています。
        - ピーク時で、15倍、5月15日で2倍の割合で新規陽性者数が確認されています。
    - dp: Deaths（死亡数） / 100K (max, last)
        - 日本の(0.08,0.07)に対して、USは(1.04,0.18)となってます。
        - ピーク時で13倍、5月15日で2.6倍の割合で死亡数が確認されています。
    - pop: population（人口）/100K
        - 人口を10万人単位にしています
    - dr: Max deaths(最大死亡数） / Max new cases（最大新規陽性者数）
        - 感染した方がどの程度の割合で亡くなっているのかを計算しています。
        - 日本では1.51%、米国では1.37%と、米国の方が助かる方がわずかに多いことがわかります。
    - 2021-05-15: Lat date of the graph

- グラフの説明
    - Japan-deaths-0.10/100K, US-death-0.50/100K
        - 棒グラフ：死亡数（７日の移動平均）
            - 日本は 0.1/100k 毎にで色を変える棒グラフ（緑）
            - 米国は 0.5/100k 毎にで色を変える棒グラフ（青）
        - 細い点線：死亡数の生データ
    - Japan-confirmed, US-confirmed
        - 太い実線: 新規陽性者数（７日の移動平均）
        - 細い点線：新規陽性者数（生データ）
    - Japan-ern / US-ern
        - 太い点線：ERN(実行再生産数）
        - ern=1.0：The level of ERN=1
        - ern=2.0: The level of ERN=2
    - Positive /100K
        - Positive 2.5/100K: 新規陽性者数が2.5/100Kに相当するレベル  
        - Positive 5.0/100K: 新規陽性者数が5.0/100Kに相当するレベル

# グラフの例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/e5152d9d-dda6-a32c-d27f-db717970c7ba.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/94884b82-dab1-7fa0-9ffa-9fdc028582dd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/8f8c6839-595d-b3ac-aed1-c9c2bb48cdc4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/e3459abe-5466-20c3-839c-86e5bd6009c1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/d604cbd1-a605-212b-ebc5-ebe16501a778.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/e2232345-8474-2aec-76e4-b3f75c4ca6cf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/96eb9e0d-db06-7251-e058-357e28a13069.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/e5f2e262-2ad8-5871-fcce-610d06362a48.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/93d9ed30-3328-a2a9-3e99-6317d091d534.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/e8664fca-944a-0dc3-c16c-0ef1e4b5ba9b.png)

# グラフを公開しているサイト
色々とつたない内容ではあります。

- [Yet Another COVID-19 data analysis 2](http://plus-sum-lab.jp/cov19/index2.html)
matplotlibのpipインストール時にでたft2build.hエラー

# matplotlibインストール時のエラー
matplotlibをpip installする際に下記のエラーがでた。

```:error文
Building wheels for collected packages: matplotlib
  Building wheel for matplotlib (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /espnet/tools/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-x2iu72i2/matplotlib_44f82a421fe24ccca1bbcbe93d19b150/setup.py'"'"'; __file__='"'"'/tmp/pip-install-x2iu72i2/matplotlib_44f82a421fe24ccca1bbcbe93d19b150/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-m9t_thc9
       cwd: /tmp/pip-install-x2iu72i2/matplotlib_44f82a421fe24ccca1bbcbe93d19b150/
  Complete output (505 lines):

 ...............

  copying lib/matplotlib/mpl-data/stylelib/seaborn-bright.mplstyle -> build/lib.linux-x86_64-3.8/matplotlib/mpl-data/stylelib
  UPDATING build/lib.linux-x86_64-3.8/matplotlib/_version.py
  set build/lib.linux-x86_64-3.8/matplotlib/_version.py to '3.1.0'
  running build_ext
  building 'matplotlib.ft2font' extension
  creating build/temp.linux-x86_64-3.8
  creating build/temp.linux-x86_64-3.8/src
  gcc -pthread -B /espnet/tools/venv/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DFREETYPE_BUILD_TYPE=system -DPY_ARRAY_UNIQUE_SYMBOL=MPL_matplotlib_ft2font_ARRAY_API -DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION -D__STDC_FORMAT_MACROS=1 -Iextern/agg24-svn/include -I/espnet/tools/venv/lib/python3.8/site-packages/numpy/core/include -I/espnet/tools/venv/include/python3.8 -c src/checkdep_freetype2.c -o build/temp.linux-x86_64-3.8/src/checkdep_freetype2.o
  src/checkdep_freetype2.c:1:10: fatal error: ft2build.h: No such file or directory
   #include <ft2build.h>
            ^~~~~~~~~~~~
  compilation terminated.
  error: command 'gcc' failed with exit status 1
  ----------------------------------------
  ERROR: Failed building wheel for matplotlib
  Running setup.py clean for matplotlib
Failed to build matplotlib
```

# 原因と解決策
freetypeという、フォントにまつわるライブラリがインストールされていないことが原因。
解決策としては

```
apt install libfreetype6-dev
```
で該当ライブラリをインストールしたのちに、再度matplotlibをインストールすると解決。
関口 厚の職歴情報

このページは、WEBエンジニア・コーダーの関口 厚の職歴についての情報を閲覧・ダウンロードするための記事です。


#履歴書と職務経歴書のダウンロードリンク
[履歴書(PDF)](https://www.yo2onweb.com/portfolio/resume_sekiguchi.pdf)
[職務経歴書(PDF)](https://www.yo2onweb.com/portfolio/work_experience_sekiguchi.pdf)

#リンクトインのプロフィール
[https://www.linkedin.com/in/sekiguchiatsushi/](https://www.linkedin.com/in/sekiguchiatsushi/)

#自作したWEBアプリの紹介記事
[WEBアプリ『ひとこと日記ver2』概要(Qiita)](https://qiita.com/Sekiguchi-Atsushi/items/4029966a13b0f5494b85)
Githubへのリンクも記載しています。ぜひご覧下さい。

#使用可能なソフトウェア・言語
(1)実務で長期間の使用経験あり
・**HTML5**、**CSS3**、**javascript**、**Git**(SourceTreeを使用)、**JQuery**
・**PhotoShop**、**Illustrator**、DreamWeaver、Acrobat、Word、Excel、ExcelVBA、PowerPoint

(2) 実務で使用経験あり
・**Visual Studio Code**、**Zoom**、**Google Analytics**、UiPath、Flash
・Python、WordPress、AppleScript、PhotoShop Script

(3) 個人レベルで使用経験あり
・**node.js**、**Express**、**Vue.js**、**AWS**、**GitHub**、**MySQL**、PHP、VirtualBox


#ポートフォリオ
(1) **ひとこと日記ver2**
**Vue.js**、**node.js** + **Express**、**MySQL**、**AWS**で作った日記のWebアプリです。
https://diary-app.sekiguchiportfolio.net/
(※現在、都合によりサーバーを一時停止しているのでアクセスできません。ご了承下さい。)
仕様解説のQiita記事は以下。
[WEBアプリ『ひとこと日記ver2』概要(Qiita)](https://qiita.com/Sekiguchi-Atsushi/items/4029966a13b0f5494b85)

(2) **ひとこと日記（旧バージョン）**
JQuery、PHP、MySQLで作った日記のWebアプリです。
https://yo2onweb.com/hitokotonikki/index.php

(3) **しあわせの魔法使いシイナ**
趣味で書いているWEB小説を掲載したサイトです。3DCGで動く挿絵も描いています。
https://yo2onweb.com/sheena/

(4) **YO2onWeb**
自作の漫画作品を紹介するためのサイトです。
https://yo2onweb.com/comic/index.html
kintoneで30分前リマインダー条件通知ができるようにするカスタマイズ

kintoneのリマインダーの条件通知は1時間前通知が一番近い通知となりますが、
ちょっと工夫すると**30分前通知することも可能！**という技の紹介です。

※以下のように0.5時間など設定しようとすると怒られてしまいます^^；
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/59b0ed87-d0e4-0962-a19c-d9b445c96ab5.png" width=500>


今回の小技で30分前通知が可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/61dbc18d-d548-c8fa-a105-e4885befd29c.png)


# アプリの準備
準備するフィールドはこんな感じです。

| フィールド種類 | フィールドコード | 備考 |
|:-:|:-:|:-:|
| 日時  | 日時  |   |
| 文字列(1行)  | 予定  |  (お好みで) |
| ユーザー選択  | ユーザー選択  | 初期値はログインユーザーにしておく  |
| 日時  | リマインダー通知用日時  | 日時の30分後の時刻を入力する  |

リマインダー通知用時刻はグループに隠してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/49ae5b37-6ec4-21b9-ae5c-22bc0b50002f.png)


# JavaScript

レコード追加・編集の保存前に`リマインダー通知用日時`に予定の30分後の時刻を入力するようカスタマイズします。

Luxonを使います。↓こちらから探してね。

https://developer.cybozu.io/hc/ja/articles/202960194-Cybozu-CDN

```js
event.record.リマインダー通知用日時.value = luxon.DateTime.fromISO(event.record.日時.value).plus({ minute: 30 }).toISO();
```

# リマインダー条件通知の設定

こんな感じに設定します。
（自分宛てにも通知が来ます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/559ce1aa-c82f-83f7-1bf0-27c20fffbe06.png)

30分後の時刻の1時間前に通知がくるという仕組みです。
ただ、10分に一度バッチが動くようなので最大10分近くズレが生じる可能性があります。
（20～30分前の通知になると思います。）


# まとめ
以上の小技で、無理矢理ではありますが30分前リマインダー通知をすることができます。
標準で欲しいなぁと思わないこともないですが、どうしてもという場合はこんなカスタマイズで可能！というお話でした。
では！
Fluuter: pushReplacementNamedとpushNamedAndRemoveUntilの違い

**pushReplacementNamed**

現在のRouteを完全に書き換える。
ユースケースとしてはログイン後にホーム画面に遷移させる場合等、ユーザーの操作で前の画面に戻したくない時などに使う。

**pushNamedAndRemoveUntil**
第一引数に渡された新しい画面をpushしつつ、第2引数で渡された画面まではpopする。


例
現在の画面のスタック
Screen 1
Screen 2
Screen 3 <- いまこの画面が表示されている


```
Navigator.of(context).pushNamedAndReplaceUntil(
    ("/screen_4", ModalRoute.withName("screen1")
)
```

遷移後の画面のスタック
Screen 1
Screen 4 <- いまこの画面が表示されている

Screen 2とScreen3はpopされているのでScreen 4から戻るとScreen 1に遷移される。
UnityでTexture2D画像の文字認識導入(Tesseract)


画像内に記された文字をUnityプロジェクト上で認識する上で、Tesseractが比較的導入が容易であり精度もよかったので、ひとまず導入と軽い動作確認までの記録を残していこうと思います。

私の使用目的としては、画像内に記された"数字"を"ある程度"認識できれば良いというユルいものなので、ひとまず数字認識用途に最低限いじるところをメモとして残していきます。

#プロジェクト導入
Unity上で簡易的な文字認識が実行可能なgitリポジトリが公開されていて、これを落としてくるだけで、基本的なEnglishの文字認識は動作します。
https://github.com/Neelarghya/tesseract-unity
※左が読み込んだ画像で認識した緑枠内の文字をTextで出力しています
![スクリーンショット 2021-05-17 11.20.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311829/582b6f77-4e8d-941d-36b1-851abd3e8885.png)


#数字認識用途に少しいじってみる
下記の画像を読み込んでみます。
![test4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311829/996a1a9b-55f4-a54a-e80c-5c6a2a2b6b53.png)

取り敢えず実行してみます(プロジェクトのmainシーン→Tesseractオブジェクト→TesseractDemoScriptコンポーネント→ImageToRecognizeに認識させたい画像の参照を持たせて実行)
![スクリーンショット 2021-05-17 4.12.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311829/005c0734-a0d3-022f-4234-42dbcdf9ffe5.png)
結果画像の様に、全て数字として認識させたくとも文字を認識してしまう場合があります。
今回は意図的に数字の"11"に近い"ll"を置いていますが、数字を数字以外の文字列
として認識してしまう場合も当然あります。
Tesseractバージョン4以降深層学習が導入されているので、読み込んだ画像の"ll"が、"11"にどれくらい近いのかと言うスコアと"il"のスコアを比べてスコアの高い"il"を結果として出力したものだと考えますが、そもそも数字以外の結果を出さない様にいじることができます。

まず、DLLに用意されている関数をDllImportで引っ張ってくる必要があります。
TesseractWrapperクラスにDllImportを記述してある箇所があるので、そこに下記を追記します。

```
[DllImport(TesseractDllName)]
        private static extern int TessBaseAPISetVariable(IntPtr handle, string name, string value);
```

TessBaseAPISetVariableは認識結果を限定するための関数です。
第2引数には、第3引数の文字列のみを結果として出す
「tessedit_char_whitelist」
第3引数の文字列を省略する
「tessedit_char_blacklist」が設定できます。
他どの様な関数が用意されているかは下記に並んでいるので参考にしてみると良いです。
http://tess4j.sourceforge.net/docs/docs-1.4/net/sourceforge/tess4j/TessAPI.html

TessBaseAPISetVariable関数を呼び出してみましょう。
Init関数に下記の要領で記述します。

```
_tessHandle = TessBaseAPICreate();

int init = TessBaseAPIInit3(_tessHandle ,dataPath , "eng");

// 数字のみの認識制限
TessBaseAPISetVariable(_tessHandle ,"tessedit_char_whitelist" ,"1234567890" );
```

以上で数字のみを認識結果とする処理に変わりました。
改めて出力してみます。
![スクリーンショット 2021-05-17 4.20.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311829/b0f187f2-49bc-1f66-f4b7-b55f33d67c99.png)

Boxパースクラスのインスタンスに読み込んだ文字のPositionも入っているので、応用すると
色んなことができそうですね。

ちなみに、gitリンクのプロジェクトはApacheライセンスなので商用利用も可能です。
https://github.com/tesseract-ocr/tesseract/blob/master/README.md
#最後に
より精度向上を考えるなら下記等の資料からtesseractの概要を把握する必要があります。gitのunityプロジェクトのtesseractはバージョン5.0alphaですが、リリースノートを確認する限り枠組み自体は大きく変わっていないので、そのままリンクの資料を参考にしても問題ないかと思います。
※tesseract4 https://laplace-daemon.com/training-tesseract/
※リリースノート https://github.com/tesseract-ocr/tesseract/releases


勉強する機会があったら次はTesseractの中身をまとめてみたいです。
テロップ文字数制限チェック

#
クライアントから頂いたテキストデータで文字制限ありで依頼してても
「ん？何行目が文字数オーバーしてますか？」
という事あるよね？
ん？？みんなあるよね？？

わかりました。こちらでその作業致しますね!!
任せて下さい!!こっちでやる事では無いですけど…（ごにょごにょ…ボソボソ…）
あっ…大丈夫です!!
任せて下さい!!
って時に出来る感を出すために素早く対処

#参考にさせていただいたURL
https://fuuno.net/web02/hankaku/hankaku.html

#追加分

```jsx
var mytextArray  = []; 
var seigen = 19;

//ファイルを読み込んで配列に入れる作業
function readtext(){
var fileName = File.openDialog("Select Text file","");
var myFile = new File(fileName);
    if (myFile.open("r")){
    var myText = "";
        while(!myFile.eof){
        var myText = myText + myFile.readln()  + String.fromCharCode(13);
        }
        var text_array=myText.split (String.fromCharCode(13));
            for(var i=0; i<(text_array.length-1); i++){
               mytextArray.push(text_array[i]);
            }
    }
myFile.close();
}
readtext()

function count(n) {
    var nagasa = 0;
    for (j = 0; j < n.length; j++) {
        if(n[j].match(/[ -~]/) ) {
            nagasa += 0.5;
        }
        else {
            nagasa += 1;
        }
    }
    return nagasa;
}


for( var i=0; i< mytextArray.length; i++ ){
    if ( count(mytextArray[i]) > seigen ){
        $.writeln( (i+1)+"行目")
        $.writeln( mytextArray[i] )
        $.writeln( count(mytextArray[i])+"文字" )
    }
}





```
UE4エディタでpythonを使って参照しているアセットをコピーする

UE4で拡張のPakを作るためにあるアセットが参照しているアセットを全て取ってきたかったのでpythonスクリプトでやってみました。

アセットを選択しておいて[File] > [Execute Python Script]実行でスクリプトで指定したフォルダに参照しているアセットを全てコピーします。
スクリプトではまだ未対応ですが可能であれば参照の置き換えもしたいです。
※ UE4.26.2を利用しています。
※ Python Editor Script PluginとEditorScritpting Utilities Pluginの有効化が必要です。

```python
import unreal
from copy import copy
 
# 引数のアセットの依存するアセットをすべて取得
def get_list_dependencies(asset_data):
  asset_package_name = asset_data.get_editor_property('package_name')
  option = unreal.AssetRegistryDependencyOptions()
  dependencies = unreal.AssetRegistryHelpers.get_asset_registry().get_dependencies(asset_package_name, option)
  list = set()
  if dependencies:
    for dependency in dependencies:
      try:
        dependency_asset = unreal.EditorAssetLibrary.find_asset_data(dependency)
      except:
        continue
         
      list.add(unreal.StringLibrary.conv_name_to_string(dependency))
      dep_list = get_list_dependencies(dependency_asset)
      for dep in dep_list:
        list.add(unreal.StringLibrary.conv_name_to_string(dep))
   
  return list

# 選択されているアセットを取得   
utility_base = unreal.GlobalEditorUtilityBase.get_default_object()
asset_list = unreal.EditorUtilityLibrary.get_selected_asset_data()

# 選択されていなければ終了
if len(asset_list) <= 0:
  exit()

# とりあえず１つだけ処理
target = asset_list[0]

# 依存するアセットと選択されたアセットを取得
sources = get_list_dependencies(target)
target_package_name = target.get_editor_property('package_name')
sources.add(unreal.StringLibrary.conv_name_to_string(target_package_name))
print(sources)

# 取得したアセットを特定のフォルダにフラットにコピー
for source in sources:
  unreal.EditorAssetLibrary.duplicate_asset(source, "/Content/Test/" + source.split("/")[-1])
```

---

UE5.3.2でもスクリプト動きました。
実行は[Tools] > [Execute Python Script]で実行する必要があります。
また、UE5.3.2ではアセットのコピー先のパスを/Game/Test/のように指定する必要があります。
Java案件準備

#理由・背景
Java Springの案件に入りそうです。
設計・製造それ以降もあり。
ビジネスロジック・Rest API バッチもあるそうです。
キーワード
バッチ処理とか大量データ
#モヤモヤ
Javaは？
Spring
SpringRest
設計
大量データ・大量処理
JSON？
#アクション
Java→ think JavaとSpringを学びつつ
Spring → 
Rest 気になる。
しっかりしたもの作る　テストプログラムは必須
Javaまで踏み込んだテキストがあるようだ。
設計　？？？
大量データ・大量処理　？？？
#ホップ
think Java
Spring Boot 2 応用: REST x Swagger UI、MyBatisからAWSへのデプロイまで   原田 けいと https://www.amazon.co.jp/dp/B08RL67N9S/ref=cm_sw_r_tw_dp_J2G5CV59ZH0J14ETBS37 
JUnit(再)入門
https://speakerdeck.com/yusuke/madamadajian-nihe-ujunit-zai-ru-men-number-jjug-ccc-number-ccc-g4
まだ間に合うMaven(再)入門
https://speakerdeck.com/yusuke/madajian-nihe-umaven-zai-ru-men-number-jjug
AWS Databricksでクラスター起動時に「insufficient capacity error」が発生する際の対策

これはクラウドサービスプロバイダー側でインスタンスを確保できなかったことに起因します。サービスクォータの引き上げが必要となります。

[AWS のサービスクォータ \- AWS 全般的なリファレンス](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html)

Databricks側の対策としては、ログ監視、そして、以下のAuto-AZ(アベイラビリティゾーンの自動選択)を活用することになります。Auto-AZはGUIではなくCluster APIでAuto-AZを有効化する必要があります。

[アベイラビリティゾーンの自動選択(Auto-AZ)](https://docs.databricks.com/clusters/configure.html#automatic-availability-zones-auto-az)

> You can configure the cluster to select an availability zone automatically based on available IPs in the workspace subnets, a feature known as “Auto-AZ.” You must use the [Clusters API](https://docs.databricks.com/dev-tools/api/latest/clusters.html#clusterawsattributes) to enable Auto-AZ, setting `awsattributes.zone_id = "auto"`. Auto-AZ retries in other availability zones if AWS returns insufficient capacity errors.

- キャパシティ不足のエラーが発生した場合には他のAZでリトライします。
- 起動後は選択されたAZが保持されます。再度Auto-AZを有効化するには、クラスターの削除、再作成が必要になります。

パーソナルアクセストークンを作成し、以下のエンドポイントに設定をポストします。トークンは[Bearer認証](https://qiita.com/h_tyokinuhata/items/ab8e0337085997be04b1)などで指定ください。認証方法詳細に関しては[こちら]([Authentication using Databricks personal access tokens \| Databricks on AWS](https://docs.databricks.com/dev-tools/api/latest/authentication.html))を参照してください。

```
https://<DatabricksワークスペースURL>/api/2.0/clusters/create
```

以下の設定では、i3.xlargeのスポットインスタンスをAuto-AZで作成します。`zone_id=auto`とすることで、Auto-AZが有効になります。

```json
{
  "cluster_name": "my-cluster",
  "spark_version": "7.3.x-scala2.12",
  "node_type_id": "i3.xlarge",
  "aws_attributes": {
    "availability": "SPOT",
    "zone_id": "auto"
  },
  "num_workers": 1
}
```

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
[Webを支える技術] httpのメソッドとRequestとResponse

# HTTP
## Request
HTTPはアーキテクチャスチルスタイルにクライアント/サーバーを採用している。
クライアントがRequestを送り、それに応じてサーバーがResponseを返します。
クライアントが送るRequestは、一番短い例ではこのような形になります。

```http:Request
GET/ sample/ HTTP/1.1
Host: sample.com
```

例のRequestは2行に分かれていますが、この1行目をリクエストラインと呼びます。
ここにはhttpのメソッド(GET)、リクエストしたURI(sample/)、httpのプロトコルバージョンが入ります。
また、URIの部分には、クエリパラメータを含んだもの、絶対パスで書かれたものもあります。

```http:Request
GET/ https://sample.com/sample?name=micchili HTTP/1.1
Host: sample.com
```

Requestの二行目はヘッダと呼ばれ、ここにはメタデータが入ります。
メタデータは`名前:　値`という形で入り、例ではHostという名前にsample.comというデータが入っているというのを表しています。
また、ヘッダは複数持つことができます。

```
GET / HTTP/1.1
Accept: image/gif, image/jpeg, */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;)
Host: www.xxx.zzz
Connection: Keep-Alive
```
例引用: とほほのWWW入門

https://www.tohoho-web.com/ex/http.htm

### HTTPメソッド
上で書かれていたRequest Lineの先頭についている用語です。
Requestで主に使われるHTTPのメソッドは6つです。

- GET
- POST
- PUT
- DELETE
- HEAD
- OPTIONS

#### GET
GETは指定したURIのリソースの取得ができます。
私たちが何気なく利用しているWebコンテンツにアクセスする際は、このGETメソッドが使われています。

#### POST
リソースの追加と作成ができます。
また、POSTはRequestを飛ばす際にクエリパラメータなどをbodyに入れることができます。
また、ほかのメソッドでは対応できないものをPOSTで補うことがあります。

#### PUT
リソースの更新と作成ができます。
リソースの更新にはPOSTではなく、PUTを使うようにしましょう。
リソースの作成では、PUTはすでに作成しようとしたリソースがあった場合、更新を行います。

#### DELETE
リソースの削除ができます。
DELETEはサーバー側へ「削除」を要請するメソッドなので、基本的にBodyを持ちません。

#### HEAD
Requestを送った後、サーバーからResponseが返ってくるのですが、HEADはそのResponseのヘッダを取得します。
GETがリソースのすべてを取得するのに対し、HEADは、その名の通りヘッダしか取得しません。
データの量が減るので、リソースの更新日時などを知るのに使えます。

#### OPTIONS
リソースがサポートしているメソッドを取得できます。

#### べき等性
一部のHTTPメソッドにはべき等性というものがあります。これは処理をした後、その処理結果が変わらないという性質です。
GETとPUTとDELETEとHEADとOPTIONSがべき等性があります。
PUTやDELETEもべき等です。リソースを更新しても、削除しても、もう一回同じリソースに同じメソッドを使っても「更新された」「削除された」という結果が覆らないからです。
GETとHEADはべき等です。さらに安全性があります。リソースを取得するだけなので、リソースに何ら影響を与えないことから「べき等かつ安全」とされています。その性質から、WEBサーバーには必ず実装すべきものとされています。

>All general-purpose servers MUST support the methods GET and HEAD.
   All other methods are OPTIONAL.

https://datatracker.ietf.org/doc/html/rfc7231#section-4

https://qiita.com/suin/items/316cb8aaf8dfcf11abae


## Response
Requestを受け取ったサーバーは、なんらかのResponseを返します。

```
HTTP/1.1 200 OK
Content-Type: application/xhtml+xml; charset=utf-8

<html>
</html>
```

Responseの１行目をステータスラインと呼びます。
使用しているプロトコルのバージョンとステータスコードとテキストフレーズが入ります。
ステータスコードとは、Requestに対しての結果を数値で表したものです。
主なステータスコードはこのようなものがあります。

- 200番　レスポンスの成功
- 300番　リダイレクト
- 400番　クライアント側のエラー
- 500番　サーバー側のエラー

https://developer.mozilla.org/ja/docs/Web/HTTP/Status

二行目には、ヘッダ情報が入ります。このヘッダは、Requestと同様なものです。
三行目には、ボディが入ります。`<html></html>`の部分がそれに当たります。
ボディにはさまざまなものが入ってきます。
今回の場合は`Content-Type: application/xhtml+xml;`であったので、HTMLが格納されていましたが、`application/json`であれば、JSONが格納されています。
色々なセキュリティベンダの概要を調べてみた

# 1. 要約
- 日本国内で事業を行っている色々なセキュリティベンダの企業概要を調べてみました。
- 詳細は以下の分類で記事を作成しており、本記事はそれらの記事へのリンクのみとなります。

# 2. 各記事へのリンク
https://qiita.com/taka0189469/private/662089176f86078f765b

https://qiita.com/taka0189469/private/2d313231f5dce598b34d

https://qiita.com/taka0189469/private/20e6b5fdc0cb6d32eefc

https://qiita.com/taka0189469/private/9c49af8fb7182952f0ad

# 3. 更新履歴
- 2021/5/17：初版投稿（記事の整理のため）
UE4のログをVisual Studio Codeで色分けしてみた

UE4のログを色分けして見やすくするためにVisual Studio Codeの拡張[Log File Highlighter](https://marketplace.visualstudio.com/items?itemName=emilast.LogFileHighlighter)を使ってみました。

![logfilehighlighter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/1cfb620b-a101-1902-2006-0b9e5cc18850.png)

[Log Viewer Pro：コードプラグイン - UE マーケットプレイス](https://www.unrealengine.com/marketplace/ja/product/log-viewer-pro?sessionInvalidated=true)も便利そうだけどひとまず色分けくらいならこれでも良いかな。

色分けのハイライトパターンは以下のように設定してみています。

```json:拡張の設定でsetting.jsonに追加
     "logFileHighlighter.customPatterns": [
         {
             "pattern": "LogBlueprintUserMessages",
             "foreground": "#4949ff"
         },
         {
            "pattern": "(?<=LogBlueprintUserMessages: \\[)[^\\]]+",
            "foreground": "#6c8cbb"
         },
         {
            "pattern": "(?<=LogBlueprintUserMessages: \\[[^\\]]+\\]) Server",
            "foreground": "#bb6c6c"
         },
         {
            "pattern": "(?<=LogBlueprintUserMessages: \\[[^\\]]+\\]) Client [0-9]+",
            "foreground": "#6cbb7d"
         },
         {
             "pattern": "(?<=^\\[)[0-9.]+",
             "foreground": "#7c58ffb0"
         },
         {
             "pattern": "(?<=\\-)[0-9.\\:]+(?=\\])",
             "foreground": "#d5c9ffb0"
         },
         {
             "pattern": "(?<=\\])[A-Za-z]+",
             "foreground": "#ff7285"
         },
         {
             "pattern": "Verbose:",
             "foreground": "#009137"
         },
         {
             "pattern": "Error",
             "foreground": "#FF0000"
         },
         {
             "pattern": "Warning",
             "foreground": "#FFFF00"
         }
     ]
```
「情熱プログラマー ソフトウェア開発者の幸せな生き方」という本を読んだ

自分と同じ、もともとミュージシャンとして出発した方なので、音楽とプログラミングの共通点とか、音楽に例えるとこうとか、そういう記述が多く、今後のキャリアを考えるうえで、非常に参考になったし、おそらく音楽を経験したもののみ共感できる部分とかも、共感できたのは非常に良かった(PrinceのPurple Rainの話が出てきたときはびっくりした)。
自分が過去関わってきた言語のどういうところに惹かれるのか？それを踏まえて、どういう言語を学ぶべきか？そういうことを考える土台になる考え方を学ぶことができる。
自分が関わる言語は慎重に選ばなければならないと書かれているわけだが、そこまで考えられてはいなかった。とにかく実務でまともに使えるようになることで精一杯だったし、今だってそれは変わらない。
いつかそういう選ぶことができるような知見がつく日は来ることを想像し、より良く学ぶしかないのであろう。
またこの本を読み、地元の技術者コミュニティにも参加しようと思った。音楽同様、プログラミングも上級者から刺激を受けることが大事なのだ。
また気づいたことがあれば追記していこうと思うが、簡単な読後の感想としては以上である。
<a href="https://www.amazon.co.jp/dp/4274067939?_encoding=UTF8&openid.assoc_handle=jpamazon&openid.claimed_id=https%3A%2F%2Fwww.amazon.co.jp%2Fap%2Fid%2Famzn1.account.AG7RJBXYASAZEZITRZ2HZWHEEKSQ&openid.identity=https%3A%2F%2Fwww.amazon.co.jp%2Fap%2Fid%2Famzn1.account.AG7RJBXYASAZEZITRZ2HZWHEEKSQ&openid.mode=id_res&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.op_endpoint=https%3A%2F%2Fwww.amazon.co.jp%2Fap%2Fsignin&openid.pape.auth_policies=http%3A%2F%2Fschemas.openid.net%2Fpape%2Fpolicies%2F2007%2F06%2Fnone&openid.pape.auth_time=2021-05-17T00%3A16%3A51Z&openid.response_nonce=2021-05-17T00%3A16%3A51Z8171496893291091163&openid.return_to=https%3A%2F%2Fwww.amazon.co.jp%2Fgp%2Faw%2Fd%2F4274067939&openid.sig=BPHxPE3xnJ0x9eNDxcakDChmTEXalIhXr4xkPOnmF18%3D&openid.signed=assoc_handle%2Cclaimed_id%2Cidentity%2Cmode%2Cns%2Cop_endpoint%2Cresponse_nonce%2Creturn_to%2Cns.pape%2Cpape.auth_policies%2Cpape.auth_time%2Csigned&serial=&linkCode=li2&tag=harimanoma-22&linkId=b3ca6004ddb075933718878a27c81be1&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4274067939&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=harimanoma-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=harimanoma-22&language=ja_JP&l=li2&o=9&a=4274067939" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
MacのAutomatorでSquooshするクイックアクション

# 目的:画像を簡単に圧縮したい
Squooshで画像を圧縮するときにPWAはあるけども、開いてファイルなげて圧縮するのがめんどくさかった

# 完成品
```sh:画像圧縮.workflow
export PATH=$PATH:/usr/local/bin
for f in "$@"
do
	npx @squoosh/cli --mozjpeg '{"quality":75}' -s '-compressed' -d ${f%/*} $f
done
```

# アクション
![ScreenShot_20210517@2x-compressed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604032/5746b432-3bfe-3504-25d6-1d836d837a20.jpeg)

# 参考
[npxのコマンドが通らない→MacのAutomatorでnpmコマンドを使う](https://qiita.com/07JP27/items/db402c1a2028d56ce42a)
[Squooshのusage→GoogleChromeLabs / squoosh](https://github.com/GoogleChromeLabs/squoosh/tree/dev/cli)
[ファイルを同じ場所に保存→dirname、basenameは「%/*」と「##*/」で書くと処理速度が早くなる](https://qiita.com/rita_cano_bika/items/712807a5f79065aab7d2)
API Client Libraryとは

## 概要

API Client Libraryを使っているのですが、

API Clientって何のことかよくわからないまま使っていたのでちゃんと整理。

## API Client Libraryとは

プロジェクトに追加できるコードのセット。APIとやりとりをするために必要な情報を与える。

例えば、HTTPレスポンスをサーバーからもらった時に、それをコードで使える形に変換してくれるものだと理解。

REST APIはHTTP形式で返事をしてくれるが、それを特定の言語で使用したい時、変換する必要がある。

（これで私はしっくりきました！）

## 引用・参考

- [What is an API client library?](https://ffeathers.wordpress.com/2015/10/25/what-is-an-api-client-library/#:~:text=What%20is%20a%20client%20library,to%20interact%20with%20the%20API.)
make_blobsで作成したone-class SVM用のテストデータ分布

##make_blobsでone-class SVM用のテストデータを作ったら、分布が思いのほか歪んでいた
　one-class SVMのデバッグ用にtarinデータを作る必要があったが、60秒毎のデータで計算したいという事で、n_samples=60で作成していた。
　one-class SVM のパラメータ調整しても、思ったほど正答率が上がらず。　random_stateは固定していたが、n_samplesを小さくしたので、思ったよりも分布がゆがんでいた。
　random_state=0~100まで確認した上で、n_samples=60でも実際の分布に近そうなrandom_stateを選んで解決した。
試験そのものは、n_samplesが少ない状況では、ちょっと微妙だったが...
random_state=0~100のサンプルコード。

```python
from sklearn import datasets
import matplotlib.pyplot as plt
k=0
plt.figure(figsize=(20,15))
for j in range(100):
  k=j+1
  plt.subplot(10, 10, k)
  X_train,_ = datasets.make_blobs(n_features = 1, centers=1,random_state=j, cluster_std=1.667122, n_samples=60, center_box=(14,22))
  plt.hist(X_train, color='blue', Alpha = 0.5)
  plt.title('random_state='+str(j))
  plt.grid(True)
plt.tight_layout()
plt.show()
```
出力はこんな感じ。
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1508012/852dd44a-8eb3-c2ba-ec8f-d96690d74386.png)
ちなみに、当然ですがn_samples=500以上であれば正規分布に近くなる。
あまり使わなそうだが、取り合えずメモ用に保存
以上
投稿時刻を日本時刻へ設定する方法

### 投稿時刻の設定をします
---
configディレクトリに用意されているRailsのapplication.rbファイルに下記を追加します。

```
module ChatApp
  class Application < Rails::Application
#中略

config.i18n.default_locale = :ja
config.time_zone = 'Tokyo'
```

続いて、config/localesディレクトリに「ja.yml」というファイルを作成し、以下のような設定を記述します。

```
ja:
  time:
    formats:
      default: "%Y/%m/%d %H:%M:%S"
```

時刻の設定は以上です。


### 時刻を表示させる記述
---

l（エル）メソッドを使用します。

```
【例】
<%= l message.created_at %>
```
lメソッドを使用すると指定した現地時間に対応できます。
【ゼロからのOS自作入門】WSL2でQEMUが起動しなかった時の解決法

# 注意

本記事は自作OS書籍である[ゼロからのOS自作入門](https://book.mynavi.jp/ec/products/detail/id=121220)をやるにあたって「おま環」を解決する為の内容です。

その為、記事の内容的には自己責任の領域になっています。

基本的に書籍内容に関しては[サポートページ](http://zero.osdev.jp/)を参照した方がいいです。

# 環境

私の環境は以下になります。

+ Surface pro 7
+ windows10 home
+ WSL2
+ Ubuntu 20.04 LTS

# 本題

WSL2でQEMUが起動してくれませんでした。

具体的にはハローワールドの[サンプルコード](https://github.com/uchan-nos/mikanos-build/)を書籍の通り実行しようとすると以下を含む数行のエラーが出てきました。

```
(qemu) gtk initialization failed
```
# 原因＆解決方法
WSL2でのGUI設定、つまりWSL2とVcXsrvの設定がそもそも出来ておらずQEMUも起動しないという流れでした。

解決方法としては、WSL2とVcXsrvの設定をやり直します。

具体的にはVcXsrv設定の確認として使われる`Xeyes`が起動して目が表示される。この状態を目指します。

# 下準備
### VcXsrvのアンインストール＆再インストール

出来る限り初期状態からセットアップをした方が成功しやすいので、まずVcXsrvをアンスト＆再インストールします。

もし、後述するスタートアップにconfig.xlanuchを置いている方はそれも削除しといてください。

私は更に`Ubuntu`も初期状態に近かったので再インストールしました。ただ人によっては既に開発環境を整えているという方もいると思います。Ubuntuは個々人の責任でやるのか判断してください。

# セットアップ手順

基本的には、既存のWSLでVcXsrvのセットアップ記事と変わらない内容になります。

書籍の読者の方は、付録のページの内容に以下の内容が更に加わるという感じで見ていってください。

## VcXsrvの設定

1. `Extra settings`の一番下にある`Additional parameters for VcXsrv`に以下を入力してください

```
-ac
```

2.`Finish configuration`の`Save configuration`を押してファイルを生成。生成されたファイルをエクスプローラーのアドレスバーまたは`Windowsキー + Rキー`を押して表示される画面に`shell:startup`と入力して表示されたスタートアップフォルダに移して保存してください。
この設定をしておくと、パソコン起動時にVcXsrvが自動で起動してくれるので楽です。


3.ファイヤーウォールの設定が表示されなかった場合は、`コントロールパネル`→`システムとセキュリティ`→`Windowsファイヤーウォールによるアプリケーションの許可`から`VcXsrv windows xserver`のプライベートとパブリック両方にチェックが入っているか確認してください。



## WSLの設定

ここからは書籍には記載されていない内容です。上記設定のみでは自分の場合は起動できなかったのでここがメインです。

1. 以下の内容を~/.bashrcの最後に加えてます。

```
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0
```
これでWSLとlocalhostの接続ができるようになります。この設定の詳細は詳しくは[こちら](https://github.com/microsoft/WSL/issues/4106)を見てください。

2.設定を反映させます。

```
source ~/.bashrc
```

設定としてはこれで終わりです。後はXeyesをインストールして実行します。

```
xeyes
```
これで目が表示された場合はVcXsrvの設定は成功しました。

この状態で、書籍にもあるハローワールドをQEMUで実行するコマンドを叩いてください。少し待つと起動が成功します。

## 再ログイン時に設定が反映されない
Ubuntuに再ログインした時に、何故か`.bashrc`の内容が反映されない。`source ~/.bashrc`を入力すれば治るが面倒くさいという方がいるかもしれません。
この症状の方は、ターミナル上のシェルが真っ白になっているという症状も起きているかもしれません。
原因としては`.bash_profile`があることで`.bashrc`が読み込まれなくなっているようです。

対策としては[こちらの記事](https://qiita.com/Minato_seagull/items/a27263f1432e58f5518d)にある通り、中身を映してから`.bash_profile`の削除を行ってください。

# 参考文献
[WSL2におけるVcXsrvの設定](https://qiita.com/ryoi084/items/0dff11134592d0bb895c)
[WSL上にXサーバをインストールしてGUIを実現する（VcXsrv編）](https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html)
[VcXsrv（Xサーバー）をWindowsにインストールしLinuxのGUIをリモート操作する設定方法](https://rin-ka.net/windows-x-server/)
[WSLのデフォルトシェルが真っ白になった話(.bashrcと.bash_profile)](https://qiita.com/Minato_seagull/items/a27263f1432e58f5518d)
iOS14で位置情報を取得する

# 前書き
iOS14では、CoreLocationの仕組みが一部変更された。それにより、[authorizationStatus()](https://developer.apple.com/documentation/corelocation/cllocationmanager/1423523-authorizationstatus)がDeprecatedになった。
今回は、iOS14環境で位置情報を取得する方法を記載します。

# プログラム
```ruby:ViewController.swift
import UIKit
import CoreLocation

class ViewController: UIViewController {
    var locationManager: CLLocationManager?
        
    override func viewDidLoad() {
        super.viewDidLoad()
        
        locationManager = CLLocationManager()
        locationManager!.delegate = self
        locationManager!.requestWhenInUseAuthorization() // ユーザーの使用許可を確認
        
        // デバイスの位置情報が有効の場合
        if CLLocationManager.locationServicesEnabled() {
            locationManager!.desiredAccuracy = kCLLocationAccuracyBest // 測位精度（最高に設定）
            locationManager!.distanceFilter = 10 // 位置情報取得間隔
            locationManager!.activityType = .fitness // ユーザーアクティビティ（フィットネス）の設定
            locationManager!.startUpdatingLocation() // 位置情報の取得開始
        }
    }
}

// MARK:-- GPS
extension ViewController: CLLocationManagerDelegate {
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let newLocation = locations.last else { return }
        let location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(newLocation.coordinate.latitude, newLocation.coordinate.longitude)
        print("緯度: ", location.latitude, "経度: ", location.longitude)
    }
}
```

## 測位精度
> - kCLLocationAccuracyBestForNavigation
    - ナビゲーションアプリのための高い精度と追加のセンサーも使用する
- kCLLocationAccuracyBest
    - 最高レベルの精度
- kCLLocationAccuracyNearestTenMeters
    - 10メートル以内の精度
- kCLLocationAccuracyHundredMeters
    - 100メートル以内の精度
- kCLLocationAccuracyKilometer
    - キロメートルでの精度
- kCLLocationAccuracyThreeKilometers
    - 3キロメートルでの精度  
    
> 引用元:[[iPhone] GPSなど位置情報をCoreLocationを使って取得](https://i-app-tec.com/ios/core-location.html)


# frameworkの設定
` 「BuildPhases」 → 「Link Binary With Libraies」 → 「＋」 → 「CoreLocation.framework」 `の手順でCoreLocation.frameworkを追加する。
![スクリーンショット 2021-05-17 9.38.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595751/0dac5c07-a0f9-6ffe-a5c4-fdd0cc32fe51.png)

# info.plistの編集
Privacyの許可を尋ねる設定を追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595751/0799efca-0511-b58c-0dcf-977788434ada.png)

```ruby:直接編集
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
...
	<key>NSLocationWhenInUseUsageDescription</key>
	<string>App uses Loacation data</string>
...
</dict>
</plist>
```

# 動作確認
1. Simulatorを起動
1. デバッグエリアの「Simulate Location」の矢印を選択
1. ロケーションを選択したら対応した位置情報を取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595751/f153b990-941c-d107-3f4e-c6cd494cc232.png)

# 参考文献
https://i-app-tec.com/ios/core-location.html

https://zenn.dev/johiroshi/articles/bb3689d7723ee1
PythonでCDFのグラフを書く

CDFはNumpyのcumsum関数を使うと書ける
[numpy.cumsum — NumPy v1.20 Manual](https://numpy.org/doc/stable/reference/generated/numpy.cumsum.html)

```python:
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt

# 正規分布の作成
x = np.linspace(-10,10,100)
y = norm.pdf(x,0,1)

# CDFの作成
CDF = np.cumsum(y) / np.sum(y) # sumで割ることで0~1に収まる

# グラフの描画
fig = plt.figure(figsize=(6,4))
ax = plt.subplot(111)
ax.plot(x,y,label='PDF')
ax.plot(x,CDF,label='CDF')
plt.legend(loc='upper left',fontsize=12, fancybox=False,edgecolor='black')
fig.show()
```
![CDF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304572/5acb4b31-55b2-5b4e-503e-a8078d425b3c.png)
子供がボイスチャットありのゲームをする時うるさすぎるので micro:bit (v2) で警告を出してみる

子供が友人とボイスチャットしながらゲームしてる時の声がうるさすぎる。「声大きい」としばしば注意しているがこちらもめんどう、あちらも言われるのが煩わしい。めんどうなことは人間がやらない方が良い。なんらかのデバイスに警告させてほしいなと思っていたところ、マイクとスピーカーを搭載した micro:bit v2 が家に転がってたので簡単なプログラムを書いてみる。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742/11af91b1-1f82-b197-4e80-f17f485cf341.png" width="600px" />

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742/8800e89e-3fbf-51b9-3d15-6607560c88c5.png" width="600px" />

MakeCode https://makecode.microbit.org/ を開き、多少リファレンス https://makecode.microbit.org/reference なんかを眺めながら適当にブロックを組み合わせるだけで目的とするプログラムが書けた。ブロックで書いたものと JavaScript のコードが連動してるというのも「つまりこれどういうことだ？」と思ったときに調べやすくて良い。

GitHub でサインインするとリポジトリを作成しプロジェクトのウェブページを作るところまでサクッとやってくれるなどいたれりつくせり。

<https://hogelog.github.io/microbit-no-loud-voice/>

micro:bit v2 もすごいし MakeCode もすごいなあ。

肝心の子供の大声防止の効果は……多少気づいて抑えたりしてるシーンもあったが、まあ大声を出す時は熱中してる時なのでなかなか難しい。micro:bit v2 のスピーカーで鳴らせる音色や音量には限界があるので、スピーカーをつなぐなりなにかしらでもうちょっと注意をひけるようにして改善していきたいところ。
macOSにqpdfをインストール

Homebrewで入るそう．

```
brew install qpdf
```

---

[qpdf](https://github.com/qpdf/qpdf)をM1 MacBookにインストールする．

- OS: macOS Big Sur(Version 11.2.3)
- Homebrew 3.1.7
- qpdf v10.3.2

# 手順

(1) 以下のURLから最新版のリリースをダウンロードする．

https://github.com/qpdf/qpdf/releases/

(2) tar.gzを展開する．

```
cd ~/Downloads/
tar xvf qpdf-10.3.2.tar.gz
```

(3) includeにsymlinkを作成する．

```
cd /usr/local
sudo ln -s /opt/homebrew/include/ include
```

(4) インストールする．

```
cd ~/Downloads/qpdf-10.3.2/
./configure
make -j $(nproc)
make install
```

(5) インストールできたか確かめる．

```
$ which qpdf
/usr/local/bin/qpdf
```
League\CSVでCSV作成

# League\CSVでCSV作成する方法について

## 概要
[League\CSV](https://csv.thephpleague.com/)でCSV作成する際のモジュールになります。

## プログラム
よく利用する`BOM付きUTF-8`と`SJIS-win`で作成する機能をそれぞれ定義しています。

```php
<?php
namespace App\Services\Common;

use League\Csv\CharsetConverter;
use League\Csv\Writer;

class CsvService
{
    /**
     * BOM付きUTF-8のCSV作成
     *
     * @param string $filePath
     * @param array $records
     * @return string
     */
    public static function createWithUtf8(string $filePath, array $records)
    {
        if (!empty($records[0]) && !empty($records[0][0])) {
            $records[0][0] = "\xEF\xBB\xBF" . $records[0][0];
        }
        $writer = Writer::createFromPath($filePath, 'w+');
        $writer->insertAll($records);
        return $filePath;
    }

    /**
     * SJIS-winのCSV作成
     *
     * @param string $filePath
     * @param array $records
     * @return string
     */
    public static function createWithSjis(string $filePath, array $records)
    {
        $writer = Writer::createFromPath($filePath, 'w+');
        $encoder = (new CharsetConverter())
            ->inputEncoding('utf-8')
            ->outputEncoding('SJIS-win');
        $writer->addFormatter($encoder);
        $writer->insertAll($records);
        return $filePath;
    }
}
```

### 解説
ExcelでUTF-8と認識させる方法として、BOM付きUTF-8で保存するために以下を入れています。

```php
if (!empty($records[0]) && !empty($records[0][0])) {
    $records[0][0] = "\xEF\xBB\xBF" . $records[0][0];
}
```

## 使い方
以下のような形でファイルパスとcsvの中身を渡せば利用できます。

```php
<?php
namespace App\Services\Csvs;

use App\Services\Common\CsvService;

class TestCsvService
{
    public function create()
    {
        $filePath = '/var/www/html/app/storage/test.csv';
        $records = [
            ['No', '氏名'],
            [1, 'テスト太郎'],
        ];
        return CsvService::createWithUtf8($filePath, $records);
    }
}
```

## 参考
- [【Laravel】Storage機能で保存したCSVをExcelで文字化けさせない方法](https://blog.websandbag.com/entry/2018/05/06/161613)
ドキュメントとレファレンスの違い

## 概要

GCPを触っていて、ドキュメント(documentation)とレファレンス(reference)の違いがわからなかった。

日本語で調べても出てこなかったので英語から。


## Documentationとは

公式が発行しているもの。

取扱説明書的なものだと理解した。

ライブラリのドキュメントとは、これをさす。

## Referenceとは

API Referenceのこと。API用の取扱説明書だと理解。

Documentationの一種とも見なすことができる。つまり、APIのDocumenationをさすと理解した。

特に、使用例はなく、APIのメソッドやクラスについて、構造的に、体型的に説明したものが多いらしい。

* API = Application Programming Interface。

## そもそも

APIとライブラリは違う。

API = それ単体で動くもの。既存のシステムを簡単に動かすことができるようになる。

ライブラリ = 関数やクラスをディレクトリにまとめたもの。


## 引用・参考

- https://www.quora.com/Whats-the-difference-between-documentation-and-API-reference

- http://pgpg-sou.hatenablog.com/entry/2013/10/17/014053

- https://www.sejuku.net/blog/7087
Slurmで1nodeに複数のジョブを詰め込むPartitionと1nodeに複数のジョブを詰め込みできないPartition(ノード専有)を共存させる方法

やりたいこと
=========================

Slurmにおいて、下記のように1nodeに複数のジョブを詰め込むPartitionと1nodeに複数のジョブを詰め込みできないPartitionを共存させたい。

この例だと、以下のようになっている。

- PARTITION名; cpu_queueのは1ノードに複数のジョブを詰め込み可能
    - 以下の例ではcompute01に2ジョブ投入されていることがわかる。
- PARTITION名; gpu_queueのは1ノードに複数のジョブを詰め込み不可
    - 以下の例では必ずジョブがノードを専有している。


```bash:command
$ squeue
 JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON) 
  1946 cpu_queue    test1 xdu-0590  R       0:03      1    compute01 
  1947 cpu_queue    test2 xdu-0590  R       0:00      1    compute01 
  1949 gpu_queue    test3 xdu-0590  R       0:00      1        gpu01 
  1950 gpu_queue    test4 xdu-0590  R       0:00      1        gpu02
  1951 gpu_queue    test5 xdu-0590  R       0:00      1        gpu03
```


実現方法
=========================

slurm.confに下記を追記する。

`SelectType`と`SelectTypeParameters`の指定

```bash:command
SelectType=select/cons_tres
SelectTypeParameters=CR_CORE
```

`PartitionName`にて`OverSubscribe`の設定

```bash:command
PartitionName=gpu_queue Nodes=gpu[01-08] Default=Yes MaxTime=INFINITE State=UP OverSubscribe=Exclusive 
PartitionName=cpu_queue Nodes=cpu[01-16] Default=Yes MaxTime=INFINITE State=UP OverSubscribe=YES
```

変更したslurm.confの適用方法
==========================

- 変更した、slurm.confはかならずすべてのノードで更新し、slurmctldとslurmdをstop/startしてください(restartでなくてstop/start)。
- pdshがインストールされていることを前提としています。
- 以下の例では、slurmctldを起動しているホストにおいても、debugキュー(Partition) としてslurmdを起動していることを前提としています。実際の対象ノードは環境に応じて変更してください。

変数の定義
-----------------

```bash:command
# 変更させたいslurm.confの雛形。すべてのノードからアクセス可能なこと
SHARED_CONF="/scratch/slurm.conf.tmp"
# 反映先(実際のslurm.conf)
SLURM_CONF="/etc/slurm/slurm.conf"
# pdshで実行するノード
NODE="lssr630-cs[01-08],dellc6525-cs[01-04],lssr630-hs04"
```

slurm.confの更新
----------------------------

```bash:command
# slurm.confのバックアップ
sudo pdsh -w ${NODE} "cp ${SLURM_CONF} ${SLURM_CONF}.bak$(date +'%Y%m%d%H%M%S')"
# 編集済みslurm.confのコピー
sudo pdsh -w ${NODE} "cp ${SHARED_CONF} ${SLURM_CONF}"
# 変更確認
sudo pdsh -w ${NODE} "cat -n ${SLURM_CONF} | grep -Ev '^\#' | grep -e SelectType -e OverSubscribe"
```

slurmctld, slurmdの再起動
----------------------------

slurmctldだけでなく、slurmdの更新も忘れないこと

```bash:command
# slurmctldとslurmdの停止
sudo systemctl stop slurmctld
sudo pdsh -w ${NODE} "systemctl stop slurmd"
# slurmctldとslurmdの起動
sudo systemctl start slurmctld
sudo pdsh -w ${NODE} "systemctl start slurmd"
```
railsを使ってきて便利だと思ったgem6選

##administrate

アドミン管理gemは有名なところで3つあると思います。rails_admin, activeadmin, administrateですね。
active adminを使ったこともありますが、administrateだったらカスタマイズできるので拡張性が高いです。その代わり、エラーやコート量が増えるので小規模の個人開発ぐらいだったらactive adminとかで事足りるのかなとも思います。どうしてもadmin側であれかしたいってことが出てくる場合がでてきてなおかつadminにリソースをかけれないって場合はadministrateを推奨したいと思います。

##mechanize

webスクレイピングをするために私は使うgemです。単純に使いやすいので使ってます笑。困ることはそんなにないのでスクレイピングはこれで十分だと思います。統合テストなので、認証だったりを行わないといけない場合ではmechanizeだと少しめんどいのでseleniumを使っていますね。

##devise

ログイン認証機能のためのgemですね。私は結構使います。特にめっちゃ困るってことはないので開発スピード上げるためにいれている感じですね。エラーとか出てきた時に、あとセッションなどの仕組みや設定を理解しているのなら使っていても問題ないかと思ってます。ログイン機能をフルスクラッチでつくれないからgemを使うって考えは非常にまずいと思います。

##kaminari

ページネーションのためのgemですね。結構有名だとは思いますが、有名なものには有名になった理由があると思います。データ多くなってくるとページネーションは必須になってくるので特に不満がなければ使ってみてください。

##rspec

テストフレームワークのrspecですが、テストコード書くんだったら入れといて間違い無いと思います。
seleniumを使った統合テストや単体テスト、結合テスト、railsにもtest機能はありますがrspec一本で十分かなと思います。

##rubocop

コードを静的解析するためのgemですが、シンプルでとても使いやすいです。制限を決めたファイルを用意してそれに順守して開発を進めるだけで一定水準のコードの保守性・可読性は保証されると思います。
【Flutter】クラスでvoid関数を引数にすると「The argument type 'Function' can't be assigned to the parameter type 'void Function()?'.」とエラーが出る

# 更新履歴 
2021.5.17 初回投稿 

# 環境 
- macOS Big Sur(11.2.3) 
- Flutter (Channel stable, 2.0.6, on macOS 11.2.3 20D91 darwin-x64, locale ja-JP) 
- Android toolchain - develop for Android devices (Android SDK version 30.0.3) 
- Xcode - develop for iOS and macOS 
- Chrome - develop for the web 
- Android Studio (version 4.1) 
- VS Code (version 1.56.0)

# 今までのコードだとエラーが出て動かない

よく使うWidgetで引数にvoid関数を入れて処理したいのですが、今までは引数の必須は@requiredで引数が関数の場合の型はFunctionでOKでしたが、引数を指定するところで、「The argument type 'Function' can't be assigned to the parameter type 'void Function()?'.」とエラーが出て動かせなくなりました。 

## 今までのコード

```dart
import 'package:flutter/material.dart';

class TestButton extends StatelessWidget {
  TestButton({
    @required this.buttonTitle, 
    @required this.buttonTap
  });

  final String buttonTitle;
  final Function buttonTap;

  @override
  Widget build(BuildContext context) {
    return TextButton(
      onPressed: buttonTap,//ここでエラーが出る。
      child: Text(buttonTitle),
    );
  }
}


```

## 動いたコード
以下のように変えたら動きました！！

・@required の@を削除
・final Function buttonTap;をfinal void Function() buttonTap;に変更

```dart
import 'package:flutter/material.dart';

class TestButton extends StatelessWidget {
  TestButton({
    required this.buttonTitle, //@requiredの@を削除
    required this.buttonTap
  });

  final String buttonTitle;
  final VoidCallback? buttonTap;
  //final void Function() buttonTap;
//Functionではなく、VoidCallback? または void Function()

  @override
  Widget build(BuildContext context) {
    return TextButton(
      onPressed: buttonTap,
      child: Text(buttonTitle),
    );
  }
}

```


## 呼び出し側

```dart

class StartScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Start'),
        actions: [
          IconButton(
            icon: Icon(Icons.menu),
            onPressed: () {
              debugPrint('test');
            },
          ),
        ],
      ),
      body: Center(
        child: TestButton(
          buttonTitle: 'testButton',
          buttonTap: () {
            debugPrint('test');
            );
          },
        ),
      ),
    );
  }
}

```
Power Apps アプリの外部ユーザー共有を試してみた

Power Apps のキャンバスアプリを、テナント外ユーザーへ共有して動作検証してみました。SharePoint Online（以降、SPO）のカスタムリストをデータソースに持つモノのみ、です。

# 検証結果
結論からお伝えすると「ゲストが Power Apps の共有に適合したライセンスを有しており、かつ関連する箇所へ権限が正しく付与されていれば動作します」です。実際の動作は下記の動画を確認ください。  


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

  
環境は全て試用環境で、Power Apps for 365 ライセンスを両者ともに保有です。左側のブラウザーがデータソース、および Power Apps アプリを保有する側のテナント。右側がゲスト側環境ですね。なお、動画に音声は含まれておりません。

# 検証の補足
左側のアプリ元ネタ環境を持っている側ですが「データソースである SPO のサイト自体に、右側のユーザーを事前にゲスト登録済み」です。SPOグループを作成してあり、グループ自体の権限は”投稿”に設定してあります。データソースのカスタムリストは権限が継承されている状態になっています。つまり、ゲストは直接SPOへアクセスして該当リストへ書き込むコトが可能な状態ですね。

ようは「アプリだけじゃなくて、アプリから利用するデータソースなどにもゲストがアクセスできないとダメよ」ってコトです。

ここらへんが動画から読み取れない方で、ゲストにアプリ共有したいと考えている方は SPO のサイト構築や権限設定まわりを把握することをおススメします。ゲスト云々に関わらず、権限まわりは知っておいて損は無いですよ。

# 参考URL
その他、外部ユーザーへの共有における前提条件などは公式情報をご確認ください。

[キャンバス アプリをゲスト ユーザーと共有する
](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/share-app-guests?WT.mc_id=BA-MVP-5004053)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/dcaf2689-5187-d226-8ae1-b56a8b0e0fc6.png)

特に、Power Apps 利用にあたりゲストに必要になるライセンスに関しては、SPO や Teams のゲストとは異なるポイントになるので注意が必要ですかね。

> - ゲスト ユーザーは、次のいずれかのテナントを通じて割り当てられたアプリの機能と一致する Power Apps 使用権のライセンスを所持する必要があります。  
>   - 共有されているアプリをホストしているテナント
>   - ゲスト ユーザーのホーム テナント

蛇足ですが、下記のセクションが「Common Data Service」表記になってますね。適宜読み替えてください。

https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/share-app-guests?WT.mc_id=BA-MVP-5004053#which-connectors-support-guest-access

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/bff41403-c51d-3a7b-0c56-c0a691b5ec46.png)


# まとめ
記事投稿時点（2021/05/17）における制約を含む、にて。

- ゲストのライセンス、および権限設定が適切であれば Power Apps の外部共有は可能
    - ただし、コネクター等で制約がある場合があるかも…<br/>(詳細は公式サイトにて確認されたし)
- ゲストを共同所有者にはできない
- アプリに加えて、データソースへゲストがアクセスできる権限設定が必要
- 認証やアクセス制限などは双方テナントのセキュリティに依存するでしょう
  - 例えば、招き入れる側が AAD P1 でゲストも制限していたら、その範囲外からは利用不可
  - なぜって？アプリの実行前には必ず認証がありますからね
- SPO以外のコネクター、データソースは検証していません
  - なぜって？現状は当方には必要無いからですね（逆に言えば必要に迫られれば検証します
  - 加えて、必要になったタイミングで VerUp してるかもしれませんからね...

SPO 以外のコネクターでデータソースが別のモノ（例えば Dataverse 等）を利用してゲストアクセスも視野に入れる際は、必ず公式情報を確認して、かつ事前に検証したほうが良いでしょうね。

それでは、皆さま。素晴らしい Power Platform Life を！
【algorithm】全探索

#はじめに
今回は、アルゴリズムの最も基本的な全探索をまとめてみたいとおもいます。

#全探索
解きたい問題に対して考えられるすべての可能性を、一つ残らず調べ上げる設計技法です。

#線形探索法
一つ一つの要素を順番に調べていく最も単純なアルゴリズムの一つ
以下のような、計算量O(N)のアルゴリズムを例とします。
`flag`をたて、存在すれば`true`にして存在するかどうかを判定します。

```swift 
let nums = [1, 5, 3, 2, 8, 9]
let checkNum = 8
var isExit = false
for i in 0..<nums.count {
    if nums[i] == checkNum {
        isExit = true
    }
}
if isExit {
    print("\(checkNum)は存在する")
} else {
    print("\(checkNum)は存在しない")
}
```

#線形探索法応用
該当する番号が、配列の何番目の要素に対応するのかを調べたいとき、以下のように、あり得ない数値を事前に格納しておき、存在すればインデックス番号iを格納する。

```swift
let nums = [1, 5, 3, 2, 8, 9]
let checkNum = 8
var isExit = false
var foundId = -1
for i in 0..<nums.count {
    if nums[i] == checkNum {
        isExit = true
        foundId = i
    }
}
if isExit {
    print("\(checkNum)は\(foundId+1)番目に存在する")
} else {
    print("\(checkNum)は存在しない")
}
```

#最小値
以下のように、すべての要素に対して`minValue`より小さな値が見つかるたびに`minValue`を更新していくと最小値を求められます。(最大値も同様のアルゴリズムです。)

```swift
let nums = [1, 5, 3, 2, 8, 9]
var minValue = 9999999999999 // 十分に大きな値にしておく
for i in 0..<nums.count {
    if nums[i] < minValue {
        minValue = nums[i]
    }
}
print("最小値は\(minValue)です")
```

#ペアの全探索
以下のような問題をも考えます。(計算量O(N^2))

```swift
"N個の整数a(0), a(1), ..., a(N-1)と、b(0), b(1), ..., b(N-1)が与えられ、
これら二つの数列から一つずつ数a(i), b(j) [i = 0, 1, ..., N-1, j = 0, 1, ..., N-1]を取り、
その和が整数R以上の範囲での最小値を求めよ。"
```

全探索して、条件、合計がRより大きいことと、その合計値が合計の最小値より小さい場合は合計の最小値を更新します。

```swift
let aNums = [9, 5, 3, 7, 8, 9]
let bNums = [3, 9, 5, 8, 3, 5]
let R = 7
var minSumNum = 10000000000000 // 十分大きな値
for i in 0..<aNums.count {
    for j in 0..<bNums.count {
        let sum = aNums[i] + bNums[j]
        if sum >= R && minSumNum > sum {
            minSumNum = aNums[i] + bNums[j]
        }
    }
}
print(minSumNum)
```

#おわりに
おわりです。
【Java】OptionalのorElseの使い方

# Optionalとは

Optionalは、``メソッドの戻り値としてnullを返す可能性があることを明示的に示したいときに使用します。``
メソッドがnullを返す可能性があるということを示すことで、
そのメソッドを利用するプログラムをより安全に実装することができるようになります。

#orElseの使い方

Optionalのオブジェクトは``nullの可能性があるオブジェクトの型を指定``して宣言します。
Optionalのオブジェクトには``ofNullableメソッドの戻り値を代入``します。
Optional.ofNullableメソッドの引数がnullの場合にorElseメソッドの引数の値を返します。
(以下の場合は「Nullです」を返します)
nullでない場合はnullではないその値を返します。

```java
String str = null;

	Optional<String> nullableString = Optional.ofNullable(str);

	System.out.println(nullableString.orElse("Nullです"));
```

Optional を使用することで以下のような null チェックをする必要がなくなり、コードを少なくできます。
また、null チェックを忘れることもなくなるので、安全に実装することが出来ます。

```java
String value = getValue();  // valueはgetValueの戻り値を取得する

if (value != null) { // nullチェックを行う

    System.out.println(value.length()); // lengthメソッドを呼ぶ

}
```

#参照
[Java Platform SE8 Optional #orElse](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html#orElse-T-)
Python3でリスト配列をソートする方法

Pythonでリスト配列を並び替える方法です



```python
num1 = int(input())
#リスト配列を定義する
data1 = []
for i in range(num1):
    num2 = int(input())
    data1.append(num2)

#非破壊配列で配列を並び替える    
data = sorted(data1)

#データを1行ずつ出力する
for i in range(num1):
    print(data[i])
```