OmniAICreator/Qiita-1.07M huggingface dataset:
備忘録　geogisデプロイ前

8/15
できた
違う都道府県を選択したら、それを上書きしたい。
今のままだと選んだ奴が全部積み重なってしまう

できた
最初に
var pref_geojson=new L.GeoJSON.AJAX();
で宣言しておく


できた
フォームをつけて、入力できるようにする

できた
htmlのタグ類をjavascript文字列に変換したい
javascriptからdjangoのurlにアクセスしたい
できた

できた
formを各避難所に紐づけたい
できた
入力した内容を表示

ログイン機能
formで入れた内容を削除する
formで入力した後、最初にもどらないようにしたい


8/16
sudo apt-get install libpq-dev
pip install psycopg2

sudo apt-get install gdal-bin

AttributeError: 'DatabaseOperations' object has no attribute 'geo_db_type'
'ENGINE': 'django.contrib.gis.db.backends.postgis',

rm: cannot remove 'geogis2': Is a directory
rmdir -rf geogis2
rm -rf geogis2

はりかえ
sudo ln -f -n  -s ~/geogis2/polls_nginx.conf /etc/nginx/sites-enabled/

leafletがうまくひょうじされない
css staticの所はきちんとせっていした

8/17
やること
ssh,nginx,uwsgiについて

sudo service nginx restart

uwsgi --master --socket=:8001 --plugin=python3 --chdir=/home/fumijamu1020/geogis2/ --module=geogis2.wsgi

sudo lsof -i | grep nginx
sudo kill -9 3254
sudo pkill -f uwsgi -9

8/18
<link rel="stylesheet" href="https://github.com/calvinmetcalf/leaflet-ajax/blob/gh-pages/dist/leaflet.ajax.js">
うまくいかず

css読み込んでみた
Failed to load resource: the server responded with a status of 404
多分staticがうまくいってない


8/19
static読み込めない
・DEBUG=False デプロイ
・DEBUG=True ローカル
・ALLOWED_HOST
・STATIC_URL = '/static/'
ローカルではよめた
ProgateのRailsアプリを自分のPC(ローカル環境)で再現しようとしたら、画像表示のところで詰まった

<h2>概要</h2>
ProgateのRailsアプリを自分のPC(ローカル環境)で再現しようとしたら、画像表示のところで詰まった。

<h2>開発環境</h2>

macOS catalina バージョン10.15.6

Rails 6.0.3.2

ローカル開発環境
<h2>エラーメッセージ</h2>

undefined method `image_name' for nil:NilClass
        


<h2>解決方法</h2>

それまでに投稿していたポスト( image_nameカラムを追加する前の投稿）があるため、エラーが発生しているっぽい
→全部消したらいけた

__それまでの投稿の消し方__

`rails console`

`Post.destroy_all`

これで全部削除完了！

エラーの原因になっていたレコード（image_nameというカラムが存在しないレコード）を消したら、無事に画像表示ができました。

<h2>感想</h2>

ProgateのRailsコースのアプリ(Tweetapp)を自分のPC(ローカル環境)で再現できるかな？という感じで、これまでの復習も兼ねてProgateを見ながら写経をしていたところ、全く同じように再現しているはずなのにエラーメッセージが出て混乱してました。

Progateでは起こり得なかったようなエラーが発生するので、かなり勉強になります。

<h2>（後日談)  実際に完成したアプリ</h2>

実際に完成したアプリについては、以下の記事に書きました。

https://qiita.com/tamapora/items/abab44dd099603d87f3e

<h2>参考になったページ</h2>

https://teratail.com/questions/231403
高速素因数分解 mapのfor文を回す

前計算としてエラトステネスの篩を行う
その数を振るい落とした素数を配列dに記録する

abc177 E
n個の数の中で何の素数で何回分解したかの回数をカウントする

```c++
int n;
int a[1000010];
int cnt[1000010];
int D[1000010];
//高速素因数分解
//前計算としてエラトステネスの篩を行う
//その数を振るい落とした素数を配列Dに記録する
//D[4]=D[6]=2,D[35]=5というように
//これを使えば試し割をする必要がなくなる
void sieve() {
	for (int i = 2; i < 1000010; ++i) {
		if (D[i] == 0) {
			for (int j = i; j < 1000010; j += i) {
				if (D[j] == 0) {
					D[j] = i;
				}
			}
		}
	}
}
↑d[x]:xの最小の素因数を格納する配列
sieve();
	for (int i = 0; i < n; ++i) {
		int x = a[i];
		while (x>1) {
			cnt[D[x]] += 1;
			int k = D[x];
			while (x%k == 0) {
				x /= D[x];
			}
		}
	}
```

```c++
for (const auto& kv:a) {
		ans += (kv.second)*(n - kv.second);
	}
```
Windows Server を監視する

#監視したい
やだ、ストーカーみたい

今、GCEでWindows Serverを立ててFX取引の定番であるMT4を動かしている。
MT4では自動売買のツールを動かしている。
そのため性質上、落ちると(取引できなくなると)まずい。
利確や損切りできないと非常にまずい。
もちろん手元のスマホにMT4アプリはあるものの、四六時中開いているわけでは無いので、
何かあった時にすぐには気づけない。

####よし、監視して異常があれば通知しよう。

#何を監視しよう
そこで取引できなくなる状態はどのようなものか考えた。
####①WindowsServerが落ちている
####②MT4アプリが落ちている
####③メモリまたはCPUが１００％になっている
これくらいだろうか。

心配になって検索してみると、下記記事を見つけた。
https://qiita.com/tsurumiii/items/27f22b38215e37518c7c
記事が参考にしているのは[こちら](https://www.amazon.co.jp/%E5%85%A5%E9%96%80-%E7%9B%A3%E8%A6%96-%E2%80%95%E3%83%A2%E3%83%80%E3%83%B3%E3%81%AA%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Mike-Julian/dp/4873118646/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%AA%E3%83%A9%E3%82%A4%E3%83%AA%E3%83%BC+%E7%9B%A3%E8%A6%96&qid=1599108616&sr=8-1)

#曰く、監視には６種類あると。
1.ビジネス監視
2.フロントエンド監視
3.アプリケーション監視
4.サーバ監視
5.ネットワーク監視
6.セキュリティ監視

ふむふむ。

自分が思いついた3つを当てはめるとこんな感じだろうか
①WindowsServerが落ちている
→4.サーバ監視

②MT4アプリが落ちている
→3.アプリケーション監視

③メモリまたはCPUが１００％になっている
→4.サーバ監視

3,4しかできてない！
#他の監視について考えてみる。

####1.ビジネス監視
これはいわゆるKPIなどビジネス上の指標を監視することを指している。
FXでは利益であるし、これはMT4上から確認できるため不要

####2.フロントエンド監視
Webページの表示速度を監視することを指している。
今回はWebサービスでは無い。
また、速度という意味ではFXの注文速度などが考えられるが、
これはほぼ通信回線の速度と等しいと考えられるため、5.ネットワーク監視に預ける。

####5.ネットワーク監視
ネットワークの帯域幅やレイテンシの監視を指している。
FX会社との疎通が取れるか
レイテンシが普段と比べて遅くなっていないか
が新たに監視項目になりうる。

####6.セキュリティ監視
不正アクセスなどを監視することを指している。
ログイン
が新たに監視項目になりうる。

#監視項目まとめ
####1.ビジネス監視
なし
####2.フロントエンド監視
なし
####3.アプリケーション監視
MT4アプリが落ちている
####4.サーバ監視
WindowsServerが落ちている
メモリまたはCPUが１００％になっている
→１００％になってからでは遅いので80%にする(普段は60%)。
####5.ネットワーク監視
FX会社との疎通が取れるか
レイテンシが普段と比べて遅くなっていないか
####6.セキュリティ監視
ログイン

#次回
監視項目が実際に監視できるのか、実際に監視設定してみた、をお届けします。
###これ監視しねーのかよ
などありましたらコメントいただけるととても嬉しいです。
Typescriptで実行した内容をGithub Actionsに渡して使用する

Github Actions 上で Typescript を実行して、その計算内容を Github Actions 上で使用したい時とかありますよね:santa:

# TL;DR

- Github Actions で Typescript 実行
- @actions/core の [setOutput](https://docs.github.com/ja/actions/creating-actions/creating-a-javascript-action#adding-actions-toolkit-packages) を使用

# 例

毎朝 10 時に aws のコストを取得して、aws のコストはドルなので、円に直して slack に通知

※細かい取得方法はテーマではないので省略してます

```get-aws-cost.ts
const awsCost = 100; // ドル
const rate = 106.1 // ドル円
const awsJpyBill = awsCost * JPY
```

※ awsCost や rate は [aws-sdk の CostExplorer](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CostExplorer.html)などで取得してください

上記の計算（ほぼしてないけど）を、Github Actions 上で使用したいときは`@actions/core`を使用して渡します

# 方法

`@actions/core`を使用

# 手順

1. @actions/core を package.json に追加
1. コード内から渡す
1. Github Actions 上で使用

## @actions/core を package.json に追加

```bash
npm i @actions/core -D
```

# コード内から渡す

```get-aws-cost.ts
import { setOutput } from '@actions/core';　// 追加

const awsCost = 100; // ドル
const rate = 106.1 // ドル円
const awsJpyBill = awsCost * JPY

