OmniAICreator/Qiita-1.07M huggingface dataset:
雑魚競プロerがアプリ開発する(1週目)

#1.はじめに
兼ねてから勉強してみたいと思っていたアプリ開発に着手し始めたので、今後の勉強の進捗について軽くまとめておきたいと思います。

#2.自己紹介
1.専門は数学
2.半年前から競プロに取り組む。茶コーダー

#3.ここ半年で学んだ技術
1.競技プログラミングで使うレベルのC++の知識
2.何を勉強すればいいのかわからなくてなんとなく学んだhtml,css,pythonの知識
3.TCP/IPの基礎知識、Linuxの基礎知識
4.Androidアプリ開発のための基本的な知識。基本的なアプリの作例をみて作成

#4.今週学んだ知識
Kotlinの基本文法を公式のドキュメントを使って学んだ。
競プロのおかげで基本的な文法の流れはわかっていたので、型や繰り返し、Switchなどの知識は頭に入ってき易かったと思う。
流れとしては、基本的な文法をなんとなくドキュメントでさらった後にテキストエディタによって自分用にまとめた。
適宜ローカル開発環境を使って実際に動作しているところを確認した。
以下には今週まとめた分の一部を載せておく。

```kotlin:matome
/*
Kotlinの基本文法まとめ

開発環境
→ローカル開発環境とファイル転送アプリ、VSCodeを使用。
→ローカル環境には MyCentOSによる仮想サーバを使用
→Kotlin version 1.4.10-release-411 (JRE 1.8.0_265-b01)

ターミナル上でのコンパイラコマンド
→kotlinc ファイル名(.kt) -include-runtime -d ファイル名(.jar)
jarファイルの実行コマンド
→ava -jar ファイル名
 */

fun main(args: Array<String>) { 
  //String, char 
  var msg = "Hello World"
  println(msg)

  //Byte,Short,Int,Long Longの場合は文末にLをつるける必要がある
  val i: Int =100
  val l: Long = 44444444444L

  //Float,Double Floatは文末にFをつける
  val d: Double =224.543
  val f: Float = 12.423F

  //Boolean (true/false) 真理値の型
  val flag: Boolean = false

  //演算子 足し算 引き算 掛け算 割り算 余り
  //         + - * / %
 val x = 10
 println(x/3) //  小数点は切り捨てられる
 println(x/3.0) // double型で出したい場合はどちらかをdouble
 println(x % 3)

 var y = 5
 y++ //インクリメント y = y + 1
 println(y)
 y-- //ディクリメント y = y - 1
 println(y)

 var z = 4
 z += 12 //z = z + 12

 //AND OR NOT (論理演算子)
 //&& || !
 val flag =true
 println(!flag)

 //文字列の文中での展開
  println("hello" + "world")

  val name = "umemura"
  println("my name is $name")
  
  //数字の文中での展開
  println("my score is ${12 +32}")

  // \n: 改行
  // \t: タブ

  println("hello\n wor\tld"
  /*→出力
   hello
  wor	ld
 */

//if (条件式) {実行動作}←一行なら{}いらない
  //比較演算子 > >= < <= == !=
  val score = 85
  if (score > 80) {
    println("Great!")
  }
  else if (score > 60) {
    println("Good")
  }
  else {
    println("so so...")
  }
//結果 Great!
  val result = if (score > 80) "Great" else "so so..."
  println (result)
  // Great

 //when
  val num = 5

  /* when (num) {
    0 -> println("zero")
    1 -> println("one")
    2,3 -> println("Two or Three")
    in 4..10 -> println("many")
    else -> println("other")
  } */


  val result = when (num) {
    0 -> "zero"
    1 -> "one"
    2,3 -> "Two or Three"
    in 4..10 -> "many"
    else -> "other"
  }
  println(result)
}

```

#5.今週のまとめ
有名なアプリ開発のエンジニアさんが「言語を学ぶより作って慣れろ」とおっしゃっていたので先週までは作例を作りつつ学んでいたのですが、自分にはその学び方は合っていなかったなと思いました。
やはり自分のような優秀でない層の人間にとっては、一歩一歩積み上げていくのが重要なのかもしれません・
Raspberry Piで温度を測って、AWS CloudWatchの無料枠をつかってロギングする

- サーバールームの温度測って、遠隔で確認したい。
- アラームとかあると助かる。
- AWS無料枠でできる（はず）?

# 必要なもの
- Raspberry Pi
    - インターネットにつながる程度にはセットアップしておくこと
- 温度センサー
    - DS18B20。アマゾンで五個で1,500円しないくらい
    - 正しく接続できると、```/sys/bus/w1/devices/28-XXXXXXXXXXXX/temperature```で温度x1,000が読める
    - raspi-configで1-wireドライバを有効にして接続。詳細はググろう。
- AWSアカウント

# 前準備
## RasPiにboto3（AWS SDK for Python）をインストールしておく
```
pip3 install boto3
```

## AWS上にユーザーを作る
- IAMでユーザー作って、APIキーを取得しておくこと
- 以下のアクセス権限が必要
    - AmazonAPIGatewayPushToCloudWatchLogs
    - cloudwatch:PutMetricData

## AWS CloudWatch APIを使うための、設定ファイルを作る
cronで回すので、回すユーザーのhomeに下記の内容のファイルを作ること
### ~/.aws/credentials
```
[default]
aws_access_key_id = アクセスキー
aws_secret_access_key = 秘密キー
```
### ~/.aws/config
東京リージョン。

```
[default]
region=ap-northeast-1
```

 
# 温度測定結果をAWS CloudWatchのメトリックとして放り込む
Python慣れてない。エラーハンドリングは適宜足して。
devsに温度計のデバイス名を辞書にして突っ込んでおく。

``` python
import boto3
import pathlib

def readTemp(id):
 devpath="/sys/bus/w1/devices/"+id+"/temperature"
 p=pathlib.Path(devpath)
 temp=float(p.read_text())/1000
 return temp

devs = {
 "Temp1":"28-3c01d6072f18",
 "Temp2":"28-3c01d6077511",
 "Temp3":"28-3c01b6079c8d",
 "Temp4":"28-3c01b607eb45",
 "Temp5":"28-3c01b607b648",
 "Temp6":"28-3c01b607cdb1"
}

metrics=[]
namespace="ROOM_TEMP"

for k in devs:
 temp=readTemp(devs[k])
 metric={'MetricName':k, 'Unit':'None', 'Value':temp}
 metrics.append(metric)

cloudwatch = boto3.client('cloudwatch')
cloudwatch.put_metric_data(MetricData=metrics, Namespace=namespace)
```
# RasPiのcronで回す
詳細は割愛。
とりあえず毎分更新にしてみた。

# CloudWatch側で、メトリクスからグラフを作る
センサーがつながってスクリプトが正しく動いていたら、CloudWatch側で見えるようになる。
("Temp"は実験データの残骸。Pythonで放り込んだのはTemp1～6)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272656/a2a0e2fd-b63f-836f-1043-bc4e7db8cd15.png" width=612 height=auto>
これを、ダッシュボードのウィジェットで可視化すると、こんな感じになる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272656/dcbfd4ec-6a3b-49b6-9d35-6b89acee482e.png" width="100%">

いいんじゃないでしょうか:thumbsup:

# 宿題
- アラームでメール飛ばす方法を調べる
    - AWS SNSとか使えばいいっぽい。
【cloud9】railsチュートリアルでYay! You’re on Rails!が表示されない

#Ruby on Railsの初期ページが表示されない
cloud9上でRailsチュートリアルのHelloAppを作る章でバンドルインストール後に
「Preview Running Application」を押してページをプレビューしようとしても
なぜか

85a6c5755af64133bdedbaf4a55ba013.vfs.cloud9.us-east-2.amazonaws.com 

といったメッセージが表示されて正常な画面を表示できませんでした。

簡単な改善方法なので同じ状況で詰まってる方がいれば参考になるかもしれません。

###使用環境
macbook pro13インチ
AWS cloud9

#解決法

私と同じ状況であればこのような画面が表示されているかと思います。

![スクリーンショット 2020-10-16 18.51.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769439/43a05714-370a-8756-b6b9-3dc312735780.png)

この場合は、以下の画像で赤丸で囲ったマークをクリックして別ウィンドウでプレビューを表示することで正常なページを表示できます。

![スクリーンショット 2020-10-16 18.51.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769439/ec07fcc5-1d62-a93c-b842-f95dd714fffd.png)

以下のページが表示できていれば成功です。

![スクリーンショット 2020-10-16 18.58.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769439/99a6ac18-25df-de54-bcef-4f93010b7204.png)

同じ場面で躓いた方の参考になれば幸いです。
Ubuntu 20.04 に Python 3.9 をインストール（OS標準？）

# はじめに

Ubuntu 20.04にPython 3.9をインストール

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

