OmniAICreator/Qiita-1.07M huggingface dataset:
【WebAR/VR】iOS13 safariでデバイスモーション設定が効かないとき

WebAR/VRは（中略）iOS13以降 safariでデバイスモーションを解放するよう
ユーザーに許諾を得なければならなくなりました。（2019年12月現在）

経緯や、その方法は以下の記事が詳しいのでこちらをご覧ください
https://bagelee.com/programming/ios13-webar-webvr/

この記事ではデバイスモーション解除のアラートを出して
**ユーザーが「許可」したにも関わらずWebAR/VRが画面に張り付いたまま動かせない場合の解決策**をまとめます。

このアラートを出して…
<img width="455" alt="スクリーンショット 2019-12-17 21.27.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/53996b04-a29a-9839-067c-a2690d48cb7d.png">



↓×なんで「許可OK」したのに張り付いとんねん
![giphy (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/45e8e6f2-ca2f-6234-bbac-2430b0c233db.gif)

↓◎こうしたい
![giphy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/7c7f6e3b-5bd3-a31a-c7ad-b70b26cd8527.gif)

# 解決策: cameraにlook-controlsを追加
cameraに`look-controls`というプロパティを追加すると解決します。

NG例
`<a-entity camera></a-entity>`

OK
`<a-entity camera look-controls></a-entity>`

look-controls  - aframe
https://aframe.io/docs/0.9.0/components/look-controls.html
selenium 利用時に ChromeDriver の version 違いで起こるエラー対処法

#背景
自分用のメモ
## 状況
- Selenium で動かしているプログラムが、以下エラーで動かなくなった

```terminal
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version ○○
```
- エラー内容としてChromeDriver versionが原因
- [chromedriver](http://chromedriver.chromium.org/downloads) の version が一致していないので合わせる

（毎回調べるのが面倒なのでメモ。）

## 環境
・Mac Mojave 10.46.6
・homebrew-cask で ChromeDriver を事前に入れている

## 対処法
[ChromeDriverとChromeバージョン違いで起こるエラー](https://qiita.com/H2O_HoriHori/items/ad7f9855cfc20b995c42)で紹介されているように downgrade すれば問題なく動く。

upgrade して修正したい場合は、chromedriver を ```brew cask upgrade```すればOK。
前は [Homebrewでcask upgradeが実装されていた](https://rcmdnk.com/blog/2018/03/14/computer-mac-homebrew/)で紹介されているように、方法がなかったらしいが、```brew cask upgrade```を使うことで、homecask 経由で落としたアプリを一括アップデートできるよう実装されている。（有志の皆様、ありがとうございます！）

upgrade は 例えば以下の流れ。

```terminal
XXX-XXX% brew cask list
chromedriver                                     coolterm                                         google-chrome-canary

XXX-XXX% brew cask upgrade 
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 3 taps (homebrew/cask-versions, homebrew/core and homebrew/cask).
==> New Formulae
crc                  docker-slim          gnirehtet            libtorch             powerline-go         skymaker             tio
...(省略)
==> Updated Formulae
abcl                                 flow                                 libtorrent-rasterbar                 pyinvoke
abcmidi                              fmt                                  libtrace                             pylint
...(省略)
==> Deleted Formulae
aap                  bubbros              curlish              docker-cloud         ino                  nicotine-plus        sshconfigfs
archivemail          bzr-fastimport       cvs2svn              euca2ools            
...(省略)
==> Casks with `auto_updates` or `version :latest` will not be upgraded
==> Upgrading 1 outdated package:
chromedriver 77.0.3865.40 -> 79.0.3945.36
==> Upgrading chromedriver
==> Downloading https://chromedriver.storage.googleapis.com/79.0.3945.36/chromedriver_mac64.zip
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'chromedriver'.
==> Unlinking Binary '/usr/local/bin/chromedriver'.
unzip -o /Users/username/Library/Caches/Homebrew/downloads/2712e559b7e0712e196b123a7581adecc2cfdc8d8d728b01fd875b3d371e5d29--chromedriver_mac64.zip -d /var/folders/v_/d8m3hn9n4nj62mx2c7lzkx200000gn/T/d20191217-6720-1bmlok7
chmod +rw /var/folders/v_/d8m3hn9n4nj62mx2c7lzkx200000gn/T/d20191217-6720-1bmlok7/chromedriver
cp -p /var/folders/v_/d8m3hn9n4nj62mx2c7lzkx200000gn/T/d20191217-6720-1bmlok7/chromedriver /usr/local/Caskroom/chromedriver/79.0.3945.36/chromedriver
==> Linking Binary 'chromedriver' to '/usr/local/bin/chromedriver'.
==> Purging files for version 77.0.3865.40 of Cask chromedriver
🍺  chromedriver was successfully upgraded!
``` 

これで動かすと、問題なくプログラムが動作した。
とう言うわけで、上記エラーが出た場合は、downgrade or upgrade で対応すればよいっぽいです。
S3に置いてある過去バージョンのオブジェクトを、ライフサイクルポリシーで一気に消す

バージョニングを有効にしたけどうっかりライフサイクルポリシーを設定し忘れてどんどん過去バージョンのファイルが溜まっていって
気づいたら容量がとんでもないことになっていることってありますよね（ない）。
時すでに遅いがとりあえず過去バージョンのファイルを削除せねば、でもファイルをちまちま削除するのは面倒だし。。。
もしかしてライフサイクルポリシーを設定すれば一気に削除できるもんなのだろうか？
というわけで検証してみました。

## 結論：できる
ライフサイクルポリシーが有効になった時点以降のファイルしかポリシーが適用されないのではないのかしらん？とか思っていたのですが、そんなことはありませんでした。ちゃんとバケット内のファイル全て（プレフィックスを設定していれば対象のファイル）に適用されます。
結論としては、設定した日数を経過しているファイルはすべてポリシー通りに削除されます。

## 設定手順
S3コンソールにアクセスし、バケットの**管理**からライフサイクルルールの追加を選択します。
ストレージクラスの移行はしないのでそこは設定しませんでした。
次に**失効の設定**ですが、ここらへんは各々の要件にしたがって入力してください。
自分の場合は現行のファイルも過去バージョンのファイルもある程度日数が経過したら削除したいので、**現行のバージョン**と**以前のバージョン**にチェックを入れました。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538049/6fc98168-0088-0f42-f1c0-a5afccda1e12.png)


## 設定後の話
すぐにファイルが削除されるのかなと思ったのですが、S3コンソールを確認すると特に変化は見られませんでした。[ライフサイクル設定の要素](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/intro-lifecycle-rules.html)によると、オブジェクトが作成された日時を翌日の00:00UTC（日本時間9:00）に丸めてアクションを実行するようです。
でもバージョニングされたファイルの場合はすぐにアクションが実行されそうですが、結果整合性の関係もありすぐに削除されなさそうです。翌日に再度確認してみるとファイルが削除されてました。

なお数百万ファイルで200GBくらいの規模のバケット×2にライフサイクルの設定を行ったところ、一方のバケットは翌日にファイルが削除されていたのですが、もう一方のバケットは翌日になってもファイルが削除されていませんでした。
バケットポリシーで何か引っかかってるのかなとか見返してみたのですが、特に変なところもないので何でだろーと思っていたところ次の日には消えていたので、たぶんS3の結果整合性の関係で反映に時間がかかったのだと思います。
スマートリモコンNature Remo miniとGASで家電の使用時間を計測してみた 

##最優秀賞の商品でIFTTTやってみた（やろうとした）
とあるハッカソンイベントで最優秀賞を受賞し、商品で「Nature Remo mini」を頂いたので、
これを使って何か便利なことができないかと思い立った、素人の奮闘記です。

##1. 話題のスマートリモコン「Nature Remo mini」
ざっくり言うと「リモコン代替品（の廉価版）」です。上位機種として「Nature Remo」があります。
普段はリモコンで赤外線を飛ばしていると思いますが、それをスマホ起点・Wi-fi経由で飛ばすことができ、
赤外線を受け取る家電（エアコン・テレビ・照明・オーディオ・空気清浄機など）が、古い機種でもスマホから操作できるようになるデバイスです。
屋外からも家電の操作が可能になり、”自宅付近のエリア外に出たら全ての家電をオフにする”とか、細かいルールも設定できるようになっています。

##2. 付加価値
すでに便利なものに、どんな価値を乗っけられるかを考え、
思い当たったのが、家電の稼働時間を計測できていない課題です。
どの家電をどれだけの時間使っているかを見える化して、日ごとの使用時間をグラフにできたらいいなと。

全体構成図はこんな感じ。いろいろ試行錯誤しましたが、IFTTTなどの連携型Webサービスを使わずに実現させることに。
![nature remo (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541767/642ffb3d-359f-f603-2284-c00596be9dc1.jpeg)

##3. スマホからRemoを経由して赤外線を飛ばす仕組みをGASで実現
Remoに家電を登録するとボタンごとに「Signal ID」が割り当てられるようなので、
Nature社で公開されているAPI、アクセストークン、フリーソフトのPostmanを利用してSignal IDを特定しました。

アクセストークンとSignal IDを利用すれば、Remoに登録した家電をGASで操作できるようになります。
（アクセストークンとSignal IDはマスク化しています）

参考ページ：[IFTTTを利用したNature Remoの操作に限界を感じたのでAPIを使う](https://kyogom.com/tech/nature-remo-api/)

```gas:on_test.gs

function doGet() {
  
  /*エアコンの電源をonにする*/
  var options = {
    'method': 'post',
    'headers': {
       'Authorization': 'Bearer XXXXXXアクセストークンXXXXXX'
    }
  };
  var response = UrlFetchApp.fetch('https://api.nature.global/1/signals/XXXXXXSignal IDXXXXXX/send', options);

  /*スプレッドシートに電源on時間を記録*/
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var last_row = spreadsheet.getLastRow();
  var i = last_row + 1;
  var start_time = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss');
  SpreadsheetApp.getActiveSheet().getRange(i,1).setValue(start_time);
}
```

連携型Webサービスが必要かなと思っていたのですが、
”スクリプトの実行日時をスプレッドシートに記録する”スクリプトをGASで書いてしまえば解決しました。
スクリプトはContainer Bound Scriptで作成し、プロトタイプとして、家電をONしてその日時を記録するところまで実装しました。

GASを実行した日時を記録し、できあがるスプレッドシートはこんな感じです。
スプレッドシートの日付表記は少々クセがあるようでしたが、秒数まで表記できるようにしておきました。
![スクリーンショット 2019-12-17 19.55.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541767/4eeb748b-f92a-7833-1275-b7a48697b342.png)

##4. アンテナを張っていなかったツケ
エアコンをOFFにするSignal IDも特定できているし、end_timeを記録して差分からグラフを作成するか、と息巻いていたある日。
Nature Remoの"計測用デバイス"が2019/12/17から発売されることを知りました。使用電力まで計測できるとな...。
もっと言うと、同年3/13にNature Remo Eを発売予定であることが発表されていました。
[電力消費モニタリングデバイス「Nature Remo Ｅ」シリーズの予約受付開始、発売は12月17日から](https://jp.techcrunch.com/2019/12/10/nature-remo-e/)


さらに、親知らずの抜歯を甘く見ており、(アンテナでなく)顎がヒドく腫れたことで戦闘不能となりタイムアップ。。


再認したことは、
様々なサービスにアンテナを張りながら便利さを追求し、素早く実現して世に出すことの重要性です。
便利の先に感動があると思っている派なので、"感動までをスコープにする"ことも忘れないように、気持ちを新たにさせられました。
それと、こちらにはギリ対処できていましたが、社会人の抜歯には最低でも5連休が必要ということも共有しておきます。

以上でーす
AWS CloudFormationのスタック削除に失敗するとき

## はじめに
AWS CloudFormationに使われていないスタックがあったため削除を試みたところ、`Role hogehoge:role/{role-name} is  invalid or cannot be assumed` と表示され、削除に失敗してしまいました。
このような状態のスタックの削除方法をまとめます。

## 原因
エラーに書かれているとおり、そのスタック用のロールが存在しないことが原因です。

## スタック削除までの手順
### その名前のロールを再び作る
1. IAMのコンソールへ行き、「ロールの作成」を選択。
1. 「このロールを使用するサービス」はCloudFormationを選択。
1. アクセス権限はAdministratorAccessを与えるのが手っ取り早いです（あとで必ず削除すること）
1. ロール名は、エラーに表示されていた{role-name}をコピペします。

### スタックの削除
1. ロールを作成したら、CloudFormationコンソールに戻り、再びスタックの削除を試みます。
1. `削除に失敗しているリソースを保持することができます`と書かれているポップアップが表示されることがあります。そのリソースがすでに削除されている場合はチェックを入れて、[スタックの削除] をクリックします。
1. その後、そのスタックの削除に失敗する場合があります。その場合、もう一度削除の手順を繰り返してください。おそらく`削除に失敗しているリソースを保持することができます`というポップアップが出てくると思います。表示されているリソースにチェックをいれて、スタックを削除します。これで削除されるはずです。

### ロールの削除
1. 削除に成功したら、先ほど作成したロールを削除します。


## 参考
[DELETE_FAILED ステータスの AWS CloudFormation スタックをトラブルシューティングする方法を教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudformation-stack-delete-failed/)
Visual Studio 2019でEasymotion

# この文章の目的

- Visual Studio 2019 (以下、VS2019)で Easymotion 使えるようにしたので、その方法に関する覚書。
- 記事のタイトルは「Visual Studio 2019でEasymotion」ではあるが、同様の方法で、VSの所望の拡張機能が自分のVSのバージョンに対応していない場合に対応できるかもしれない。

# キモチ

動機をダラダラ書いてるだけだから、本記事は、基本「やったこと」だけで事が足りる。しかし、なんにしても motivation は大事だと思うのですよ。

Chrome を vimキーバインドちっくにしてくれる Vimium のリンク文字のマッピング機能、ブラウジングするときのページ移動が超効率化されてかなり気に入っている。
で、あれ？このアイディアってそもそもvim系のアイディアってことは、 VSCode のvimエミュレータにもそれっぽいのあるんじゃね？と思い立って調べてみたら、 VSCode のvimエミュレータにはデフォルトで easymotion が入ってるらしくって、適当に設定をしてやれば、サクサクと使えるようになった。
ここまでくれば、本家の Visual Studio にも入れたくなってくるというのが人情ってもの。

調べてみたところ、[それっぽい感じの拡張機能](https://marketplace.visualstudio.com/items?itemName=JaredParMSFT.EasyMotion)を見つけたので、ものは試しと、VS2017 にインストールしてみた所、確かにそれっぽい動きになっていて、縦方向の移動が格段に楽になる。
しかし、この拡張機能、オフィシャルにはVS2017までしか対応してなくて、自分の現行の開発環境は VS2019 。

しょうがないので、 Visual Studio の拡張機能の開発はやったことないけど、何とかなるんじゃないかマインドで、Easymotion のソースコード落としてきてビルドしなおしたら、なんかそれっぽく動いたので、その時のメモを残す。

(というわけで、記事のタイトルは「Visual Studio 2019でEasymotionが使えるようにした」ではあるが、同様の方法で、VSの所望の拡張機能が自分のVSのバージョンに対応していない場合に対応できるかもしれない（もちろん、処理の実装がちゃんとしていることが前提だが）)

# 環境
- OS
    - Windows 10 Home
- 開発環境
    - Visual Studio 2019 Enterprise 16.1.5

# やったこと

以下の調子でやってみたら、なんかうまい事いったっぽい。ホンマかいな、という気もするが…。

1. guthub のリポジトリから Easymotion のビルド環境一式を落としてくる。
2. Visual Studio 2019 を管理者権限で起動して、落としてきたビルド環境を開く。
   - 当初、ユーザ権限で起動・ビルドしたら、"GenerateFileManifestが見つからない"云々というエラーでビルドできなくなって少しハマった。
   - [このIssue](https://github.com/microsoft/VSSDK-Extensibility-Samples/issues/150)によると、管理者権限で立ち上げてビルドしたらうまいこと行くぜ、的なことが書かれていたので、従ったらうまくビルドできた。これがなぜ管理者権限でうまいこと行くのかは、イマイチ腑に落ちないが…
   - ちなみに、このIssue自体はまだopenなので、環境によってはこの方法でも解決しないかもしれない。
3. ソリューションエクスプローラーで、`source.extension.vsixmanifest`を開く。
4. `Install Targets`を開くと、まさしくインストールするターゲットの設定らしきものがあるので、既存の設定を選択して、`Edit`ボタン押下で、`Version Range`を`[14.0, 16.0)`から`[14.0,18.0)`に変更する。
5. `Prerequisites`を開くと、同じような設定があるので、同様に変更する。
6. これで、ビルドを実行して、成功すると、`$(SolutionDir)EasyMotion\bin\Release`に`EasyMotion.vsix`ができるので、これをダブルクリックして、ターゲットの環境にVisual Studio 2019が入っていれば成功。

# オチ

ちゅうわけで、無事 VS2019 に Easymotion が入ったのだけれども、vsvim との相性があまりよくないようで、インサートモードでジャンプすると、ジャンプしたときに入力したリンク文字が挿入されてしまい、ノーマルモードでジャンプしようとするとノーマルモードのコマンドとして認識されてジャンプされない、というオチがついた。

# まとめ

ので、vsvim を優先する現状では使えない…。これについては、もう少し調べて、解決できたらまた記事にする予定。
VSCode + Markdown + windows デフォルトの言語モードにする方法

VSCode (Windows) のデフォルトの言語モードを、Markdown に変更するには

Ctrl + P でSettings.jsonを開き、下記を追記して再起動

```
{
    "files.defaultLanguage": "markdown"
}
```

**カスタマイズできる喜び　VSCode**
初心者によるプログラミング学習ログ 186日目

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

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

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

186日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>186日目<br><br>webサイトコーディング課題<br><br>時間はあったのだけど、今日は進みがわるい<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</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/%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></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1206670014503366659?ref_src=twsrc%5Etfw">December 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
CloudFunctionsのhttpCallable()をTypeScriptで型安全に使う【Firebase】

# TL;DR

```ts:getSanitizedMessage.ts
import firebase from 'firebase';
import 'firebase/functions';

interface GetSanitizedMessageResponse
  extends firebase.functions.HttpsCallableResult {
  readonly data: {
    ok: boolean;
    text: string;
  };
}

const getSanitizedMessage = async (): Promise<string> => {
  const addMessage: firebase.functions.HttpsCallable = firebase
    .functions()
    .httpsCallable('addMessage');
  const result: GetSanitizedMessageResponse = await addMessage({
    text: 'messageText',
  });
  return result.data.text;
};

```

# 事始め

[Cloud Functions for Firebase](https://firebase.google.com/docs/functions/?hl=ja)をクライアントアプリから叩く際、[HttpsCallable](https://firebase.google.com/docs/reference/js/firebase.functions.HttpsCallable)を重宝するのですが、
TypeScriptで型付けする方法がドキュメントになかったため、その備忘録になります。
冒頭に全コードを載せましたが、単純に型拡張するだけです。

## 型なしで書く
`httpCallable()`とはなんぞやという方は[こちら](https://firebase.google.com/docs/functions/callable?hl=ja)を参照してください。

まず、ドキュメントに沿って普通の呼び出しをJSで書くとこんな感じになります。

```js:getSanitizedMessage.js
const getSanitizedMessage = async () => {
  const addMessage = firebase.functions().httpsCallable('addMessage');
  const result = await addMessage({ text: 'messageText' });
  return result.data.text;
};
```

## TSに書き換える

これを型推論せずにTSで書くとこうなります。

```ts:getSanitizedMessage.ts
const getSanitizedMessage = async (): Promise<any> => {
  const addMessage: firebase.functions.HttpsCallable = firebase
    .functions()
    .httpsCallable('addMessage');
  const result: firebase.functions.HttpsCallableResult = await addMessage({
    text: 'messageText',
  });
  return result.data.text; // textがany型になる
};
```

このままだと`getSanitizedMessage()`の返り値の型が`any`になってしまいます。
`result.data.text`が`HttpsCallableResult`に定義されていないためです。

この`HttpsCallableResult`、内実は

```ts:firebase/index.d.ts
export interface HttpsCallableResult {
  readonly data: any;
}
```

のようになっており、要はこれを拡張した型定義を自前で用意すればよいわけです。

## 型拡張する

CloudFunctionsの実行結果を反映した、レスポンスの型を定義します。

```ts:getSanitizedMessage.ts
interface GetSanitizedMessageResponse
  extends firebase.functions.HttpsCallableResult {
  readonly data: {
    ok: boolean;
    text: string;
  };
}
```

あとはこれを型として使うだけです。

```ts
const getSanitizedMessage = async (): Promise<string> => {
  const addMessage: firebase.functions.HttpsCallable = firebase
    .functions()
    .httpsCallable('addMessage');
  const result: GetSanitizedMessageResponse = await addMessage({
    text: 'messageText',
  });
  return result.data.text; // textがstring型になる
};
```
AWS CodeStarでプロジェクトを削除しても何度でもよみがえるとき

プロジェクト一覧でプロジェクトを削除すると、一旦は削除されたように見えます。
しかし、ブラウザをリロードすると先ほど削除したプロジェクトがよみがえっているではないですか！

こいつを今から消します。

# 手順

### そのプロジェクトの中に入る
すると、

```

AWS CodeStar プロジェクトを作成できませんでした。

AWS CloudFormation スタックから次のエラーメッセージが返りました。Your project could not be deleted because the policy arn:aws:iam::hoge:policy/{policy-name} could not be deleted. Verify the policy is not attached to any entities and retry the project deletion.
```
と表示されていました。

つまり、このプロジェクトにアタッチされているPermissionsBoundaryが削除できなかったから、このプロジェクトも削除できなかったんですね。これがわかればあとはこのポリシーを消すだけです。

### ポリシーを削除
IAM Management Consoleを開き、ポリシーを表示します。
削除できなかったポリシーの名前でフィルターし、そのポリシーを開きます。
「ポリシーの使用状況」というタブがあるのでクリック。
このポリシーをアクセス権限の境界として使用しているロールを見ることができます。
この境界を削除しても問題ない場合、ロール名左にチェックを入れて、「境界の削除」を押します。

この境界を使っているロールが存在しない状態にしましょう。

### CodeStarプロジェクトの削除
再びCodeStarに戻ります。
削除できなかったプロジェクトを再度削除してみましょう。
削除の際に表示される `CodeStarプロジェクトとともに、関連する AWS リソースを削除します` はチェックを入れていたほうが良いかと思います。
しばらくしてからブラウザをリロードしてみてください。もうよみがえってくることはないでしょう。
地方学生の就活について(起業編)

この記事は、DSLアドベントカレンダー1５日目の記事になります。
中国からの留学生です。現在２９歳で既婚のM2で、2020年卒業の予定です。
散々D進を推した私が、就活にも参加し、So●tbankのNo.1採用を申込、最終面接を行ったあげく、残念な結果になりました。
#就活前
**D進**→3年無収入で研究専念→4年目卒業できるか→5年目卒業できそう→就職できるか（年収500万あれば良い方？）
　　　３５歳まで収入なし、３５歳で５００万年収から？そもそも就職できるかどうかも不明で、やや辛い！

**就職**→3年目→5年目→１0年目→？？？　
　この不器用の私が４０歳に日本企業での出世に自信はありません。。。自分より若く、優秀な人材、沢山いるので、企業の立場から見ると、そこまで優れていない人は採用する必要ない！
　３０歳になって、子供も欲しいし、家も欲しいし、車も欲しいし、このままだと人生が終わりだ！
どうせ終わりなので、いろんなことをやっていきたいです。起業することにしました。リスクばっかり考えても意味ないので、やる気出せば報われると信じています。
#業界選択
　まず、下の動画の６分までご覧ください。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">観光関係の仕事に携わっていきたい。<br>観光教育普及啓発動画『観光教育ノススメ』 <a href="https://t.co/QZt0HiPtvP">https://t.co/QZt0HiPtvP</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; Mr.Naotoman@2020中小企業診断士合格 (@inoue7010) <a href="https://twitter.com/inoue7010/status/1158174623776686081?ref_src=twsrc%5Etfw">August 5, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
　これから日本政府が観光に力を入れると思います。北海道の新千歳空港の拡大、来年のオリンピックを踏まえて、中国人の観光客これからもどんどん増えていく傾向があります。まず観光客の足になるため、特に雪が降るとJRなどの交通機関が全てパニックになる北海道においては、観光客向けのタクシー会社を立ち上げることにしました。
#会社登記から今まで
　2019年8月13日創立総会議→2019年8月15日札幌中公証役場にて電磁的記録定款認証→2019年8月20日会社設立
　この間、色々理不尽の問題が発生したりします。例えば、法人名義で事務所を不動産契約するとき、会社の謄本がないといけない。会社登記するとき、会社の住所がないといけない。もちろん会社が登記しないと謄本が発行できない。どっちが先にやるか訳わからなくなっちゃった。そこで、行政書士さんと不動産屋さん結構揉めていました。最後に法人の契約に個人の住所を書いて、適当に終わらせました。
　そして、税理士の依頼、厚生年金、健康保険の適用届、従業員の雇用保険労災保険などなどしていました。
　2019年9月17日国土交通大臣北海道運輸局に一般乗用旅客自動車事業許可申請を出しました。
　そこも色々な問題が発生したが、借りた駐車場の大家さんが不幸になったり、事務所と新しい駐車場が遠かったり、新しく買った事業用自動車が故障したり、もう一台の車のバンパーが勝手に落ちたりしていましたが、やっと2019年11月27日に最後の役員法令試験とヒヤリングに向かってきました。
　法令試験に関しては、会社の経営者が50分のうちに４０問を回答し、その中に８割以上正解といけません。その中に、選択式と筆記式の問題両方ありますが、範囲がすごく広く、「道路運送法」、「道路運送法施行令」、「道路運送法施行規則」、「旅客自動車運送事業運輸規則」、「旅客自動車運送事業等報告規則」、「自動車事故報告規則」とその他一般旅客自動車運送事業の遂行に必要な法令などなど。留学生の私がすごく良い挑戦しているような気がします。。。
　結果は３４/40の成績で、８５％は決して高くないですが、合格しました。そのあとすぐヒヤリングが始まりました。
　５７ページの許可申請資料に対して、１ページずつ質問されました。車の整備保管、資金の運用、ごく細いところまで、全て聞かれました。それに、運輸局のお偉いさんが不動産契約書のところに法人契約なのに個人の住所書いていたことを気ついたが、説明しろと言われました。
　当時揉めたことを説明して、お偉いさんが家を買ったときに同じようなことを思い出させた。「日本は細かいところまで責任を持ってやるからね。」と笑いながら無事に終わりました。
　2019年12月１３日付けで、一般乗用旅客自動車事業許可されました。これからの車ナンバープレートを緑ナンバーに変更と開業の準備を重ねて、順調にやっていきます。これからも色々な問題が出てくると思いますが、クリアして、面倒臭がらず、前向きで頑張っていきたいと思います！
#最後に
　まず恩師岸上順一先生に深く感謝申し上げます。1年生の時のチューターから今まで、わがままを許して、研究も、起業も、何をやろうとしても、文句なく、ずっとサポートしてくださいました。本当にありがとうございます。
　次に研究室の同期、４年間もお世話になりました。毎日偉そうに喋ったり、人にきつい事をズバズバ言ったりしている私を我慢してきてありがとうございます。マイペースで気配りがないことを自分でもよくわかっています。それでも誕生日をお祝いしていただいて、旅行を誘っていただいて、本当に感謝いたします。しばらく北海道にいると思いますが、千歳に来たら誘ってください。

　来年3月室蘭工業大学院の卒業に向けて、6年の間にいろんな経験をしていました。これからも豊かな人生を送っていきたいと思います。
CodeIgniterでOracle Databaseを使う場合の正しい設定方法

(2020-03-26) この記事は http://blog.a-way-out.net/blog/2019/12/17/codeigniter-oracle-config/ のコピーです。今後、退会によりこの記事は削除される可能性があります。

# 結論

今までずっと間違ってましたが、`char_set` は `AL32UTF8` が正しい。
多分、今時のほとんどのユーザーはこれでOK。

```php
$db['default'] = array(
    'dsn'    => '',
    'hostname' => ((isset($_SERVER['DB_HOSTNAME'])) ? $_SERVER['DB_HOSTNAME'] : 'localhost'),
    'username' => ((isset($_SERVER['DB_USERNAME'])) ? $_SERVER['DB_USERNAME'] : ''),
    'password' => ((isset($_SERVER['DB_PASSWORD'])) ? $_SERVER['DB_PASSWORD'] : ''),
    'database' => '',
    'dbdriver' => 'oci8',
    'dbprefix' => '',
    'pconnect' => false,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => false,
    'cachedir' => '',
    'char_set' => 'AL32UTF8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' =>  false,
    'compress' => false,
    'stricton' => false,
    'failover' => array(),
    'save_queries' => true
);
```

ちなみに `dbcollat` は、oci8 driver は使っていないので気にしなくてOK。

もし違う文字コード使っているかもという場合は、確認してください。

```sql
SELECT
  VALUE 
FROM
  NLS_DATABASE_PARAMETERS
WHERE
  PARAMETER = 'NLS_CHARACTERSET';
```

---

[![クリエイティブ・コモンズ・ライセンス](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/deed.ja)
この記事は[CC BY-SA 4.0（クリエイティブ・コモンズ 表示 4.0 継承 国際 ライセンス）](http://creativecommons.org/licenses/by-sa/4.0/deed.ja)の元で公開します。
AWS EC2のおすすめディストリビューション

#AWS初心者アドベントカレンダー17日目です。
##半分玄人に近い私が書いてますので多少思っていたことと違ったこと書くかもしれません。ご了承ください。

##AWS EC2で初心者におすすめできるディストリビューションは？
正直言っておきますがAmazonLinuxをおすすめします。
安定していますし簡単にサーバーを立ち上げることができます。
無理する必要もないですしね。
ガリガリ触ってみて壊すのもいいと思います。
それをやらないと育ちません。

##初級からちょっとデキる人向けは
CentOSをおすすめします。
比較的多くのWebサーバで使われています。
AmazonLinuxとほぼ同じコマンドが使えるのでいいと思います。
正直昔は自分Redhat系のOSを使いこなすエンジニアでした。
CentoOSも3年ばかり使ってました。

##中級から上級は
はっきり言っちゃいましょう。
Ubuntuです。
ここまで来ちゃったらヲタクの世界です。
自分は今すべてのものに関してUbuntu化を進めようとしています。
と言うのは新しいバージョンが比較的早く触れるからです。
自分はもうなれてしまっているのでなんと思わないのですがいきなり初心者がUbuntu触るのは止めておきましょう。
高度すぎて追いつけないと思います。
自分はもう楽勝にWeb・DBなどを入れて使ってますが。
ガリガリにチューニングしたい人向けです。

##Windowsは？
はっきり言って無料枠では重たいので止めておいたほうがいいです。
限界がすぐ来てしまいます。
正直言って無料枠でWindowsは無謀に近いです。
安いノートパソコン並みの処理速度になってしまうのでAWSの良い特徴が得られなくなります。

これが私の見解です。

軽めに書いちゃいましたね。
PowerPlatformで自分用の開発環境を作る方法

##前回のあらすじ
PowerAppsの面白さに気が付いて会社の環境でいろいろと試していたところ、ちょっとこれは会社の環境ではできないなーと気が付いて自分の環境がほしくなったおじさん。

[前回はこちら](https://qiita.com/mokkeda/items/88fedaf6b61f4ecb3d0d)

##何をしようとしたか
Microsoft LearnでSharePointのリストを更新したらPowerAutomateで拾ってOutlookで承認されたらツイートするもの。

承認要求を作成する
[https://docs.microsoft.com/ja-jp/learn/modules/build-more-flows/2-flow-create-approval-request](https://docs.micros!
oft.com/ja-jp/learn/modules/build-more-flows/2-flow-create-approval-request)

- 会社の環境には自由に使えるSharePointの環境がない
- Twitterと連携していいとは思えない

##Office 365 開発者プログラムに参加する
色々調べた結果、これが一番よさそうだったので登録。そういえばMicrosoft Ingniteでも登壇者のどなたかがそんな話をしていたような・・・

Office 365 開発者プログラムに参加する
[https://developer.microsoft.com/ja-jp/office](https://developer.microsoft.com/ja-jp/office)
![devenv01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550850/6df808e7-d9ef-155e-469e-6aa2f132bd02.png)

Power Apps Community Planというのもあったのですが、開発者プログラムの方が強そうだったので今回はスルー。
![devenv02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550850/5387c4a3-c0db-2e5c-6ef2-61ebc6dfd295.png)

以下のページのガイドに従って進めれば簡単に登録できます。
[https://docs.microsoft.com/ja-jp/office/developer-program/office-365-developer-program](https://docs.microsoft.com/ja-jp/office/developer-program/office-365-developer-program)

ホーム画面。え、これを無料で使っちゃっていいんですか？
![office01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550850/9c4ed440-84eb-1f34-a5b6-fa4b95a8980d.png)

##ツイートしてみよう
Microsoft Learnの手順にそってフローを作って
![tweet01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550850/26aeb9d9-52d9-851d-a0dd-ce7b17535c1d.png)
SharePointでデータを用意して
![tweet02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550850/46fc9bbd-10f1-2e70-6d41-2072be150442.png)
Outlookに届いたメールで承認すれば
![tweet03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550850/ec4b2561-c591-7d0d-724a-6283599ae3ed.png)
できました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SharePoint＋PowerAutomateでツイート実験</p>&mdash; mokkeda (@mokkeda) <a href="https://twitter.com/mokkeda/status/1206578162332684289?ref_src=twsrc%5Etfw">December 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
##まとめ
自分用の開発環境があるのっていいものですね！
2019年Office365利活用にやったこと

この記事は「Office 365 Advent Calendar 2019」に参加しています

Qiitaに記載していますが、技術要素は薄めです。すいません。

利用者である私は、2019年所属組織でOffice365の利活用推進のために
どのようなことをしてきたか紹介します。
どこか１部分でも参考になるところがあればぜひパクッてください。

#立場紹介
・全社2500人程度の会社で、250人程度のシステム
開発本部に勤務
・Office365の管理者ではなく、ユーザーの1人として本部内での利用を推進
→管理者画面の閲覧は不可
→PowerShell等を使って、サイト全体に影響を与える変更は不可
・品質保証部門（QA）に所属。ISO9001の事務局・出荷前検証の実施・
QAに関するデータの収集及び分析が本業
・半月に1回はMS品川本社の勉強会で新情報をGet!Twitterでできる限りキャッチアップ

##弊社のOffice365利活用の歴史（ざっくり）
・2014年9月に全社導入（導入しただけ）
・2015年から所属本部での利活用推進を始める
・2016年以降は所属本部を対象に有志を対象に勉強会等を企画
（2014年以前は所属本部内に閉じたオンプレミス環境を構築）

###2019年やったこと
・利活用したい部門の相談役
　工夫したこと：会社の目標設定に「他部門の利用支援」を入れて上司に承認された
　→ある程度堂々と他部門の支援ができる
　工夫したこと：デモサイトやサンプルは作るけど、基本的には利用部門に作ってもらう
　→自分の手からすぐ離れるようにする
　工夫したこと：スピード感は大事にした
　→Office365を使えば、やりたいことがあらかたはっきりしていれば60～70%はすぐ形にできる
　　ことが多い。お互いに共通イメージをもった状態ですすめる（最初の会話は大事にして、あとはチャット）
・Teams勉強会
　工夫したこと：本部内だけでなく、他の人にも呼び掛けた（Yammerで）
　→来る来ないは別にして、一定数の人はみてくれた
　工夫したこと：会社のタイプ的に皆が社内勉強会に堂々と行けたいので「読めば分かる」資料にした
　→多分所属本部のレベルの底上げには貢献できたはず
　工夫したこと：来てくれた人は丁重におもてなし
　→デモを多くする、ディスカッションの時間を作る、質問には最後まで答えるなど

・社内情報基盤から少しずつOffice365へ移行
　既存の情報基盤
　　平成8年10月にイントラネット・サービスとして構築→業務連絡等は平成8年からここに投稿
　　歴史があって皆がまず検索するが、使い勝手がよくない
　　例）インターフェースが古い、添付ファイルは検索できない
　　全社員が使う部分は影響範囲が大きすぎるが、500人くらいで利用する部分をOffice365へ移行
　　
・社内報の寄稿（予定）
トイルについて改めて考える

はじめまして、@mshibuyaです。2019年7月よりメルカリにて働いており、メルカリシステムを支えるインフラを運用しサービスの信頼性を担保するSREチームにおいてエンジニアリングマネージャーをしています。

ここではトイルについて考えます。トイルは、SREに関わる皆様には大変おなじみの概念と思いますが、改めて紹介すると

> トイルとは、プロダクションサービスを動作させることに関係する作業で、手作業で繰り返し行われ、自動化することが可能であり、戦術的で長期的な価値を持たず、作業量がサービスの成長に比例するといった傾向を持つものです。
> （Betsy Beyer他編「SRE サイトリライアビリティエンジニアリング」 オライリー社）

といったものです。「トイルは悪であり、できるだけ減らすべきもの」という点においては議論の余地はあまりないものと考えますが、その一方「何が減らされるべきトイルであるのか」については人によって・チームによって解釈の幅が大きいように感じられるので、そこについて改めて考え直してみたいというのがこの記事の動機です。

なおこの記事は[SRE Advent Calendar 2019](https://qiita.com/advent-calendar/2019/sre)の17日目のエントリです。

# トイルの分類学

[SRE Workbook Chapter 6 - Eliminating Toil](https://landing.google.com/sre/workbook/chapters/eliminating-toil/)のセクション「Toil Taxonomy」において6つの類型が取り上げられています。

### ビジネスプロセス

サービスを動かすコンピューティングリソースの管理のために必要とされる様々なオペレーションによるもので、

- 新規ユーザの追加
- 設定変更やセキュリティ対策
- ソフトウェア更新
- 負荷に追従するためのリソース追加や削除
- コスト最適化
 
といった一連の作業がもたらす負荷です。典型的にはチケットベースの依頼の形を取り、作業負荷がチームに分散され気づかないうちに静かに積もっていく可能性があります。

### 本番環境による割り込み

本番システムを動かし続けるために必要となる時間的制約の高いタスクのことで、

- 枯渇したディスクの空き容量の確保
- 応答しなくなったアプリケーションの再起動
- 負荷に応じたキャパシティの調整

のようなものが該当します。オンコール対応の時に行うようなことはここに入るイメージですかね。

### リリースの見守り

多くの場合は自動化されたデプロイシステムが整備されているはずですが、それでもデプロイはレビューや自動テストといった様々なプロセスから成り立っておりいつもうまくいくとは限りません。リリースリクエストを作り、ダメならロールバックしたり、緊急パッチを作ったり、設定変更をしたり…といった作業を行うことは負荷であり、トイルとなり得ます。

### 移行

なんらかのテクノロジーから別のテクノロジーへの移行（データストア・クラウドベンダー…といった）については、それを一度限りのものと考え、手作業で行ってしまいがちですがそれ自体トイルたり得ます。例えばデータベースの移行のためにバックアップツールを書き換えることはソフトウェア開発のタスクですが、そのこと自体がバックアップツールのビジネス上の価値向上をもたらすわけではなく、長い目で見れば繰り返され得る作業です。

### コストエンジニアリングとキャパシティプランニング

- リソースを省コストで利用するための取り組み（リザーブドインスタンスの購入のような）
- 上流・下流にあるサービスのサービスレベルレビュー
- ワークロードの大きさに合わせた最適化
- クラウドベンダーが提供するサービスに合わせたアプリケーションの最適化（DynamoDBに最適化する、のような）
- スポットインスタンスを利用可能にするためのツールの変更
- 余剰リソースへの対応

といったものもトイルになり得ます。

### 見えにくいアーキテクチャのトラブルシューティング

マイクロサービスのような分散アーキテクチャを採用していて、かつ十分洗練されたトレーシングやモニタリングが整っていない場合、トラブルシューティングにかかる労力は大きくなります。似たような問題に繰り返し悩まされていて、都度原因究明に労力を要しているならトイルに該当するでしょう。

# 気付き

こうして見ると、普段SREチームがやっているようなタスクってほとんどトイルに見えてきませんか？うーん、我々のやっていることの大半は実は価値がないんですかね…

多分そんなことはなくて、そこは上記分類にも断り書きのある通り

> トイルであるかどうかというのは0/1で分類できるものではなくて、スペクトル状に幅のあるものと考える方がよい。

なのです。「このタスクはトイル度80%くらいだ」「このタスクは効果が期待できるのでトイル度20%ほどでは」という風に考える方が実態に沿っているのでしょう。

そして大事なポイントがあると思っていて…

**タスクが（合理的な労力の範囲内での）自動化可能性を持たないのだとすれば、それをトイルと見なす選択肢を多分失う**

のではないかなと思い至りました。「これは自動化しようがないし、一回きりだからトイルじゃなくてソフトウェアエンジニアリングだよね」みたいなことになってしまい得ると。人間誰も、自身がトイルのような相対的に意味の薄いことをやっているとは思いたくないですからね。

自動化可能性の低さは、いろんなところから生まれうると思います。アーキテクチャもそうですし、ツール・慣習・プロセス…などなど。

トイルとの戦いは、こういった多くの要素も考慮しながら、戦略的・長期的なビジョンを持って臨むことになるのでしょう。長い戦いになりますね。

# まとめ

このエントリでは、SRE Workbookで取り上げられているトイルの分類について紹介し、そこから得た着想について紹介しました。

現在メルカリSREチームでは自分と一緒にこんなことを考え、SREチームの成果を最大化するために力をお貸しくださるエンジニアリングマネージャーを絶賛募集中です。

[Engineering Manager, Site Reliability - Mercari, Inc.](https://apply.workable.com/mercari/j/F9E14C0FFA/)

少しでも興味をもって頂けた方がいましたら、こんな[bosyu](https://bosyu.me/b/00w-hR7Trjg)もありますのでまずはカジュアルに食事でもどうでしょう。
上記bosyuないし[Twitter](https://twitter.com/m4buya)アカウント宛でも大丈夫ですので、どうぞお気軽にお声がけください！現場の生の課題感などあれこれ語らいましょうー :raised_hand:
Bubble Sort

# Pythonで「バブルソート（Bubble Sort）」

## はじめに
ここでは[「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」][1]の中で取り上げられている[「AOJ (Aizu Online Judge」)][2]の問題を自分で解いた際に学んだことや、こう考えれば分かりやすいと感じたことなどを自分への整理も兼ねてまとめています。
このテキストはC++で書かれているので、私のようにpythonで勉強をされている初学者の方の参考になれば幸いです。また私自身も初学者ゆえ、至らない点が多々あると思いますので、ご指摘・ご助言頂ければ喜びます。よろしくお願いします。

## 問題詳細
[ALDS1_2_A; Bubble Sort][3]
バブルソートで昇順に並べ替える問題です。
問題詳細は上記リンクをご参考ください

## 考え方
●順番が逆になっている隣接要素が無くなるまで、次の処理を繰り返します
1. 配列の末尾から隣接する要素を比べていき、大小関係が逆なら交換

## pythonコード
```python
def BubbleSort(A, N):
    cnt = 0     # 隣接要素の交換回数
    for i in range(N):      # iは未ソートの部分列の先頭のインデックス
        for j in range(N-1, i, -1):     # 隣接要素を比較するのは未ソート部分列の末尾から先頭まで
            if A[j-1] > A[j]:           # 隣接要素を比較
                A[j-1], A[j] = A[j], A[j-1]     # 大小関係が逆の場合、交換
                cnt += 1        
    return A, cnt

N = int(input())
A = list(map(int, input().split()))

ans, cnt = BubbleSort(A,N)
print(*ans)    # リストの中身を値で取り出す
print(cnt)

```````

## ポイント
1. 末尾から順番に隣接要素の大小を比較していきますが、既に大小関係が正しい場合には交換は行わず、そのまま次の隣接要素の比較に移っていきます（同じループ内）。

2. 各計算ステップにおいて、配列は「ソート済みの部分列（i-1番目まで）」と「未ソートの部分列（i番目以降）」に分かれていると考える事ができます。そのため、隣接要素の比較はi番目の要素までで行えばよいことになります。

3. jの範囲についてですが、まずN-1は未ソート部分列の末尾のインデックスです。

一方で、

```python
for j in range(N-1, i, -1):
``````

において、rangeは第２引数の手前までが範囲となるため、この場合j=i+1までになっています。しかしこれは、隣接要素の比較時にj-1番目とj番目を比較していることから、きちんとi番目の要素（未ソート部分列の先頭）を考慮できています。

## まとめ
以上となります。いかがでしたでしょうか。
間違いや改善点などございましたら、よろしくお願いいたします。







[1]:https://book.mynavi.jp/ec/products/detail/id=35408
[2]:https://onlinejudge.u-aizu.ac.jp/home
[3]:https://onlinejudge.u-aizu.ac.jp/courses/lesson/1/ALDS1/all/ALDS1_2_A
売上あれば会社はつぶれない？いや、つぶれます。

#弊社はどうやって売上をあげているのか
端的に言うと、弊社はWeb制作会社です。

端的に言うと、作ったWebサイト（ポータルサイトやECサイト、CMS、バックエンド業務サイトetc…）を売り、**お客様からお金を頂くことが**売り上げとなっています。
そのほとんどは受託の請負い案件で、社内で制作～開発～運用を行っています。

#請負い契約とは
上記で「お客様からお金を頂くことで…」と簡単に書いてますが、そう簡単ではありません。

１．お客様：A商品をこういう機能で作ってください。
２．弊社：それなら〇〇円で作るので、買ってください。
３．お客様：了解！発注（注文）します！
４．弊社：承知しました！受注します。契約は請負契約です。

というような流れで注文を頂き、

５．弊社：作りました！納品します！ご検品（検収）お願いします！
６．お客様：不具合あるよ！直して！
７．弊社：承知しました！直しました！ご検品お願いします！
６．お客様：不具合あるよ！直して！
・・・

というように、６、７が何度か続くのが請負契約と考えてよいです。
要は作ったものに責任を持つため、検品が終わるまでお金は頂けない。という契約です。
その後、

８．お客様：納品物全て検品完了です！
９．弊社：ありがとうございます。ではご請求します。○○円をお支払いください！

ということで、やっと会社に売上げが上がるのです。

#会社の血（お金）の流れ
上記例、1月に注文を頂き、翌々月3月31日に検収を頂いたとしましょう。
お客様からお金が入金されるのは、契約時の「支払いサイト」通りになりますが、
「通常は検収翌月の末日払い。」ということが多いので、その例通りとすると4月30日となります。
ということは、会社としては1月、2月、3月、4月の4カ月間はお金が減っていくだけ、、、の期間となっています。

その間の、社員の給料、保険料、家賃、光熱費、コピー代、コーヒー代、接待費など…それらのお金はというと、
・以前の12月までの売上
・他案件が2月に売上を上げて3月末に入金されている
・はたまた銀行から借金をして支払っている
など、色々なところからお金が出ていると思います。

これ、たとえ借金で支払いをしていてもそれが予定通りであれば何の問題もありません。
借金していたとしても予定通りに売り上げが上がり、返済ができていれば何の問題もないのです。
これはうまく会社の**キャッシュフロー**が回っているということです。

#キャッシュフローが回らなくなってしまうパターン
キャッシュフローがまわらないときー！
仕事が無く売り上げが全く無いときー！
というと簡単ですが、仕事があってもキャッシュフローが回らなくなる可能性はあります。
上記請負案件でいうと、６～７の納品スケジュールが予定通りに収まらず、検品が3日遅れたとしましょう。
たった3日と思いかもしれませんが、この3日で会社の血が回らなくなることもあります。

なぜだかわかりますか？
上記で書いたように、入金は**検収翌月の末日払い**と契約書にあります。検収日付は4月3日なので、入金は翌月5月31日となります。
会社としては1月～4月の4カ月間の減るお金の計算はしていたが、5月の減るお金は4月30日に入金されるお金を当てにしていました。ですが、「遅延3日」のせいで目論見は外れました。
おそらく5月に出ていくお金は、経営者の身銭、街金からの借金、どこからかわからない資本金の増資etc…から支払われることになります。
これは健全なキャッシュフロー（会社経営）とは言えません。
というか、経営どころか、会社が倒産。ということになりかねます。

#PM、Webディレクター層が「予算を見る」　ということ
倒産しないために「お金の流れ、全部把握しろよ」ということではありません。それは経営層のすることです。
PM、ディレクター層がすることは**キャッシュフローを意識すること**です。
具体的には、
・案件の予算は必ず把握する。
・その予算の内訳は？
　→Aさんの1か月は○○円、Bさんは××円、俺は△△円。3か月3人でやるから、合計おいくら。
　→それでは赤字だ。Aさんは2か月、俺は1.5カ月で計算すると・・・□□円の黒字！
・納期は？検収月は？入金月は？スケジュール（検収）が遅れることでキャッシュフローは回るのか？
これらは必ず考えておくべきことで、これらを称して「予算を見る」ということになります。

余談：
見積時は必ず黒字になる見積りをする。というのが鉄則ですが、赤字を出してもやるべき案件が稀にあります。これは経営者と相談しましょう。
要は、1次フェーズの開発は赤字だが、その後長期的にお付き合いすれば必ず黒になる。この案件が赤字でもキャッシュフローにも影響ない（他の案件が頑張ってる。現金いっぱい口座にある）。
よし！今は赤字でもやるぞ。というような経営判断が必要になります。
【iOS13】Ad関連でクラッシュが急増してつまずいた

## じわじわ上がるクラッシュ件数
9月の半ばにiOS13がリリースされ、
そして、それと合わせてiPhone11(iOS13搭載)たちも発売が始まりました。

すると世にiOS13が普及するにつれ、
日毎に１日あたりのクラッシュ数が増加😱

![スクリーンショット 2019-11-07 12.22.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146629/0c80635a-8c6f-deb8-8512-2f27738909c0.png)

Fabricを見ると以下のエラーが起きていました。
<img width="895" alt="スクリーンショット 2019-12-17 20.00.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146629/ae72d99c-64c3-ca5b-0264-e0cd99228b4a.png">

* OS：iOS13 100%
* 再現性：なし
* エラー内容：

```
「メインスレッドからアクセスした後、バックグラウンドスレッドからレイアウトエンジンへの変更を実行しないでください。」
（"tryToOptimizeReturningMutuallyExclusiveConstraints：Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread."）
```

調べてみるとGoogleGroupsのスレッドを発見、GoogleのAdsSDK関連が原因かも。。。？
https://groups.google.com/forum/#!msg/google-admob-ads-sdk/PuHOKMX1mVI/COZUVi2KAwAJ

```
1,アプリを立ち上げ広告を表示する
2,リストをリロードし、そのままアプリを閉じバックグラウンドの状態にする
3,再度アプリを開く
4,開いたタイミングでクラッシュする
```

という事象で発生したと述べている人がいたが再現せず🤔
発生時点の10/5頃はGoogle側も「原因を調査中です、情報求む」状態。。。

[iOS13からUIWebViewがこれまで以上に不安定になったり、より使用にシビアになった](https://blitzgate.co.jp/blog/2032/)という点で、
UIWebView起因も考えられるとヒエラルキーで確認したところ、
![スクリーンショット 2019-10-15 10.29.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146629/09cd6b3e-36b7-744e-3a04-0bddf29ed219.png)
ちゃんと使用されており、ますます🤔？？？？？？となったところでGoogleに問い合わせを行いました。

## Googleに問い合わせた
「一日に数百件のクラッシュが起きてて原因もわからないの助けて😭修正版リリース求む」
という内容とFabricの内容を転記して送信したところ以下の返信がきました。

```
社内のエンジニアによるスレッドを確認したところ、いろいろな調査の結果、
当該クラッシュは弊社の SDK の実装に由来するものではなく、iOS 13 の UIWebView によるものである可能性が高いと判明しております。
UIWebView は安定性に問題があることが多いため、
現在 Google Mobile Ads SDK では UIWebView の代わりに WKWebView を使えるようにするベータ機能を導入しております。
以下のように当該機能を有効にしてアプリをビルドし直していただければ問題はさしあたり解決するのではないかと思われます。
```

。。。。。

😲え、UIWebViewであってたの...???


ということで、

Info.plistに

```swift
Key: gad_preferred_webview
Value: wkwebview
```

を追加。

すると、みるみるクラッシュが激減。
<img width="477" alt="スクリーンショット 2019-12-17 19.58.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146629/1b2df5ba-c959-6af9-7af7-02c1f414cc3b.png">


おそらく、まれな確率でUIWebViewがベースの広告が送られてくるってことなのでしょうか🤔
再現性がないので実際の原因が特定しきれませんでしたが、とりあえずiOS13でUIWebViewを使用すると意図しない動作不具合が起きるってのを身を以て体験しました。

## 最後に
> WKWebView を使えるようにするベータ機能を導入しております。

デフォルトでそうしてくれ！！！！！！！！！！！！😭😭😭😭😭😭😭
[Tips] Ant Design Vue の Table で行を文字列でソートする

#はじめに

[Ant Design Vue](https://www.antdv.com/docs/vue/getting-started/) の [Table](https://www.antdv.com/components/table/) のドキュメントを見ていたところ、
数の昇順・降順ソートの方法については記載があったのですが、
文字列の昇順・降順ソートの方法については記載がありませんでした... :frowning2:

文字列の昇順・降順ソートは地味ながら、
割と今後も実装の必要が出てきそうな気がしたので、
実装方法について残しておきたいと思います :writing_hand: 

また本記事の内容は応用すれば、文字列の昇順・降順だけでなく、
より複雑な条件でソートを行うことも可能になります :eyes: 

# Table の行を文字列の昇順・降順で並び替える方法

`a-table` タグの `columns` 属性に渡すカラム情報が記載された配列内のプロパティに、
`sorter` を追加することで行のソートを行うことが可能です :thumbsup: 

```vue:SortableTable.vue
<template>
  <div>
    <a-table
      :columns="columns"
      :dataSource="data"
      :items="data"
    >
    </a-table>
  </div>
</template>
<script>
const columns = [
  {
    title: "age",
    dataIndex: "age",
    sorter: (a, b) => {
      // 数の昇順・降順ソート
      return a.age - b.age;
    }
  },
  {
    title: "name",
    dataIndex: "name",
    sorter: (a, b) => {
      // 文字列の昇順・降順ソート
      const aName = a.name;
      const bName = b.name;

      // JavaScript の sort 関数を使用して昇順でソートする
      const first = [aName, bName].sort()[0];

      // sort 関数の結果の先頭が昇順の先頭なので、
      // aName と一致するかチェックし先頭だったら 1、そうでなかったら -1 とする
      return first == aName ? -1 : 1;
    }
  }
];

const data = [];
for (let i = 0; i < 100; i++) {
  data.push({
    name: `Edrward ${i}`,
    age: 100 - i
  });
}
export default {
  data() {
    return {
      data,
      columns
    };
  }
};
</script>
```

`sorter` 内の返り値が 0 の場合はソートが行われず、
-1 であれば比較した前の値を先頭に持ってきて、
1 であれば比較した後の値を先頭に持ってくることになります :white_check_mark: 

そのため、数であれば単純に `a.age - b.age` でソートすることが出来ます :thumbsup: 
文字列も長さでソートする場合は `a.name.length - b.name.length` で可能です :thumbsup: 

しかし、辞書順のような複雑な条件でソートを行う場合は、
今回のように明示的に返り値を指定する必要があります :point_up: 

#おわりに

もっと良い解決方法があればご教授ください:bangbang:

#参考リンク

- [Table - Ant Design Vue](https://www.antdv.com/components/table/)
- [Array.prototype.sort() - JavaScript - MDN - Mozilla](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)
実況用コンデンサマイク選び（メモ）

削除もったいないからそのままコピペ

YouTubeで実況したい。USBコンデンサマイク 1万円以内 簡単　小さい　コンパクト　コスパ　持ち運び　携帯性（ポータブル）
ノートパソコン　マイク　オーディオインターフェイス　オーディオインターフェース付き 実況　自分の声も聴きながら 声が返ってくる

SONY ECM-PCV80U コスパ 20112014 
usb audio box
pc用
iphoneでも使える
Amazon | SONY エレクトレットコンデンサーマイクロホン PC/ゲーム用 PCV80U ECM-PCV80U | 楽器・音響機器 | 楽器

AM310 12,960 　￥13,500  ¥8,500
設定の楽さ
ミュートが付いてるのと背面にモニターorゲーム音聞く為のヘッドホン端子付き(音質は少し残念かな。ただヘッドホンアンプを買わずに用途は満たせるのでお得ではあります)

 AT2020USB+
ミュートがない
￥10,000
USBバスパワー

MPM-2000U 大きさ
ミュートがない
自分の声×

Blue Microphones Yeti USBマイク
USBマイク
指向性を変えられる

オーディオインターフェイス
 
PCの音とマイク音声のミックスしたい場合は、特定のアプリを使って対応する必要があります（上述）。USBコンデンサーマイク自体には、ループバック機能は搭載されていません。

ステレオミキサー

#最後に選んだのは
AT2020USB+ メルカリ 8000円
使えるb
PCが1人１台しかない現場の業務改善を考えてみた

こんにちは、カメドットです。

## 今日のテーマはこれ何？
Twitterを見ていて見つけたお題です
「ＰＣメールを印刷して早番している」というつらみあるツイートを見たので
ユーザー向けサービスとして改善できるかなと考えてみたものになります


## ツイートからのシナリオ作成手順

参考ツイート
https://twitter.com/mtcosb/status/1206346837004697600

>今日メールチェック当番だから朝早く行きます
本業じゃない内容で「早番が発生している」という課題があると読み取り

>一人一台PCがないから、朝一に共用PCに届いたメールをプリントアウトして各人に配って掲示板に書く当番

リソースの洗い出し

一人一台PCないからメール内容の共有についてPC以外の方法が必要　
　　　　↓
携帯やタブレットでの連絡とシステム化が必要

共用PCに届いたメール
       ↓
メール情報を取得して、共有する

プリントアウトして各人に配って掲示板に書く
　　　　↓
当日欠席した時の漏れがあり得るので、出力先を紙から共通グループチャット等に


## シナリオ
既存の業務流れ（ツイートからの推測)

![20191217_195831.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/de7974b0-4ddf-d5ef-24d4-c709a5dc0a96.jpeg)

改善後
![20191217_202130.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/49089622-1010-7fa1-4953-e9d7ab096dd8.jpeg)



改善後の流れによって
・早番制度の廃止→結果として、早番を考慮しないで多様な形態で雇えるようになる
・手動で掲示板をみにいくのを忘れて、共有漏れの軽減→チャットで教えてもらえるため

空いた時間を使っての取引先拡大など


社内にエンジニアがいない場合の売上想定
・提案書類作成
・実装コスト
・利用方法について現場サポートのレクチャー
・他を頼まれれば適宜(安いものであれば、実績にしてもらって他営業）

デモ
今日の朝作っていたもので、１日１回のジョブ実行後にチャットに投稿されているもの

https://www.youtube.com/watch?v=-6ZOrIjtLz4

## 画像利用元
いらすとや
https://www.irasutoya.com/p/terms.html
Power BI On-Premise Data GatewayでのAzure Blob Storageへの接続設定

#はじめに
Power BI サービスで利用するOn-Premise Data Gatewayで、Azure Blob Storageへのデータソースを構成する場合入力方法がどこにも記載なかったのでメモ

[オンプレミス データ ゲートウェイとは](https://docs.microsoft.com/ja-jp/data-integration/gateway/service-gateway-onprem)

#On-Premise Data Gatewayのデータソース追加
Blob Storage を選択するとdomainとかでてきます。アカウント名込みかと思いましたが、ただのblob.core.window.netでした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0abd50da-6c8c-14ba-d2cb-35d5f9f40fcc.png)

こう入れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/90788aec-1c3f-f7d2-87c5-0e3960fe9292.png)

地味にこの辺に関するリファレンスがなくてつまりました。
オンプレミス データ ゲートウェイに関しては情報がちょっと少ないですね
pythonでWebDriverを駆動

# 目的
pythonでWebDriverを駆動する。
Edgeを起動できるところまでを行う。

# 環境構築
pythonのインストールは完了している環境で作業します。
version確認してみましたら、以下のversionでした。
`Python 3.8.0`
## seleniumのimport
以下のコマンドを実行します。
必要であれば、管理者権限のあるコマンドラインで実行してください。

```
pip install selenium
```

# pythonによる実行
seleniumがimportできたか、動作確認します。

## スクリプト作成
スクリプトを作成します。

``` webdriver_sample.py
from selenium import webdriver

# EdgeDriver取得
driver = webdriver.Edge()
# 指定したURLに遷移する
driver.get("https://www.google.co.jp")
```

## 実行
スクリプト実行してみます。

```
python .\webdriver_sample.py
```

環境構築前ですので、エラーが発生します。

```
selenium.common.exceptions.WebDriverException: Message: 'MicrosoftWebDriver.exe' executable needs to be in PATH. Please download from http://go.microsoft.com/fwlink/?LinkId=619687
```
WebDriverへのパスが通っていないとのことですが、まだインストールしていないので、想定どおりです。

# EdgeDriverのインストール
EdgeDriverのインストールをします。
以下の方法は少し古くなっています。
新しい方法に関しては、「[Edge Webdriverインストール方法](https://qiita.com/tkhr68000/items/13940d27599514f19262)
」を参照して下さい。

## Edgeの確認
設定→全般で確認します。
私のEdgeは以下のバージョンでした。
`Microsoft EdgeHTML 18.18362`

設定方法を以下のURLで確認します。
 http://go.microsoft.com/fwlink/?LinkId=619687

18以降はWindows10に組み込まれていて、自動アップデートされているようです。
[開発者モード]を有効にすることで使えるようになるようです。


## [開発者モード] 設定
管理者権限で設定変更します。
`設定 → 更新とセキュリティ → 開発者向け`
開発者モードのラジオボタンを設定します。

# pythoによる実行
WebDriverが設定できたことを確認します。

## Pythonで実行
スクリプト実行してみます。

```
python .\webdriver_sample.py
```
今度はブラウザ起動しました。


# [開発者モード] について

一度、WebDriverインストール後であれば、[開発者モード] から元に戻しても問題ありません。
【Unity】GUILayoutで表示する情報をWindow化してドラッグ移動をできるようにする

# この記事は？
* 表題通り、Unity内のGUILayoutで表示する情報をWindow化してドラッグ移動をできるようにする記事です
* UnityでOnGUIとGUILayoutを使用して画面上部にデバッグ情報を表示する際に少し工夫して見やすくするために使っている手法の紹介です

# 実行環境
* Unity 2018.4.12f1

# 前提 - 何が問題？
* GUILayoutで表示をする際は通常以下のように表示されます

```csharp:ScriptA.cs
void OnGUI()
{
    GUILayout.Label("スクリプトAの情報1");
    GUILayout.Label("スクリプトAの情報2");
    GUILayout.Label("スクリプトAの情報3");
    GUILayout.Label("スクリプトAの情報4");
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291107/4c7e5c68-9c44-bc15-36ef-c61e63752757.png)

* 別のスクリプトでも同じようにGUILayoutで表示した時は重なってしまいます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291107/2dfbe923-6563-1434-dd79-da37e7c4a410.png)


* 本来であればGUIの位置をRectなりで指定すればいいのですが・・・

```csharp
GUI.Label(new Rect(100, 100, 200, 200), “位置指定ラベル”);
```

* 面倒なので重なっても問題ないようにします

# 本題 - OnGUI内の情報をWindow化します
* 以下スクリプトのように変更してWindow化！

```csharp:ScriptA.cs
Rect windowRect = new Rect (0, 0, 200, 100);

void OnGUI()
{
    windowRect = GUILayout.Window(0, windowRect, MovableWindow, "Movable window");
}

private void MovableWindow(int windowId)
{
    GUILayout.Label("スクリプトAの情報1");
    GUILayout.Label("スクリプトAの情報2");
    GUILayout.Label("スクリプトAの情報3");
    GUILayout.Label("スクリプトAの情報4");

    GUI.DragWindow();
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291107/05da6380-7c90-ebdb-a9a8-9cdd8f9e64c7.png)
 ↓ ドラッグ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291107/0dbaa013-3c3c-22c9-d34b-a674cb47de5a.png)

* ドラッグしてWindowの位置を変えられるようになりました
* 項目が重ならなくなって見やすいですね！
* ~~結局Window生成するのにRect設定しているんじゃ・・・~~

# 簡単にスクリプト解説
* GUILayout.WindowでWindowを作成
* GUI.DragWindowでWindowをドラッグ可能にする
* GUI.DragWindowは書く場所によってドラッグ可能部分が以下のように変わります

```csharp
GUI.DragWindow();
GUILayout.Button("ボタンの上でもドラッグ可能");
```
```csharp
GUILayout.Button("ボタンの上ではドラッグ不可");
GUI.DragWindow();
```

# 参考
* [Unity - Scripting API : GUILayout.DragWindow](https://docs.unity3d.com/ScriptReference/GUI.DragWindow.html)
* [Unity - Scripting API : GUI.DragWindow](https://docs.unity3d.com/ScriptReference/GUI.DragWindow.html)

* [Unityの拡張でノードベースなウィンドウを作る](https://qiita.com/bonon0/items/f71a0c33766b67b9f891)
エンジニアも意識すると良いデザインのポイント3つ

# 背景・動機

昨今はフロントエンドの技術が発展し、エンジニアがちょっとしたデザイン作業を行う機会も増えてきたのではないかと思っています。
デザインのポイントをお伝えすることで、以下が促進されればと思い投稿します。

- エンジニアがデザイン作業を実施することに対するハードルを下げること。
- エンジニアとデザイナーとの良好な関係性が築かれること。

※あくまで個人的な主張を含む記事ですので、ご了承ください。


# システム設計とデザインの共通点

システム開発にも設計という工程があります。
設計は英語でデザインですが、いくつか共通点があります。

1. 解答が複数存在する。
2. 時間をかければ良い結果が得られるとは限らない。
3. 利用者を意識する。システム設計であればそのシステムの利用者やメンテナ。

解答が複数あるため、利用者に対してメリット/デメリットを整理しながら取捨選択する必要があります。
良い結果を得るためには、日頃から良いデザインを見たりストックしたりして、引き出し（デザインパターン？）を身に付けると良いです。

設計と同じくデザインも非常に難しい作業ですが、ポイントをおさえることで、ある程度美しいデザインを作成することができます。


# 3つのポイント

1. 揃える
2. 減らす
3. 離す


## 1. 揃える

### 文字寄せ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/4301bbef-74d4-cc25-5d0d-48975c11b143.png)

### 文字の大きさ・フォント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/926862d9-c973-85b5-0cff-269b5e4e23fc.png)

### 角丸
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/8b085f50-f3d0-6cdb-af14-d42475f36d4b.png)

### 要素の大きさ・間隔
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/bf21b4fa-a1b4-d77f-8150-6a63e4eef365.png)


## 2. 減らす

### 不要なパターン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/76c902ea-0ff4-9897-5091-5f8ef0e35da7.png)

### 不要な枠・線
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/0c44f922-4888-558b-028a-d7d23105943d.png)

### 不要な色・飾り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/870d7faa-ad68-da91-11cd-5c55b4724351.png)


## 3. 離す

### 行高
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/a75ae3e4-9ea1-bddb-275d-dac21a3e79fc.png)

### 区切り線ではなく余白
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/0ee0f18b-b9da-cd94-5d9a-62120dea1b88.png)

### 間隔
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/384d2369-b324-8023-158b-4c446d080094.png)


# まとめ

- エンジニアにとっての設計と同じで、デザインを考えるのは大変な作業です。
- より良いデザインを目指して、お互いに協力し合いましょう。
Unity Hubからエディターをインストール、アンインストールできない問題の対処法

# この記事を読む前に
<font color="Red">Windows版のUnity Hub2.2.2でこの記事で紹介するバグが修正されました。</font>

# はじめに
Windows版のUnity Hub2.2.0ではUnity Editorのインストール及びアンインストールができないという問題があります。

公式がいずれこの問題を解決してくれると思いますが、どうしても最新版のエディターを入れたい、古いエディターをアンインストールしたい場面があると思います。
本記事ではこの問題の対処方法を説明します。

# Unity Editorをインストールする
[Unity ダウンロード アーカイブ](https://unity3d.com/jp/get-unity/download/archive)でインストーラーをダウンロードしてください。
![インストーラー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318712/acbb51b3-7a52-2b45-8594-c29c1c88a693.png)

次にインストーラーを起動し、インストールを開始してください。基本的に流れに従えば大丈夫です。
その後、Unity Hubを起動し、`インストール`タブの`リストに追加`からさっきインストールしたエディターを追加してください。
![リストに追加](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318712/942a9bf8-a7be-8e7b-0541-5eb627385bd6.png)

大抵の環境では`C:\Program Files\Unity\Editor`を追加すれば大丈夫です。
これでUnity Hubにエディターのバージョンを追加できました。

# Unity Editorをアンインストールする
エディターのディレクトリにあるアンインストーラーを起動し、アンインストールします。
アンインストーラーは`C:\Program Files\Unity\Hub\Editor\(バージョン)\Editor\Uninstall.exe`です。

アンインストール後、環境によってはpathが長すぎるファイルが残りますが、その時はディレクトリごと削除して大丈夫です。(恐らく)

この状態でUnity Hubを開くと削除したバージョンのエディターが選択肢に出ないはずです。
もし選択肢に出た場合はPCを再起動すれば出なくなります。

# 最後に
Unity Hubを経由しないインストール、アンインストールの方法を紹介しただけですね。
早くUnity Hubのバグが修正されると良いな〜
既にxibに存在するUISegmentControllerのセグメント数をコードで変更する。

##UISegmentControllerとは
![スクリーンショット 2019-12-17 19.58.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551622/147d03c3-d5a7-1866-e306-207261e6cf20.png)

このようなオブジェクトですね。
[詳細はApple UISegmentControllerをご確認ください。](https://developer.apple.com/documentation/uikit/uisegmentedcontrol)

調べてもSegmentControllerをコードでセグメント数増減する記事が無かったので、
記事書いてみます。

###Objective-C
```
    ///既存のセグメント全件を削除する。
    [self.segmentController removeAllSegments];
    
    ///既存のセグメントコントロールの0番目にセグメントを追加する。
    [self.segmentController insertSegmentWithTitle:@"ONE" atIndex:0 animated:YES];
    
    ///既存のセグメントコントロールの1番目にセグメントを追加する。
    [self.segmentController insertSegmentWithTitle:@"TWO" atIndex:1 animated:YES];
```

###Swift
```
    ///既存のセグメント全件を削除する。
  segmentController.removeAllSegments()

    ///既存のセグメントコントロールの0番目にセグメントを追加する。
  segmentController.insertSegment(withTitle: "ONE", at: 0, animated: true)

    ///既存のセグメントコントロールの1番目にセグメントを追加する。
  segmentController.insertSegment(withTitle: "TWO", at: 1, animated: true)
```

##xibで既に配置する必要性について
大抵のケースにおいてオートレイアウトで設定されるため、
UISegmentoControllerに関しては恐らくxibで配置されているのかと思います。

xib上では最低セグメント数が2件なので、0件にする事が出来ません。
なので、`- (void)viewDidLoad {`とかのタイミングで上記処理を入れてあげてください。
AWSはサーバー用途向きでクライアントは不向き？Azure vs. AWS リモートデスクトップPCとして使う場合の体感パフォーマンス比較

#Azureの方が選べるOSもフレキシブル？一時ディスクがついてくる？
どちらかというと日中の利用が多く、夜間は電源OFFも想定したクライアントPC的な用途でAWSのEC2とAzureのVirtual Machinesを比較してみた。Azureの場合はWindows 10 クライアントOSの利用ができる反面AWSの方はServer OS しか選択できない。EC2ではないWorkspaces という機能があるもののかなり高く個人用途には向いていないように見える。それに比べAzureの場合はDドライブ（OSドライブとは異なるドライブ）に一時ドライブが追加コストなくついてくる仕掛けになっており（インスタンスタイプによってサイズは異なる）、GB単位でついてくるのでメモリのページファイル置き場などとしても使えることがわかった。これは便利だ。

#Azureの勝ちか？
まず課金体型。Azureは秒単位で再起動も苦にならないがAWSは時間単位が原則で少しだけ使いたいときや再起動毎が最低1時間単位になるのが痛い！そしてAWSのt2.micro, t2.small, t3a.micro, t3a.smallなどを切り替えながら汎用SSDの30GBで使用していた（リージョンはコスト下げるためにバージニア北部）が「もっさり感」があって、少なくとも私が体感した限りでは何をするにも遅い体感。つい最近までとあるプロジェクトでサーバー目的でそれなりのスペックで立てていたがやはり契約スペックが良くても「もっさり感」はそれなりにあったと記憶している。今回使ったOSはWindows 2019。
Azureの方はというと米国西部2という最安値リージョンのうちの１つ、バーストがあるが低価格のB1ms, B2s, DS1_v2など安価なものでハードディスクはSSDではないHDDにグレードを下げて使用したみたが私の使い方ではAWSほど「もっさり感」がないことがわかった。OSはWindows 10なのでサーバーではなくクライアントとして正式に使える。低価格帯のインスタンスタイプでリモートデスクトップでクライアントPCとして活用を考える場合は、私見ではマイクロソフトの勝ちとしか思えない。

AWSのベンチマーク結果では大量トランザクション処理といった高性能サーバー用途ではよい結果がでているが、基幹システムやビッグデータ的な処理を想定していない「リモートデスクトップ」PC用途ではAWSの環境は厳しそうだ。また、直近のレポートではAzureが相当追い付いてきており、ベンチマークの方法によっては同等環境と思わしきものでもAzureの方が高い評価になっているものも目にする。

#最近ほかの人はどう言っているのか
私の単なる勘違いなのかフェアに判断するためにもほかの人の文献をいくつか見てみたが、やはり近いことをみんな言っているように見える。日本ではAWSを使っている人が多く、Azureは知らないなんていうエンジニアも多いが、AWSに引き続きAzureを勉強した価値があると少なからず感じた。小規模利用ではAzureがよさそうであるし、巨大サーバー群ではAzureが追いつき追い抜き始めているもののまだまだAWSがよさそうな雰囲気ではある。いちおう私の方で見つけた記事は次のようなものがあった。まずは自分自身でどちらも使ってみてどうするかを決めるようにしたほうがよいのではないだろうか。

Azure と AWS のインスタンス性能比較
https://qiita.com/Aida1971/items/59fa8415c92572900700

2018/12/12 GCP vs AWS vs Azure ベンチマーク
https://www.apps-gcp.com/2018-12-12-benchmark/

SQL Transaction Processing, Price-Performance Testing
Microsoft SQL Server Evaluation: Azure Virtual Machines vs. Amazon Web Services EC2
https://gigaom.com/report/sql-transaction-processing-price-performance-testing/

Cloud Computing in Amazon and Microsoft Azure platforms: Performance and service comparison
https://www.researchgate.net/publication/286665506_Cloud_Computing_in_Amazon_and_Microsoft_Azure_platforms_Performance_and_service_comparison

2018 TOP 10 European Cloud Providers
https://upcloud.com/wp-content/uploads/2018/11/2018_Top-EU-Cloud-Benchmarking-Report.pdf

Azure SSD - Disk I/O benchmark comparison with AWS
https://4sysops.com/archives/azure-ssd-disk-io-benchmark-comparison-with-aws/

VPS Benchmarks
https://www.vpsbenchmarks.com/compare/azure_vs_ec2

Comparing SQL Server Deployments On Microsoft Azure and Amazon Web Services
https://zkresearch.com/blog/2018/11/comparing-sql-server-deployments-on-microsoft-azure-and-amazon-web-services/