OmniAICreator/Qiita-1.07M huggingface dataset:
csvファイルに入っている日本語のリストをgoogle翻訳で英訳する

#CSVファイルに入っている日本語リストを翻訳し、別のCSVファイルに対応させて、出力する。
まずターミナルで 
`pip install googletrans`
と打ってpythonパッケージをインストールしてください。

```python:ja_to_english.py
import pandas as pd
from googletrans import Translator
translator = Translator()
data=pd.read_csv('trans.csv')
english_list=[]
for i in data['japanese']:
    dst = translator.translate(i, src='ja', dest='en')
    english_list.append(dst.text)
    
data['english']=english_list
data.to_csv("result.csv",encoding='utf_8_sig' ,index=False)
```
以上のようなファイルを作り、ターミナルにて
`python ja_to_english.py`
で実行してください。

### trans.csvの例

| japanese|      english |  
|:-----------------:|:------------------:|
| 赤         |              |        
| 黄色         |            |       
| 黒       |           |        
| 日本語        |              |  
| 英語          |            |       
| アボカド       |       |      

### 出力されるresult.csvの例

| japanese|      english |  
|:-----------------:|:------------------:|
| 赤         |       red       |        
| 黄色         |        yellow    |       
| 黒       |      black     |        
| 日本語        |      japanese        |  
| 英語          |   english         |       
| アボカド       |    avocado   | 