# apt update; apt install -y python3.9
... 略
```

### 各種確認

```shell-session
# ll /usr/bin/python*
-rwxr-xr-x. 1 root root 5808064 Sep  3 19:31 /usr/bin/python3.9*

# python3.9 -V
Python 3.9.0rc1

# apt show python3.9
Package: python3.9
Version: 3.9.0~rc1-1~20.04
Priority: optional
Section: universe/python
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Matthias Klose <doko@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 542 kB
Depends: python3.9-minimal (= 3.9.0~rc1-1~20.04), libpython3.9-stdlib (= 3.9.0~rc1-1~20.04), mime-support
Suggests: python3.9-venv, python3.9-doc, binutils
Breaks: python3-all (<< 3.6.5~rc1-1), python3-dev (<< 3.6.5~rc1-1), python3-venv (<< 3.6.5-2)
Download-Size: 406 kB
APT-Manual-Installed: yes
APT-Sources: http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages
Description: Interactive high-level object-oriented language (version 3.9)
```

python 3.8では表示される `(default python3 version)` がないので標準ではないのかもしれない。
RCが取れたら標準になるのかもしれない。
未調査
AWSって何ぞ？

AWSサービスについて知見をメモ書き
#メリット
『環境構築』と『ミドルウェアの運用保守からの解放』

>「環境構築」：
ネットワーク環境を1から作るのは結構大変だし、場所も取る。
しかし、AWSなら以下の感じでパパっと作れる。
・IPアドレス取得(3ステップ)
・ルーター作成
・ルーティング設定
Etc

とにかく早く作れる。時間にして『10分』くらい。
しかも場所を取らないのが素晴らしい！！
<br>

>「運用保守」：
ミドルウェアで思いつくのは、「docker」「MySql」「kubernetes」。


#いいこと尽くしではない！？
当たり前だが、AWS元でバグや障害が発生した場合、AWS上で運用しているサービスは停止してしまう。。

これの何がやばいって、AWS使って他社のサービスを作成していた場合、損害賠償責任までいくかもしれないということだ。　しかも顧客の信用だけでなく、エンドユーザーからの信用も一気に失ってしまう諸刃の剣ということだ。。

個人なら気にならないが
会社で運用する場合は、システム設計を怠らないようにしよう。


#意外と見えないAWSの罠
AWSはすぐ構築出来て早い！って楽な反面、
なぜ構築できないのか…？という技術の本質的な理解を薄めてしまう罠がある。

もちろん経験者が使う分には問題ないが
インフラ初心者が使うと、表面的な理解しかできずいざ問題が起こったときに対処ができなくなることもあるだろう。

では、AWSとどう付き合っていけばいいかといえば
>➀裏でどう動いているのか想像して扱う
➁抜かりなく設計する
いったことが必要だろう。

インフラ初心者(私も含め）はこのことを肝に銘じて
AWSと仲良くしよう。
【Docker】dbコンテナに入り、データを見ると日本語が???で表示される 

環境：Mac
　　　Laravel 6.x系
　　　Mariadb


https://qiita.com/n_oshiumi/items/cfe91c60730f602b38eb
こちらの記事を参考にしましたが、私の場合は以下のエラーが発生し、解決できなかった。

```
E: Unable to locate package language-pack-ja-base
E: Unable to locate package language-pack-ja
```


そこで上記エラーを検索しまくり、やっと以下の記事にたどり着いた。
https://www.atmarkit.co.jp/ait/articles/1806/28/news043.html

結論としては、先に [apt update] をすることで、[language-pack-ja-base]らがインストール可能になる。

```
root # apt update
root # apt-get install language-pack-ja-base language-pack-ja
```
特定のテーブルのデータをすべて消去する方法

#前提
db/seedにデータを入れていた。
データを変更したいので一旦消去することにした。

csvファイルのデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/795715/f1117a05-43f8-ed83-436a-b3472e8254ce.png)

#方法
```
rsils c

Food.all.destroy_all
```

#解説
複数のデータを削除するときにはdestroy_allを使う。

#結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/795715/ce47ee8e-3cab-0c1f-2e21-90b72601c475.png)

#参考にしたサイト
https://www.sejuku.net/blog/63480
Google Play Console の新しいUIでの時間指定公開とリリース手順

Play ConsoleのバージョンアップでUIが変わるので新しいUIでの手順をまとめておきます。
![スクリーンショット 2020-10-16 17.02.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208853/85b7849b-779e-d1a2-b47e-367b38714385.png)

## 時間指定公開
- メニューの「公開の概要」から「管理」 -> 「管理対象の公開をオンにしました」を選択して保存
![スクリーンショット 2020-10-16 16.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208853/d531b8d8-3035-2831-ad94-cc8b3ac028f0.png)
![スクリーンショット 2020-10-16 16.35.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208853/465f375f-ee66-8f3b-9d27-da1e181e5a5e.png)

## リリース手順
- メニューの「製品版」 -> 「新しいリリースを作成」
![スクリーンショット 2020-10-16 17.46.14a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208853/810afd94-8bb3-bc58-9590-4182cdcfb29c.jpeg)
- Android App BundleかAPKをアップロード(Android App Bundleの場合は署名が必要)
- 含まれないAPKに前のAPKが入っているか確認する
![スクリーンショット 2020-10-16 17.47.32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208853/86ea2079-231d-456a-8bf7-3f829e255665.jpeg)
- リリース名とリリースノートを編集して「保存」 -> 「リリースのレビュー」
![スクリーンショット 2020-10-16 17.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208853/bb629f94-cd87-47a3-4ad0-ecbd5cbcd5ec.png)
[ServiceNow] 任意のクエリーで取得したリストを関連リストに表示する方法

#概要
ServiceNow の画面には、関連リストという最下部のエリアで、今開いているレコードと関連する別レコードのリストを表示できるようになっています。
こちらのエリアには、基本的には、今開いているレコードへの Reference フィールドを持っているテーブルが表示対象として選択できるようになっていますが、Relationship という定義で設定すると、任意のクエリーで関連するレコードを取得し、表示することができます。

既存の各 Relationship の定義は、System Definition > Relationships に行くことで確認することができます。
例えば、Incident テーブルに対しては、「Incident by Same Caller」という Relationship が定義されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756088/1f8d423a-be44-74bb-0174-ff31428f573b.png)
Apply to table の方が、関連リストを出すときの親テーブルになるもの、Queries from Table が関連リストを取得する対象の子テーブルです。
「Incident by Same Caller」という関係は、Apply to table、Queries from Table ともに Incident で、以下のスクリプトがクエリーのスクリプトとして、定義されています。

```javascript
current.addQuery('caller_id', parent.caller_id);
```
ですので、Incident レコードを開いたときに、開いたインシデントレコードのcaller_id フィールドの値と同じ値が caller_id に入っている Incident をクエリーして表示する Relationship になっています。

定義されている Relationship は、関連リストを表示した画面で、ヘッダー部分を右クリック、Configure > Related list と行って、出てくる画面で表示する候補として出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756088/7aa6bd03-9de6-b897-4376-081a87809e8a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756088/e8be1660-c2e1-5f4e-2b4c-aae8dd63c96c.png)

自分で Relationship を追加した場合も候補に出てきますので、任意のクエリーで取得したリストを関連リストに表示できます。

以上です。
オセロの盤を作成する

### オセロの盤の作り方
8✖️8のオセロの盤を作ります。まずはbodyタグ内を以下のように記述します。body要素内のonload属性はブラウザがページの読み込みを完了した際にダブルクォーテーション内の関数を実行してくれます。

table要素内にセルを並べていくので、id属性に「board」を指定します。

```
<body onload="init()">
  <h2>オセロの盤</h2>
  <table id="board"></table>
</body>
```

head要素内のscript要素は以下のようになります。
変数boardにbody要素内のtable要素を取得させます。

繰り返し文
「for(let r = 0; r < 8; r++) {
  let tr = document.createElement("tr");
  ・
  ・
  }
  board.appendChild(tr);
}」
の部分でオセロの盤の行にあたるものを8つ作ります。
「createElement( )」メソッドは「document.createElement("要素名")」のかたちで引数に指定したHTML要素を生成することができます。
「appendChild( )」メソッドは
「親要素.appendChild(子要素)」のかたちで親要素の末尾に子要素を追加することができます。
今回は「tr」要素を8つ作り、table要素に追加しています。

繰り返し文
「for(let d = 0; d < 8; d++) {
  let td = document.createElement("td");
  td.className = "ceil";
  tr.appendChild(td);
}」
の部分はオセロの盤の列にあたるものを8つ作っています。
変数tdに生成したHTML要素である「td」要素を代入し、「tr.appendChild(td)」でtr要素一つ一つにtd要素を8つ追加しています。
「td.className = "ceil"」で作成したtd要素に「ceil」というclass属性を付与しています。classNameプロパティはclass属性の取得や設定に用いることができるプロパティです。

```
  <script>
    function init() {
      let board = document.getElementById("board");

      for(let r = 0; r < 8; r++) {
        let tr = document.createElement("tr");
        for(let d = 0; d < 8; d++) {
          let td = document.createElement("td");
          td.className = "cell";
          tr.appendChild(td);
        }
        board.appendChild(tr);
      }
    }
  </script>