setOutput("awsCost", awsCost) 　// 追加
setOutput("rate", rate) 　// 追加
setOutput("awsJpyBill", awsJpyBill) 　// 追加
```

# Github Actions 上で使用

```create-aws-bill.yml
name: Create AWS Bill

on:
  schedule:
    - cron: '0 1 * * *' # 毎日 am10時
  workflow_dispatch:
    branches: [master] # Githubの画面から手動でも実行できるように

env:
  SLACK_ICON: https://raw.githubusercontent.com/quintessence/slack-icons/master/images/octocat-spock-slack-icon.png

jobs:
  notify-aws-cost:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
			- uses: actions/setup-node@v1
				with:
					node-version: '14'

      - name: Install Dependency
        run: npm ci

      - name: Get AWS Cost
        id: get-bill
        run: npx ts-node get-aws-cost.ts

      - name: Slack notification
        uses: rtCamp/action-slack-notify@master
        env:
          SLACK_ICON: ${{ env.SLACK_ICON }}
          SLACK_MESSAGE: AWSのコストは ${{ steps.get-bill.outputs.awsCost }}ドル で ${{ steps.get-bill.outputs.awsJpyBill }} レートは(${{steps.get-bill.outputs.rate}})円
```

## ポイント

- ts の実行箇所に id(get-bill)を設定
- `${{ steps.<steps_id>.outputs.<setOutputで設定した名称>}}`で、ts 内で設定した値を使用することができます:santa:

## 参照

https://docs.github.com/ja/actions/creating-actions/creating-a-javascript-action#testing-out-your-action-in-a-workflow
Ubuntu でキーボードを変更する

## 問題

日本キーボードからUS配列のキーボードに変更したので ubuntu の設定をUS配列にしたい。

**うまくいかなかった（あるいは不十分な）方法**: 

```
dpkg-reconfigure keyboard-configuration
```
shift + 2 で @ ではなく " になったりして日本配列のまま。

```
setxkbmap us
```

一時的に直るけど再起動すると元に戻ってしまう。

## 解決法

1. GUI で 左下の Show applications から歯車マークの Settings
2. Region & Lauguage を選択
3. Input Souces の一番上を English (US) にする。
JavaScriptファイル参照の<script>タグの２つの配置場所

１つ目：head要素内。他のstylesheet.cssの参照のように、head要素内に配置します。

２つ目：bodyタグの閉めタグ直前に配置する。（おすすめ）
（理由）
・JavaScriptファイルを読み込んでいる間は、HTMLファイルを読み込まないため、ページのレンダリング(表示）を行わせてからjavascriptファイルを読み込むんでページに動作をつけることで表示速度を早くする。

・CSSはheadタグ中に、javascriptはbodyタグの下にまとめて記述することでわかりやすくなる。
Google Chromeでキオスクモード使うときのオプション

Google Chromeをデジタルサイネージ的に使うときに、キオスクモードを使用したがオプションに悩まされたのでそのメモ
色んなサイトを見たが、割と既に存在しないオプションが書かれていてつらい

試していないが、多分chromiumでも行ける

いろんなオプションはこのページが一応新しいっぽい (よく確認はしていない)
https://peter.sh/experiments/chromium-command-line-switches/

Windowsだとこんな感じで起動すればいいと思う
※既にChromeが起動しているとkioskモードにならないので、全部閉じた状態で実行

```
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --kiosk --disable-pinch --incognito "https://www.google.com/"
```

## ログイン時にChromeだけ出す
起動時にデスクトップすら出さずにChromeを出したいときはグループポリシーエディタで
`ユーザーの構成 > 管理用テンプレート > システム > ユーザインタフェースのカスタム設定` の値に入れておくと良い
※設定するとデスクトップ出てこなくなるので、戻したいときはCtrl + Shift + ESC (もしくはDel)でタスクマネージャー開いて、`explorer.exe` を実行すれば良い

## オプションたち
### --kiosk
キオスクモードで起動する
フルスクリーンでアドレスバーとかタブバーとか全部でなくなる。
※既にChromeが起動していると効果が無さそう

### --incognito
シークレットウィンドウで開く
キャッシュとか無効化したいときはこれつけとけば良さそう

### --disable-pinch
タッチパネルのピンチ操作(だいたいズーム)を無効化
無効化と言っても、jsからイベントとしては取れているっぽいので、ブラウザのズーム機能を無効化するものみたいな感じ

### (廃止?) --overscroll-history-navigation=0
画面を左右に引っ張ったときの「進む」「戻る」を無効化する
今試したら効果がなくなっていた。困った

cssで `overscroll-behavior` を適切に設定すれば平気かもしれない (未検証)
https://developer.mozilla.org/ja/docs/Web/CSS/overscroll-behavior

### (廃止) --disable-background-mode
バックグラウンドモードを切る (よくわからん)
6年前に廃止
https://github.com/chromium/chromium/commit/40de1ef1c6f8ed49b1995da4654917850bf63337

### (廃止) --disable-application-cache
Application Cacheを無効化する

5年前に廃止
https://github.com/chromium/chromium/commit/72240eadd2bc19b17ddee08304dafe84524466d1


## 参考にしたサイト
https://peter.sh/experiments/chromium-command-line-switches/
https://github.com/chromium/chromium
https://developer.mozilla.org/ja/docs/Web/CSS/overscroll-behavior
http://chrome.half-moon.org/43.html
+ 会社のSlackでのご意見
Symbolのプライベートテストネットを作成してみる

とりあえずちょっと時間ができたのでSymbolのプライベートテストネットを作成することからはじめたいと思います
○番煎じかもしれないが、人がやっていることをみるのと、実際にやってみるのとは違うので、兎にも角にもやってみる

# 前提環境

・Mac Book Pro
・Dockerはインストールされている
まだの人は(https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)
・gitインストール済み

# 公式ドキュメント
https://docs.symbolplatform.com/ja/guides/network/creating-a-private-test-net.html

# プロジェクトフォルダを作成
```
$ mkdir -p ~/work/symbol
$ cd ~/work/symbol
```

どこでもいいです、自分のわかり安い場所にフォルダを掘りましょう

# リポジトリをCloneする
```
$ https://docs.symbolplatform.com/ja/guides/network/creating-a-private-test-net.html
```

するとこんなファイルができているはず

```
~/work/symbol$ ls -la
total 0
drwxr-xr-x   3 raharu  staff    96  9  3 13:14 .
drwxr-xr-x  36 raharu  staff  1152  9  3 13:14 ..
drwxr-xr-x  14 raharu  staff   448  9  3 13:14 catapult-service-bootstrap
```

```
$ cd catapult-service-bootstrap
```
中をみると

```
~/work/symbol/catapult-service-bootstrap (master)$ ls -la
total 72
drwxr-xr-x  14 raharu  staff    448  9  3 13:14 .
drwxr-xr-x   3 raharu  staff     96  9  3 13:14 ..
drwxr-xr-x  12 raharu  staff    384  9  3 13:14 .git
-rw-r--r--   1 raharu  staff    305  9  3 13:14 .gitignore
-rw-r--r--   1 raharu  staff  11357  9  3 13:14 LICENSE
-rw-r--r--   1 raharu  staff   6407  9  3 13:14 README.ja.md
-rw-r--r--   1 raharu  staff   8881  9  3 13:14 README.md
drwxr-xr-x   5 raharu  staff    160  9  3 13:14 bin
drwxr-xr-x   6 raharu  staff    192  9  3 13:14 build
drwxr-xr-x  26 raharu  staff    832  9  3 13:14 cmds
drwxr-xr-x   3 raharu  staff     96  9  3 13:14 common
drwxr-xr-x   8 raharu  staff    256  9  3 13:27 data
drwxr-xr-x   4 raharu  staff    128  9  3 13:14 static-config
drwxr-xr-x   4 raharu  staff    128  9  3 13:14 utils
```

こんな感じ、このディレクトリ直下で

```
$ ./cmds/start-all
```

これで立ち上がればOK

```
$ ./cmds/start-all
Building setup-network

~ つらつらインストールが始まるけどながいのでskip

api-node-broker-0_1  | 2020-09-03 04:40:26.378015 0x00007f4757fff700: <debug> (subscribers::BrokerMessageReaders.h@89) preparing to process 1 messages from /data/spool/block_change
api-node-broker-0_1  | 2020-09-03 04:40:26.519932 0x00007f475cebd700: <debug> (subscribers::BrokerMessageReaders.h@89) preparing to process 2 messages from /data/spool/state_change

