OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでTensorFlow Liteを使用して推論を実行する

デフォルトでは、TensorFlowはコンパイルされたモデルでカスタムオペレーターを実行する方法を知らないため、TensorFlow Lite APIを使用すると、Edge TPU用にコンパイルされたモデルは失敗します。 動作させるには、推論を実行するコードにいくつかの変更を加える必要があります。 このページでは、Pythonを使用してそれを行う方法を示します。

C ++を使用する場合は、代わりに「C ++でTensorFlow Liteで推論を実行する」をお読みください。

> 注：このページは、TensorFlow Lite APIの使用経験がある開発者を対象としています。 TensorFlowの経験がなく、使用する準備ができていない場合は、代わりにEdge TPU Python APIを使用できます。これにより、画像分類およびオブジェクト検出モデルで推論を実行するために必要なコードが簡素化されます。

Python TensorFlow Lite APIを使用してEdge TPUでモデルを実行するために、TensorFlow Liteデリゲートを実装しました。 デリゲートは、モデルグラフの特定の操作を処理するTensorFlow Liteメカニズムです。 この場合、デリゲートはEdge TPUカスタムオペレーターを処理します。

Edge TPUデリゲートを使用するには、次の手順を実行します。

1. 最新のEdge TPUランタイムに更新します。

USBアクセラレータまたはM.2 / PCIeアクセラレータを使用している場合、次のようにEdge TPUランタイムを更新します:

```
sudo apt-get update

wget https://dl.google.com/coral/edgetpu_api/edgetpu_api_latest.tar.gz -O edgetpu_api.tar.gz --trust-server-names

tar xzf edgetpu_api.tar.gz

sudo edgetpu_api/install.sh
```
Dev BoardまたはSystem-on-Module（Mendelを使用）を使用している場合は、次のように更新します:

```
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
sudo apt-get update
sudo apt-get dist-upgrade
```

2.TensorFlow Lite APIの最新バージョンを使用していることを確認してください。

TensorFlow Lite Interpreter APIで推論を実行するPythonファイルを開きます（`label_image.py` の例を参照）。

コードがtensorflowパッケージからInterpreterクラスをインポートする場合、TensorFlow nightly（1.15）または2.0-betaビルドを使用する必要があります（必要なデリゲートAPIはTensorFlow 1.14に含まれていません）。

ただし、代わりに `tflite_runtime` パッケージを使用することをお勧めします。 これは、インタープリタークラスと必要なデリゲートAPIを含むはるかに小さなパッケージです。 tflite_runtimeパッケージをインストールするには、`TensorFlow Lite Python` クイックスタートに従ってください。

3.`Interpreter` を構築するときに、Edge TPUのデリゲートをロードします。

たとえば、TensorFlow Liteコードには次のような行が必要です:

```
interpreter = Interpreter(model_path)
```

これを次のように変更します:

```
interpreter = Interpreter(model_path,
  experimental_delegates=[load_delegate('libedgetpu.so.1.0')])
```

上部に1つの追加インポートが必要です:

```
# If you're using the tflite_runtime package:
from tflite_runtime.interpreter import load_delegate

# Or if you're using the full TensorFlow package:
from tensorflow.lite.python.interpreter import load_delegate
```

> 注：`libedgetpu.so.1.0` ファイルは、ステップ1でインストールされたEdge TPUランタイムに含まれています。

それでおしまい。 コードをすべて設定し、Edge TPU用にコンパイルされたモデルを使用して推論を実行すると、TensorFlow Liteはグラフのコンパイルされた部分をEdge TPUに委任します。

![微信截图_20190904150555.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/3ef4c9cd-cbad-fc31-06c5-9b8af1487139.png)