```

完成は以下になります。コピーしてhtmlファイルに貼り付けていただければ、ブラウザで表示できます。

```
<!DOCTYPE html>

<html>

<head>
  <meta charset="UTF-8">
  <title>board</title>

  <style>
    table {
      border: 3px solid black;
      border-collapse: collapse;
    }
    .cell {
      width: 50px;
      height: 50px;
      background-color: green;
      border: 1px solid black;
    }
  </style>

  <script>
    function init() {
      let board = document.getElementById("board");

      for(let r = 0; r < 8; r++) {
        let tr = document.createElement("tr");
        for(let d = 0; d < 8; d++) {
          let td = document.createElement("td");
          td.className = "cell";
          tr.appendChild(td);
        }
        board.appendChild(tr);
      }
    }
  </script>
</head>

<body onload="init()">
  <h2>オセロの盤</h2>
  <table id="board"></table>
</body>
</html>
```
AWS 苦手克服用

#【AWS 苦手克服用】

AWS基礎の苦手克服のためにまとめました。

###・AWS Snowmobile

超大容量データを AWS に移動するために使用できるエクサバイト規模のデータ転送サービス
セミトレーラートラックが牽引する長さ14 m の丈夫な輸送コンテナで、Snowmobile 1台あたり 100 PB まで転送できます。50TBのデータ転送には容量が大きすぎるためコスト効率的でない。

###・Amazon Dynamo DB

シームレスで拡張性のある高速で予測可能なパフォーマンスを提供
完全に管理されたNOSQLデータベースサービス
セッションデータの処理に向いており、高速で処理を実行できる。

###・Amazon Neptune

高速かつ信頼性の高いフルマネージドグラフデータベースサービス
高度に接続されたデータセットと連携するアプリケーションを簡単に構築および実行が可能
利用することで、洗練されたインタラクティブなグラフアプリケーションを作成することができる。

###・AWS Lambda

データのプロセス処理に使用できるサービス
様々なプログラミング言語に対応してコードの実行によりサーバレスで処理を実施することが可能。
S3イベントと連携して、Lambda関数の処理を実行することができる。

###・AWS環境セットアップの自動化に使用できるAWSツール

<strong>CloudFormation<strong>

インフラ構築をコード化して自動セットアップを支援するサービス
テンプレートファイルを使用して、あらゆるリージョンとあらゆるアカウントでアプリケーションに対して、AWSリソースをモデル化し、自動でプロビジョニングできる。

<strong>Elastic BeansStalk<strong>

AWSにアプリケーションをデプロイするための最も速くて簡単な方法。
AWS マネジメントコンソール、Git リポジトリ、統合開発環境を使用してアプリケーションをアップロードするだけで自動的にデプロイメントの詳細(容量のプロビジョニング、負荷分散、AutoScaling、アプリケーションのヘルスモニタリングなど)を処理する。

###・パブリックサブネット

インスタンスにパブリックIPアドレスを割り当てるように構成される。
インターネットゲートウェイへのルートを持つサブネットである。

EC2インスタンスにパブリックIPアドレスがなければインターネットアクセスはできない。
railsを使って画像投稿を実装するには

###Railsで画像投稿を実装する方法

はじめに
---
自分でrailsを使ってアプリを作ろうとした時、どうやって登録するのか、
画像の実装の仕方をメモを兼ねて記載しました。

まずは、ImageMagickをHomebrewからインストールします。



```
#ターミナル
% brew install imagemagick
```

次に、gemfile上で、記述します。バージョンが異なる場合があります。

```
gem 'mini_magick'
gem 'image_processing', '~> 1.2'
````

ターミナル上で、バンドルインストール。

```
% bundle install
```

ターミナル上で、下記を実行。

```
% rails active_storage:install
````

終わりに
---

いつも参考にさせてもらっているQiitaで自分も誰かの役に立てればと思いました。
実際書いてみると、少し書いただけでなんだか大変ですね。

なれでしょうか、少しづつアップできたらと思います。
クイックソートの詳細とコード事例

##クイックソートとは？
要素をピボット（基準）を決めて、残りの要素を、ピボットより大きいいか、小さいかで前後に配置していく。

この前後に配置した要素を更に、ピボットを決め前後に配置していく作業を繰り返す。

要素が１つになったら確定する。


<br>
**▼先頭の要素をpivotにする場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/99c4732f-e2bb-0245-2245-ff88193fb507.png)



##クイックソートの流れ

1. ピボットを決定し、その数値より大きいか小さいかで前後に振り分けていく。ピボットの値と場所は確定とする。
2. 前方の配列に対し、再度１の処理を行う
3. 後方の配列に対し、再度１の処理を行う
4. ２、３の処理でピボットがどんどん確定していき、最終的には全ての要素が確定する。



<br>
##一番左側をpivotにした場合

```python:
##pivotを指定して左側＋pivot+右側で並び替えた配列を作る関数（quick_sort）
def quick_sort(arr):
  #要素が１つになったらソート終了（要素が２つ未満の場合はソート不要）
  if len(arr) <= 1 :
    return arr
  #pivotの値を指定
  p = arr[0]

  #pivotを基準に分割する処理を行う。div関数
  arr1, arr2 = div(p, arr[1:])

  #pivotを基準にして、分割した配列を結合する。
  #分割した配列自体にもquick_sortを行う。
  return quick_sort(arr1) + [p] + quick_sort(arr2)



##pivotを基準に左側と右側の配列を作成する関数 (div)
def div(p, arr):
  #pivotの左側と右側の配列を入れる変数を定義
  left, right=[], []

  for i in arr:
    #pivotより小さければ左側に格納
    if i < p:
      left.append(i)
    #pivot以上であれば右側に格納
    else:
      right.append(i)

  #左側と右側の配列をそれぞれ出力
  return left, right
```


マージソートに比べると直感的でわかりやすい。

>※注意
一番左側の値をpivotにすると、既に降順に並んでいる場合などに計算量が多くなってしまう。

>このため、pivotはランダムに決定することが推奨される。



<br>
##pivotをランダムに決定した場合のクイックソート
numpyのrandom.choice(配列)を使用する。

上記のquick_sort関数のpivotを以下のように変更する。

```python:
import numpy as np
  p = random.choice(arr)
```

```python:quick_sort
import numpy as np

def quick_sort2(arr):
  #要素が１つになったらソート終了（要素が２つ未満の場合はソート不要）
  if len(arr) <= 1 :
    return arr

  #pivotの値を指定
  p = random.choice(arr)

  #pivotを基準に分割する処理を行う。div関数
  arr1, arr2 = div(p, arr[1:])

  #pivotを基準にして、分割した配列を結合する。
  #分割した配列自体にもquick_sortを行う。
  return quick_sort(arr1) + [p] + quick_sort(arr2)
```
Gitの基本的なコマンドのまとめ

いつかGitを使って開発行うこともあるかもしれないと思い、
とりあえず基本的な部分をメモとして残すことに。

## Gitとは？

分散型バージョン管理システムのこと。
ちなみにGitHubは、Gitを使ったソフトウェア開発PJのための共有ウェブサービスのこと。

## GitとSubversionの違い

  * Git
    * 同じ情報を持つリポジトリを、開発者ごとに持つことができる(分散型)
      * ローカルで
      * 間違ってコミットしてしまったソース等が、いきなりメンバーに共有されて影響を与える心配がない。
      * SVNと比べて操作がやや難しい部分がある。
  * SVN
    * 開発者全員が共有するリポジトリに対して修正内容を反映(集中型)
     * 操作が簡単なので、初心者でも扱いやすい。
     * 他の人との競合や、間違って不完全なソースコードを共有してしまう危険がある。

## Gitでよく使う用語


| 用語       |   内容       |
|:-----------|:------------|
| リポジトリ<br>（repository） |ソースコードや修正履歴、コメント等を保存している場所。|
| リモートリポジトリ<br>（remote repository）|サーバに保存されていて、複数人で共有するためのリポジトリ。|
| ローカルリポジトリ<br>（local repository）|ローカルに保存されているリポジトリ。|
|クローン<br>（clone）|リモートリポジトリのファイルや変更履歴を丸ごと複製(ダウンロード)すること。|
|ブランチ<br>（branch）|一連の修正を、いくつかに分岐させて管理するもの。<br>ブランチでの修正内容は他のブランチの影響を受けないため、同じリポジトリで同時に複数の変更を行うことができる。|
|チェックアウト<br>（checkout）|他のブランチへ移動し、作業ディレクトリを任意のコミット状態にすること。 |
|コミット<br>（commit）|修正内容をローカルリポジトリに反映すること。|
|プッシュ<br>（push）|ローカルリポジトリの修正内容をリモートリポジトリに反映すること。|
|プル<br>（pull）|リモートリポジトリの修正内容をローカルリポジトリに反映すること。<br>※ローカルリポジトリとの差分のみをダウンロードして更新する。|
|マージ<br>（merge）|異なるブランチの修正内容を反映すること。<br>マージ先とマージ元の両方に変更履歴が残る。|
|コンフリクト<br>（conflict）|マージの際に、リモートとローカルで同じファイルの同じ箇所に対して修正がされており、自動でマージできないこと。<br>両方の修正を合わせた内容に手動で編集する必要がある。|

## Gitを使う準備

新しいリポジトリを作成するコマンド

```terminal
test $ git init
```

## 共有するファイルの選択

共有したいファイルを作成する（ex：index.html）

```
test $ git add index.html(共有したいファイル名)
```

### 変更したファイルを把握する

下記コマンドによって、自分がどのファイルを変更したか確認できる。

```
test $ git status
On branch masterChanges not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   index.html
        modified:   stylesheet.css