```
立ち上がればpeerの通信が始まります

![200903-0014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/0d02f5d8-bc40-f951-b468-ae9af1734042.png)


# ブラウザで確認
http://localhost:3000/chain/height

```json
{
height: "50"
}
```

これでこんなもんが帰って来れば成功

# Creating network "bootstrap_default" with the default driverとか言われる場合

```bash
$ ./cmds/start-all
Creating network "bootstrap_default" with the default driver
ERROR: Pool overlaps with other one on this address space
```

おそらくもともとdockerを使っていた人はどこかのタイミングでネットワークポートがかぶった可能性がある、
ポートを変更するか一度ネットワークを削除すればよい

```
$ docker network prune
```

これで再度立ち上げて見て欲しい。

# 所感
特につまづくことなくテストネットを作成することができた。
ドキュメント通りにできるというのはとても素晴らしいと思う。

次はテスト通過の取得を行なっていきたい所存です！
GitHubDesktopでブランチを切ってプルリクエストを作ろう！

###この記事では...
前回新規アプリをrails new で作りました。
＊[新規アプリ作成　rails new から githubで新規リポジトリ作成まで](https://qiita.com/oresenyouzaku2/items/eb6c5c66db28ae96dd1e)
今回はGitHub Desktopでブランチを切ってプルリクエストを作ります。
作業工程は、
①新しいブランチを切る（作る）。
②コミットをしてプルリクエストを作る。
になります。

####①新しいブランチを切る（作る）
まずGitHubDesktopを起動します。
上部の黒い部分の真ん中にある「CurrentBranch」の横にある三角を押す
![スクリーンショット 2020-09-03 12.19.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426675/96c55e58-8392-7850-1184-6cba801afb44.png)
次に「NewBranch」を押して出て来た小窓の「Name」にブランチ名を入れて下部の「CreateBranch」を押せば新しいブランチが出来ちゃいます。
![スクリーンショット 2020-09-03 12.21.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426675/478e8243-c968-c155-5c2e-591c8f4854ec.png)


####②コミットをしてプルリクエストを作る

GitHubDesktopの横の辺りにある青いタブが「publish Branch」になったと思います。それを押したら次は何らかのコードを記述してコミットし、pushします。すると横の青いタブが「Create Pull request」になったと思います。
![スクリーンショット 2020-09-03 13.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426675/e39b5a19-a08b-c546-be1f-ad0edde87e4f.png)

そこ押すとブラウザからGitHubのこの様なページに移動します。
![スクリーンショット 2020-09-03 13.11.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426675/1319d694-2111-98f7-e1e1-19cd298604a7.png)そこできちんとしたプルリクエストを書きましょう。
![スクリーンショット 2020-09-03 13.18.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426675/44976f95-2b97-6724-af3f-8c2d69ccb8dc.png)

＜プルリクエストの書き方については下記の記事などを参考にしてください＞
＊[チーム開発におけるプルリクの法](https://qiita.com/ikuwow/items/fb52a54c086398eb5b92)

`グーグル先生に[プルリクエスト　書き方]と質問してみよう！`

書けたら右下にある緑色の「Create pull request」を押しましょう。
![スクリーンショット 2020-09-03 13.33.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426675/08edb142-285d-ebad-63f9-ed00d0f425f3.png)


そうすればこの様な画面になっているはずです。
ここまで出来ればこの記事の全工程は完了です！

私の備忘録的な要素が大きいですが今回の記事も誰かの役に立てば幸いです。
では失礼します。
ディレクティブ集

#v-once
これだとhello worldが書き換わってしまう

```
<div id="app">
  <p>{{message}}</p>
  <p>{{sayHi()}}</p>
</div>

new Vue({
	el:'#app',
  data:{
  	message:'Hello world'
  },
  methods:{
  	sayHi(){
    this.message='Hello vuejs'
    return 'Hi'
    }
  }
})
```
そんなとき、一度だけの変化で留めておきたいときは

```
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <p　v-once>{{message}}</p>
  <p>{{sayHi()}}</p>
</div>

new Vue({
	el:'#app',
  data:{
  	message:'Hello world'
  },
  methods:{
  	sayHi(){
    this.message='Hello vuejs'
    return 'Hi'
    }
  }
})
```

#v-html
#v-bind:             省略して:だけでもok
#v-on
イベント一覧
https://developer.mozilla.org/ja/docs/Web/Events

#キー修飾
v-on:keyup.enter

#v-onの短縮
＠

#v-model
```
<div id="app">
  <input type="text" v-model="message">
  <h1>{{message}}</h1>
</div>

new Vue({
	el:"#app",
  data:{
  	message:'こんにちは'
  }
})
```
必須システムサービス

<h2>システムクロックの設定</h2>
>システムクロックとハードウェアクロック

　Linuxカーネル内で保持するシステムクロックは、起動時にコンピューターのハードウェアクロックを参照するものの、その後は別々で動くため乖離していきます.***date***コマンドでシステムクロックを表示できます.***date[MMDDhhmm[[CC]YY][.ss]]***でシステムクロックを修正し、***hwclock***コマンドでハードウェアクロックに反映できます.

<h2>システムログの設定</h2>
> rsysylogの設定

　システムのログを取得して処理するソフトウェアにはrsyslogやsyslog-ngなどが挙げられます.etc/rsyslog.confファイル内に以下のフォーマットで記載します.ログは追記される一方なので、ローテーション機能（/etc/logrotate.conf内で設定を記載）を用います.

　書式　***[ファシリティ].[プライオリティ]　[出力先]***
　　ファシリティとプライオリティをまとめてセレクタフィールドといいます.
　　ファシリティ：daemon, kern,mailなど.[*]の指定も可能.
　　プライオリティ：低く設定するとログ出力数が少なくなります.（emerge⇒alert⇒crit⇒err⇒warning⇒notice⇒info⇒debug⇒none）
　　出力先：/var/log/message（ログファイルに出力）、[*]（ログイン中のすべてのユーザーの端末に出力）
　

<h2>メール管理</h2>
>MTAの起動

　電子メールを扱うソフトウェアにはMTA（Message Transfer Agent）など幾つか種類があるため、25番ポート調べることで把握できます.
　構文　***netstat -atnp | grep 25***

[root@www /]# netstat -atnp | grep 25
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2014/master


<h2>プリンタ管理</h2>
>
印刷の仕組み

　多くのLinuxディストリビューションでは、印刷サブシステム（CUPS）を採用しています.特徴としては、①IPP（InternetPrintingSystem、ネットワーク上のプリンタをサポートするプロトコル）、②PPD（PostScriptPrinterDescription、AdobeのPPD形式のファイルでデバイスドライバの設定が可能）などが挙げられます.
　印刷するには、まずは***lpr [オプション][ファイル名]***：オプション（-#部数、-Pプリンタ名）で指定したファイルをプリントキューに送り、順に処理していきます.***lpq [オプション][ユーザー名][ジョブ番号]***：オプション（-Pプリンタ名）でプリントキューの内容を表示できます.***lprm [オプション][ジョブ番号]***：オプション（-Pプリンタ名、-）でプリントキューのジョブをすべて削除できます.
AWS Glueジョブで変換後のファイルが複数出来る際に見るページ

# はじめに
AWS Glueジョブ実行後の結果を見ると、複数ファイルが出来てしまいました。
1つでいいんだが！と思い、1つにまとめる方法について調べました。

# repartitionをしよう
`DynamicFrame`でも`DataFrame`でも同じやり方でOKです。
どちらのクラスにも`repartition`という分割し直しをしてくれるメソッドがあり、それを使うことで変換後のファイルもその数で出力してくれます。

自動生成したスクリプトを修正した例を載せておきます。

``` python
glueContext.create_dynamic_frame.from_catalog(database = "default", table_name = "data_source", transformation_ctx = "datasource0").repartition(1)
```

分割したい数は指定可能なので、もっと分割したいよということであれば数字部分を変更してください。
グローバルインストールを迫ってくるライブラリでもローカルにインストールした方がいい理由

## 概要

例えば、ReactNativeの開発に必要な[Expo CLI](https://docs.expo.io/workflow/expo-cli/)は、[インストール方法](https://docs.expo.io/workflow/expo-cli/#installation)で以下のようにグローバルインストールを迫ってきます。

`npm install -g expo-cli`

例としてExpo CLIを挙げましたが、他にもグローバルインストールを勧めてくるライブラリはよく見かける気がします。

## グローバルインストールの何が問題なのか

大きく2つの問題が存在します。

### 1. 他の人がインストールする時に手順が不明になる

複数プロジェクトをかけ持つ場合など、環境構築手順を明文化したりコード化する場合に何をどのようにインストールする必要があるかが不明瞭になってしまうため（気づかないうちにグローバルインストールしたライブラリに依存していたりする可能性もあるため）、チーム開発や個人でも並行して開発する場合に大きな問題を生む種になります。

### 2. バージョンの管理ができない

仮にA, B2つのプロジェクトでグローバルインストールしたライブラリを使うことを考えます。
Aでは`1.0.0`, Bでは`2.0.0`のライブラリを使わなければいけない場合に、ライブラリをグローバルインストールしてしまうと、プロジェクトを切り替えるたびに正しいバージョンを更新する必要が出てきてしまいます。しかも手動で。人力を経てしまうため、忘れてしまうことや、ミスをする可能性などが生まれ危険です。

このような問題があるため、可能な限りライブラリはローカルインストールをした方が良いです。

## ローカルインストールの方法

以下は`yarn`を使った例ですが、例えば`expo-cli`だと

`yarn add expo-cli --dev` としてインストールします。

この後、インストールしたプロジェクト内では`yarn expo --version`などとしてコマンドを利用することができるようになります。

グローバルインストールした場合と比較して、コマンドを実行するのに`yarn `が余分に必要になりますが、上記2点の大きな問題を解決することができるため開発者全員にお勧めしたい方法です。

## おわりに

開発は1人で行う場合でも、複数プロジェクトの開発をすることも見越して、なるべくグローバルインストールが必要なライブラリは避けた方が良いです。ぜひ何も考えずにグローバルインストールを行ってきた方は、これを機会に、可能なものはローカルインストールに切り替えてみてください。
【GCP】Cloud DNSについて

権威サーバの構築もできそう。

https://wa3.i-3-i.info/word16240.html
https://www.infoq.com/jp/news/2019/01/google-cloud-dns-forwarding/
https://cloud.google.com/dns?hl=ja
https://beyondjapan.com/blog/2018/01/cloud-dns/
https://cloud.google.com/dns/docs/best-practices-dns?hl=ja

他社との比較がここにまとまっている
https://cloud-textbook.com/58/

社内DNSのフォワード先として使えるかがわからない
https://www.atmarkit.co.jp/ait/articles/1510/15/news038.html
⇓
このへんに載ってて以下で実現可能
・転送ゾーンを作成する
・CloudDNS送信サーバポリシーを作成する
https://cloud.google.com/dns/docs/policies?hl=ja
https://cloud.google.com/dns/docs/zones?hl=ja
https://cloud.google.com/dns/docs/overview?hl=ja

===

フォワードについて
https://wa3.i-3-i.info/word12573.html
https://jprs.jp/glossary/index.php?ID=0198
AWS Glueジョブが毎回データ元を全部読み込むから重複データが出来まくりなのをやめたい

# はじめに
AWS Glue便利ですね！
Athenaのパーティション使いながら元データ加工してInsertが簡単に出来ちゃうので、ビックデータ扱うのには便利です。
でも、何も考えずに設定すると全ファイルを毎回読み込むため、ジョブを実行するたびにデータが重複していきます。

なので、前回までの処理を記憶して、新規ファイルだけジョブ実行してもらうための設定を記載します。

# 削除は出来なさそう。更新も出来ない
基本的にAthenaはInsertしか出来ません。
UpdateだったりDeleteだったりは出来ません。
Deleteはファイルだったり行消しちゃえばできるといえばできるので、正確ではない表現です。

# ジョブブックマークを設定するのです
ジョブ作成する際に`詳細プロパティ`内にある`ジョブブックマーク`を有効化するだけです。
こうすることで処理済みデータを記憶してくれるので、実行済みのデータは無視するようになります。

# 参考URL
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/monitor-continuations.html
https://stackoverflow.com/questions/46228253/aws-glue-to-redshift-is-it-possible-to-replace-update-or-delete-data
Rails generate model の命名規則について

# 内容
こちらの記事を参考にしました。
https://qiita.com/seri1234/items/8ca4b52d82390929195f


スネークケースで以下のようにモデルを作成したところ

```ruby
rails g model model_name # model_nameがモデル名
```
ファイル名も`model_name.rb`のようにスネークケースだったので、モデルクラス名も同じ表記かと思ったら`ModelName`とキャメルケースだったのでそれに気がつかず作業してたらエラーが発生してしまいました。今後も間違えることが無いようにメモします。

# モデルの命名規則
####  複数の単語で命名する場合(model nameの例)

|  名称  |  例  | 詳細 |
| ----  | ---- | ---- |
|  モデル名   |  ModelName  | 先頭は大文字で単数系 |
|  モデルファイル名  |  model_name.rb  | 先頭は小文字で単数形 |
|  テーブル名      |  models  | 先頭は小文字で複数形 |

こちらも参考にしています。
https://railsdoc.com/model
C#のusingとnamespaceとは？

C#でHello Worldしたときに、`using`とか`namespace`って何？と思ったので書いておきます。
既にC#の環境がある方は最初の[準備]は飛ばしてください。

# [準備]C#でHello Worldを表示する
まずは、C#の動作環境を整えます。
VS Codeと.NET Core SDKを使いました。
（環境のセットアップは https://qiita.com/555443/items/55bfe07b45477bfc6e3a を参照）

コンソールで`dotnet new console `を実行すると以下のコードが生成されました。

```C#:Program.cs
using System;
namespace Sample
{
   class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}
