OmniAICreator/Qiita-1.07M huggingface dataset:
pyenvでM1チップ対応のanacondaが出ていたのでMacBook Pro (M1)を初期設定

2021/12にメインマシンとしてMacBook Pro (M1)を手に入れたのですが半年間塩漬けでした。
というのも、pyenv経由でanacondaを使用したかったのですが、anaconda3-2022.05までM1 Macに対応してくれなかったからです。
これまではMacBook Pro (13-inch, 2017)を使用していたので、5年ぶりの乗り換えです。
VScodeでJupyterを使用してのPythonの環境構築がメインです。

# 環境
MacBook Pro (14インチ、2021）
macOS Monterey (12.5)

# 初めに作業する方がいいこと
・OSを最新のバージョンにアップデート
・デフォルトのアプリをApp Storeでアップデート
・使用しないアプリの削除。（ストレージの容量は十分なので何を何で消すかを考えるのにも時間がかかると思い、今回はしません。）

# 1. iTerm2
https://iterm2.com/
からインストール
ターミナルのエミュレータですが、評判いいので使用しています。今後の環境設定で使用するので初めに入れます。

# 2. Homebrew

以下の指示に従ってiTerm2からインストール
https://brew.sh/index_ja.html
その流れの中でXcode Command Line Toolsなど必要なものはインストールされる。
iTerm2内に表示される指示通り以下のコマンドを入れてパスを通す。

```
% echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/hoge/.zprofile
% eval "$(/opt/homebrew/bin/brew shellenv)"
```
今更ながらですが、マックのデフォルトシェルはzshに変わってたのですね・・。
Xcodeは確認すると12.6GBもあったので（5年前は5Gちょっとだった）、必要にかられるまで入れないことにしました。

インストール後念のため
```
% brew update # homebrew自体のアップデート
% brew doctor # 諸問題の検出
% brew upgrade # インストールしたパッケージのアップデート
```
を行う。
# 3. Python環境
Anacondaを使用したいのですが、直にインストールするとhomebrewと競合する、という話が解決されているのかわからないので、pyenvを使用して入れることにします。

## 3-1 pyenv
Pythonのバージョン管理ツールです。
以下の公式に従ってインストールします。
https://github.com/pyenv/pyenv

```
% brew install pyenv # pyenvのインストール

% echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc # パスを通す
% echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
% echo 'eval "$(pyenv init -)"' >> ~/.zshrc

% exec "$SHELL" # シェルの再起動

% brew install openssl readline sqlite3 xz zlib tcl-tk # "Troubleshootingに推奨されているsane build environmentを作るコマンド。
```
## 3-2 Anaconda

```
% pyenv install -l
```
で最新のanacondaを確認。バージョンの表記が、major/minorからyear.monthへ変更となっていたよう。anaconda3-2022.05が最新で（2022/7/29現在）M1 Macに対応したと考えられるので、これを入れる。
```
% pyenv install anaconda3-2022.05 # インストール
% pyenv global anaconda3-2022.05 # anacondaに切り替え
% pyenv versions # 切り替わったのを確認
```

必要なパッケージのインストール
```
% conda install cartopy # 地図を作図するのに必要
% conda install netcdf4 # netCDFファイルを読み込むときに必要
% conda install pandoc # markdown -> word
```

## 3-3 Visual Studio code
以下の公式からダウンロード
https://code.visualstudio.com/

機能拡張
- Japanese Language Pack for Visual Studio Code
- Python
"Select a Python Interpreter"を選択するとpyenvでインストールしたanaconda内のpythonが選択できる。
- Rainbow CSV
- zenkaku
- Git Graph
- Error Lens
- indent rainbow
- Trailing Spaces

# 4 その他
- [ZOOM](https://zoomgov.com/jp-jp/meetings.html)


- [Box Drive](https://support.box.com/hc/ja/articles/1500004479962-M1%e3%83%81%e3%83%83%e3%83%97%e6%90%ad%e8%bc%89%e3%83%87%e3%83%90%e3%82%a4%e3%82%b9%e3%81%a7%e3%81%aeBox-Drive%e3%81%ae%e3%82%b5%e3%83%9d%e3%83%bc%e3%83%88)
M1チップ用はまだパブリックベータのようです。


- [Grammarly](https://www.grammarly.com/)
リアルタイムの英文校閲ソフト。有料ですが、重宝しています。

- AppStoreでダウンロード
CotEditor
OneDrive
Toggl Track
 現在の作業にかかっている時間を表示させます。決めた時間で休憩するのに便利です。
OmniGraffle

- [Alfred](https://www.alfredapp.com/)
Linuxについて１０（自分用メモ




●RPMパッケージ
レッドハット社によって開発されたパッケージ形式。rpmコマンドを使う。
rpm オプション

インストール、アップグレード、アンインストールにはrootユーザー権限が必要
インストールするには-ivhオプションをつけて実行する。
-Uvhでアップグレード
-eでアンインストール

●YUM
yumコマンドを使い、より高度なパッケージ管理を行える。特徴としては
・パッケージをインターネット上で検索できる
・必要なパッケージをインターネット上から自動的にダウンロードできる

●パーティションの操作　rootのみ
fdisk デバイスファイル名

※既存のパーティションに対して、パーティションサイズを変更したり、パーティションを削除したりすると、記録されているデータが失われるので注意。

●ファイルシステムの作成
mkfs ［-t ファイルシステム］　デバイスファイル名

●マウントを実行
mount デバイスファイル　マウントポイント

マウントポイントはデバイスを接続するディレクトリのこと。

●/etc/fstabファイル
マウント情報が設定されている。頻繁に使用するデバイスについては/etc/fstabに記載することにより、デバイスファイル名かマウントポイントを指定するだけでマウントすることができるようになる。

ファイルシステム内のディレクトリ以下にどのようなディレクトリやファイルを配置するかについては、FHSとして標準化されてきている。
2-Tag System but it's in TypeScript type system (TypeScriptの型システムで2-タグシステムを動かす)

```Typescript
type Rule = {[_ in string]: string}

/*
R: Rules
L: STOP character
W: Word
Out: Output
*/
type TagSystemSteps<R extends Rule, L extends string, W extends string, Out extends string[]=[]> = 
  W extends `${infer F}${infer _}${infer Rest}`?
    F extends L ? 
      [...Out, W]
      : R[F] extends `${infer O}`?    
        TagSystemSteps<R, L, `${Rest}${O}`, [...Out, W]> 
        : unknown
    : [...Out, W]

type TagSystem<R extends Rule, L extends string, W extends string> = 
    [0, ...TagSystemSteps<R, L, W>][TagSystemSteps<R, L, W>["length"]]
```

# Usage (使い方)
```Typescript
/*
* Rules:
*  A -> BH
*  B -> A
*  H -> *STOP*
*  
* Initial Word: ABB
* (ABB -> BBH -> HA)
*/

type TagSystemOut = TagSystem<{"A": "BH", "B":"A"}, "H", "ABB"> // "HA"

type TagSystemStepOut = TagSystemSteps<{"A": "BH", "B":"A"}, "H", "ABB"> // ["ABB", "BBH", "HA"]

/*
* Rules: Same
* 
* Initial Word: ABBB
* (ABBB -> BBBH -> BHA -> AA -> BH -> A)
*/
type TagSystemStepOut2 = TagSystemSteps<{"A": "BH", "B":"A"}, "H", "ABBB"> // ["ABBB", "BBBH", "BHA", "AA", "BH", "A"]
```

# Playground
https://www.typescriptlang.org/play?ssl=28&ssc=33&pln=28&pc=73#code/C4TwDgpgBASgrgG2gXigbwNoH0oEsB2UAzsAE4EDmAugFzFmUC+AUMwPQBUzMd8SRzADJ0AygBUA8gAUoAYwAWAQ1KLZwCKWYB1OloD2pACbMJcYHVPAwZ5hzbNQkKGMUURIEhAC2I9WCIAPDBQEAAe6viGRLCIEAA0UIIh4RCR0STk+BQJWskRUfSZ2VCWeakFGZQYVMjVAHxQqMxQULlh+dEABgAkaAQAZhpQAGKMvQNDWGN9+IOksBAkjJ0A-M0tI2VpiVArUOsbUBgAdKeWOVQHG7wYw1RbBT0zcyXLextXhy5uHuo+foEYAlBAknjBFsBphJlgkTmczBcGp9rlA4PgANb4PQAd3wVzocOO51alwc4Gg33cni8QQe0T48R27XK6QYWRydMKlAaTUOGAADAlTsdKb9vL4IP4gsCcnUqBhRdSJVKgYlZRgAERILLAeQaqikxwU1xUv6lVCKv4BNAagCCGroGoAQgAJDUJZ0Ou0axget0e21Op0aurMJDAKB6MzWCN0S3ec1QDUu+2sI3OE1i-6SxPx7NSm32x2u91J4M0b2+pP+pOB4Oh8P0SVEOOZpV+ROauul50lv32w3kjM-ds5swAJkaw9N4oB1u9xZrnor9qryZ7dfrYYgEc8-nHrZHf2VlknqC7QeDHsvS9d9oD97LS4HzCAA
WindowsでUbuntuをもちいてLinux開発環境を構築する 

## はじめに
windowsでubuntuを用いてhomebrew,nodebrewをインストール、nodeをインストールしてVSCodeでTypeScriptの環境構築を行うまで、調べたこと、作業したことをまとめました。
コマンドはすべて、WSL上で実行します。

## Ubuntu、Homebrewをインストール
Ubuntuとは、Linux系のOS
Homebrewとは、パッケージ管理システム

1. WSL（Windows Subsystem for Linux）の有効にする
1. Ubuntuをタウンロード、セットアップを行う
1. Homebrewをインストールする

参考記事
・[HomebrewをWindows上で使えるようにする](https://www.techgaku.com/setup-homebrew-on-wsl/)
・[【完全版】Homebrewとはなんぞや](https://zenn.dev/sawao/articles/e7e90d43f2c7f9)

## nodebrew、node.js、npmをダウンロードする
nodebrewとは、node.jsのバージョン管理ツール

1. ```brew install nodebrew``` でnodebrewをインストール
```You need to manually run setup_dirs to create directories required by nodebrew:```
の後のコマンドを実行する(何が表示されたか記録できていませんでした、ごめんなさい)
1. ```nodebrew install stable```を実行し、nodeの安定バージョンをインストール
1. ```nodebrew ls``` を実行し、インストールされているnodeのバージョンを確認
1. ```nodebrew use v18.7.0```　で使用するバージョンを選択(バージョンは各自の環境に合わせてください)
1. ```export PATH=$HOME/.nodebrew/current/bin:$PATH```　でパスを通す
1. ```node --version```
```npm --version``` でnodeとnpmがインストールできていることを確認

参考記事
・[macOS に Node.js をインストールする手順 (nodebrew編)](https://weblabo.oscasierra.net/nodejs-install-macos-nodebrew/#:~:text=nodebrew%20%E3%81%AF%E3%80%81%E4%B8%80%E3%81%A4%E3%81%AE%E3%83%9E%E3%82%B7%E3%83%B3,%E5%A0%B4%E5%90%88%E3%81%AA%E3%81%A9%E3%81%AB%E4%BE%BF%E5%88%A9%E3%81%A7%E3%81%99%E3%80%82)
・[Homebrewでnodebrew入れたらハマった](https://qiita.com/hmaruyama/items/e6d5d3d7b7d095591c47)
・[nodebrewでnodeのバージョン切り替え](https://nishimura.club/node-mismatch-in-nodebrew)

## Visual Studio CodeのターミナルをWSLにする
1. Visual Studio Codeの拡張機能、Remote WSLをインストール
1. ubuntuを起動させてログインする
1. Visual Studio CodeのターミナルをWSLにする

参考記事
・[WSL2 + Ubuntu + VSCodeでの開発環境構築](https://qiita.com/zaburo/items/27b5b819fae2bde97a3b)

## TypeScriptの環境構築
1.　以下参考記事の｢1-2. TypeScript環境構築｣を参照

参考記事
[github](https://github.com/deatiger/ts-basic-demo/tree/feature-basic-types)
そろそろSE・PG採用は理系卒がいいのか決着をつけよう。

# はじめに
本記事は当方の主観に基づくものであり、特定の個人や団体を誹謗中傷する意図はありません。

「この人はこんな風に思ってるんだ～」ぐらいの感覚で見ていただければ幸いです。

# テーマ
『SE・PG[^1]の新卒採用において、文系卒よりも理系卒がいいのか』

# 結論
「SE・PG」と聞くと一般的には理系のイメージを持っている人が多い印象があります。

確かに、自分も初めてSEやPGといった職業を知った時は「The・数学！」といったイメージを持っていました。

エディタやターミナル上に羅列された英単語や数式を見ると、どうしても理系のイメージが定着してしまいます。

よく洋画の中で、ハッカーが小難しいことを言いながら高速でタイピングしている様子もSE・PG ＝ 理系と思わせる要因の一つだと思います。

しかし、実際に触れてみると一概に理系とは言えないようです。

先に結論から申し上げます。
<font color="Red">**ほぼ理系・文系関係ありません。**</font>

「え、関係ないの？"ほぼ"って何？」と思った方に向けて、以降はこの結論に至った理由を定量的に見ていきましょう。

# 前提条件

SE・PGと言っても業種によって、多岐にわたって枝分かれしています。

例を挙げると、アプリケーション開発やWebサイト開発、ゲーム開発、データベースの設計・管理、インフラ、etc...

本記事では書ききれないほどの種類があるわけですが、結論を出す上では「どの職種に就くか」といった前提を決めることが必須になります。

先述した"ほぼ"という表現を深掘りしていきます。

# 業種における比較

例えば、Webサイトを開発する場合、HTML、CSS、JavaScriptといったプログラミング言語[^2]を用いて開発を進めますが、仕組みや言語の記法・文法を覚えてしまえば開発に問題がないため、覚えるといったプロセスが最初に重要になります。

もちろん数学的な要素が全く必要ないわけではありませんが、幸いにも言語を開発した先人のおかげで難しく考えることなく実装できます。

より具体的に言うと、平方根を求める場合、一から考えなくても最初から備わっている組込関数を使うことで簡単に実装できます。
※実際のWeb開発で平方根を求めるような処理をすることは少ないです。
　レイアウトに基づいてコンテンツを配置していくことが圧倒的に多いです。
~~~javascript
//JavaScript
// 16の平方根を求める。
Math.sqrt(16);
>> 4
~~~
簡潔に書くことができました。

このように最低限の数学的な知識を具現化することは、さほど苦ではありません。
この点においては文系だろうが理系だろうが有利不利はありません。

では、次に顔を認証するシステムを開発する場合の一部を見てみましょう。
~~~python
# Python

import insightface
import cv2 
import numpay as np
#省略

cascade = cv2.CascadeClassifier('****/haarcascade_frontalface_alt2.xml')

ret, frame = capture.read()
frame = cv2.resize(frame, (int(frame.shape[1] * 0.6), int(frame.shape[0] * 0.6)))
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

#省略
similarity = np.dot(feat1, feat2) / (np.linalg.norm(feat1) * np.linalg.norm(feat2))

#まだまだ続く...
~~~

これはほんのごく一部ですが、Webサイト開発同様に覚えることはもちろん、ロジックが一番に重視されます。
一つ一つを分解して読み解くとシンプルな構成になっていますが、なぜその処理が必要かという裏側には数学を理解していなければなりません。

上記のプログラム内にはコサイン類似度を実装している箇所がありますが、なぜコサイン類似度を使うのかというと、下記の流れがあったためです。

・カメラに映った顔が登録されている人かどうか知りたい。
　→どれくらい似ているかを算出して閾値を超えた場合、本人とみなす。
　　→どれくらい似ているかを算出するためにコサイン類似度を使う。

といったように、その数式がなにを表しているかという数学そのものの考えに基づいています。

このように開発対象によって数学的な知識が必要か否かは分かれると言えます。
そういった意味で言うと、理系が有利と言えるでしょう。

しかし、文系が全く不利というわけではありません。

あくまでも私が言いたいことは
#####  既に理解していることは有利だが、後からであっても理解すればそれでいい。
ということです。

# おわりに

本記事を執筆した背景として、文系卒の方から情報系の職種に就きたいけど、
ハードルが高く感じるとの相談を受けることが多々あったため、
これから情報系の職種に就きたい方の励みになれば幸いと思い執筆しました。

　
　

#### 注釈
[^1]:SE：システムエンジニア、PG：プログラマーを指す。
[^2]:筆者が思う一般的なフロントエンドの言語。
PHPやJavaでもできるだろ！とお考えの方もいるかもしれませんが、説明を煩雑にしうるので省きました...あしからず。
動作環境以外で収集した画像を学習データとして判別対象を認識する

# やりたいこと
以下のテキストでは、AIを用いた画像認識により対象物を分類し、ロボットアームにより仕分けを行っています。
- [DOBOT Magician AIｘ画像認識ｘロボットアーム制御](https://afrel.co.jp/product/dobot/education-product/)

上記テキストでは、仕分けを行う環境上で判別する対象物の学習データの収集を行っていますが、AIによる画像識別では、実動作環境以外で収集した画像データを学習に含めることもあると思います。

今回は、スマホのカメラで撮影した実動作環境ではない画像を学習データとし、判別が可能かを検証しました。

:::note
前提条件
- 以下の記事で修正したプログラムを使用し、カメラ画像全体を学習済モデルに入れて、判別結果を出力する形式を取っています。
    - [カメラ画像全体から判別対象を認識する](https://qiita.com/shimamotosan/items/d3a06e834d332b914973)
- 対象物を置く位置（＝DOBOTが対象物を拾いに行く座標）は固定
    ※ 切り出しをしない（領域を取得しない）ので対処物のカメラ座標が取得できないため
:::

# できたもの
## 判別対象
今回は対象物として、3種類の板ガムを使用しました。
学習データとして、以下のような画像を各種30枚程度集めました。
<p>
<img width=20% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145092/cbfe5cf1-7357-b2ac-f633-71e7006a1b57.jpeg">
<img width=20% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145092/f8ebbf36-08c8-ddf0-0ec1-85aa589ab80e.jpeg">
<img width=20% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145092/63a01762-5c71-bada-86cf-8c925556979b.jpeg">
</p>

## 動作
問題なく判別は出来ていますが、やや確率が低めです。
学習データを増やすことで改善できるかもしれません。

<img width=70% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145092/cc53958d-c1db-ec90-581a-4e602c4cded1.png">
<img width=70% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145092/767c5416-585b-7b31-5281-abf4582e15de.png">
<img width=70% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145092/21d7e855-8977-01e1-83a9-d76ab5a88ea0.png">


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


# プログラム
撮影した画像の拡張子がjpgだったため、jpg画像も学習データとして読み込めるように以下の部分を追加しました。
（元々のプログラムではpng画像のみ）

```diff_python:train.py
+ print("png : ", len(glob.glob(dir1 + "/*.png")))
+ print("jpg : ", len(glob.glob(dir1 + "/*.jpg")))
  files = glob.glob(dir1 + "/*.png")
+ files += glob.glob(dir1 + "/*.jpg")
  random.shuffle(files)
```
SketchfabForUnityでエラー出た時の解決方法



これをオフにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195953/cdf9b8f5-93d1-1630-e395-bd93737d5516.png)


以上。


あとはURP、HDRPの時はマテリアルがピンクエラーになるけど
Edit-Rendering-conver~~　やったら一発で治るよ。

それでも真っ白の場合たまにあるんやけど
その時は、Textureがはがれてる状態やから
以下の画像の BaseMapに、必要なTextureを入れてあげれば解決するよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195953/c365ec18-cdb2-66d3-9928-93e8dd5377e9.png)
Ubuntuにpyrougeをインストールする方法

Ubuntuにpyrougeをインストールする方法を記述します。

```
git clone https://github.com/bheinzerling/pyrouge  # 今回インストールするpyrouge（perlで書かれたROUGE-1.5.5のラッパー）
git clone https://github.com/andersjo/pyrouge.git rouge  # ./rouge/tools/ROUGE-1.5.5がperlで書かれたROUGE-1.5.5であり、↑で利用する
cd pyrouge
pip install -e .
pyrouge_set_rouge_path /**absolute_path**/rouge/tools/ROUGE-1.5.5
python -m pyrouge.test
```
テストの結果
`FAILED (errors=3)`
となると思われるので、以下のように修正します。
```
cd ../rouge/tools/ROUGE-1.5.5/data/WordNet-2.0-Exceptions/
rm WordNet-2.0.exc.db # このファイルが存在する場合のみ
./buildExeptionDB.pl . exc WordNet-2.0.exc.db

cd ../
rm WordNet-2.0.exc.db # このファイルが存在する場合のみ
ln -s WordNet-2.0-Exceptions/WordNet-2.0.exc.db WordNet-2.0.exc.db
```
（参考: https://github.com/bheinzerling/pyrouge/issues/14#issuecomment-351642652）
これでテストのエラーが解消され、pyrougeが動くようになります。
AzureKeyVaultの論理的な削除機能について

# はじめに

KeyVaultはデフォルトで論理削除が「有効」になっており、消去保護を有効にしてした場合設定した期間が過ぎるまでKeyVault自体が消せない仕様となっている。

# KeyVaultをポータルから作って消してみる

論理的な削除が有効になっており、保持する期間は7日～90日の範囲である必要があるようです
消去保護は無効にチェックして作りましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/fe1827c1-3169-622c-20bc-5e71974e5ae8.png)

作ったKeyVaultを消してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/6e37fb37-7d5c-06c0-db9c-f3ba5a262347.png)

同じ名前でKeyVaultを作ろうとすると、同じ名前のKeyVaultは使えないといわれてしまう。さて困った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/3e9c3e79-1678-5cb7-b84d-379d3fd80ad1.png)

論理削除されたキーコンテナーを消すにはCLIを使うしかない

```
az keyvault purge -n <<KeyVaultName>>
```

# 論理的な削除を無効にしては作れない

CLIを使うことで論理的な削除を無効にして作れるんじゃないか？

```
az keyvault create --resource-group <<ResourceGroupName>> --location japaneast --name <<KeyVaultName>> --enable-soft-delete false
```

実行すると以下のメッセージがでて、論理削除はfalseにできないよ。とのこと。実際にできたKeyVaultも論理削除が有効でした。

```
"--enable-soft-delete false" has been deprecated, you cannot disable Soft Delete via CLI. The value will be changed to true.
```

ということで、作り直すときにpurgeするひと手間を入れるしかなさそうですね。。。残念。
プリンタ

印刷する装置。
ディスプレイの色はRGB(Red,Green,Blue)
プリンタの色はCMYK(Cyan,Magenta,Yellow,black)

# プリンタの種類と特徴
## ドットプリンタ
印字ヘッドに多数の```ピン```が内蔵されている。そのピンで```インクリボンを打ち付ける```ことによって印字する。
物理的にピンを叩きつけるなので```音が大きい```。
品質もあまり```高くない```。
```伝票印刷に使用```されるため```事務処理分野```では重宝されている。

## インクジェットプリンタ
```直接インクを吹き付けて```印刷する。
にじみなど印字先の紙質に```左右される```ことはある
音は```静か```かつ```高速```。
```安価```にできるので```個人用途```として普及している。
```写真並みの高画質```印刷を可能としている。

## レーザプリンタ
```レーザー光線を照射```することによって感光体に１ページ分の印刷イメージを作成。そこに```付着したトナーを紙に転写```する。
非常に```高速```、音も```静か```。
インクが```滲むようなこともなく高品質```な印字結果を得る。
```ビジネス用途```として普及している。

# プリンタの性能指標
プリンタの性能は印字品質とその速度によって評価できる。
## プリンタの解像度
印字品質を測る指標が```解像度```。
１インチあたりのドット数を```dpi(dot per inch)```を用いる。
この値が大きいほどきめ細かい表現ができる。

## プリンタの印字速度
```1秒間に何文字印字できる```かを表す```cps（character per second)```
```１分間に何ページ印刷できる```かを表す```ppm(page per minute)```
プリンタの印字方式に最適な方を選ぶ。
ドットインパクトプリンタをCPSで性能を表す。
レーザープリンタをPPMで性能を表す。

# 問題を間違えた時の気づき
６００dpiで入力、３００dpiで出力されると元の画像から半分の面積で表示されると思っていた。
それは２つのドットに対して１つのドットで表現すると思っていたからだ。
しかし考えてみるとどうすれば２つのドットに対して１つのドットで表現できるのだろうか？
回答を見てみると
入力に合わせ画像を大きくして300dpiで表現している。
結果４倍になる。
入力と出力の解像度に差があると大きくなることを知った。
逆に小さくなることもあるのだろうか？
【Vivado】SimulationでSourcesのファイルが参照できなくなったとき

いつの間にかSimulationでのDesign Sourcesの参照が消えていたらしく、[Run Simulation]をするとelaborateで以下のようなerrorを吐いた。

```
ERROR: [VRFC 10-2063] Module <floating_point_v7_1_12> not found while processing module instance <inst> 
```

Sourcesタブで確認すると以下のような感じ。なぜかxil_defaultlibを見に行っており、確かに参照できていなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214706/d8351b81-9120-5128-c505-7ae62d48de9b.png)

[Tools]>[Project Setting/Simulation]>[Advanced]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214706/3b27db9e-4b00-b4ea-11ee-a05562820087.png)

これが外れていることが原因だった。（何故？）とりあえずこれに✓で解決する。
【CSS】テキストの両端揃え（均等割り付け）と禁則処理

## やりたいこと

- 紙デザインのようにテキストボックスの右端のラインをきれいに揃えたい
- 変なところで改行されないように禁則処理も施したい
- 領域をはみ出す連続記号や長い文字列に対する改行処理対策

## 結論

```markdown:CSS
text-align: justify;
text-justify: inter-ideograph; /* Edge */
line-break: strict;
word-break: break-word;
overflow-wrap: break-word;
word-wrap: break-word;
```

## プロパティの解説

### text-align: justify;

`text-align` プロパティで水平方向の配置を両端揃え（均等割り付け）にします。

### text-justify: inter-ideograph;

IE・Edgeでは、`text-align` プロパティに値「`justify`」を指定しただけでは両端揃えになりません。

英語のような「単語が空白文字で区切られる言語」であれば両端揃えになります。

しかし、日本語のような「単語が空白文字では区切られない言語」は両端揃えになりません。

日本語文字だけしかない行も含めて両端揃えにするには、`text-justify` プロパティを併記する必要があります。

### line-break: strict;

`line-break` プロパティで句読点や記号を用いた場合の禁則処理を設定します。

### word-break: break-word;

領域をはみ出す連続記号や長い文字列（半角英数やURLなど）に対して改行処理を指定します。

「`word-break: break-all;`」では、一切の禁則処理が解除されるため、単語の途中や括弧の直前・直後で折り返したり、句読点が行頭にきてしまうことがあることから好ましくないとされています。

<details><summary>心の声</summary>
どうにもこうにもならないときに最終手段として使ったりはします（ごめんなさい）
</details>

### overflow-wrap: break-word;

単語の途中で折り返さないと行ボックスの幅からはみ出してしまうときのみ、改行処理を施します。

単語の途中で折り返しが発生するのは、はみ出してしまうときのみなので、**可能な限り禁則処理が保持され、可能な限り単語途中での折り返しを避けることができます。**

### word-wrap: break-word;

`word-wrap` プロパティから `overflow-wrap` プロパティへ改称されました。
`overflow-wrap` プロパティに未対応のブラウザの後方互換性のために`word-wrap` プロパティの指定も併記しましょう。

## 参考ページ

https://onebitious.net/prohibition/

https://allabout.co.jp/gm/gc/24009/

https://developer.mozilla.org/ja/docs/Web/CSS/line-break

https://lucklog.info/break-word-break-all/

https://developer.mozilla.org/ja/docs/Web/CSS/word-break

https://w3g.jp/blog/confusing_word-break_word-wrap

https://qiita.com/akane_kato/items/2b1385574e1a1babdde1
【Rails】chartkickのlinechart、Y軸を反転させるオプション

# はじめに
chartkickでline_chartを実装してランキング表示をしてましたが、知らんうちにY軸反転が効かなくなってました。
自分の環境ではchart.jsの仕様変更っぽかったので、メモしておきます。


# 環境
- Rails 5.2
- Ruby 2.7.6
- chartkick (4.2.0)


# 変更点

```
library: { scales:{ yAxes: [{ ticks: { reverse: true, } }] } }
```

で動いていたのが、2022年7月に動かなくなってましたが、

```
library: { scales:{ y: { reverse: true} } }
```

で動くようになりました。

……最初からこうしておいてくれよ！ｗ


終わり
R pheatmapで色々指定する

### やること

Rのパッケージpheatmapはmatrixを突っ込むだけでもheatmapを作ってくれる便利な関数ですが、ラベルや色などを指定することでよりいい感じになります。
一方で、パラメータの指定は中々勘ではできない仕様なので、軽くまとめます。
![pheat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446050/f92d5031-48b0-0321-3902-a94e28b191fe.png)
(色々指定したheatmap)

### データ

デフォルトでインストールされているirisからサンプリングして使います。
irisは三種類の花の花弁やがくについてのデータです。
上図のように、pheatmapでは複数のラベルを表示できるので、今回は花の種類(Species)に加えて、適当にLotというラベルをつけてみます。

実際にデータを整形していきます。
```r
library(tidyverse)
set.seed(1)
N <- 3
# 各種から3データ(計9データ)を3回に分けて取得
iris2 <- iris %>% 
  group_by(Species) %>% nest() %>%
  mutate(
    sample=map(data,~{
      bind_rows(
        .x[sample(50,N),],
        .x[sample(50,N),],
        .x[sample(50,N),],
        ) %>%
        mutate(Lot=rep(paste0('Lot',1:3),each=N))
      })
  ) %>%
  select(-data) %>%
  unnest(sample) %>%
  ungroup() %>% 
  as.data.frame()
rownames(iris2) <- paste0('s',1:(N*3*3))
# s1~s27のデータ番号をrownamesに与える
```
![screenshot 2022-07-29 15.34.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446050/9f1d712e-a179-9acd-c57b-e43c58790233.png)


### 色々指定する

##### 1. heatmapにする相関行列
```r
df <- iris2 %>% select(-Species,-Lot) %>% as.data.frame()
co <- cor(t(df))
diag(co) <- NA
# 対角成分は必ず1となり、見る必要はないのでNAにしておく
```

##### 2. annotationを指定するオブジェクト
```r
anno <- iris2 %>% select(Species,Lot)
```
annoのrownamesには、corのrownames, colnames(もしくはどちらか一方)に対応するインデックスが入っている必要があります。
今回はcorとannoの両方に、iris2で与えたs1~s27が残っているので、selectするだけで大丈夫です。

##### 3. annotationの色を指定するオブジェクト
```r
pal1 <- ggsci::scale_color_d3('category10')
pal2 <- ggsci::scale_color_tron()
col.species <- pal1$palette(3)
col.lot <- pal2$palette(3)
# カラーコードのベクトルを作成しているだけなので、以下のようにシンプルに手打ちでもいけます
#　　col.lot <- c("#FF410DFF","#6EE2FFFF","#F7C530FF")

names(col.species) <- unique(iris$Species)
names(col.lot) <- paste0('Lot',1:3)
# names属性にannoの要素を与える
anno_color <- list(
  Species = col.species, 
  Lot= col.lot
  )
# annoの列名に対応する名前をnamesに
```
![screenshot 2022-07-29 15.53.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446050/6f6f73f0-02e4-8f04-49fd-57eeb6588a14.png)
こんな感じ  

##### 4. ヒートマップを描く
```r
pheatmap::pheatmap(
  mat = co, 
  color = viridis::viridis(256),
  annotation_row = anno, 
  annotation_col = anno,
  annotation_colors = anno_color, 
  border_color='gray',
  cellheight = 10,
  cellwidth = 10
  )
```
annotationもろもろの他に、ヒートマップの色、格子の色、cellのサイズを指定しました。

![pheat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446050/f92d5031-48b0-0321-3902-a94e28b191fe.png)
再掲。
SpeciesとLotの相関に与える影響の違いが一眼でわかるので、アノテーションがあるだけで大分違います。
今回は相関行列を使ったので、行と列のラベルが一致していますが、annotation_row、annotation_colに与えるオブジェクトを別々に作成することで、対象ではないmatrixについてもアノテーションが可能です。
◇Windowsのバッチファイルでトーストを使って通知する

# ◇トーストを使って通知する

![Toast.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588934/5a80e27e-ff14-5b64-f3f4-dea4b3ed7504.gif)

トーストを利用するとバッチを終了し閉じたあとでも通知に記録を残すことができます。
ＰｏｗｅｒＳｈｅｌｌで実現できます。

## トーストによる通知を行うサンプル

```
@echo off


set ToastMsg=\"バッチファイルからトースト通知します。`n行数も増やせます`n1`n2`n3`n4\"
PowerShell.exe ^&{$m=%ToastMsg%;$a='%comspec%';$t=[Windows.UI.Notifications.ToastNotificationManager,Windows.UI.Notifications,ContentType=WindowsRuntime]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType,Windows.UI.Notifications,ContentType=WindowsRuntime]::ToastText01);$t.GetElementsByTagName('text').Item(0).InnerText=$m;[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($a).Show($t);}


echo Message Strings.
echo.
echo %ToastMsg%
echo.


:: 終了処理（エクスプローラーから起動されていた場合はPauseする）;
:EndProcess
echo %cmdcmdline%|find /i "%~f0">NUL
if %ERRORLEVEL% equ 0 (pause)
goto :eof
```

Powershellをバッチに埋め込もうとしないで使う場合はもっと色々なことができるのですが、バッチ一行でシンプルにするためメッセージのみです。
※サンプルではメッセージ文を編集しやすくするため、２行に分けています。

メッセージ文 は、```「\”」``` で括ります。```「`n」```で改行ができます。


# おわりに

他にも「[⧉Windowsのバッチファイルのテクニックをご紹介します][]」にてご紹介させて頂いております。
お時間ありましたら覗いてみてください
お粗末様でした。

https://github.com/Aromatibus/

[⧉Windowsのバッチファイルのテクニックをご紹介します]: https://qiita.com/aromatibus/items/12fa4775f38c9889a686
【2022年】GA4のAPI（Analytics Data API）をRailsで使う方法

初記事です！
正直、苦労しすぎたので、同じ苦しみを味わう方が少しでも減ればという想いで書きます。よろしくお願いします！

# ！注意！
- 利用したのは旧式のAnalyticsではなくGA4です。
- GA4はアップデートが激しいため、この通りにコードを書いても、数カ月後には動かない可能性があります。あくまでも現時点では、ということをご理解ください。


# 使うAPIとGem
- Analytics Data API
https://developers.google.com/analytics/devguides/reporting/data/v1
- google-apis-analyticsdata_v1beta
https://github.com/googleapis/google-api-ruby-client/blob/main/docs/usage-guide.md

【前提というか自戒】
公式ドキュメントやGemの中身はきちんと読みましょう。特にGem。公式ドキュメントは更新にラグがあり、今回はかなり苦しめられました。
もしこの方法が使えなくなっても、Gem読めばたぶん、なんとかなると思います。


# 準備
- アカウントの準備
リクエストするアカウントの作成については他の方々も書いてあるので割愛。旧式AnalyticsのAPIのときと一緒です。OAuth2.0認証のアカウント作って、JSONをダウンロードしておく。GA4の場合も、Analytics側で作成したアカウントのアクセスを許可しておく必要があるので、そこだけ注意です。


- gemの準備
旧式APIの記事では「google-api-client」と書いている人もいますが、現時点で公式から止めろと言われています。重すぎるし、もう更新しないからそれぞれ欲しいGemを利用するように、とのこと。
```ruby:Gem file
gem 'google-apis-analyticsdata_v1beta'
```

# 実際に呼び出す
```ruby:apiを呼び出す

#　必要な機能を呼び出す
    require "google/apis/analyticsdata_v1beta"
    require 'googleauth'

#　アカウントを準備
    scope = "https://www.googleapis.com/auth/analytics.readonly"
    authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
      json_key_io: File.open('ダウンロードしたJSONファイルのパス'),
      scope: scope
    )
    client = Google::Apis::AnalyticsdataV1beta::AnalyticsDataService.new
    client.authorization = authorizer

#　リクエストを作る。これは一例です。
    body = {
      "requests": [
        {
          "date_ranges": [
            {
              "start_date": "7daysAgo",
              "end_date": "today"
            }
          ],
          "dimensions": [
            {
              "name": "pageTitle"
            }
          ]
        }
      ]
    }
    
    request = Google::Apis::AnalyticsdataV1beta::BatchRunReportsRequest.new(body)



#　引数の準備
    property_id = '自分のGA4のID(数字)'
    property = "properties/#{property_id}"
 
#　Apiを叩く  
    @response = client.batch_property_run_reports(property, request)

```
これでリクエストが通るはずです。これはすぐにできるリクエストの書き方ですが、実際にはGemに書かれた通りに「DateRange」のようなリクエスト用クラスをそれぞれ作成して引数に入れるのが良いと思います。

# 余談
特に苦しめられたのが「scope」。公式ドキュメントのscope一覧にData APIのscope先は書かれていません！！さんざん、飛び回って探したら、こんなところにひょろっと書かれていました。
https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/batchRunReports

今回、学んだことですがGoogleの公式ドキュメントみたいに巨大で更新がバラつく場合は「キーワード　site:url」で探した方が確実ですね。。


あとリクエストの書き方！！！最初は公式にあった「dateRanges」と書いていたら読み込んでくれませんでした。こちらもgemの引数にあった「date_rages」でようやく。。。（Gemのコードも数千行あるので、メソッドをいちいち正直探すの億劫がったら余計に痛い目をみました。）


もちろん、どちらもGemには書かれているので、面倒臭がらず一つ一つ読んでいればすぐに解決していたはずです。反省。でも勉強になりました。
GA4の日本語情報は少なすぎると思うので、血眼になってネット上を探してしまいますが（特に自分のようにスキルに自信がないと）、大事なことはコードに書いてある、と痛感しました。


初記事のため説明下手で恐縮ですが、誰かの助けになると幸いです。
async/awaitを一言で説明する


丁寧な説明は多いが結局なんだっけ？となったので一言にしてみた。
要するにasync/awaitとは、

## asyncの中でawaitを使うと、promiseが返ってくるまで待ってくれる仕組みのこと

```test.js
async function test(){
    console.log('1');
    await setTimeout(() => {console.log('2 (非同期処理)')}, 1000);
    console.log('3');
};
```

出力結果

```
1
2 (非同期処理) // awaitしたので非同期処理でも記述順に実行される。
3

// awaitしないと132となる。
```


## ということは、awaitを使いたくなったら最後にpromiseを返せばOK

```testPromise.js
function testPromise(){
    return new Promise(function(resolve){
            // 何らかの非同期を含む処理
            // ・・・・・・・・・・・
            resolve('2 (testPromise)');        
        }).then(function(result){
            return result;
        });
}

(async ()=>{
    console.log('1');
    console.log(await testPromise());
    console.log('3');
})();

```

戻り値
```
1
2 (testPromise)
3
```


慣れるとどんどん入れ子になっていきます。
～ 完 ～
【Athena】IS NULLやIS NOT NULLが効かない

# AthenaのWHERE句でIS NULLがうまく効かない
AthenaのSQLの条件でIS NULLとIS NOT NULLを書いても想定してた値が取れないため困惑していました。
例えば`count(x)`はprestoのドキュメント通りnullを考慮してくれており、値としてはnullは認識しているようには見えています。
行によってはによっては正しく判定されているところもあったので更によくわからないのですが、とにかくnullの条件がうまく聞きませんでした。

><count(x) → bigint#
>Returns the number of non-null input values.

https://prestodb.io/docs/current/functions/aggregate.html

# lengthで代替案

しょうがないので別の方法を取ることにして、今回は空文字があってもそれも無視することにしたので

```sql
length(column_name) > 0
```

と記述することで空文字とnullは0が帰ってくるはずで、それだけを取り除くことができました。
これまでもIS NULLが効かないことがあったのですが、データに空文字が混じってるのかな？くらいに思ってましたが、countではしっかりnullと判定しているくせに、IS NULLは判定できないという惑わしが辛かったです。
認識等間違っていたら指摘いただきたいです。
「テスト駆動開発」を読んでPHPで写経した

https://www.ohmsha.co.jp/book/9784274217883/
# PHPの写経コードはこちら
https://github.com/rsasns/Test-Drivin-Development#test-drivin-development
# 感想
テストコードかくのおもしろい。「__編集して祈る__」日々を送っていたので「__保護して変更する__」安心感すごい。だいすき。もっといろんなパターンのテスト書けるようになりたい。
# 忘れずにしたいメモ
## テスティングパターン
### Mock Objectパターン
準備に手間がかかるリソースに依存したオブジェクトをテストするために、決められた結果を返す偽物のオブジェクトを代わりに作成する。テストファイル内で対象のオブジェクトをオーバーライドするもよし、Mock Objectフレームワーク[^1]を使うもよし。

:::note warn
本書ではMock objectを重いリソースの代替として紹介している[^4]が、オブジェクト指向言語とMock objectを組み合わせると設計が決まっていないところやわかっていないところにもテストコードが書ける という考え方[^5]もある。
:::

### Self Shuntパターン
オブジェクト(A)がほかのオブジェクト(B)ときちんとやりとりしていることをテストしたいとき、Bの振る舞いをAに移してテストする。インターフェースを作るもよし、ブラックボックスにしてもよし。
### Log Stringパターン
正しい順序でメソッド呼び出しが行われていることをテストしたいとき、記録用文字列を作り、メソッド呼び出しのたびにその文字列に追記する。
### Crash Test dummyパターン
エラー処理部分のコードをテストするとき、例外を発生させる特別なオブジェクトを使う。try-catchでもよし、アノテーション[^2]を使ってもよし、xUnitに搭載されているメソッド[^3]を使ってもよし。
## テストからわかる悪い設計の兆候
### 前準備に要するコードが長い
テスト対象オブジェクトの準備に100行のコードが必要なのであれば、そのオブジェクトは大きすぎるので分割する方がよい。
### 前準備コードの重複
共通の前準備コードを配置する場所が見つからないのは、互いに密に関連しあうオブジェクトが多すぎることを示唆している。
### テスト実行時間が長い
実行に10分以上かかるテストスイートはよくない。
### 脆いテスト
思わぬタイミングで失敗するテストは、アプリケーションのどこかが意外な形で他の部分に影響している可能性を示唆している。２つの部分の関係性を断つか、または統合するなどして、離れた箇所からの影響を排除するように設計しなおさなければならない。
[^1]:PHPだと[Mockery](http://docs.mockery.io/en/latest/ )や[Phake](https://phake.readthedocs.io/en/latest/ )がある。PHPUnitにも[標準搭載されている](https://phpunit.de/manual/3.0/en/mock-objects.html )。
[^2]:PHPUnitなら`@expectedException`など。PHPUnitで使えるアノテーションの一覧は[こちら。](https://phpunit.de/manual/6.5/ja/appendixes.annotations.html)
[^3]:PHPUnitなら`$this->expectException()`など。詳しくは[こちら。](https://phpunit.de/manual/6.5/ja/writing-tests-for-phpunit.html#writing-tests-for-phpunit.exceptions)
[^4]:デトロイト学派(DetroitSchool)あるいは古典的TDD(ClassicalTDD)と呼ばれる。
[^5]:ロンドン学派(LondonSchool)あるいはモック主義TDD(MockingTDD)と呼ばれる。
Mathura Vrindavan Tour Packages

![-mathura-vrindavan-darshan-tour-package.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752739/9b4172b6-c6fc-0996-d0fe-7cac54174810.jpeg)
<b>Book Mathura Vrindavan Tour Package With Mathura Vrindavan Tour Operator</b>

Mathura Vrindavan Tour Package offers the best visit bundles to submerge yourself in the dedication of Krishna and appreciate. Alongside Mathura Vrindavan tour will get to visit many spots in the visit bundle. It will be an extremely illuminating excursion. You will get to see the way of life of many spots.

Likewise, the vast majority of individuals will visit Mathura Vrindavan and the spots close by so you'll get a total Mathura Vrindavan Tour Package where you can visit this large number of spots and have a courageous outing alongside all wellbeing and solace.

Mathura
Mathura is situated in Uttar Pradesh it is one of the most blessed and hallowed urban areas of India. Huge number of sightseers visit Mathura throughout the entire year and it is the most visited place by the unfamiliar travelers as a whole. While remaining in India it will be an exceptionally captivating and wonderful experience to visit Mathura and see all the way of life related with that spot and the remaining parts of history. You will get to see around 20 popular sanctuaries in Mathura and it is one of the seven holy urban communities of India.

Vrindavan
Vrindavan is the most holy spot in Uttar Pradesh and the most well known journey site in Braj. The Hindu god Krishna is said to have spent his entire youth here. Banke Bihari sanctuary is one of the extremely popular sanctuaries in India which is situated here and draws in a great deal of travelers everywhere.

Most Popular Tours Of Mathura And Vrindavan
In the event that you are wanting to visit Mathura Vrindavan you can book a visit bundle which will cover everything which you need in your outing.

 <a href="https://www.mathuravrindavantour.com/">Mathura Vrindavan Tour</a>  can be reserved by the quantity of days you need.
for the most part, individuals require a 1-day to 4-day Mathura Vrindavan visit bundle.
You can book a visit bundle as indicated by the quantity of days you need to spend on the excursion. Furthermore, the entire outing will organized according to that. Individuals likewise book 1 day, multi day or 3-day visit bundles in the event that they dwell in a close by City like Delhi and Agra.
The most famous visit bundle individuals book at a worldwide visit specialist organization is a multi day visit bundle which is adequate to visit every one of the significant spots.
CentOS8 streamにtimemachine on smbを設定する

# 背景
我が家はCloud化など遅れてまして，いまだに家の中にLinuxのサーバが転がってたりします．Mac中心ですがWindowsもあるので，sambaサーバとしても使ったりしています．

Macは，2.5inchのHDDを繋いで月一くらいでTimemachineでバックアップを取ったりしているのですが，せっかくsambaが動いているサーバがあるのでネットワーク経由でTimemachineバックアップが取れればいいかなと思い調べてみたところ，割と簡単にできるかもと思い試してみました．
参考にしたのは[こちらのRedHatのホームページ](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/deploying_different_types_of_servers/assembly_configuring-samba-for-macos-clients_assembly_using-samba-as-a-server)です．

結論からすると，まだじっくり使ってはいないもののとりあえずバックアップの作成は出来ました．

# 環境
- server: CentOS8 Stream
- samba: 4.16.2
- mac client: 12.4

ちなみに，CentOS8 Streamを使いたかったわけではないのですが，CentOS8のEoLがアナウンスされた後で，代替ディストリビューションもよくわからないような状況の時に立てたサーバなので致し方なく，という感じでした．

今RHEL系のサーバを立てるときは主にRockyを使ってます．

# 設定など
- smb.confを修正(新規に設定したところだけピックアップ)
```smb.conf
[global]
	vfs objects = fruit streams_xattr

[opt] (<-ボリューム名)
	fruit: time machine max size = 500G
	fruit: time machine = yes
```
- 設定確認
    - `testparm`
- コンフィグ再読み込み
    - `smbcontrol all reload-config`
- ボリュームをマウントして，システム環境設定→Time Machine→ディスクを選択，とするとこんな感じに見えます．ここでサーバを選んで「ディスクを使用」にすると使えました．
![timemachine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681278/b6daebbc-57aa-91f2-771b-9bba2fec9373.png)


# 最後に
できることは確認できたので，今後はどういう運用をするか要検討（意外と時間もかかるので）
PySparkとPandasのDataFrameの相互変換

[Databricks]:https://databricks.com/
[Pandas]:https://github.com/pandas-dev/pandas
[PySpark]:https://spark.apache.org/
[Pandas] を利用して作ったロジックを [PySpark] を使う処理系（たとえば [Databricks]）に持っていく場合などに、それぞれのDataFrameを変換することがありますが、その際に気をつけること共有します。

この記事の例は Databricks で実行することを想定しており、`spark` はプリセットの `SparkSession` オブジェクトだと解釈してください。

## PySpark &rarr; Pandas

`pyspark.sql.DataFrame` オブジェクトには `toPandas()` というメソッドがあるため、これを使えば変換できます。

```py
import io
data = '''id,value
one,hoge
two,fuga
'''
df = spark.read.csv(io.StringIO(data)) # df は pyspark.sql.DataFrame
pdf = df.toPandas() # pdf は pandas.DataFrame
```

## Pandas &rarr; PySpark

`SparkSession` オブジェクトには `createDataFrame` というメソッドがあるため、これを使うと `pandas.DataFrame` を `pyspark.sql.DataFrame` に変換できます。

```py
import pandas as pd
pdf = pd.read_csv(io.StringIO(data)) # pdf は pandas.DataFrame
df = spark.createDataFrame(pdf)
```

ただし、 `pandas.DataFrame` の Index としてデフォルトの値（1から始まる正数列）以外を使っている場合は、 __変換の際に Index の情報が失われてしまうので注意が必要です。__

例えば

```py
import pandas as pd
pdf = pd.read_csv(io.StringIO(data), index_col='id') # pdf は pandas.DataFrame
df = spark.createDataFrame(pdf)
```

とすると、CSVの `id` 列に記載されていた情報が失われます。

これを防止したいのであれば、`pandas.DataFrame.reset_index()` を利用し、前述の `createDataFrame` の部分を以下に差し替えると Index に入っていた情報を取り込むことができます。

```py
df = spark.createDataFrame(pdf.reset_index(drop=False))
```
【Unity】オブジェクト生成


#目次

- プレファブを作成する。
- Script上に、パブリックなオブジェクトの変数 obj を追加する。
public GameObject obj;

- プレファブをスクリプト上の変数と関連付ける
- コード上、Instance(A) ;

- そのほかの使い方
- 
Instance( A, 位置)
Instance( A, 位置, 親)
RI・SavingsPlansを購入禁止にするポリシー

# やりたい事
マルチアカウント環境で勝手にRI・SavingsPlansを購入して欲しくない

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Deny",
            "Action": [
                "ec2:PurchaseReservedInstancesOffering",
                "savingsplans:CreateSavingsPlan",
                "elasticache:PurchaseReservedCacheNodesOffering",
                "es:PurchaseReservedElasticsearchInstanceOffering",
                "redshift:PurchaseReservedNodeOffering",
                "rds:PurchaseReservedDBInstancesOffering",
                "dynamodb:PurchaseReservedCapacityOfferings",
                "cloudfront:CreateSavingsPlan"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

# まとめ
上記内容でSCPを作成し、任意のOUに割り当てる
【Gatsby ＋ Netlify】ユーザー向けログイン機能実装

netlify-identity-widgetを使用するためにGatsbyプラグインを使用します。
＊外部JSを読み込む方法ではGatsbyを使用している場合、うまく作動しません。

### プラグインのインストール

yarnの使用
~~~ bash
yarn add gatsby-plugin-netlify-identity-widget
~~~

npmの使用
~~~ bash
npm install --save gatsby-plugin-netlify-identity-widget
~~~


### gatsby-config.jsにプラグインを追加

~~~ JS
// In your gatsby-config.js
plugins: [
	'gatsby-plugin-netlify-identity-widget',
]
~~~

### ページコンテンツ部分に以下のコード追加

SignUp Login⇄ログイン情報

~~~ HTML
 <div data-netlify-identity-menu></div>
~~~

Login⇄Logout
~~~ HTML
 <div data-netlify-identity-button></div>
~~~

参考サイト：
https://github.com/netlify/netlify-identity-widget
https://www.gatsbyjs.com/plugins/gatsby-plugin-netlify-identity-widget/
PFRLでatari_wrapperを使うときの注意

PFRLでAtariの学習を走らせようと思ったときに，バージョン周りの問題で動かなかったので，その事例と解決方法をメモしておく．もしかしたら，最新のcommitで解決済みかもしれないが．

## AttributeError: 'numpy.random._generator.Generator' object has no attribute 'randint'
atari_wrapperのnoopの付近で発生するエラー．gymの方のenvの初期化ではちゃんとRandomNumberGenerator()が入るはずなのに（初期化時はNoneが入り，呼び出したときに初めてRandomNumberGeneratorが入る），なぜかnumpyの方のGeneratorで初期化されてしまう．numpyの方のGeneratorにはrandintが無いので，エラーが出る．
原因はおそらくALE (Arcade Learning Environment)を作るale-py．最新バージョンの0.7.5だとうまく行かず，0.7.4にダウングレードすると動くようになる．randintは今後消える可能性があるので，理想的にはこれを使わないのが一番ではある．
```
pip install ale-py==0.7.4
```

## ImportError: cannot import name 'Monitor' from 'gym.wrappers'
wrapper.monitor周りのエラー．これについては調べればすぐに解決方法が見つかるが，gymのバージョンが0.23.0以上の場合に発生するエラー．0.22.0以下にダウングレードすれば解決する．
```
pip install gym[atari]==0.22.0
```

## まとめ
上記をまとめると，以下のようにインストールすれば動く (はず (python==3.8.4))
```
pip install gym[atari, accept-rom-license]==0.22.0
pip install ale-py==0.7.4
```
Salesforceでチェックボックスに必ずチェックを入れないと保存できない設定の方法

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

Salesforceでレコードを保存する際
・必ずチェックボックスをクリックして保存してほしい
（例　あなたはSalesforceにデータ入力することに同意しますか？など）
という話があります。

つまり、レコード作成時、保存時に必ずチェックボックスにチェックをしたい
という内容です。


こちらの設定は入力規則とワークフロールールを作成し対応可能です


### ステップ１　入力規則を作成

入力規則は以下のようになります
![規則１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d826d7ff-b3cf-6ff9-1005-b29113108a60.png)

　数式は以下のようになります
testA__c = FALSE

※testA__c はチェックボックスのAPI 参照名を想定しています


### ステップ２　ワークフロールール作成

まずは条件です
評価条件は
・作成されたとき、および編集されるたび
と設定します
![ワークフロー１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a91b84eb-6bca-b070-c7a2-344ef3e6421f.png)



次に項目自動更新のアクションを設定します
![ワークフロー２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ed65ce15-a9a7-692f-c0cb-ec33e3d9b068.png)

これでワークフロールール作成完了です。「有効」をしてください
![ワークフロー３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4fdff7e0-ef8b-0138-7fa9-bc7724a31b71.png)


### 実際に試してみよう

さあ実際にレコード作成をしましょう
チェックが無いとエラーが出ます
![作成１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d5b628fe-aedc-42f8-ae16-1fdbd9413d4a.png)

チェックボックス「あなたはSalesforceにデータ入力することに同意しますか？」にチェックを入れて保存しても、保存後にチェックがついていないので、レコード編集時に再度「あなたはSalesforceにデータ入力することに同意しますか？」にチェックを入れる必要がでます
![チェック２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7e509dac-7c1a-126f-b604-20b60d1d5a36.png)
VSCodeの置換時に検索結果を使用する方法

# 目的
以下のようにblueの前にlightを追加して、lightblue等に置換したい。

## 置換前
```html:
<font color="blue">text</font>
<font color="coral">text</font>
<font color="green">text</font>
```
<font color="blue">text</font>
<font color="coral">text</font>
<font color="green">text</font>

## 置換後
```html:
<font color="lightblue">text</font>
<font color="lightcoral">text</font>
<font color="lightgreen">text</font>
```
<font color="lightblue">text</font>
<font color="coral">text</font>
<font color="lightgreen">text</font>

# 方法
1. "正規表現を使用する"を有効にする

2. 検索欄に以下を入力する
(?<=color=").*?(?=")

3. 置換欄に以下を入力する
light$0

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865752/0bf9b28c-8b53-65d6-5f1d-ae5d91586728.png" width="70%">
ActiveRecordのコールバックをInteractor層を使ってリファクタリングする


### Interactor とは
Interactor はアプリケーションのそれ以上分割できない責務の動きを実現する
アプリケーションのビジネスロジックをカプセル化するために使われるオブジェクトです

### ActiveRecordのコールバック

Railsガイドでは下記のように説明されています

> コールバックとは、オブジェクトのライフサイクル期間における特定の瞬間に呼び出されるメソッドのことです。 コールバックを利用することで、Active Recordオブジェクトが作成/保存/更新/削除/検証/データベースからの読み込み、などのイベント発生時に常に実行されるコードを書くことができます。

[Active Record コールバック - Railsガイド](https://railsguides.jp/active_record_callbacks.html#%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%AE%E6%A6%82%E8%A6%81
)

便利な反面副作用が大きく controller でどんな処理が行われるか意識・制御ができない点が問題です
またモデルが太る原因にもなります
実際コールバックを多用するとコールバックを起点にまたコールバックが呼ばれて...と考えたくもない連鎖反応が起こり思いもよらないバグを生んだりします
すべてのコールバックはやめておいたほうが良い分けてはありませんが多用することは避けたほうが良いでしょう

### リファクタリングの例

例えば、ユーザを作成したらコールバックを使ってメールを送るメソッドが書かれていたとする
このような実装の場合、Admin画面から User を作成する場合はMailを送りたくない等を実現することが難しくなる
(if文を使って制御することはできるが可読性は下がる)

コールバックが書かれたUserモデルの例
``` ruby
class User < ApplicationRecord
  after_create :create_notification

  private

  def create_notification
    UserCreatedMailer
      .with(user: self)
      .create
      .deliver_later!
  end
end
```

そこで使いたいのがInteractor層です
今回ではUserを作成する責務だけを負うCreateUserを作ります
これによってMailを送りたくない場合などが発生した場合には新たなInteractor層を作成することで容易に対応することができます
これらをモデルに記載する必要がないのでモデルが太ることもありません

Interactorを使ったUser作成
``` ruby
class CreateUser
  attr_reader :args

  def initialize(**args)
    @args = args
  end
  
  def call
    user = User.new(**args)
    result = user.save
    create_notification(user) if result
    result
  end

  private

  def create_notification(user)
    UserCreatedMailer
      .with(user: user)
      .create
      .deliver_later!
  end
end
```
MySQL 基本コマンド備忘録

# MySQLのコマンドの備忘録
適宜追加していきます

## 基本なもの

### MySQLに入る
```terminal:terminal
# mysql -u ユーザー名 -p
Enter password: パスワード
```
### データベース作成
```terminal:terminal
CREATE DATABASE 名前;
```
### データベースの選択
```terminal:terminal
USE 名前;
```

### データベース一覧
```terminal:terminal
SHOW databses;

```


### データベースの権限を与える
#### MySQL8 の場合
```terminal:terminal
grant all privileges on データベース名.* to 'ユーザー名'@'localhost';
```
#### MySQL5の場合
```terminal:terminal
grant all on （データベース名）.* to 'ユーザー名'@'localhost' identified by '設定したいパスワード';
```
設定できる権限は以下参照

https://www.javadrive.jp/mysql/user/index5.html

### テーブル作成 / 削除
##### 作成
```terminal:terminal
CREATE TABLE テーブル名 (
カラム名　型　その他
...
);

CREATE TABLE IF NOT EXISTS テーブル名 (
カラム名　型　その他
...
);

```
型一覧は長くなるため、別でまとめていきます（編集中） 


https://qiita.com/shun_i/items/c157ee309ae180b3c253


if not exits を加えると、同じ名前のテーブルが存在したとしてもエラーにならない。
##### 削除
```terminal:terminal
DROP TABLE テーブル名;
```

### テーブルの一覧
```terminal:terminal
SHOW TABLES;
```

### テーブルに値を挿入
```terminal:terminal
INSERT 
テーブル名 (カラム名, カラム名, ...) 
VALUES(値１, 値２, ...),(値１, 値２, ...), ... ;
```

### テーブルの中身
構造をみる。ともに結果は同じ。
```terminal:terminal
DESC テーブル名;
SHOW COLUMNS FROM テーブル名;
```
値もみる
```terminale:terminal
SELECT * FROM テーブル名
```
Julia 文字列を切り出す方法（文字列操作）

# ポイント
- Juliaは文字列を切り出すときbyteの位置指定
- ASCII 文字列ならば何文字目かと同じ
- Unicodeなどの場合　何文字目かの指定をデフォルトではできない。工夫が必要


# 文字列を切り出す方法

## 文字単位で単純に指定するとエラーになる場合がある
文字列から部分文字列を切り出す場合、他の言語だと何文字目から何文字目までなどと指定できる。
ところがjuliaではそのままではできない場合がある。

#### pythonの場合 文字単位で指定できる
```Python
# python3
print("こんにちは"[1:4])　 #んにち
```
#### juliaの場合　文字単位で指定するとNGの場合がある。
Errorが発生する (Unicodeの場合）
```Julia
println("こんにちは"[2:4])　 
#Error StringIndexError: invalid index [2], valid nearby indices [1]=>'こ', [4]=>'ん'
```

問題なし (ASCIIcodeの場合）
```Julia
println("ABCDEFG"[2:4])　 #BCD
```

実はJulia はバイトの位置で指定する。
Unicodeの日本語はたいてい3バイトなので以下に指定すると問題ない。


Errorが発生しない場合 (Unicodeの場合）
```Julia
println("こんにちは"[4:3:10])　 #んにち
```
ただしASCIIなどと混在すると位置がわからなくなる場合があり単純に3と決めつけられない。

## Unicodeなどで文字単位で切り出す方法
ここでは２種類あげる。
- char単位で分解して切り出す方法
- charのbyte位置を利用して切り出す方法

### char単位で分解して切り出す方法
配列にデータを加えるpush()とappend()の２種類あるが文字列を加えたときの結果が異なる。
このうちappendを利用する。

#### pushの場合
```Julia
a_str="こんにちは"
b_ary=[]
push!(b_ary,a_str) #push こちらは一般的な文字列単位で配列に代入する
#  "こんにちは"
```

#### appendの場合
```Julia
c_ary=[]
append!(c_ary,a_str) #appendを利用するとcher単位で切り分けられる
#'こ': Unicode U+3053 (category Lo: Letter, other)
#'ん': Unicode U+3093 (category Lo: Letter, other)
#'に': Unicode U+306B (category Lo: Letter, other)
#'ち': Unicode U+3061 (category Lo: Letter, other)
#'は': Unicode U+306F (category Lo: Letter, other)
```

#### appendを使った文字抽出関数
```Julia
function fn_substring_str(text_str, start_int, end_int)
    char_ary = append!([],text_str)
    return  join(char_ary[start_int:end_int])
end

fn_substring_str("こんにちは",2,4)
# "んにち"
```

### charのbyte位置を利用して切り出す方法
文字列のindex＝byteを確認する nextind()を利用する
```Julia
function fn_getCharIndex_ary(text_str)
           result_charIndex_ary= []
           indx_int = firstindex(text_str)
           while indx_int  ≤ lastindex(text_str)
               push!( result_charIndex_ary,indx_int )
               indx_int  = nextind(text_str, indx_int )
           end
           return result_charIndex_ary
       end

function fn_substringByIndex_str(text_str,start_int,end_int)
    return  join([text_str[_indx_int] for _indx_int in  fn_getCharIndex_ary(text_str)[start_int:end_int]])
       end

println(fn_substringByIndex_str("こんにちは",2,4))
# "んにち"
```
#### 速度比較
```Julia
@time for i in 10000000
    fn_substring_str("こんにちは", 2,4)
end

#0.000013 seconds (12 allocations: 512 bytes)
```
```Julia
@time for i in 10000000
    fn_substringByIndex_str("こんにちは", 2,4)
end

# 0.000017 seconds (16 allocations: 656 bytes)
```

意外と移植などでのハマリポイント
シンプルなのでchar単位で分解して切り出す方法がおすすめ
`curl`の実行時に、存在しないURLを指定してもリターンコードは０になる、自動処理では扱いづらいことがあるので、 `curl -f`のように`-f`オプション指定するとエラーコードが返ってくるようになった。という備忘録

`curl`の実行時に、存在しないURLを実行してもリターンコードは０になる

```
$ curl -f https://example.com/testtesttest
$ echo $?
0
```

自動処理では扱いづらいことがあるので、
`curl -f`のように`-f`オプション指定するとエラーコードが返ってくるようになった

```
$ curl -f https://example.com/testtesttest
curl: (22) The requested URL returned error: 404 Not Found
$ echo $?
22
```

これで自動処理でもリターンコードをみて判断ができる

# 参考
https://hogetech.info/oss/curl
PowerAutomateでオブジェクト配列の重複削除を行う

今回はPowerAutomateでフローを作成中に遭遇した困難のトラブルシューティングです。

PowerAutomateのフロー内で、ExcelやSharePointリストなど様々なデータソースから取得したオブジェクトの配列に対して、特定のキー項目を条件に重複を削除したい（ユニークな要素からなる配列を得たい）ことがあります。
しかしこれが案外簡単には行きません。。

# Problem

オブジェクトの配列に対して、特定のキー項目を条件に重複を削除したいが、用意されている関数でこれを実現するものがない。
文字列や数値、真偽値の配列であれば、`union(<重複削除したい配列>, json('[]'))` で済みます。
しかしオブジェクトの配列を特定のキー項目を条件に重複削除したいとなるとこの方法では対応できません。

# Solution

アクションと関数を組み合わせて少し複雑なフローを作って対処します。

まずは元データですが、今回は説明のために「作成」アクションでデータを作りました。実際にはExcelやSharePointからデータを取ってくるアクションを使うことになるでしょう：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/e65a20d1-14c7-4071-f810-119a0d1e67fd.png)

今回はこのオブジェクト配列に対して、`projectNo`と`reviewer`をキーにして重複削除を行ってみます。

前述の通りこのままでは `union(...)`関数を使えないので、キー情報を連結した文字列からなる配列に変換します：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/b69c7c5b-36d2-f081-fd3a-e1b08dd56095.png)

* From: `outputs('作成_records')`
* Map: `concat(string(item()['projectNo']), '★', item()['reviewer'])`

そして、`union(...)`関数を使ったテクニックを適用します：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/f8a75a8b-8501-8984-e7f9-2ebb56fee2fe.png)

* Inputs: `union(body('選択_keys（projectNo★reviewer）'), json('[]'))`

このままではキーが連結された状態のままなので、分離（復元）します：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/2a32c945-d030-7ff8-996b-57d537485b33.png)

* From: `outputs('作成_uniqueKeys')`
* Map: 
  * projectNo：`int(split(item(),'★')[0])`
  * reviewer： `split(item(), '★')[1]`

これで重複削除した配列ができあがります。

## 重複していた要素の件数も知りたい場合

ここで、もし「重複していた要素の件数も知りたい」ということになると、もう少し複雑になります。

まずはこのあと重複削除＆重複カウントをする上で使用する変数を初期化します：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/f4ab057a-9baa-3563-d3d9-e911e8586882.png)

先ほど登場した「作成_uniqueKeys」アクションの出力を使ってループを行います：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/1e803947-03a4-1f39-5978-260ba006e6b5.png)

* Select an output from previous steps： `outputs('作成_uniqueKeys')`

ループの中で、「選択 keys（projectNo★reviewer）」アクションの出力、つまり重複削除前の配列をフィルターします。フィルター条件は「作成_uniqueKeys」アクションの出力（のループ処理中の現在の要素）です：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/aa18682e-aa3f-b1a2-d536-9c816da19328.png)

* From： `body('選択_keys（projectNo★reviewer）')`
* 左辺： `item()`　※フィルターの現在の要素
* 右辺： `items('Apply_to_each_uniqueKeys')`　※ループの現在の要素

このフィルター結果を活用しながらオブジェクトを作成します：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/f2b17f86-dd84-9e64-eb0e-c848b0a60167.png)

* Inputs：
  * projectNo： `int(split(item(),'★')[0])`
  * reviewer： `split(item(), '★')[1]`　※文字列なので「Inputs」の入力欄に記載するとき前後に`"`が必要
  * count： `length(body('Filter_array_keys'))`

作成したオブジェクトを先ほど初期化した配列に追加します：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/b166736f-021c-fab9-55bc-998666d3fb7c.png)

これで件数もわかるようになりました。