no changes added to commit (use "git add" and/or "git commit -a")
```

### 変更した内容を把握する

コードを変更した部分は、
変更前のコード：赤色で表示される。
変更後のコード：緑色で表示される。

内容に問題がなければ、git addを実行する

### addしたファイルを確認する

どのファイルをaddして、どのファイルをaddしていないかを確認ができるのは、
先ほども使用したコマンド「**git status**」を実行することで確認できる。

addされたファイル　　　：緑色の文字で表示される。
addされていないファイル：赤色の文字で表示される。

## ファイルの記録

いわゆる **コミット** のこと

```
test $ git commit -m "Create index.html"
```

### コミットメッセージは分かりやすく書く

コミットする際に、メッセージを適当にするとどんな修正を行ったのか分かりずらくなる。
なるべく具体的に、簡潔に書くように気を付ける。

### 共有の仕組み

Gitでは「リモート」という共有ファイルの置き場を使用する。
リモートファイルにアップロードしたり、
リモートからファイルをダウンロードすることで、
開発者同士がファイルを共有することができる。

### リモートの準備

リモートにアップロードするためには、そのリモートのURLを登録する必要がある。
リモートを登録する際には名前を付ける必要があり、基本的に「origin」とすることが多いらしい。

```
test $ git remote add リモート名 リモートのURL
```

### リモートの名前を変更する

リモートの名前を変更したい場合は下記コマンドを実行すると、変更できる。

```
git remote rename 古いリモート名 新しいリモート名
```

### リモートにファイルをアップロードする

アップロードすることを、プッシュという。

```
test $ git push origin master
```
origin の部分は、git remote addを実行する際に使用したリモート名

### リモートのファイルをダウンロードする

ダウンロードすることを、プルという。

```
test $ git pull origin master
```

### コミットログの確認

コミットメッセージのみ確認するコマンド

```
git log
```

変更内容も確認するコマンド

```
git log -p
```

表示内容が多い時は特殊な表示モードになる。
上下キーを使うと表示範囲を変えることができて、Qキーを押すと終了する。
docker-composeで Nuxt TypeScript + Vuetify 環境を構築


## はじめに
普段Laravelを触ることが多く、イチからフロントエンドの環境をDockerで構築したことがなかったので挑戦してみました。
docker-composeでNuxt TypeScript+Vuetifyなフロントエンド環境を構築します。
最終的に、モノリポでバックエンドとしてlaravelも同じリポジトリに載せる予定です。
Dockerとdocker-composeがインストールされているものとします。

## 実行環境

- macOS Catalina ver 10.15.6
- Docker ver 2.4.0
- docker-compose ver 1.27.4

## ディレクトリ構成
docker-compose.yml
nuxt/
docker/
└ app/
　　└ Dockerfile

## docker-compose
```docker-compose.yml
version: "3"
services:
  app:
    build:
      context: ./
      dockerfile: ./docker/app/Dockerfile
    ports: 
      - "3000:3000"
    command: yarn run dev
    volumes:
      - ./nuxt:/nuxt

```
## Dockerfile

```Dockerfile
FROM node:14.4.0-alpine

ENV HOME=/nuxt \
    LANG=C.UTF-8 \
    TZ=Asia/Tokyo \
    HOST=0.0.0.0

# Vuetifyのインストールに必要
RUN apk update && \
    apk upgrade && \
    apk add --no-cache make gcc g++ python


WORKDIR /nuxt

