OmniAICreator/Qiita-1.07M huggingface dataset:
enum & switch文の通過しないdefaultのテスト手法

本エントリーはC#向けです。言語によっては同じような実装ができない（必要ない）場合もありますのでご注意ください。

# 課題

enumによる処理分岐をswitch文（switch式でも実質同じ）を記載したとき、enumが取り合えない値であった場合はdefaultで例外をスローするのは一般的な実装です。

```csharp
ICellLine cellLine;
switch (_column.VerticalAlignment)
{
    case VerticalAlignment.Top:
        cellLine = GetTopCellLine();
        break;
    case VerticalAlignment.Center:
        cellLine = GetCenterCellLine();
        break;
    case VerticalAlignment.Bottom:
        cellLine = GetBottomCellLine();
        break;
    default:
        throw new ArgumentOutOfRangeException();
}
```

しかしdefaultの行は、普通にテストすると通過しないためカバレッジ率が低下します。

# 目的

さて、この課題を解決する目的はどこにあるのでしょうか？

私は別にカバレッジ100%原理主義者ではありませんから、カバレッジを通すこと自体が目的ではありません。目的はふたつあります。

1. テストの維持を容易にするため
2. enumに新たな値が追加されたときの不具合を減らすため

## テストの維持を容易にするため

テストでカバレッジが通過していない箇所は「テストをしなくても良い理由」が必要です。そしてそれは、プロダクトが継続している限り管理し続ける必要があります（私は通常、その理由をコードコメントに残します）。

テストを実施する都度、通過していない箇所はそれで良いのか判断しつづける（つまりコメントを目で確認する）のは非常につらいことですから、通せるところは通してしまった方が結果的に楽なケースが多いでしょう。

## enumに新たな値が追加されたときの不具合を減らすため

例えば先のコードは、つぎのように記述することで同じように動作しますし、カバレッジもenumの範囲内で100%になります。

```csharp
ICellLine cellLine;
switch (_column.VerticalAlignment)
{
    case VerticalAlignment.Top:
        cellLine = GetTopCellLine();
        break;
    case VerticalAlignment.Center:
        cellLine = GetCenterCellLine();
        break;
    default:
        cellLine = GetBottomCellLine();
        break;
}
```

「case VerticalAlignment.Bottom」を削除してdefaultにその実装を移動しています。

しかしこの実装をしてしまうと、VerticalAlignmentに4番目の値が追加されたときにBottomと同じ挙動で動作してしまいます。

新しいenum値が追加されてもコードが修正されていない場合、例外をスローし、早期にバグを発見できるようにするべきです。このため、この解放は利用できません。

今回はこの問題を解決するテスト手法についてまとめたいと思います。

# 結論

- 取りえない値からキャストしてenumを生成しdefaultを通過させ、例外がスローすることを確認する

つぎのようにします。

```csharp
var horizontalAlignment = (HorizontalAlignment) 4; // HorizontalAlignmentの正常値は1～3
```

C#のenumは取りえない値からも正常にキャストできます。だからこそswitch文にdefaultが必要なのですが、今回はそこを逆用して異常な値を取るenum値を生成してテストします。これで前述のdefaultは通過し、カバレッジも取得できるようになります。

こうして生成した異常なenumを渡して例外がスローされるテストコードを記述しておきます。これで、ふたつの目的はクリアされます。

カバレッジは通過しますし、enumに新たな値が追加されたとき、分岐を追加せずに実行すると例外が発生しバグを早期に補足できます。

# まとめ

- enum & switch文のコードはdefaultも記述しよう
- defaultもちゃんとコードによるテストを通してカバレッジを取ろう
- defaultのテストはenumの範囲外の値からキャストして行い、例外がスローされることを確認しよう

# Special Thanks

このアイディアは、つぎのTwitterでつぶやいたところ発生した議論をまとめたものです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">switch分の通らないdefalutでカバレッジ下がるの、なんかいい対処方法ないのかな？</p>&mdash; NAKAMURA Atsushi (@nuits_jp) <a href="https://twitter.com/nuits_jp/status/1279713942286110720?ref_src=twsrc%5Etfw">July 5, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[@haxeさん](https://twitter.com/haxe)、[@_midoliy_さん](https://twitter.com/_midoliy_)、[@okazukiさん](https://twitter.com/okazuki)（登場順）アドバイスありがとうございました。
2020年にもっとも使われているプログラミング言語

少し前になるけど**JetBrains**によって発表された開発者エコシステムの現状に関するレポート**The State of Developer Ecosystem 2020**に関するお話

#よく使われているプログラミング言語は？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/5b649d11-121d-3122-32cb-101bfe3f362d.png)

html/css・SQLはプログラミング言語なのかな？と思ったりしたので実質はJavaScript、Python、Javaって続いてるイメージです。
JavaがPythonに抜かれたのは結構衝撃ですね。

#今後移行予定の言語は？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/79e651b2-311b-677a-b359-7d9ffa467ec1.png)

１位が移行予定がないですがGo、Kotlin、Pythonが続きます。
html/css・SQL・JavaScriptなどよく使われている言語がいないのはエンジニアと働いている以上必須スキルとして身につけているということでしょうね。
そういう意味でも初心者の方はこれらの技術をまず身につけるべきだと思います。

個人的に気になった点としてJavaScriptを使っている人がTypeScriptへの移行思考が高いようです。
JavaScriptが廃れるのかはわからないし、個人的にTypeScriptだけやるってどうなの？って思いがあるのでわからない部分もありますが、TypeScriptの需要って高くなると思います。

Pythonは数年前はAIブームの一過性のやつだろって思っていたけど、Rでゴリゴリプログラムを書くというより、Pythonの豊富なライブラリを呼び出して使うと言うやり方がスタンダードになってますよね。
基本情報技術者試験の科目にもCOBOLと入れ替わりで選ばれたり、高校でPythonでプログラミングの勉強を始める可能性もあるわけで出来る人は増えていくと思います。
Pythonは機械学習などに少なからず興味あるからちょっと勉強してるけど、上位の頭いい人にはかなわないし、ちょっとできる人は上記の理由でたくさん出そうなので仕事で必要になったらその範囲で勉強しようくらいの感覚です。

GoとKotlinは自分の身の回りに事例がなくてよく知らない・・・ｗ

#メインで使うプログラミング言語は？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/3d6ede4e-3cc1-126c-399e-f267b31523a1.png)

TypeScriptは2017年には1%だったものが12%まで増加しました。
Javaのような静的な型付け言語をやっている人には覚えやすいですし、今後もメインで使う人は増えていくと思います。
フロントの開発はTypeScriptメインになっていくと予想しています。


#開発対象ソフトウェアと使う言語割合
**開発対象ソフトウェア**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/d81f8eb6-1124-f614-cd37-e21e9f811899.png)

**各言語別の開発対象ソフトウェア**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/f4c15501-120b-06e4-0697-fc52100b5dad.png)

これを見て思ったのはWEB系エンジニア以外は使う言語に大きな偏りはないんだなということです。
あるとしたら機械学習エンジニアがPython使ったりデータエンジニアの人がSQL使ったりとかそうだよねって思う事が多いですね

開発対象のソフトウェアでWEBが一番多くかつWEB系のひとはJavaScriptやPHPに偏っているということは特に絞らずアンケートをとった場合影響がありそうです。
特にJavaScriptとかはWEB系はずしたらここまでぶっちぎり1位みたいな結果にはならなかったと思います。

#参考
https://www.jetbrains.com/lp/devecosystem-2020/
言語以外にもアンケート結果があるので興味あったら見てみてください
tensorflow-gpu 1.15.3 をWin10で動かす