```

そして、`dotnet run`を実行すると`Hello World!`と無事に表示されました。

# それぞれ何をしているのか
では、本題のusingとか、namespaceって何なのかを見ていきましょう。
## namespace
C#のプログラムの構造は、外側からネームスペース、クラス、メソッド、変数…という形で構成されています。つまり、各クラスは一つのネームスペースに属していると言えます。また、今回の`class Program`はnamespaceがSample内で定義されているということですね。ネームスペースを指定するというのは、他のネームスペースにある同じクラス名と混ざらないようにする仕組みなのです。
（以下の画像は [@IT / 連載：C#入門](https://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_002/csharp_abc01.html) より引用）
> ![C#プログラムの構造](https://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_002/csharp_struct.gif)

## using
上記でネームスペースの役割を述べました。では、usingの役割はというとそのプログラム内で用いるネームスペースを宣言することです。
プログラム内で`Console.WriteLine("Hello World!")`を使って何気なくHello World!の出力が実現されていますが、プログラム内にConsoleクラスやWriteLineメソッドは宣言されていません。しかし、`using System;`によってSysteのネームスペースの利用を宣言することで、その中ではSystemのネームスペースに存在するクラスを利用することができるのです。

---

参考記事
[Visual Studio Codeを使い、C#の開発環境を途中まで整える](https://qiita.com/555443/items/55bfe07b45477bfc6e3a)
[第2回　ネームスペースとクラス](https://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_002/csharp_abc01.html)
【Swift】UIViewの一部だけを角丸にする方法

## はじめに
Viewやimageの一部だけを角丸にりする方法を説明します。
**iOS11未満だと実装方法が違うので注意**

## 実装方法
例えばViewの右側だけ角丸にする

```swift:ViewController.swift
override func viewDidLoad() {
    super.viewDidLoad()
    sampleView.layer.cornerRadius = 8
    sampleView.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMaxXMinYCorner]
}
```
![kadomaru.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/e637c00c-8ad0-b755-2c09-e8d6d4c2f75a.png)
maskedCornersでどの場所を角丸にするか指定しています。

## Viewの上だけを角丸にする

```swift:ViewController.swift
override func viewDidLoad() {
    super.viewDidLoad()
    sampleView.layer.cornerRadius = 8
    sampleView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
}
```
![topkadomaru2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/3e16516e-e38f-95a1-43d0-97d0cf149f6f.png)
## Viewの下だけを角丸にする

```swift:ViewController.swift
override func viewDidLoad() {
    super.viewDidLoad()
    sampleView.layer.cornerRadius = 8
    sampleView.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]
}
```
![sitakadomaru.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/7582bd6e-677d-4e3f-6188-69bb176b1845.png)


| 角丸になる場所 | 指定方法 |
|:----------:|:----------:|
| 左上| layerMinXMinYCorner| 
| 左下| layerMinXMaxYCorner| 
| 右上| layerMaxXMinYCorner|
| 右下| layerMaxXMaxYCorner|

指定する場所を変えることで好きな場所を角丸にすることができます。

## 全て角丸にする方法
一応こちらもかいておきます。

```swift:ViewController.swift
override func viewDidLoad() {
    super.viewDidLoad()     
    sampleView.layer.cornerRadius = 8
}
```

参考になったと思ったらLGTMくれると嬉しいです！
Juliaでのジェネリクス的な関数の書き方(Parametric Methods)

# tldr
https://docs.julialang.org/en/v1/manual/methods/#Parametric-Methods

# 困ったこと

- TS, Scala, Kotlinっぽくジェネリクス（型引数）を書いたら意味不明なエラーが出る（UndefVarErrorとか言うから使う側のエラーかと思ってた）
- そもそもジェネリクス相当の機能の名前がわからなかった

# 答え

**Parametric Method**というらしい。
宣言の前半にジェネリクス宣言をする言語が多いので、珍しい後置型の宣言だ。

```julia
  function first(v::Vector{T})::T where {T}