EXPOSE 3000
```
## ビルド

```
$ docker-compose build
```
## Nuxt、Vuetifyのインストール

```
$ docker-compose run --rm app yarn create nuxt-app nuxt
...
...
create-nuxt-app v3.4.0
✨  Generating Nuxt.js project in nuxt
? Project name: `nuxt`
? Programming language: TypeScript
? Package manager: Yarn
? UI framework: Vuetify.js
? Nuxt.js modules: Axios (<= スペースキーを押さないと選択されないので注意）
? Linting tools: (Press <space> to select, <a> to toggle all, <i> to invert selection)
? Testing framework: Jest
? Rendering mode: Single Page App
? Deployment target: Server (Node.js hosting)
? Development tools: (Press <space> to select, <a> to toggle all, <i> to invert selection)
? Continuous integration: None
? Version control system: None

```
各種質問が出てくるので、上記のようにUI frameworkの欄でVuetify.jsを選ぶ。
スペースを押さないと選択されない項目があるので注意。
インストールが終わるとnuxtディレクトリが以下のようになる

nuxt
　┣ .config/ 
　┗ nuxt/
　　　┣ asset/
　　　┣ ...
　　　┣ ...
　　　┣ package.json
　　　┗ yarn.loc

ので、nuxt/nuxt/* をnuxt/に移動して以下のようにする

nuxt
　┣ .config/ 
　┣ asset/
　┣ ...
　┣ ...
　┣ package.json
　┗ yarn.loc
 
### 起動

```
$ docker-compose up -d
```
http://localhost:3000/
にアクセスして下の画像のように表示されればとりあえず完了！
![スクリーンショット 2020-10-13 10.57.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33591/913861c0-9a15-2c7b-4e26-f617bd70dabb.png)

tsconfig.jsonの設定などあるかもしれませんが、次はLaravelのSanctumとSPA認証の記事で書く予定…
Laravel gmail Connection could not be established with host smtp.gmail.com　原因と対策

# laravelでメールを送りたい
gmailを使おうとすると

```
Connection could not be established with host smtp.gmail.com :stream_socket_client(): SSL operation failed with code 1. OpenSSL Error
```

というエラーが発生するようになった。
ちょっと前までは同じ設定でうまく言っていたのに突然使えなくなった。

# 設定確認

## laravel

``` \.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=xxxx@gmail.com
MAIL_PASSWORD=xxxx
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=xxxx@gmail.com
MAIL_FROM_NAME=xxxx@gmail.com
```

## gmail
安全性の低いアプリは許可
https://myaccount.google.com/lesssecureapps

# 原因は？
アバスト無料アンチウイルスのスキャンでした。:sweat_smile:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230077/55949df3-616b-ac33-6cf1-c10310f392a7.png)
設定から送信メールのスキャン(smtp)を外せば解決しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230077/0221cf13-8249-a7d3-c8c4-879ed380fbd0.png)

フリーソフトに紛れ込むことが多いアバストアンチウイルスですが
こいつがメールをスキャンするから失敗するようになっていたのでした。
不要な人はアンインストールでも解決するでしょうね。
誰かの参考になれば幸いです。
Eclipse実行時のエラーメッセージを翻訳してみた（Java）

Eclipse実行時のエラーを翻訳してみました

#エラー原因
org.springframework.beans.factory.BeanCreationException
RequestMappingの値が重複したときに起きるエラー

##エラー詳細の翻訳
encountered during context initialization
コンテキストの初期化中に発生しました

cancelling refresh attempt
更新の試行をキャンセルする

Error creating bean with name
名前のあるBeanの作成中にエラーが発生しました

Error creating bean with name
名前のあるBeanの作成中にエラーが発生しました

defined in class path resource
クラスパスリソースで定義

Invocation of init method failed
initメソッドの呼び出しに失敗しました

Ambiguous mapping.
あいまいなマッピング。

Cannot map 'memberRestController' method
'memberRestController'メソッドをマップできません
AndroidアプリをGooglePlayConsoleで公開を止めている状態で、リリースの上書きができるか確認

前回からの引き続きで、 https://qiita.com/backgroundcolor/items/f1941a6b08eecbe3d0a7

公開を止めている状態で、リリースの上書きができるか確認

1. ver16が公開準備完了状態
![スクリーンショット 2020-10-16 15.08.171.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6568/11072de5-6313-671d-8ce3-cd41ed02c0a1.png)

2. 製品版にて、ver16が公開の準備完了状態となっているが、「新しいリリースを作成」
![スクリーンショット 2020-10-16 15.08.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6568/62796e22-7924-1dd3-d524-ee4a5ab9e947.png)
3.ver17のファイルをアップし、リリースを作成。ver16は含まれないAPKに表示されている
![スクリーンショット 2020-10-16 15.13.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6568/259ef3b9-dfc6-a3cc-9a0d-c7afc4d80835.png)
4.ver17が審査中と表示される
![スクリーンショット 2020-10-16 15.14.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6568/194bbddc-b18d-8feb-865a-b3680a05db3c.png)
5.「公開の概要」も審査中の変更にver17が表示される
![スクリーンショット 2020-10-16 15.14.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6568/bdbd383d-ab9e-058b-25d1-5e9230396f47.png)

6. 少し待つと、製品版の変更の公開準備完了に、ver17のみ表示されるようになりました
![スクリーンショット 2020-10-16 17.31.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6568/779bd49f-9e1d-6347-8726-6795310b98b2.png)

7. 「確認して公開」ボタンを押すとver17が製品版として公開されました
teratermで鍵生成してssh接続

備忘録



**teratermで鍵生成**

新しい接続→キャンセルを選択してウィンドウを閉じる
メニューバー「設定」＞「鍵の生成」
![スクリーンショット 2020-10-16 172658.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435975/f90a3935-28db-a292-ec18-2a26dc24dec5.png)

パスフレーズは、後でssh接続を行う際に
秘密鍵ファイルを開くのに必要。



公開鍵と秘密鍵はペアで存在する。
公開鍵を接続先に登録し、自分だけが持っている秘密鍵と照合することで接続が可能になる。
公開鍵だけ登録しても秘密鍵がなければ接続は不可能。
鍵生成のときにどちらの鍵もダウンロードしておく
※秘密鍵はあとからダウンロードすることはできないので、　
　秘密鍵がない場合、新しい鍵を作成しなおす必要がある


鍵生成後、アクセスユーザーと公開鍵の登録（社内別部所対応だったので作業手順は不明）が
完了したら、ssh接続が可能になる。



**ssh接続**
IPアドレス(aaa.bbb.ccc.ddd)を指定して、リモートマシンにsshでログイン。

```
$ ssh aaa.bbb.ccc.ddd
```


秘密鍵を指定して接続するコマンド　-i

```
ssh -i [ファイルパス]\[ファイル名]
```
```
ssh -i /tmp/kagi.txt matsuda@exaple.com
```
【ReactNative】iOS14に関する不具合等のまとめ

# 概要
`iOS14`が正式にリリースされ、`ReactNative`で開発したアプリにも少なからず影響が出ています。
個々の事象については、既に有志の方が記事に起こしてくれていますが、それらを俯瞰して確認できるとより便利だと思ったので記事にしました。

以下、確認されている事象と対応まとめです。

# 確認されている事象

## 日付関連

### `DatePickerUI`がホイールでなくなる

- [iOS14のDatePickerUIがホイールじゃ無くなっている](https://qiita.com/ryunosuke0922/items/30fe20323561d6c0c124)
`AppDelegate.m`の`didFinishLaunchingWithOptions`に記述を追加

```
if (@available(iOS 14, *)) {
  UIDatePicker *picker = [UIDatePicker appearance];
  picker.preferredDatePickerStyle = UIDatePickerStyleWheels;
}
```

### `Date(string)`の結果が異なる
- [【ReactNative】タイムゾーン無し文字列をDate()に渡した時の挙動がiOS14から異なる件](https://qiita.com/nekoniki/items/8cfed10a7399c57af4be)

## 画像関連

### 画像が表示されない

- [iOS14でReact Nativeアプリで画像が表示されない](https://qiita.com/IZUMIRU/items/ff485f2cc2d35f724044)
- [【React Native】 Xcode12でビルドするとiOS14で画像が表示されない問題に対処する](https://qiita.com/ariiyu/items/7a30004e44e615b43b6c)  
`patches`ディレクトリを作成し、下記のような`react-native+0.61.2.patch`を作成し`npx patch-package`を実行

```patch:react-native+0.61.2.patch
diff --git a/node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m b/node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m
index 01aa75f..4ef8307 100644
--- a/node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m
+++ b/node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m
@@ -269,6 +269,8 @@ - (void)displayLayer:(CALayer *)layer
   if (_currentFrame) {
     layer.contentsScale = self.animatedImageScale;
     layer.contents = (__bridge id)_currentFrame.CGImage;
+  } else {
+    [super displayLayer:layer];
   }
 }
```
【2020年版】中年から始める Greenbone Security Assistant (OpenVAS) でインストールから脆弱性チェックするまで

# はじめに
kali linux をインストールできた時点で完了したようなもんです。
まずはVMWarePlayerやVirtualBoxなどで始めてみましょう。WSL2でもできるそうです。
ここではVirtualBoxでインストールしています。
容量をつかうので50Gぐらいはディスクを用意しておくといいです。

# Greenbone Security Assistant (OpenVAS)のインストール
* Kali Linuxをインストールする（2020.3）
* Kali Linuxインストール時はGraphical Install、ソフトウェア選択でLargeを選択で → 
[【2020年】kali-linuxのインストール方法](
https://kimamani89.com/2020/05/31/%E3%80%902020%E5%B9%B4%E3%80%91kali-linux%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95/)
* 以下のコマンドでrootのパスワードを設定して、sudo を使えるようにする

```shell
$ sudo passwd root
```

* 以下のコマンドも、うっておくとよい
 
```shell
$ sudo apt update
$ sudo apt upgrade
$ sudo apt autoremove
$ sudo apt clean
``` 

* 以下のコマンドでgvmをインストールする

```shell
$ sudo apt install -y gvm
```

# Greenbone Security Assistant のセットアップ
* 以下のコマンドで、gasのセットアップ、最後にWebUIのパスワードが表示されるのでメモっておく

```shell
$ sudo gvm-setup
```

* 以下のコマンドで、WebUIをすべてのネットワークインターフェイスで利用できるようにする  
  ※ sed が通らなかったらvimなどで 127.0.0.1 -> 0.0.0.0 に書き換える

```shell
$ cd /lib/systemd/system
$ sudo sed -e 's/127.0.0.1/0.0.0.0/g' greenbone-security-assistant.service
$ sudo sed -e 's/127.0.0.1/0.0.0.0/g' greenbone-security-assistant.service -i
$ sudo systemctl daemon-reload
$ sudo systemctl restart greenbone-security-assistant.service
```

* 0.0.0.0で9392ポートが空いているか確認する

```shell
$ ss -nalt

State     Recv-Q    Send-Q         Local Address:Port         Peer Address:Port    Process    
LISTEN    0         128                  0.0.0.0:9392              0.0.0.0:*
```

# Greenbone Security Assistant (OpenVAS)の起動とアクセス

* 以下のコマンドで、gvmを起動する  
  ※ だいたい１回目は起動失敗する。2回流すと良い。そして2回目はFirefoxの起動に失敗する。放置。

```shell
$ sudo gvm-start
```

* 以下のコマンドで、ipアドレスを確認する

```shell
$ ip addr
```

* 上記のipアドレス、またはローカルホストのポート9392へブラウザでアクセスする。  
  Username = admin、Passwordは上記でメモっていたパスワード

# タスクの作成と実行
* まずは、Targetの作成  
  Configuration -> Target で、左上のアイコンから、New Target、以下を入力する

```
 Hosts = Manual で、IPアドレス or ホスト名を入力
 Port list = All TCP
 Alive Test = Consider Alive
```

* その後、タスクを作成  
  Scans -> Tasks で、左上のアイコンから、New Task、以下を入力する

```
 Scan Targets = 上記で作成したTarget
 Scanner = OpenVAS Default
 Scan Config = Full and Very Deep
