OmniAICreator/Qiita-1.07M huggingface dataset:
iOS14でDNS over HTTPSを使ってみる

#前置き
280さんの記事を見ているとiOS14がDoH、DoTに対応したということを知ったので、今回はCloudFrlareの1.1.1.1を使用したDoHのプロファイルをインストールしていきます。

**使用する端末**
iPadPro3G
iPadOS14

**参考サイト**
iOS14の暗号化DNSサポートと広告ブロック
https://280blocker.net/blog/20200924/2368/

iOS 14, Big Sur & DNS over HTTPS / TLS
https://paulmillr.com/posts/encrypted-dns/
https://github.com/paulmillr/encrypted-dns

#セットアップ
まず、1.1.1.1用に作成されているプロファイルをダウンロードします。

```
wget https://raw.githubusercontent.com/paulmillr/encrypted-dns/master/cloudflare-https.mobileconfig
```
ダウンロードが完了したら、GoogleDriveなどのクラウドストレージにファイルをアップするか、プロファイルを添付して自分にメールを送ります。
※クラウドストレージにアップロードした場合は[ファイルアプリ](https://apps.apple.com/jp/app/id1232058109)を使用してダウンロードを行ってください。
プロファイルを端末にダウンロード後、**設定→一般→プロファイル**の順で進んで、インストールを行います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/0ff6484f-925e-837d-91a2-213e80df1cf7.jpeg" width=80%>

インストール後、https://1.1.1.1/help にアクセスしてDoHがYesになっていれば成功です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/1adc7bb5-6be9-be1a-c04a-8d3b978b6b88.jpeg" width=70%>
【初心者でもわかる】CSSだけ。カーソルを載せたら補足説明のバルーンポップアップを出す方法

# どうも7noteです。?マークにカーソルを当てると、補足説明が出るやつ作ります。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/baloonpop/
IQ Bot カスタムロジック（Python）：除外処理をループで効率化

IQ Bot のカスタムロジックの中で、一番よく使う処理はなんといっても「置換」です。
不要な文字や記号の「除外」も「置換」の一種なので、カスタムロジックの使用ケースの８～９割がこれといっても過言ではないです。

置換・除外の基本的なやりかたは以下のページでご紹介していますが・・・

https://qiita.com/IQ_Bocchi/items/b1e7a75439fede2171e6

今日はそんな置換の中で、「除外」の処理をループを使って効率化するやり方を紹介します。

##どんなときに役立つ？　（除外編）

印刷のかすれなどにより、取得項目に余計な記号が混じってしまうとしましょう。

「どこでも商事」が「どこでも商事.」（最後にドットが入っている）になってしまう場合は、こんなかんじで除外します。

```python:通常の置換（除外）
field_value = field_value.replace(".","") 
```

上記はノイズが１種類（ドット）だけだったのでよかったですが、「ど*こ;で',も:商!事.」のようにたくさんの種類のノイズが混じってしまう場合はどうすればいいでしょうか？

まともにやると以下のようになります。

```python:通常の置換（除外）
field_value = field_value.replace("*","") 
field_value = field_value.replace(";","") 
field_value = field_value.replace("'","") 
field_value = field_value.replace(",","") 
field_value = field_value.replace(":","") 
field_value = field_value.replace("!","") 
field_value = field_value.replace(".","") 
```

もし、他に「#」というノイズも除外したい！と思ったら、`field_value = field_value.replace("#","") `というロジックを追加します。

これでも間違いではないのですが、もうちょっと少ないロジックで書けますよ、というのが今回のおはなしです。

##ズバリ、やりかたはこうだ！　（除外編）

上記とまったく同じことが、以下のコードでできます。

```python:ループを使って除外を効率化
ignore_list = ("*",";","'",",",":","!",".")

for i in ignore_list:
    field_value = field_value.replace(i,"")
```

もし、上記でさらに「#」というノイズも除外したい！と思ったら、`ignore_list`の最後に#の要素を加えるだけです。

`ignore_list = ("*",";","'",",",":","!",".","#")`ということですね。
最後の`"#"`が追加された要素です。

##ループを使った除外の解説

Pythonがシーケンスに対してループをかけるときの基本的な文法が[こちら](https://qiita.com/imuimu/items/1e1581bd0749a871c213#%E3%83%AA%E3%82%B9%E3%83%88%E9%85%8D%E5%88%97%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%97%E5%87%A6%E7%90%86)です。

シーケンスって何じゃ？　と思った方は[こちらの記事（外部リンク）](https://docs.pyq.jp/python/library/sequence.html)を参照してください。

さらに初心者向けの説明は[こちら](https://qiita.com/IQ_Bocchi/items/4e9fb40f9a69b22c301a#%E3%83%AA%E3%82%B9%E3%83%88%E3%81%A3%E3%81%A6%E4%BD%95)。
リンク先ではシーケンスの一種である「リスト」について説明していますが、「リスト」以外にもいろんな種類のロッカーがあるんだな～くらいに思っていてください。

ちなみに上記のコードの `ignore_list` はタプルという型のシーケンスです。

で、以下がそのタプルの中身の要素に対して、ひとつひとつ処理をかけていくループです。
\#以降が、各行でやっていることの説明です。

```python:ループを使って除外を効率化
for i in ignore_list:                 #ignore_listの要素のひとつひとつを、iという変数に入れて順番に処理してね
    field_value = field_value.replace(i,"")   #field_valueの中のiを除外して、field_valueに代入してね
```

##テーブルの場合は？ （除外編）

ループを使った効率化は、テーブルに対しても適用可能です。

テーブルの場合は、for文の中身をテーブル用の文法に変えて以下のように処理することもできますが……

```python:ループを使って除外を効率化（テーブルの場合）
ignore_list = ("除外したい文字1","除外したい文字2","除外したい文字3")

for i in ignore_list:
    df['列名'] = df['列名'].str.replace(i,"")
```

美しいのは以下だと思います。

```python:ループを使って除外を効率化（テーブルの場合）

ignore_list = ("除外したい文字1","除外したい文字2","除外したい文字3")

def table_ignore(x,y):        
    for i in y:
        x = x.replace(i,"")
    return x
        
df['列名'] = df['列名'].apply(table_replace,y=ignore_list)
```

一見、下の方がコード量が多く見えますが、除外したい文字列のセットが複数できる場合や、それらの組み合わせを自在に複数の列に適用したい場合などに、下の方が柔軟性があります。

##以上！

いかがでしたか？
常に初心者の味方がモットーの筆者ですが、今日のはさすがにプログラミング初心者向けの記事ではなかったかなという気がしています。

ご質問がある方は、この記事にコメントをお寄せいただくか、TwitterのDMにてご連絡ください。

※ 上記は毎日チェックできているわけではないため、回答に時間がかかる場合があります。
　 IQぼっちをリアルにご存じの方は、仕事用のメールに質問をください。
バリデーション



![バリデーション.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/734820/0562a7ea-686b-2870-958f-29df0628b5c0.png)


これでSign upできず。
passwordのバリデーションが自信なく、このへんが怪しいのではと思い、再度テキストを見返す。

#has_secure_password
- パスワードをpassword_digestというカラムに保存できるようになる
- passwordに加え、password_confirmation（パスワード確認用の再入力）が使えるようになる。また、存在性と値が一致するかどうかのバリデーション(チェック)も追加される。
- authenticateメソッドが使えるようになる
authenticateメソッドは、引数の文字列がパスワードと一致したかどうかをtrue/falseで返す。




ということはpassword_confirmationと重複している？
と思って、password_confirmation消す。

![バリデーション２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/734820/19c2e4c2-48e0-570c-81e0-b936d13fd039.png)



でも登録失敗･･･
なんでだろー？


9/29
エラーメッセージを表示させることでエラー原因を突き止められるということを知る。


まずはバリデーション設定(確認)
models/user.rb
![292.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/734820/ad935dd6-2483-41a1-04f6-9948a6f826a8.png)


次にcontorollersにて
createの@user = User.new(user_params)に変える
![293.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/734820/2230e3f0-0fe3-9513-3b55-71e6d3116612.png)


そしてエラー表示の設定をhtml.erbに挿入

![291.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/734820/bd4ee41f-02b2-1443-2a15-5e0423adeea9.png)



うまくいきました！
CIImage.cropped(to:)の結果が変なときに見てね。

例えばこの画像を
![nekocyan458A4183_TP_V4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7681faed-e5fd-a409-2f1b-778dc6b7eafc.jpeg)
↓猫だけのCGRectで切り抜いたはずなのに、
![スクリーンショット 2020-09-24 13.09.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/bf49c708-22db-13c6-eb1c-c586c498f763.png)
↓UIImageViewに表示すると、一部しか表示されなかったり、全然表示されなかったりする
![スクリーンショット 2020-09-24 13.11.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d8a7a4c0-2880-ffdc-37cb-8d4b876d960f.png)

**一旦CGImageにしてからUIImageにすると綺麗に表示されます。**
原因はCore ImageとUIKitの座標系が一致しないせいらしいです。
cropped(to:)の公式ドキュメントに書いてました。

```swift
let context = CIContext()
let final = context.createCGImage(ciCroppedImage, from:ciCroppedImage.extent)
```

🐣
****
Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
Composer導入方法＋簡易的な使い方

#Composerとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/9c0315f8-3cd4-854c-9b47-0cdf47484ae5.png)

Composer（コンポーザー）とは日本語で、作曲家、構成者の意味合いがあります。一言でいうと依存性管理ツールになります。。。これだけだとなんだか分からないので例を上げて説明していきます。

例えば使いたいライブラリAがあったとして、これを使用するためには更に別のライブラリB,Cが必要だったとします。ですがそのライブラリB,Cも他のライブラリD,E....が必要なことがあります。
こうなると必要なライブラリを一つ一つインストールしていく沼にハマり、管理が面倒になっていきます。
ですが、Composerを使うと、

```
composer requier A
```

とするだけで、<font color=red>ライブラリAに必要なライブラリ群を一緒にダウンロード</font>してくれます。

#必要な環境
・パソコンはWindowsでもMacでもLinuxでも問題ありません。
・前もってPHP5.3.2以上の環境がインストールされていることが必要となります。

#導入方法
##1.インストール
パソコンはMacを使用しています。
まず<a href="https://getcomposer.org/">公式サイト</a>のDownloadを押します。すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/b82ebd6d-ace7-ddeb-e4b8-a16272a18ce4.png)

Downloadするためのコマンドが現れたページに移ります。そこに以下のコマンドが書いていますので上から順にコピー、ペーストしていきます。

```
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '795f976fe0ebd8b75f26a6dd68f78fd3453ce79f32ecb33e7fd087d39bfeb978342fb73ac986cd4f54edd0dc902601dc') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
```

ここまでの処理を終えると、**composer.phar**というファイルが作成されていると思います。これがComposerになります。

##2.パスを通す
ダウンロードするだけでは使いづらいので、どのディレクトリからもcomposerコマンドを使えるように、パスを通していきます。Macだと管理者権限で実行しないといけないので、コマンドの先頭に<font color = red>sudo</font>をつけて実行していきます。

```
$ sudo mv composer.phar /usr/local/bin/composer
```

これが成功されると、**composer.phar**がなくなっていて、**/usr/local/bin/composer**内に移動されています。これにより、どのディレクトリでもcomposerコマンドを使えるようになりました。

#確認
ターミナルを開いて、下記のコマンドを実行します。

```
$ composer --version
```

このコマンドを入力して、Composerのバージョンが表示されたら成功です。

#Composerのセットアップ
##1.ファイルの追加
composerを使用するには、composer.jsonファイルを作る必要があります。こちらはプロジェクトにインストールしたいライブラリ情報を記述するファイルです。プロジェクトごとに作成します。

```json
{
    "require": {
        "monolog/monolog": "1.0.*"
    }
}
```
"require"の後に、パッケージ名/バージョン番号でインストールしたいライブラリを指定します。

##2.インストール
インストールするにはターミナルで**composer install**コマンドを使います。

```
$ composer install
```

インストールが完了したら、何が変わっているかを確認しましょう。以下の要素が追加されていると思います。
1.venderディレクトリ
2.composer.lock

・venderディレクトリ
　インストールしたライブラリが保存されます。
・composer.lock
　ここにはライブラリの情報を記録します。

#オートローディング
インスロールされたライブラリはオートローディング機能を使って呼び出すことができます。

```php
require 'vendor/autoload.php';
```
この記述により、composer.jsonに記載されている全てのライブラリが読み込まれます。
以上がcomposerの導入方法、使い方の簡易的な説明になります。



#参考サイト
公式サイト
https://getcomposer.org/download/
参考サイト
https://awesome-linus.com/2019/02/26/composer-install/
https://reffect.co.jp/php/composer-autoload#require
ghcr.ioのpullで引っかかった人

ghci.ioを使用してdocker-composeイメージをPullしている記事が見当たらなく
よくわからなかったのでそのメモを記載する。

# 用意するしたもの
以下のようなフォルダ構成です。

```
repository/
　├ project/
　│　├ sample/
　│　│　├ __init__.py
　│　│　└ add.py
　│　└ test/
　│　　　├ __init__.py
　│　　　└ test_add.py
　├ docker-compose.yml
　├ Dockerfile
　└ requirements.txt
```

ghcr.ioにイメージをpushするには、
docker-compose.ymlにイメージの指定をする事。
以下のような感じで

```yml:docker-compose.yml
#...
service:
    python:
        build: .
        image: ghcr.io/<Githubユーザー名>/<レポジトリ名>/<イメージ名>:<tag>
#...
```

# Push方法
pushはdocker-composeで行えるみたい

```bash
docker-compose up -d #イメージの作成
docker-compose push #イメージをPushする
```

# Pull方法
ここでかなり躓いた
Pullではdockerコマンドで行うみたい

自分はずっと``` docker-compose pull ```がうまくいかなかった。

```bash

docker pull ghcr.io/...
```

上記のコマンドを実行後に``` docker-compose up -d ```をやってもビルドは行われないはず

だれもこれ引っかからないのか。。。
【2020年版】PhpStormでLaravel案件開発するなら入れておきたいPlugin

2018年に [Laravelを使って開発をするときに入れておきたいPhpStormのプラグイン](https://qiita.com/makies/items/e13b36c449905b2b46cb) という記事を書きました。
その後、PhpStormバージョンアップと共に必要なくなったプラグインや、新たに登場したものもあるため、2020年バージョンとして改めて書いておきます。

これらを入れた結果、ここまでLaravel案件の開発はラクに書ける！の解説記事（動画？）も後日公開予定です。

# 前提
PhpStorm のバージョン 2020.2
Laravel v8系

# プラグインリスト

## PHP編
- PHP Advanced AutoComplete
    - 入力補完が強くなる
- PHP Annotations
    - phpdocの補完？
- Php Inspections (EA Extended)
    - より良いコードの書き方をサジェストしてくれる
- PHP Unit code coverage
    - コードの左端にテストが通って成功(緑) or 通ったけど失敗(赤) の色がつく
- PHP Unit Enhancement
    - テストコードの記述を支援してくれる補完機能
- PHPUnit Helper
    - 上記 PHP Unit Enhancementをforkしたもの
- PHPStan / Psalm / Generics
    - 静的解析ツールの PHPStan, Psalm を実行できる

## Laravel

- Laravel
    - 設定項目あり
- Symfony Support
    - LaravelはSymfonyのコンポーネントをたくさん使ってるので一応入れてる
- Blade
   - Bladeテンプレートを書くときのサポート
   - APIのやり取りしかしない案件だと不要  

## Git支援系

- GitExtender
- GitToolbox
    - Annotation（git blame）を開かなくても、カーソル行のコミット情報が薄く表示される


## ターミナル系

- ANSI Highlighter
- Awesome Console

## 周辺技術
- .env file support
- BashSupport
- Swagger
    - OpenAPI ドキュメントを書くときの補完
    - 実際にはVSCodeでpreviewしながら書いたほうがいいかも
- ledis
    - Redisのクライアント
    - 未使用

## IDE全般

- Japanese Language Pack EAP
    - 日本語化パック UIは英語のままでも問題なかったが、エラーメッセージも日本語になるとわかりやすい
- OpenGithub
    - 今開いている箇所を GitHubで開いてくれる。GitHubEnterpriseにも対応 
- Open in splitted tab
- Rainbow Brackets
    - カッコ `{}` `()` に色がつく
- https://plugins.jetbrains.com/plugin/9792-key-promoter-x
    - キーボードショートカットがあるのにマウス操作をすると、ショートカットを教えてくれる
- IdeaVim
    - Vim風のキーバインドで入力できるようになる
    - キーボードショートカットがIDE独自のものとかぶる物があり、調整が必要
Google Formへの回答を元にGoogle Colaboratoryで日本語ワードクラウドを作る

こんにちはGeraldです。
Google Formsで集めた回答をもとに、その場でワードクラウドを作って、セミナー参加者に見せたい！というご要望をいただき、誰でも実行できる方法を考えてみました。思いの外好評だったので手順をまとめます。

# 準備
* Googleアカウントを作る
* Google Formsでアンケートフォームを作る
* アンケートフォームの回答をGoogle SpreadSheetに書き出しておく
* Google Colaboratoryでノートブックを作る

#ソースコード
```python:wordcloud.py

fileId = '対象となるGoogle SpreadSheetのIDをここに書く'

#ライブラリのインポート
from google.colab import auth
from wordcloud import WordCloud
import gspread
from oauth2client.client import GoogleCredentials

#Google Driveへの接続要求
auth.authenticate_user()
gc = gspread.authorize(GoogleCredentials.get_application_default())

# 日本語フォントを取得する
!apt-get -y install fonts-ipafont-gothic

# Google Formsから入力され、Google SpreadSheetに格納されている情報を収集する。
gotWords = []

book = gc.open_by_key(fileId) # 対象となるスプレッドシートを開く
shts = book.worksheets() # スプレッドシートの全シートを取得する。(Google Formsの回答シートが前提なのでシートは1枚)
row_list = shts[0].get_all_values() # 1枚めのシートからデータを取得する。

for j, row in enumerate(row_list):
  if j > 0 : # 1行目はヘッダーなので読み飛ばす
    for i,cell in enumerate(row):
      if (i > 0): # 1列目は回答時刻なので読み飛ばす
        gotWords.append(cell) # 回答時刻を除いて載せていく

splitted = ' '.join(gotWords) #リストを空白区切りで結合する。

# ワードクラウドの作成
fpath = '/usr/share/fonts/truetype/fonts-japanese-gothic.ttf'  # 日本語フォント指定

# パラメータはお好みで
wordc = WordCloud(font_path=fpath,
                  background_color='white',
                  width = 1600, height = 1200,
                  repeat = False,
                  collocations = False,
                  random_state = 42,
                  relative_scaling = 0,
                  contour_width = 0)

wordc.generate(splitted) # ワードクラウドを生成

# ここで画面にワードクラウドを表示。画像をダウンロードして利用。
wordc.to_image()

```

#ポイント

* Google SpreadSheetのファイルIDはURLの"d/"のあとから、"/edit"の手前まで。
* Google Driveへの接続要求に来ると、別ページが立ち上がるので、承認して、許諾キーをコピーして、貼り付ける。
* うまく行かないときは、”ランタイムを再実行”でなんとかなる。

#参考にさせていただいたページ
* [「Google Colaboratory」でツイートをテキストマイニングする](https://sadayoshi-tada.hatenablog.com/entry/2019/03/20/135905)
* [Colaboratoryでmatplotlibの日本語表示](https://qiita.com/unvavo/items/a907cb927bdadc1d8d0c)

#今後
* Mecabも動かして分かち書き対応する予定です。
* 出力先を指定して、Webページに反映して、リアルタイムに変わっていくようにする予定です。

最後まで読んでいただき、ありがとうございました。
MacOSのsedの動きがわからない

数値キー項目をDWHから抽出したのはいいけど、DBには文字列型で格納されているから、`'`（シングルクォート）で囲んで、レコードごとにカンマで区切りたい
そういうこと、よくありますよね。

Unix系OSのターミナル（もしくはWSL環境)にはsedというコマンドがあります。
ストリームエディタと呼ばれるエディタで、文字列の置換などを得意としています。

詳しいことは他の記事に譲るとして。

今回の用件は、

- 数値キー項目が1行ワンレコードとしてファイルに格納されている

```text:keys
111111
22222
3333
444
55555
....
```

- 各レコードの項目を`'`(シングルクォート)で囲みたい
- 各レコードの末尾に`,`(カンマ)を入れたい

というものでした。
つまりこうなるはずです。

```text:result
'111111',
'22222',
'3333',
'444',
'55555',
....
```

sedを使えばちょー簡単ですね。

```bash

$ sed -e "s/\([0-9]\+\)/'\1',/g"  keys > result
```
結果を確認

```bash
$ cat result
111111
22222
3333
444
55555
....
```

なんでや？！
正規表現のグルーピングの括弧のエスケープを外してみる

```bash
$ sed -e "s/([0-9]\+)/'\1',/g" keys > result
sed: 1: "s/([0-9]\+)/'\1'/g
": \1 not defined in the RE
```

ようわからんけど怒られた・・・
-Eを-eにすればいい、みたいな記事もあったぞ（逆だけど）

```bash
$ sed -E "s/([0-9]\+)/'\1',/g" keys > result
$ cat result
111111
22222
3333
444
55555
....
```

だめだこりゃ
いっそ、正規表現の`+`の前のエスケープも消したろ

```bash
$ sed -E "s/([0-9]+)/'\1',/g" keys > result
$ cat result
'111111',
'22222',
'3333',
'444',
'55555',
....
```

でけた！
・・・わからん。manコマンドで確認してみよう。

```bash
$ man sed
SED(1)                    BSD General Commands Manual                   SED(1)

NAME
     sed -- stream editor

SYNOPSIS
     sed [-Ealn] command [file ...]
     sed [-Ealn] [-e command] [-f command_file] [-i extension] [file ...]
(中略)
     -E      Interpret regular expressions as extended (modern) regular
             expressions rather than basic regular expressions (BRE's).  The
             re_format(7) manual page fully describes both formats.
```

`-E` を使えば拡張（現代的な）正規表現がつかえるぞ、と。後方参照機能は拡張正規表現に含まれるぞな、もし、と。

Linuxのsedは`（`,`）`,`+`などを`\`(バックスラッシュ)でエスケープする必要があるのですが、MacOSの場合はいらないようです。

## おまけ
面倒臭いのでコマンドを`"`（ダブルクォート）で囲ってましたが、これを`'`（シングルクォート）のままにする場合はどうなるのか

```bash
$ sed -E 's/([0-9]+)/'"'"'\1'"'"',/g' keys > result
$ cat result
'111111',
'22222',
'3333',
'444',
'55555',
....
```

0. `'`でリテラルを閉じます
1. `"`で前側の`'`を囲みます。(`"'"`)
2. `'`で後方参照(`\1`)を囲みます(`'\1'`)
3. `"`で後ろ側の`'`を囲みます。（`"'"`）
4. `'`で後ろ側の`'`より後ろのリテラルを始めます

意外と苦労しました・・・
C# Conditional属性の罠

# 問題の概要
defineを定義し、Conditionalを使用したのに何故か関数が呼ばれないぞ？？？
といった事件に出会しました。

# こんな感じ

```
#define Debug_AAA
public class AAA
{
	public AAA()
	{
		new BBB().Method_DebugAAA();
		new BBB().Method_DebugBBB();
	}
}
```

```
#define Debug_BBB

using System.Diagnostics;

public class BBB
{
	[Conditional ("Debug_AAA")]
	public void Method_DebugAAA()
	{
		UnityEngine.Debug.Log("AAAから呼び出したなら、ログが出るよ");
	}

	[Conditional ("Debug_BBB")]
	public void Method_DebugBBB()
	{
		UnityEngine.Debug.Log("AAAから呼び出した時は、ログが出ないよ");
	}
}
```
(Unityで作業してたので、ログ出力がUnity仕様なのは堪忍でござる)

# どゆこと？
どうやら、Conditional属性はスクリプト内のdefineではなく、呼び出し元のdefineを参照してるらしい。
（リファレンス読んでない人並みの感想）
そもそも、各々のスクリプトでdefineを設定してるのが良くないのかもしれませんね ^^;

# 最後に
defineを外（例えばUnityの`ScriptingDefineSymbols`等）で定義してて
下記のように使いたい時に困っちゃう...気が...

```
#if Debug_AAA || Debug_BBB
#define ORIGINAL_DEBUG
#endif

[Conditional ("ORIGINAL_DEBUG")]
public void OriginalDebugMethod(){}
```

とりあえず私のプロジェクトではdefineを整理することにしてみます。
場合によっては素直に`#if`使うとかですかね。
【Android】Android 11から始めるWireless Debugging

# Wireless Debugging
Android11からadbを介したワイヤレスでのアプリの**デプロイ**と**デバッグ**が可能になりました。
そのためUSB接続の必要がなくなりリモートで複数のデバイスにアプリにデプロイがしやすくなりました。

 <img width="30%" alt="wireless-adb.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223159/2c2d97d8-e334-cf52-9616-a6740cf37c73.png">


# 設定方法

1. AndroidStudioにSDK Platform-Toolsの最新版をインストールする(※30.0.4では確認済み)
2. デバッグで利用する端末でDeveloper OptionsをONにする
3. Wireless debuggingをONにする
4. 表示されるダイアログ内の**許可**を選択する
5. **Pair device with pairing code**を選択する
6. 表示されるIPアドレス、Port番号、PairCodeを覚えておく（※下記サンプル）
 <img width="40%" alt="wireless-adb.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223159/a014d03c-18f1-53dc-bc16-c0db01b74b38.png">

5. terminalにて[sdk location]/platform-tools へ移動する（※sdk locationはAndroid StudioのProject Structure等で参照）
6. 以下を実行(IP:Portは手順6で覚えた値を代入しその後PairCodeを入力)

```bash
~/Library/Android/sdk/platform-tools $ adb pair IP:Port
Enter pairing code:
```

以下が表示されれば成功

```bash
Successfully paired to 192.168.1.130:37099 [guid=adb-235XY]
```

---

#### 参考資料
https://developer.android.com/about/versions/11/features#wireless-adb
iOSDC2020のday0に参加したセッションの内容と感想

# トークセッション
## [SourceKit LSPをブラウザでコードを読むために活用する by Kishikawa Katsumi](https://fortee.jp/iosdc-japan-2020/proposal/5915f415-c824-437f-9cac-312e8454ea91)

[SourceKit-LSPをブラウザでコードを読むために活用する - Speaker Deck](https://speakerdeck.com/kishikawakatsumi/sourcekit-lspwoburauzadekodowodu-mutamenihuo-yong-suru)
SourceKit-LSP というSwiftのコードを読むためのツールの紹介
VScodeでの使い方から、ブラウザで使う方法まで
**感想**
Appleがこういうツールを出しているのを始めて知った
ブラウザでコードが読めるというのは、今後役に立ちそう

## [今日から分かるAVAudioEngineの全て by meteor](https://fortee.jp/iosdc-japan-2020/proposal/7d292a87-799b-4c0a-a64f-47a53b7c28a6)
[今日から分かる AVAudioEngineの全て - Speaker Deck](https://speakerdeck.com/yaminoma/jin-ri-karafen-karu-avaudioenginefalsequan-te)
AVAudioEngineを使ってのいろいろなTipsを紹介
音をいろいろミックスしたりなど、音をカスタムする
**感想**
スピーカーのLive感があって、聞きやすく分かりやすかった
業務では活用の機会がなさそうだが、個人的には

## [HomeKit 2020 by 所友太](https://fortee.jp/iosdc-japan-2020/proposal/5c2600f9-b27b-4deb-abd4-85cb7062553e)
[HomeKit 2020 - Speaker Deck](https://speakerdeck.com/tokorom/homekit-2020)
HomeKitを実際のコードを元に実装の方法を解説
**感想**
コロナ禍でスマートホーム化をいろいろとやってたので、非常に興味があり、HomeKitを使うと、こんなに簡単に実装できちゃうんだなと感じた

## [J2ObjC を使って Java 資産を iOS 開発で使ってみた by うるし](https://fortee.jp/iosdc-japan-2020/proposal/a94bc318-9ba2-4c22-8e32-6be8fdcb8716)
[iOSDC2020: J2ObjCを使ってJava資産 をiOS開発で使ってみた - Speaker Deck](https://speakerdeck.com/uakihir0/iosdc2020-j2objcwoshi-tutejavazi-chan-woioskai-fa-deshi-tutemita)
J2ObjCを使って、共通ロジックをライブラリ化
**感想**
Swiftじゃなくて、Objectieve-Cへ変換されるので、今後のメンテナンスが厳しそうだけど、iOS/Androidのロジックの共通化としてよさそう
自然に共通ロジックを使う前提のソースコードになるので、必然的に可読性はあがりそう

# その他の見たセッションで感想
ここに書いてないセッションの感想を、以下のページに分けて、書きましたので、こちらもどうぞ
[iOSDC2020のday1に参加したセッションの内容と感想 - Qiita](https://qiita.com/yoko-yan/items/fe61fc8d89398f87d3dd)
[iOSDC2020のday2に参加したセッションの内容と感想 - Qiita](https://qiita.com/yoko-yan/items/608efdd1ab185ab760a9)
[iOSDC2020に参加して３日間で36のセッションを見ました - Qiita](https://qiita.com/yoko-yan/items/adb3c55a82ac9c41f4f1)
HTTPメソッドについて

#HTTPとはそもそも何ってとこから話します！
HTTP（Hyper Text Transfer Protocol（ハイパーテキストトランスファープロトコル））とは、データをサーバとクライアントの間で通信するときの通信規約（プロトコル）のことをいいます。
で、pcとインターネットとの間で、情報やデータの送受信する通信方法のことをHTTP通信と言います。

#で、HTTPメソッドは何ですか？
HTTP通信の中で、クライアントがサーバーにしてほしいことを依頼するための手段をHTTPメソッドと言います。
その中で頻繁に使う4つのメソッドを以下に記述していきます。
######getメソッドについて
データ（リソース）を取得するときに利用するHTTPメソッドです。
具体的には、webページの取得・画像の取得等がそれにあたります。
######postメソッドについて
クライアントからサーバーにデータを送信するときに利用するHTTPメソッドです。
具体的には、webページ上のフォームからデータを送るとき・新規にアカウントを作成するとき・ブログなどを新しく投稿するとき等に使われます。
######putメソッドについて
Postと同様で、クライアントからサーバーにデータを送信するときに利用するHTTPメソッドです。
しかし、postとの違いは、新規に作成したものではなく、既存のものに追加及び更新する際に使用します。
具体的には、Twitterの既存のツイートの更新を行うとき・既存のブログの記事を更新するとき等に使われます。
######deleteメソッドについて
既存データを削除したい時に利用するHTTPメソッドです。
具体的には、既存のアカウントを削除するとき・既存のブログの削除をするとき等に使われます。

#まとめ
HTTPメソッドとは、インターネットを利用する際に利用される通信の手段であると言った認識でいいのかと思います！
Homebrew導入方法

#Homebrewとは
Homebrewではアップル（またはLinuxシステム)が提供していないソフトウエアや拡張機能のインストールができる物です。Git（バージョン管理システム）とRubyで構築されています。HomebrewはMacOS環境におけるいわゆるデファクトスタンダードなパッケージマネージャです。こちらを使う事により簡単にComposerをインストールできるようになります。

#各OS/言語におけるパッケージマネージャ
##OS
|OS|パッケージマネージャ|
|:--:|:--:|
|Windows|Chocolatey|
|MacOS|Homebrew(brew)|
|Linux(RH系）|yum, dnf|
|Linux(Ubuntu)|apt|

##言語
|言語|パッケージマネージャ|
|:--:|:--:|
|PHP|composer|
|JavaScript(node)|npm|
|Ruby|gem|
|C#|NuGet|


#Homebrewのインストール方法
まず公式のHomebrewページに移動し記載されているインストールコマンドをコピー、ペーストします。
エンターを押すとパスワードを求められるので、パスワードを入力します。

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/57b38b23-aa4e-6404-b2d6-3ead19b7adba.png)

下記のように、<font color=red>Installation successful!</font>と表示されればインストール完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/dc094618-6575-f2c2-eeef-014d8eb14a52.png)

#動作確認
バージョンを確認していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/c74f117f-bd15-d2fa-76da-5722c673bb07.png)

インストールは以上になります。

###参考サイト
https://qiita.com/zaburo/items/29fe23c1ceb6056109fd
https://www.webdesignleaves.com/pr/plugins/mac_terminal_basics_04.html#homebrew

###Homebrewサイト
https://brew.sh/index_ja
【Vue.js】Error compiling template: .. outside root element will be ignored.エラーの対処

## 環境
PHP 7.3.8
Laravel 6.18.35
vue.js 2.6.12

## 対処法
```
[Vue warn]: Error compiling template:
text ""="">" outside root element will be ignored.
```

文字通りテンプレートのコンパイルエラーという事で、
template内にタグに囲まれていない部分があるという指摘です。

```index.blade.php
//"が多い
<div style="width:calc(50% - .25rem);"">

//不要な"を削除
<div style="width:calc(50% - .25rem);">

```

これはvueファイル、コンポーネント内のテンプレだけでなく、読み込んでいるbladeでのタグ囲い漏れなども同様のエラーを検出します。
GitHub ActionsでAnsible Lintを実行

GitHub Actions上でPushとPullReqされたコードをCIにかけたかったので設定を行いました．

使用したパッケージは以下です．

[ansible-lint · Actions · GitHub Marketplace](https://github.com/marketplace/actions/ansible-lint)

以下の設定ファイル(YAML)を `.github/workflows/ansible-lint.yml` に配置します・

```yaml:ansible-lint.yml
name: AnsibleLint

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install ansible==2.10 ansible-lint==4.3
    - name: Ansible Lint
      # working-directory: path/to/target_dir
      run: |
        ansible-lint --force-color
```

BadgeをREADMEへ追加してみます・

```
![](https://github.com/<ユーザ名>/<リポジトリ名>/workflows/AnsibleLint/badge.svg)
```

CIが正常終了するとREADMEに以下が表示されます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/e39f8d64-9566-7f39-0d75-9b42d3383ad3.png)
Unity iOSの内部フォルダの保存、閲覧する方法

#はじめに
UnityでiOSの「フォルダ」アプリに保存したい場合の方法について記述します。実装方法よりXcodeの設定方法がメインとなります。






#実装について
Unityの[Application.persistentDataPath](https://docs.unity3d.com/ja/2019.4/ScriptReference/Application-persistentDataPath.html)を使用します。
永続的なデータを保存する場所として用意されているパス先です。

一点気をつけたいのが、
iCloudバックアップ領域に保存されるので、容量が大きい場合審査に落ちる場合があります。基本的にはiCloudにはバックアップしないという設定をUnityメソッドで呼び出します。SetNoBackupFlagのパス先はバックアップ対象外となります。
余程大きくなるなら大人しくサーバにあげましょう。あくまで内部フォルダです。

```C#
using UnityEngine;
using System;
using System.IO;

public class save : MonoBehaviour
{
    private string _savePath;

    void Start()
    {
        //iCloudバックアップ不要設定
        UnityEngine.iOS.Device.SetNoBackupFlag(Application.persistentDataPath);
        //iOS   : /var/mobile/Containers/Data/Application/<guid>/Documents/Product名/hoge/
        //MacOS : /Users/user名/Library/Application Support/DefaultCompany/Product名/hoge/
        _savePath = Application.persistentDataPath + "/hoge/";
        Debug.Log(_savePath);
        Directory.CreateDirectory(_savePath);

        using (File.Create(_savePath + "test.txt")) {
            //今回は生成のみですが、記述、読込など
        }
    }
}
```

iOS側では「ファイル」アプリに保存されます。(Xcode設定するまでは見えません)
MacOS側では通常の状態では「ライブラリ」から隠しフォルダ設定になっているので「Command」+「Shift」+ 「.」のショートカットキーで閲覧可能になります。






#Xcodeの設定について
展開したXcodeの設定画面で「Info」の中の「Custom iOS Target Properties」に
「Application supports iTunes file Sharing」
「Supports opening documents in place」
を追加してYESに設定します。


![スクリーンショット 2020-09-24 11.18.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508103/4d89e9c1-31d7-56ea-71fe-cf9063b87df7.png)


項目の追加方法は、、、
＋や-で追加と削除が行えます。
![スクリーンショット 2020-09-24 11.24.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508103/156a0d21-6986-0ae5-b31c-786fce13b4bb.png)







#まとめ
取り敢えずの保存はこれでできますが、保存方法はきちんと考えてユーザー側から見えていいデータなのか編集されても問題ないデータかなどを踏まえてお使いください。
データ確認時はいくらでも使って下さい。
コントローラーのアクションについて


#Railsで使用するアクションとは何か？
~~コントローラーで定義されるメソッドを『アクション』と言います。~~（コメントからご指摘を受け認識誤りでしたので文章を改善いたします。↓の意味合いで間違いないと思います。）
コントローラーで定義されるメソッドを指してアクションと呼びます。
これを理解するになるには、[MVC](https://qiita.com/miyaseinto/items/60442c23b4fc629e7400)について理解しないといけないです。それを理解した上で、情報を持ったルーティングからコントロラーに情報が送られ、ビューで様相を整え表示させる。この流れの、ルーティングから情報を持った内容にアクションを組み合わせることで、その情報で何を行いたいかの指針を決める役割になるのです。（そう言う認識でいます）
主として使用するアクションとして7つありますのでそれらを調べていきます。

#7つのアクションについて
それぞれの役割を要約したものは以下のとおりです。
index(HTTPメソッド = get )
リソースの一覧表をするものです。要は、あるホームページを検索して、検索結果のurlをクリックして、そのホームページの一覧が表示される状態（処理）を指します。
new(HTTPメソッド = get )
リソースを新規作成するものです。要は、ユーザー等の情報をデータベースに登録する際に行う処理を指します。
create(HTTPメソッド = post )
リソースを新規作成して追加（保存）するものです。要は、ユーザー等の情報をデータベースに保存する際に行う処理を指します。
edit(HTTPメソッド = get )
リソースを更新するためのフォームを作成するものです。要は、データベースに保存している情報に編集を加える処理を指します。
show(HTTPメソッド = get)
レコードの内容を表示させるものです。要は、一覧表示されている情報から、ある特定の箇所に遷移する際の処理を指します。例）詳細ページに遷移する
update(HTTPメソッド = patch/put)
リソースを更新するものです。要は、編集した内容を、データベースに反映させる処理を指します。
destroy(HTTPメソッド = delete)
リソースを削除するものです。要は、データベースに保存されている情報を消去する処理を指します。
※リソースについて、プログラムを利用するデータ全般のことを指します。要は、パソコンで使用する情報的なことだと言う認識です。
※HTTPメソッドに関しては、[こちら](https://qiita.com/miyaseinto/items/0c1ef8ce32c765d301b8)で記述してます。

#ややこしい違いを調べました
上記でのアクションに、「あれ、同じことを言ってね」と思った箇所がいくつかあったかと思います。なので、それを砕いていきます。
#####newとcreateって何が違う？
簡単にいきますよ、newはオブジェクトを生成するだけでデータベースに保存されないものです。createは、オブジェクトを生成して、データベースに保存するものです。アプリケーションを作成する際は、臨機応変に使用するといったものだと考えてます。
#####saveについて
調べていくと、saveメソッドというものがありました。このメソッドは、newの中で使うもので、保存すると言った意味を持ったメソッドです。で、ここで疑問に思うものが、createと何が違うのか？ということです。違いとしては、newでオブジェクトを生成してからsaveを行えるので、その中で行いたい処理等があるのであれば、それをやってから保存すると言った流れができます。（多分こんな感じ、違ったらご指摘ください😃）
#####editとupdateの違いについて
newとcreateとの違いについてと同じで、editはオブジェクトを生成するだけでデータベースに保存されません。updateはオブジェクトを生成して、保存を行うものです。

#まとめ
Railsを使用する際には、必要な知識なので覚えるようにしたいと思います。
Sunaba講座 #4　四角の描画、２重ループの活用

## はじめに
sunabaの導入については「[Sunaba講座 #0 導入編](https://qiita.com/gmasa/items/62ae871d1f017d4cc682)」をご覧ください。各講座へのリンクも貼ってあります

# 課題03　四角を描く
**画面左上端に 横幅２０ドット × 高さ５ドットの長方形を描く（色は塗潰し）**
今回も画面メモリ番号直打ちの１００行プログラムを書いてみましょう。前回同様、コピペを活用してください。

- <details><summary>研修では．．．</summary>
  早見表.pdfを見ながら試行錯誤してみたい人はそうしましょう。作業を終えたら戻ってきてください
  </details> 

---
### 課題03の解説（Ver.1）
以下のヒントを順に読み進めて、頭の中に何かがひらめいたらコードを書き始めてみましょう。

1. 100行プログラムを見て規則性を探る
1. 課題02 のwhileプログラムを使って解決できないか考える
1. 画面のどの位置からスタートして横線を描いたか？に注目する
1. 課題02は60000番から100ドット長の横線を引いた。今回の横方向の長さは？
1. 四角を横線の集合だと考える
1. ２０ドット長の横線を５本、縦に並べるプログラムを書いてみましょう
1. コピペを活用しよう
    <details><summary>疑似コード</summary>
    <pre><code>
    60000番スタートかつ20ドット長の横線を描くプログラム
    6□□□□番スタートかつ20ドット長の横線を描くプログラム
    6□□□□番スタートかつ20ドット長の横線を描くプログラム
    6□□□□番スタートかつ20ドット長の横線を描くプログラム
    6□□□□番スタートかつ20ドット長の横線を描くプログラム
    </code></pre>
    </details>

---
### 課題03の解説（Ver.2）
上記 Ver.1のままでは、四角の縦の長さに比例してプログラムが長くなるのが大問題です。
前回の課題02で100行プログラムを繰り返しプログラムに変更したときのプロセスを再確認して、今回の解決につなげたいと思います。

- Ver.1のプログラムの規則性を考える
    - どこが変化している？ ： 横線スタートの画面メモリ番号
    - 変化の規則性は？ ： ＊＊＊＊＊＊＊＊＊＊（各自考えてほしい！）
    - 式にするには？ ： 上記の規則性を含んだ式を作る（ヒントになってませんね・・・。）


- 全体像
文章だけで全体像を把握してもらおうと考えたのですが、予想外に難しいので諦めます。。:bow_tone1:
疑似コード ＆ コメントで示すことにします。コメントの量が多めですが、あくまでもこの場での解説用です。普段はこんな書き方はしません。

    <details><summary>疑似コード</summary><div>

    ```ruby
    memory[1] -> 0  # 縦長さカウンタ
    while memory[1] < ________
        # 横線プログラム 開始
        memory[0] -> 0    # 横線長さカウンタ 
        while memory[0] < ________
            点描画       # 横線長さカウンタと縦長さカウンタで構成した式
            横線長さカウンタのカウントアップ
        # 横線プログラム 終わり
        縦長さカウンタのカウントアップ
    ```
    </div></details>


- 演算処理の優先順位
    - 擬似コード内の 『 **点描画**　<font color = 'gray'># 横線長さカウンタと縦長さカウンタで構成した式</font> 』は作れましたか？
    - 答えを言うことになりますが、**60000 + 縦カウンタ × 100 + 横カウンタ**　という式で、点描画させたい画面メモリ番号を指示できます。しかし、Sunaba特有の問題があります。試しに、縦カウンタが３、横カウンタが５の時、つまり左上端からわずか右下の所に点描画しようとするプログラムを書いてみます
    
        <details><summary>問題ありサンプル</summary><div>
        
        ```ruby
        memory[0] -> 5
        memory[1] -> 3
        memory[60000 + memory[1] * 100 + memory[0]] -> 990099
        ```
        </div></details>

    - 実行するとメモリ番号が大きすぎてエラーになります。これは**Sunabaには演算子の優先順位がない**、という仕様によるものです。算数でいう+-よりも×÷を優先する、あのルールです（前回の**式**の解説でも触れています）
    - Sunabaの式の計算は左から右に処理していきます。つまり3行目は **60000 + memory[1]が最初に計算されてしまいます**。その後、**＊100** が実行されて大きな値になってしまったわけですね。
    - 優先順位をコントロールしたい場合は **カッコ（）**を使います。
    - **60000 + (memory[1] * 100) + memory[0]** とすればOKです。修正して実行してみましょう

- 今回も課題のお手本コードの掲載はありません。疑似コードをヒントに長方形が描けていれば大丈夫です。

---
次は、[Sunaba講座 #5　点を動かす ＆ 画面更新 について](https://qiita.com/gmasa/items/6daaecf34bf114b1044c)です。
Salome-Mecaの解像度

# AsterStudyの問題
Salome-Mecaの最新版(2019)をVirtualBox上で使っている。AsterStudyはそこそこ良いので使っているが、まだ完成度が低いために、いくつか問題がある。

問題の一つが解像度。スクリーンの解像度が低い設定で使っていると、ウィンドー内に表示し切れず、操作が出来ない場合がある。

# VirtualBoxの設定
VirtualBox側の設定も影響しそうなので、ヘルプを見るなどして確認した。関連する設定項目は以下の通り。

## scaled mode
VMのスクリーンをホストOS側のウィンドーのサイズに合わせて拡大または縮小表示する。

## Auto-rezide Guest Display
VMのスクリーン解像度をホストOS側のウィンドーのサイズに合わせて変更する。
scaled mode時は無効と思われる。

## Adjust Window Size
ホストOS側のウィンドーのサイズをVMのスクリーン解像度に合わせて(スクリーンがちょうど入るように)変更する。

# 解決方法
結局のところ、Ubuntu(VM)のスクリーンの解像度が十分でないと、AsterStudyが表示し切れないことに気づく。使っているPCの解像度(ホストOS側の解像度)が十分大きく出来ないので、以下とすることで解決した。

* Ubuntu の設定を開き、解像度を大きくなるよう変更。
* VirtualBoxのAuto-rezide Guest Display設定はオンにしない。
* AsterStudyの画面全体を見たい時は、VirtualBoxのscaled modeをオン。
* 細かいところを見たい時は、scaled modeをオフし、スクロールバーで見える範囲を移動。
Chrome のショートカットとVimniumでキーボード操作しやすくする


#Chrome
[Chromeのキーボードショートカット](https://support.google.com/chrome/answer/157179)
#Vimnium
Vimniumは、ChromeをVimライクなキーバインドで操作ができるようになるプラグインです。
[Chromeウェブストア](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb) からインストールできます。

|Chrome|Vimnium|機能|
|---|---|---|
||?|キー操作のヘルプを表示|
||h|左スクロール|
||j|下スクロール|
||k|上スクロール|
||l|右スクロール|
|[Home]|gg|ページ最上部にスクロール|
|[End]|G|ページ最下部にスクロール|
||d|半画面分下にスクロール|
||u|半画面分上にスクロール|
||f|リンクのショートカットを表示（現在タブに表示）|
||F|リンクのショートカットを表示（新規タブに表示）|
|[Ctrl]+[r]|r|リロード|
|[F12]|gs|ソースを表示する|
||i|インサートモード（一時的にVimniumの機能を停止する。[ESC]キーで解除）|
||yy|カレントURLをクリップボードにコピーする|
||yf|リンクのショートカットを表示（リンク先のURLをクリップボードにコピー）|
||gf|次のフレームを選択|
||o|履歴をインクリメンタル検索（現在のタブ）|
||O|履歴インクリメンタル検索（新規のタブ）|
||b|ブックマークをインクリメンタル検索（現在のタブ）|
||B|ブックマークをインクリメンタル検索（新規のタブ）|
|[Ctrl]+[f]|/|検索モードを起動（[ESC]キーでキャンセル）|
|[Ctrl]+[f]|n|検索モード中に次の一致文字列にフォーカスする|
|[Ctrl]+[F]|N|検索モード中に前の一致文字列にフォーカスする|
|[Alt]+[←]|H|遷移履歴を戻る|
|[Alt]+[→]|L|遷移履歴を進む|
|[Ctrl]+[PgDn] or [Ctrl]+[Shift]+[Tab]|J, gT|一つ左のタブを表示する|
|[Ctrl]+[PgUp] or [Ctrl]+[Tab]|K, gt|一つ右のタブを表示する|
|[Ctrl]+[1]|g0|最も左のタブを表示する|
|[Ctrl}+[9]|g$|最も右のタブを表示する|
|[Ctrl]+[t]|t|新規のタブを作る|
|[Ctrl]+[w]|x|現在のタブを閉じる|
|[Ctrl]+[T]|X|閉じたタブを復元する|
||T|開いているタブをインクリメンタル検索する|
||]]|表示ページの「Next」や [>] のラベルがついたリンク先に遷移する|
||[[|表示ページの「Prev」や [<] のラベルがついたリンク先に遷移する|
||[Alt]＋f|マルチオープンモードで新規タブにリンクを開く|
||gi|入力ボックスにフォーカスする|
||gu|表示ページよりも１つ上のURL階層に遷移する|
||gU|表示ページの最上位URL階層に遷移する|

##Vimniumのオプション

###Options
- Excluded URLs and keys : Vimniumを自動非活性にする条件を指定する
- Custom key mappings : ショートカットキーを独自に定義する
- Custom search engines : サーチエンジンのショートカットを追加する

###Advanced Options
- Scroll step size : スクロールのピクセルサイズを指定する
- Characters used for link hints : リンクショートカットで使用する文字を指定する
- Previous patterns : ページネーションの前ページを判定する文字列を指定する
- Next patterns : ページネーションの次ページを判定する文字列を指定する
小数点以下を切り捨てたい

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.どのように使うのか</b>

<b>3.ここから学んだこと</b>



1.結論
----------------------------------------
<b>floorメソッド</b>を使う！

<br>
2.どのように使うのか
----------------------------------------

```ruby
def cal_points(point)
  if point < 6000
    cal_point = points * 0.05
  else
    cal_point = points * 0.1
  end
  puts "ポイントは#{cal_point.floor}点です"
end
```
上記ではif条件式の中で小数点が入った計算を#{cal_point.floor}を小数点以下を切り捨てています。
式展開にfloorメソッドを適用しています。

参考URL:
<a href="https://uxmilk.jp/43388">Rubyで数値の切り捨て・切り上げ・四捨五入する </a>
<br>

3.ここから学んだこと
----------------------------------------
他にもroundメソッド(四捨五入),ceilメソッド(切り上げ)があります。また、***.round(1)とすることで"小数点第1位まで四捨五入"や***.round(-1)とすることで1の位を四捨五入できます。

```ruby
ex)1.23.round(1) #1.2
ex)123.round(-1) #120
```

<br>
AWSクレデンシャル情報取得のベストプラクティス（AWS SDK for Go）

# はじめに
ECS(Fargate)でAWS SDK for Goを使ってAWSサービスを操作した際に、最初は勢いで作ったものの本当にこれでいいんだっけ？とモヤモヤしたことがあったので、クレデンシャル情報取得の優先順位とベストプラクティスについてまとめます。

# 結論
いきなりですが、下記がベストプラクティスとされる優先順位です。
詳細について後述します。

```
1. ECSでアプリを実行している場合、タスクロール
2. EC2でアプリを実行している場合、EC2のIAMロール
3. 認証情報ファイル
4. 環境変数
```


# Sessionの生成
まず、AWSサービスを使うためのsessionを生成します。
今回はリージョンのみ指定しています。

```
sess, err := session.NewSession(&aws.Config{
		Region: aws.String("ap-northeast-1")},
)
```

# クレデンシャル情報取得の優先順位
上記のようにクレデンシャル情報の指定がない場合、以下の優先順位で認証情報を取得します。

```
1. 環境変数
2. 認証情報ファイル
3. EC2でアプリを実行している場合、EC2のIAMロール
4. ECSでアプリを実行している場合、タスクロール
```

それぞれの取得方法についての詳細です。

## 1.環境変数から認証情報を取得
開発作業中にローカル環境(macを想定)やAWS上のEC2インスタンスなどでまずはどの環境でもサクッと動かしたい時に有用です。

```
$ export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
$ export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

## 2.認証情報ファイル
credentialsのことです。AWS CLIや他の言語のAWS SDKで利用されるもの同じです。
aws configureコマンドで作成するとデフォルトで `~/.aws/credentials` に作成されます。
クレデンシャル情報について何も指定しない場合は `[default]` の情報を取得します。

```
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

## 3.EC2 IAMロール
IAMロールを利用することで、EC2インスタンスの一時的なセキュリティ認証情報でAWSサービスの呼び出しを行うことができます。 
クレデンシャル情報をさらすことも、手元でファイルを保管することなく、EC2インスタンスへのクレデンシャル情報の配布および管理を安全に行うことができます。

![スクリーンショット 2020-09-24 午前7.28.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536303/f2531f70-f805-5db3-6aba-51b051856572.png)


## 4.ECS タスクロール
タスクロールを利用することで、ECSタスク上で動作するアプリが一時的なセキュリティ認証情報でAWSサービスの呼び出しを行うことができます。
EC2 IAMロールと同様にクレデンシャル情報を安全に配布・管理できます。
また、 `タスクの実行IAMロール` という似たような名前のロールがありますが、こちらは `タスクがECRからのコンテナイメージのプルや、コンテナログをCloudWatchに発行を行うために必要なもの` です。タスクロールとは異なります。

![スクリーンショット 2020-09-24 午前7.26.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536303/77cc14e7-8191-2005-a0e2-d41c2440d2ef.png)

# [まとめ]クレデンシャル情報取得のベストプラクティス
環境変数にクレデンシャル情報を設定してしまえばローカル環境でもAWS上の環境でも動作はしますが、アクセスキーやシークレットアクセスキーが流出するリスクがあります。
認証情報ファイルも同様です。

最終的にAWS上の環境にデプロイするのであればIAMロール or タスクロールがベストプラクティスです。
以下、ベストプラクティスとされる優先順位です。

```
1. ECSでアプリを実行している場合、タスクロール
2. EC2でアプリを実行している場合、EC2のIAMロール
3. 認証情報ファイル
4. 環境変数
```



# 参考
- https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html
- https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-iam-roles.html
- https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_execution_IAM_role.html
- https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html
UnityでScrollView内のボタンが反応しにくい際の対応

#ことの発端
Unityで作ったアプリをAndroidの実機で動かしてみたら、著しく反応が悪いボタンがあった。
具体的にはボタンの押下エフェクトは発生するが、押下された判定にならない（ButtonのOnClickメソッドが動かない）。

#原因
突き詰めたところ、ScrollViewの中に組み込んだボタンでのみ発生していることがわかった。
**ScrollView外のボタンは押下してから指を動かしても、ボタン座標内であれば押下状態が継続されるが、ScrollView内のボタンは押下してから少しでも指を動かすと、押下状態が解除される。**
どうやらこれは仕様らしい。[こちらの記事](https://qiita.com/mao_/items/6bcad4cdc74247328c31)を参考にした。
上記は全ての端末で発生する訳ではなく、ハードウェアや機種に依存する問題のようだ。

#解決策
**該当のボタンに空のEventTriggerを追加するだけで解決した。**
EventTriggerを追加することで、ScrollView外のボタンと同じ挙動になった。
ggった時にEventSystemのDragThresholdをいじるなど、色々な方法があったが影響範囲が大きそうだったので別の方法を試してみようと試行錯誤していたら、この方法で治ったというところ。

#参考
[uGUIのスクロールビューにボタンを並べるとボタンが反応しにくくなる際の対応](https://qiita.com/nir_takemi/items/aeb3c58b85cfefe7f12a)
[ScrollRectの要素にあるボタンのタッチ反応改善について](https://qiita.com/mao_/items/6bcad4cdc74247328c31)
[UnityのScrollRectを拡張しよう](https://hexadrive.jp/hexablog/program/15948/)
OpportunityFieldHistoryをTest Classで使う時の注意

OpportunityFieldHistory:商談の項目変更履歴のオブジェクトですが、テストクラスの中で商談を更新しても作成されないようです。

以下の質問用にテストクラスを作りましたが、うまくいきません。
https://trailblazers.salesforce.com/answers?id=9064S000000D9xCQAS

そこで、isTest(SeeAllData=true) アノテーションの使用して回避しました。
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_testing_seealldata_using.htm

事前に商談を更新してOpportunityFieldHistoryを作っておきます。

まぁ、テスト環境だけでなく、本番環境でも同じように事前に商談を更新しておく必要があります。

不思議なオブジェクトです。
Dockerが使用しているディスク量を把握する方法

## コマンド

```
docker system df
```

## 出力例

```
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              20                  11                  7.692GB             4.48GB (58%)
Containers          19                  19                  3.805GB             0B (0%)
Local Volumes       5                   3                   147.3MB             48.74MB (33%)
Build Cache         0                   0                   0B                  0B
```
Dockerコンテナが使用しているディスク量をコンテナ毎に表示する方法

## コマンド

```
docker ps --size
```

## 出力例

```
CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS                                                            NAMES                            SIZE
a6c67c928bb1        docker-compose_inflionserver        "air -c .air.d/.infl…"   2 weeks ago         Up 25 hours         0.0.0.0:50051->50051/tcp                                         docker-compose_inflionserver_1   692MB (virtual 1.55GB)
afbb8b3f5759        docker-compose_broker               "air -c .air.d/.brok…"   2 weeks ago         Up 25 hours                                                                          docker-compose_broker_1          647MB (virtual 1.5GB)
a098f7b7c0ca        docker-compose_monitor              "air -c .air.d/.moni…"   2 weeks ago         Up 25 hours                                                                          docker-compose_monitor_1         647MB (virtual 1.5GB)
5e8cbcf83ab7        docker-compose_syncer               "air -c .air.d/.sync…"   2 weeks ago         Up 25 hours                                                                          docker-compose_syncer_1          647MB (virtual 1.5GB)
242a1d4df552        docker-compose_consumer             "air -c .air.d/.cons…"   2 weeks ago         Up 25 hours                                                                          docker-compose_consumer_1        492MB (virtual 1.35GB)
6400d22f6122        docker-compose_collector            "air -c .air.d/.coll…"   2 weeks ago         Up 25 hours                                                                          docker-compose_collector_1       492MB (virtual 1.35GB)
2ae65278bb7d        docker-compose_jobserver            "air -c .air.d/.jobs…"   2 weeks ago         Up 25 hours         0.0.0.0:50052->50051/tcp                                         docker-compose_jobserver_1       407MB (virtual 1.26GB)
5df246937368        nsqio/nsq                           "/nsqadmin --lookupd…"   2 weeks ago         Up 25 hours         4150-4151/tcp, 4160-4161/tcp, 4170/tcp, 0.0.0.0:4171->4171/tcp   docker-compose_nsqadmin_1        0B (virtual 65.6MB)
3f71a287725c        nsqio/nsq                           "/nsqd --lookupd-tcp…"   2 weeks ago         Up 25 hours         4160-4161/tcp, 0.0.0.0:4150-4151->4150-4151/tcp, 4170-4171/tcp   docker-compose_nsqd_1            31B (virtual 65.6MB)
84970e354c8e        nsqio/nsq                           "/nsqlookupd"            2 weeks ago         Up 25 hours         4150-4151/tcp, 4170-4171/tcp, 0.0.0.0:4160-4161->4160-4161/tcp   docker-compose_nsqlookupd_1      0B (virtual 65.6MB)
e150fb69b286        postgres:12.1                       "docker-entrypoint.s…"   2 weeks ago         Up 25 hours         0.0.0.0:5433->5432/tcp                                           docker-compose_db_1              63B (virtual 394MB)
db79c1565342        timescale/timescaledb:latest-pg11   "docker-entrypoint.s…"   2 weeks ago         Up 25 hours         0.0.0.0:5434->5432/tcp                                           docker-compose_timescale_1       63B (virtual 178MB)
```
《未経験→webエンジニア》実務6日目

昨日投稿できなかったので、今日投稿します。

## この記事の目的
自分がやったこと、知らなかったこと、やるべきことを明確にし
1日あたりの成長速度を速める。


## 【今日やったこと】
バグの修正
rspecの修正

## 【知らなかったこと】

if文周りの勉強が必要。理解が浅かった
■Railsでnil? blank? empty? present?を使いこなそう
https://techracho.bpsinc.jp/baba/2011_11_26/4724https://www.sejuku.net/blog/73197

RuboCopのエラー対応

```:sql
show datebases;
use [database名]show tablesselect * from user_infos\G;
```

ローカル環境でのテスト → イシュー → マジプル → マージ → デプロイ → テスト環境でのテスト
Rspeclet!でダクトリーデータを呼び出す
フロート型 decimal型
【物体検出】Selective Searchについて調べた結果

R-CNNで使われている、Selective Searchについてどうやってpixelをclusteringしてるのか気になったのでまとめてみた。

<h1>Selective Searchとは</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/c06dd079-705b-8b7e-92d8-3e1731ab68a1.png)
類似した特徴を持ったpixelをクラスタングする事で、物体のpixelが分かる。
R-CNNなどではクラスタリングしたpixelの最小のBounding Boxを描くことで物体エリアを提示する。

<h1>特徴量</h1>

1. color similarity
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/fca46117-3a4c-8e1f-acc2-01e29b572261.png)
r => 任意のピクセル
c => ヒストグラムのビン


2. Texture Similarity
SIFT(Scale Invariant Feature Transform)

3. size Similarity
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/565ee6a6-1077-9e56-7aef-ec9361d7cbf4.png)
一つのclusterが大きくなりすぎないように、小さい物体ほどSimilarityを高く設定する。Similarityというより (1-cost)のイメージ
両方のclusterのサイズが1pixelであればSimilarityはほぼ1になる
両方のclusterのサイズの合計が大きい場合、Similarityは0に近づく


4. Fitness Feature
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f6b8c87a-c621-3e71-173c-491fcffbf6d0.png)
Sfill = 1 - 2つのclusterの間にどれだけのスペースがあるか
2つのClusterが隣接していればSimilarityは1に近づき
2つのClusterが離れていればSimilarityは0に近づく






![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/8894b541-dd29-0f10-a5af-63d2736524fe.png)
最終的なSimilarity Scoreは重み付けした合計値で求める




<h1>参考文献</h1>
第29回関東CV勉強会でSelective Search for Object Recognitionを紹介してきました
https://daily.belltail.jp/?p=1981
ディープラーニングにおける様々な物体領域検出のアプローチ方法(R-CNN)
https://qiita.com/t-hiroyoshi/items/e9def50ba2c2249db04b
Selective Search for Object Recognition
https://arthurdouillard.com/post/selective-search/
画像処理の数式を見て石になった時のための、金の針
https://qiita.com/icoxfog417/items/adbbf445d357c924b8fc
Selective Search for Object Recognition
http://www.huppelen.nl/publications/selectiveSearchDraft.pdf
GAN(超解像度)　チュートリアル（colab環境）

広島大学で社会基盤(土木)を専攻している３年生です。
現在は１年間休学して建設系のIT企業でインターンをしています。

#GANとは
Generative Advarsarial Networksの略で日本語では敵対的生成ネットワークです。
教師なし学習の一つであり「本物らしさ」を学習することにより高品質なデータ生成を行う技術です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/ed44d1d8-df62-21c6-e972-21da7d784ec8.png)
例として上記の画像をあげさせていただきました。
このようにシマウマを馬の模様に変換したりなど画像を高い精度で生成していることがわかります。
#超解像とは
超解像とは簡潔に言うと解像度の低い画像の解像度を保管する技術です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/e7886c02-e1ec-9f4d-bcc8-c17274552b8b.png)
上の例を見てもらうと解像度が低く、ぼやけた人の顔の画像から解像度が高く、はっきりした画像が生成されていることがわかります。
#今回使用するSRGANとは
超解像のGANモデルの一つで2017年に論文が発表されました。
内容を簡単に説明します。
学習は以下の手順で行われます。
1.使用するオリジナル画像の縦横を1/4にして面積が1/16である画像を作成
2.Genetator(画像生成器)でオリジナル画像と同じサイズの画像を生成
3.生成された画像とオリジナル画像の損失を計算してバックプロパゲーション
4.Discriminatorで生成された画像かオリジナル画像かを分類して損失を計算しバックプロパゲーション
5.繰り返し
が大まかな処理の内容です。

GenetatorとDiscriminatorのモデルは以下のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/2c30ba2c-df22-5b6c-d2b1-4ea3b2f54988.png)
Generatorは解像度が低い画像(サイズを小さくすることで情報が失われている画像)から解像度が高い画像を生成するネットワークです。
Discriminatorはオリジナルの画像か生成された画像かを分類するネットワークです。
上記の手順でバッチサイズごとに交互に学習を行うことで高品質な画像生成を行っています。

#今回のデータセット
今回使用している画像はkaggleで公開されている衛星写真のデータセットです。
[画像のリンク](https://www.kaggle.com/kbhartiya83/swimming-pool-and-car-detection)

#学習経過と結果
学習経過を可視化した画像
![0 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/6ff2b1de-2f53-c060-f7b2-960ea58187e2.png)
![300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/19796bde-31ee-e74e-4fbf-4767cea1cc61.png)
![185000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/20dafe5d-a33d-e3a1-cd57-26143f2d3fbb.png)
左が入力した画像で右が生成された画像です。
上から学習が進んでいき高品質が画像が生成されていることがわかります。

最終的な学習結果を載せた画像がこちらです。
![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/c58b1d8a-ad88-63e7-b849-a768475e4054.png)
左が入力した画像、真ん中が生成された画像、右がオリジナル画像です。
200epoch回した画像ですが解像度は上がっているものの少し粗さが残る結果となりました。

#実装コード
この[Githubのリンク](https://github.com/eriklindernoren/PyTorch-GAN/tree/master/implementations/srgan)を参考に実装しました。
自分が実装したコードはこちらの[Githubのリンク](https://github.com/Akito-Fujihara/-satellite-photo-srgan)です。
このディレクトリに自分が使用した[データセット](https://www.kaggle.com/kbhartiya83/swimming-pool-and-car-detection)、または画像のみが入っているファイルを追加してパスをdataset_name入力してください。
上げているjupyter notebookでは簡単に実行できるようにするために20epochまでにしているのでお好みで設定して学習してみてください。
OracleからAzure DB（PostgreSQL）へ移行する~⑨初めての人必見！Azure Database for PostgreSQLについて（前編：PaaSのメリット）

今回はAzure Database for PostgreSQLの概要とPaaSのメリットについて記載します。Azure Database for PostgreSQLはAzure上で展開される、PostgreSQLのPaaSサービスです。

AWSでもRDS for PostgreSQLと呼ばれるPaaSサービスがありますが、単純に素早くPostgreSQLを利用したい場合、設定などがほとんどいらないこちらのPaaSサービスの方が非常にシンプルで簡単に起動可能です。

#Azure Database for PostgreSQLの概要
まずはAzure Database for PostgreSQLの概要を簡単にまとめます。

* Azure Database for PostgreSQLはMicrosoft AzureのPaaSサービス
* データベースエンジンはPostgreSQL（9.5、9.6、10、11） ※2020年9月時点
* 単一サーバ（Single Server）とHyperscale（Citus)が存在　※本項では単一を中心に説明
* Single Serverデプロイオプションにて次の事を実現可能
 * SLA 99.99％の高可用性
 * 数秒以内の必要に応じたスケールアップ
 * デフォルトで監視およびアラートを実現
 * 保存中、転送中のデータの暗号化
 * 自動バックアップとポイントインタイムリカバリ（最大35日）
* 単一サーバでは３つの価格レベルが提供されている
 * Basic・・・・・・ 開発環境やお試し環境、小規模なアプリケーション目的の価格レベル。
 * 汎用・・・・・・・大部分のワークロード選択すべき価格レベル。
 * メモリ最適化・・・高速トランザクション処理が必要な場合に選択すべく価格レベル。

#PaaSの利用によりユーザの運用コストは下がる
次にPaaSサービスがユーザにとって何がうれしいのかについて考えます。

PaaSサービスがユーザにとってメリットを与えてくれることは何か、それはずばり運用コストの削減が可能であるという事です。クラウド上でDatabaseを導入、管理、運用する場合、「仮想マシンなどのIaaS上にDatabaseを導入して利用する」パターンと、「Azure Database for PostgreSQLのようなPaaSを利用する」パターンの２種類があります。この２種類を比較すると以下のようなメリット/デメリットが存在します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/5be92df5-0192-3f5e-b874-76f2f8d2acfa.png)

この２つのDatabase環境とオンプレミスのDatabase環境との運用コストを以下の表で記します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/5a6b5de2-f9b6-af23-d2cd-a2ab72c619c6.png)

薄い青の部分がユーザ自身が管理していかなければならない部分となり、濃い青の部分がクラウドベンダの管理領域となります。クラウド化することによって、多くのタスクにおいてユーザから解放されている事がわかっていただけると思います。さらに、PaaSサービスを利用した場合にはユーザが管理しなければならないのは基本的にアプリケーションのみ、すなわちDBの中に格納されているデータのみとなります。

PaaSサービスを利用すると多くのタスクが削除できることが理解できたかと思います。

#具体的なデータベースの管理タスクの解放例
さらに具体的なデータベースの設計/構築/運用時に実施しなければならないタスクにて、PaaSの利用でどのように変化するのか紹介します。私の経験上、Databaseを導入し管理、運用する際に以下のようなタスクを実施しなければなりません。

__データベースの設計/構築/運用での検討事項__

* Databaseのインストール
* 耐障害性（冗長構成）を考えたデータベース設計
* バックアップ
* リストア/リカバリ
* バージョンアップとパッチ適用
* Databaseサーバの増強（スケールアップ/スケールアウト）
* 開発環境のデータ作成
* ログメンテナンス

PaaSを利用するとこれらのタスクは以下のように解放されます。

* __Databaseのインストール__
Databaseの起動はわずか数クリックで完了する。

* __耐障害性（冗長構成）を考えたデータベース設計__
データベースの冗長構成はデフォルトまたは数クリックで実現可能

* __バックアップ__
自動でオンラインバックアップの取得がされる

* __リストア/リカバリ__
バックアップされているデータから数クリックでポイントインタイムリカバリが可能

* __バージョンアップとパッチ適用__
パッチの適用の簡単に自動または任意のタイミングで実施可能

* __Databaseサーバの増強（スケールアップ/スケールアウト）__
数クリックでマシンのスケールアップやスケールアウトが可能

* __開発環境のデータ作成__
バックアップデータを使って別のデータベースとしてコピーを作成し起動することが可能

* __ログメンテナンス__
自動でログのメンテナンスを実施


#最後に
データベースは一般的に運用コストの高いミドルウェアです。導入/管理に大きな運用コストがかかりましたが、PaaSの利用によりこれらから解放されて運用コストを下げることが可能になります。（私の仕事なくなってしまわないかしら。。。）

##次回は
Azure Database for PostgreSQLの具体的な機能説明を記載する想定です。
App Store Connect の暗号方式の利用の入力をスキップしたい

### 問題

リリース用アプリをApp Store Connectへアップロードし、Appleへの審査提出を作成しますが
毎回独自暗号化を利用しているかのダイアログが表示され入力を求められます。
これをスキップする方法はないものかと調べます。

### 対応

Appleのヘルプページにも設定方法が載っているのでその通りに設定を追加します。
もし暗号化を設定していないよということであれば値を `NO` に設定しておけば良いようです。
`App Uses Non-Exempt Encryption`と表示されますが
Keyの名前は`ITSAppUsesNonExemptEncryption`です。

![スクリーンショット 2020-09-24 9.41.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236405/c41ab338-d3cd-fe8b-0b61-dc0fa687c985.png)

### 参照

https://help.apple.com/xcode/mac/current/#/dev0dc15d044