環境を整えようとして大苦戦したので、判明した導入方法を紹介します。
※Intel AVX2を使うのでIntelの第二世代Coreプロセッサー(Sandy Bridge)以前の古いCPUだとインストールできません。
## python
3.5.x ～ 3.7.x を利用しましょう。
## モジュールインストール
```
pip install -U pip
pip uninstall tensorflow
pip install tensorflow-gpu==1.15.3 tensorflow-estimator==1.15.1
```
## CUDA インストール
[CUDA Toolkit 10.0](https://developer.nvidia.com/cuda-10.0-download-archive) をインストールしましょう。
## cuDNN の展開
v7.6.5 (November 5th, 2019), for CUDA 10.0 をダウンロードしましょう。
https://developer.nvidia.com/rdp/cudnn-download
※ログインが必要なのでログイン画面の[CREATE AN ACCOUNT]からアカウント作成(無料)してください。
ダウンロードしたzipファイルを解凍し
中身を`C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0`にコピーして下さい。
## PATHを通しましょう
これら3つのパスを環境変数に設定して下さい。

```
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\CUPTI\libx64
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include
```

以上で、Win10にてtensorflow-gpu 1.15.3が利用可能になります。
お疲れさまでした。
ターミナルからツイートしてみた！

# ターミナルからツイートできたら便利だよね！
## 前置き
作業中にツイートしたくなることってよくありますよね？
ただそこでTwitterを開いてしまうと一貫の終わりです。
TLを巡回し、トレンドを漁り、推しを追うことで時間が過ぎ去ってしまいます。
しかしどうしてもツイート(だけ)がしたい！
ということで、ターミナルから直接ツイートすればいいじゃん！ということに気付きました！

ということで、実際に手順を記していきたいと思います。
(Twitter APIの取得さえできれば鬼簡単です。)
(英語を読める方は[こちらのサイト](https://miamiweblab.com/blog/how-to-post-tweet-with-python-and-twitter-api/)を拝見する方が早いかもしれません。)

## 下準備
まず、ツイートしたいアカウントでAPIを取得します。
API取得については[こちらのサイト](https://www.itti.jp/web-direction/how-to-apply-for-twitter-api/)を参考にさせていただきました。

APIを取得できたらさっそく作業開始です。
まず[このページ](https://developer.twitter.com/en)(Developer用のサイト)にアクセスします。
画面の右上のアカウント名からAppを選択します。
ここでアプリを作成します。
アプリ作成の過程で**API key**、**API secret key**が取得できるのでメモを取ってください。
(Bearer tokenも念の為控えておくのがいいかもしれません。)

次にApp Permissionsを編集します。
最初は**read only**になっていると思うのでそれを**Read and Write**に変えてあげます。
<img width="775" alt="app_permissions.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533798/e907d92e-db5b-db18-6742-7c168d476605.png">

次にアクセストークンを取得します。
Keys and tokensを選択してください。(アプリ名の下で切り替えることができます。)
<img width="350" alt="key and token.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533798/e6e07b8f-0c5e-4316-76ae-2adf24425e3b.png">

**Access Token & Secret**を生成(Generate)して、
**Access token**と**Access token secret**を同様に控えてください。

これで下準備は完了です。

## 準備
まず任意のディレクトリにプロジェクト用のフォルダ(ここではtwitter)を作ります。

```zsh
$ mkdir twitter
$ cd twitter
$ pipenv install python 3.7.5 #各自の環境に合わせて構築してください
$ pipenv shell
$ touch tweet.py
$ open tweet.py
```

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

```
$ pipenv install tweepy
```

```python:tweet.py
import tweepy

#認証キー
#適宜自分のkeyに変更してあげてください。
consumer_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
consumer_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
access_token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
access_token_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)
tweet = input().split()
api.update_status('\n'.join(tweet))
```
あとはターミナルで実行するだけです！

```
$ python tweet.py
```

実行後にツイートしたい言葉を入れてエンターを押すと完了です！
半角スペースを入れてあげると改行することができます。

## 後書き
とりあえずツイートできるようになりました！やった！
最後まで読んでいただきありがとうございました！
Unity ARKitプロジェクトの実機へのエクスポート手順メモ

# これ何
備忘録
Render Pipeline は Universal RP を使っているので Built-in を使う場合は適宜変更

# 実行環境
- Unity 2019.4.4 (要 iOS Build Support)
- Xcode 11.6

# Unity 側の手順

## Package Managerからプラグインの導入
- AR Foundation **4.0.2** (デフォルトが2.1.8なので変更が必要) 
- ARKit XR Plugin 4.0.2
- Universal RP 7.3.1

## Project Settings の設定

### Player Settings
- `Company Name` と `Product Name` を指定
- `Auto Graphics API` を OFF
- (32bit デバイスを使う場合は `Graphics APIs` に `OpenGLES3` を追加)
- `Identification` -> `Bundle Identifier` を設定
- `Target minimum iOS Version` を 12.0 以降に変更 (13.6 に設定)
- `Architecture` を `ARM64` に変更
- URP を使うので `Color Space` を `Linear` に変更

### XR
- `ARKit Build Settings` -> `Requirement` を `Required`

### XR Plug-in Management
- `iOS` -> `ARKit` を ON

### Graphics (URP の場合)
- `Scriptable Render Pipeline Settings` に `URPAsset` を指定

## Scene の設定
- デフォルトの Camera の削除
- `GameObject` の作成 -> `XR` から `AR Session` と `AR Session Origin` の作成

URPで背景にカメラ越しの景色を表示する場合

- URPAsset に設定している Renderer で `Add Renderer Features` -> `AR Background Renderer Feature` を追加

## Build Settings
- お好みで設定して `Build`
- `Build` すると Xcode 用の iOS プロジェクトが生成されるので，Xcode 用のディレクトリに生成物を移動

# Xcode 側の手順
- 生成物を Xcode で開く
- `PROJECT` -> `Unity-iPhone` を選択し，`iOS Development Target` を指定
- `TARGETS` -> `Unity-iPhone` -> `Signing & Capabilities` で署名を設定
- Unity 側で `Bundle Identifier` や `Product Name` を設定し忘れた場合はここで設定
- iOSデバイスを接続してデプロイ
- Enjoy!

# 参考
[Unity, About AR Foundation](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.0/manual/index.html)
[Unity, About ARKit XR Plugin](https://docs.unity3d.com/Packages/com.unity.xr.arkit@4.0/manual/index.html)
RubyOnRails初心者がprogate無料版で学ぶ

# progate無料版を利用して基本的なことを学ぶ

プログラミングを学ぶためにprogete(課金なし)を利用させて頂いているが、初心者にもすごく理解しやすく作られている。
[初心者が初心者にオススメするprogate](https://prog-8.com/)

今回はローカルにWEBサイトを作成する為にRubyOnRailsの学習で1週した(無料部分のみ)。
初心者にも理解しやすく作られている分、1週するのにそれなりの時間はかかる為、2週目はしたくないが忘れてしまうので自分用に要約しておく。

環境設定まではできている段階から始めるので、できていない場合は以前のブログ記事を参考に。
[RubyOnRailsの環境設定(virtualbox)覚え書き](https://qiita.com/ishinonaka0303/items/580c657a19b60234ca61)

```bash
# homeコントローラーを作成する
[root@host02 intra_net]# rails generate controller home top

[root@host02 intra_net]# ls
app config.ru  Gemfile.lock  package.json  README.md  tmp  bin db lib public storage vendor config Gemfile log Rakefile test 
# viewsフォルダにhomeフォルダが作成された
[root@host02 intra_net]# ls app/views
'home' layouts 
# homeフォルダにtop.html.erbファイルが作成された
[root@host02 intra_net]# ls app/views/home
'top.html.erb'
# controllersフォルダにhome_controller.rbファイルが作成された
[root@host02 intra_net]# ls app/controllers
application_controller.rb concerns 'home_controller.rb'

```

```config:home_controller.rb
class HomeController < ApplicationController
  def top
  end
end
```
ルーティングの設定はroutes.rbファイルで

```bash
# configフォルダの中のroutes.rbファイル
[root@host02 intra_net]# ls config
application.rb   credentials.yml.enc   environments   master.key 
  spring.rb   boot.rb   database.yml   initializers   puma.rb 
  storage.yml   cable.yml   environment.rb   locales   'routes.rb'
```

コントローラー作成時に自動でルーティングの設定がされている

```config:routes.rb
Rails.application.routes.draw do
  get 'home/top'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```

スタイルシートはapp/assets/stylesheetsフォルダに作成されている

```bash
[root@host02 intra_net]# ls app/assets/stylesheets
application.css  'home.scss'
```
### サイトのページを増やす場合は、
1. routes.rbにルーティングを追記する
2. home_controller.rbにアクションを追加する
3. views/コントローラー名/アクション名.html.erb ファイルを作成する

```config:routes.rb
Rails.application.routes.draw do
  get 'home/top'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  get 'about' => 'home#about'
```

```config:home_controller.rb
class HomeController < ApplicationController
  def top
  end
  def about
  end
end
```

```bash
[root@host02 intra_net]# ls app/views/home
top.html.erb
[root@host02 intra_net]# touch app/views/home/about.html.erb
[root@host02 intra_net]# ls app/views/home
about.html.erb  top.html.erb
```

**必要な画像はpublicフォルダへ**

```bash
[root@host02 intra_net]# ls public
404.html   500.html   apple-touch-icon-precomposed.png   robots.txt   422.html   apple-touch-icon.png   favicon.ico
```
Swift 引数まとめ

**引数はクラスや関数でよく使いますが、引数に変数を使うせいで簡単な構造でも難しく見えてしまいます。プログラミング学習を始めたばかりの自分にとっては難関です。**

**今回は勉強をして分かってきた事をまとめておこうと思います。同じ初心者の方に参考になれば幸いです。**

#引数について

**関数内の処理で、関数の外から入れることのできる値。　
→この値を変数にすると、関数を様々な場所で使い回すことができる。　**

例　２つの変数を用いた計算
下の例では、変数　vertical、horizontal　の２つが引数にあたります。
引数に実数値、例えば１０とか２０とか入れる事もできますが、あとで数字を変える事ができなくなるので、その場面でしか使えなくなります。
**引数を変数にしておけばプログラム内で同じような計算をしたい時、関数をリサイクルできます。**

```swift:
func cal(vertical:int,horizontal:int){
     area = vertical * horizontal
}
```


###引数ラベル
**関数内で関数を呼び出す時に使用され、引数の変数名の前に設定します。**
設定しておくことで、関数を呼び出す時に分かりやすくなります。**　_ を使うことで省略する事もできます。**

ラベルを設定しなくても、問題ありません。
その時は設定側は（変数名：型名）となり、呼び出し側は（設定側の変数名：呼び出し側の引数の変数名）となります。

使用例は下記のような場面です。
分かりにくいですが、上の関数を下の関数#selector(back(_:))で呼び出しています。objc　func　back(_ sender: Any)の部分で_を使う事でラベルを省略しています。


```swift:引数ラベル（省略）
@objc func back(_ sender: Any) { ...

//呼び出し側
barButtonCancel = UIBarButtonItem(title: "キャンセル", style: .done, target: (Any).self, action: #selector(back(_:)))

```

**関数内で計算をする時は、変数名が計算に使われます。**





###引数とオプショナル
オプショナルは型名の後ろに！や？が付く形で表されます。
これをする事で引数に実数がまだ入る事が不確定な場合でも、引数を取ることが出来ます。
**！はもしnil値の場合は落ちます。？の場合はそれ以上先に進みません。**

AVAudioPlayerクラスでの例

```swift:変数宣言時
var 変数名 : AVAudioPlayer?
```


```swift:引数代入時

変数名 = AVAudioPlayer(contentsOf: 引数!)
```
**オプショナルで宣言した変数は必ずアンラップしないと値として使うことができません。**


```swift:オプショナル値
var a:Int?

a = 1
print(a)
//この時の値は１ではなくOptional(1)となります。
//１ ≠ Optional(1)なので１として扱うことができません。
```

アンラップしない状態の引数に値を入れこんでも、**オプショナルの値になるので使うことができないのです。**



####オプショナルの簡単なまとめ
型名の後ろに付く！、？・・・オプショナル
変数の後ろに付く！、？・・・オプショナルのアンラップ
[WSL] Ubuntu-18.04へのmavenインストール

## 前提

- Ubuntu-18.04 on WSL

## 背景

mavenをインストールするにあたり、Ubuntuのapt公式リポジトリより上のバージョンが必要だったので、仕方なく手動でインストールしたときの備忘録。

バージョンの縛り等がなければ、`sudo apt install maven`で入れたほうが管理の面でも良いと思う。
ちなみにaptで入るバージョンの確認は`sudo apt policy maven`。

## インストール

### はじめに

公式のインストールガイドが常に最も正しい。
- [Installing Apache Maven](https://maven.apache.org/install.html)

### ダウンロード

`/opt`ディレクトリに移動し、mavenのバイナリをダウンロード。

```
cd /opt/
wget http://us.mirrors.quenda.co/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
```

ダウンロードファイルを解凍し、リネーム。

```
tar -xf apache-maven-3.6.3-bin.tar.gz
mv apache-maven-3.6.3/ apache-maven/
```

### 環境変数の設定

`/etc/profile.d`ディレクトリに`maven.sh`設定ファイルを作成し、環境変数を指定。

```
echo 'export MVN_HOME="/opt/apache-maven"' >> /etc/profile.d/maven.sh
echo 'export PATH="${MVN_HOME}/bin:${PATH}"' >> /etc/profile.d/maven.sh
source /etc/profile.d/maven.sh
```

### インストール確認

```
mvn --version
mvn --help
```
【Python】データサイエンス100本ノック（構造化データ加工編） 001 解説

- データサイエンス100本ノックをやりきる会を作りました🎉
- こちらの[Slack招待URL](https://join.slack.com/t/data-science-100nocks/shared_invite/zt-gfncg9vm-8W8b3UrDg8R~TKaqUkQpgw)からご参加ください！！
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています！

##Youtube
[動画解説](https://youtu.be/ZmrtxSJlEbk)もしています。

##問題
P-001: レシート明細のデータフレーム（df_receipt）から全項目の先頭10件を表示し、どのようなデータを保有しているか目視で確認せよ。

##解答
```:コード
df_receipt.head(10)
```

##出力
|  | sales_ymd | sales_epoch | store_cd | receipt_no | receipt_sub_no | customer_id | product_cd | quantity | amount |
|--:|--:|--:|:--|--:|--:|:--|:--|--:|--:|
| 0 | 20181103 | 1257206400 | S14006 | 112 | 1 | CS006214000001 | P070305012 | 1 | 158 |
| 1 | 20181118 | 1258502400 | S13008 | 1132 | 2 | CS008415000097 | P070701017 | 1 | 81 |
| 2 | 20170712 | 1215820800 | S14028 | 1102 | 1 | CS028414000014 | P060101005 | 1 | 170 |
| 3 | 20190205 | 1265328000 | S14042 | 1132 | 1 | ZZ000000000000 | P050301001 | 1 | 25 |
| 4 | 20180821 | 1250812800 | S14025 | 1102 | 2 | CS025415000050 | P060102007 | 1 | 90 |
| 5 | 20190605 | 1275696000 | S13003 | 1112 | 1 | CS003515000195 | P050102002 | 1 | 138 |
| 6 | 20181205 | 1259971200 | S14024 | 1102 | 2 | CS024514000042 | P080101005 | 1 | 30 |
| 7 | 20190922 | 1285113600 | S14040 | 1102 | 1 | CS040415000178 | P070501004 | 1 | 128 |
| 8 | 20170504 | 1209859200 | S13020 | 1112 | 2 | ZZ000000000000 | P071302010 | 1 | 770 |
| 9 | 20191010 | 1286668800 | S14027 | 1102 | 1 | CS027514000015 | P071101003 | 1 | 680 |

##解説
・PandasのDataFrame/Seriesにて、先頭データを確認する方法です。
・どんなデータがあるのかをざっくり知りたい時に使用します。
・**'<データ名>.head(n)'で、先頭n行目までを表示します。**
・逆に末尾n行目までを表示したい場合は**'<データ名>.tall(n)'**を用います。
・いつ、どの店で、誰が、何を、どのくらい、いくらで買ったのか、という情報が含まれていることがわかります。
Swift：オーディオの出力デバイスの切り替わりを検知

```swift
let kAudioOutputDeviceDidChange = NSNotification.Name("audioOutputDeviceDidChange")

var output: AudioObjectPropertyListenerProc = { _, _, _, _ in
    NotificationCenter.default.post(name: kAudioOutputDeviceDidChange, object: nil)
    return 0
}

var outputDevice = AudioObjectPropertyAddress(
    mSelector: kAudioHardwarePropertyDefaultOutputDevice,
    mScope: kAudioObjectPropertyScopeGlobal,
    mElement: kAudioObjectPropertyElementMaster)
    
AudioObjectAddPropertyListener(AudioObjectID(kAudioObjectSystemObject),
                               &outputDevice,
                               output,
                               nil)

let nc = NotificationCenter.default
nc.addObserver(self,
               selector: #selector(deviceDidChange),
               name: kAudioOutputDeviceDidChange,
               object: nil)

@objc func deviceDidChange() {
  // do something
}
```
Unity 3D入門 #2 [文字表示テスト&カメラ移動]

初歩的な文字の表示のさせ方と文字がカメラを常に向く処理は以下のサイトを参照
https://nn-hokuson.hatenablog.com/entry/2016/12/20/201832

とりあえずキャラクターの頭上にキャラクター名を表示させる。

```
void Update()
    {
        // Playerの位置情報を取得
        GameObject player = GameObject.FindWithTag ("Player");
        Vector3 tmp = player.transform.position;
 
        // 自身の座標を取得&設定
        Vector3 pos = tmp;
        pos.y = tmp.y + 2;    // y座標の調整
 
        this.transform.position = pos;  // 座標を設定
    }
```



次にカメラを方向キーで自由に動かせるようにする。

基本的な動きなどは以下の記事を参考にした。
https://qiita.com/Nekomasu/items/f195db36a2516e0dd460


また、常にキャラクターの方を向くようにするためにtransform.LookAtを使用した。
参考URL：http://spi8823.hatenablog.com/entry/2015/05/31/025903

オブジェクトのrotationについての基本はhttps://www.sejuku.net/blog/51521 を参照
https://qiita.com/FuwattoFlower/items/ae5be071ae3405ff70f8 の方向ベクトルの書き方を見て

```
_currentCamRotation = this.transform.eulerAngles; //現在のカメラアングルを取得
var direction = Quaternion.Euler(_currentCamRotation) * Vector3.forward; //それを方向ベクトルに変換

//tmpとの距離がdistとなるようにカメラを配置
Vector3 cam = new Vector3(tmp.x - dist * direction.x, tmp.y - dist * direction.y, tmp.z - dist * direction.z);
this.transform.position = cam;

this.transform.LookAt(tmp); //常にカメラがtmpを向くようにする
```

しかし、この方法だとカメラを移動させた時に画面がカクカクしてしまいました。


![ezgif-4-097a1f77b7c7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670403/5e3c2802-f4ba-9739-a0a3-f68bb21459ca.gif)


レコーディングではカクカクしてないので、とりあえず一段落とします。
PySimpleGUIのユーザー入力を非表示にする方法

### サンプル
```python:simple.py
import PySimpleGUI as sg

layout = [
    [sg.Text("username : "), sg.InputText(key='username')],
    [sg.Text("password : "), sg.InputText(key='password', password_char='*')],
]

window = sg.Window("simple.py", layout)


while True:
    values = window.read()


window.close()
```


###　結果
<img width="371" alt="スクリーンショット 2020-07-18 2.24.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163273/156d1a04-22db-991e-af49-4f6831c863df.png">
undefinedについて

JavaScript, TypeScriptでは値がないことを示す値として、多くの言語にもある`null`に加えて`undefined`もあります。

使い分けについてとやかくいうつもりはありませんが、傾向として設定していないときの「ない」に関しては`undefined`を値として使うことが多いので意図的に「ない」を意味したいときは`null`を使うほうが他のエンジニアに対して「ない」ことにしていることを伝えられるでしょう。

## それが`undefined`であるか ?

ある変数定数が`undefined`であるかの判定は普通に考えれば以下です。

```typescript
const ifUndefined = (variable: unknown): variable is undefined => {
  return variable === undefined;
};
```

これはもちろん正しいのですが、歴史的背景から他の方法も存在します。

## 歴史的な背景

`undefined`は今でこそ定数となりましたが、かつてはglobalにある変数でした。そのため上書きができました。

```typescript
undefined = '👶';
```

上書きされてしまうと前項で述べた方法ではその値が`undefined`であるかはわかりません。

## どうやって判定しますか

プリミティブ型の型判定に使う`typeof`を使います。

```typescript
const ifUndefined = (variable: unknown): variable is undefined => {
  return typeof variable === 'undefined';
};
```

これは現在`undefined`が上書きされているかどうかを問いません。もしも古いES(ES5以前)でも使えるようなパッケージを公開することが視野にある場合は単なる等値比較ではなく、こちらを使うようにするのが無難です。

## 上書きされた`undefined`は元に戻りませんか

以下のようにして戻すことができます。

```typescript
undefined = void 0;
```

`void`を使います。`void 0`としていますがこの`0`はどのような値でも問題ありません。

```typescript
console.log(typeof void 0  === 'undefined');
// true
console.log(typeof void 1  === 'undefined');
// true
console.log(typeof void '👶'  === 'undefined');
// true
console.log(typeof void null  === 'undefined');
// true
console.log(typeof void new Error()  === 'undefined');
// true
```

この`void`はTypeScriptで使われる型の`void`とは異なるものです。

## おまけ

### `null`

`null`は`undefined`と異なり、初めから定数値(リテラル)として定義されているため、上書きができません。そのため直接等値比較ができます。

```typescript
const isNull = (variable: unknown): variable is null => {
  return variable === null;
};
```

### 逆に

`typeof null`としても`'null'`という文字列を得ることはできません。`typeof null`は`'object'`となってしまいます。

```typescript
console.log(typeof null);
// 'object'
```

これはTypeScriptで`typeof`をやったことがあるかたはおわかりいただけるかと思います。`typeof variable === 'object'`としたときの`if, switch`のブロックは`variable`の型は`object | null`です。

```typescript
if (typeof variable === 'object') {
  // variable may be object | null
}
```

そのため、変数定数が`object`であることを確定させたいときは`typeof`のあとに`null`かどうかの等値比較をする必要があります。

```typescript
const isObject = (variable: unknown): variable is object => {
  if (typeof variable === 'object') {
    // object | null
    if (variable !== null) {
      // object
      return true;
    }
    // null
  }
  // unknown
  return false;
};
```

この比較の順番を逆にするとTypeScriptは変数定数が`object`であることを確定させることができません。これはTypeScriptの`Type predicate`が関係しています。

```typescript
const isObject = (variable: unknown): variable is object => {
  if (variable !== null) {
    // unknown
    if (typeof variable === 'object') {
      // object | null
      return true;
    }
    // unknown
  }
  // unknown
  return false;
};
```

TypeScriptが解釈している`if`の時点での型をコメントで書いてありますので参照ください。なお、この関数`isObject()`はTypeScriptによる型の絞り込みは失敗していますが、両方とも同じように動作します。
TypeScriptのenumについて

個人ブログでも公開しています!
https://in-thepink.com

# 概要

定数を定義するのに便利な TypeScript の enum の基本を紹介します！

### enum の定義・使い方

```ts
// enumを定義
enum drinkPrice {
  SMALL = 150,
  MEDIUM = 250,
  LARGE = 350,
}
```

```ts
const coffee = {
  price: 300,
  size: drinkPrice.MEDIUM,
};

// 出力
console.log(coffee.size); // 350
```

**drinkPrice.MEDIUM は enum 型となります。**
<img width="669" alt="image2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278650/20c0b6be-3ff4-2606-0442-f6190cd914e3.png">


### 再代入

readonly プロパティのため、再代入できません。
<img width="669" alt="image1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278650/0fa51334-4948-490a-1301-ed335f391ad8.png">


## 初期値を省略した場合

```ts
// 初期化していない場合、indexの0始まりになる
enum drinkSize {
  SMALL,
  MEDIUM,
  LARGE,
}

const coffee = {
  price: 300,
  size: drinkSize.MEDIUM,
};

// 出力
console.log(coffee.size); // 2
```

定義された数値を基準に、インクリメントされます。
そのため、MEDIUM,LARGE は 151,152 となります。

```ts
enum drinkSize {
  SMALL = 150
  MEDIUM,
  LARGE,
}
```

### 最後に

定数を定義するのに enum は便利かと思いますが、他の記事で enum を使用しないことを薦めているものがありました。
Tree shaking ができなかったり、使い方によっては型安全ではないようです。
良いところ、悪いところ両方目を通して enum を使用すべきか検討してください！

- [さようなら、TypeScript enum | Kabuku Developers Blog](https://www.kabuku.co.jp/developers/good-bye-typescript-enum)
- [TypeScript の enum を使わないほうがいい理由を、Tree-shaking の観点で紹介します - LINE ENGINEERING](https://engineering.linecorp.com/ja/blog/typescript-enum-tree-shaking/)
5分ではじめるServiceNow


ServiceNowの開発インスタンスでダッシュボードを開くまでの手順を説明します。
（殴り書きなので再度推敲します。誤字脱字ご了承ください）

#アカウントの取得
まずは、ServiceNowのdeveloperのサイトでアカウントを取得してください
https://developer.servicenow.com/dev.do#!/home

###[Create an Account]をクリックしてください。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/8dfc2999-7e9a-602d-75e2-6571716dc7b4.jpeg)

###各種情報を入力し、[Sign Up]をクリックしてください。
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/cf011075-e764-794e-e127-56584c9706fc.jpeg)

###この画面が表示されればアカウントの作成は完了です。
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/b7cfe83f-d687-432c-eb57-6d4937cd6e32.jpeg)

###入力したメールアドレスにServcieNowからメールが届いているので「VerifyEmail」をクリックしてください。
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/18ecea6c-84c6-1b30-66dc-525e06440efd.jpeg)

###これでアカウントのアクティベーションが完了しました。続けて表示された「SignUp」をクリックしてください。
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/755a5305-a1a5-19d8-036e-e51773393feb.jpeg)

###メールアドレスを入力して「Next」をクリックしてください。
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/aa8ecfdc-b9e6-8435-0d0b-40ce8eaa6a1c.jpeg)

###次にパスワードを入力して「SginUP」をクリックしてください。
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/a81c2d96-bcc7-b79d-e5a9-6205993292be.jpeg)

###表示された画面を一番下までスクロースし、チェックボックスにチェックをして、「Submit」をクリックしてください。
![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/2ecc5c4a-8352-728c-fb95-db2d46c8ff12.jpeg)

###Developer用の自分のサイトが表示されます。右上が真ん中の「Request an Instance」をクリックしてください。
![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/f76c2f3d-8161-0ec1-b13a-8b5e9c485130.jpeg)

###作成するInstanceのServcieNowのバージョンを選択し、「Request」をクリックします。一番右の「LatestRelease」が最新のバージョンとなります。特にバージョンに指定がなければ最新で問題ありません。
![13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/a52aefb2-3e86-b454-11cb-c4ccc92b6050.jpeg)

###ServcieNowの開発インスタンスは世界共通のリソースを利用している為、タイミングによってはすぐに作成されない場合があります。
その場合は、翌日まで待てばほぼ作成されています。翌日まで待つ場合は、再度Developerサイトにログインしてください。
![14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/68ba1af0-81db-5251-0a22-33f1db2dfb84.jpeg)

###開発Instanceの作成が完了すると以下の画面が表示されますので、開発Instanceにログイン時に使用するCurrentpasswordをコピーし、[Your Instance URL]をクリックしてください。
![15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/d0fd0973-8ec0-b767-7f29-24f9580d7b88.jpeg)

###コピーしたCurrentPasswordと変更後のパスワード(パスワードの条件をクリアする必要があります)を入力し、[Submit]をクリックしてください。
![18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/0f7b4993-3ab2-b5ce-2bf8-22dfea51cbb8.jpeg)

###これで開発Instanceにログインし、利用することができます。
![19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375633/131e3f12-853e-10bb-df32-ef5cc39d4268.jpeg)

#### 開発Instanceは１０日間アクセスがないと自動で削除されますのでご注意ください。
CloudFunctionの定期実行と定時実行

#はじめに
当記事ではCloudFunctionの定期実行及び定時実行について紹介していきたいと思います。導入やデプロイについては、[こちら](https://qiita.com/shotashimura/items/32f71b41ac78745fb82d)の記事をご覧ください。

##CloudFunctionとは？
サーバーレスフレームワークで、Firebase の機能と HTTPS リクエストによってトリガーされたイベントに応じて、バックエンド コードを自動的に実行できます（公式より）

###定期実行

こちらのコードでは例えば3分ごと、1時間ごとなど指定した時間ごとに関数を実行する処理となります。

```javascript:index.js
exports.scheduledFunction = functions.pubsub.schedule('every 5 minutes').onRun((context) => {
  console.log('5分ごとに実行してるよ!');
  return null;
});
```
上記のコード内で、`.schedule('every 5 minutes')`となっている部分の内部を変更することによって、実行する間隔を指定することが出来ます。
即ち、一時間ごとならば、`.schedule('every 1 hours')`、
一日ごとならば、`.schedule('every 1 days')`、
一週間ごとならば、`.schedule('every 1 weeks')`、
（以下省略・・・）となります。


###定時実行

こちらのコードではタイムゾーンを指定した上で、関数を実行したい時間を具体的に指定することが出来ます。

``` javascript:index.js
exports.scheduledFunctionCrontab = functions.pubsub.schedule('5 11 * * *')
  .timeZone('America/New_York') // 必ずタイムゾーンを指定します。
  .onRun((context) => {
  console.log('毎日、ニューヨークが午前11:05になった時に実行するよ！');
  return null;
});
``` 
タイムゾーンに関しては、[tz database](https://ja.wikipedia.org/wiki/Tz_database)に準じた記法になります。もちろん上記のコードのようにニューヨークを指定して、時差を計算して実装しても良いのですが、サマータイムなど色々な事情を考慮すると、素直にサービスを展開したい土地のtimezoneを調べて記載した方が良いかと思います。
ちなみに日本時間は`Asia/Tokyo`となります。

###おわりに
以上の定期実行や定時実行を行うことで、例えば毎日同じ時間にFirestore内のデータを更新したり、CloudMessagingを呼び出してユーザーに通知を行うなどの処理が出来ます。
非常に便利な機能なので、是非是非導入を検討してみてください！！

それでは、また😊

★こちらの記事を参考にしました
[公式ドキュメント](https://firebase.google.com/docs/functions/schedule-functions?hl=ja)
oss-licenses-pluginにライセンスを手動で追加する

Androidの[oss-licenses-plugin](https://github.com/google/play-services-plugins/tree/master/oss-licenses-plugin)は便利なのですが、一部のライブラリがライセンス一覧に表示されない場合があります。そこで、手動でライセンスを追加する方法を調べたところ、以下のページが見つかりました。

- [【Android】 OssLicensesMenuActivityに表示されるライセンス情報を手動で追加する](https://zawapro.com/?p=2121)

このコードを参考にしつつ、さらに複数のライセンスが登録しやすいようにメソッド化を行いました。

# ソースコード


```app/build.gradle
// 自動登録されないOSSライセンスを追加するタスク
task addOssLicenseTask {
    // generateLicensesタスクの直後に起動
    mustRunAfter tasks.findByName('generateLicenses')
    doLast {
        addOssLicense(project, "PermissionsDispatcher", "https://raw.githubusercontent.com/permissions-dispatcher/PermissionsDispatcher/master/LICENSE")
        addOssLicense(project, "PhotoView", "https://raw.githubusercontent.com/chrisbanes/PhotoView/master/LICENSE")
    }
}

// OSSライセンスを追加する
def addOssLicense(project, libName, licenseContent) {
    final String UTF_8 = "UTF-8"
    final byte[] LINE_SEPARATOR = System.getProperty("line.separator").getBytes(UTF_8)

    def dependencyOutput = new File(project.buildDir, "generated/third_party_licenses")

    def resourceOutput = new File(dependencyOutput, "/res")
    def outputDir = new File(resourceOutput, "/raw")

    // ライセンスファイル
    def licensesFile = new File(outputDir, "third_party_licenses")
    // ライセンスファイルへの書き込み前に現在の位置を保持
    def start = licensesFile.length()

    // ライセンスファイルへ書き込み
    licensesFile << licenseContent
    licensesFile << (LINE_SEPARATOR)

    // ライセンスメタデータファイルに書き込み
    def licensesMetadataFile = new File(outputDir, "third_party_license_metadata")
    licensesMetadataFile << ("${start}:${licenseContent.length()} ${libName}")
    licensesMetadataFile << (LINE_SEPARATOR)
}

// preBuild前にライセンス情報を追加する
tasks.findByPath(':app:preBuild').dependsOn addOssLicenseTask
```
【Backup】ArcserveUDPで0MBパーティション

#vCenter上の統合の注意
環境
ESXi,vCenter 6.7 update3
ArcserveUDP 6.5(Windows2016ゲスト)
他の仮想マシンをArcserve仮想マシンでバックアップをとっている状態 
![20200608180329.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/5e3b7d26-697e-41ec-f5ca-5e074331418f.jpeg)
たまにvCenter上に現れるこの統合の警告。
vSphereのスナップショット機能を利用したバックアップソフト等を使っていると、スナップショットファイルがうまく削除されずに残ってしまい上記のような警告がたまに出てきます。

基本的に該当の仮想マシンを右クリック→統合

で消えてくれますが、何をしても消えてくれないことがあります。

該当の仮想マシンをみていると、ディスクの管理によくわからんパーティションができていました。
![20200608180424.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/47596d52-d307-841e-f330-176fdd43608a.jpeg)
なんだお前

C,D,Eボリュームと同じ数だけ(3つの0MBパーティション)できていました。

Windows側で作成されたパーティションじゃないけど大丈夫か？と聞かれますが消すことはできます。
ちなみにDISK PARTで`LIST DISK`コマンドを実行しても出てきません。ますますわからん。
とりあえず、この0MBボリュームを消すとvCenterの統合エラーを消すことができました。

#ArcserveUDPが原因
この謎ボリューム、バックアップ直後にできていることが判明しまして、
<font color="Red">ArcserveUDPのエージェントレス実行だけで発生する</font>もののようでした。
ArcserveBackupやエージェントベースのバックアップでは発生しません。 
(vCenterとやりとりするバックアップだから、統合のエラーが出たのかも。。。)
 
ログ確認すると、仮想ホストがソースノードにマウントした一時領域をデタッチ出来ていないのが原因みたいで、公式サポート回答で提案されたエージェントレスバックアップの転送方式をNBDに変更しましたが変わらず。。

 
0MBで特に悪さをするわけではないですが、なんか気持ち悪いですね。

<br>
いじょう。
【Windows】オフラインでKMSキーインスト―ル

オフラインでのKMSキーインストールの流れ。
ここでは、ADに参加した端末がOfficeを自動ライセンス認証できるようにする手順です。
ボリュームライセンスでMAK→KMS変換分も合わせると2回電話しないといけないんですね。。

# MAKキーからKMSキーへの変換
①ボリュームライセンスサービスセンターへアクセスし、サインイン
https://www.microsoft.com/Licensing/servicecenter/default.aspx

②ライセンスメニューの"プロダクトキー"タブへ移動して、変換したい「製品名 MAK」の項目を探す。

③VLSCサービスセンターへ電話する。(0120-737-565)
ライセンス種別・番号などを伝え、KMSキーに変換してほしい製品を言うと変換してもらえる。

# KMSキーインストール
※KMS機能が有効になっていることが前提です。
※Officeは事前にボリュームライセンスパックをインストールしておく必要があります。ググると出てくるので、ダウンロードしたexeファイルを実行するだけでOK。

①KMSサーバーで"ボリュームライセンス認証サービス"のウィザードを開きます

②ADで認証なので、「Active Directoryによるライセンス認証」を選択して次へ

③「KMSホストキーをインストールする」を選択し、入手したKMSキーを入れて次へ
 
④オフラインなので、「電話でライセンス認証」と「場所」を選択して次へ

⑤Windowsのオフライン認証と同じ電話認証の画面が出てくるので、電話して認証

⑥以下のように追加されていればOK。
Excelのみ等Office製品の単品のみの場合も、OfficeStandard等まとめられたものも同じキーになるようです。
![20200402181427.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/6a6fb58b-3c42-1df3-04f3-490555f775b1.jpeg)
この画面で閉じずにコミットしてしまうと消えるので注意。
<br>
いじょ
javaでメッセージダイアログを表示


自分用メモとして投稿します。
普段、ほとんどjavaでコーディングしないので、ダイアログの出し方分からず色々調べた結果を記載します。

# awtとswingの違い
上記で記載した通り、普段全然java触らない上に、GUIプログラムとか滅多に組まないから、ここからスタート。
awtとswingの名前と何となくの使い方は知ってたけど、違いとか分かってなかった。(ついでにJavaFXについても記載してます。)

- AWTは、すべてのJavaのバージョンについており、どのようなJavaランタイムでも動くのが利点。
- AWTを継承,AWTの欠点であった「GUIの見た目がプラットフォームに依存」を解消,そして拡張性の無さも解消
- JavaFx:XMLとCSSを併用してデザインを記述し、デザイン作成と処理クラスの記述とを分離できる

以下の記事を参考にさせていただきました。

+ [JavaのGUI－AWT,Swing,SWT,Fxの違い](http://blog.livedoor.jp/kiddingblog/archives/51414831.html)
+ [【Java入門】GUIの開発フレームワークまとめ(Swing、JavaFx、AWT)](https://www.sejuku.net/blog/60411)


# java.awt を使ってダイアログを表示
調べた限りは、ちょいとめんどくさい感じが。
VBAでいう所のMsgBox関数みたいなのが使いたいだけ。

- java.awtをインポート
- Dialogクラスのインスタンス生成、ダイアログを生成
- dialog.setSizeにてサイズを指定
- dialog.setVisibleにてダイアログを表示
- 必要に応じて、フレームを閉じる処理
- [java.awt.Dialog ダイアログの作成](http://memories.zal.jp/WP/blog/20110207_1954.html) ←こちらの記事を参考にしました。

# swingを使ってダイアログを表示
javax.swing.JOptionPaneをimportして、JOptionPane.showMessageDialogを呼び出すだけ。時間かけたくなかったし、今作ってるアプリにはこれを採用しました。
コードは省略。

以下の記事を参考にしました。

- [Java：メッセージをダイアログで表示する方法](http://write-remember.com/program/java/showdialog/)
- [警告ダイアログを表示する](https://www.javadrive.jp/tutorial/joptionpane/index2.html)
- [メッセージをダイアログボックスで表示する](http://www7a.biglobe.ne.jp/~java-master/samples/tech/ExceptionDialog.html)
【UPS】PCNSホストシャットダウン失敗

#PCNS
＝PowerChute NetworkShutdown
電源障害の際にネットワークを介してホストやら仮想マシンを落としてくれるやつです。

###構成
・ESXiv6.7ホスト×3(3号機はHA退避先)上のVCSAにPCNS仮想アプライアンスをデプロイし、SmartUPS3000×2でそれぞれ冗長構成で接続。
・DNSサーバーはAD兼用で仮想マシンとして存在。

###流れ
・UPSが電源障害を検知
↓
・UPSと連携されているPCNS仮想アプライアンスがvCenterに接続し、各仮想マシン・ホストを設定に従って落としていく。
という流れです。
<br>
公式マニュアル
https://download.schneider-electric.com/files?p_Doc_Ref=SPD_PMAR-9DNLQK_JA
どおりにセットアップし、ホストの電源を引っこ抜いてみると。。。
![20200401145825.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/440af13e-36f0-6353-96d8-f2b08a2b9f44.jpeg)
出たわね。
シャットダウンシーケンスが走ってはいるものの、仮想マシンはシャットダウンされている状態でホストで失敗し、止まっています。
また、この後全部復旧させてもPCNS上でvCenterに接続できなくなったので、仮想アプライアンスから構築しなおしとなりました。。
<br>
#名前解決のためにhostsファイル編集とユーザー作成が必要
構成として、名前解決のためのサーバーがゲストOSとして存在していたことがポイントです。

<font color="Red">
・PCNSのシャットダウンシーケンス によって、DNS仮想マシンが落ちた。
↓
・名前解決ができなくなり、PCNS仮想アプライアンスがvCenterに接続できなくなったことで各ホストのシャットダウンに失敗した。かつ、
・VCSAシャットダウン後、PCNSに接続されているVCSAユーザー情報がESXiのものと違っていたため、認証できなくなった。
</font>

というのが原因でした。
てことで、各コンポーネントのhostsファイルを編集し、シャットダウンタスク実行のための共通ユーザーを作成します。これがマニュアルには書かれてなかったんですね～

#hosts編集
ESXi、VCSA、PCNSにSSHログインし、
/etc/hostsにすべてのすべてのESXiとVCSAのエントリを追加しておきます。
※PCNS仮想アプライアンスのOSはCentOSです。

#ローカルアカウント作成
内部での仕組みが明記されているわけではありませんが、PCNSはVCSAへシャットダウンの命令は出すものの、実際に実行するのはPCNSに接続したVCSAのユーザーです。
で、DNSが落ちるのと同じようにVCSAも仮想アプライアンスのため落ちるので、最後はESXiが自らホストシャットダウンを実行します。

そのため、<font color="Red">PCNSで設定するVCSA接続ユーザー・パスワードと同じものを、各ESXiにも作成する必要があります。</font>
VCSAのrootに合わせてもいいのですが、全パスワードを統一しないといけないのでセキュリティ上よろしくありません。


てことで、ESXi,vCenterでPCNS接続用のユーザーを作成します。

###ESXi
webクライアントから、【管理】⇒【ユーザー】⇒【ユーザーの追加】
その後、ホスト右クリック【権限】でシステム権限をつけておきます。
###VCSA
SSHログインし、以下コマンドをshellモードで実行

```
shell.set --enabled true
useradd ユーザー名
passwd ユーザー名
パスワードを入力
```
<font color="Red">必ずESXiと同じユーザー名・パスワードで作成してください。</font>

その後、
<font color="Blue">
・webクライアントにて【ホーム】⇒【管理】⇒【ユーザーおよびグループ】を選択。
【グループ】タブに移動し、administratorsを選択後、【メンバーの追加】をクリックします。
・【ドメイン】をlocalosに変更して作成したユーザーを追加します。
</font>

#PCNSのvCenter接続設定の編集
デプロイ前であれば【セットアップ：vCenter Serverの詳細】画面、
デプロイ後なら左ペインの【通信設定】⇒【vCenter Serverの詳細】画面で、前項で作成したユーザー情報を入力します。接続できればOKです。
これで、再度電源を引っこ抜いてもホストまでシャットダウン完了できます。
<br>
ちなみに、"作成したPCNSとVCSA,ESXiを繋ぐためのユーザー"と、
"PCNS管理コンソールのユーザー=UPS本体のManagementCardの管理ユーザー"を混同しがちなので注意です。
![20200401151212.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/2c201899-7eab-0828-4502-881618613471.jpeg)
【vCenter Serverの詳細】が今回作成したユーザー、
【PowerChuteセキュリティ】がPCNS管理コンソールのユーザー=UPS本体のManagementCardのユーザーです。
<br> 
以上。
Udemyのswiftコース（英語のやつ）でiOSアプリ開発を学ぶ　その１

##UdemyでiOSアプリ開発を勉強する
勉強するコースはこれです:point_down:
https://www.udemy.com/course/ios-13-app-development-bootcamp/

英語ですが、なんとかなるかなという軽い気持ちで選びました。
あと、セールで安かったのでついつい買ってしまった（お得という言葉の響きに弱い）
そして、先生の笑顔がとってもキュート:sunglasses:

日本語のコースより英語のコースのほうが内容が充実しているという話もあるし、アプリ開発するついでに英語も学べてラッキー！なんて感じでやろうかと思ってます。

##そもそもの経緯


メーカー勤務（文系職）からBtoBシステム開発企業になんとか転職
　↓
PHPとかJavaScriptとかのWebエンジニアになった（ようだ）
　↓
アプリ開発に興味あるけど、やはり仕事はWeb系（気付いたら半年が経過。。。）
　↓
モヤモヤ:frowning2:
　↓
iOSアプリ開発に興味あるけど、会社のiOS開発する場面があまりないな…
　↓
モヤモヤ:frowning2:
　↓
モヤモヤ:frowning2:
　↓
とりあえずなんかつくるべ！　**👈今ここ！**


システム開発の能力は初心者にほんの少しだけ毛が生えた程度です。
特に高望みはしませんが、何か面白いものをつくって近場の人に喜んでもらえたらいいかなと思います。


##今後の予定（目標？）

毎日はできないかもしれないが、iOSアプリ開発の勉強をコツコツ進める。
そして、アプリ開発ができる面白人間に少しずつでも近づく。
（やることが大事、続けることが大事）

位置情報関連に興味があるので、マップとかGPSとかで何かできたらうれしい。
【de:code2020学習記録】Build 2020 最新情報 〜 Azure & Visual Studio & .NET 〜 について

# はじめに

本稿は、de:code2020の以下のセッションで得た知見のメモです。

[A10 Build 2020 最新情報 〜 Azure & Visual Studio & .NET 〜](https://www.microsoft.com/ja-jp/events/decode/2020session/detail.aspx?sid=A10&tk=A)

[動画がこちら](https://www.youtube.com/watch?v=DypiFxSItIw)で公開されました。

# セッション内容

## Azure - Developping for cloud

### Visual Studio Code

- 21,000以上のエクステンションが公開されている

### Windows Terminal

- PowerShellなどの様々なターミナルを複数タブで利用できる
- 1つのタブ内で分割表示も可能
- Azure Cloud Shellは、Azureを使うときに便利

### Window Package Manager

- chocolatey みたいないものをMSが公式に作った
- 一気にインストールできるので開発環境の構築に役立つ

### Windows Subsystem for Linux

- WSL2が公開され、完全なLinuxカーネルを実現

### Codespaces

- Codespaces on Github と Visual Studio Codespace  
- ブラウザを通してコードエディターで開発できる  
- サインインしてプランを設定
- GitのRepositoryを設定
- ブラウザでVisual Studio Codeと全く同じことができる
  - インテリセンスも効く
  - デバッグもできる(ブレイクポイントで止まる)
  - デバッグ実行はローカルのブラウザでもう1つタブを開く
- 別のマシンをセルフホストとして設定することで、そのマシンの開発環境をブラウザ経由で利用できる
- dotfilesをまとめて共有したリポジトリを参照できる

## Cloud Native Application

### Azure Kubernetes Service

- [詳細はこちら](https://azure.microsoft.com/ja-jp/services/kubernetes-service/)

### Azure Static Web Apps

- GitHub Actions を使って、ワークフローを自動生成

## Visual Studio & .NET

- オープンソースにしたことで、すごい協力者が増えた

### .NET Core 3.1

- ML.NETで機械学習ができる

### Blazor WebAssembly

- C#と.NETでフロントエンド開発ができる
- PWAにすることも可能(チェックを付けるだけ)
- ブレイクもできる、呼び出し履歴も見える
- デバッグモードにすれば、ブラウザの開発者ツールの中でデバッグ実行できる

### .NET 5

- .NET Framework/Xamarin/.NET Coreを統一
- JITとネイティブの実行モデルをサポート
- 2020年11月にリリース予定
- その後は、1年ごとに6, 7, 8 をリリース

### .NET Multi-platform App UI(.Net MAUI)

- Xamarin.Formsの進化版
- .NET 6に合わせてリリース予定(2021年11月)
- 複数のプラットフォームをターゲットにしたプロジェクトの構成を単一プロジェクトへ
- クロスプラットフォームリソースによって、あらゆる画像やフォント、翻訳ファイルなどを単一プロジェクトに追加できる
- 下位にあるOSのネイティブなAPIにもアクセス可能

### WinUI 3 Preview

- UWPとWin32アプリをサポート

### .NET Conf 2020

11月10日から12日でオンライン開催予定

# 所感

C#での開発に活用できる最新情報をたくさん知れたので、とても有意義なセッションでした。

ちなみに、私はLT初心者が集まるコミュニティとして「Serverless LT 初心者向け」というコミュニティを運営しています。
[Serverless LT 初心者向け - connpass](https://serverlesslt.connpass.com/)

Twitterでも開発に役立つ情報を発信しています → [@kojimadev](https://twitter.com/kojimadev)
Java: 実行中のメソッド・行番号を定期的にログ出力するheartbeat-loggerの紹介

# 問題

時間がかかるJavaのバッチ処理などで、どの処理に時間がかかっているのか(または止まっているのか)を確認したいときがあります。

しかし、処理中にログを埋め込む際、その勘所や粒度を見極めるのはなかなか経験が要ります。
また、特定の箇所で長時間止まっているような場合は、ログに何も出力されません。

# 解決策

実行中の行に関する情報を、定期的にログに出力することができればよいと考えました。
このため、非常にシンプルなプロジェクトですが、これを実現する `heartbeat-logger` を作りました。
https://github.com/flyaway2112/heartbeat-logger

# 実行結果

逐次ログを埋め込まなくても、処理中のログを下記のように定期的に出力することができます。

```
2020-7-01 00:11:23.881 [pool-1-thread-1] DEBUG com.example.LargeBatch - Start heartbeat logger
2020-7-01 00:11:23.883 [pool-1-thread-1] INFO  com.example.LargeBatch - com.example.LargeBatch.doLargeProcess1(LargeBatch.java:22)
2020-7-01 00:11:23.983 [pool-1-thread-1] INFO  com.example.LargeBatch - com.example.LargeBatch.doLargeProcess1(LargeBatch.java:22)
2020-7-01 00:11:24.084 [pool-1-thread-1] INFO  com.example.LargeBatch - com.example.LargeBatch.doLargeProcess2(LargeBatch.java:26)
2020-7-01 00:11:24.185 [pool-1-thread-1] INFO  com.example.LargeBatch - com.example.LargeBatch.doLargeProcess2(LargeBatch.java:26)
2020-7-01 00:11:24.286 [pool-1-thread-1] INFO  com.example.LargeBatch - com.example.LargeBatch.doLargeProcess2(LargeBatch.java:26)
2020-7-01 00:11:24.386 [pool-1-thread-1] INFO  com.example.LargeBatch - com.example.LargeBatch.doLargeProcess2(LargeBatch.java:26)
2020-7-01 00:11:24.480 [pool-1-thread-1] DEBUG com.example.LargeBatch - Shutdown heartbeat logger
```

# 使い方

[SLF4J](https://m12i.hatenablog.com/entry/20110625/1309013940)ライクなインタフェースから利用することができます。

## Loggerの生成

```java
HeartBeatLogger logger = HeartBeatLoggerFactory.getLogger(this.getClass(), "com.example", 100);
```
getLoggerメソッドの第一引数は、SLF4Jの[LoggerFactpry.getLogger(Class)](http://www.slf4j.org/apidocs/org/slf4j/LoggerFactory.html#getLogger%28java.lang.Class%29)メソッドの引数と同じく、SLF4JのLogger nameとして利用するクラスを渡します。[SLF4JでLoggerを取得するとき](https://blog.kengo-toda.jp/entry/2013/03/18/235240)と同じように利用すればよいです。

第二引数は、「実行中の処理」としてログに出力するパッケージ名(前方一致)です。
上記のサンプルの場合は、スタックトレースの末端から `com.example` パッケージの処理までさかのぼってログに出力します。
「Javaの標準クラスやライブラリのメソッドの情報が出力されても、プロジェクトのどの処理から実行されているのかがわからない」という問題を防ぐための仕掛けです。
nullを渡した場合は、スタックトレースの末端を出力します。

第三引数は、ログを出力する間隔(ミリ秒)です。

## 処理の開始と終了

```java
try {
  logger.start();
  // ここにログ出力対象の処理
} finally {
  logger.shutdown();
}
```

startメソッドを呼んでからshutdownメソッドを呼ぶまでの間、設定した間隔で自動的にログが出力されます。
【ActiveDirectory】アカウントポリシーの優位性

# AD環境におけるグループポリシー
”Default Domain Policy”と"Default Domain Controllers Policy"とOUポリシー、およびローカルコンピュータのポリシーがあります。

### ”Default Domain Policy”
ADを構築した際に全体に適用されるポリシー。ドメインに紐づいていて、デフォルトで以下セキュリティの設定が入っています。

```
・アカウント ポリシー/パスワードのポリシー
・アカウント ポリシー/アカウント ロックのポリシー
・アカウント ポリシー/Kerberos ポリシー
・ローカル ポリシー/セキュリティ オプション
・公開キーのポリシー/ファイルシステムの暗号化
```
これらの設定はGPOの設定遷移でいうと、
[コンピュータの構成]→[ポリシー]→[Windowsの設定]→[セキュリティの設定]のことです。

### ”Default Domain Controllers Policy”
ドメインコントローラに紐づくポリシー。

### "OUポリシー"
OU(組織単位)を作成して紐づけられるポリシー。

### "ローカルポリシー"
各クライアントコンピュータのローカルポリシー。`[gpedit.msc]`から参照できます。

それぞれのポリシーにリンクされたGPOの定義は累積的に適用されますが、設定が競合した場合に優位性があります。

### ポリシーの優位順
<font color="Blue">"OUポリシー" ="Default Domain Controllers Policy" →”Default Domain Policy” →"ローカルコンピュータのポリシー"</font>

ただ"アカウントポリシー"の設定のみは特殊で、”Default Domain Policy”が最強であり、OUで個別に設定しても反映されないようです。
https://www.atmarkit.co.jp/ait/articles/1606/10/news019.html

# 検証
・アカウント ポリシー/パスワードのポリシーをそれぞれのポリシーで設定し、各コンピュータで反映させてみてみます。

### ”Default Domain Policy”
パスワードの長さ：4文字
パスワードの変更禁止期間：1日
パスワードの有効期限：42日

### ”Default Domain Controllers Policy”
パスワードの長さ：0文字
パスワードの変更禁止期間：0日
パスワードの有効期限：0日

### ”OUのポリシー”
パスワードの長さ：0文字
パスワードの変更禁止期間：0日
パスワードの有効期限：0日

ちなみにローカルのポリシーはグレーアウトがかかっていて設定できません。
<br>
・ドメインコントローラ―、OUに所属するクライアントコンピュータにログインして、以下コマンドを実行。

```
gpupdate /force
```
で反映

```
gpresult /H C:\policy.html
```
でポリシーの適用状況をHTML形式でわかりやすく出力。


# 結果
### ”Default Domain Controllers Policy”
![20200220173246.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/a5fff723-480c-edc4-db75-17f2bd9a4393.jpeg)
設定したポリシーが効いておらず、Default Domain Policyが優勢になっています。

### "OU のポリシー"
![20200220173416.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/99483cb9-8ef7-be93-e350-f52f5c50ae9c.jpeg)
・・・・・アレ？？
普通にOUが優勢になってませんかこれ？？

### OUのみ例外がある
らしい。↓
https://docs.microsoft.com/ja-jp/windows/security/threat-protection/security-policy-settings/account-policies

```
唯一の例外は、組織単位 (OU) に対して別のアカウントポリシーが定義されている場合です。
OU のアカウントポリシー設定によって、OU に含まれるすべてのコンピューターのローカルポリシーが影響を受けます。 
たとえば、OU ポリシーで定義されているパスワードの有効期限がドメインレベルのアカウントポリシーとは異なる場合は、
ユーザーがローカルコンピューターにログオンしたときにのみ OU ポリシーが適用されます。
既定のローカルコンピューターポリシーは、ワークグループ内のコンピューター、
または OU アカウントポリシーまたはドメインポリシーが適用されていないドメイン内のコンピューターにのみ適用されます。
```

OUに所属しているコンピュータにローカルユーザーでログインした場合のみかわるってこと？？
で、OU所属していないorドメイン参加していないのコンピュータではローカルポリシーが適用されますよと。 

`net accounts` コマンドで確認すると、たしかに異なっている。。
![20200220183140.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/c4bef627-6219-e9f2-5e2b-c02cca8cfd5a.jpeg)
<br>
ちなみに、"パスワード無期限"設定では、
ドメインユーザーは「ユーザーとコンピュータ」のユーザプロパティから、
ローカルユーザーは「コンピュータの管理」→「ローカルユーザとグループ」のユーザプロパティからチェックを入れるのが一番強いです。
<br>
以上。
GCP Firebaseの備忘録

# メモ
GCP学び始めの私が、Firebaseについて調べたら
こんなにもいろいろな情報が出てきたので
とりあえずメモとして残しておきます。
知識のアップデートに合わせて、記事の内容も更新予定です


## Firebase
- パフォーマンスや安定性に関する分析情報を得られるためボトルネックを見つける
- アプリケーションの改善を行う
 
### Firebase Authentication
- FirebaseUI Auth/ドロップイン認証ソリューション
- ざまざまな認証方式へのサポート
- フェデレーションIDプロバイダとの統合
- 匿名認証
- Cloud Functionによる拡張

### Firebase Crashlytics
- 整理されたクラッシュレポート
- リアルタイムアラート
- 他サービスとの統合

### Firebase App Distribution
- Android/iOSアプリをベータ配信する
- テスターグループの管理
- fastlane/Gradleの連携
- Crashlyticsとの連携

### Firebase Performance
- アプリの起動時間、HTTP/Sネットワークリクエストなどを自動測定
- パフォーマンスの改善の可能性についてのインサイトを表示
- モニタリングのカスタマイズ

### Firebase Test Lab
- 標準的なテストランナーで自動テストを実行
- ワークフロー統合
- テストケースを自動で生成

### Firebase Predictions
- 機械学習の力をデータに活かす
- パーソナライズされたユーザー体験によるコンバート率の向上
- スマートノーティフィケーションによるリテンションの向上

### Firebase Remote Config
- アプリの変更を素早くロールアウト
- ユーザーのセグメントに合わせてアプリをカスタマイズ
- A/Bテストを実行してアプリを改善する

### Firebase Cloud Messaging
- プッシュ通知やデータメッセージの配信
- 通知コンテンツのカスタマイズ
- メッセージのターゲティング
- A/Bテスト
- 関連機能
  - FCM Architectural Overview
  - FCM lifecycle Flow
  - FCM Message

### Firebase In-App Messging
- エンゲージメントのためのメッセージ送信
- 属性や行動に基づくターゲティング
- 柔軟なカスタムアラート

### Firebase extensions
- アプリにすばやくデプロイ
- ユースケースに合わせて拡張機能を構成
- インストール簡単

### Goocle Analytics
- リッチなユーザーインサイト
- リアルタイム分析
- オーディエンスセグメンテーション
kubernetesでlogを一気に見る方法

## tl; dr

- k8sでログを簡単にみれるやり方（mac）
- 非常に簡単なのでやって損はない

## 困っていること
daemonsetでfluentdを設定したけど、logsを一気に見たい


## やり方
```
brew install stern
```

実行できるか、バージョン確認

```
stern -v
```

今使っているpodからみたい集合体を選ぶ
例えばこんな感じのがあるとします

```
$kube-ctl get po
fluentd-q4nfr                        1/1     Running   0          30m
fluentd-wq77d                        1/1     Running   0          29m
fluentd-zf9ct                        1/1     Running   0          30m
```

こんな感じのコマンドで一気にみることができる

```
stern fluentd-*
```



## 参考
https://cndjp.github.io/tutorials/documents/kubernetes-basics/play-with-bootcamp-app/#23-podtail
大学生が1週間でFlutterアプリを学んでリリースした過程(1日目)

こんにちはシオンです。
都内の大学に通いながらモバイルアプリを作っています。

今日から一週間でアプリを作るチャレンジをしたいと思います。

理由は、昨日読んだ「アプリケーションとは一つの宇宙である」という本に感銘を受け自分も一度宇宙を作ってみたいと思ったから、とかではなくて新しいプログラミング言語の練習のためです。（そんな本は知りません）

新しいプログラミング言語、というかFlutterというアプリを作れるツールがあるのでそれの練習です。
Flutterを使うと、今までアプリを作るときにiphone版とandroid版で個別に作らなければいけなかったものをいっぺんに作れちゃうらしいです。すごい！

後はこれからプログラミングを学習する人に、「他の人はこんなふうに考えてやってるよ！」というのを知ってもらえたら嬉しいです。（私が始めたばかりの頃に他の人を結構気にしていたので）

では、Flutterを使いこなすために一週間でアプリを作っていきます。
よろしくお願いいたします。

# 目次
##### ■どんなアプリを作る？
##### ■一週間で完成するアプリの規模とは
##### ■まとめ

# ■どんなアプリを作る？

さて、アプリを作ると決めたはいいものの作りたいものが決まっていません。（本当に決まっていません、考えながら書いています。）

まず条件としては、
**①Flutterを使うこと**
**②一週間で完成する規模であること（現在2020/05/27）**

この2つ。

ちなみに今の私が持っているFlutterの知識はというと
Flutterとは「フルッター」ではなく「フラッター」と読み、表記はアルファベットで構成されている。また、アルファベットとはGoogleなどの持株会社であり、GoogleのCEOだったラリーペイジが代表を勤めている。

、、、つまり全くの無知であります。よろしくお願い致します。

ここで②の一週間で完成する規模である、という条件を分解して行ってそこからできそうなアプリを考えたいと思います。

# ■一週間で完成するアプリの規模とは
実際どのくらいでしょうか。
しかも全くの未経験。
ちなみに私のアプリ個人開発経験はswiftを使って一つだけ。
それらを踏まえた上で一週間で完成する規模というと

**・ユーザー個人だけが使うアプリ（通信機能、ログイン機能なし）**

まずこれは絶対だと思う。ログインしてメッセージ機能つけてとかからやりだすと絶対に終わらない。
じゃあユーザーが個人で使うアプリとなるとどんなものがあるか

**・管理アプリ**
**・オフラインゲーム**
**・拡声器アプリみたいなツールアプリ**

パッと思いつくところだとこの辺りだろうか。
ゲーム系は作ったことがないので除外。
ツールアプリはワンチャンありそうだけど、もう世の中に溢れてそうなので除外。
今回は管理アプリ系でやってみようと思います。

また、思いついたのですがこの状況をなんとか作るアプリに活かせると面白いのではないでしょうか。

例えば、とても時間が少なくデータベースなどを実装する余裕がない。だから消えてもいい、消えてほしいことを管理するアプリ。とか

具体的にいうと愚痴を吐き出すアプリ。
愚痴をどこにも言えず、苦しむのではなくそこに書き込んで「この問題に苦しむのはここで終わり！」みたいなボタンを押すとメッセージが消えていく。前に進むための押しになるアプリみたいな。（なんだそれ）

あーでもそれ良さそうじゃないですか。

1. **愚痴を書き込む**
- **ボタンを押して愚痴を消す**
- **愚痴を消すと消した数がカウントされる**
- **カウントされた数を「乗り越えた困難の数」とか「乗り越えた壁の数」として表示**
- **時間があったら同じ仕組みで「取り組んんだこと」を記入してボタンをおす。**
- **そうすると「積み上げた数」として残る。**

うーんなんか微妙か・・・？。
でもこれ以上考えている時間ないのでこれでいきたいと思います。

# ■まとめ
一週間で作る愚痴解消アプリ。どうかよろしくお願いいたします。
【Windows】WSUSクライアントが表示されない場合の対応

Windows更新にWSUSサーバを向く設定になっているのに、管理コンソール上にクライアントが表示されない場合。
バージョンは2016。

一度WSUSに登録された状態のコンピュータでクローンとか作成すると陥ります。
クライアントのWSUSのIDが重複するのが原因です。


クライアント側で↓
①WindowsUpdateサービスを止める

②以下のレジストリに移動する。
`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate`

③以下の項目を削除する。

```
SusClientId
SusClientIdValidation
```
 
④WindowsUpdateサービスを起動する
起動すると削除したレジストリの項目が新しいIDで生成されます。

 

⑤プログラム更新を実施する

 
これで更新されるはずです。 
<br>
以上