```

* 作成されたTaskの列の▶ボタンを押して実行 
Scan Config の Full and Fast は、前回OKだったのはやらない 
Ultimateがついているのは、Scanでサーバに影響がでるものもチェックする 
なので、最初は Full and Very Deepでスキャンしてみる

* スキャン結果のPDF出力 
スキャンが終わってStatusがDoneになったら、日付のリンクをクリックして結果を参照する 
左上のアイコン郡から、Download filtered Reportをクリック 
次に、Report FormatでPDFを選択してOKを押せば、スキャン結果をPDFファイルでダウンロードできる

# 脆弱性リストの更新

* 以下のコマンドで、最新の脆弱性リストを更新する

```shell
$ sudo gvm-feed-update
```

# まとめ

かんたんでしたね
ReadMe.org

---
title: README.org
tags: tag1 tag2 tag3
author: yuruyuru
slide: false
---
![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) ![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

# qiita\_links

1.  [README.org]()

2. emacs チュートリアル : https://qiita.com/yurumuOvO/items/80d6c88a24e64b462854

3. Ruby 勉強メモ(puts) : https://qiita.com/yurumuOvO/items/83d7bee03675a6bb564b

4. Ruby 勉強メモ(変数&関数) : https://qiita.com/yurumuOvO/items/c9ce98ad61de4963b0f1

5. Ruby 勉強メモ(条件分岐) : https://qiita.com/yurumuOvO/items/2b6466763a0981bcfb99

6. Ruby 勉強メモ(ソースコードの一括管理) : https://qiita.com/yurumuOvO/items/94661c8a82d31345cbf5

7. Ruby 勉強メモ(テスト駆動開発) : https://qiita.com/yurumuOvO/items/7121d852f9c84d08bd12

8. Ruby 勉強メモ(再帰関数) : https://qiita.com/yurumuOvO/items/bf0715cc5956e79bf113

------

* equation<2020-11-02 Mon> 
$$
\frac{1}{4}
$$

 - **source** https://github.com/TeamNishitani/grad_members_20f/blob/main/members/yururyuru00/README.org
新型コロナウイルスに有効な界面活性剤が含まれている製品リストのPDFをCSVに変換

独立行政法人製品評価技術基盤機構の[新型コロナウイルスに有効な界面活性剤が含まれている製品リスト](https://www.nite.go.jp/information/osirasedetergentlist.html)のPDFをCSVに変換

```shell
apt install python3-tk ghostscript
pip install camelot-py[cv]
```

# スクレイピング

+ 最新のPDFをスクレイピング

```python
from urllib.parse import urljoin

import requests
from bs4 import BeautifulSoup

url = "https://www.nite.go.jp/information/osirasedetergentlist.html"

r = requests.get(url)
r.raise_for_status()

soup = BeautifulSoup(r.content, "html.parser")

tag = soup.select_one("div.main div.cf ul > li > a")

link = urljoin(url, tag.get("href"))
```

# データラングリング
```python
import camelot
import pandas as pd

tables = camelot.read_pdf(
    link, pages="all", split_text=True, line_scale=40, copy_text=["v"]
)

df_tmp = pd.concat([table.df for table in tables[:-1]])

# 住宅家具用洗剤など

df1 = df_tmp.iloc[1:].set_axis(df_tmp.iloc[0].to_list(), axis=1).reset_index(drop=True)
df1.index += 1
df1.to_csv("housing.csv", encoding="utf_8_sig")

# 台所用合成洗剤など

df2 = tables[-1].df.iloc[1:].set_axis(tables[-1].df.iloc[0].to_list(), axis=1)
df2.to_csv("kitchen.csv", encoding="utf_8_sig")
```
【Unity】スタックトレースを有効にしてNativeArrayのメモリリークを探す

ちょっと詰まったのでメモ。
UnityのバージョンはUnity2020.2.0a。

Job SystemでNativeArrayを使うスクリプトをオブジェクトに付けてゲームを再生すると次のようなエラーが出た。
>A Native Collection has not been disposed, resulting in a memory leak. Enable Full StackTraces to get more details.

コンソールのメニューのStack Trace LoggingからすべてのスタックトレースをFullに変更した。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270414/00471202-b726-945a-a2c2-5add0c9c31f7.png)

しかしエラーの表記はさっきのまま変わらず詳細は表示されない。

#解決策
NativeArrayのスタックトレースはコンソールのメニューからいじれるものとは別らしい。[NativeLeakDetection.Mode](https://docs.unity3d.com/ja/2019.4/ScriptReference/Unity.Collections.NativeLeakDetectionMode.html)を[EnabledWithStackTrace](https://docs.unity3d.com/ja/2019.4/ScriptReference/Unity.Collections.NativeLeakDetectionMode.EnabledWithStackTrace.html)に変更してやればよい。

```SetupNativeLeakDetection.cs
using UnityEngine;
using Unity.Collections;

public class SetupNativeLeakDetection : MonoBehaviour
{
    void Start()
    {
        NativeLeakDetection.Mode = NativeLeakDetectionMode.EnabledWithStackTrace;
    }
}

```

エラー表示は次のようになった
>A Native Collection has not been disposed, resulting in a memory leak. Allocated from: 
Unity.Collections.NativeArray`1:.ctor(Int32, Allocator, NativeArrayOptions) (発生した関数名) (at (ソースのパス):(行数))
（自分用）スムーズにいかなかった点と解決方法②

#グラデーション色について
>CSS グラデーションは <gradient> データ型で表現され、2つ以上の色の間の連続的な変>化から成る <image> の特殊型です。グラデーションは3種類から選択することができます。線形linear (linear-gradient 関数によって生成)、放射radial (radial-gradient 関数によって生成)、扇形conic (conic-gradient 関数によって生成) の3種類です。 repeating-linear-gradient, repeating-radial-gradient, repeating-conic-gradient の各関数によって、反復グラデーションを生成することもできます。
まずグラデーションは3種類から選択することができます。

① 線形 ⇨ linear-gradient
② 放射 ⇨ radical-gradient
③ 扇形 ⇨ conic-gradient　　　　の３種類から選択できます。



#グラデーション色の使用方法
>グラデーションの最も基本的な形を作成するために必要なことは、2つの色を指定することです。これらは色経由点color stopsと呼ばれています。少なくとも2つ必要ですが、必要なだけの数を設定することができます。

```.simple-linear {
  background: linear-gradient(blue, pink);
}```
２種類以上の色を（）内に入力することでグラデーションが適用されます。


#グラデーション色の方向の設定方法
####to right 左から右へ
```.horizontal-gradient {
  background: linear-gradient(to right, blue, pink);
} ```

####to bottom right 左上から右下へ
```.diagonal-gradient {
  background: linear-gradient(to bottom right, blue, pink);
}```

####70deg 70度の位置へ
```.angled-gradient {
  background: linear-gradient(70deg, blue, pink);
}```


[MDN]
(https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Images/Using_CSS_gradients)

#余談
自分の勉強用として投稿していますが、同じ問題に悩んだときに参考になれば幸いです。
【StereoDepth】GC-Net: End-to-EndでStereo Matching

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/46b527a6-f5fe-449d-7cae-992a420b5c5d.png)

End-to-EndのStereo Depth Estimationの基本となるモデル
Stereo DepthのDeep Learningを学びたいって人はまずこの論文を読むのがオススメ


・Feature Extraction
・Cost Volume
・Learning Context
・Soft ArgMin

<h1>Feature Extraction</h1>
右と左のFeature Mapを抽出する為に2D Convolutionを行う。
この時Shared-weightにすることで右と左の画像で同じ特徴を捉えられるので、LeftとrightのSimilarityを計算するのに役立つ。

<h1>Cost Volume</h1>
入力　　　　　　　　　　　　　出力
[Width,Height,Channel]=>[Width,Height,Disparity+1,Channel]

Cost Volumeは入力のFeature Mapを0~MaxDisparity(任意の値)まで1pixelずつしていくだけ。


<h1>Learning Context</h1>
Cost Volumeを作った時点で右と左の特徴量が近いものを計算すればDisparityは出力出来るのだが、もっと精度をあげたい！
LocalのコンテキストのMatchingだけじゃなくて画像全体(Global)のContextも学習する為に3D Convolutionを行う。

要するにRefinementをするネットワーク

<h1>Soft ArgMin</h1>
得られた[Width,Height,Disparity]から[Width,Height]のDisparity Mapを得るため、Matching Costの一番高いDisparity Layerを出力するのではなく、重み付けをして出力する事でsub pixel accuracyでDisparityを求める事が出来る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/6dc9b1ed-1bbf-9f8f-79d3-85912e9e5b1c.png)

<h1>結論</h1>
とてもシンプルで分かりやすい。
今後はこの構造を改良したモデルについて見ていきたい！

<h1>参考文献</h1>
End-to-End Learning of Geometry and Context for Deep Stereo Regression
https://arxiv.org/pdf/1703.04309.pdf
【Vue.js】 vue-routerを利用してルーティング作成し画面遷移を！！

##【ゴール】
Vue.js vue-routerを利用してルーティング作成し画面遷移を！！

![画面収録 2020-10-16 16.53.45.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620689/e6373ef7-137e-76bc-a928-6a88eb72fa78.gif)


##【環境】
`mac catarina 10.156`
`Vue.js v2.6.12`

##【実装】

`node.js vue.jsのインストールは割愛`

####作業場所を作成

```/.bash
$ vue create routing.js
$ cd routing.js
$ npm install vue-router
$ cd src
$ touch router.js
$ cd ..
$ npm run serve
```

####コーディング