[ここでGoogle EDGE tpuを取得します](https://store.gravitylink.com/global)
Splunk Boss of the SOCについて（その５　Command & Control）

[Boss of the SOC (BOTS) Investigation Workshop for Splunk](https://www.splunk.com/blog/2018/05/25/boss-of-the-soc-bots-investigation-workshop-for-splunk.html)のbotv1を使用してScenario #1_APTを順繰りやっていく５回目。:sweat:長いな


サイバーキルチェーンは[ここ](https://www.macnica.net/solution/security_apt.html/)を参照。
[初回](https://qiita.com/toshikawa/items/403aaf0901e778629e6d)が偵察（reconnaissance）で、[第２回](https://qiita.com/toshikawa/items/f3ede7ccc40ea68a0412)が攻撃(exploitation)、[前前回](https://qiita.com/toshikawa/items/d17eeecef180a441e41f)が設置（Installation）、[前回](https://qiita.com/toshikawa/items/e5157b10d947822c301b)が目的に対する行動（Actions on Objective）、今回が遠隔操作(Command & Control)

##Identifying the Fully Qualified Domain Name of the System that Defaced the Web Server(Webサーバーを改ざんしたシステムの完全修飾ドメイン名の特定)
>This attack used dynamic DNS to resolve to the malicious IP. What fully qualified domain name (FQDN) is associated with this attack?
>この攻撃では、動的DNSを使用して悪意のあるIPに解決しました。 この攻撃に関連付けられている完全修飾ドメイン名（FQDN）は何ですか？

>If you know the name of the file that defaced the site, this question becomes very easy to answer because the information can be found in that same log. If we don't know the defacement file name and we needed to figure out the domain name first, then there is a bit more work to do. We will cover both!
>サイトを改ざんしたファイルの名前を知っている場合、同じログで情報を見つけることができるため、この質問への回答は非常に簡単になります。 改ざんファイル名がわからず、最初にドメイン名を把握する必要がある場合は、もう少し作業が必要です。 両方をカバーします！

####Finding the sourcetypes that saw this file
CIMいれるとうまくいくのかな。自分のだとsrc一つとっても_srcip_だったり_src_ip_だったりするのでうまく動かない。

```Splunk:SPL
index=botsv1 "23.22.63.114" "poisonivy-is-coming-for-you-batman.jpeg"  "192.168.250.70"
| top sourcetype
```
![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/013e22ab-1826-ee03-a57b-42edd7f76a01.png)

####Drilling down into stream:http to see URL
```Splunk:SPL
index=botsv1 dest_ip=23.22.63.114 "poisonivy-is-coming-for-you-batman.jpeg" src_ip=192.168.250.70 sourcetype=stream:http
| table _time site request
```
![qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/e3962f4a-818b-7d1a-e378-62d1bbf4296c.png)
一発ですな。
####What if I Don’t Have the File Name?
```Splunk:SPL
index=botsv1 host_addr{}=23.22.63.114 sourcetype=stream:dns
```
![qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/4a3e4ee5-ecb6-d7fe-c78f-5ccaaacc1c46.png)
googleでDNSを引いたらしい。同じ結果が出ている。
_stream:dns_いいな。_bind_のログだとここまででないし。

Command & Controlはここでおしまい。キリがいいのでここまでとします。
EC2のLaravel6.0環境にauth(認証機能)を入れる　AWS/Laravel連載(5)

# はじめに

前回の記事の続きです。
> [EC2のLaravel環境にGitを入れて開発を開始する　AWS/Laravel6.0連載(4)](https://qiita.com/rf_p/items/cb4ffa29ff99c45f85b3)

# 日本語設定しておく

今回の対応にほとんど関係してこないですが、連載の中で日本語設定するのを忘れていたのでこのタイミングでしておきます。

```php:config/app.php
...
    'timezone' => 'Asia/Tokyo',
...
    'locale' => 'ja',
...
    'fallback_locale' => 'ja',
...
    'faker_locale' => 'ja_JP',
```

時刻やらなんやらを全て日本・日本語に設定しました。

# Laravel5系と6系のauth違い

5系では

```powershell
$ php artisan make:auth
```

だけで作れました。

6系ではcomposerで入れる必要があります。

# Laravel6系でcomposerを使いlaravel/uiを入れる

```powershell
$ cd /var/www/blog/
$ composer require laravel/ui
```

これだけで入ればOKです。

# エラーが出たら

```powershell
PHP Fatal error:  Out of memory (allocated 651173888) (tried to all...
```

メモリが足りないようです。
/etc/php.iniのmemory_limitの設定を変更しても無理だったので、私の場合はEC2インスタンスが小さすぎてシステムのメモリが不足していたようでした。

一時的にt2.microからt2.smallに変更。
インスタンスの状態→停止→停止したらインスタンスの設定→インスタンスタイプの変更→t2.smallに。

入れたあとは元に戻しておきましょう。

```powershell
$ which composer
/usr/local/bin/composer
```

```powershell
$ php -d memory_limit=-1 /usr/local/bin/composer require laravel/ui
```

memory_limit=-1を設定することにより、一時的にphpのメモリ上限を無しに実行します。
/etc/php.iniのmemory_limitを変えるとWebサービスとして動く時のphpのメモリ上限も大きくなってしまうので、composer実行時だけ上限撤廃した方が安全かと思います。

# auth実行

```powershell
$ php artisan
...
 ui
  ui:auth              Scaffold basic login and registration views and routes
...
```

これで実行できそうですね。

```powershell
$ php artisan ui:auth
Authentication scaffolding generated successfully.
```

```shell
$ git st
On branch master
Your branch is up to date with 'origin/master'.

Changes 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:   routes/web.php

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	app/Http/Controllers/HomeController.php
	resources/views/auth/
	resources/views/home.blade.php
	resources/views/layouts/

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

いろいろファイルが自動生成されました。

# スタイル調整する

入ったはいいものの、
5系までと異なりログインフォームのスタイルが崩壊してます。

<img width="381" alt="login.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/b1152ea0-d94b-f710-69cf-39bef0d768a4.png">

npm公式に行くと、現時点でLTSは10系のようです。
https://nodejs.org/en/download/

```powershell
$ curl --silent --location https://rpm.nodesource.com/setup_10.x | sudo bash -
$ sudo yum -y install nodejs
```

```powershell
$ node -v
v10.16.3
$ npm -v
6.9.0
```

以下コマンドを実行すると、Vue.jsとBootstrapが入ります。
レイアウトが崩れている原因はBootstrapが当たっていないためです。

```powershell
$ php artisan ui vue
Vue scaffolding installed successfully.
Please run "npm install && npm run dev" to compile your fresh scaffolding.
```

メッセージに書いてあるとおり、以下コマンドを実行します。

```powershell
$ npm install && npm run dev
```

きれいになりました。
<img width="1185" alt="login_after.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/d014a2ec-9660-86e8-cec8-cc43b853929c.png">

本日は一旦ここまで。
【SwiftUI】セーフエリアを超えて、コンテンツを表示する

# この記事は何？
iPhoneの画面には、__セーフエリア__と呼ばれる領域があります。
通常、セーフエリアにコンテンツを表示することはできません。
しかしながら、没入感を重視するアプリケーションなど画面いっぱいにコンテンツを表示したい場合があります。
この投稿では、「画面いっぱいに画像を表示する」方法を忘備録として残しておきます。

> Swiftを基礎から学ぶには
自著、工学社より発売中の「[まるごと分かるSwiftプログラミング](https://amzn.asia/d/7YPWJwl)」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。

## 環境
macOS10.15 beta7
Xcode11 GM

# セーフエリア
以下は、画像の表示形式を `Fill` にして、画面いっぱいに表示するコードです。

````Swift:画面いっぱいに画像を表示する
struct ContentView: View {
    var body: some View {
        Image("Catalina")
            .resizable()
            .aspectRatio(contentMode: .fill)
    }
}
````

実行結果は下図のようになり、画面の上下に白い帯が残ります。
特に、上部はステータスバーの領域と重複しています。
![スクリーンショット 2019-09-16 13.18.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/7a15afa0-0791-924c-572e-da8687cea75d.png)

## Edges Ignoring Safe Area 修飾子
セーフエリアを超えてコンテンツを表示するには、`body` にあるトップレベルのビューに `edgesIgnoringSageArea` 修飾子を指定します。

ドキュメントによると
_Extends the view out of the safe area on the specified edges._
（指定した縁にあるセーフエリアの外側に、ビューを拡張する）
とあります。

````Swift:セーフエリアを無視する
struct ContentView: View {
    var body: some View {
        Image("Catalina")
            .resizable()
            .aspectRatio(contentMode: .fill)
            .edgesIgnoringSafeArea(.all)    //すべてのセーフエリアを無視
    }
}
````

上下にあった白い帯がなくなりました。
![スクリーンショット 2019-09-16 13.26.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/c0ddacbe-aa13-74b8-7f9b-42545260d90d.png)

ちなみに、`.all` の部分は `Edge.Set` 型となっていて、以下のように定義されていました。

````Swift:Edge.Setの定義
public static let top: Edge.Set
public static let leading: Edge.Set
public static let bottom: Edge.Set
public static let trailing: Edge.Set
public static let all: Edge.Set
public static let horizontal: Edge.Set
public static let vertical: Edge.Set
````

`leading` は画面の左方向で、`trailing` は画面の右方向です。
`leading` と `trailing` は、既定値として「セーフエリアを超えてコンテンツを表示する」ようになっているようです。

### ステータスバー
コンテンツを画面全体に表示できるようになりましたが、ステータスバーが残っていると没入間に欠ける印象があります。
ステータスバーの表示設定については、[こちらの投稿](https://qiita.com/chino_tweet/items/e8e0ae3d0e78b71f9be3)で解説しました。

![スクリーンショット 2019-09-16 13.36.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/3cd6fe26-1ccf-7ca7-96dc-9a22d626f5bc.png)
ファイルの日付取得

# ファイルの作成日、更新日、アクセス日の取得
ファイルの日付の取得方法
Windowsの場合です。

```python:test.py
from pathlib import Path
import datetime

p = Path(r'c:\test\test.txt')

# 作成日
create_time = datetime.datetime.fromtimestamp(p.stat().st_ctime)
# 更新日
update_time = datetime.datetime.fromtimestamp(p.stat().st_mtime)
# アクセス日
access_time = datetime.datetime.fromtimestamp(p.stat().st_atime)

print('作成日', create_time)
print('更新日', update_time)
print('アクセス日', access_time)
```

## 日付取得
`pathlib`を使用する。
`Path.stat()`でパスに関する情報を取得。ここに日付に関する情報がある。
statのプロパティで以下が日付に関する情報となる。

- st_ctime：作成日
- st_mtime：更新日
- st_atime：アクセス日

windowsの場合は、st_ctimeは作成日となる。osによって内容が変わる。

## エポック秒の変換
取得した時間はエポック秒となっているため、変換を行う。
`datetime`を使用
`datetime.datetime.fromtimestamp()`により変換する。
Swiftlint導入までと環境構築スクリプト

チームで開発をしていると書き方にばらつきがあったりしますが
保守的な背景から、これに制約を設けることでばらつきが無いように統一したくなります

そんなときにSwiftlintを使うと便利です

今回はbrewでswiftlintを入れます

## インストール

```
brew install swiftlintf
```

## Xcodeで設定
Build Phaseで`New Run Script Phase`を選択
`Run Script`が作成されるのでわかりやすいように名前を`Run Swiftlint`とかにしましょう

スクリプトを記述します


```
if which swiftlint >/dev/null; then
swiftlint autocorrect --format
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
```

swiftlintが入っているか確認して、あれば`swiftlint autocorrect --format`でインデント修正含むソースコードの自動修正(--formatオプションがインデント修正は含まないソースコードの自動修正)、`swiftlint`でソースコードの静的解析を行います
swiftlintが入ってなければechoで指定した文章をログに出力します

## swiftlintのルールをカスタマイズ
ただデフォルトのままだとルールが厳しすぎるのでプロジェクトと同じディレクトリにymlファイルを作ってルールを変更します

まずはデフォルトで有効にされているものの中から必要なものを無効にしたいものだけをymlファイルに書いていけばいいと思います

以下は私が設定したものになります
利用する場合は自己責任でお願いします
ルールに関しては[こちら](https://qiita.com/kagemiku/items/80e6d905dc0059c342b3)がまとめられてます

```swiftlint.yml


# Lint対象にするファイル
included:
  - test/
  - testTests/
  - testUITests/
# あればその他ディレクトリも 

# Lint対象から外すファイル
excluded:
  - Pods/

# デフォルト以外で有効にするルール
opt_in_rules:
  - closure_end_indentation
  - first_where
  - operator_usage_whitespace

# デフォルトから無効にするルール
disabled_rules:
  - trailing_whitespace
  - type_name
  - identifier_name
  - cyclomatic_complexity
  - shorthand_operator
  - nesting
  - closure_end_indentation
  - discarded_notification_center_observer

force_cast: warning
force_try: warning

file_length:
  warning: 1200
  error: 1200

function_body_length:
  warning: 400
  error: 400

line_length:
  warning: 450
  error: 450

type_body_length:
  warning: 600
  error: 600

function_parameter_count:
  warning: 7
  error: 8

```


## 環境構築スクリプト作成

チーム開発でリポジトリをクローンした後にコマンド一発でswiftlintのような開発に必要な環境を構築できると楽です
swiftlintだけなら問題ないですが、他にも必要になってきたら面倒なので用意したほうがいいです
参考: https://qiita.com/lovee/items/38cdfd5d2f5827f27427#11-環境構築スクリプトを作成

シェルスクリプトを作成します
シェルスクリプトとは？みたいな人は[この記事](https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337)がわかりやすいかも

```bootstrap.sh

#!/bin/sh

# この一行目で、実行時どのシェルでスクリプトを実行するかが決まる。

echo "Install Swiftlint"
brew install swiftlint

echo "Install bundler and gems"
gem install bundler
bundle install --path vendor/bundl

echo "Install dependencies via CocoaPods"
bundle exec pod install

open test.xcworkspace
```

あとは`sh bootstrap.sh`をターミナルで叩けば一発です


## 参考
https://github.com/realm/SwiftLint#usage
https://qiita.com/shtnkgm/items/6dd756aa14926736c6f5
https://ticklecode.com/install-swiftlint/
Docker コマンド一覧

# Docker コマンド一覧

試してみたコマンド一覧

##
Dockerfileのビルド

``` docker
$ docker image build -t [イメージ名]:[タグ名] [Dockerfileのパス]
# 例）　docker image build -t test_image:test_tag .
# -t はイメージ名やタグ名を指定するため必須
```

## イメージの操作

``` docker
$ docker image pull [イメージ名]:[タグ名]
# docker hub からイメージをダウンロード

$ docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# すでにあるイメージなどに別名タグをつける

$ docker image rm IMAGE_ID
# 削除
# エラーが出て消せないけど強制削除する場合は -fをつける

# 全て削除する場合
$ docker images -aq | xargs docker rmi
# これも消せないイメージは -f をつける
# xargsはパイプライン前の結果を引き継ぎコマンドを打てるもの
```

## コンテナの操作

``` docker
$ docker container ps #動いているコンテナの一覧が見れる
$ docker container ps -a #止まっているコンテナも含めてみれる
$ docker container rm コンテナの名前かID #コンテナの削除
$ docker container run -t イメージの名前かID #コンテナをイメージから作成し、起動
# docker container create 

#オプション
-d #バックグラウンドで動かす
-p #ホスト側ポート番号:コンテナ側ポート番号

# 例） -p 9000:8080 だと　localhost:9000でコンテナ側の8080にフォワードされる
# --name [名前] # コンテナに名前指定できる。指定しない場合は自動でつく

$ docker container stop 名前かID #コンテナの停止 
$ docker container restart 名前かID #コンテナの再起動
$ docker container exec コンテナの名前かID コマンド...
  # 起動中のコンテナにコマンド投げれる
  # 例）docker container exec -it [コンテナの名前かID] mysql -u root -p test_db
  # コンテナに立ち上げたMYSQLにログインして操作
  # -it はコンテナに接続した際にSSHみたいに中の動きを表示＆コマンド操作できるようにする
  # コマンドをbashにするとコンテナ内に入って操作できる。
$ docker container exec -it [コンテナの名前かID] bash
```

## docker-compose

``` docker
$ docker-compose up -d
#docker-compose.ymlに記述した内容でイメージからビルド、ランなどさせる

$ dokcker-compose down
#docker-composeで起動したコンテナを全て終了させる
```

## docker-compose.yml内容

``` yml
# jenkinsのイメージは公式をみる
# https://github.com/jenkinsci/docker/blob/master/README.md
# コロンのあとは半角スペースを忘れない

version: "3" #ファイルフォーマットのバージョン
services:
  master: 
    container_name: master #コンテナ名の定義
    image: jenkins/jenkins:lts #dockerhubから取得するイメージ：タグ
    #ポート
    ports:
      - 8080:8080 #ホスト側ポート：#コンテナ側ポート
    #マウント
    volumes:　
      - ./jenkins_home:/var/jenkins_home #ホスト側ディレクトリ:コンテナ側ディレクトリ
```

composeの中の項目の一覧はそのうち別でまとめる

## docker network
 - コンテナ間の通信で使う

```shell
$docker network create ネットワーク名 #ネットワーク作成
$docker network ls #ネットワーク一覧表示
$docker network rm ネットワーク名 #ネットワークの削除
$docker network inspect ネットワーク名
#ネットワークの詳細表示　どのコンテナが接続されているか確認できる。
```

## 一括削除

``` docker
$ docker image prune -a #イメージの一括削除
$ docker container prune #コンテナの一括削除
```

## 用語

- dind
  - docker in docker コンテナ内にコンテナを立てること

そのうち一旦完成予定
優先度付きキュー（ヒープ）の使い方

## 概要
AtCoderの[ABC141](https://atcoder.jp/contests/abc141)で[優先度付きキュー（ヒープ）を用いる問題](https://atcoder.jp/contests/abc141/tasks/abc141_d)に出くわしたので、その備忘録です。[公式の解説](https://img.atcoder.jp/abc141/editorial.pdf)があるため詳しい説明は省きますが、この問題を解くに当たって下記の処理を行う必要が出てきます。

`最も高い値段を持つ品物に対して割引（50%オフ）を適用するという処理を、割引券がなくなるまで繰り返す`

単純に考えると、これは下記の処理を繰り返せば実現できそうです。

1. 値段の配列をソートする
2. 最も値段の高い要素を取得し、半額にした上で配列に戻す

ただしこの方法の場合、毎回ソートしているため計算量が増大し、与えられた制限時間以内に処理が終わりません。そこで最大値の取得を効率的に繰り返すため、優先度付きキュー（ヒープ）を用いる必要があります。下記にソートを用いた失敗例も含めて記載します。

## 毎回ソートする場合（TLE）
```python:失敗例
n, m = map(int, input().split())
a = []

for i in input().split():
    a.append(i)

# 割引券がなくなるまで繰り返す
for j in range(m):
    # 最大値を取得するため、毎回ソートを行う
    a.sort()
    # 最も高い値段を取り出す
    highest = a[-1]
    # 半額にしてリストに戻す
    a[-1] = highest // 2

print(sum(a))
```

## 優先度付きキューを用いる場合（AC）
```python:成功例

import heapq

n, m = map(int, input().split())
a = []

for i in input().split():
    # Pythonのheapは最小値がpopされるため、マイナスを付与した上でheapに入れる
    heapq.heappush(a, -int(i))

# 割引券がなくなるまで繰り返す
for j in range(m):
    # 最も高い値段を取り出す
    highest = heapq.heappop(a)
    # 半額にしてheapに戻す
    heapq.heappush(a, -(-highest // 2))

print(-sum(a))
```

注意点としては下記になります。

- Pythonの優先度付きキューはpopの際に最小値を返すため、あらかじめ負の値にした上でpushする（最後にsumを出力する際に再度マイナスを付けて正数に戻す）
- 負の数に対して`//`を用いると、負の方向に切り上がる（絶対値が増加する）ため、一旦正数に戻してから切り下げる

そもそも何故Heapを用いると処理が速くなるのかに関しては、また別の記事で紹介したいと思います。

## 参考
[heapq ヒープキューアルゴリズム](https://docs.python.org/ja/3/library/heapq.html)
[ヒープをわかりやすく解説してみた](https://medium.com/@yasufumy/data-structure-heap-ecfd0989e5be)
[【Python】切り捨て除算演算子を使った切り上げ【算数】](https://qiita.com/ikanamazu/items/2b16f220fdaf6072793d)
Kotlinでnull.toString()


## 突然ですがクイズです！

```quiz1.kt
fun main() {
    println(null?.toString())
}
```

```quiz2.kt
fun main() {
    println(null!!.toString())
}
```

```quiz3.kt
fun main() {
    println(null.toString())
}
```

それぞれ結果はどうなるでしょうか！

1. コンパイルエラー
2. NullPointerException
3. null
4. "null"
5. いずれでもない

## 正解(結果)

```quiz1.result
null
```

過去私「うん」

```quiz2.result
Exception in thread "main" kotlin.KotlinNullPointerException
	at MainKt.main(Main.kt:2)
	at MainKt.main(Main.kt)
```

過去私「だよね」

```quiz3.result
null
```

過去私「?????(コンパイルエラー、仮に通ってもぬるぽだと思っていた顔)」

まさかと思って以下を実行。

```stringdesuka.kt
fun main() {
    println(null?.toString() is String)
    println(null.toString() is String)
}
```

`null.toString()`はコンパイルエラーでもNullPointerExceptionでもなくnullの文字列"null"になる。え、"null"なの...と知った時はびっくりしました(空文字""ならまだわかるけど)。

```
false
true
```

そしてこれに関して、[公式ドキュメントのtoString()のページ](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/to-string.html)にちゃんと書いてありました。
ちゃんと公式ドキュメントは読みましょうね..:innocent:

> Returns a string representation of the object. Can be called with a null receiver, in which case it returns the string "null".

nullableのオブジェクトに対してtoString()をするとnullの文字列が返るのは仕様！
なので`?.`をつけ忘れてもコンパイルエラーやIntelliJ上でエラーも出ない。うっかりつけ忘れるとすると意図せぬ結果に出くわすかも...??

```incorrect.kt
val msg: MessageObject? = null

// msg対する何かしらの処理
// 結果としてmsgがnullのままだったとする

// 出力 -> "null"
println(msg.toString() ?: "default message")
```

`?.`をつけてtoString()すれば当然だけど期待する結果が得られる。

```correct.kt
val msg: MessageObject? = null

// msg対する何かしらの処理
// 結果としてmsgがnullのままだったとする

// 出力 -> "default message"
println(msg?.toString() ?: "default message")
```
HttpSecurityクラスで提供するConfigurer

| HttpSecurityクラスのメソッド | Configurer |
| --- | --- |
| openidLogin() | org.springframework.security.config.annotation.web.configurers.openid.OpenIDLoginConfigurer |
| headers() | org.springframework.security.config.annotation.web.configurers.HeadersConfigurer |
| cors() | org.springframework.security.config.annotation.web.configurers.CorsConfigurer |
| sessionManagement() | org.springframework.security.config.annotation.web.configurers.SessionManagementConfigurer |
| portMapper() | org.springframework.security.config.annotation.web.configurers.PortMapperConfigurer |
| jee() | org.springframework.security.config.annotation.web.configurers.JeeConfigurer |
| x509() | org.springframework.security.config.annotation.web.configurers.X509Configurer |
| rememberMe() | org.springframework.security.config.annotation.web.configurers.RememberMeConfigurer |
| authorizeRequests() | org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry |
| requestCache() | org.springframework.security.config.annotation.web.configurers.RequestCacheConfigurer |
| exceptionHandling() | org.springframework.security.config.annotation.web.configurers.ExceptionHandlingConfigurer |
| securityContext() | org.springframework.security.config.annotation.web.configurers.SecurityContextConfigurer |
| servletApi() | org.springframework.security.config.annotation.web.configurers.ServletApiConfigurer |
| csrf() | org.springframework.security.config.annotation.web.configurers.CsrfConfigurer |
| logout() | org.springframework.security.config.annotation.web.configurers.LogoutConfigurer |
| anonymous() | org.springframework.security.config.annotation.web.configurers.AnonymousConfigurer |
| formLogin() | org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer |
| oauth2Login() | org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2LoginConfigurer |
| oauth2Client() | org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2ClientConfigurer |
| oauth2ResourceServer() | org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer |
| requiresChannel() | org.springframework.security.config.annotation.web.configurers.ChannelSecurityConfigurer.ChannelRequestMatcherRegistry |
| httpBasic() | org.springframework.security.config.annotation.web.configurers.HttpBasicConfigurer |
| requestMatchers() | org.springframework.security.config.annotation.web.builders.HttpSecurity.RequestMatcherConfigurer |
yarn+firebaseでfirebase initまでのターミナル操作(Firestoreを選択)　

プログラミング初心者ですが、練習がてらポートフォリオサイトを作っています。
本日データベースにfirebaseを採用しようとしたところ、エラーだらけで全然進まなかったので、備忘録がてら書き残します。


##導入

こちらのサイトを参考に作品を作って行こうと考えました。
https://qiita.com/sin_tanaka/items/ea149a33bd9e4b388241

どうやらパッケージを管理するものが必要だと知り、色々調べてnpmとyarnで新しいyarnの方を選びました。最新の技術に触れるのは重要ですね。

続いてこちらのサイトを参考にfirebaseの導入を進めて行きました。
https://qiita.com/Alex_mht_code/items/e5cd95b8f2a2a3ce656f


今回はローカルにインストールします。
とりあえず

```
yarn add firebase-tools
```
までは上手く行ったのですが、

(結果)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481342/98aad3b2-6261-110b-76dc-7e6af92c81f3.png)


この次の'firebase login'が全く上手く行きませんでした。(背景キモくてすいません。)

##躓きポイント①

↓この部分ですね。
```
$ cd [作業用フォルダに移動（任意の場所でいいです）]
$ mkdir [好きな名前で]
$ cd [作成したディレクトリの中]
$ firebase login(ローカルでは頭にyarnをつける必要があるそうなので、私はyarn firebase loginを入力しました。)

? Allow Firebase to collect anonymous CLI usage and error reporting information? (Y/n)←レポート送るか聞かれるのでお好きにy or n
```
下のAllow~が出て来ず、command not found的なやつが出ました。

調べてみると、パスが通っていないとのこと。

```
export PATH=/usr/local/:Cellar/yarn/1.7.13:$PATH
PATH=$PATH:/Users/watanabedaisuke/.config/yarn/global/node_modules/.bin
```
のどちらかで上手く行きました。(すみません...どっちが正解か覚えてません...)

パスが通ったあとは

```
yarn add firebase-tools
yarn firebase login
```
で上手く行きました。
自動的にブラウザが立ち上がり、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481342/b2fdba74-a81a-9ea8-871f-8bd8821462fa.png)

ログインが出来ました。

##躓きポイント②
続いて、yarn firebase initしましたが、ここも初心者には壁が厚いところです。

```
 ◯ Database: Deploy Firebase Realtime Database Rules
 ◯ Firestore: Deploy rules and create indexes for Firestore
 ◯ Functions: Configure and deploy Cloud Functions
 ◯ Hosting: Configure and deploy Firebase Hosting sites
 ◯ Storage: Deploy Cloud Storage security rules
```
まず、このような選択肢が出てきます。どれにすればいいか全くわからなかったのですが、

・ログインしたユーザーごとにプロフィールが異なるようなポートフォリオサイトを作りたい
・ユーザーの情報を貯めておくデータベースをfirebaseが担う

これらの目的があったため、FirestoreかDatabaseに絞られました。
Firestoreの方が新しく、高機能だそうなので前者を選びました。

##躓きポイント③
Qiitaでfirebase導入の記事は沢山ありますが、皆Hostingを選んだ記事だったためここから中々手こずりました😂

初めに

```
? Select a default Firebase project for this directory:
```

なる質問が飛んできます。

ここは、「プロジェクトをまだ作成していない人」は「Create a new project」、「プロジェクトを既に作成してる人」は「Use an existing project」です。

※私はブラウザ上で既にプロジェクトを作っていたのですが、それを忘れてCreate a new projectを選んでいたので全く進みませんでした・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481342/f7211125-2290-d4ea-34b3-c60317ac25ef.png)
(この画面に既にプロジェクトがあればUse an existing projectを選びましょう。)

すると、

```
? Select a default Firebase project for this directory:
```
となり、既に存在するプロジェクトの一覧が選択肢として出てきますので、該当するものを選択しましょう。
【 SwiftUI】ステータスバーを非表示にするモディファイア

# この記事は何？
いよいよ正式リリースされるXcode11から、SwiftUIフレームワークによる開発ができるようになります。
今後、Storyboardに変わって、Appleプラットフォームにおけるアプリ開発の主流になると思われるSwiftUIのTIPSを忘備録として、投稿しました。
「iPhone画面の上部にあるステータスバーを見えないようにする」方法です。

## 環境
macOS10.15 beta7
Xcode11 GM

# ステータスバー
ステータスバーは、バッテリー残量やアンテナ感度、時刻などを表示します。
iPhoneX以降のノッチ付きデバイスでは、ノッチを挟むようになっています。

![スクリーンショット 2019-09-16 12.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/24942643-3859-8a4b-ad2d-b8ebe82e1a2e.png)

没入感を重視するアプリケーションでステータスバーが表示されたままだと、クオリティを低下させる原因になるかもしれません。

## Status Bar Hidden 修飾子
`body` 内で、トップレベルになっているビューに、`statusBar(hidden:)` モディファイアを設定すればスタータスバーの可視性を設定できます。

ドキュメントには
_Sets the visibility of the status bar for the view._
（ビューに対するステータスバーの可視性を設定する）
とあります。

````swift:
struct ContentView: View {
    var body: some View {
        Text("Hello SwiftUI")
            .font(.title)
            .foregroundColor(.primary)
            .statusBar(hidden: true)    // trueだと、ステータスバーを隠す
    }
}
````

ステータスバーが非表示になります。

![スクリーンショット 2019-09-16 13.04.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/58db0e50-f683-c990-3dde-de0b86387c2d.png)

### セーフエリア
画面が真っ白なのでわかりづらいですが、実はコンテンツが画面全体に表示されていません。
__セーフエリア__と呼ばれる領域があるからです。
没入感を最大限まで引き出すには、セーフエリアを超えてコンテンツを表示する必要があります。
詳しくは、下の投稿で解説しています。
[セーフエリアを超えてコンテンツを表示する](https://qiita.com/chino_tweet/items/c3d2aca9ed00ee413b3e)
Oracle リスナーの起動・停止・状態確認

Windowsのコマンドでリスナーの起動・停止を行う場合、管理者権限のコマンドプロンプトから実行する必要がある。
管理者権限でコマンドプロンプトを開く方法は以下の通り。

・Windowsキーを押下
・`cmd.exe`を入力
・Ctl + Shift + Enter で実行

### 1. リスナーの起動
```bat
> lsnrctl start [リスナー名]
```

### 2. リスナーの状態確認
```bat
> lsnrctl status [リスナー名]
```

### 3. リスナーの停止
```bat
> lsnrctl stop [リスナー名]
```

以上
Nuxt.jsでReferenceError: regeneratorRuntime is not defined


Nuxt.jsで開発中に[Jimp](https://www.npmjs.com/package/jimp)を追加したらエラーが出た

```bash
ReferenceError: regeneratorRuntime is not defined
```

## 対応

依存を追加

```bash
npm install --save @babel/plugin-transform-runtime
```
`nuxt.config.js`に以下を追加

```nuxt.config.js
babel: {
  presets: [
    'es2015',
    'stage-0',
  ],
  plugins: [
    'transform-runtime'
  ]
},
```

自分はこっちも追加してしまったんですが多分いらないんじゃないかと思ってます

```bash
npm install --save @babel/runtime
```

## 多謝
[ReferenceError: regeneratorRuntime is not defined]
(https://github.com/nuxt/nuxt.js/issues/934)
Goのsliceでcapを指定した方が良いケース

以前レビューしていたときに、capを指定した方が良い理由を説明したら分かりやすいと言っていただいたので、嬉しくなってQiitaにも書きます。

以下のように、全てのUserのうち特定のUserだけを取り出したい場合を想定します。

```
type User struct {
	ID int64
	Name string
	Status int8	// 0 -> InActive, 1 -> Activeとする
}

func main() {
	users := []*User{
		&User{
			ID: 0,
			Name: "user0",
			Status: 0,
		},
		&User{
			ID: 1,
			Name: "user1",
			Status: 1,
		},
		&User{
			ID: 2,
			Name: "user2",
			Status: 0,
		},
		...
	}
	
	
	// 1. activeUsers := []*User{}
	// 2. activeUsers := make([]*User, 0, len(users))
	// 1と2はどっちが良いか？
	
	for _, u := range users {
		// activeなユーザーだけ取り出したい
		if u.Status == 1 {
			activeUsers = append(activeUsers, u)
		}
	}	
}
```

activeUsersのの大きさはusersのlenよりも小さくなる可能性が高い（上記の例の場合は間違いなく小さい）ので、capを指定したらその分無駄な容量を確保するのではないか？という疑問を持っていたようです。

- 1(capを指定しない)の場合

```
package main

import (
	"fmt"
)

func main() {
	l := []int{}

	for i := 0; i < 17; i++ {
		l = append(l, i)
		fmt.Println("len: ", len(l), ", cap: ", cap(l))
	}
}


-------------- result --------------

len:  1 , cap:  2
len:  2 , cap:  2
len:  3 , cap:  4
len:  4 , cap:  4
len:  5 , cap:  8
len:  6 , cap:  8
len:  7 , cap:  8
len:  8 , cap:  8
len:  9 , cap:  16
len:  10 , cap:  16
len:  11 , cap:  16
len:  12 , cap:  16
len:  13 , cap:  16
len:  14 , cap:  16
len:  15 , cap:  16
len:  16 , cap:  16
len:  17 , cap:  32
```

https://play.golang.org/p/-lxFdnmrz0z
capが足りなくなった場合に2倍のcapを確保するので、大きくなればなるほど無駄にメモリ確保する可能性が高い

- 2(capを指定する)の場合

```
package main

import (
	"fmt"
)

func main() {
	l := make([]int, 0, 20)

	for i := 0; i < 17; i++ {
		l = append(l, i)
		fmt.Println("len: ", len(l), ", cap: ", cap(l))
	}
}


-------------- result --------------

len:  1 , cap:  20
len:  2 , cap:  20
len:  3 , cap:  20
len:  4 , cap:  20
len:  5 , cap:  20
len:  6 , cap:  20
len:  7 , cap:  20
len:  8 , cap:  20
len:  9 , cap:  20
len:  10 , cap:  20
len:  11 , cap:  20
len:  12 , cap:  20
len:  13 , cap:  20
len:  14 , cap:  20
len:  15 , cap:  20
len:  16 , cap:  20
len:  17 , cap:  20

```

https://play.golang.org/p/7Q1TW_CF2-A
実際のlenがcapに満たない場合でも、倍確保されるよりはメモリ使わないで済むし、確保するための処理が入らないのでより良い

ということで、こういう場合はcapを指定しましょう！
サーバー上でdocker-composeを実行し、起動したDocker上のjupyter notebookをローカルのブラウザで表示する方法

# docker-composeの実行

(サーバー上)

以下のように、`ports`を指定して、`docker-compose`を用意。

```yml:docker-compose.yml
version: "2.3"
services:
  jupyter_module:
    build:
      context: .
    image: jupyter
    command: /bin/bash
    ports:
      - 8888:8888
    runtime: nvidia
```

buildした後に、以下のように`run`する。ただし、普通に`run`するとうまくいかないので、一工夫する。

[docker/compose/issues/1259](https://github.com/docker/compose/issues/1259) より。`--service-ports` をつけると良いということ。

```
$ docker-compose run --service-ports jupyter_module
```

または、`--service-ports` を付けなくても、`-p` のオプションでもできる。

```
$ docker-compose run -p 8888:8888 jupyter_module
```


# jupyterの用意と実行

(サーバー上)

必要なportを開く。

```
$ pip install jupyter jupyterlab
$ jupyter notebook --port 8888 --ip=0.0.0.0 --allow-root
```


# サーバーとの接続とjupyterへのアクセス

(ローカル)

ssh ポートフォワーディングでサーバーと繋ぐ。

```
$ ssh -NfL localhost:8888:localhost:8888 (ssh config name)
```

以下にアクセスする。`jupyter` のIDを聞かれたら、入力すればOK。

```
http://localhost:8888
```

## tokenがinvalidになる場合

既に他のプロセスで使用されているportを使ってnotebookを起動しようとしている可能性があります。
他のポートで確かめてみましょう。`sudo netstat -tanp`を使えば使われているポート番号を確認できます。
VPCでIPアドレスの偽装ができるか試してみた（あるいは送信元/送信先チェックについて）

# VPCのおさらい/最初にまとめ

- 仕様的には以下の記述がすべてであり、今回の検証結果も以下の記述の内容を確認する内容となっている。
- 送信元/送信先チェックを無効化すればインスタンスのIPアドレス以外の送信元/宛先のパケットも送受信できる

> Network Address Spoofing
Network MAC addresses are dynamically assigned to Amazon Elastic Compute Cloud (Amazon EC2) instances by the AWS network infrastructure. IP addresses are either dynamically assigned by the AWS network infrastructure or statically assigned by an EC2 administrator through authenticated API requests. The AWS network only allows EC2 instances to send traffic from IP and MAC addresses specifically assigned to them, or the traffic will be dropped.
> By default, AWS also protects EC2 instances by treating an instance as a standalone network host, not a router or network gateway, and drops any traffic not specifically addressed to the instance. Customers who need EC2 network appliances to run network address translation, routing, or firewall services can change this default behavior by disabling the Source/Destination Check attribute and configuring VPC route tables to send outbound traffic through the network appliance.

VPC Security Capabilities – AWS Answers https://aws.amazon.com/jp/answers/networking/vpc-security-capabilities/?nc1=h_ls

# 検証構成、検証内容
- VPC内にEC2インスタンス×2
- ICMP疎通確認
- 送信元のIPアドレスを偽装できるか確認（hpingを利用）
- 送信先のIPアドレスを偽装（？）できるか確認（ARPキャッシュを変数し、正しいMACアドレスに対して誤ったIPアドレスを指定し、パケットが宛先まで届くか確認する）

## コマンド例

### 送信元IP偽装

```sh
$ sudo hping -C 8 -a [偽装した送信元IPアドレス] [宛先IPアドレス]
```

### 送信先IP偽装（というか宛先ホストのIPアドレスではないIPアドレスに送信。MACアドレスは宛先ホスト）

要はルータ介して別のホストに送信するのと同じだけど、今回は宛先IPアドレスをVPC内のアドレスにしてみる。

```
$ sudo arp -s [宛先IPアドレス（実際には無いアドレス）] [MACアドレス（）] -i eth0
```

# 結果

- デフォルトの状態ではどちらの場合も宛先のホストには届かない
- クライアント側で送信元先チェックを無効化すれば、送信元IPを偽装したパケットは宛先ホストに届く（ただし、応答時に宛先アドレスの解決ができないため、応答には失敗する）
- サーバ側で送信元先チェックを無効化すれば、自身の宛先ではないパケットも受信できる。自身宛ではないので、自分からは応答はしない

以下結果表。チェックの列は「○」が無効化。接続性が「→」は送信には成功（応答は失敗）。
![ScreenClip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50690/b104f77d-60e6-cdb3-c74a-e8d24d64329c.png)


# 関連

VPC内におけるアドレス解決（ARP）を確認してみた（キャプチャ付き） - Qiita https://qiita.com/kure/items/d6e5a71689784dae029f
キーバインド設定

# キーバインド設定

ITエンジニアはキーボードを他の職業の人よりも多く叩くことになります。
であるなら、よりよいキーバインド設定をしておいた方が効率的、というのも自明のことです。
この記事では、私自身が紆余曲折あったうえでたどりついたキーバインド設定について紹介します。
なお、Windowsを前提にしていますが、同じようなことはMacでも可能ですので参考にしてみてください。


## 要約(優先度順)

1. 変換 / 無変換に IME ON / OFF を割り当てる
2. ホームポジション範囲に方向、HomeEnd, Enterなどを設定
3. CapsLockをCtrlに変更

<img width="835" alt="AllKeyBind.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65757/ebc8eb3f-1f9d-274e-a20a-0866d2a8f0de.png">


## 1. 変換 / 無変換に IME ON / OFF を割り当てる

<img width="835" alt="IME_ON_OFF.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65757/b26fd8a1-8c52-7d25-a845-91ea5e5a916b.png">

ITエンジニアは仕様書などの資料も多く書きますし、ソースコードでコメントを書いたりする場面などでも全角半角の切り替えを思っているより多く使います。

今の入力状態がIME ONかな？ OFFかな？と入力の都度考えなければならないのはかなりの徒労です。
試してもらえばわかりますが、私はMacを初めてつかった時以来、この入力切替以外だとまともに文字が打てなくなりました。
それほどの快適さがあります。

* Windowsデフォルトの機能で設定可能。
* Macの日本語キーボードでは最初からそうなっている
* Windows Updateでこれがデフォルトで設定されるようになるらしい。

設定方法については他の人のお書きになった完成度の高いものがありますのでそちらをご参照ください。

> [Windowsの変換・無変換キーでIMEの有効無効をMac風に操作する](https://www.karakaram.com/mac-ime)

## 2. ホームポジション範囲に方向、HomeEnd, Enterなどを設定

<img width="835" alt="AutoHotKey.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65757/80d0af35-14f5-592f-75c3-1e51f123076f.png">

vimmerの方ならわかると思いますが、ホームポジションの範囲で方向キーの入力ができるのは快適度が上がります。
タイプミス修正などでいちいちマウスに手を伸ばして、というのは結構面倒なものです。

私はAutoHotKeyというツールを使い、変換キー + 他のキー の組み合わせで、方向キーなどの入力をする設定にしています。
つまり、変換キー + hで左。変換キー + jで下。ということです。
唯一Enterだけは元のキーをつぶして、代わりに変換キーとの組み合わせで元のキーが入力できるようにしています。

この方向キーの設定はvimのものと同じですので、vim入門前にこの設定で慣れておくのもいいかもしれませんね。


### AutoHotKey 設定

```
sc079::sc079
sc079 & k::Send,{Blind}{Up}
sc079 & j::Send,{Blind}{Down}
sc079 & h::Send,{Blind}{Left}
sc079 & l::Send,{Blind}{Right}
sc079 & y::Send,{Blind}{Home}
sc079 & o::Send,{Blind}{End}
sc079 & i::Send,{Blind}{PgUp}
sc079 & u::Send,{Blind}{PgDn}
sc079 & n::Send,{Blind}{BS}
sc079 & sc027::Send,{Blind}{sc027}
sc027::Send,{Blind}{Enter}
```

`sc079` = 変換キー。
`sc027` = セミコロンキー。
`{Blind}` = 修飾キー(Ctrl,Shiftなど)をそのまま入力させる


## 3. CapsLockをCtrlに変更

<img width="835" alt="Caps2Ctrl.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65757/71496b56-a5d5-5308-83b2-3831bb63cdba.png">


これについてはよくある設定ですね。説明不要かと思います。
わたしはChangeKeyというツールで設定を変えています。




## 雑感

キーバインドの設定というのは結構な沼で、はまると抜け出せなくなってしまいます。
私はキーバインドの設定を追い求めることが楽しくなってしまい、いつしか手段と目的が逆転していることに気付きました。
`.vimrc`の沼と同じですね。
今回の記事で紹介した内容は「自分はこうしている」というだけでなく、ぜひ試してほしいと思えるものに絞っています。そして「これ以上ややこしい設定はやめといたほうがいい」というラインでもあります。
ご参考になれば幸いです。
Available configurer in HttpSecurity class

| Method in class HttpSecurity | Configurer |
| --- | --- |
| openidLogin() | org.springframework.security.config.annotation.web.configurers.openid.OpenIDLoginConfigurer |
| headers() | org.springframework.security.config.annotation.web.configurers.HeadersConfigurer |
| cors() | org.springframework.security.config.annotation.web.configurers.CorsConfigurer |
| sessionManagement() | org.springframework.security.config.annotation.web.configurers.SessionManagementConfigurer |
| portMapper() | org.springframework.security.config.annotation.web.configurers.PortMapperConfigurer |
| jee() | org.springframework.security.config.annotation.web.configurers.JeeConfigurer |
| x509() | org.springframework.security.config.annotation.web.configurers.X509Configurer |
| rememberMe() | org.springframework.security.config.annotation.web.configurers.RememberMeConfigurer |
| authorizeRequests() | org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry |
| requestCache() | org.springframework.security.config.annotation.web.configurers.RequestCacheConfigurer |
| exceptionHandling() | org.springframework.security.config.annotation.web.configurers.ExceptionHandlingConfigurer |
| securityContext() | org.springframework.security.config.annotation.web.configurers.SecurityContextConfigurer |
| servletApi() | org.springframework.security.config.annotation.web.configurers.ServletApiConfigurer |
| csrf() | org.springframework.security.config.annotation.web.configurers.CsrfConfigurer |
| logout() | org.springframework.security.config.annotation.web.configurers.LogoutConfigurer |
| anonymous() | org.springframework.security.config.annotation.web.configurers.AnonymousConfigurer |
| formLogin() | org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer |
| oauth2Login() | org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2LoginConfigurer |
| oauth2Client() | org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2ClientConfigurer |
| oauth2ResourceServer() | org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer |
| requiresChannel() | org.springframework.security.config.annotation.web.configurers.ChannelSecurityConfigurer.ChannelRequestMatcherRegistry |
| httpBasic() | org.springframework.security.config.annotation.web.configurers.HttpBasicConfigurer |
| requestMatchers() | org.springframework.security.config.annotation.web.builders.HttpSecurity.RequestMatcherConfigurer |
[Django]テンプレートファイル内で日付の表記を指定する

サイト上で時刻を表示しようと思った時に表示される形式がちょっと気に食わなかった

例えば

```python
def sample(request):
    now_time = datetime.datetime.now()
    params = {
        'now_time': now_time,
    }
    return render(request, 'sample.html',params)
```

こんな感じでsample.htmlに時刻などを送ります

sample.html内で

```html
{{ now_time }}
```
と書くと

```
2019年9月16日12:36
```

と表示されます
これ以外の形式で表示させたいことも多いと思うので今回はこれを任意の形式に変えます

以下のように書くと

```html
{{ now_time| date:"Yねん nガツ j日 a g時" }}
```

```
2019ねん 9ガツ 16日 p.m. 12時
```

と表示されます。べんり

https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#date
各文字の機能などはこのページに書かれています。結構種類が多いので日時の表示は自由自在にできそう
SQL*PlusによるOracle インスタンス・データベースの起動・停止

SQL*PlusによるOracle インスタンス・データベースの起動・停止についてまとめた。

### 1. SQL*Plusを起動、SYSDBAで接続

```sql
$ sqlplus /nolog
SQL> connect / as sysdba
```

### 2. Oracleの起動
```sql
-- インスタンスを起動し、データベースをマウントしてオープンする方法
SQL> STARTUP

-- インスタンスを起動するが、データベースをマウントしない方法
SQL> STARTUP NOMOUNT

-- インスタンスを起動し、データベースをマウントする方法（オープンはしない）
SQL> STARTUP MOUNT

-- 起動時にインスタンスへのアクセスを制限する方法
SQL> STARTUP RESTRICT

-- RESTRICTED SESSION機能を無効にする
SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;

-- インスタンスを強制的に起動する方法
SQL> STARTUP FORCE

-- インスタンスを起動し、データベースをマウントして、完全メディア・リカバリを開始する方法
SQL> STARTUP OPEN RECOVER

-- インスタンスにデータベースをマウントする方法
SQL> ALTER DATABASE MOUNT;

-- クローズしているデータベースをオープンする方法
SQL> ALTER DATABASE OPEN;

-- データベースを読取り専用モードでオープンする方法
SQL> ALTER DATABASE OPEN READ ONLY;

--データベースを読取り/書込みモードでデータベースをオープンする方法（デフォルト）
SQL> ALTER DATABASE OPEN READ WRITE;
```

### 3. Oracleの停止
```sql
-- NORMALモードによる停止（接続しているすべてのユーザーが切断するまで待機してから、データベースが停止）
SQL> SHUTDOWN [NORMAL]

-- IMMEDIATEモードによる停止（実行中のSQL文を終了、ユーザーを切断、アクティブなトランザクションを終了し、コミットされていない変更をロールバックして停止）
SQL> SHUTDOWN IMMEDIATE

-- TRANSACTIONALモードによる停止（現在のトランザクションがすべて完了するまで待機してから停止）
SQL> SHUTDOWN TRANSACTIONAL

-- ABORTモードによる停止（強制終了）
SQL> SHUTDOWN ABORT
```


>【参考資料】 [データベース管理者ガイド](https://docs.oracle.com/cd/E96517_01/admin/index.html)
Alexaでtogglのタイマーを開始する

# モチベーション
[toggl](https://toggl.com/)でタイマーを開始させるときに入力がめんどくさいことがある．
Alexaを使ってタイマーを開始/終了できるようにする．

# 概要

- 「アレクサ，トグルで{プロジェクト}の{タイトル}を開始して」でtogglのタイマーを開始する．  
- 「アレクサ，トグルで時間を止めて」でtogglのタイマーを停止する．  
- 「アレクサ，トグルで{日付}を振り返って」でその日のプロジェクトごとの時間w

# やること

- [Amazon Developer](https://developer.amazon.com/ja/) でスキルの作成  
- [AWS lambda](https://aws.amazon.com/jp/lambda/) でlambda関数の作成  

## Amazon Developer でスキルの作成 
参考→[Alexaスキル 開発チュートリアル](https://qiita.com/zono_0/items/57247bed70dbe2b3ce28)  

### 注意点
- 公開しないときは使用中の **Echoと同じアカウントを使用** する．  
  公開しなくても，スキルを使用することが可能になる．  
  **開発中のスキルが勝手にAmazon Echoにスキルが反映される**
  
### 作業  
1. スキルを作成する．(モデル: カスタム, ホスティング方法: Alexa-Hosted)
- 「スキル呼び出し名（Skill Invocation Name）」をトグルにする
- タイマー開始のインテントを作成する  
    - インテント名: startTimerIntent
    - サンプル発話: 「{project}  の {title} を開始して」
    - スロットの追加: project, titleのスロットを追加する．スロットタイプは「AMAZON.Genre」 [※困ったこと1](#困ったこと)
- タイマー終了のインテントを作成する  
    - インテント名: stopTimerIntent
    - サンプル発話: 「時間を止めて」 [※困ったこと2](#困ったこと)  
- エンドポイントに「AWS LambdaのARN」を貼り付け

## AWS Lambda でlambda関数の作成
参考→[Build an Alexa City Guide Skill in ASK Python SDK](https://github.com/alexa/skill-sample-python-city-guide)  
### 作業  
1. ロールの作成 参考→[Python による Lambda 関数のビルド](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-programming-model.html)
- Lambda関数を作成する．  
   - 一から作成を選択  
   - python 3.6を選択
   - 既存のロールを選択．作成したロールを選択
   - 関数を作成
- トリガーを追加(Alexa Skills Kit)  
   スキルIDを貼り付けて追加(Alexa Developerのスキル一覧からスキルIDを取得)
- lambda_function.py を実装して，zipにしてアップロード  
   参考→[st34-satoshi/alexa-toggl](https://github.com/st34-satoshi/alexa-toggl/tree/simple)

# 参考
- [PythonでTogglのAPIをたたく](https://qiita.com/stu345/items/abebeb2da6d97382a7b1)
- [Alexaスキル 開発チュートリアル](https://qiita.com/zono_0/items/57247bed70dbe2b3ce28)
- [Build an Alexa City Guide Skill in ASK Python SDK](https://github.com/alexa/skill-sample-python-city-guide)  
- [Python による Lambda 関数のビルド](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-programming-model.html)
- [スロットタイプリファレンス](https://developer.amazon.com/ja/docs/custom-skills/slot-type-reference.html)

# 困ったこと  
### 1. 自由な言葉に対応するスロットタイプがない

文字列にタイプを指定する必要があるが，いいタイプがなくて困る.
自由な言葉に対するおうむ返しはできない？
literalがなくなってしまった → [ユーザーの自由発話に対応する Alexa Skill を作る](https://qiita.com/halhorn/items/48998d6b7a166cc905c6)
[Migrate Slot Types that Used AMAZON.LITERAL](https://developer.amazon.com/ja/docs/custom-skills/literal-slot-type-reference.html)

AMAZON.SearchQueryはなぜかうまく使えなかった．

### 2. 「タイマーを止めて」は使わない方がいい
**タイマー** という言葉を使うと，アレクサにある他の機能を呼び出してしまうことがあるみたい
【FactoryBot】associationの使い方

##前提条件
以下を前提条件に話を進めていきます。
①以下のテーブルが存在する。
※Railsで自動で生成されるカラムは一部省略しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375365/0f6af1fe-219f-9e91-1f63-b1a17c6ea718.png)
users :ユーザーテーブル
posts:ユーザーのつぶやきを保存するテーブル
goods:いいね機能のテーブル

②Railsの関連が定義済みであること。

##associationとは
**関連するデータを一緒に作成してくれるメソッド**

例えばpostsテーブルのテストデータを作成する時に、必ずusersのデータが必要になる。
この時associationを使わない方法でテストデータを作成すると以下のようになる。


```ruby:post_spec.rb
# モデルテスト
RSpec.describe Post, type: :model do
  let(:user) { FactoryBot.create(:user) }
  let(:post) { FactoryBot.create(:post, user_id: user.id) }
end
```

このようにuserとpostの両方のテストコードを記述しなければならない。
二つだけならまだいいが、さらに関連するテーブルが増えていくと記述するのが大変。
これを解決するのがassociationメソッド。

####使い方
①factoryにassociationを記述

```ruby:posts.rb
# ポストファクトリー
FactoryBot.define do
  factory :post do
    association :user
  # factory名が違う場合以下のように記述する
  # association :user, factory: :tom
  end
end
```

②specにてデータを作成する

```ruby:post_spec.rb
RSpec.describe Post, type: :model do
  let(:post) { FactoryBot.create(:post) }
end
```
これでpostデータ作成と同時にuserデータも作成される。
さらにpostのuser_idも自動でidが入る。

##associationで作成するデータが被ってしまう場合
例えばgoodデータを作成する時、以下のようにするとuserデータが二つ作られてしまう。

```ruby:good.rb
FactoryBot.define do
  factory :good do
    # postには「association :user」が宣言されているため
    # userのデータが二つ作られることになる。
    association :post
    association :user
  end
end
```
####解決方法
これを解決するにはpostで作成されたuserを使えばいい。

```ruby:good.rb
FactoryBot.define do
  factory :good do
    association :post
    user { post.user }
  end
end
```
##まとめ
associationとは関連するデータを同時に作成するメソッド
これを使うとコードがスッキリする

ここまでご覧いただきありがとうございました。
Node.js 入門のための準備メモ

「Node.js入門」といった記事を探したときに、参考にした記事のメモです。

### Node.jsとは

[Node.js とは | Node.js](https://nodejs.org/ja/about/)
>ode.js はスケーラブルなネットワークアプリケーションを構築するために設計された非同期型のイベント駆動の JavaScript 環境です。 

むずかしいですな･･･

[初心者向け！3分で理解するNode.jsとは何か?](https://eng-entrance.com/what-is-nodejs)
>実は、JavaScriptはブラウザ上だけではなく、サーバサイドでも動く。PHPやJavaなどと同じような使い方ができるということだ。
>
>サーバサイドJavaScriptと呼ばれるが、その中でも代表的なのがNode.jsだ。現状は、他にそこまで有名なものもないので、「Node.js = サーバサイドJavaScript」だと認識しておけばいいだろう。

[Node js 入門](https://www.slideshare.net/SatoshiTakami/intoroduction-nodejs) : SrideShare
 >はじめに ■ この資料はNode.jsに上級者向けの資料ではありません ■ Node.jsという言葉は知ってるけど、詳しい事はよく知 らない初心者向けです ■ この資料を見てNode.jsが完璧に出来るようになるよう な魔法の資料ではありません 
javascriptといえばブラウザ上で実行するものという思い込みは卒業。サーバーサイドで実行するものがjavascriptで書けるのは、言語を使い分けなくても良くて、確かに便利だ。

### とりあえず実行できる環境がほしい

[Node.js入門 - 初心者向け、はじめてのNode.js入門 - paiza開発日誌](https://paiza.hatenablog.com/entry/2018/06/08/paizacloud_nodejs)
>そこで、今回はブラウザだけでNode.jsを使ったWeb開発ができるPaizaCloud Cloud IDEを使ってみます。
>
>PaizaCloudは自由度が高く、さまざまなフレームワークや言語を使ったWeb開発が、初心者でも簡単にできます。PaizaCloudを使えば、最短でNode.jsを使ったWeb開発が始められます。
>
>開発環境がクラウド上で動作しているので、自分でサーバなどを用意しなくても、作ったウェブサービスはその場で公開することもできます！

すごい簡単でした。無料だとサーバー1個24時間までだけど、とりあえず始める用途には便利。

### macで環境構築

[ダウンロード | Node.js](https://nodejs.org/ja/download/)
>Node.js のソースコードをダウンロードするか、事前にビルドされたインストーラーを利用して、今日から開発を始めましょう。

インストーラはWindows 32-bit, 64-bit, mac, linuxあり。

[MacにNode.jsをインストール - Qiita](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)
>インストールの流れ
>Homebrewのインストール
>nodebrewのインストール
>Node.jsのインストール

Node.jsの異なるバージョンを共存して切り替えながら使うことができるみたい。

その昔、Linuxのサーバー使ってオープンソースの開発してる仕事をしてたこともあるけれど、10年ほど経ってしまってすっかり忘れているなあ。サーバー構築するところからやり直したいなあと思うけれど、効率も考えて、はしょれるところははしょりながらやっていきたい。
PRがマージされたときにBitriseからインストール用QRコードをつけてSlackへ通知

[前回](https://qiita.com/powerispower/items/f8b9e358649df2e4b905)の記事でBitriseを使ってSlackに通知するまではやりました

今回はPRがマージされたときにアプリインストール用QRコードをつけてSlackへ通知するようにします

最終的にWorkflowとTriggerは画像のようになります

|Workflow|Trigger|
|--------|-------|
| <img width="559" alt="スクリーンショット 2019-09-16 11.31.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261386/be0ee981-b2c9-55ba-984e-aa10a1c99810.png"> | <img width="1440" alt="スクリーンショット 2019-09-16 11.37.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261386/42d36585-b319-f299-7a28-08da9623f792.png"> |


## Workflowにステップを追加
`Deploy to Bitrise io`の下に`Create intall page QR code`を追加します
特になにも設定は必要ないです

ちなみに各ステップを他のworkflowでも使うような場合はUtility Workflowとして切り出しておいて
`Add Workflow before`や`Add Workflow after`で追加してWorkflowを構成されるようにすると汎用性が高くて便利です
今回のWorkflowはそんな感じで作りました

参考: https://qiita.com/lovee/items/811eae37928447f06b36

## Trigger

Triggers画面を開くとPUSH・PULLREQUEST・TAGとタブがあります
PRがマージされたときに実行したいWorkflowはPUSHで設定します
PR作成時に実行したい例えばTestなどを実行する場合はPULLREQUESTでworkflowを設定します
TAGはまだ使ってないので調べてないためわかりません
参考: https://www.bravesoft.co.jp/blog/archives/4618

## 追記(Cocoapodsでライブラリを使用している場合)
冒頭の画像にもあるように`Git Clone Repository`下に`Run CocoaPods install`を追加します
私の場合は[この記事](https://qiita.com/powerispower/items/f81dbf0c8a8fa5d926e9)で説明したやり方でbundlerを使ってcocoapodsを入れているのでその前に`Install specific bundler version`を噛ませてます

このステップに関しては2点注意があります
1つ目はInstall specific bundler versionは1.0.0と1.1.2の２種類が存在します

|Install specific bundler version(1.0.0)|Install specific bundler version(1.1.2)|
|--------|-------|
| <img width="1422" alt="スクリーンショット 2019-09-16 12.07.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261386/b5f990fe-e238-8ea9-179c-fcf652659ed3.png"> | <img width="1419" alt="スクリーンショット 2019-09-16 12.07.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261386/5b775bbb-ed16-6f12-71d9-6023dbaadc9e.png"> |

1.0.0の方はGemfile.lockのファイルパスを求めてますが、1.1.2ではディレクトを求めてます

2つ目はProjectPathの設定です
Env Var > BITRISE_PROJECT_PATHですべてのワークフローにおけるデフォルトのプロジェクトパスを指定できます
おそらくデフォルトだと値がXcodeプロジェクト(.xcodeproj)になっているかと思います
ライブラリを使っている場合はここをワークスペース(.xcworkspace)にしましょう
https://devcenter.bitrise.io/jp/troubleshooting/frequent-ios-issues/


## 参考
https://qiita.com/lovee/items/cc179ec2560ac6592d28
https://qiita.com/nofrmm/items/30849ee53bdb53c882fb