OmniAICreator/Qiita-1.07M huggingface dataset:
VM引数を変更しつつマイクロベンチマークする方法

VM引数を変更しながら、マイクロベンチマークを取りたいケースってあると思うのですが、
JITコンパイラに影響のある引数の場合、ただプログラムを実行して時間を計測するのみでは
うまくその影響を測れません。なぜなら、プログラムの実行中にVMが判断したタイミングでJITコンパイラが走りコードが最適化されるので、どの程度そのVM引数の変更の効果があったのか測れないからです。

# JMH の利用
このようなケースでは、ベンチマークツールである JMH を使用するのが便利です。
JMH の使用方法についてはこちらのの[記事](https://www.codeflow.site/ja/article/java__java-jmh-benchmark-tutorial)で説明されていますので、以降では、JMHでのベンチマークの際にVM引数を指定する方法を説明します。

# VM引数の指定方法

以下のようにベンチマークを行うメソッドにForkアノテーションを付与し、JvmArgsAppend属性を利用することによってVM引数を指定することができます。
この例では、「-XX:-Inline」を指定ています。

```Java
	@Benchmark
	@Fork(jvmArgsAppend = "-XX:-Inline") // アノテーションでVM引数を指定する
	public String インライン展開なし() {
		return execute();
	}
```

また、以下のように実装することによって、VM引数の有り無しを同時にベンチマークすることができます。

```Java
	@Benchmark
	public String インライン展開あり() {
		return execute();
	}

	@Benchmark
	@Fork(jvmArgsAppend = "-XX:-Inline") // アノテーションでVM引数を指定する
	public String インライン展開なし() {
		return execute();
	}
```
Javaでのホスト名取得について

おはようございます。
JavaのInetAddress#getHostName()って使ってますか？
以前何も気にせずこのメソッドを使った際、Linuxのhostnameコマンドと結果が異なったことがあり、そのとき調査したことをまとめます。

## 環境
クラウドサービス：Google Compute Engine
OS：CentOS8
Java：OpenJDK11

## Javaセットアップ

```
sudo yum install -y java-11-openjdk
sudo yum install -y java-11-openjdk-devel
```

## ひとまず確認しておくべきファイル

### 1. /etc/hostname
（CentOS6までは/etc/sysconfig/network）

```
[zakisanbaiman@test01 ~]$ cat /etc/hostname
test01
```

### 2. /etc/hosts
これはよく触る機会が多いと思います

```
[zakisanbaiman@test01 ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.146.0.4 test02
169.254.169.254 metadata.google.internal  # Added by Google
```

場合によってはこれ以外のファイルを参照することもあるみたいですが、基本的にはこの２つを確認すれば良いです。

## 各コマンドの参照先

それでは、各コマンドがどこを参照しているか確認します。

### hostnameコマンド

```
[zakisanbaiman@test01 dev]$ hostname
test01
```

hostnameコマンドは/etc/hostnameを参照します。
ただし「hostname [ホスト名]」でホスト名を一時的に変更した際はそちらを優先的に表示するようです。

/etc/hostnameとhostnameコマンドで差異が発生する場合はhostnamectl statusでTransient hostname（一時的なホスト名）が設定されていないか確認すると良いでしょう。

### Java: InetAddress#getHostName()
こちらも基本的にはhostnameコマンドと同じ/etc/hostnameと同じものを表示します。
ただし、InetAddressのインスタンスがホスト名を指定して構築されていた場合はそちらを優先します。
hostnameコマンドと合わせたいならこっちを使うべきでしょう。
ただしインスタンスの作り方によっては、ローカルループバックアドレスを取得したりとロジックが異なるので注意。

### Java: Java:InetAddress#getCanonicalHostName()
こちらはマシンに設定されているネームサービスを使ってホスト名を取得するようです。
今回試した環境（CentOS8）では/etc/hostsを使った逆名前解決が行われていました。

※逆名前解決はIPアドレスをキーにしてホスト名を取得する方法です。
ちなみに１つのIPに複数ホスト名が記載されている場合は一番左のホスト名を表示します。

### 一覧にすると

|コマンド|参照先|実際の表示|
|:-----------------|:------------------|:------------------|
|hostname|/etc/hostname|test01|
|Java: InetAddress#getHostName()|/etc/hostname|test01|
|Java: InetAddress#getCanonicalHostName()|/etc/hosts|test02|

## まとめ
hostnameと合わせたいならgetHostName()を使えばいい、という簡単な話ではなくhostnameで取得したものをJavaアプリケーション内で読み込むなどした方が間違いがなさそうです。
ホスト名を取得するだけでもいろんなやり方があり、一歩間違えると致命的な事故になりかねないので気を付けたいです。

## 追記（ちょっと大事）
ずっとhostnameを使ってきましたが、Linuxコマンドでホスト名を取得したい場合はuname -nを使う方が書き換えのリスクがなく安心です。

## 参考
[Java11ドキュメント（Oracle）](
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/InetAddress.html)

ここまで読んでいただきありがとうございました。
新卒で入った会社をやめて転職をしたあとの心境

どーもみなさんこんにちは。

[新卒で会社に入った感想（1年未満）] (https://qiita.com/Apacher-inf/items/c880178e13e67f4c3844)のあとに色々と変化があり、色々と落ち着いてきたのでその時の報告みたいなことを書いていきたいと思います。

# あのあとどうなった？
早速、結果から言いますと、新卒入社した会社はやめました。自主退社をして、その後に勤務しながら転職をしていたので、そのまま1,2ヶ月ほど休んで次の会社に転職しました。その会社に入ってから3ヶ月たったあとにまた自主退職をしました。次の会社はやめてから就職活動をしたこともあり、多少苦労しつつもなんとか転職することができましたが、そこも長く続かず3ヶ月で退職しました。

# 何があったのか？
何があったかというと、まず新卒で入った会社は前の記事にもあったように、周りの社員の方たちがあまり技術に興味がなかったという点が大きくなっていきそのまま退職しました。一応対策として、技術的な面で色々とできそうな部署があり、そこへの移動を相談&お願いしたのですが、役員の許可が降りなかったというらしく移動は叶いませんでした。そういったことも含めて退職を決めて次の転職先に就職しました。

転職した会社は技術を推しているベンチャー企業で社員数は10人と満たない会社でしたが、周りの社員の人たちは実力も知識もあるすごい方たちばかりでした。自分はその中で実力も知識も下だったので、教わることばかりでしたが、楽しく過ごしていました。ただ、ある日、自分が出したコミットにバグがあったらしく、そのことを聞いてきたCEO兼社長から指摘を受けたのですが、その指摘の中に罵倒などが含まれていて、その次の日以降、コードに触らせてくれなかったり、少しでもミスをすると罵倒が続いたりしていました。そんなある日、人事と社長に呼ばれました。そのときに言われたのは、いわばクビ宣告と言うやつです。1ヶ月後は来なくていいと言われました。正直納得はしていませんでしたが、社長から当たりが強かったので、少しでも早くやめたい気持ちがあったので、その話を了承しました。最初のところで自主退職と書いたのですが、実際にはクビです。人事の人が経歴に傷をつけたくないとのことで自主退職にしてくれたそうです。

いきなりクビにされてしまったので、すぐに職を見つけたかったのですが、そう簡単には見つからず半年くらいかかって就職先を見つけることができました。

次に入った会社は自分がやりたかったことをしていた会社で社員の人たちも面白い方たちばかりで、この会社は今までのどの企業より最高の会社だなと思いました。そんな最高の環境と会社で過ごしていたのですが、自分があまり活躍することができず会社の方からクビを宣告されてしまいました。その時の上司も自分ができない原因を一緒に探ってくれたのですが、あまりうまくいかずという結果でした。そこでも経歴に傷をつけたくないとのことで自主退職にしてくれました。

というような状況がありました。

# 実は
2,3ヶ月くらい前（2019年の10月くらい）に直前の会社でよく上司に自分ができないことや不得意なことを指摘されていたことが自分が知っている精神病（鬱とか発達障害）と類似していたので、一度、精神病院に検査に行きました。検査は3ヶ月ほどかかった（患者が多すぎて検査に1ヶ月待ちという理由）のですが、結果は自分がASDであることが判明しました。

# 自分が発達障害であることについて
ASDの症状や特徴については書きませんが、昔からあまり人に馴染んだり誰かと一緒に行動するというようなことができませんでした。そういう経験もありこの結果にはすぐに納得しました。実際に仕事をしているときに何度説明されてもわからなかったり、人の話を聞いているにも関わらず、全く頭に入らないこともよくありました（これだけじゃないけど...）。ただ、ASDの特徴の1つとして興味のあることに関しては他より実力を発揮することがあるのですが、特に学生のときは復習や勉強をしなくても、話を1回聞いただけでスラスラと頭に入ってテストでもノー勉でほぼ満点を取る事も稀ではなかったです。そこに関連して、専門学生の頃にコンピュータサイエンスの分野に触れて興味を持つことができたので、ここまで続けられたのだと思います。ただ、発達障害であることで自分は働くことが他の健常者の人と比べ、働きづらいのだなとわかりました。そして、自分がクビになった原因も関係しているということも。

# 今後どうしていくのか
わかったからと言って、就職しようって言うのは今はあまりない状態ですが、技術とか知識に興味がなくなったというわけではなく（むしろ今までどおり）、仕事自体にあまり興味がなくなってしまったという意味です。今までの人生の中で誰かと行動したとき、必ずズレが生じてうまく行かないことが多くて、理解してもらえるとも思ってないです。そういう考えから、就職しても同じように失敗をすると思うのと考慮をしてもらえるとはいえ、同じ境遇の人から話を聞く限り、考慮をあまりしてもらえていない人が多かったです。だからといって、何もしないより、行動したほうが良いと思うのが自分で、バイトをしたり、ちょっとの合間に就活をしたりしています。今後も就職するかもしれないし、ずっとバイトをしてるかもしれないですね。

# 最後に
自分のような境遇の人だったり、発達障害の人でエンジニアを目指したいという方たちへの参考になればと思っております。
ラズパイ・ウェブ地図の作り方

私が出せる現時点最新版の、ラズパイ・ウェブ地図の作り方をまとめてみました。

２０１９年台風１９号の都幾川地区のデータを表示するウェブ地図をラズパイでホストするもので、Raspbian 上に Docker を入れて、その上に国連ベクトルタイルツールキットとデータを入れるものです。

<img width="734" alt="kawagoe" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102082/fec778a9-aa6d-9e41-0da0-36f09030926d.jpeg">

# セットアップ
[kawagoe 入り MicroSD カードの作り方（経験者向け概要版）](https://github.com/un-vector-tile-toolkit/kawagoe/issues/2)

# 実行
[演習（経験者向け概要版）](https://github.com/un-vector-tile-toolkit/kawagoe/issues/1)
herokuでDBのアップグレード

herokuで開発~運用まで行う際、うっかりDB(postgres)を無料プランのままで運用し、アラートメールで気づくなんてことがあって対応したことがありました。

## herokuのDBプラン

[heroku postgres](https://elements.heroku.com/addons/heroku-postgresql) にプラン一覧があります。小~中規模のサービスなら `Hobby-Basic` くらいでしょうか

## アップグレードの流れ

アップグレードといっても、新しく選択したDBのインスタンスが新規で立つイメージです。
→既存のDBがスケールするわけではない

そのため新規でDB立てたら、そちらにデータ移行をしつつdynoの接続先を変更する必要があります。

#### 新しいプランでDBを契約する

契約すると新しいDBの環境変数が登録されます（あとで使用する）

#### メンテナンスモード:ONにする

[heroku Maintenance Mode](https://devcenter.heroku.com/articles/maintenance-mode)に方法は乗っています。
そもそもメンテ機能が実装されてて便利だ。

#### データを旧→新に移行する

２つの方法があります

1. バックアップからリストアする
https://devcenter.heroku.com/articles/heroku-postgres-backups

2. 直接DBtoDBで移行するする

```bash
$ heroku pg:copy DATABASE_URL #{DBの環境変数名} --app #{アプリ名}
```

#### dynoのDB接続先を変更する

```bash
$ heroku pg:promote #{DBの環境変数名} --app #{アプリ名}
```

#### メンテナンスモード:OFFにする

#### 完了

### hobby-XXX プランより上位の場合

https://devcenter.heroku.com/articles/upgrading-heroku-postgres-databases#upgrading-with-pg-copy

pg:upgrade コマンドでそのままアップグレード（スケール）できるっぽい。試してはないです。
AWS CLIのアカウントを切り替えるためのコマンドを作成する

## はじめに
AWSのアカウントを個人用と会社用で切り替えて使うのが思いのほか面倒だったので変更用のコマンドを作成しました。

## 環境
macOS Catalina 10.15.2

## AWSのアカウント情報の確認
AWSのアカウント情報は`~/.aws/config`にあります。
以下のような情報が入っています。

```shell
$ cat ~/.aws/config
[default]
output = json
region = ap-northeast-1

[profile s3deploy-user]
output = json
region = ap-northeast-1

[profile home-user]
output = json
region = ap-northeast-1

[profile lambada-user]
output = json
region = ap-northeast-1
```

認証情報は`~/.aws/credentials`で確認できます。

アカウントの切り替えには以下のコマンドを実行する必要があります。

```shell
# shellを閉じるまで有効
export AWS_DEFAULT_PROFILE=test-user

# 実行時のみ
aws deploy create-application --application-name HelloWorld --profile test-user
```

## コマンドの作成
chmod風にchawsというコマンドで作成することにします。

```sh
# chaws
TARGET_FILE=~/.aws/config

PROFILES=()

while read LINE
do
    if [[ $LINE =~ ^.*\[profile(.*)\].*$ ]]
    then
        PROFILES+=(`echo ${BASH_REMATCH[1]} | tr -d " "`)
    fi
done < $TARGET_FILE

select res in "${PROFILES[@]}"
do
  sed -i -e '/AWS_DEFAULT_PROFILE/d' ~/.zshrc
  echo export AWS_DEFAULT_PROFILE=$res >> ~/.zshrc
  break
done

```

これを適当につくったフォルダにいれてパスを通します。
今回は`~/bin`フォルダに入れます。

```shell
cd ~/bin/

# 実行権限を付与
$ sudo chmod 755 chaws

# 環境変数を追加
$ echo export PATH='~/bin:$PATH' >> ~/.zshrc

# 読み込み
$ source ~/.zshrc
```

さっそく実行してみます。

```shell
$ chaws
1) s3deploy-user
2) home-user
3) lambada-user
# Enter 2

# 確認
$ source ~/.zshrc
$ echo $AWS_DEFAULT_PROFILE
home-user
```

ちゃんと切り替わりました。
bashを利用している人は、`.zshrc`のところを`.bash_profile`で動作すると思います。



## 参考記事
https://qiita.com/ryuzee/items/e3ce493f132f1981f57a
https://qiita.com/JJJJJJJJ/items/cc4357f5ba2a9eed809d
git bash とvim ターミナル機能における環境設定ファイルの違い

# vimのターミナルで発生した文字化けが解消しなかった
私はvimを愛用しているのだが、windows環境はとかくlinux環境と違いすぎていて思い通りに利用するための考慮があちこちに必要となる。
今回ハマったのは、Windows版のgitbash上でvimを起動したときにterminal機能で発生した文字化けだ。
私は文字化け対策を環境設定ファイル.profileに施しているのだが、これがvimのターミナルでは機能しなかった。vimターミナル上でWindowsコマンドを実行するときに出力される日本語が文字化けし、解消しなかった。
色々と試行錯誤した結果、原因はgitbashとvimのターミナルでは、読み込み可能な環境設定ファイル名がことなるため、.profileファイルに設定していた文字化け対策が機能していなかったという事だった。

## gitbashの環境設定ファイル
まず、gitbashで読み込み可能な環境設定ファイルは以下の3つだ。
1. .bash_profile
2. .bash_login
3. .profile

これ以外のファイルはデフォルトでは読み込まず、エラーとなる。私は元々.profileに環境設定情報を設定していたので、特に問題なくgitbashを利用していた。

## vimターミナルの環境設定ファイル
私はプログラムコードを書くエディタとしてvimを愛用していた。そして、vimのターミナルを起動することでいちいち別のコマンドラインを起動することなくvim上からビルドしたりツールを実行していた。
Linux環境では正常に利用できていたこのやり方だが、Windows環境下では文字化けが問題だった。Windowsコマンドはコンソールメッセージに日本語が出力されることが多々あり、gitbash上のvimのターミナルから実行するともれなく文字化けする。
私は最近C#プログラムをdotnet core環境で開発するプロジェクトに携わっておりVSを利用している。今回gitbash環境下でvim＋コマンドラインのお手軽開発環境で利用したいと思い、プログラムのビルドはvimターミナルからdotnetコマンドで実行しようと試みた。

dotnetコマンドは何の情報を見てロケールを判断しているのか不明だが、とにかく日本語がコンソールメッセージに表示される。
<img width="455" alt="202001200302.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/f105284f-9b2f-c752-1eaf-00ec85cdec05.png">

dotnetコマンドが参照している環境変数として「DOTNET_CLI_UI_LANGUAGE」があるが、これは元々「en」に設定されており、これ以上の情報を見つけることが出来なかった。

上記イメージは正しく日本語が表示されているが、これはiconvを使用して強制的に文字コードをutf-8に変換しているためである。そうでなければgitbash上からコマンドを実行したタイミングで文字化けして使い物にならなかった。
<img width="455" alt="202001200306.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/a6ac6de1-b197-75a9-d814-d5b53dab85a8.png">
「dotnet」と入力すると「wincmd()」関数が実行され、iconvを経由してcp932をutf-8に変換している。
だが、これがvimのターミナルから実行すると正常に動作しなかった。
<img width="454" alt="202001200312.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/1513a8cd-6d26-0448-b14f-c70a04a79959.png">

調べていくうちに、vimのターミナルは環境変数として.bashrcというファイルを読み込むという事が分かった。試しに、.profileファイルを.bashrcファイルとしてコピーしてからvimのターミナルでコマンド実行すると、思惑通りに表示された。
<img width="454" alt="202001200317.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/dc433672-06ed-8ce9-60d9-a9eabc9c3274.png">

そうか、なら.bashrcでいいかと.profileを削除してgitbashを再起動したら、今度はgitbashが.bashrcファイルを読み込まない。以下は、.bashrcファイルを作成後にgitbashを起動したときのエラーメッセージ。
<img width="512" alt="202001200239.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/b6442a04-6d0c-73fa-b89e-7fe1e84c8ef6.png">

ただし、この時gitbashは.bashrcファイルの存在を認識しており、何と.bashrcファイルを読み込む.bash_profileファイルを自動生成することでこの問題を自動解決していた。
そんなことせずに.bashrcを素直に読んでくれればいいだけなのだが。。

とにかく、これでgitbashでもvimのターミナルでも同じ環境設定ファイルが認識されるようになった。

これなら私好みにしたほうがよさそうだ。
.profileファイルをそのまま残し、.bashrcファイルで.profileファイルを読み込むことにした。
<img width="455" alt="202001200335.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/56d42045-1a3b-acc1-f65f-0dd3a6358354.png">


解決！
Rails Hamlと(ログイン、新規登録機能）

##1 今回はログイン機能を実装するがその前にHTML.erbの表記をHaml表記に変更しよう！

####理由:
・閉じタグ不要
・rubyのend不要
・インデントで階層構造を表す

これらが挙げられる。

###1-2 Hamlの導入方法
Gemfileの一番下に

```Gemfile```
gem "haml-rails"
```
を追加

ターミナルで
```$ bundle install```
を行う。

###1-3 既存のerbファイルをHamlに変換する。

ターミナルで
``` $ rails haml:erb2haml ```
を実行

途中で
Would you like to delete the original form? (既存のHTMLのファイルを消しますか？）と聞かれるのでyと入力する。

これでHamlの導入は終わり。

##2 ログイン機能を追加しよう。
以下をGemfileに追記し、bundle installを実行してdeviseをインストールしてみましょう。

```Gemfile
gem 'devise'
```

ターミナル
``` $ bundle install```

###2-2 ルーティングの設定
root to: "messages#index"のようなルートURLをconfig/routes.rbで設定しましょう

###2-3 rails g deviseコマンドでuserモデルを作成してください

rails g devise コマンド:
deviseで、ログイン機能をつける概念のモデルを作成する際に利用するコマンド
モデルとログイン機能のために必要なカラムが追加されるマイグレーションファイルが生成される

ターミナル
```$ rails g devise user```
```   $ rake db:migrate```

SequelProを開き、usersテーブルが作成されているか確認してください。

###2-4 ログインフォームのHamlを作成する

ユーザー新規要録画面やログイン画面はコマンドでまとめて作成できます。
```$ rails g devise:views```

ログイン画面と新規登録画面が出来上がっているので以下URLより確認しましょう。
http://localhost:3000/users/sign_in
http://localhost:3000/users/sign_up

これでログイン、新規登録はできましたがまだ名前の設定ができていません。
TSL/SSLがavailableでない状態からの import tk, matplotlib等ができないまでの対処

#pip install ができない
osのアップデートがされてから，ライブラリのインストールをやっていなかったのでやろうとするとできなかった．
TSL/SSLが問題らしい．調べるとどうもpyenvがアップデートについていけて無い模様
以下エラー内容

```
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Collecting numpy
  Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/numpy/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/numpy/
  Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/numpy/
  Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/numpy/
  Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/numpy/
  Could not fetch URL https://pypi.org/simple/numpy/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/numpy/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
  Could not find a version that satisfies the requirement numpy (from versions: )
No matching distribution found for numpy
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
```

策を一通り試したが，解決したものを載せる．
pyenvを削除するので，使っていたバージョンをメモしておく等しないと復元できないので注意

```
$ pyenv uninstall 3.6.6 (your version)
$ which python
/Users/[user name]/.pyenv/shims/python
$ rm -rf /Users/[user name]/.pyenv
$ sudo brew uninstall pyenv
$ brew install pyenv
$ pyenv install 3.6.6
$ pip install [library] [library] ....
```

．．．これでTSL/SSLのエラーは治った．pythonの再インストールは面倒


#import tk（matolotlib）ができない
また，問題発生．

import tkができない．matplotlibが使えない．困った．
_Tkinter moduleが無いらしい


```
$ brew reinstall tcl-tk
```

これで解決と思いきやだめ．
https://ameblo.jp/oyasai10/entry-12526487609.htmlの通りにやったら解決した．

```
$ pyenv uninstall 3.6.6
https://www.activestate.com/products/tcl/tcl-tk-modules/
ここで，active-tclをダウンロード
Macの場合は，インストールしインストーラーがゴミ箱に入ったらOK
非常に楽
```

これでtk周りは解決した．
後は再インストールしていくだけ．

```
$ pyenv install 3.6.6
$ pyenv versions
*system
3.6.6
$ pyenv global 3.6.6
$ pyenv local 3.6.6
$ pyenv versions
system
*3.6.6
$ pip install matplotlib
$ python
>> import matplotlib
>>
```

終了．
apkからjavaファイル生成(BytecodeViewer式)

dex2jarでは精度がいまいちだったので精度の良かった物を紹介します

# Bytecode Viewer
https://bytecodeviewer.com/

dex2jarの代わり。
GUI操作です。JD-GUIのような類ですね。
普通に便利です。apkやdex、jar、zip、classがデコンパイルできます。
デコンパイル後は好きなデコンパイラーで見れます。
apkから出たclassの保存とか、デコンパイラーでデコンパイルしたjavaの出力とか出来ます。
ただjavaへの出力は不安定です。
これをダウンロードして起動すすると「Drag class/jar/APK/DEX here」と書いてあるところがあるのでそこに.apkをドラッグ・アンド・ドロップしてください。
そしたら処理が終わると完成品が出てくるのでFile->Save As Zipからzipで保存してください。

# Procyon
https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

Bytecode Viewer内臓のデコンパイラーですね。
安定していると思います。

デコンパイル方法は、Bytecode Viewerで出力したzipの拡張子をjarに変更し

```
java -jar procyon-decompiler-x.x.xx.jar -jar myJar.jar -o out
```
Procyonのjarファイル名は自分のものに合わせて変えてください。
myJar.jarはBytecode Viewerで出力したファイル名です。
そしてこれを実行。outは出力先ディレクトリですね。ここにjavaファイルが入ります。予め作る必要はありません。

# デコンパイラの比較

私は普段Fernflower派なのですが（普段使ってるIDEがIntellij IDEAなので）出来たソースコードを見て比較とかしましたがFernflowerより良いなと思った点が2つ。

- ソースコードの書き方が簡略化されている
- class内に書かれていない変数名がわかりやすいネーミング

精度としてはほぼFernflowerと同じで、Fernflowerでは書いてあってProcyonでは書いてなかったり、その逆もあったり。
結構精度は高いと思います。

for文比較
Fernflower

```java
ServiceApiEnvironment[] var1 = values();
int var2 = var1.length;

for(int var3 = 0; var3 < var2; ++var3) {
  ServiceApiEnvironment var4 = var1[var3];
  if (var4.equals(var0)) {
    return var4;
  }
}
```

Procyon

```java
for (final ServiceApiEnvironment serviceApiEnvironment : values()) {
  if (serviceApiEnvironment.equals(s)) {
    return serviceApiEnvironment;
  }
}
```
圧倒的にProcyonのほうが見やすいですよね。
なのでProcyonが一番最適かと思います。
エラーの数はFernflowerが大量に吐いてましたがProcyonは1回だけ。
Jetson NanoでRealsenseのPythonラッパーPyRealsenseを使用する方法

![realsense_align_depth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/4f8ef3fa-023a-2a1d-01d1-3ae355dbec6d.png)

# PyRealsense（pyrealsense2）とは
　IntelのDepthカメラRealsenseをPythonで扱うためのラッパープログラムです。Pythonで、Realsenseの画像や深度情報を簡単に取得することができます。

　Realsenseで、Pythonを使ったディープラーニングで画像認識した上で、深度情報を取得したい、といったときにとても便利ですね。

　X86系のPCの場合は、`pip install pyrealsense`で簡単にインストールできるのですが、ArmのJetson Nanoだと一工夫必要なので、セットアップ方法と使い方を簡単に紹介します。

　なお、この記事ではRealsenseはD435を想定しています。

# Librealsenseをソースからビルド
　Jetson NanoでPyRealsenseを使うときは、Realsenseのドライバである、Librealsenseをソースからビルドする必要があります。

## 必要なライブラリのインストール
　必要なライブラリをインストールします。

```sh
$ sudo apt update
$ sudo apt install -y cmake
```

注意：自分は、ゼロからセットアップしていないので、ひょっとしたら他にも必要なライブラリなどあるかもしれません。判明次第適宜追記します。

また、ディープラーニングを実施したい人は、以下記事を参照下さい。

[Jetson Nanoでディープラーニング](https://qiita.com/karaage0703/items/b09f3c65eb3913d087e4)

## Librealsenseのビルドとインストール
　以下コマンドで、Librealsenseをダウンロード(git clone)して、ビルドしてインストールします。

```sh
$ cd && git clone https://github.com/IntelRealSense/librealsense.git
$ cd librealsense
$ mkdir build
$ cd build
$ cmake ../ -DBUILD_PYTHON_BINDINGS:bool=true
$ make -j4
$ sudo make install
``` 

## Udev設定
　以下のコマンドで、USBでRealsenseを認識させるための、udevのセットアップを行います。

```sh
$ cd ~/librealsense
$ ./scripts/setup_udev_rules.sh
```

## パスの設定
　パスの追加を行います。

```sh
$ export PYTHONPATH=$PYTHONPATH:/usr/local/lib
```

　パスの追加は、毎回実施する必要があります。めんどくさければ`~/.bashrc`に上記コマンドを追記しておきましょう。

# 動作確認
　サンプルプログラムを実行してみます。

```sh
$ cd ~/librealsense/wrappers/python/examples
$ python3 align-depth2color.py
```

　以下のように、PythonでRealsenseのカラー画像と深度情報が取得できました。

![realsense_align_depth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/4f8ef3fa-023a-2a1d-01d1-3ae355dbec6d.png)

　ソースコードを見れば、使い方はある程度分かると思います。ドキュメントは以下となります。

[PyRealSense’s documentation](https://pyrealsense.readthedocs.io/en/master/index.html)

# 参考
- http://mirai-tec.hatenablog.com/entry/2018/03/29/000217
- https://github.com/IntelRealSense/librealsense/tree/master/wrappers/python


# 関連記事
https://qiita.com/karaage0703/items/b14c249aa33112669ee4

https://qiita.com/karaage0703/items/cb9bbe1b4f2504f8ad0d

https://zenn.dev/karaage0703/articles/a267aa24a80c44
前澤さんの当選発表サイトを考察

## 前澤さんのお年玉当選発表サイトでわかること

表ではただ単に丁寧語だが、あえて見えないところでは相手を立てて自分をへりくだり謙譲語を使っている。
こういう隠れたところまでこだわるところが好きである。

<img width="440" alt="スクリーンショット 2020-01-20 2.21.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569885/debc4a7f-a6c4-0745-d701-704dfa4fc461.png">

```
 <!-- お待たせ致しました by 前澤友作 -->
 <div class="text-center pt-1 mb-0">
  <br>
  <img src="./image/yusakumaezawa_01.png" class="rounded" alt="お待たせ致しました by 前澤友作" width="315px">
 </div>
 <!-- お待たせ致しました by 前澤友作 -->
```
jQueryで Twitterと同じルールで文字数をカウントする

Twitterの文字入力のルールは少々面倒で、日本語1字、英語0.5、URLは何字だか以上は何字になる...etc

ルール全部調べて自分で実装するのは面倒です。

公式から`twitter-text.js`というパッケージが公開されているのでそれを用います。

npmからインストールします

```
npm i twitter-text
```

```js:app.js
const twitter = require('twitter-text')

$(function(){
    $('#testInput').on('keyup',function(){
        const content = $(this).val();
        const valid = twitter.parseTweet(content);
        /* Returns:
          {
            weightedLength: 20,
            permillage: 71,
            valid: true,
            displayRangeEnd: 19,
            displayRangeStart: 0,
            validRangeEnd: 19,
            validRangeStart: 0
          }
        */
    });
})
```

`parseTweet`した戻り値の`weightedLength`が入力欄の文字数になります。
あとは`weightedLength`を表示してあげればいい感じになります

>weightedLength：アルゴリズムによって計算された加重長を示す整数。
permillage：最大加重長に対する消費加重加重長の比率に対応する整数値。
valid：有効なツイートかどうかを示すブール値。
dispayRangeStart：ツイート文字列の開始インデックスを持つ整数
displayRangeEnd：ツイート文字列の終了インデックスを含む整数（含む）
validDisplayRangeStart：ツイート文字列の有効な開始インデックスを示す整数
validDisplayRangeEnd：ツイート文字列の有効な終了インデックスを示す整数。これは、displayRangeEnd（これを含む）よりも小さい場合があります。

ちなみに

Java
Ruby
JavaScript
Objective-C

のものがTwitter公式から提供されています。

#参考
https://github.com/twitter/twitter-text/tree/master/js
Day9 CSS

#CSS
ロジックの方の実装はひと段落ついたので、今日からCSSでデザインを整えると同時に、操作していて見つかった修正や必要な箇所等は直して行こうと思う。
実際にトップページとログイン画面等のデザインをBootstrapで行ったが、レスポンシブデザインがいまいち理解することができていない。Progateでもう一度復讐をしてから、Bootstrapの機能によるレスポンシブデザインを試してみたいと思う。
今週金曜日までにはCSSも大方整えて、今週末は修正や細かいところの改善に集中したいと思う。
来週にはHerokuへのデプロイをして、コードのリファクタリングと、テストコードを書いて行こうと思う。

あと、テーブルの仕組みや設計を整理しておきたい。
全テーブルの説明と、それぞれの機能がどのコントローラでどう処理されて、どのような対策がされていてというのは、Qiitaでまとめておこうと思う。
プロパティの型をそのままにReactiveProertyとして参照できるようにする

　こんな感じのプロパティがあるとします。

```C#
    public int SomeIntProperty
    {
        get;
        private set;
    }
```

　このプロパティを後からReactivePropertyとして参照したくなった時。
　プロパティの参照先が少なければ別にそのまま型をReactiveProperty<int>に変えてしまってもまあいいですが、参照先が多かった場合は変更箇所も多くなり若干面倒です。
　また従来の参照箇所で、別にただのプロパティでよいはずの処理もReactivePropertyになるので、[認知負荷が大きくなる](https://qiita.com/tonluqclml/items/2a2ab902e298b4c8fa71)かもしれません。

　以下のようにリファクタリングできます。

```C#
    // ReactivePropertyとして参照したい箇所ではこれを参照
    public IReadOnlyReactiveProperty<int> SomeIntReactiveProperty => someIntPropertyEntity;
    private readonly ReactiveProperty<int> someIntPropertyEntity = new ReactiveProperty<int>();

    public int SomeIntProperty
    {
        get => someIntPropertyEntity.Value;
        private set => someIntPropertyEntity.Value = value;
    }
```

　`SomeIntProperty`のガワはそのままですが、中身の実態は`someIntPropertyEntity`に置き換えられています。
　そして`SomeIntReactiveProperty`の実態も`someIntPropertyEntity`で共通です。
　ソースコードの通りですが、つまり`SomeIntProperty`への変更は`someIntPropertyEntity`の値の変更になり、ReactivePropertyである`someIntPropertyEntity`の値が変更された結果`SomeIntReactiveProperty`として発火することになります。
Blender2.81で(顔面リグを除いた)rigifyのgenerate rigが失敗した時の対処法

# 何が起こったか
以下の画像のように、いつも使ってない顔面リグを排除した後のGenerate Rigが失敗する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204935/6a358b90-1da5-c8f4-d51a-17abc5dbbe20.png)
エラーメッセージにはORG-noseがなんちゃら...と書いてある
# 解決方法
spine.006の子であるfaceボーンを削除する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204935/7f3e8282-91d3-1b18-b4ee-1a2268208e41.png)
このボーンがspine.006ボーンで隠れて見えないのだが、階層を辿ると確かに存在する。
これを削除後、Generate Rigすると成功する。
# Blender2.81でのrigifyについて
コントローラーの形が変わるなど、バージョンアップしているようである。是非使ってみてほしい。(Generate Rigの速度も段違い)

以下の画像がBlender2.81のrigify。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204935/14de2e9a-ef4f-2d39-853d-c23b9754024d.png)
Blender2.8のrigifyはこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204935/5ab04ba9-f3f4-d777-16aa-63dd37b5b8e5.png)
RPA、VBA、プログラム言語で行うべき自動化は?

業務自動化といいますが、自動化するためのツールってたくさんあります。「その業務、別にその特別なツール使わなくていいんじゃねー！？」ってことありますよね？ということで、業務の種類、環境、ユーザーの種類、などにより分類してみましたー。

# 1. コア業務の自動化 (会計、人事、CRM、ERPなど)
RPAお勧め度: ☆☆☆☆☆

人事、給与、管理会計、サプライチェーン、原価計算、CRM、、、など、業界によらない企業としての基本的な業務や、業界特有の業務の自動化については、迷わずにパッケージソフトを導入しましょう。あなたの会社が創業したばかりのスタートアップであれば最初の1年くらいはExcelで諸々の事を管理するのもありかもしれませんが、この部分は自分で作りこむよりも先人達が何十年もかけて作り上げてきたパッケージにはかないません。最近は無料のSaaSサービスなんかも出てきているので、自分の力で自動化したり一から作り上げたりすることは全くお勧めできません。パッケージを使えば、あなたの組織内にはそのソフトウェアを担当する、高度な知識が必要なエンジニアは置かなくてもよい場合が多いです。

ちなみに、これらの業務システムを他のシステムとつないだり、データ入力を行う場合はRPAが活躍する場があります。

# 2. Officeソフトウェア単体の自動化
RPAお勧め度: ⭐⭐☆☆☆

Excelファイル上でデータをファイルから読み込んで会計の計算をする、データをPowerPointやWordに読み込んでキレイに出力する、など、Officeソフトウェアを使って業務の自動化をする場合、ファイルやデータのやり取りが1つのOfficeファイルに限定されるのであれば、Officeに付属しているVisual Basic for Applications (VBA)でコーディングをしたり、マクロの記録を使うほうが安上がりです。VBAやマクロはOfficeを持っていれば追加ライセンス費用なしで使えます。ただし、VBAを使う場合は、あまり複雑な業務を扱うコーディングの場合、コーディングをした人しか自動化の修正ができなくなってしまう落とし穴にはまるのは避けなければなりません。

Officeファイルを複数扱うような複雑な業務になってくると、RPAを使ったほうが全体として楽だったり、配置するエンジニアの量や質が低くてもよくなり、コストパフォーマンスが上がってきます。その場合でも、ひとつのOfficeファイルに収まる処理はマクロを記載しておき、RPAから呼び出すことで動作の安定性を向上させる方法もあります。

# 3. Webスクレイピング単体
RPAお勧め度: ⭐☆☆☆☆

Webページの特定のテキストや表を抜き出してくるWebスクレイピングの場合、単純に1ページの1か所だけ抜き出し程度の複雑さであれば、プログラマーやエンジニアがいる場合は、SikuliX、Seliumなどの無料の自動化ツールやPythonなどのプログラミング言語で作ったほうが安価に仕上がります。複数ページにわたる複雑なデータを扱う場合、とってきたデータを他のアプリケーションで活用する操作を続けて行う場合、エンジニアが不在の場合などはRPAで行うのも手かもしれません。ただし、Webスクレイピングの目的だけでRPAを導入するのは高くつくでしょう。

# 4. Webフォームやアプリケーションフォームへの自動入力作業
RPAお勧め度: ⭐⭐⭐⭐☆

WebやWindowsアプリケーションのフォームへの入力作業を自動化する場合、まずはAPI連携で同等の入力をする方法がないかを模索してみましょう。方法がない場合は、UIの要素を認識しての値入力が必要になってきます。場合によってはSikuliX、Seliumなどの無料の自動化ツールやPythonなどのプログラミング言語で実施できる場合もありますが、処理が難しくなる傾向があります。また、画面が頻繁に変わったりすると頻繁にコードの作り替えが発生してしまい管理コストがあがってしまいます。そのような場合はRPAを使ったほうが簡単に実施できるのでお勧めです。対象のフォームのUI要素がきちんと簡単につかめるRPAソフトウェアを使いましょう。SAPやリモートデスクトップなどアプリケーションの種類によっては、RPAソフトウェアによって入力精度に差が出てくるので注意です。

* ユーザー登録・利用確認
* 会計、人事、CRM、ERPなどの業務システムへの入力 (APIで入力できない場合)

# 5. 業務同士をつなぐ一連のフローの自動化
RPAお勧め度: ⭐⭐⭐⭐⭐

「画像ファイルをOCRにかけてテキストを抜き出して検証作業をして、その結果をフォームに入力する」など、単体の作業ではなく、一連の業務フローをこなす自動化を行う場合は、RPAソフトウェアで行うのがお勧めです。複数のデータセットやソフトウェアをつなげるところでRPAソフトウェアは真価を発揮しやすく、コスト効率もあがってきます。

* 請求書発行
* 交通費精算チェック機能付き経費精算
* 経費支払先チェック
* 一括メール送信
* システム利用状況の監視と報告

# 6. 業務フローの途中で人の判断が必要な処理の自動化
RPAお勧め度: ⭐⭐⭐⭐⭐

これも、チャットボットを介したRPAとの作りこみで実施することができます。どうしても人の判断を介するような場合には人に問い合わせをするフローをチャットボットが行いますが、そことのつなぎをRPAにやらせます。

* コールセンターでの難しい問題の判断
* OCRで読み込んだ文字の判定が難しい場合の判断
Arch Linux で snap を使える様にする

# インストール

参考: [ArchWiki - Snap](https://wiki.archlinux.jp/index.php/Snap)

## AUR の準備
snap は [AUR](https://aur.archlinux.org/packages/snapd/) からインストール出来ます。
参考: [ArchWiki - AUR](https://wiki.archlinux.jp/index.php/Arch_User_Repository)

AURからのパッケージをビルドするには `base-devel` と `git` が必要なので、まずこれらをインストールします。

```shell
pacman -S base-devel git
```

## snapd のインストール

AURリポジトリからクローンして一応ファイルが正しいか、確認します。

```shell
mkdir AUR
cd AUR
git clone https://aur.archlinux.org/snapd.git
cd snapd
less PKGBUILD
less snapd.install
```

`makepkg`を使ってインストールします。

```shell
makepkg -si
```

そして、デーモンを必要な時にだけ起動するように設定します。(`.service`では無く`.socket`で設定)

```shell
systemctl start snapd.socket
systemctl enable snapd.socket
```



## 強制アクセス制御の設定

次にMAC(Mandatory access control / 強制アクセス制御)を有効にします。
設定しなくても使えますが、これこそがsnapを使うメリットかなとも思います。

MACはスマートフォンアプリで言うサンドボックスもその一つです。
LinuxだとSELinuxにもこの機能が備わっています。

`AppArmor`を使用します。
SELinuxよりもAppArmorは設定が簡単らしいです。
`AppArmor`はおおよそ既にインストールされています。

参考: [ArchWiki - AppArmor](https://wiki.archlinux.jp/index.php/AppArmor)

```shell
systemctl enable --now apparmor.service
systemctl enable --now snapd.apparmor.service
```

## classic 対応

`classic snap` を使いたい場合はリンクを張ります

```shell
ln -s /var/lib/snapd/snap /snap
```

AppArmor を設定したものの、`aws cli` や `powershell` など、classic snapを使う機会は割とあるように思います。

# 使い方

## インストール

```shell
snap install SNAPNAME
```

## 検索

```shell
snap find SNAPNAME
```

## 一覧

```shell
snap list
```

## 更新

```shell
snap refresh
```

## アンインストール

```shell
snap remove SNAPNAME
```
カレントディレクトリの取得【accessVBA】

（今更）Access2007で開発する機会がやってきたので
最新のバージョンでどう変わっているかはともかく、学んだことをメモします。


# カレントディレクトリの取得

以下で取得しようとすると、変なパスが取得できました。

```vb:vba
Sub GetCurDir()
  Debug.Print CurDir
End Sub
```

全く無関係なパスを取得します。
なぜそこなのかはわかりません。
エンジニアの先輩曰く「古いバージョンなのでばぐってるんだろ」とのこと。

以下が正しい。

```vb:vba
Sub GetCurDir()
  Debug.Print Application.CurrentProject.Path
End Sub
```

「CurDir」とは一体何を取得するものなのだろう。。。
社外の開発コミュニティに参加してみての感想

趣味で宇宙開発を行う団体「[リーマンサット・プロジェクト（Ryman Sat Project=rsp.）](https://www.rymansat.com/)」がお送りする新春アドベントカレンダーです。
前回の投稿は @Ushinji さんの「[バーチャル地球儀上で国際宇宙ステーションの現在位置が分かるアプリの開発](https://qiita.com/Ushinji/private/76d4901658bce767df36)」でした。かっけー。
また、インデックス記事は[こちら](https://qiita.com/rsp-dgkz/items/497225739b88c817a90c)。


---

というわけで、どうも @ukisoft です。
リーマンサットでは、衛星１号機で使う画像分類のソフトを開発してます。
他の人の記事がすごかったので、僕はゆるふわで行きたいと思います 🤪


# これ is 何

僕がリーマンサットに参加したのは、確か 2018 年の春だったと思います。
参加して２年たったし、良い機会なので振り返りたいと思います。


# td; dr

- コミュニティに参加するのは良いぞ
- みんなすごい 🤗
- あとはただの日記


# 良かった点

## 宇宙開発できた

- yeah 🤘🤘🤘
- しかも自己紹介とかで宇宙開発の話をすると、めちゃくちゃ興味を持ってもらえます
- 自分自身はそんなに大したことしてないにもかかわらず！（大事


## 一人ではできないことが色々できた

- あとコレ
- 宇宙開発もそうですし、BBQ やキャンプなんかもあります
- 友達も１００人くらい余裕でできます、たぶん

ﾄﾓﾀﾞﾁ
<blockquote class="twitter-tweet"><a href="https://twitter.com/RymanSat/status/1112305254928773122" /></blockquote>


## みんなめちゃやる気ある

- 当たり前ですけど、みんなやりたくて参加してるので、すごいやる気あるんです
- 正直、職場では考えられないです
- しかも優しい 😙


## 普段やらない開発ができた

- やってみたかった機械学習の実装できました
- ラズパイで動かすので、実行環境についても色々勉強になりました
- メーカーフェアにも参加できたし 🤖

<blockquote class="twitter-tweet"><a href="https://twitter.com/RymanSat/status/1025981944570380289" /></blockquote>


## 雑誌に載った

- ちょこっとですが、[ラズパイマガジン](https://www.amazon.co.jp/dp/B07V27L64H)に載りました
- 奇跡 ✨

![ラズパイマガジン 2019年8月号](https://res.booklive.jp/632866/001/thumbnail/2L.jpg)


## 技術の話が聞ける

- ていうかそもそも技術大好きなんで、周りに技術者がいるだけでサイコーです
- 自分に馴染みのない技術を持ってる人たちがうなるほどいるので、よりどりみどり
- 特にハードウェア系がすごい（気がする

<blockquote class="twitter-tweet"><a href="https://twitter.com/RymanSat/status/1194941943005863936" /></blockquote>


## 色んな人がいる

- 技術だけじゃなく、色んな人がいて、色んな話が聞けます
- 年齢も様々で、毎回新しい人がやってくるのです（さすが広報
- イベントも何か色々やってます

<blockquote class="twitter-tweet"><a href="https://twitter.com/RymanSat/status/1200197573220261888" /></blockquote>

どうじゃ？
良いことばかりじゃろ？


# 気になる点

良くなかった点も色々書こうかなと思ったんですけど、あまりなくてですね・・・強いていうのであれば、

- 土日が溶ける
- みんな喋りまくるから、メッセンジャーの通知がすごいことにｗ
- 他にも色々貢献できることあったような・・もっと手を挙げればよかった

とかでしょうか。


# つまり

- リーマンサットに限らず、社外のコミュニティに参加するのオススメ
- 技術スキーであれば、なおさらオススメ 👍
- 最初はハードル高く感じるかもですが、飛び込んでみれば何だかんだで楽しめます


# 今後

僕が携わってる開発は、今年で終了する予定です。寂しい 😂
でも、せっかく色んな人と知り合いになり、またこれからもどんどん新しい人が入ってくるという環境があるので、リーマンサットでの活動は今後も続けていきたいなと思ってます。
まだ何も決めてないですけど。

---

というわけで、リーマンサット・プロジェクトは「普通の人が集まって宇宙開発しよう」を合言葉に活動をしている民間団体です。
他では経験できない「宇宙開発プロジェクト」に誰もが携わることができます。
興味を持たれた方は[リーマンサットのホームページ](https://www.rymansat.com/join)からお気軽にどうぞ。

次回は @akatuki97 さんの記事、「太陽系の運動をシミュレーションしてみる」になります。
macOS Catalinaの標準コマンドで画像変換(png->jpg)

iPhoneで撮った写真をAirDropでMacOSに転送したら`.png`形式だったので、
MacOS標準コマンドで`.jpg`形式コンバートしてみた。

`sips -s format jpeg hoge.png --out hoge.jpeg`

最初フォーマットに`jpg`を指定したら怒られた。

バージョン情報
`% sips -v
sips-294`
NetBeans IDEでPythonを使用する際に、"Wrong Python Platform"の警告が出てしまった時の対応


#そもそもPythonってNetBeansでやらないほうがいいよね
知ってます。
でもSublimeでやろうとしたらステップ実行のやり方よくわからないし、（そもそもNetBeansでできるかは知りませんが、Javaならできたしいけるっしょ的なバイブスで）NetBeans IDEを使ってみています。

###環境
OS : Windows 10（x64)
Python : 3系を公式ページからインストーラでインストール済
NetBeans : V11.2を公式ページからインストーラでインストール済 + Python用のライブラリをインストール＆設定済（参考リンクのページ参照）

###問題が発生した場所
Pythonのプロジェクトを作成しようとしたらこの画面で赤く囲っている部分のドロップダウンリストがうまく表示されず、プラットフォームを選ぶことができなかった。（ついでに警告で、Wrong Python Platformの文字が下に表示されていた）
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104555/4158190b-a642-8b8b-ebf9-758849674856.jpeg)
これはJavaでいうところのクラスパスみたいなのが通っていないのだと理解。

###解消方法
画面右下の「Manage・・・」となっているボタンを押下して、ポップアップを開く。
ポップアップの画面左下のNewボタンを押すとファイルパスを聞かれるので、Python.exeをインストールしたパスを選択し、ポップアップを終了する。
![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104555/78852e0e-57df-b155-dee8-272d97d2e6cb.jpeg)
これでドロップダウンにてプラットフォームを選べるようになるので、Pythonプロジェクトを作成できる。


参考にしたもの
https://blogs.oracle.com/geertjan/python-in-netbeans-ide-802
https://qiita.com/kure/items/81cb87ebec73d24a7848
Windows展開サービスでパーティション作成も自動化する

仕事で得た知識の備忘録です。あるいは似たようなこと調べてる人へのヒントです
##やりたいこと
・以下の順の構成でパーティションを作成してWindows 10を展開したい
1. システム領域 128MB
2. MSR領域 128MB
3. Windows領域（Cドライブ） 200GB
4. データ領域（Dドライブ）↓を作成した残りすべて
5. リカバリー領域 3GB
・キッティング作業者の負荷は下げたいので必須選択項目以外は自動化したい

##環境
サーバー名　SVR1
	Windows Server 2016
	DHCP、DNS、Active Directory、windows展開サービス（以下WDS）を起動・開始している状態
	ドメイン名　internal.local
	SVR1にはDドライブがデータ領域として存在し、D:\imagesにイメージをいったん格納
展開OS：Windows 10 ProまたはEnterprise、UEFI

##用意するファイル
###winpeshl.ini
WindowsPEで自動実行させたいアプリケーションなどを記載するファイル。
batファイルはStart.cmdがよい、と[公式でも述べられている](https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-mount-and-customize#addstartupscript)けれど、WDSでは読み込まれないようなので、こっちに記載。
参考：

```plaintext:winpeshl.ini
[LaunchApp]

[LaunchApps]
X:\Windows\system32\cmd.exe,/c X:\sources\init.bat
X:\sources\setup.exe, /wds /wdsdiscover /wdsserver:SVR1.internal.local
```
###バッチファイル
winpeshl.iniから読み込ませるバッチ。電源オプションの設定と、diskpartの起動。

```plaintext:init.bat
@echo off
powercfg /s 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
echo パーティションの設定をしています
diskpart /s X:\sources\diskpart.txt >nul 2>&1
exit /b
```

###Diskpart用テキストファイル
パーティション作成の記述。

```plaintext:diskpart.txt
select disk 0
clean
convert gpt

create partition efi size=128
format quick fs=fat32 label="system"

create partition msr size=128

create partition primary size=204801
format quick fs=ntfs label="PC"
assign letter=C

create partition primary
shrink minimum=3072
format quick fs=ntfs label="Data"
assign letter=D

create partition primary
format quick fs=ntfs label="Recovery"
set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
gpt attributes=0x8000000000000001
exit
```
###応答ファイル
サーバーへの接続設定と、インストール先パーティションは指定しておき、WDSを自動化する。
展開するイメージは複数あるため、ここでは明示しない。

```xml:unattend.xml（一部）
            <WindowsDeploymentServices>
                <Login>
                    <Credentials>
                        <Domain>internal.local</Domain>
                        <Password>********</Password>
                        <Username>wdsuser</Username>
                    </Credentials>
                </Login>
                <ImageSelection>
                    <InstallTo>
                        <DiskID>0</DiskID>
                        <PartitionID>3</PartitionID>
                    </InstallTo>
                </ImageSelection>
            </WindowsDeploymentServices>
```

##格納
作成したファイルは以下の箇所に格納。
winpeshl.ini
	ブートイメージ内 Windows\system32
diskpart,txt, .bat
	ブートイメージ内 sources 
WDSunattend.xml
	WDS管理マネージャーでプロパティ→クライアントの「無人インストールを有効にする」にチェックを入れ、x64(UEFI)にこのファイルを設定

##備考
Diskpartで指定しているディスク番号は複数のSSD・HDDを搭載している機種では確認が必要。物理ディスクが一つなら0と決め打ちしています

##参考
[Windows PEを起動させたら操作なしにwimの適用を行いデスクトップ画面まで表示させる](https://qiita.com/kwhrkzk/items/543284b357108c5906b2)
[WinPE: Mount and Customize](https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-mount-and-customize)
[Winpeshl.ini Reference: Launching an app when WinPE starts](https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpeshlini-reference-launching-an-app-when-winpe-starts)
[Windows Setup Command-Line Options](https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-setup-command-line-options#wdsdiscover)
ブラウザによるOriginヘッダーの違いまとめ

ブラウザによって、あるケースではOriginヘッダーが付与されなかったりして困りました。
あまりそういう人はいないのか、ググってもあまりヒットしなかったので調べた結果を残しておきます。

## 調査したブラウザ
- Chrome 79.0.3945.130
- Firefox  72.0.1 
- Microsoft Edge  44.18362.449.0 (EdgeHTML 18.18362)
- Internet Explorer11   592.18362.0

## 調査したパターン
下記の組み合わせでリクエストヘッダーにOriginが設定されるか否かを調査。
- リクエストメソッドはPOSTとGETに絞った
- 接続先は同一ドメイン・別ドメインで検証
- フォーム送信、Fetch API、XMLHttpRequestの３パターンを検証

## 調査結果
### フォーム送信
- ChromeとFirefoxはPOST時にはOriginが設定された。
- **EdgeとIE11は設定されない**

|クロスドメイン||同一ドメイン||
|------|---|----|-----|
|POST      |   GET  |   POST  |   GET|
| あり※　|　なし　| あり※　|  なし|

※EdgeとIE11以外

### Fetch API
- （**Fetch APIに対応していないIE11を除く**）すべてのブラウザはすべて同じ挙動だった
  - クロスドメインへのアクセスはGETかPOSTかに関わらず、Originヘッダーが付与される
  - 同一ドメインへのアクセスでもPOSTの場合はOriginヘッダーが付与される

|クロスドメイン||同一ドメイン||
|------|---|----|-----|
|POST      |GET  |POST  |   GET|
|  あり　|あり　|あり　|なし|

### XMLHttpRequest
- クロスドメインへのアクセスはGETかPOSTかに関わらず、どのブラウザでもOriginヘッダーが付与される
- 同一ドメインへのPOSTもGETも基本的にはOriginヘッダーが付与される
 - **但し、IE11はGETの場合は付与されない**

|クロスドメイン||同一ドメイン||
|------|---|----|-----|
|POST      |   GET  |   POST  |   GET|
| あり　|　あり　| あり　　| あり※IE11以外|

## まとめ

https://tools.ietf.org/html/rfc6454#section-7
> The user agent MAY include an Origin header field in any HTTP request.

RFC的には明確にどの場合に付与するか決まってないようです。
Edgeはバグのような記述を見ましたが、IE11の挙動が変わる気がしないので使いにくい属性だと思いました。
Let's encryptのcertbot renew でpythonのdecodeエラーが出た場合の対応

なんか開発環境の証明書が有効期限切れしていたので手動でrenewしようとしたらエラーでできなかった

```console
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
```
どうもASCIIで解釈できませんぜって事らしい。

## 原因
原因はnginxのconfファイルに日本語でコメントが書いてあり、confファイルのエンコーディングがUTF-8だったから

## 対応策
### 日本語コメント消す
日本語のコメントを削除してもう一度```certbot renew```
シンプル！簡単！早い！
### pythonのdefault encodingを変える
``/usr/lib/python2.7/site-packages/sitecustomize.py``を作って、以下のコードを記述する。

```python
import sys
sys.setdefaultencoding('utf-8')
```

## せっかくなのでcertbotのコードを読んでみる
該当のエラーログ

```console
DEBUG:certbot._internal.error_handler:Encountered exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/certbot/_internal/auth_handler.py", line 70, in handle_authorizations
    resps = self.auth.perform(achalls)
  File "/usr/lib/python2.7/site-packages/certbot_nginx/_internal/configurator.py", line 1114, in perform
    http_response = http_doer.perform()
  File "/usr/lib/python2.7/site-packages/certbot_nginx/_internal/http_01.py", line 60, in perform
    self.configurator.save("HTTP Challenge", True)
  File "/usr/lib/python2.7/site-packages/certbot_nginx/_internal/configurator.py", line 1049, in save
    self.parser.filedump(ext='')
  File "/usr/lib/python2.7/site-packages/certbot_nginx/_internal/parser.py", line 243, in filedump
    out = nginxparser.dumps(tree)
  File "/usr/lib/python2.7/site-packages/certbot_nginx/_internal/nginxparser.py", line 133, in dumps
    return str(RawNginxDumper(blocks.spaced))
  File "/usr/lib/python2.7/site-packages/certbot_nginx/_internal/nginxparser.py", line 97, in __str__
    return ''.join(self)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 2: ordinal not in range(128)
```

``nginxparser.py``で問題が起きてるらしい。
で、読み込むと元のファイル読み込み処理は``parser.py``にあった。ここで文字コード特に指定せずにやってるので、環境設定のデフォルトの文字コードが使われたらしい。久しぶりにpythonのコード読むので何か色々変わっててよくわからん。

で、[Let's Encryptのフォーラム](https://community.letsencrypt.org/t/certbot-fails-to-create-certificates-with-nginx-when-there-is-non-ascii-characters-in-config-files-when-using-python-2-7-and-centos-7-5/81267)見てみたら悲しい現実が発覚。

> I think you’re right and the certbot team agree, as linked by @_az there is work in progress, but it’s a lot of work:

https://github.com/certbot/certbot/pull/5341
これなんか２０１７年から戦っとる。

Unicodeサポートの現状はこれ
https://github.com/certbot/certbot/projects/2

https://github.com/certbot/certbot/pull/6725 このPRでかなり良いとこまで進んでるんだけど、「テストが足りなくて完了できんよー」ってのが最新のステータス。
誰かテスト書いてあげてくれ...

追記: 朗報！マージされた！ https://github.com/certbot/certbot/pull/7797
MacBookで外付けUSBカメラを使用し、PythonからOpenCVで画像を表示する

# 概要
MacBook Proで内蔵のカメラ(FaceTime HD Camera)ではなく、USB接続したカメラを使用し、Pythonからカメラ画像を取得し、表示した。

# きっかけ
MacBookでUSBカメラを接続してみたが、すんなりと扱えなかった。調べるとどうやらCamTwistというソフトを利用すると解決するらしい。
そして、CamTwistを起動したままにしておく必要がある。

# 環境
- macOS 10.14
- MacBook Pro 13
- Python 3.7
- CamTwist 3.4.3

# カメラ画像の取得
内蔵のカメラ画像を取得する場合は、このスクリプトで表示できる。

```camera.py
import cv2

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    cv2.imshow('camera', frame)
    if cv2.waitKey(1)==27: # ESCで抜ける
        break
cap.release()
cv2.destroyAllWindows()
```

# CamTwistをインストール

http://camtwiststudio.com/
dmgをダウンロードし、pkg（インストーラ)を起動すると.appファイルが入る。

webcam->AppleScript->Webcamと進み、「FaceTime HD Camera」を「USB_Camera #~」に変更した。

<img width="870" alt="CamTwist.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365444/46edf178-bcba-589b-9a32-5cdc5cdfc2ad.png">

CamTwistを起動したまま、VideoCaptureのデバイスIDを1〜に変更して起動してみる。
私が実行したときは2で取得できた。

```camera.py
import cv2

cap = cv2.VideoCapture(2)

while True:
    ret, frame = cap.read()
    cv2.imshow('camera', frame)
    if cv2.waitKey(1)==27: # ESCで抜ける
        break
cap.release()
cv2.destroyAllWindows()
```
【docker alpine linux】でbashの使用方法

# docker alpine linuxでbashを使用するために
## 結論
以下のコマンドを叩くとbashが使用できるようになります。

```
apk add bash
```

## alpine linuxのshell
alipine linuxでは、デフォルトのshellに`ash`が使用されています。
`bash`を使う場合は、事前に`apk add bash`を叩いておく必要があります。

```
$ docker run -it alpine:latest apk add bash && bash -c "echo test"
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz
(1/5) Installing ncurses-terminfo-base (6.1_p20191130-r0)
(2/5) Installing ncurses-terminfo (6.1_p20191130-r0)
(3/5) Installing ncurses-libs (6.1_p20191130-r0)
(4/5) Installing readline (8.0.1-r0)
(5/5) Installing bash (5.0.11-r1)
Executing bash-5.0.11-r1.post-install
Executing busybox-1.31.1-r9.trigger
OK: 15 MiB in 19 packages
test
```

P.S: `sh`は既にインストール済みなので`#!/bin/sh`で記載されたスクリプトなどは動かせます。
ど素人が初めてGitをさわってみた！

##はじめまして、ど素人です
元教員→IT経験７か月目です。
いわゆるど素人というやつです。
ブログを書く習慣など全くない自分が、
頑張ってQiitaを書くという無謀に挑戦してみます。(笑)

そして、

なんと

この間、初めてのGitを触ったので、
今回は手始めにダウンロードの手順を書いてみることにしました。
読みづらい、意味わからないところはご愛敬ということで、
何卒よろしくお願いします(笑)


##Gitってなんだーーーー！？
そもそも、今の会社に入社してから度々、

「Gitにあげる」
「Githubにあげる」

という言葉を耳にしていた自分。

Jenkinsについて調べてもGitというワードが出てくる…

調べてもイマイチよくわかんないし、
特に現場で使うこともなく、早７か月…。

さすがにどんなものなのか知りたくなったので、
(正しくは、もうそろそろ知らなきゃいけないという焦りです笑)
実際にお勉強会に参加することにしたのでした。

##Gitとは
Gitとは
分散型バージョン管理システム
とのことです(笑)

何のことだってばよ？？

すごく簡単なイメージとしては、
もととなるコードが共有されている。
そこから、
もととなるものはそのままに、
新たに、もとのコードにどんどん書き加えて新しいものを作っていく。
元のコードをいじっているわけではないので、
前のものはそのまま残っているを繰り返していく方法。
戻りたいコードにいつでも戻ることができるので(消さなければの話だけど)安心。
という管理の仕方です。

ポケモンで例えると、
いつでも好きなセーブデータに戻れる。
といったところでしょうか。


##そもそもGitってどうやってPCに入れるの？？

①自分のPCはWindowsなので、下記のURLからダウンロード
https://gitforwindows.org/

こんな画面がでてくるので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495424/30f49bae-e480-ad6c-7e7b-2060d89a21df.png)

「ダウンロードは」をポチる



②ダウンロード後、「Git-2.25.0-64-bit」がダウンロードされているので開きます
　初期設定のままどんどん設定を進めていきます。
　(スクリーンショットを忘れるという痛恨のミス…)
　
③ダウンロードがすんだら、
Windowsのスタート画面に下記のように
・Git GUI
・Git CMD
・Git Bash
の３つが追加されていたら設定完了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495424/86420c11-85da-f7bb-02b2-a709edf928c5.png)

作業は以上！
意外と簡単かも！？
python学習　アウトプット

パソコンもロクに触ったことのない中卒boyがプログラミングで人生変えよう！ということで最近やりはじめたプログラミング（python）学習をアウトプットして行こうと思います。。。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ちなみに今使っている教材は、動画学習サービスのUdemyというもので勉強しています！

今日の学習内容は、、、
34. デバッガーを使って確認してみる

35. 比較演算子と論理演算子

36. InとNotの使い所

37. 値が入っていない判定をするテクニック

38. Noneを判定する場合

39. while文とcontinue文とbreak文

40. while else文

41. input関数

42. for文とbreak文とcontinue文

43. for else文

44. range関数

45. enumerate関数

46. zip関数

47. 辞書をfor文で処理をする

48. 関数定義

49. 関数の引数と返り値の宣言

50. 位置引数とキーワード引数とデフォルト引数
以上です。。

いやぁ、、基礎で覚えることありすぎやろっ、、ってもはや頭がパンクしながらコツコツ勉強してます。。
Sassで出来ること【vol.3】関数

Sass勉強中の為、出来ることを備忘録がてら纏めて書いていきます。

#関数

**scssは関数を使用することが出来ます。**
Sassですでに用意されている組み込み関数というものもありますが、
自身で関数を作成することも出来ます。

##組み込み関数

組み込み関数はたくさんあるので、例として「lighten」関数を紹介します。
関数の使用方法はとてもシンプルです。

```scss:.scss
.hoge {
    color: lighten(#000000, 50%);
    //#000000は黒
}
```

cssに変換するとこの様になります。

```css:変換後の.css
.hoge {
    color: gray;
}
```

**　lighten(指定色,輝度を上げる%);**　で記述をしています。
**「#000000」**（黒）が**「50％」**明るくなった色である**「gray」**に変換されました。


##自作関数
自身で関数を作る記述方法を紹介します。
数値を２倍にする簡単な関数です。

```scss:.scss
@function nibai($value) {
    @return $value *2;
}
.hoge {
    width: nibai(100px);
}
```

**「@ function」**で関数を定義し**「@ return」**で戻り値を示しています。
cssに変換するとこの様になります。

```css:変換後の.css
.hoge {
    width: 200px;
}
```

**nibaiに渡した100pxが200pxに変換されました。**

#リンク
[Sassで出来ること【vol.1】Sassとは？](https://qiita.com/torajiro_u/items/f7b5ba19b51de956cb88)
[Sassで出来ること【vol.2】入れ子(ネスト)・変数](https://qiita.com/torajiro_u/items/2f8370b92eaee17beb61)
Sassで出来ること【vol.3】関数
[Sassで出来ること【vol.4】継承](https://qiita.com/torajiro_u/items/fa4b492753b4a1925724)
[Sassで出来ること【vol.5】mixin(ミックスイン)]
(https://qiita.com/torajiro_u/items/96ee60174c1b3e561f3e)
MERGE文が意外と遅い（C#でCSV取り込み（SQLSERVER））

# MERGE
・１レコードずつMERGEを実行する…2000件で1分ほど
　↓
・コマンドを作成後、一括して実行…2000件で45秒ほど

#SELECTで存在チェック後、INSERT、UPDATE
・１レコードずつ存在チェック後、INSERT、UPDATE…2000件で1分半ほど
　↓
・１レコードずつ存在チェック後、INSERT、UPDATEを一括実行…2000件で15秒半ほど
[Entity Framework] LINQ to Entities からデータベース関数を呼び出す（～EF5／EF6／EF Core）

Entity Framework では [LINQ to Entities](https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/ef/language-reference/linq-to-entities) でデータ抽出ができて便利ですが、データベース関数を使いたいケースもあります。
どのような方法が用意されているか、EFバージョンごとに見ていきましょう。

# Entity Framework 4/5

EF5 までの Entity Framework は .NET Framework の一部として提供され、NuGet パッケージで拡張されていました。

## [System.Data.Objects.EntityFunctions クラス](https://docs.microsoft.com/ja-jp/dotnet/api/system.data.objects.entityfunctions)

EntityFunctions クラスの静的メソッドを使用することで、標準的なSQL関数を呼び出すことができます。

たとえば、開始日から終了日までの日数を取得したいとき、

```c#
EntityFunctions.DiffDays(e.StartDate, e.EndDate)
```
のように記述すると、SQL Server であれば、

```sql
DATEDIFF (day, [Extent1].[StartDate], [Extent1].[EndDate])
```

のようなSQLに変換されます。

## [System.Data.Objects.SqlClient.SqlFunctions クラス](https://docs.microsoft.com/ja-jp/dotnet/api/system.data.objects.sqlclient.sqlfunctions)

SQL Server 固有の組み込み関数を呼び出すことができます。
上記の日数取得は、SQL Server のみをターゲットに SqlFunctions で記述する場合、

```c#
SqlFunctions.DateDiff("day", e.StartDate, e.EndDate)
```

となります。

# Entity Framework 6

EF6 は EntityFramework.dll を中心としたオープンソースのライブラリとして .NET Framework から独立して提供されるようになりました。

## [System.Data.Entity.Core.Objects.EntityFunctions クラス] (https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.core.objects.entityfunctions)

EntityFunctions は System.Data.Entity.Core.Objects 空間で提供されていますが、非推奨となっています。

## [System.Data.Entity.DbFunctions クラス](https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.dbfunctions)

非推奨となった EntityFunctions クラスに代わって使用できます。

```c#
DbFunctions.DiffDays(e.StartDate, e.EndDate)
```

と書くと

```sql
DATEDIFF (day, [Extent1].[StartDate], [Extent1].[EndDate])
```

のように変換されます。

## [System.Data.Entity.SqlServer.SqlFunctions クラス](https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.sqlserver.sqlfunctions)

SQL Server 向けの SqlFunctions は System.Data.Entity.SqlServer.SqlFunctions 名前空間から提供されています。

## [SqlQuery メソッド](https://docs.microsoft.com/ja-jp/ef/ef6/querying/raw-sql)

SqlQuery メソッドを使うことで、生のSQLクエリを直接指定して実行することもできます。

# Entity Framework Core

## [Microsoft.EntityFrameworkCore.DbFunctions クラス](https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbfunctions)

DbFunctions クラスが使用できます。
静的クラスだった EF6 と異なり、静的プロパティ経由でインスタンスとして提供されます。

```c#
EF.Functions.DateDiffDay(e.StartDate, e.EndDate)
```

と書くと

```sql
DATEDIFF(DAY, [a].[StartDate], [a].[EndDate])
```

のように変換されます。

## [FromSqlRaw 拡張メソッド](https://docs.microsoft.com/ja-jp/ef/core/querying/raw-sql)

FromSqlRaw 拡張メソッドを使うことで、生のSQLクエリを直接指定して実行することもできます。
PowerShell による Windows の SSH クライアントの有効化

管理者としてPowerShellを起動します

# SSHのインストール

```powershell
> Get-WindowsCapability -Online | ? Name -Match ssh


Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

> Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
```

# ssh-agent の有効化

```powershell
# 自動起動
> Set-Service ssh-agent -StartupType Automatic
# 開始
> Start-Service ssh-agent
```

ssh コマンド周りはUnixと変わらないです。

```powershell
> ssh-keygen -t ed25519
> ssh-add ~\.ssh\id_ed25519
> code ~\.ssh\config
```

```~\.ssh\config
Host HOSTNAME
    HostName xxx.xxx.xxx.xxx
    User USERNAME
    IdentityFile ~\.ssh\id_ed25519
```

```powershell
> ssh HOSTNAME
```
vuejs axios クロスドメイン対策

postの場合、サーバサイドでなんとかなったが、
getの場合うまく行かなかったのでfrontエンドで下記のようにした

```
    data: () => ({
        ...
        headers: {
            'Content-Type': 'application/json;charset=UTF-8',
            'Access-Control-Allow-Origin': '*',
        }

        axios.get(this.apiBaseUrl + '(URL)', this.headers)
            .then((response) => {
                this.xxx = response.data;
            })


```