```js:route.js
import Vue from 'vue';
import Router from 'vue-router';
import コンポーネント命名　from '作成したコンポーネント名'

Vue.use(Router);


export default new Router({
  mode: 'history',
  routes: [
    {path: '/', component: },
    {path: 'お好きなルーティング名', component: 上で命名したコンポーネント名},
    {path: 'お好きなルーティング名', component: 上で命名したコンポーネント名},
     .
     .
     .
     .

  ]

})

```

```js:App.js
import router from './router'

.
.
.


new Vue({
  router,     //←追加
  render: h => h(App),
}).$mount('#app')

```

無限に増やせます🙇‍♂️

##【まとめ】
■「vue-router」をインストール
■「src」配下に「router.js」を作成しルーティングの設定をコーディングしていく
■「App.js」で「router.js」をimportして適用させる


##【オススメ記事】
■ 【Vue.js】 IF文・For文　条件分岐、繰り返し処理
https://qiita.com/tanaka-yu3/items/0ccf9a11525331b764de

■ 【Vue.js】 axios / firebaseを利用して、データのやり取り
https://qiita.com/tanaka-yu3/items/192886ce66522f027365

■ 【Vue.js】Vue.jsでfontawsome(Free版)を使用する方法　　
https://qiita.com/tanaka-yu3/items/86d05241f72674d186f6
VSCodeでJavaの開発環境構築をする

学部の授業でJavaを用いたオブジェクト指向入門をしたものの，「だいぶ前のことで忘れてしまった..．」ということで，復習がてら再入門していきます．
# 開発環境構築
Javaは2年前くらいに学部の授業で利用していましたが，PCを新しくしてから初めて利用するため，開発環境構築からしなくてはなりません．
統合開発環境としてはEclipseが有名で講義でも利用していました．しかし，利用頻度の小さいJavaのために新しくインストールしたくなかったため，VSCodeを利用して環境構築しました．

環境構築は，[こちら](https://code.visualstudio.com/docs/languages/java)を参考に行いました．以下はリンク先に書かれている，環境構築の概略です．

## JDK(Java SE Development Kit)のインストール
もし，JDKをインストールしていなかったら以下からダウンロードする必要があります．

- [Oracle Java SE](https://www.oracle.com/java/technologies/javase-downloads.html)

VSCode for JavaではJava SE 11以上のバージョンで利用できるようなので，上のリンク先から最新のJDKをダウンロードすれば良いでしょう．

次のステップでパスの設定を行うので，インストールした際にパスをメモっておくことをお忘れなく．

## ```java.home```の設定
今回はVSCodeだけでJavaが使えればいいので，VSCodeの```java.home```を設定すれば十分です．
設定手順は以下の通りです：

1. VSCodeの設定画面を開く（```Ctrl+,```）
2. 検索ボックスに"java.home"と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486404/5b137f0d-7ee3-fef3-6f7c-2b9d1b7c88a5.png)
3. Edit in settings.jsonをクリックして，```java.home```にインストールしたJDKのパスを記入

```json:設定するパスの例
{
...,
"java.home": C:\\Program Files\\Java\\jdk-13.0.2,
}
```

## Java Extension Packのインストール
続いて，Java開発で有名な複数のVSCode拡張機能を一気にインストールします．
手順は以下の通りです：

1. 拡張機能の画面を開く（```Ctrl+Shift+X```）
2. 検索ボックスに"java"と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486404/e1125317-8de6-170a-d681-8c331e501086.png)

これで，一番上に"Java Extension Pack"が現れると思います．Installボタンを押して少し待てば完了です．
これで，VSCodeを用いたJava環境が整いました！

# Javaプロジェクトの作成と実行
プロジェクトとは，開発するプログラムを構成するソースファイルや，それらをコンパイルして実行するための設定などをまとめたもののことを指します．
早速プロジェクトを作成してみましょう．
## Javaプロジェクトの作成

1. ```Ctrl+Shift+P```もしくは```F1```でコマンドパレットを開き，```Create Java Project```を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486404/b4ea9931-9caf-14d6-d6a4-4d1d4404a6ae.png)
2. プロジェクトタイプは```No Build Tools```を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486404/ba660098-2ae4-6d57-0c9e-1c498225de1c.png)

3. フォルダーを選択
4. プロジェクトの名前を入力（ここでは```HelloWorld```）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486404/7fa6f57d-f6b6-fd1f-410b-f8a6041374d1.png)

これでプロジェクトが作成できました！

## 実行
プロジェクトを作成すると，以下の画像のようにいくつかのファイルが自動で作成されます．
```src/App.java```を見てみるとデフォルトで```Hello, World!```を出力するプログラムがあります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486404/2928068c-7593-1255-67ee-a4b2c96486dd.png)

mainの上に```Run|Debug```と書いてありますね．
このプログラムを実行するには，この```Run```をクリックすればOKです．

```java:実行結果
Hello, World!
```
これで，プロジェクトの作成と実行ができました！

今後の記事で，じゃんけんを実装しながらオブジェクト指向入門をしていきます．

# 参考
- [Java in Visual Studio Code](https://code.visualstudio.com/docs/languages/java)
- [Getting Started with Java in VS Code](https://code.visualstudio.com/docs/java/java-tutorial)
[Help]Docker for windows 2.3.0.4でログインなしサービス起動方法がうまくいかない件[助けて]

#ログイン問題について
Docker for windowsで設定する自動起動オプションは
立ち上げ後、1度ログインしないとdockerサービスが起動しない設定である。
検証、開発用のWindows10Pro機は最近、更新で再起動することが多発している。
電源ONしたらそのうちdockerサービスの立ち上がっている状態を作りたい。


#環境
##Docker
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/8a7bfb9b-9004-4376-28b3-acc03a70dad5.png)

##Windows
エディション:Windows10 Pro
バージョン:1909
OSビルド:18363.1082

#予備知識
方法自体はフォーラム内で議論があった1分遅延タスクスケジューラになります。
https://forums.docker.com/t/run-docker-as-a-service/28124
ローカルユーザ作って1分後に実行するようにするというのが結論。

#方法
##1. タスクスケジューラを起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/9efe147b-e5c2-da2d-e32c-326f33660b00.png)

##2. タスクスケジューラからタスクの作成を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/f5974340-b903-981f-b04e-64f85eb001e1.png)

##3. タスクの作成
###3.1 全般タブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/35ac2675-c069-f256-bba4-b874fd5317ba.png)

###3.2 トリガータブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/24456d4d-8520-8b2f-8236-cd4fb9e56056.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/e8eb88e6-9cd2-6807-cab2-02e2325c4662.png)

###3.3 操作タブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/7934a14f-e396-a181-d41e-ffa8a11a3f1a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/4c65d918-537d-bc5a-7812-e72f63442ccf.png)

Dockerを動かすことができるユーザ情報を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/4276daad-7a79-d2c6-9c90-019c11030eb5.png)

##4.　Windowsを再起動する。
Windowsの起動(セキュリティアップデート含む) + 1分遅延 + Dockerの起動
はインスタントうどんがふやけるくらい待たなくてはならないときもある。

#現状の結果
コンテナは稼働しているようだが、Docker for windowsのダッシュボードが動かなくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/148c9c53-bef5-1d8b-ecda-a6ccbe5b1266.png)

以下に変更しても同様。
 プログラム/スクリプト(P):
  C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
 引数の追加(オプション)(A):
  -File C:\start.ps1

```powershell:start.ps1
start "C:\Program Files\Docker\Docker\Docker Desktop.exe"
start-service -Name com.docker.service
```

タスクスケジューラ―の設定したユーザがdocker-userに所属していることも確認。
現在詰んでいる。
titleTextAttributes指定時のフォント指定忘れ対策

## 概要
iOS のナビゲーションバーの文字色を変更するためにtitleTextAttributesを指定してみたら、フォントが崩れたので対応。


## 環境
Xcode 11.3
iOS 14.0 & 13.3


## 事象
ナビゲーションバータイトルにフォント指定している場合、
色だけ指定しても、フォント指定が外れる

- フォントを（xibで）ヒラギノ角ゴシックにしている場合
![スクリーンショット 2020-10-16 16.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36475/cbe49eb8-1222-0530-ed93-57bd48f855e2.png)

- 特定の画面でタイトルの色変えたいと思って、よくあるように色だけ指定するとフォント指定が外れる（システムデフォルトになっている？）

```
    self.navigationController?.navigationBar.titleTextAttributes = [
    　　// 文字の色
       .foregroundColor: UIColor.yellow
    ]
```
↓
![スクリーンショット 2020-10-16 16.29.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36475/9e994aa0-d8ac-c835-fa8b-b9e773462119.png)

## 対策
- フォントの指定も加える必要がある

```
    self.navigationController?.navigationBar.titleTextAttributes = [
        NSAttributedString.Key.foregroundColor: UIColor.yellow,
        NSAttributedString.Key.font: UIFont(name: "HiraginoSans-W3", size: 16) as Any
    ]
```
↓
![スクリーンショット 2020-10-16 16.36.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36475/6865149d-a5bd-7cfc-57a6-8d3fc8380c05.png)