#参考
[pythonで日本語を英語に翻訳したい](https://teratail.com/questions/168918)
JavaScriptの関数について

# はじめに
Java出身である自分自身、JavaScript関数のJava関数とは異なる挙動を整理しきれていないと感じていてため、一覧にまとめた。

## JavaScript 関数概要
まずはじめにJavaScriptにおける関数（以下、関数と呼ぶ）は第1級オブジェクトである。第1級オブジェクトとは生成、代入、演算、受け渡しができる対象のこと（=値である）と定義されている。つまり関数はオブジェクトであり、値である。以下、JavaScriptにおける関数について他の言語にはない特徴や性質を中心に列挙していく。

### 関数宣言と関数式
#### 定義
関数宣言は以下のように定義する

```javascript
function add(num1, num2){
  return num1 + num2;
}
```
関数式は以下のように定義する

```javascript
var add = function(num1, num2){
  return num1 + num2;
}
```
#### 関数の巻き上げ
変数や関数の宣言が、自身のスコープ内のコードの一番上に来ているかのような動作を巻き上げという。関数を使用するコードを書いた後にその関数を宣言することができる。関数宣言では関数の巻き上げが行われる。

```javascript
var result = add(5,5);

function add(num1, num2){
  return num1 + num2;
}
```
関数式では関数巻き上げは行われない。つまり以下はエラーが発生する。

```javascript
var result=add(5,5);

var add=function(num1, num2){
  return num1 + num2;
}
```
先の関数の巻き上げについての説明にて`関数を使用するコードを書いた後にその関数を宣言することができる`と、あたかも便利であるというニュアンスで述べているが、基本的には関数の巻き上げが実行されるようなコードは書くべきではないとされる。他のたいていの言語なら当てはまるコードを上から読んでいくという行動ルールから外れることを余儀なくされるからである。他人がコードを見る可能性が有る限り、関数は必ず変数に代入し、使用する前に定義した方が良いとされる。


### 関数の受け渡し
関数概要で述べたとおり、関数はオブジェクトであり、値である。つまり関数を値のように受け渡すことができる。

```javascript
function hoge(){
    console.log("hoge!");
}

  hoge();
  // hoge!と表示

  var hoge2 = hoge;

  hoge2();
  // hoge!と表示
```

### 関数の引数
関数には任意の数の引数を渡すことができる。

```javascript
function reflect(value){
  return value;
}
console.log(reflect("Hi"));
console.log(reflect("Hi",25));
```

### オーバーロード
同じ関数名の複数の関数を、その関数が持つ引数の型、数、並び順によって実行する関数を呼び分けるのがオーバーロードである。しかし「関数の引数」の項目で述べたとおり、JavaScriptの関数は任意の引数の数を取ることができる、また型は指定されていない。以上よりJavaScriptはオーバーロードをサポートしていない。JavaScriptでは同じ名前で複数の関数を定義すると、最後に定義した関数が有効になり、先に定義した関数は消える。

```javascript
function sayMessage(message){
    if(arguments.length===0){
      message="デフォルトメッセージです";
    }
    console.log(message);
  }
  sayMessage("Hello");

  sayMessage();
```

# 最後に
コンストラクタの挙動は今後追記したい。
#参考文献
[オブジェクト指向JavaScriptの原則](https://www.amazon.co.jp/オブジェクト指向JavaScriptの原則-Nicholas-C-Zakas/dp/4873116813 "オブジェクト指向JavaScriptの原則")
AE-TYBLE16でBLE通信で情報取得できる加速度センサーを作る

# 利用する部材
| 種類      |       製品名|    URL|
|:-----------------|------------------:|:------------------:|
| Arduino       |       AE-TYBLE16|   http://akizukidenshi.com/catalog/g/gK-12339/  |
| 加速度センサ(電圧型)    |KXSC7-2050  |   http://akizukidenshi.com/catalog/g/gK-07243/  |

AE-TYBLE16をArduinoで利用する方法については[小型 Bluetooth LE モジュール AE-TYBLE16とボタン電池でビーコンを作る](https://qiita.com/MypaceEngine/items/cc7ccbd799801735112b)を参照。

#作り方
KXSC7-2050はXYZ方向の加速度をセンシングでき、センシング値は電圧で出力されます。
配線は下記。
<img width="283" alt="sample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354086/c95ba0cf-7d96-d8fe-b279-5a02047fc56d.png">

DeviceNameは”AccelerationSensor”です。
Androidの場合は[nRF Connect](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=ja)で値を確認することができます。

AE-TYBLE16では1つのCharacteristicを利用するため、XYZを(z*1024+y)*1024)+x)な値に計算して入れています。

ソースコードは下記にアップしました。
https://github.com/MypaceEngine/ae-tyble16-accelerator.git
困りごとを伝える手段として分報をやってみよう

# 分報とは
次のリンク先に書いてあることがほぼ全てです。
→http://c16e.com/1511101558/
名前の通り、一日のやった事をまとめるのが日報なのに対して、今起きている事を書くのが分報です。しかし、日報とは用途が全く異なります。そんな分報をもっと指定いただければなと思った記事。
slackやTeamsといったチャットツールを使う事を前提とした記事になりますので、まだ導入していないかたはぜひslackの導入からどうぞ笑

# なんで分報なんかやるの？
　すごく簡単に言うと、報連相質を簡単に行うためです。
　・今何をやっているか
　・何で困っているか
　・何が終わったか
　etc

　これだけ書くと、日報でも良くない？って思われるかもしれませんが、ポイントは、**リアルタイムで共有できる**と言う点です。さらに、**困っている事を伝える時**に絶大な効果を発揮します。

# どうやるの？
　チームによって好みは分かれると思いますが、私の所属するチームでは開発メンバーが全員いるchannelで**メンションを付けずに**記入します。例えば次のような感じです。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

私 < postgreSQLにvalueがnullのデータでフィルタするSQLを投げてるはずなのに期待したレスポンス返ってこないなー
先輩 < = nullで比較してない？postgreSQLはオプションつけていないと is NULLで比較しなきゃだよ。ここに書いてある⇨[参考](https://www.postgresql.jp/document/8.0/html/functions-comparison.html)
私 < なるほど！

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

みたいな感じ。私の発言はほぼ独り言ですが、先輩が拾ってくれたおかげで、すぐに解決できました。しかもチャットなので参考リンクとかもいただけて先輩の言葉だけでなく自分で詳しく調べることもできました。また、メンションをつけていない場合、特定の人に通知が行かないため、チャットを読む余裕がある人が反応してくれることが多く、チームメンバーの負荷が特定の人に偏ることも回避できます。

もう一つ例をあげます。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

私 < httpリクエストごとに読み込む設定ファイルの値切り替えたいけど、切り替え不要な時代の既存のコードで参照している箇所が多すぎてどうすれば修正箇所を最低限に抑えられるかが分からん。できれば、毎回大規模修正とかしないように今回の修正でトドメを刺しておきたい。
先輩 < 確かにそこは本システムでかなり参照回数多いですからね、２０分したら手が空くのでそこで直接話しましょう。
私 < ありがとうございます！！

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

分報経由で直接相談まで持っていけました。このように、分報で困りごとを聞くメリットとしては、直接相談するよりも他人の時間を奪わない事です。忙しくて質問に答えられない人は、分報をスルーすることもできます。それに今忙しくても時間別途確保して相談ということも可能です。

　また、分報は聞いてもいいか分からないけど調べても良く分からないと言う微妙なラインの時に気軽に利用するのに便利です。上で一例書きましたが、結構しょーもない事でも参考リンクだけ送ってくれるとかで聞く側としては非常に助かりますし、困りごとの内容からその人のスキルレベルがわかるのもいい点です。基本的な事からわかっていないなら、チームとしてサポートを手厚くしようと対応できますし、高度な困りごとを抱える人なら、分報で議論はするけどある程度自由にやらせても成果出してくれるとか、特に入れ替わりの激しいチームとかだと重宝します。

# 特に新人エンジニアは分報してほしい
　私は今年初めて後輩ができました。一番最初に命じたのが分報です。新人からすると、特に直接人に質問するのに抵抗があると思います。先輩が「分からないことがあったらすぐに聞いてね」と本心で言っていてもやはり新人としては難しいものです。ですが、「分からないことがあったら分報で言ってね」と言うと結構やってくれます。OJT担当以外の人でも返事できますし、忙しい時は一旦スルーして時間に余裕ができたら回答すると言う非同期のやりとりも可能なので、直接よりはハードルが低いのが理由なのかなと思ったり。それでも直接話す必要も多々ありますので、そんな方はとてもためになる記事がこちら⇨https://qiita.com/yasuX/items/bca386bc47322f22072a
私もすごく参考にしました。

　また、毎回同じ人が回答するのではなく、色々な人が回答すると、どの人がどんな知識を持っているのか。どんなキャラなのか。見た目怖いけど以外に面倒見がいい人だ。と言ったことも見えてくるため、チームに溶け込むのも早くなると思います。

# まとめ
　チャットツール使っているならぜひ分報！
Obniz Boardケースをレーザーカッターで作ってみた

#概要
以下の三つをふと思い、レーザーカットでObniz Boardケースを作ってみた。

- Obniz BoardはArduinoやRaspberry Piみたいにチープで安価なケースが存在していない。
    - 一応3Dプリンタとかで出力もできる(https://make.dmm.com/item/941061/)
    - ほかにも結構ロバストな感じなものもある(https://kitto-yakudatsu.com/page-6435)
    - メタルないい感じなものもある(https://shop.tsukumo.co.jp/goods/4943508090134)
- レーザーカットでも簡単に作れそうなのに、なぜか作ってる人を聞かない
- ロボロボしたものを作るとき、固定する際に不格好になりがち。
    - だけどPoC用途でつかうことが殆どなため、解体しやすい形じゃないと困る。

これ以降の話題はすべて自己責任な！

#出来上がり見本
レーザーカットしたものを組み立てするとこんな感じ。

![main.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/ac2bd7c1-0b41-16f0-988f-3a884c88eb06.jpeg)

![back.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/ebe81f96-d063-367b-263d-4fb9080d71b6.jpeg)

ほかにも変わり種もあるよ！
![Inkedothers_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/bccda052-0587-6469-6cba-fae6c9c9bf6a.jpeg)

四つ足はユニバーサルプレート互換。

![univ1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/61b9e361-2afe-463f-bb6f-3fb936c47fd2.jpeg)

レーザーカットに使ったレーザーカッターはVenusⅡです。

2019/10/8(火)の段階だと、品川産業交流施設のSHIPの工房にて設置してあります。
もしSHIPのレーザーカッターを使用するのであれば、施設にあるCorelDRAW X4(古いｗ)でデータを
インポートして「全選択→ペン先アイコンにて“極細線”を選択→黒部分を削除」でカットデータを
改めて作ったほうがいいかも。
あと、2.5mmのMDF板から作る際には、赤線に対応する出力を95%,スピード1.2にすると
いい感じにカットできます。

- VenusⅡ(https://www.comnet-network.co.jp/products/gcc-laser/venus/)
- SHIP(https://www.ship-osaki.jp/)

# レーザーカット用のPDFデータ

Corel DRAW home & Student 2019にて作成しました。
有償配布はライセンスの適用外なため、無償でデータを公開します。
誰かの礎になれば幸いなのです。

- Obniz Board case(PDF, A4サイズかつ2.5mm厚のMDFボードに対応) :https://www.dropbox.com/sh/7krxkjsxdylo8wb/AACbvmfFnRJbhjjHLaTt2eDwa?dl=0

#BOM
ぶっちゃけいうと豊洲のビバホームでMDF板を含めて3000円程度で一式が手に入る。レーザーカットする場所だけ要工面。(誰かに委任して複数個のケースを作っていけば、たぶん1ケースあたりのコストは数百円ぐらいになるはず)

- MDF板 (豊洲のビバホームで入手。910 mm×1820 mmの巨大な2.5 mm厚のMDF板を専用のカートでで運んで購入）
    - 同店舗のカットサービスでざっくりA4サイズ(210x300)でカットしてもらうことを強く推奨する。
    - カット時の寸法は910 mm側を210 mm×4, 1820 mm側を300 mm×6で格子を切って、残りの70 mm部分および20 mm部分の端材はレーザーカット用の出力テストとかにつかうといいかな。
- 2×15 mm(太さ×長さ)：2本
    - 同じ太さの長さ1.5 mmのナットが8つ
    - ぶっちゃけこれで1ケース作れる(https://www3.roymall.jp/shop/g/grhc1-259300/)
    - 本当のことをいうと2×14 mmのネジがよかったのだけれども、入手性が悪そうなのであえて推奨しなかったです。Aliexpressとかだと樹脂ネジなどで売っているようなので、そっちのほうがもしかしたらいいかも？
- ボールチェーン(100円ショップのセリアで入手できた。ここら辺はお好みでw)

# 組み立てについて
やることはシンプルなので、ねじ止め部分のナットの組み合わせだけ掲載します。

1. 画面側のケースとねじ二本をナット一つずつ入れて固定し、そこにお手元のObniz Boardを画面側から差し込む。
2. スペーサー代わりにナット二つをそれぞれのネジからObniz側まで入れてあげて、背面側のMDFを差し込む。
3. 各ネジにナットをつけて、背面側を固定すれば完成。

![sidep.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/90ca9b7b-8066-624d-da74-49ffbd198f26.jpeg)


# まとめ

- MDF板をつかってObniz Boardケースを作った。
- レーザーカットのデータを無償にて配布した。
- 作る際の部品リストと入手の際の補足を述べた。

以上です。
初心者によるプログラミング学習ログ121日目

# 100日チャレンジの121日目

Twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

121日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>121日目<br><br>Udemyでwebデザイン。<br>架空のwebサイト構築。レイアウト作成途中で安定の寝落ち<br>土曜夜だから油断した・・・<br>コードは一行も書いてません<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a> <a href="https://twitter.com/hashtag/web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#webデザイン</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1180595894548172800?ref_src=twsrc%5Etfw">October 5, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
仙台CTF2017 [For01] USBメモリの感染日時 100

#問題

http://sendaictf.ddns.net/2017/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/7233400d-938a-dac8-d255-a79b700a66e1.png)

#解いてみた

ダウンロードして中身を見ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0b938024-4a8a-05ab-9038-afe655e11e67.png)

シリアル番号必要？と思いつつ、zipを解凍。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/41e80ad8-fbd2-62c0-d7a1-6327e95180c6.png)

ddファイルです。
FTK Imagerで中身を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f0a21819-9f19-00d2-4d6a-61b8c907ce8f.png)

どのファイルがウイルスか言及されてないけど、たぶんこのexeファイルですよね。
これのファイル作成日を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/213451a8-217a-8418-acd8-efe16348e0ef.png)

この日時はUTCなので9時間足して日本時間にしたものが答え。
と思ったら違った。

他のファイルなのかなーとか思って、一番古い時間のものを入力してみても間違い。

そういやFAT32って2秒ごとくらいにしか日時持たなかった気がする。
というのを思い出して、適当に入力してみても間違い。
一応調べてみると作成日時は10ミリ秒でした。
更新日時が2秒単位。

路頭に迷いかけたところで、「もしかして日本時間でそのまま記録される？」と思って+9せずにそのまま入力すると正解でした。

調べてみるとローカルタイムで記録されると書かれていました。

[Windowのファイル更新日時(前編) ファイルを別のドライブに置い ...](https://www.unirita.co.jp/data-utilization/data-linkage/20150114.html)

これは知りませんでした。勉強になりました。
開発環境から始めるdocker環境の浸透

dockerによるCIと、コンテナクラスタリング構築の記録を残していきます。

スマートフォンベースのECサイトのプロジェクトへ配属になりました。
プロジェクトはオーソドックスなLAMP構成＋jQueryによるインタラクションが付与されたものですが、中〜大規模のPVを持っており、決済機能も存在する事から
品質管理やリリース手順などは整備されていました。

ライフサイクルとしては成熟期を過ぎた印象があり、プロダクトとしては一定の完成度に達していたので
バックエンドより、ユーザが直接関わるUI部分の改修に比重が置かれ
インフラ部分については、現状動いているのだから、コストを掛けて改修するほど優先度は高くない、といった状況でした。

そんな中で、合間を見てdocker環境を構築し、現場に浸透させて行った記録です。
docker環境の構築の助けになれば幸いです。
（記録になるので、ベストプラクティスから外れている部分も多いかと思いますが、ご容赦下さい）

## 当時の開発環境
![dev.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477542/7829da3f-4914-26b6-c226-2ae6182aff05.jpeg)
開発環境は、VirtualBox(Vagrant)でCentOSベースのイメージを一つ起動し
一つのOSの内に
・サービス内で展開している、三種類の２層webアプリケーション（VirtuaHostによる統合）
・上記３アプリケーションから参照するmysql
・DB負荷軽減の為のRedisサーバ
が同居しています。

その他、CDNとしてAWS S3を採用している為、擬似S3となるminoサーバを
ホストマシン上で起動しています。
ホストマシン上のGitHubのリポジトリを、Vagrantのイメージにマウントし、エディタで開発を行なっていました。

## 開発環境の問題点
前述の通りインフラ構築は逆風の雰囲気でしたが
開発チームからは、開発環境の問題の指摘が挙げられていました。

### 1.Virtualboxの起動速度
Virtualboxは、仮想環境内でOSを起動する為起動にリソースを消費しますが
dockerはホストOSの機能を共有して、docker仮想環境内で
アプリケーションが格納されたコンテナを起動する為、
「OSを起動する」部分のオーバーヘッドが無く、起動が高速になります。
docker導入のメリットとして訴求しました。

### 2.サービス環境と開発環境で、構成が異なり、健全ではない
■開発環境は、３つの２層webアプリケーションを１つのEC2インスタンスに集約していましたが
商用環境は、AWS EC2を3台に分け（別途、multi-AZも実施している）
それぞれのアプリケーションを分けて配置していました。
■開発環境はCentOS６（何故かOSのメッセージ全般がドイツ語）でしたが、
商用はAmazonLinuxでした。

dockerでコンテナ毎にサーバを構築する事で、商用と同じ３サーバ構成にする事で、解決を試みました。
OS差分の問題は、AmazonLinuxのDockerイメージを使うことも考えましたが
開発陣からの、「商用と同じ環境」をより納得させる為に、
商用で稼働しているAmazonLinuxを、Dockerイメージとして使うことで、心理的安全性を担保する事にしました。

将来的にAWS ECSによる、コンテナクラスタのデプロイを想定し
その際は、alpineで再構築する予定だったので、この対応は繋ぎという形でした。
（正直、そのままalpineで構築しておけばよかった）

### 3.Githubリポジトリが２つ存在し、連携しにくい
配属以前は、SASS/JS/HTMLが別リポジトリで管理されていました。
フロントのリポジトリで、gulpを使用したhtml+SASS+JSのモックを作成し
バックエンドのリポジトリに（ZIPか何かで）移植、viewファイルへ反映を行なっていましたが
・２つのリポジトリとのバージョン整合が大変
・移植コストが大きい。大規模なフロントエンド開発がもう無さそう
という事を考慮し、リポジトリをバックエンドに統合する事にしました。
統合により
・バックエンドのJSやSASSの変更をgulpで検知しコンパイル、ブラウザに即時（又はリロード）で反映
・PHPソースとJS/CSSが正しくバージョン管理されているので、将来的には継続的デプロイとして、GitHubへのPUSH時、JS・SASSを自動でコンパイルし、dockerimageの自動デプロイと、JSやCSS,画像ファイルのS3への自動反映
(AWS codebuildを想定）
が可能だと見積りました。


## プロトタイプ作成
プロトタイプを見せる事が説得力に繋がると感じたので、業務の合間にdockerの構築を進めていくことになりました。
PowerShellで２つのリストの差分を取得するにはnotin演算子が便利

# はじめに

２つのデータリストのうち一方のリストに含まれていてもう一方に含まれていないデータをPowerShellで取得するには`notin`演算子を利用すると便利である。

# 例

例えば、実際にはあまりないパターンかもしれないが、Office 365で`Get-MsolUser`の取得結果に含まれるが`Get-Mailbox`の取得結果には含まれないオブジェクトを抽出したリストを取得するには以下のようにすればよい。
この場合は両リストに備わっている`UserPrincipalName`属性がキーとなる。

```powershell
$ExOMBXs = Get-Mailbox -ResultSize Unlimited
Get-MsolUser -All | Where-Object {$_.UserPrincipalName -notin ($ExOMBXs).UserPrincipalName}
```

参考までに、同じことを`ForEach-Object`ですごく丁寧にしようとすると以下のようになる。

```powershell
$ExOMBXs = Get-Mailbox -ResultSize Unlimited
$Datas = New-Object System.Collections.ArrayList

Get-MsolUser -All | ForEach-Object {

    $UPN = $_.UserPrincipalName
    $ExOMBX = $ExOMBXs | Where-Object {
        $_.UserPrincipalName -eq $UPN
    }

    if($null -eq $ExOMBX){
        [void]$Datas.Add($_)
    }

}

$Datas
```

# おわりに

今までは上記の後者の方法しか知らず、複雑なスクリプトが書けるオレSUGEEE！していた過去の自分をはたきたい。

以上
mapboxgl-jupyterでOpenStreetMap上に描画

MapBoxのアカウントを作らずに、MapBoxGLを用いて地図上に描画を行いたい場合に利用

```python
import os
import pandas as pd
from mapboxgl.utils import create_color_stops, df_to_geojson
from mapboxgl.viz import CircleViz

# ベースとなるレイヤの定義（OpenStreetMap)
style_json = '''
{
  "version": 8,
  "sources": {
    "osmSource": {
      "type": "raster",
        "tiles": [
          "https://a.tile.openstreetmap.org/{z}/{x}/{y}.png",
          "https://b.tile.openstreetmap.org/{z}/{x}/{y}.png"
        ],
        "tileSize": 256
     }
  },
  "layers": [
    {
      "id": "osmLayer",
      "type": "raster",
      "source": "osmSource",
      "minzoom": 0,
      "maxzoom": 22
    }
  ]
}
'''
style = json.loads(style_json)

# サンプルデータDL -> DataFrame
data_url = 'https://raw.githubusercontent.com/mapbox/mapboxgl-jupyter/master/examples/data/points.csv'
df = pd.read_csv(data_url)

# DataFrame -> GeoJsonに直変換(簡略化のためファイルには起こさない）
df_geo = df_to_geojson(df,
                       properties=['Avg Medicare Payments', 'Avg Covered Charges', 'date'],
                       lat='lat', lon='lon', precision=3,
                      )

# 色設定
color_breaks = [0,10,100,1000,10000]
color_stops = create_color_stops(color_breaks, colors='YlGnBu')

# 描画
viz = CircleViz(df_geo,
                style=style,
                height='400px',
                color_property = "Avg Medicare Payments",
                color_stops = color_stops,
                center = (-95, 40),
                zoom = 3,
               )
viz.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163756/403814ac-6283-e50e-7f90-0e7d26be2c1a.png)



完全ではなさそうだが描画には成功
(Payments の値が10000しか描画されていない、ファイルに起こしていないことによるデータ点数起因?)

### 参考
- [Mapbox GL with OSM Tiles](http://bl.ocks.org/AlanPew/5acf9fca0fa817104ba3)
- https://github.com/mapbox/mapboxgl-jupyter#usage
仙台CTF2017 [LogX] 国内IPアドレス 300

#問題

http://sendaictf.ddns.net/2017/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/81827ef5-7893-3155-a495-37e1b27ded78.png)

#解いてみた

apacheログはおなじみのファイル。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f077338d-0b76-b41b-ae83-fd09ab2bc8e3.png)

APNICのファイルはこんなフォーマット。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fcc018cd-09e5-2fb8-a22d-8498d0410b49.png)

いやーIPの比較って意外にめんどいなと思って逃げ出したくなりました。
どうにかしてExcelだけで解きたい。

とりあえずJP かつ ipv4しか必要ないので、ほかのものを削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/205b019d-2564-a4a4-37ef-77c711ae1efd.png)

範囲は最小でどのくらいか見てみると256でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a0bf2ede-41fd-a2cc-b6ff-8c0f1c2f95ca.png)

IPアドレスの比較って大変だよなーと思ってたらふと「16進数で考えれば」レンジも足せばいいだけだし、比較も簡単になるんじゃないか。
という結論に至りました。

たとえばこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/086f18ce-c6ff-4a4d-ea5f-8824ddaf314f.png)

```
全部16進数に変換する（A）
↓
レンジを足す（B）
↓
国を調べたいIPアドレスがAとBの間にあればJP
```

ということでできそう。

とりあえずExcelの横の方に書いておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/37c6c382-5b76-059c-b786-c97e3ccb38b7.png)

つぎはレンジを16進数に変換です。
ん？Excelで10進数を16進数に変換できるのか？

調べてみると

```
=DEC2HEX(変換したいセル)
```

でできるらしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0f831bd0-d5d8-e2cf-feaf-685fe8b87d33.png)

すごい。
あとはこれを足せばいい。

ん？Excelで16進数の足し算できるのか？


```
=DEC2HEX(HEX2DEC(D2)+HEX2DEC(E2))
```

というような感じで16進数を10進数に変換して足し算をして、結果を再度16進数に変換する。
という方法でできそう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/016a2c1a-9091-b86c-e50a-1ab804b81c88.png)

あってるっぽいです。
これでIPアドレスがE列からF列の間であればJPだということになります。

さて、次はアクセスログからIPアドレスを抽出します。

[仙台CTF2017 [Log01] 大量アクセス 100](https://qiita.com/CTFman/items/978a74aeb3f330e9d74c)

これと同じやり方で集計します。
同じIPアドレスを省くと1254件ありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/7f0d8d70-fd93-4fe1-0514-16794db83e77.png)

これを16進数に変換します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4a1a4681-0c7f-074d-7b95-9c11e77463dc.png)

そして比較します。

少しマクロを組んで大小比較できるようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/392ed0f5-5ee5-cb89-6232-cbb7140ba0c8.png)

単純に大小比較しているだけです、日本のIPには1をつけておいて、あとで数を数えるプログラムです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d42067ee-5184-8aa6-9e6d-1a8ec4453cf3.png)

これが正解でした。
AnsibleでVMwareのVMインベントリレポートを自動生成するPlaybookを作ってみた

VMwareのVMインベントリ情報をvCenterからエクスポートする時に

* ブラウザを起動
* vCenterへアクセス
* ログイン
* クラスタやホストを選択
* VMのエクスポートする情報を選択
* VMの情報をエクスポート

とするのが面倒なのでAnsibleを使ってレポートを自動生成するPlaybookを作ってみました。

# ansible-vmware-vm-inventory-report-generator

[ansible-vmware-vm-inventory-report-generator](https://github.com/sky-joker/ansible-vmware-vm-inventory-report-generator)

上記のリポジトリにあるPlaybookでは `html` と `csv` でVMインベントリ情報がエクスポート可能です。
対象は、vCenterが管理している全VMになります。

# 使い方

## venv環境作成

ここでは、python3のvenvを作ります。

```
[root@206d9746e86c ~]# python3 -m venv venv
[root@206d9746e86c ~]# source venv/bin/activate
(venv) [root@206d9746e86c ~]#
```

## リポジトリをクローン

ansible-vmware-vm-inventory-report-generatorをクローンします。

```
(venv) [root@206d9746e86c ~]# git clone https://github.com/sky-joker/ansible-vmware-vm-inventory-report-generator.git
```

## 必要なモジュールのインストール

必要なモジュールをインストールします。

```
(venv) [root@206d9746e86c ~]# cd ansible-vmware-vm-inventory-report-generator/
(venv) [root@206d9746e86c ansible-vmware-vm-inventory-report-generator]# pip install -r requirements.txt
```

## Playbookの変数変更

以下の変数を環境に合わせて変更します。

```
(venv) [root@206d9746e86c ansible-vmware-vm-inventory-report-generator]# vi ansible-vmware-vm-inventory-generator.yml
(snip)
  vars:
    hostname: vCenter IP                       # vCenterのIPか名前解決のできるホスト名に変更してください
    username: administrator@vsphere.local      # vCenterにログインするユーザーに変更してください
    password: ログインパスワードに変更してください       # vCenterにログインするユーザーのパスワードに変更してください
    export_type: html                          # エクスポートするタイプ、htmlまたはcsvに変更してください
(snip)
```

## Playbookの実行

Playbookの変数を変更したらPlaybookを実行します。

```
(venv) [root@206d9746e86c ansible-vmware-vm-inventory-report-generator]# ansible-playbook ansible-vmware-vm-inventory-generator.yml
 [WARNING]: No inventory was parsed, only implicit localhost is available

 [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'


PLAY [VMware VM Inventory Generator] ********************************************************************************************************************************

TASK [Gather fact for all vm] ***************************************************************************************************************************************
ok: [localhost]

TASK [Gather facts for vm summary] **********************************************************************************************************************************
ok: [localhost] => (item=molecule01)
ok: [localhost] => (item=AD01)
ok: [localhost] => (item=awx)
(snip)
```

問題なく実行できたらレポートが生成されています。
<font color="#FC0107">htmlを指定した場合はhtml、csvを指定した場合はcsvが生成されます</font>

```
(venv) [root@206d9746e86c ansible-vmware-vm-inventory-report-generator]# ls vmware_vm_inventory_report.*
vmware_vm_inventory_report.csv  vmware_vm_inventory_report.html
```

こんな感じでAnsibleを使うことで情報取得とレポート生成の自動化が出来ますね :)
【NetBeans】起動しなくなってしまった時の話

NetBeansをいつものように起動しようとしたら、何も出ないままいつまで経っても起動しない…。前回は普通に起動していたのに…。このようになった時のことをここに書き残しておく。
＊環境
OS: Windows 10
NetBeans: Apache NetBeans IDE 11.1
Java: JDK 13

＊netbeans.conf(下の方でも記述あり)を編集したら同様に起動しなくなってしまうことがあるので、もしnetbeans.confを直近で編集したのであればまず元に戻してみよう。それでもダメだった時の話が以下のとおり。

#エラーの内容
　デスクトップ上とかのショートカットで起動しようとすると、何も起こらない。エラーメッセージなど何も出ない。ここで、コマンドプロンプトで起動してみる。
```C:\Program Files\NetBeans-11.1\netbeans\bin>netbeans.exe```
こちらでもやはり起動に失敗するが、エラーメッセージが出る。
(再現しようと思ったが、できなかったのでどのようなエラーメッセージかは出せませんでした。すみません。)
そのエラーメッセージの中で、ログを出している場所を教えてくれるので、そのログを開いてみよう。場所の例としては、
C:\Users\【ユーザー名】\AppData\Local\Temp
で、ログファイルの名称はhs_err_pid18004.logというような感じ。(数字はプロセスIDなので、きっと違う番号になっている。)中身の最初の方は以下のような感じ。
>\#
>\# A fatal error has been detected by the Java Runtime Environment:
>\#
>\#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007fff2a50f98a, pid=18004, tid=12052
>\#
>\# JRE version: Java(TM) SE Runtime Environment (13.0+33) (build 13+33)
>\# Java VM: Java HotSpot(TM) 64-Bit Server VM (13+33, mixed mode, sharing, tiered, >compressed oops, g1 gc, windows-amd64)
>\# Problematic frame:
>\# C  [awt.dll+0x8f98a]
>\#
>\# No core dump will be written. Minidumps are not enabled by default on client versions of >Windows
>\#
>\# If you would like to submit a bug report, please visit:
>\#   http://bugreport.java.com/bugreport/crash.jsp
>\# The crash happened outside the Java Virtual Machine in native code.
>\# See problematic frame for where to report the bug.
>#

EXCEPTION_ACCESS_VIOLATIONがエラーの内容であるわけだが、メモリの読み取り違反ではないかと推測される。どこで問題が起こったかというと、

>\# C  [awt.dll+0x8f98a]

の所に書かれている。
　awt.dllというのは、java\jdk-13\binの中にあるファイル。これはいじりようがないファイル…。
#今回の解決方法
　最終的には起動に成功したわけだが、どうしたかというと、

*JDKをバージョンダウンした*

ことである。JDKを13から12.0.2にバージョンダウンして、
C:\Program Files\NetBeans-11.1\netbeans\etc
にあるnetbeans.confの中身の一部を以下のように書き換える。(数字はバージョンに合わせる)
```netbeans_jdkhome="C:\Program Files\Java\jdk-12.0.2"```
＊Windowsでは直に書き換えられない(保存できない)と思うので、そのファイルをどこかにコピーして書き換えて、その書き換えたファイルをペーストしよう。

これで起動に成功！

同じような目に遭った方がいたら、参考にしてくれると幸いです。

##余談
　起動に成功したから、この記事を書くために再現しようとnetbeans.confを戻したらなぜかそれでも起動できた。一体何だったんだ…。
iOS13 復活したpopoverLayoutMarginsをおさらい

## 概要

前々から使いたかったのに全然思う通りに動いてくれなかった[UIPopoverPresentationController](https://developer.apple.com/documentation/uikit/uipopoverpresentationcontroller)の[popoverLayoutMargins](https://developer.apple.com/documentation/uikit/uipopoverpresentationcontroller/1622323-popoverlayoutmargins)がiOS13で動くようになっていました！
むしろ動くようになったことでレイアウトが崩れていましたが←
やっと役割を果たしてくれるということで、機能と使用方法のおさらいを簡単にまとめていきます。

## popoverLayoutMarginsとは

Popoverの[UIViewController](https://developer.apple.com/documentation/uikit/uiviewcontroller)を設定する際などに使う`UIPopoverPresentationController`の配置に関わるプロパティです。
普通にPopoverを表示するとNavigationBarに被ってしまったりして困る時がありますね。

![deactive_margin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509799/91b94207-bf0e-1da4-8b4b-3fb2474d7d1b.png)

MarginとあるようにPopoverを表示する際に画面からのマージンを設定することで
NavigationBarに被らないようにできるはずなのですが、、
iOS8以降設定しても表示に全く変化がありませんでした。。

[iOS 8 popoverpresentationcontroller popoverlayoutmargin not working - Stack Overflow](https://stackoverflow.com/questions/26037269/ios-8-popoverpresentationcontroller-popoverlayoutmargin-not-working)

これはApple側のバグとしてレポートが提出されていましたが、iOS12になっても全然修正されず（汗
てっきりもう無くなるものだと思っていましたが！！ここへ来てまさかの復活！！笑
iOS13の動作確認中にレイアウトが崩れていたので、半信半疑使ってみて復活に気づきました。
嬉しいような悲しいような？苦笑

## 使用方法

### 環境

* iOS 13.0
* Xcode 11.0
* Swift5

### コード

と言ってもかなり簡単です。
設定したいマージン値の[UIEdgeInsets](https://developer.apple.com/documentation/uikit/uiedgeinsets)をSetするだけです。

Popoverを開きたい親のUIViewControllerか、PopoverであるUIViewControllerのどちらか一方に処理を書けばいいです。
今回は親側に実装してみます。

```swift:SampleViewController.swift
import UIKit

class SampleViewController: UIViewController
{
    /// Popoverを開く
    ///
    /// - Parameter sender: UIButton
    @IBAction func openPopover(_ sender: UIButton)
    {
        let popoverVC = PopoverViewController()
        popoverVC.preferredContentSize = CGSize(width: 230, height: 200)
        popoverVC.modalPresentationStyle = .popover
        popoverVC.popoverPresentationController?.sourceView = sender
        popoverVC.popoverPresentationController?.sourceRect = sender.bounds
        popoverVC.popoverPresentationController?.permittedArrowDirections = .left
        popoverVC.popoverPresentationController?.delegate = self
        // CHECK: NavigationBarとButtonに被らないようにMarginを設定
        popoverVC.popoverPresentationController?.popoverLayoutMargins = UIEdgeInsets(top: 50, left: 10, bottom: 0, right: 0)
        present(popoverVC, animated: true, completion: nil)
    }
}

extension ViewController: UIPopoverPresentationControllerDelegate
{
    // MARK: UIPopoverPresentationControllerDelegate

    /// adaptivePresentationStyle（iPhoneで表示させる場合にのみ必要）
    func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle
    {
        return .none
    }
}
```

![margin_active.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509799/29237b2e-d8ce-7cd8-ce10-bd4739082379.png)

これでPopoverが他のパーツに被ることなく表示できますね！

## 参考

* [popoverLayoutMargins - UIPopoverPresentationController | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uipopoverpresentationcontroller/1622323-popoverlayoutmargins)
Unity玉転がしチュートリアル 2-1.カメラの移動

# この記事の対象者
* Unity入門したい人
* 最初の一歩が踏み出せない人

# OSとか環境とか

* Windows 10 Pro
* macOS Mojave
* Unity 2019.2.8f1
* Rider 2019.2.2

# 補足
* 公式動画にて利用しているのはMacなので、Windowsユーザーはある程度脳内変換して見る事
* 筆者はWindows、Macの両方の環境で確認。Ubuntuとかでは検証してない。
* 基本Unityは英語メニューで利用
* 間違いがあったらツッコミ大歓迎

## 公式
https://unity3d.com/jp/learn/tutorials/projects/roll-ball-tutorial/moving-camera

## カメラの移動

現状のままだとカメラが固定なので、プレイヤーオブジェクトが非常に見づらい
→カメラとプレイヤーオブジェクトを紐付ければ万事解決じゃない？

下準備としてカメラの位置調整

PositionのYを10,Zを-10
RotationのXを45
に調整して、少し上から見下ろす形にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/bbc2c37d-db45-dec1-cfb1-229046553379.png)

Playerの子としてMainCameraを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/cb5f468c-f981-662b-ca9b-59951adcbf3a.png)

この状態にすると、Playerオブジェクトが動かした場合（移動や回転）Main Cameraも一緒に移動する
※上記設定後「あー余裕だわー」とPlayして玉を動かすと高速な[ラート](http://www.rhoenrad.jp/ri_benrato_xie_hui/home.html)みたいな視点になるので落ち着きましょう

## カメラとプレイヤーの関係性

あくまで「プレイヤーの子としてカメラが設定された」だけで、相対的な位置関係は変わっていない
なので
・親のSphereオブジェクトが動く
→回転して移動する
・子のMain Cameraオブジェクトが動く
→親のSphereオブジェクトに**連動して同じく「回転」**する

なので、Main CameraがSphereの子の状態だと視点がラートになる
カメラとプレイヤーはスクリプトで紐付ける必要がある

## カメラへのスクリプトの追加

CameraControllerという名前でスクリプトを追加します
※カメラとスクリプトの紐付けは行っている事

追加するスクリプトは以下

```cs:CameraController.cs
using System.Collections;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    public GameObject player;
    private Vector3 offset;

    void Start()
    {
        offset = transform.position - player.transform.position;
    }

    void LateUpdate()
    {
        transform.position = player.transform.position + offset;
    }
}

```

内容については単純なので割愛

ポイントとしては、毎フレーム処理する時に**Updateを使わずにLateUpdate**を利用する事

ライフサイクルだとGame Logicに当たる箇所の

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/ea2f424a-29c8-3142-e54b-af3e58b9515f.png)

**はじめに呼ばれるのがUpdate**
**最後に呼ばれるのがLateUpdate**
となる

## 真・カメラとプレイヤーの紐付け

スクリプトを保存して、UnityエディタでCameraControllerのPlayer部分を見ると「None」となっているので紐付け

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/acb93a5f-3bc2-1ea4-93c0-ee18e5d4a928.png)


紐付ける方法は動画ではPlayerオブジェクトをドラッグしているが、フィールドの右にある小さい○をクリックして
出てくるダイアログで選択してもOK

これでPlayをすると、ボールの動きを追従するカメラの出来上がりとなる
electron-builderで詰まったこと

#はじめに
electron-builderの記事古いーーーーー!!!!!
ということで自給自足する
まあ難しいことはないんだけどこの記事で助けられる人はいる(はず)
#node_modulesがない
そう、無いんですよ(全肯定)
参考になったのは[この記事](https://www.ncaq.net/2018/08/30/17/07/28/)
ソースコードは読みたくないのでありがたい...
完結にいうと「node_modules」が消されるとのこと
そのため```semantic-ui-less```をインストールする必要がある
とりあえず[npm](https://www.npmjs.com/package/semantic-ui-less)で突っ込んで使いましょう
これでnode_modulesがapp.asarに入ります
##あれ?ないやつもあるけども
そう、無いんですよ(全肯定)
electronでサポートしてないものは消される感じ
なので使うモジュールはpackage.jsonの```dependencies```に書くべし
自分なら[twitter](https://www.npmjs.com/package/twitter)を使うので

``` json:packege.json
 "dependencies": {
     "twitter": "^1.7.1"
  }
```

てな感じで
これでnode_modulesにファイルが入ります

このおかげでいらないやつは削除されるのでremoveし忘れても大丈夫ですよ奥さん!!!
#コンパイルできない
そう、できないんですよ、昔の記事ならね(全肯定)
>[Electronでアプリビルドまでのフロー](https://qiita.com/zaburo/items/828051fc7dabb258f0de)

多分検索して一番最初にでてくるこの記事を見ると思います
新しい記事だし信用性は高いですね
この記事で紹介されてるbuild-win.jsは次の通り

```javascript:build-win.js
const builder = require('electron-builder');

builder.build({
    platform: 'win',
    config: {
        'appId': 'local.test.app1',
        'win':{
            'target': {
                'target': 'zip',
                'arch': [
                    'x64',
                    'ia32',
                ]
            }
        }
    }
});
```
これです
でもこれ今だとエラーでるんですよね

原因は簡単、使えないものがあるからです
electron-builderの[github](https://github.com/electron-userland/electron-builder/releases/tag/v21.0.3)を見たらわかる通り大分使えなくなってます
特に```platform```は気づきにくいですよね
よって変更したのが下

```javascript:build-win.js
const builder = require('electron-builder');

builder.build({
    config: {
        'appId': 'local.test.app1',
        'win':{
             'target': 'zip'
         }
    }
});
```
いやーすっきり
#さいごに
electron-packagerは下位互換っぽいですね
配布するならelectron-builderを使おう
一般化テンパズルを解くコードをC++で書いてみた

# 概要
[テンパズル](https://ja.wikipedia.org/wiki/%E3%83%86%E3%83%B3%E3%83%91%E3%82%BA%E3%83%AB)とは4つの数字を四則演算 (+,-,×,÷)でつなげて10にする遊びである。
ナンバープレートの数字を使って遊ぶあのパズルゲームで、渋滞中に周囲の車のプレートを見て遊んだ人は多いのではないだろうか？
この記事では、そのテンパズルを一般化して$n$個の数字で$k$を作るパズルの解を出力するC++のプログラムを公開する。

# プログラムの使い方
標準入力で一行目に数字の数、目標の数値を与える。
二行目では数字のリストを与える。

(例) 4つの数3,4,7,8を使って10を作るとき(解が除算を必ず含む)

* sample_input

```
4 10
3 4 7 8
```

* sample_output

```
(3-(7/4))*8
8*(3-(7/4))
end
```

# プログラムの解説
まず除算について、すべて整数なので計算結果は0除算の時を除き有理数になることが保証される。したがって```pair```で分母分子を保存しておけば除算が誤差なく計算できる。

数式(文字列)をkey / 評価値(```pair<int, int>```)をvalueとする```map```を用意しすべての可能なパターンを格納する。効率的に探索するために、再帰式を用いる。最後に値が$k$に一致する数式を表示させている。

イメージしたのは算術式におけるインストラクションと評価文脈で、分割のやり方によってこれらを表現しているつもり。なお愚直に全探索しているため空間・時間ともに計算量は$O(n^2n!)$。手元のノートPCだと$n=8$程度でかなり時間がかかったが、重複の除外・枝刈り等すればもう少し効率的に探索できるだろう。

# Snippet

```cpp
#include <bits/stdc++.h>

#define REP(i,n) for(int i=0;i<n;i++)
#define FOR(i,a,b) for(int i=a;i<=b;i++)

using namespace std;

typedef long long ll;
typedef pair<ll,ll> Pll;

map<string, Pll> generate(vector<ll> v)
{
  map<string, Pll> T;
  if(v.size() == 1) {
    string key = (v[0] < 0) ? "("+to_string(v[0])+")": to_string(v[0]);
    T[key] = make_pair(v[0], 1);
    return T;
  }
  else {
    REP(i, v.size() - 1) {
      vector<ll> a,b;
      map<string, Pll>  s,t;
      FOR(j, 0, i) a.push_back(v[j]);
      FOR(j, i+1, v.size()-1) b.push_back(v[j]);
      s = generate(a);
      t = generate(b);
      for(auto m : s) for(auto n : t) {
        ll n1 = m.second.first;
        ll d1 = m.second.second;
        ll n2 = n.second.first;
        ll d2 = n.second.second;
        T["("+m.first+"*"+n.first+")"] = make_pair(n1*n2, d1*d2);
        T["("+m.first+"/"+n.first+")"] = make_pair(n1*d2, d1*n2);
        T["("+m.first+"+"+n.first+")"] = make_pair(n1*d2+n2*d1, d1*d2);
        T["("+m.first+"-"+n.first+")"] = make_pair(n1*d2-n2*d1, d1*d2);
      }
    }
    return T;
  }
}

void solve(vector<ll> v, ll k)
{
  do {
    map<string, Pll> T = generate(v);
    for(auto a : T) {
      if(a.second.second != 0 && a.second.first == k * a.second.second) {
        printf("%s\n", a.first.substr(1, a.first.length() - 2).c_str());
      }
    }
  } while(next_permutation(v.begin(), v.end()));
  printf("end\n\n");
}

int main()
{
  ll n = 0, k = 0, i = 0;
  cin >> n >> k;
  vector<ll> a(n);
  REP(i, n) cin >> a[i];
  sort(a.begin(), a.end());
  solve(a, k);
  return 0;
}
```
Rails datetime_selectのエラー対応

# datetime_selectエラーがでた
```ruby:new.html.erb
<div>新規プロジェクト</div>
<%= form_for(@project) do |f| %>
  <div><%= f.label :title %>
  <div><%= f.text_field :title %></div>
  <div><%= f.label :state %></div>
  <div><%= f.text_field :state %></div>
  <div><%= f.label :limit_date %></div>
  <div><%= f.datetime_select :released_at,
              start_year: 2000, end_year: Time.current.year + 1,
              use_month_numbers: true %></div>
  <div><%= f.submit %></div>
<% end %>
```
上記のnewのviewを実装後にlocalhost:3000/projects/newをリクエストしたら下記のエラーが出た。

```:ターミナル
ActionView::Template::Error (undefined method `map' for "translation missing: ja.date.order":String
Did you mean?  tap):
     5:   <div><%= f.label :state %></div>
     6:   <div><%= f.text_field :state %></div>
     7:   <div><%= f.label :limit_date %></div>
     8:   <div><%= f.datetime_select :released_at,
     9:               start_year: 2000, end_year: Time.current.year + 1,
    10:               use_month_numbers: true %></div>
    11:   <div><%= f.submit %></div>
```
# 解決策
ja.ymlを作成すると解決する

```ruby:config/locales/ja.yml
ja:
  date:
    order:
      - :year
      - :month
      - :day
```
もしくはi18nを無効化しても良いということが調べたら載ってました。<br>
参考: https://jangajan.com/blog/2014/09/12/perfect-rails-i18n/
Xcode11.1にiOS12.4シミュレータが無い

Xcode11.1がリリースされたのでインストールしたのですが、Xcode10.3で使用していたiPhone XS - iOS12.4のシミュレータが無い。
シミュレータの設定画面から作成しようとしてiPhone XSを選びiOS12.4を選択しようとしたがiOS12自体が無く作成出来ない。
じゃあiOS12.4のシミュレータをダウンロードするかとダウンロード画面を開くとiOS12.2以下しか見当たらない。
困ったのでググってみるとXcode11では起きてる問題の模様。
以下のStack Overflowの回答通りXcode10.3のiOS.simruntimeファイルをコピー&リネームしXcode11.1内にiOS 12.4.simruntimeを配置したら問題なくXcode10.3で使用していたiPhone XS- iOS12.4などが表示されるようになりました。
[Answer: iOS 12.4 is missing in Xcode 11 GM](https://stackoverflow.com/a/58042724?stw=2)

Xcode10.3のiOS.simruntimeの場所
`/Applications/Xcode10.3.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes`

Xcode11.1のiOS 12.4.simruntimeを配置する場所 (Xcode10.3と同じ)
`/Applications/Xcode11.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes`

こんな感じで元のiOS.simruntimeとiOS 12.4.simruntimeが同じ場所にある状態になります。
<img width="478" alt="runtimes.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16070/5c056f2d-bf7a-66fc-e0da-37ae93ecdcb2.png">
A server is already running の対処法

Railsでアプリを作成中にa server is already runningが出てlocalサーバが起動しなくなってしまった。

already runningってことはサーバが閉じられてないってこと?

調べてみると
Railsプロジェクト/tmp/pids/server.pidのserver.pidを削除して直るらしい。

server.pidはサーバを起動毎に作成されているようなのでサーバが閉じている時にserver.pidファイルがpidsファイルの中にあるのがそもそもおかしいみたい。

server.pidを削除して新たにサーバを立ち上げ直し。

server.pidファイルが新たに作られる。

解決！
xvfbを用いたAdobe FlashアプリケーションのHTML5化


#はじめに
Adobe FlashアプリケーションをAdobe Airアプリ化するのではなく、Webアプリのままにしたい場合のアイディアを書きます。あくまでアイディアです。

#技術概要
Linuxで仮想デスクトップ機能を実現するxvfbを用い、FlashPlayerがデフォルトで動く少し古いブラウザを仮想デスクトップ上で動作させます。xvfbの仮想デスクトップをxpraまたはnoVNCを用いて、ブラウザ上で操作できるようにします。xpraはHTML5のキャンバス機能とWebSocketを用いているため、ブラウザサイドとしては完全にHTML５で動作します。
<img width="461" alt="xvfb_flash.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354086/16b5d116-9ef9-a3c6-c44d-894937a44989.png">

Windows10およびWindows Server2016にはWSLおよびWSL2があり、Windows上にLinuxを動作させることも可能です。よってLinux/Windowsの区別なく適用できます。

#注意点
- XpraやnoVNCの品質は十分ではありません。有償の製品を使うなどして品質の担保が必要です。
- ブラウザでのキー入力をそのままxvfb上で受けないように、xmodmapを用いてxvfb側のブラウザのショートカットキーは無効化しておきましょう
- ブラウザで行われたコピー＆ペーストの操作をxvfb側に転送する実装は別途必要です
- Flashアプリがファイルのアップロード/ダウンロードをサポートしている場合は、実装が別途必要です。
vCenter構築時に引っかかったポイント

# はじめに

VMware 6.5を使ってvCenter（Windows版）とESXiを構築した際に躓いた点を、記事としてまとめてみました。
今後のVMware（VMware 6.7以降）ではWindows版のvCenterが無くなるそうなので、すぐに陳腐化してしまいそうな内容ですが...

# IPアドレスを変えられない

vCenterインストール時に、システム名としてドメイン名（FQDN）とIPアドレスのいずれかを選択できます。
この時にIPアドレスを設定すると、その後にvCenterのIPアドレスを変更できなくなります。

Windows版vCenter Serverの場合、vCenterの載っているゲストOS上でIPアドレスを変更することが可能ですが、IPアドレス変更後にvSphere Web Clientに接続しても503エラーになってしまいます。
（IPアドレスを変えると、vCenterが正常に起動しなくなる？）

# 作成したユーザーでログインできない

vCenter上で作成したユーザーでログインしようとすると、「このクライアントに接続されたすべてのvCenter Serverシステムに対して権限がないため、ログインできません」というエラーが出ることがあります。

最初は「アカウント名もパスワードも正しいのになぜ...」と思っていましたが、色々調べた結果「当該ユーザーが操作できる権限を持つ仮想マシンが1つも存在しない時に発生するエラー」だと分かりました。

![vcenter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/1e34a7bc-6ada-4759-0dba-38dfff4ccaaf.png)

# vCenter（vSphere Web Client）に接続すると503エラー

vCenterに割り当てたリソースが少なめだと、vCenterの起動にかなり時間がかかることがあります。
せっかちな性格が災いして、vCenterの起動中にvSphere Web Clientへアクセスすると、以下のような503エラーとなります。

また、上記の「IPアドレスを変えられない」で503エラーが発生した時も、下記のエラーと同じ内容が表示されます。
このように様々なシーンで下記のエラーが起きる可能性があるため、一概に「vCenterの起動中」とは断定できませんが、vCenterが起動中である可能性もあるため、少し気長に待ってみることも必要かもしれません。

```
503 Service Unavailable (Failed to connect to endpoint: [class Vmacore::Http::NamedPipeServiceSpec:0x0000003233c0c2b0] _serverNamespace = / action = Allow _pipeName =\\.\pipe\vmware-vpxd-webserver-pipe)
```

# 参考URL

* [vCenter Server Appliance の DNS と IP アドレス設定の編集](https://docs.vmware.com/jp/VMware-vSphere/6.5/com.vmware.vsphere.vcsa.doc/GUID-56C3BA9A-234E-4D81-A4BC-E2A37892A854.html)
* [vSphere Client で vCenter Server に接続する際の権限エラーのトラブルシューティング (1003872)](https://kb.vmware.com/articleview?docid=1003872&lang=ja)
* [起動中のvCenter Server Appliance 6.0にアクセスすると503 Service Unavailable](https://qiita.com/tsukamoto/items/ee8a4cc1fb3fd0529a0a)
csv


## 書き込み

- headerのセット
- パスのセット

```ruby

require 'csv'


peoples = [
 ['alice', 14, 'femal'],
 ['alice', 15, 'femal'],
 ['alice', 16, 'femal'],
]


headers = ["名前", "年齢", "性別"]

file_path = "./test.csv"

CSV.open(file_path, 'w', headers: headers ) do |row|
  row << headers
  peoples.each do |pe|
    row << pe
  end
end
```

## 読み込み

- headers trueを適応
- 要素を出力する

```
require 'csv'


file_path = "./test.csv"


CSV.foreach(file_path, headers: true) do |row|
  p row
end

CSV.foreach(file_path, headers: true) do |row|
    p row["名前"]
    p row["年齢"]
    p row["性別"]
end
```
仙台CTF2017 [Log03] シェルのコマンド履歴 100

#問題

http://sendaictf.ddns.net/2017/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/432b427f-d678-b415-8b3f-ffb69783c732.png)

#解いてみた

ダウンロードした問題ファイルを見てみるとたくさんのファイルがありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/69343ac8-d929-6ada-1e44-5eff2ca7634b.png)

わからんけど、とりあえずhistoryとか書いてあるし、.bash_historyを開いてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/109806f2-dbbc-6792-811a-d8c8e8193033.png)

いきなり答えがありました。
仙台CTF2017 [Log02] SSHによる不正ログイン 100

#問題

http://sendaictf.ddns.net/2017/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5deab1c1-5ce4-73b5-7332-26081cfac696.png)

#解いてみた

問題のファイルをダウンロードして中身を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/56c9ff62-35da-7d2d-b79c-c433413e4673.png)

SSHのログのようです。
実はSSHのログをまともに見たことがないので一般的なログかどうかはわかりません。

適当に見ていると111111の人がパスワード間違いを何回もしているので、たぶんこれがブルートフォースっぽい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d2c2d23c-d85a-b759-8e01-a305db73b3c8.png)

なのでこれでgrepしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/e0b2a5c1-5684-214e-6ff3-e17ffe7b5ccd.png)

最後までFailedでした。
passwordでgrepしてみたところ大量のFailedが抽出できて、途中でユーザ名も変えていることが分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/2e824b7a-b2cb-6d37-c2c9-8abf190ddc31.png)

いつかFailedじゃないやつが出てくるだろうと思って、下まで見るとありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/44d80f57-3e9e-608b-02f3-5ca393ed0703.png)

このユーザが正解でした。
さくらVPSにkusanagi入れてwordpress入れて別にサブドメインを作りSSL化して表示するまで

前提条件
kusanagi  wordpress インストール済みであること(nginx)
SSL化が完了していること

<wordpressにてサイト表示>
https://clover-room.com


サブドメインを作り、フレームワークのLaravelをインストールすることが目的
サブドメイン　booking.clover-room.com とする。

＜作業開始＞
さくらVPSの下記にアクセス

```
https://secure.sakura.ad.jp/menu/dns/
```
ゾーン設定をクリック。エントリの追加と変更のテーブルに下記を入力。

|  タイトル  |  内容  |
|  エントリ名  |  booking.clover-room.com  |
|  種別  |  CNAME  |
|  値  |  @  |
|  DNSチェック  |  する  |
|  TTLの指定  |  チェックしない  |

新規登録ボタンをクリック。
データ送信ボタンをクリック。


```
# kusanagi provision --lamp bookings
ターゲットディレクトリは /home/kusanagi/bookings です。

Webサイトで使用するホスト名(FQDN)を入力してください。 例) kusanagi.tokyo
booking.clover-room.com
Webサイトで使用するホスト名(FQDN)をもう一度入力してください。
booking.clover-room.com
＞＞＞＞途中、割愛＞＞＞＞
bookings のプロビジョニングは完了しました。booking.clover-room.com にアクセスし、lampをインストールしてください!
```

これで、完了
確認のため、
/home/kusanagi
の中を見てみると
bookings　ディレクトリが存在しており、その中にDocumentRootができている。
https://booking.clover-room.com へアクセスすると nginx　のメッセージが表示されている。

続きまして、laravelをインストール

下記ディレクトリにいく
/home/kusanagi/bookings/DocumentRoot

phpとlaravelのバージョンを確認した後、問題なければlaravelをインストールする

```
# composer create-project laravel/laravel --prefer-dist project_name 5.8
```
完了したら、URLを叩いてみる

```
https://booking.clover-room.com/project_name/public/
```

表示されない、、、、。
下記コマンド叩いてみるとエラーが出る。


```
# php artisan serve
PHP Warning:  require(/home/kusanagi/bookings/DocumentRoot/project_name/vendor/autoload.php): failed to open stream: No such file or directory in /home/kusanagi/bookings/DocumentRoot/
PHP Fatal error:  require(): Failed opening required '/home/kusanagi/bookings/DocumentRoot/project_name/vendor/autoload.php' (include_path='.:/usr/local/php7/lib/php') in /home/kusanasan on line 18

```

どうやら、vendorが作られていない様子
なので、composer のupdateを行う必要がある。

```
# composer update
```

```
# php artisan key:generate
```

これで表示完了！！
食べログからGoogleでの評価を簡単に確認できるChrome拡張をつくってみた

#はじめに
食べログの評価点をお金で売っていたんじゃないかという疑惑が話題になっていますね。

自分も振り返ってみると、食べログで評価が高いのにイマイチだったなぁというお店もあれば、
食べログでは評価が低いけど行ってみたら大満足！ということもありました。

このような現状で、最近ではGoogleマップでのお店の評価を合わせて確認すると良い！という話をよく聞くようになりました。
身近なお店で検索してみると、そこそこ評価数もあり、情報も信頼できそうな感じです。
また訪日外国人のコメントなどもあり、よりグローバルな評価となっています。

ただいちいちGoogleで検索かけるのも面倒ですよね。
そこでワンクリックで検索結果のページに飛べるChrome拡張をつくってみました。

#使い方
![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104983/1cbf00e5-b8e6-9ca4-5008-f48e6c1f7103.png)
![ss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104983/9f5d2ab1-6cef-508d-f2e0-0baa538cbac4.png)

#ダウンロード/インストール
[飲食店探しの達人 - Chrome ウェブストア](https://chrome.google.com/webstore/detail/ecigebbbgibimigmnfigmanojnkglhlh/)

最初は「食べログーグル」という名前で考えてましたが、怒られそうなのでやめました笑
ぜひインストールしてみてください！

#動作確認環境
Windows 10 Pro 64bit
Chrome 77.0.3865.90
ログアウト状態で確認

Webの技術しか使っていないので、Macでも動くはず。
食べログやGoogleの仕様変更で使えなくなる場合あり。
食べログのURL規則などは詳しく調べてはいないため、想定外のページで実行されて、エラーなど出てしまうページがあるかもしれません。
またログイン状態やユーザー属性で取得対象のDOMが異なると思われるため、ログインしている場合はエラーが出ているかもしれません。

#仕組み
まず食べログのページ上から店名と住所を取得します。
その後店名と住所を含めたGoogleマップの検索結果表示用URLを生成し、DOM操作でリンクを追加します。
Googleの検索エンジンが優秀なので、こんな雑な検索方法でもしっかり見つけてくれます。

#ハマったポイント
・URLパターンマッチングで正規表現が使えない
manifest.jsというファイルで、Javascriptの実行対象とするURLを設定するのですが、なんと正規表現が使えません。
こちらはざっくりと設定した上で、Javascriptからlocation.hrefでURLを取得し、処理対象のページかを判定するようにしました。

#改善点
・食べログのページ上にGoogleの評価を併記したほうが良い。
→そのためにはバックグラウンドでHTTPリクエストを投げて、レスポンスから評価を抜き出す必要がある。
今回は早く完成させたかったため省きました。

詳しくは調べていませんが、Google MapのPlaces APIというものでお店の情報を取得できるようなので、
それが使えればベストかもしれません。

#ソースコード
間違いや改善点があればご指摘いただけると幸いです。

```javascript:main.js

(() => {
    // manifest.jsonでは細かなURLパターンマッチングを指定できない
    // 改めてURLを厳密にチェックする
    // URLが対象外の場合は処理を終了する。
    const pattern = new RegExp('https://tabelog\\.com/.*/.*/.*/[0-9]{8}/'); 
    if(pattern.test(location.href) === false){return;}

    // お店の住所を取得する
    // プレーンテキストではないため、HTMLの状態からテキストのみを抜き出す
    const getShopAddress = () => {
        const shopAddressNodes = document.getElementsByClassName('rstinfo-table__address')[0].childNodes;
        let shopAddress = '';

        for(let i = 0; i < shopAddressNodes.length; i++) {
            if(shopAddressNodes[i].tagName !== 'SPAN'){continue;}
            shopAddress += shopAddressNodes[i].innerText;
        }

        return shopAddress;
    }

    // リンク先URLの生成
    const shopName = document.getElementsByClassName('display-name')[0].innerText;
    const shopAddress = getShopAddress();
    const googleUrl = 'https://www.google.co.jp/maps/search/' + shopName + shopAddress;

    // タグの生成
    const p = document.createElement('p');
    const a = document.createElement('a');
    a.href = googleUrl;
    a.innerText = 'Googleで検索';
    a.target = "_blank";
    a.rel = "noopener noreferrer";

    // タグの挿入先取得
    const targetDom = document.getElementsByClassName('rdheader-rstname')[0];

    // タグの挿入
    p.appendChild(a);
    targetDom.appendChild(p);
})();
```

#おわりに
自分で作っていうのもアレですが、なかなか便利です。

また初めてChromeの拡張作りましたが、思ったより簡単につくれる！
勝手に敷居が高いものだと思っていましたが、そんなことなかったです。
GreasemonkeyなどのUserScriptを作った経験がある方でしたら楽勝だと思われます。
PycharmでGithubからSSHでcloneする

# 概要
Pythonの統合開発環境であるPycharmを用いてGithubからSSHでcloneする際にかなり詰まったので、備忘録。

# 環境
- Windows10
- Pycharm Professional 2019.2.3

# 状況
- 鍵ペアは作成済み
- Githubへ公開鍵は登録済み
- 秘密鍵は~/.ssh/以下に配置済み
- 鍵生成の際、区別のため **名称を初期設定のid_rsaから変更** している

この状況において、Pycharmの通常の手順に従ってcloneしようとしても
`Permission denied.(Publickey)`
となり、cloneに失敗する

# 原因
デフォルトでは、SSH接続の際に読みにいく鍵のファイル名がid_rsa等、既定のものに限られていることが原因だった。
id_rsaではない名前をつけた秘密鍵は読んでもらえていない。

# 対策
## ~/.ssh/config を作成する
[こちらの記事](https://qiita.com/yoshidev523/items/b5e5923b2f658f09e0a6#sshconfig%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6) が詳しい。

```~/.ssh/config
Host gitHub
    HostName github.com
    IdentityFile ~/.ssh/github/(秘密鍵のファイル名)
    User git
```

上記のように作成すればすればOK。
これで `ssh -T github`が無事に通るはず。

## cloneするURLを細工する
PycharmやGithubでは、デフォルトでSSHでクローンするURLが
`git@github.com:domishana/dip_discord.git` 
のようになっている。これを上記のconfigの設定を読むために、
`github:domishana/dip_discord.git`
のように、":" 以前を変更する。
これで無事、独自に作成した秘密鍵を使ってSSHクローンできるようになった。
SwiftUI コードからステータスバーを白色にする

# はじめに
今までは、こちらの記事[ステータスバーのスタイル(色)変更方法優先度 まとめ](https://qiita.com/ux_design_tokyo/items/8e62977b7609e68755c7)にあるように
プロジェクトセッティングのGeneral、もしくはInfoPlist、もしくは、コードからの変更で対応してきましたが、SwiftUIの場合はどうかなと思い調べてみました。

# General、もしくはInfoPlistの場合
変わらず今まで通り適用可能。

# コードの場合
基本的にSwiftUIではUIViewControllerではなく、structなViewをいじっていますが、
調べたところ、View側ではいじれそうになかった。

## UIHostingViewControllerでpreferredStatusBarStyleをoverrideする

```swift
class HostingController: UIHostingController<ContentView> {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}
```

このようにUIHostingControllerを継承したViewControllerを定義してsceneDelegateでホスティングします。

```swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        let contentView = ContentView()
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = HostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        }
    }
```
これで、ステータスバーの色を白に変更できます。

# まとめ

各Viewごとにステータスバーを変えたい場合や、NavigationViewを使用している場合に動的にステータスバーを変更したい場合はどうするのかはまだ調べてませんが、SwiftUI側でいじれなさそうな雰囲気。
NavigationBarTitleの色変更もappearanceで変更しないといけなかったりで少し使いづらい印象があります。

何か上手いやり方があればアドバイスしていただきたいです。

お読みいただきありがとうございました。