```
# 慣れ親しんだ諸言語での書き方

## Javaの総称型(Generics)
初めて触ったジェネリクスはこれ。久々なので、文法が怪しかった。
参考 https://www.ne.jp/asahi/hishidama/home/tech/java/generics.html#h2_method_T

```java
  public static <T> T first(T[] arr) { 
```

## Scalaの型パラメーター(Type Parameter)
型パラメーターは引数らしい語順で宣言するので、一番しっくり来る気がする。`[]`を使うのが独特。

```scala
  def first[T](arr: Array[T]): T = 
```

# Kotlinのジェネリック関数
```kotlin
  fun <T> first(arr: Array<T>): T {
```

# Typescriptのジェネリック関数
意外にもScalaとそっくりな語順になっている。

```ts
  function first<T>(arr: Array<T>): T {
```

無名関数（ラムダ式）にもジェネリクスがつけられるのが、地味にありがたい。

```ts
  const first = <A>(a: A[]): A => a[0]
```

# その他の言語
有名所ではRustのジェネリクス、C++のテンプレート、Haskellの型引数などがあります。
（困っている人に見つけられるように類義語を列挙しています）
Kotlin/JSでもサーバーサイドしたい！

こんにちは、マヤミトです。
今回はKotlin/JSとkotlinx-nodejsを使ってサーバーを立てる簡単なサンプルを作ってみました。

# kotlinx-nodejsの紹介
kotlinx-nodejsは、Node.jsのAPIのKotlinラッパーを提供します。TypeScriptでいう `d.ts` ファイルがまとまっていると考えるとわかりやすいかもしれません。
https://github.com/Kotlin/kotlinx-nodejs



# 導入

`build.gradle` に依存を追加し、targetをnodejsにします。

```gradle:build.gradle.kts
repositories {
    mavenCentral()
    jcenter() // 追加
}

dependencies {
    implementation(kotlin("stdlib-js"))
    implementation("org.jetbrains.kotlinx:kotlinx-nodejs:0.0.7") // 追加
}

kotlin.js {
    nodejs() // 追加
}
```


# 簡単なhttpサーバーを書いてみる
リクエストが来たらそれのurlとmethodを返すだけの簡単なサーバーを書いてみます。

```kotlin:main.kt
fun main() {
    val server = http.createServer { req, res ->
        res.write("url: ${req.url}\n")
        res.write("method: ${req.method}")
        res.end()
    }
    server.listen(8080)
}
```

Node.jsでサーバーを書いたことのある人ならわかるかもしれませんが、用意されている関数の使い方などはほぼ変わりません。私はNode初心者ですが、JavaScriptで書かれたサンプルをほぼそのままKotlinに書き換えることができました。

# サーバーの起動
ターミナルで

```
./gradlew nodeRun
```

を実行すると、指定したポート(今回は8080)でサーバーが起動します。
実際にcurlで叩いてみるとこんな感じです。

```
curl -X GET localhost:8080/hoge
url: /hoge
method: GET

curl -X POST localhost:8080/hoge
url: /hoge
method: POST
```

# JSへのビルド
Gradle経由ではなく、JSのファイルを吐き出してnodeコマンドで実行したい場合、追加でいくつか設定が必要です。

まず、 `build.gradle` に `webpack-node-externals` の依存を追加し、ターゲットにbrowserを追加します。

```gradle:build.gradle.kts
dependencies {
    implementation(kotlin("stdlib-js"))
    implementation("org.jetbrains.kotlinx:kotlinx-nodejs:0.0.7")
    implementation(npm("webpack-node-externals", "2.5.1")) // 追加
}

kotlin.js {
    browser() // 追加
    nodejs()
}

```

プロジェクトルートの `webpack.config.d` ディレクトリの中に `webpack.config.js` ファイルを以下の内容で作成します。

```js:webpack.config.js
var nodeExternals = require('webpack-node-externals');
config.target = 'node';
config.externals = [nodeExternals()];
```

ターミナルで

```
./gradlew browserWebpack
```

を実行すると、 `build/distributions` 以下にビルド後のJavaScriptのファイルが生成されます。デフォルトだと生成されるファイル名は `プロジェクト名.js` ですが、任意の名前に変更したい場合は以下の内容を `build.gradle` の `webpackTask` に追加します。

```gradle:build.gradle.kts
kotlin.js {
    browser {
        webpackTask {
            outputFileName = "main.js" // 生成したいファイル名
        }
    }
    nodejs()
}
```

生成されたJavaScriptのファイルは、nodeコマンドから実行することができます。

```
node main.js   
```

# まとめ

- Kotlin/JSでもサーバーサイドはできる
- JSを吐き出したいときにはターゲットをブラウザにしてWebpackでビルドするという直感に反する作業が必要

情報が少なかった割には意外とすんなりできてしまいました。Kotlin好きの皆さんもぜひ一度試してみてください。

今回のサンプルコードは自分のGitHubにて公開しているのでよかったらどうぞ。
https://github.com/yt8492/KotlinOnNodeJSSample

# 参考
https://github.com/Kotlin/kotlinx-nodejs
https://saku.io/build-for-node-runtime-using-webpack/
ruby でwild card(**)を指定したときの挙動



# ワイルドカード

大した話ではないんですが，少し悩んだのでメモです．

'\*\*'のワイルドカードって便利ですよね．ところが，rubyでoptionsにそれを渡すと挙動がおかしくって．


# 誰が展開するか？

shellです．だからfishは'\*\*/'を受け取ってくれますが，bashはダメです．では，rubyは？


# 二つの正しい方法


## ruby hage.rb **\*/hoge.**

って書いたときは，fishがあらかじめ展開してくれます．

```ruby
p ARGV[0]
p ARGV
> ruby bin/calc_site_ks.rb **/d_ein*.o*
"double_new_model/vol_098/d_ein_098.o22192"
["double_new_model/vol_098/d_ein_098.o22192", "double_new_model/vol_100/d_ein_100_0_24.o22179", "double_new_model/vol_100/d_ein_100_24_44.o22180", "double_new_model/vol_102/d_ein_102.o22194", "double_new_model/vol_104/d_ein_104.o22195"]
```


## ruby hage.rb '**\*/hoge.**'

って書くと展開しません．

```ruby
> ruby bin/calc_site_ks.rb '**/d_ein*.o*'
"**/d_ein*.o*"
["**/d_ein*.o*"]
```

ですんで，このあとDir.glob(ARGV[0])とかで展開させます．

普通のcommandの使い方ではクオートで括らないんで，そのまま展開されます．その場合は，optionの順序とか大事ですね．optparseとかthorとかまで使うんやったら気をつけますが，普段使いのcommandでは少し注意が必要かも．


# 仕様

[rubyの起動](https://docs.ruby-lang.org/ja/latest/doc/spec=2frubycmd.html)にはそこらの仕様も明記されています．曰く，

> argument に指定した文字列は組み込み定数 Object::ARGV の初期値として設定されます。標準のシェルがワイルドカードを展開しない環境 (Win32)では、Ruby インタプリタが自前でワイルドカードを展開して Object::ARGV に設定します。この場合ワイルドカードとして \`\*', \`?', \`[]', \`\*\*/' が使用できます。Win32 環境で、ワイルドカード展開を抑止したい場合は引数をシングルクォート(') で括ります。



------
 - **source** ~/git_hub/ruby_docs/chart_style_ruby/wild_card.org
Windows10でcronのような定期実行を実現

本記事では、Windows 10でWindows Subsystem for Linuxなどの機能を使用せず、
Windows 10のデフォルト機能しか使用しない前提の話です。
あくまでも個人的なメモ程度ですが、ご参加になれば幸いです。

## 環境

- Windows 10 Pro 1903
- XAMPP（PHP5.6）
- XAMPP（PHP7.3）

## やり方

- 実行したいコマンドをbatファイルとして作成
- そのbatファイルをバックグラウンドで実行するためにvbsファイルを用意
- 上記vbsファイルを定期実行するためにWindowsのタスクスケジューラを設定

## 詳細

Windows上のXAMPP環境で開発を行っているため、時々サーバー上のようにバッチ処理を行いたいが、
Windows標準機能ではLinuxのcrontab機能がないため、それっぽく定期的に定期実行をする方法を考えました。
### 実行例
##### C:\crontest\addTime.php

```addTime.php
<?php
require 'vendor/autoload.php';
use Carbon\Carbon;

// time.txtに現在時刻を追記する
$textfile = 'C:\crontest\time.txt';
$contents = file_get_contents($textfile);

date_default_timezone_set('Asia/Tokyo');
$contents .= Carbon::now()->format('Y-m-d H:i:s')."\n";

file_put_contents($textfile, $contents);
```

（上記例ではCarbonを使用しているが、個人の好みです。
　日付時刻の処理はCarbonのほうが直感的な表現ができると思うからです。）
　
####実行したいコマンドをbatファイルとして作成
##### C:\crontest\addTime_command.bat

```addTime_command.bat
C:\xampp73\xampp\php\php C:\crontest\addTime.php
```

※　phpを例として、上記のように同一Windowsの配下に複数バージョンをインストールしている場合、
　　実行したいバージョンのphpのディレクトリを指定してください。

####そのbatファイルをバックグラウンドで実行するためにvbsファイルを用意
##### C:\crontest\addTime_batch.vbs

```addTime_batch.vbs
Set ws = CreateObject("Wscript.Shell") 
ws.run "cmd /c ""C:\crontest\addTime_command.bat""", 0
```

※ 引数でウィンドウスタイルを設定します。 0は「ウィンドウを隠す」という意味です。

#### 上記vbsファイルを定期実行するためにWindowsのタスクスケジューラを設定

Windowsメニュー
　→Windows管理ツール
　　→タスクスケジューラ

もしくは
Windowsアイコン右クリック
　→ファイル名を指定して実行する
　　→taskschd.msc

![task01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357404/c7174486-7cd1-c3bb-0af5-a2e0b1ddff31.png)

![task02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357404/e4a16dc6-f29d-946b-cb1a-e9618e49b1d6.png)
操作ペインの「タスクの作成」を選択すると「タスクの作成」画面が表示されます。
適当に名前などを付けてください。


![task03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357404/3c0c7cbf-e451-6065-fc41-09a261022db5.png)

トリガータブを選択し、「新規」ボタンを押すと「新しいトリガー」画面が表示されます。
タスクの開始を「スケジュールに従う」、どのぐらいの頻度で実行するかは自由に調整してください。
本例では1分間間隔で設定。
設定を「１回」、繰り返し間隔を「1分間」、継続時間を「無期限」に設定します。
（プルダウンメニューの中には1分間の選択がないのですが、手入力が可能です。）
![task04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357404/12ac847e-c263-50b2-7384-4c51f033eb06.png)

操作タブを選択し、「新規」ボタンを押すと「操作の編集」画面が表示されます。操作を「プログラムの開始」とし、プログラム／スクリプト欄に「wscript.exe」、引数の追加欄にはvbsのパス名(C:\crontest\addTime_batch.vbs)を記入します。
パス名に空白を含む場合はパス名を "～" でくくってください。

最後にOKボタンで、タスクの作成完了となり、定期実行が開始されます。
次回タスク実行時刻、前回の実行時刻、前回の実行結果（成功/失敗）などについては、
タスクスケジューラで確認することが可能です。

## 実行結果

##### C:\crontest\time.txt

```time.txt
2020-09-03 12:15:00
2020-09-03 12:16:00
2020-09-03 12:17:00
```


## 最後に
繰り返し処理ができると言っても、設定の方法はcronの指定方法とだいぶん違いますね。
一応Laravelのスケジューラを実行する際にはこういう風に設定すれば良いと思います。
もっと細かく設定したい場合は、別途cron機能があるソフトをインストールするか、
Windows Subsystem for Linuxをダウンロード・有効にしてcronで設定してみてください。

以上、お役に立てればうれしいです！
formatみたいな簡単な仕事は、CIに自動でやらせよう！GitHubActionsなら簡単だよ！

pullしたとき、formatをかけ忘れたものが紛れ込んで降ってきて、手元で差分が出て嫌な気持ちになったりした経験、ありませんか？
開発してcommitしてpushしたあとで、formatをかけ忘れていたことに気づいた経験はありませんか？
新しい開発環境で、pre-commitを入れ忘れる人が、一人もいないと言い切れますか？
*「formatがかかってないものはマージできないようにしよう！」*
そのあと、"fix fmt"なんてcommit messageでpushしたりしてませんか？
その仕事、本当にあなたがやるべき仕事ですか？
(書いててグサグサ自分に刺さる・・・)
CIでできる仕事はCIに任せましょう！

## GitHubActionsについて

GitHubが提供する、公開リポジトリなら**無料**のCIです。
インフラを用意する必要もなく、アカウント登録もGitHubなので必要ないです。
(GitHubのアカウントの登録はもちろん必要です)
CIの管理もGit上でやります。
(ブランチ戦略によっては合わないかもしれない？)

大きなメリットとして、*GITHUB_TOKEN*という、pushしたりPRを作ったりできる権限を持った、GitHubが管理しているTOKENを使えます。
リポジトリを見れたりPRを触れる権限を持ったTOKENの管理って、考えなきゃいけないことも多くて結構大変ですが、全てやってくれるので安心です。

## やったこと

### やりたいこと

- formatが間違ってるコードがPRになっていたら、formatを直すPRを作る
- 開発者は、作られたPRのマージボタンを押すだけで、formatが正しく直る

### できたもの

![](https://i.imgur.com/J93HDN4.png)

[こんな感じ](https://github.com/dev-hato/hato-bot/pull/202)で、自動でPRを作ってくれて、開発者はマージするだけでいいシステム。

### ソースコード

https://github.com/dev-hato/hato-bot/blob/dde269f0da6e9a725288da8b64b1bd65894ea8f5/.github/workflows/pr-test.yml#L11-L159

いろいろやってるので、少々わかりにくいですが、やってることをまとめると、

- [ソースコードを持ってくる](https://github.com/dev-hato/hato-bot/blob/dde269f0da6e9a725288da8b64b1bd65894ea8f5/.github/workflows/pr-test.yml#L19)
- [formatをかける](https://github.com/dev-hato/hato-bot/blob/dde269f0da6e9a725288da8b64b1bd65894ea8f5/.github/workflows/pr-test.yml#L51-L57)
- [差分があるかどうかを判定する](https://github.com/dev-hato/hato-bot/blob/dde269f0da6e9a725288da8b64b1bd65894ea8f5/.github/workflows/pr-test.yml#L58-L62)
- [差分があればcommit,pushしてPRを作る](https://github.com/dev-hato/hato-bot/blob/dde269f0da6e9a725288da8b64b1bd65894ea8f5/.github/workflows/pr-test.yml#L63-L114)

といった感じです。
(commit hashを執筆時点のコードで固定化してますが、最新はもっといろいろやってるかもしれません)

## 起こった(起こりかけた)問題と解決

### PRが大量にできてしまうので、force pushして無理矢理消す

PushのたびにformatしてPRを作っていると、一つのPRにいくつものformat修正のPRができてしまいます。
そこで、同じブランチには一つのformatするbranchしか作らないようにして、そこにforce pushすることで、常にPRは一つになるようにしています。

### 手元でformatをかけると、PRが残ってしまう

いくらformatの指摘を自動でしてくれるとはいえ、指摘を読む前に手元で直してしまうこともあります。
その際はPRをCloseすることにしています。

### 意図しないPRまで消される

上記PRを消してくれる機能ですが、バグっていて、全然関係ないPRもCloseされてしまう事故が発生しました。
GITHUB_TOKENでPRを作るなどの作業をした場合、user_idとしては `41898282` の固定値になるみたいなので、この値を判定に用いました。

### formatterがバグったらどうする？

formatterがバグってて、意図しない変更まで入れてくる可能性があります。
なのでPRという形で、自動で作られたPRも一度目を通すことを推奨しています。
(もうちょっと実績を積んで、任せられるってなったら、自動マージもしてしまえるかもしれませんね)

## 未解決の問題

### FORK先からのPRでは動かない

GITHUB_TOKENはFORK先からのPRでは書き込み権限がありません。
https://github.community/t/optional-read-write-permission-for-forked-repos/16330/2
なので直接pushしてブランチを作ってもらうことで、一旦の解決としています。
別でTOKENを発行したりすればできるかもしれませんが、無用なリスクを負う必要はないと考えています。

## 終わりに

優秀な開発者の[鳩さん@massongit](https://github.com/massongit)とこのツールを作る機会を作ってくれた[なっかあちゃん@nakkaa](https://github.com/nakkaa)に感謝します。

自動チェックで単純な指摘をする仕事から解放されたあとは、自動fixで単純な直せるものは勝手に直してくれる世界が来ると信じています。
Vue.js　双方向バインディングをさらに学べたぜぇぇぇ

##v-modelとは
以下の記事でも紹介してますので、ぜひご参考に。
簡単にいうと、**「dataを更新すれば HTML が更新されて、 HTML を更新すれば data が更新される」**ようにしてくれる機能のこと。
https://qiita.com/ashketcham/items/4851e58a8e57a04a9bf2#%E5%8F%8C%E6%96%B9%E5%90%91%E3%83%87%E3%83%BC%E3%82%BF%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0v-model



##全角入力だとリアルタイムに描画されない問題

とりあえず代表的なv-modelの記述。

```ruby:qiita.html
<div id="app">
    <input type="text" v-model="name">
    <h1>好きな海外ドラマ：{{ name }}</h1>
</div>
```


```ruby:qiita.js
new Vue({
    el: '#app',
    data: {
        name: ""
    }
})
```


こんな感じでinputに入力した内容が`{{}}`（口髭構文）内に描画される。

![breaking.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653956/61e4491c-4240-2488-ad9d-bae616a69068.gif)


**しかし！！！！**
全角で入力しようとしても、エンターキーを押すまで反映してくれないのだ。。。。


![全角.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653956/72d56578-93aa-0771-2d4c-670b2a041616.gif)


##こんな時はv-onでイベントをハンドリングしてやる！！！


```ruby:qiita.html
<div id="app">
    #v-modelの代わりにv-onでinputの操作を検知させ、inputメソッドで処理を行わせる
    <input type="text" v-on:input="input">
    <h1>好きな海外ドラマ：{{ name }}</h1>
</div>
```


```ruby:qiita.js
var app = new Vue({
    el: '#app',
    data: {
        name: ""
    },
    methods: {
        input: function($event) {
            #inputされた値をそのままthis.nameに代入
            this.name = $event.target.value
        }
    }
})
```

イベントが発生した時にブラウザはイベントオブジェクトと呼ばれるオブジェクトを生成する。
Vueでは$eventという変数名でイベントオブジェクトを受け取れる。


##これで全角入力でもリアルタイムに描画でけた
**ペーパーハウス**の間違いです。。。。
めっちゃおもろいスペインドラマなので、興味があればぜひ！！！（笑）
![全角.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653956/fd7ff0f6-0432-94ef-b5b2-be424e0648cb.gif)
DjangoのstaticファイルをAmazon Linux2＋Apache環境下で正しく表示させる方法

# はじめに
Djangoプロジェクトのstaticファイル（cssや画像）をEC2（Amazon Linux2)＋Apache環境で正しく表示させる設定方法を備忘も兼ねて書き残しておきます。

# 環境
+ Amazon Linux 2(64bit)
+ Apache2.4.43
+ MySQL8.0.21
+ Python3.7.8
+ Django3.1

# 設定内容
Django開発用サーバとApache等のWebサーバではstaticファイルを表示させる方法が異なります。まずはsettings.pyの中身を以下のように書き換えます。

```python:settings.py
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static') # 本番用
# STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")] # 開発用
```
その後以下のコマンドを実行して、各アプリケーション下にあるstaticファイルをプロジェクト直下のstaticフォルダに集約します。

```
$ python3 manage.py collectstatic
```

次にApacheの設定ファイルを/etc/httpd/conf.d/配下に作成します。
ここでは"myproject.conf"という名前で作成しています。

以下のコマンドを実行して設定ファイルを編集しましょう。

```
sudo vi /etc/httpd/conf.d/myproject.conf
```



```apache:myproject.conf

LoadModule wsgi_module /usr/local/lib64/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so

ServerName <EC2のパブリックIPアドレスを記載>

WSGIScriptAlias / /home/ec2-user/myproject/myproject/wsgi.py
WSGIPythonPath /home/ec2-user/myproject:/usr/bin/python3

<Directory /home/ec2-user/myproject/myproject>
  <Files wsgi.py>
     Require all granted
  </Files>
</Directory>

Alias /static/ /home/ec2-user/myproject/static/
<Directory /home/ec2-user/myproject/static>
  Require all granted
</Directory>

```
1〜12行目まではApacheとmod_wsgiを関連付けるための記述です。
14行目以降がstaticフォルダを許可するための記述です。
※パスやファイル名は適宜環境に合わせて書き換えてください。

最後にApacheのリスタートします。

```
sudo service httpd restart
```

これで正しくstaticファイルが表示されるようになるはずです。

# 参考
+ [DjangoをApacheで動かす | ハックノート](https://hacknote.jp/archives/31021/)
+ [Djangoにおける静的ファイル(static file)の取り扱い - Qiita](https://qiita.com/saira/items/a1c565c4a2eace268a07)
TypeScript: FixedArray<T, L> ─ サイズ固定の配列型を作るユーティリティ型

TypeScriptで配列の要素数を決め打ちした配列型を作るユーティリティ型です。

## `FixedArray<T, L>`

```typescript
type FixedArray<T, L extends number> =
    L extends 0 ? [] : [T, ...T[]] & { length: L }
```

`T`に要素の型を、`L`に配列のサイズを指定します。

## 使用例

```typescript
let t0: FixedArray<number, 0>
t0 = []
t0 = [1] // Error

let t1: FixedArray<number, 1>
t1 = [] // Error
t1 = [1]
t1 = [1, 2] // Error

let t2: FixedArray<number, 2>
t2 = [1] // Error
t2 = [1, 2]
t2 = [1, 2, 3] // Error

let t3: FixedArray<number, 3>
t3 = [1, 2] // Error
t3 = [1, 2, 3]
t3 = [1, 2, 3, 4] // Error
```

## 制約

この型の制約として、ミューテーションメソッドで要素数が変わってしまうと実行時エラーになります:

```typescript
const t1: FixedArray<string, 1> = ['foo']
t1.pop()
t1[0].toUpperCase()
// ERR: Cannot read property 'toUpperCase' of undefined 
```

## 試す

このユーティリティタイプを試したい方は、[TypeScript Playground]をご覧ください。

[TypeScript Playground]: https://www.typescriptlang.org/play?noImplicitReturns=false&target=7&module=1&ts=4.0.2#code/C4TwDgpgBAYglgDwgEwIICd0EMQB4AqANFADJQQLAQB2yAzlNQK4C2ARhOgHxQC8AUFCGlylGvSgAGKAH4oAbQC6UAFwKiUAHTb8S5QDIoAbygAbGgHNgACzVkAvv37ngUYJLXwkaTDlzN2TmJJLn53PgVFMOleBQBGZQB6RKgAUUwAe3QnFzc4z0QUDGw8AI50YjjQ4DiIpShktMzsmrqEsNrY+TjiACYklPT0LJyIV2Begu9ivzKgqF7q3raBpuGW5a6ehaiJtr7iAGZVoZHnMbdDqaLfUtZyo+rD-Z2Gweaw562DqGPPl96R2IABYTh9+EA
実行SQLをログ出力

postgresql.confを修正して実行SQLをログ出力する設定をします。

```
# vi /var/lib/pgsql/data/postgresql.conf
```
下記の行を"mod" に指定

```
log_statement = 'mod'                   # none, ddl, mod, all
```

restartします。

```
# /etc/init.d/pgsql restart
```

すると[INSERT、UPDATE]のSQLが出力され、allにするとSELECT含めのログ【/var/log/postgresql.log】が出力されます。
##select文を出したい場合
```
log_statement = 'all'   
```
```
log_min_duration_statement = 0
```
※log_min_duration_statementはスロークエリを本来検出するもので、200msなどが設定されてると思います。
iOSでViewがNavigationBarに潜り込む現象の解決策

iOSアプリ開発でNavigationBarを使っていると、ViewがNavigationBarの下に潜り込んでしまうことがあります。
今回はその解決策を備忘録的にいくつか書きます。

## 解決策1

この現象をググるとよく出て来る方法で、これがあります。

```Swift
edgesForExtendedLayout = []
```

`edgesForExtendedLayout`に対して`[]`を指定することによってViewの上端の位置（開始位置）をNavigationBarの下端にできるので、NavigationBarと重ならないようになります。

ですが副作用として、Viewが開始位置がずれたことによって、NavigationBarの背面がデフォルトの背景になるため真っ黒になります。そのため、NavigationBarが半透明になっているとNavigationBar全体が真っ黒になってしまいます。

> In iOS 10 and earlier, use this property to report which edges of your view controller extend underneath navigation bars or other system-provided views. The default value of this property is all, and it is recommended that you do not change that value.
If you remove an edge value from this property, the system does not lay out your content underneath other bars on that same edge. In addition, the system provides a default background so that translucent bars have an appropriate appearance. The window’s root view controller does not react to this property.
Source: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621515-edgesforextendedlayout

## 解決策2

次は、NavigationBarの`isTranslucent`で不透明にして、`extendedLayoutIncludesOpaqueBars`を`false`にする方法です。

```Swift
navigationController?.navigationBar.isTranslucent = false
extendedLayoutIncludesOpaqueBars = false // default
```

NavigationBarを不透明にする、そして不透明のときはextendedLayoutを適用させないようにすれば、NavigationBar下に潜り込まないようになります。

ちなみに
[extendedLayoutIncludesOpaqueBars](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621404-extendedlayoutincludesopaquebars)はデフォルトで`false`になっています。

## 解決策3

もしTableViewなどのUIScrollViewを継承しているコンポーネントを使うのであれば、`extendedLayoutIncludesOpaqueBars`を`true`にして、`contentInsetAdjustmentBehavior`で調整してもらうことで潜り込まないようにもできます。

```Swift
extendedLayoutIncludesOpaqueBars = true
edgesForExtendedLayout = .all // default (.topでも可)
```

ちなみに
[edgesForExtendedLayout](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621515-edgesforextendedlayout)はデフォルトで`.all`
[contentInsetAdjustmentBehavior](https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior)は`.automatic`になっています。

## 最後に
実験用のサンプルを作ったので、もっと詳しく挙動を知りたい方は試して見てください！
https://github.com/0eta0/OverlapNavBarTest

## 参考

https://medium.com/@wailord/extended-layout-in-ios-pre-ios-11-5eff2debf28
https://medium.com/@wailord/the-particulars-of-the-safe-area-and-contentinsetadjustmentbehavior-in-ios-11-9b842018eeaa
djangoを用いたアプリでHTML上に割り算結果(%)を表示したかった話【初学者が参考書片手にpython学習】

## はじめに
[大高隆・著「動かして学ぶ！Python Django開発入門」](https://www.amazon.co.jp/dp/B07YY5RDPC/ref=cm_sw_r_tw_dp_U_x_TCsYEbRH6SF0V)を使用して
python・Djangoの学習を始めた初学者です。

ruby・railsを使用して4ヶ月ほどプログラミングの勉強をしていましたが、
エンジニア転職にあたり、pythonを使用することになったのでこの本を片手に勉強を始めました。

ド級の素人なので、補足・ご指摘等コメントいただけると大変助かります。

## 概要
djangoで作成したアプリのHTML上に割り算の結果(百分率)を表示したい。
ついでに四捨五入もして欲しい。

## 試したこと
自作のフィルタを作ってあげることにしました。
下記、__旧__ver.のドキュメンテーションの引用です。
https://djangoproject.jp/doc/ja/1.0/howto/custom-template-tags.html
>Django テンプレートシステムには、広範な 組み込みタグとフィルタが付属していて、アプリケーションのプレゼンテーションロジックに纏わる問題を解決できます。とはいえ、コアのテンプレートタグプリミティブだけでは、要求を満たせない場合もあります。そういう場合のために、テンプレートエンジンを拡張できます。Pythonで自作のタグやフィルタを書き、 テンプレート上で {% load %} タグを使って使えるのです。
>コードの配置
カスタムのテンプレートタグやフィルタはDjangoのアプリケーション内に置きます。既存のアプリケーションに関連があるのなら、そのアプリケーションにバンドルすればよいでしょう。そうでなければ、コードを入れておくための新たなアプリケーションを作成します。
アプリケーション内には、templatetagsディレクトリを置かねばなりません。このディレクトリは、models.pyやviews.pyなどと同じ階層に置きます。templatetagsがなければ、作成してください。ディレクトリ内に__init__.py を置いて、パッケージ化するのを忘れないでください。
カスタムのタグやフィルタは、templatetagsディレクトリの下に置きます。モジュールファイルの名前は、あとでタグをロードするときに使う名前にします。ですから、他のアプリケーションのカスタムタグやフィルタと名前が衝突しないよう、よく注意して名前を決めましょう。

### ①templatetagsディレクトリと以下ファイルを作成
カスタムテンプレートやフィルタを記述するディレクトリ・ファイルを用意しておきます。
階層はmodels.pyやviews.pyと同じ階層に置いておきます。

```
views.py
models.py
.
.
.
templatetags
　├─　__init__.py
　└─　hoge_tag.py
```

### ②hoge_tag.py内に割り算の処理を記述
round関数で四捨五入します。
value→割られる数
args→割る数
filterの名前はdivisionとしておきます。

```hoge_tag.py
from django import template

register = template.Library()

@register.filter(name="division")
def division(value, args):
    return round(value / args * 100, 2)
```

最後の"2"で四捨五入後に小数点何桁まで残すかを定義しています。
__※ただし、round関数を用いた数字の丸め方には注意してあげる必要があります。__
>浮動小数点数に対する round() の振る舞いは意外なものかもしれません: 例えば、 round(2.675, 2) は予想通りの 2.68 ではなく 2.67 を与えます。これはバグではありません: これはほとんどの小数が浮動小数点数で正確に表せないことの結果です。

詳しくは下記をご参考に。
https://docs.python.org/ja/3/library/functions.html#round

### ③hoge_tag.pyをHTMLで読み込む

先程の計算式を使いたいHTMLで、計算式が読み込めるよう下記を追加。

```fuga.html
{% load hoge_tag %}
```

あとは表示してあげるだけ。

```fuga.html
{{ hoge | division:fuga}}%
```

"hoge"、"fuga"に数値（変数可）を入れてあげれば薔薇色の世界が見えてきますね。


## 偉大な参考記事
・[テンプレートタグやフィルタを自作する](https://djangoproject.jp/doc/ja/1.0/howto/custom-template-tags.html)
・[組み込み関数(python公式)](https://docs.python.org/ja/3/library/functions.html#round
)
・[[Django]templatesで掛け算の処理をしたい→ないのでフィルタを作って対応](https://code-schools.com/django-customfilter/)
TypeScript: Tail<[1,2,3]> ─ タプル型から先頭以外を取り出すユーティリティ型

TypeScriptで、タプル型から先頭要素以外を取り出すユーティリティタイプです。例えば、`[1, 2, 3]`型から`[2, 3]`型を導き出すことができます。

## `Tail<T>`

### TypeScript 4.0以降

```typescript
type Tail<T extends unknown[]> = T extends [any, ...infer Rest] ? Rest : []
```

TypeScript 4.0以降には[可変長タプル型]があるので、シンプルに上の書き方ができます。

[可変長タプル型]: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-0.html#variadic-tuple-types

### TypeScript 3.9以下

```typescript
type Tail<T extends unknown[]> =
   ((...t: T) => void) extends ((head: any, ...rest: infer Rest) => void) ? Rest : []
```

TypeScript 3.9以下では、タプルを関数のパラメータにし、その関数の第2引数以降を取り出す方法で、tailを求めることができます。

## 使用例

```typescript
const t1: Tail<[]> = []
const t2: Tail<[1]> = []
const t3: Tail<[1, 2]> = [2]
const t4: Tail<[1, 2, 3]> = [2, 3]
const t5: Tail<[1, 2, 3, 4]> = [2, 3, 4]
```

## 試す

このユーティリティタイプを試したい方は、[TypeScript Playground]をご覧ください。

[TypeScript Playground]: https://www.typescriptlang.org/play?noImplicitReturns=false&target=7&module=1&ts=4.0.2#code/HYQwtgpgzgDiDGEAEAVAnjCBleAnAljAC4AsADEgN4BQSdSRGyKI+ANgDwpIQAeREYABMoSAK7AA1sAD2Ad2ABtALoA+JAF5UPfoJFJFIYGgA0SAHSX8wAGYRcSAErQiypAH4nLpAC4Dy2np4GWAoIgYARj8Wdg4VdS0VQLpg0PCiACZo1k5FCLVNf2SkVLCGAGZs2LyzDILEuuLS9JIq3Ijas3L6gwyugPoSkLKiAFY2uI6kPqRysxIexRm5pAXqAF9qalBIWARmJhwCYnKATipixkxUHK4dAWFRCWl5JXriwYAKT8tzImiAJSadQANxk+CEQL4D303wAFhAQEI-EZTBZLLgXH5rHYHM4wkCNKDwZCPF4yn4koNmpEJvFClSgsN0lkbtV8gkitTmRU6VM6pylgMmWkGK02e1OrNFsthSkeWM+VKVgtBct5gF1kA
自分の所有するEBS Snapshotの一覧を取得する

# 解説
Custom AMIを作ったけど、AMIを削除した後にSnapshot消し忘れたなんて経験はありませんか？ Snapshotにも定期的な棚卸しが必要です。

基本的にはec2.describeSnapshotsを呼ぶだけなのですが、そのまま実行するとPublicなsnapshotが大量に取得されて悲しい気分になります。
OwnerIdsとして実行中のAWS Account IDを設定すれば良いのですが、より簡単な方法として"self","amazon"という二つのキーワードも利用できます。

APIリファレンスにより引用

```typescript
/**
     * Scopes the results to snapshots with the specified owners. You can specify a combination of AWS account IDs, self, and amazon.
     */
    OwnerIds?: OwnerStringList;
```

# サンプルコード

```typescript
async function getVolumeSnapshots(ec2: EC2, NextToken?: string): Promise<Snapshot[]> {
    console.log(`getVolumeSnapshots ${NextToken || "initial"}`)
    const r = await ec2.describeSnapshots({
        OwnerIds: ["self"],
        NextToken,
    }).promise()
    if (!r.Snapshots) {
        return []
    }
    let result: Snapshot[] = []
    if (r.Snapshots) {
        result = result.concat(r.Snapshots)
    }
    if (r.NextToken) {
        result = result.concat(await getVolumeSnapshots(ec2, r.NextToken))
    }
    return result
}
```


# 複数のアカウントからまとめて取得する方法
別記事で、Organizationの各アカウントにAssumeRoleしながらAPIを呼び出す方法を解説しています。その手法で作ったAssumeRole済のec2インスタンスを与えることで、このコードがそのまま利用できます。

[AWSの各アカウントのインスタンス一覧を取得する](https://qiita.com/tomohisaota/items/0eda9356f80f0f43f4a4)
AutoLayoutのPreviewで気軽に端末差分を確認


## はじめに

UI実装ナレッジの共有です。

## Preview機能とは

StoryboardやXibファイルを実装中の複数端末レイアウトを一度に確認できる機能です。
ビルドの必要はなく、すぐに反映されます。

機能的には割と昔から提供されていたようですが、

Xcode11になってからアシスタントエディタ（名前知らなかったけど右上のタブ）の仕様が変わったので導線が変わりました。


## 使ってみる
**1.Storyboardファイルを選択肢右上のAdjustEditorOptions（三みたいな）をタップ。**

![20200726191916.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701264/43f74978-b23b-032e-f678-1bb3c09e85e2.png)



**2. 出てきたpreviewの左下の＋ボタンを押下して確認したいデバイスを選択する。**



![20200726191921.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701264/4a606f2b-01f1-8d35-8729-837236b21fe1.png)



**3. 制約や文字内容を変更すると即時反映される。**
　あえてiPhone SEでボタンが見切れるようにしています。

![20200726191929.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701264/b3298687-f6a5-33b7-1a8f-76c9cfe87f3a.png)


## 最後に

可変的なデータを使用する場合では、やはり実際にシミュレータ や実機で動かしながら確認というのも必要ですが、

Preview を使った確認で大きなレイアウト崩れや、他端末を考慮した出戻りなどが幾分か減ると思います。
hexdump

必要になって新しいのを作ったら追加していきます。

## 標準

```zsh
% hexdump -v hoge.bin
0000000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
0000010 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
0000020 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
0000030 30 31 32 33 34 35 36 37 38 39 3a               
000003b
```

## アセンブラ用

### アドレスなし

```zsh
% hexdump -v -e '1/1 " db 0x%02x" 15/1 ",0x%02x"' -e '"\n"' hoge.bin               
 db 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
 db 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f
 db 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f
 db 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x  ,0x  ,0x  ,0x  ,0x  
```

### アドレスあり（コメント）

```zsh
% hexdump -v -e '";%08_ax" "\n" 1/1 " db 0x%02x" 15/1 ",0x%02x"' -e '"\n"' hoge.bin
;00000000
 db 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
;00000010
 db 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f
;00000020
 db 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f
;00000030
 db 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x  ,0x  ,0x  ,0x  ,0x  
```
最後の半端は何とかならないものか？

## とある形式（16進数+ASCII）

```bash
% hexdump -v -e '"%08_ax : " 8/1 "%02x " "  " 8/1 "%02x "' -e '"   " 16 "%_p" "\n"' hoge.bin 
00000000 : 00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f   ................
00000010 : 10 11 12 13 14 15 16 17  18 19 1a 1b 1c 1d 1e 1f   ................
00000020 : 20 21 22 23 24 25 26 27  28 29 2a 2b 2c 2d 2e 2f    !"#$%&'()*+,-./
00000030 : 30 31 32 33 34 35 36 37  38 39 3a                  0123456789:
```