当たり前っちゃ当たり前ですが、気づかなかったので、備忘録として投稿します。
Linuxを使ったバックアップとリストア方法

#バックアップとリストア
バックアップとリストアを行うソリューションは各種存在しますが、そうはいってもお金はかけられないという場合もあると思います。本記事では、USBメモリと外付けHDDのみでバックアップとリストアを行う方法を解説します。この方法はWindowsやLinuxが動作する環境であれば、ほぼ実施可能と思います。ただし、大量のマシンのバックアップやリストアを行うには不適切です。なお、フォレンジックにおける保全技術の延長上にある手法であることから、空き容量も含めてバックアップします。これにより、バックアップに必要なディスク容量が大きくなります。

#準備
まず、USBメモリと外付けHDDを準備します。USBメモリは4GB程度あれば十分です。外付けHDDは、バックアップしたいマシンの内蔵HDD/SSDのサイズより大きいものを準備してください。

上記に加えて、Tsurugi Linuxを使用します。以下から「tsurugi_acquire_2019.1.iso」をダウンロードします。
https://tsurugi-linux.org/downloads.php

#USBメモリの準備
Tsurugi LinuxのisoファイルをUSBメモリに書き込みます。ISO形式なので、当然ファイルコピーではなく、ISOイメージとして書き込む必要があります。以下のようなソフトを使用します。
https://rufus.ie/ja_JP.html

#USBメモリからブート
作成したUSBメモリからブートします。通常ブート順は内蔵HDD/SSDとなっていることが多いため、変更する必要があります。変更手順はPCのメーカーごとに異なりますが、F2、F10、F12、Delのいずれかのキーを起動時に連打すればだいたいうまくいくと思います。

USBメモリからの起動に成功すると、以下のような画面になります。F3を押して、キーボードをJapaneseにしておくと良いでしょう。
作業自体はGUIでもテキストモードでもどちらでも問題ありません。ここではGUIで起動します。
![Windows 10-2020-10-10-18-24-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549537/5e8f1f00-d9d0-ad02-e37f-1bdd5b4ce9d3.png)

GUIが起動したら、ターミナルを起動します。デスクトップにあるterminatorをクリックします。

#デバイスの確認
最初にfdisk -lを実行します。以下のように、内蔵HDD、ブートしたUSBメモリがデバイスとして認識されます。
以下の場合は、/dev/loop0がUSBメモリ、/dev/nvme0n1が内蔵HDDです。これは仮想マシンであるためデバイス名が通常と異なります。物理マシンであれば、内蔵HDDは/dev/sdaと表示されることが多いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549537/71fed6e9-baaa-8f86-4ac2-a7b0d423f546.png)

続いて、外付けHDDを接続します。再度fdisk -lを実行すると、/dev/sdaが追加されました。物理マシンであれば、/dev/sdcと表示されることが多いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549537/10608e18-37c3-3279-989c-5ae8ac2f5e30.png)

#書き込みロックの解除
Tsurugi Linuxでは、内蔵、外付けHDDともにデフォルトでは書き込みが禁止されています。今回はバックアップを行うため、外付けHDDの書き込み禁止を解除します。以下のコマンドを実行します。
blockdev --report
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549537/6f989ad0-766e-caac-c9c8-ff874d2fb179.png)

出力のうち、一番左にあるroというのがReadOnlyの意味です。現在はすべてのデバイスが読み取り専用になっています。外付けHDDである/dev/sda、/dev/sda1を書き込み可能にします。以下のコマンドを実行します。
blockdev --setrw /dev/sda /dev/sda1
blockdev --report

コマンドの実行前後で比べると、/dev/sda、/dev/sda1がrwとなっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549537/ca95a2e1-e494-ece4-1705-bfada112d095.png)

#外付けHDDのマウント
以下は外付けHDDがFAT32でフォーマットされている場合の例です。お使いのファイルシステムに合わせて適宜変更してください。
mount -t vfat -rw /dev/sda1 /mnt

#バックアップ実行
準備ができたのでバックアップを実行します。以下のコマンドを実行します。

ftkimager --frag 4000M /dev/nvme0n1 /mnt/backup.dd

上記はFAT32の制限である1ファイルあたり4GBまでに合わせてファイルを分割しています。ファイルシステムによっては--fragは不要です。
サイズによりますが、数時間程度で完了します。

#応用編
ftkimagerコマンドでは、保存するイメージファイルをE01に変更できます。E01は圧縮することができるので、ディスク容量を節約できます。
詳しくはftkimagerコマンドのヘルプを参照してください。

#リストア
ブートして書き込みロックの解除を行うところまでは同じです。書き込みロックの解除対象が内蔵ディスクになるだけです。
その後、以下のコマンドを実行します。なお、前述した手順でバックアップを取得している場合、/mnt/backup.dd.001.txtが作成されているはずです。以下のコマンドでは、このテキストファイルまでcatの対象になってしまうため、backup.dd.001.txtは、_backup.dd.001.txtにでもリネームしておく必要があります。

cat /mnt/backup.dd.*| dcfldd of=/dev/nvme0n1 

#この方法の利点
Bitlockerで暗号化したままバックアップとリストアが可能です。そのため、Bitlockerのパスワードおよび回復キーさえ厳重に保管できていれば、情報漏洩のリスクを低減できます。なお、Bitlockerはパーティションごとに設定します。ディスク全体の暗号化ではない点に注意が必要です。
また、複数のリストアした場合は、すべてのマシンの暗号鍵が同じ=回復キーが同じになります。そのため通常以上に回復キーを厳重に保管する必要があります。リストア後にパスワードを個々に設定し直した方が良いですね。
Excel > 2003 > 関数>VLOOKUP コード表のコード部分を予め昇順に並べておく必要があります

検索値に対する製品名や金額を求めたい
「VLOOKUP」関数は、検索/行列関数のひとつで、
テーブル (範囲) の左端列を検索し、指定した列と同じ行にある値を返す関数です。
この機能を利用して、指定したコードに対する製品名や金額を求めることができます。
VLOOKUP(検索値,範囲,列番号,検索の型)

ただし、コード表のコード部分を予め昇順に並べておく必要があります。
降順または不順の場合は正確に抽出することができません。
フロントエンジニアがgoのAPIサーバーをサクッとsystemdで自動起動させてみた

systemdでサービス化した方がいいと言われたので、とりあえずやってみた。

①プロジェクトファイル(ここではsample)でgo build
②etc/systemd/systemにapp.serviceを作ります
③app.serviceに下記を記述

``` C
[Unit]
Description=Automatic start server demon

[Service]
ExecStart=/home/ec2-user/sample/sample
WorkingDirectory=/home/ec2-user/sample
Restart=always
Type=simple
User=ec2-user

[Install]
WantedBy=multi-user.target
```
【解説】
ExecStartで実行ファイルを指定
go buildしたらファイル名と同じバイナリが生成されるので、それを指定

WorkingDirectoryで実行するディレクトリを指定

Restart=always　alwaysにすることで落ちても自動再起動してくれる

Type=simple 実行完了と判別するタイミングを指定

simple=コマンドが実行されたら
Type=forking=実行したコマンドが終了したら
Type=oneshot=コマンドが完了したら

User　実行するUser

WantedBy=multi-user.target enable時にこのユニットの.wantsディレクトリにリンクを作成する
これはよくわからなかった。

④```sudo systemctl daemon-reload```を実行
app.serviceの内容を更新

⑤```sudo systemctl enable /home/ec2-user/etc/systemd/system/app.service```を実行
サービスの自動起動を有効にする
*絶対パスで指定すること

⑥```sudo systemctl start app.service```を実行

これで自動起動されます
[iOS]AutoLayoutでviewをコピペしたらAuthLayoutが効かなくなってしまう問題への対応方法

長いこと謎だったんですが、UIStoryboard内のUIViewController直下のviewをコピーして貼り付けると、AutoLayoutができない状態になりますよね。

イメージ：ここの選択してるviewをコピペすると、上のようにSafeAreaがくっついてきて

![スクリーンショット 2020-10-16 16.15.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20784/36f764ec-9eaa-0cdb-9b3b-6a9832e3b51e.png)

Autolayoutができない状態に！

![スクリーンショット 2020-10-16 16.16.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20784/4a444586-bdfd-5d7a-4bdf-66ed05265bfb.png)

## 解決するには

どうやらLayoutがAutoresizingMask（AutoLayout切ってる旧レイアウト状態）になってるのでInferredに変更します。

![スクリーンショット 2020-10-16 16.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20784/5d80e301-956b-0f75-8a35-ebf1a564258b.png)

あと、一番下のSafe Area Layout Guideをオフにします。

解決できてスッキリ

CreatedAt: 2020/10/16　iOS14, Xcode12