OmniAICreator/Qiita-1.07M huggingface dataset:
[シェル芸人への道] Bashコマンド履歴を活用しよう

タイトルは煽り気味ですが、百番煎じ、**主として内部勉強会向けの記事**です。

# はじめに

Linuxコンソール - Bashにおいて、コマンド履歴は頻繁に使うかと思います。
その中でも、私めが**「よく使う」**もしくは**「便利そう」**な~~シェル芸人ぽい~~手法を紹介します！

## 対象読者

- 上下キー入力で履歴を辿れる
- `history`コマンドで履歴がずらっと表示される

これらは知っているけど、効率的に使いこなせていない人

# 履歴

履歴そのものを活用する場合。

## 直前のコマンド

| キー | 概要 | 補足 |お役立ち度|
|---|---|---|---|
| !! | 直前のコマンド（パラメータも含めたすべて） ||[★★](#-の例)|
| !:m | 直前のコマンドの各単語 | m:単語番号（0始まり、よって0はコマンドそのもの） |★|
| !$ | 直前のコマンドの最後のパラメータ | 直前のコマンドが ls foo goo の場合、"goo" |[★★](#-の例-1)|
| !* | 直前のコマンドのパラメータすべて | 直前のコマンドが ls foo goo の場合、"foo goo" |[★★](#-の例-2)|

## それより前のコマンド

| キー | 概要 | 補足 | お役立ち度 |
|---|---|---|---|
| !foo | 直近の「foo」で始まるコマンド ||[★★★](#foo-の例)|
| !n | n番のコマンド（パラメータも含めたすべて） | n:履歴番号 |[★★★](#n-の例)|
| !n:m | n番のコマンドの各単語 | nは上に同じ<br>m:単語番号（0始まり、よって0はコマンドそのもの） |★|
| !n* | n番のコマンドのパラメータすべて | nは上に同じ |★|

## 現在入力中のコマンド

| キー | 概要 | 補足 |お役立ち度|
|---|---|---|---|
| !# | これまでに入力したコマンドライン全体 | "ls foo !#" とすると "ls foo ls foo" に展開 |★|
| !#:m | これまでに入力したコマンドラインの各単語 | m:単語番号（0始まり、よって0はコマンドそのもの） |★|
| !#$ | これまでに入力したコマンドラインの最後のパラメータ | "ls foo !#$" とすると "ls foo foo" に展開 |[★★](#-の例-3)|

# 履歴の編集

履歴を編集して活用する場合。
左右キーとBackSpaceは頻繁に使いますが、以下はショートカットとして。

## カーソル移動

| キー | 概要 | お役立ち度 |
|---|---|---|
| Ctrl + A | カーソルを先頭へ |★★|
| Ctrl + E | カーソルを行末へ |★|

## 文字の削除

| キー | 概要 | お役立ち度 |
|---|---|---|
| Ctrl + U | カーソルより前の文字を削除（切り取り） |[★★](#ctrl--u-の例)|
| Ctrl + K | カーソル以降の文字を削除（切り取り） |★|

# ユースケース

## !foo の例

直近のdockerコマンドを繰り返したい

```console
$ !docker
```
## !n の例

履歴番号から実行したい

```console
$ history | grep cd
 2037  cd ~/foo
 2053  history | grep cd
$ !2037
```

## !! の例

sudoが必要だったあ

```console
$ sudo !!
```

## !$ の例

mkdirしたら移動したいよね

```console
$ mkdir foo
$ cd !$
```

## !* の例

コマンドtypoしたった

```console
$ hstoru | more
hstoru: コマンドが見つかりません
$ history !*
```

## !#$ の例

ファイルのバックアップを取りたい

```console
$ cp -p foo !#$.org
```

## Ctrl + U の例

上下キーで履歴表示したけど不要なんで、コマンドラインごと消したい

（画面は省略）


# おわりに

## 参考

実は**以下リンクが一番有用**だったりますが（笑）、Bashのmanの和訳（の履歴）です。

Man page of BASH
https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbCX
Java 月末のplusMonths

# 月末に対してplusMonthsとどうなるの？
2月には31日は存在しませんが、1/31に`plusMonths()`で1ヶ月を加算した場合はどうなるか気になり調べてみました。

[ドキュメント](https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDate.html#plusMonths-long-)によると
>このメソッドは、3つの手順で、指定された量を月フィールドに加算します。
1. 入力された月数を、月フィールドに加算します
2. 結果となる日付が無効になるかどうかをチェックします
3. 必要に応じて、「月の日」を最後の有効な日に調整します
たとえば、2007-03-31に1月を加算すると、2007-04-31という無効な日付が生じます。無効な結果を返す代わりに、その月の最後の有効な日である2007-04-30が選択されます。

まずは月を足して、足した月に該当する日付があるかどうかチェックします。該当する日付がない場合は、月の最終日を返すようです。

# 確認

```java
LocalDate date = LocalDate.of(2020,1,31);
System.out.println(date.plusMonths(1));
// 2020-02-29

LocalDate date = LocalDate.of(2020,1,30);
System.out.println(date.plusMonths(1));
// 2020-02-29

LocalDate date = LocalDate.of(2020,1,29);
System.out.println(date.plusMonths(1));
// 2020-02-29

LocalDate date = LocalDate.of(2020,1,28);
System.out.println(date.plusMonths(1));
// 2020-02-28
```

該当しない日付に対しては、有効な日付が戻ってきてますね:clap:

# 余談
`plusMonths`の後に`minusMonths`したらどうなるのでしょうか？

```java
LocalDate date = LocalDate.of(2020,1,31);
System.out.println(date.plusMonths(1).minusMonths(1));
// 2020-01-29
```
`plusMonths`で2020-02-29になり、2020-02-29に`minusMonths`をしているので結果は2020-01-29になりました。
vimでの置換の話

# 概要
vimで置換をする場面が多くてその都度検索していたのでここにまとめていきます。

# 基本

```vim
:%s/変更前/変更後/g
```

こうすることで今開いているファイルの`変更前`を`変更後`に置換します。

`%`は現在のファイルを意味しているのでとると現在行にのみ置換が適用されます。
`g`はglobalを意味しており、とると`変更前`が１行の中に複数あった場合、１つ目しか置換されません。

# 一つ一つ確認したい

```vim
:%s/変更前/変更後/gc
```

こうすることで一つ一つ置換するかどうか確認してくれます。

また、`ビジュアルモード`で範囲選択してから`:s`でその選択した範囲の置換を行えます。

#まとめ

vimでの置換をまとめてみました。
参考になれば幸いです。
Git操作まとめ 〜リモートリポジトリ

この記事では、Ubuntu18.04LTSにインストールしたGit(version 2.17.1)を使用しています。
リモートリポジトリについては、私も勉強中なのでこの記事の内容に至らない点もあるかと思いますがご容赦ください。

## リモートリポジトリとは

- インターネット上のホスティングサービスなど、ローカルリポジトリで管理しているディレクトリとその差分を保管しておく場所
- Githubに代表されるGitのホスティングサービスが有名ですが、他のホスティングサービスも選択できる
- 自分のサーバー（レンタルサーバー含む）にリモートリポジトリを置くこともできる

---

## ホスティングサービス

ここでは、GitHubとBitbucketについて書きます。（この2つしか使ったことないので・・・）

### GitHubとBitbucket

GitHubもBitbucketもGitのホスティングサービスですが、どちらにも無料版と有料版があります。
ザックリ言うと有料版は何でもできて、無料版は制限がかかっている部分がある中で使っていく感じなので、無料版におけるGitHubとBitbucketの共通点と相違点を見ていきます。

||GitHub|Bitbucket|
|:--:|:--:|:--:|
|言語|英語|日本語対応|
|publicリポジトリ数|無制限|無制限|
|privateリポジトリ数|無制限|無制限|
|privateリポジトリの<br>共同作業者数|3名まで|5名まで|

私が使ってみた感覚では、上の表のようなところが特徴だと感じました。
以前は、GitHubは英語表記のWebサイトしかない上に、無料版ではprivateリポジトリが作れなかったところがネックでしたが、現在は作れるようになったので、うれしい限りですね。

---

## GitHub Pages

- リモートリポジトリにpushするだけでWebサイトとして公開される
- GitHub PagesでWebサイトを作成すると、アドレスの末尾に「.github.io」がつく
- データベースにアクセスするタイプのWebサイトは設置できない

私もGit操作とGitHubの練習目的で[Webサイト](https://tsweblabo.github.io/)を公開しています。
練習ということもあり、コーディングしつつ、逐次pushしているので見づらいところもあるかとは思いますが、見ていただけるとありがたいです。

---

### 本記事目次ページ
[Git操作まとめ](https://qiita.com/tsweblabo/items/6aec9d022c08954f5024)
選択肢の「その他」を選んだ時のテキスト入力

フォームで選択肢を実装した場合、その他項目を設けてその他が選択された時はテキスト入力を必須とする実装をしたい時がある。
割とどこにでもある実装だが、バリデーションも含めてちゃんと実装しようとすると、「あれ、どうやるんだっけ？」となったのでメモとして残す。

# 概要
例えば会員登録するユーザーの職業情報を得るために、いくつか選択肢を用意し、選択肢に当てはまらない場合はフリーテキスト入力を必須となるようにしたい。
その場合、フリーテキスト欄をその他が選択された場合だけ表示、それ以外の場合は非表示という実装をJavaScriptで行う以外に、Modelのvalidationにも記述する必要がある。
選択できる職業は、エンジニア、マーケッター、デザイナー、オペレーション、マネジメント、その他の6種類とし、その他が選択された時だけフリーテキスト欄入力を必須とする。

## Schema
テーブルのカラムには、下記の2つのカラムをつける。（カラムの追加方法などはここでは省略）
db/schema.rb

```ruby
create_table "users", force: :cascade do |t|
  t.integer "job", default: 0, null: false, comment: "職種"
  t.string "other_jobs", comment: "その他の職種"
end
```

`jobs`はenum管理するのでintegerで登録する。

## Form
次にformに入力項目を追加する。（form_withの引数は適当）
views/users/new.html.slim

```slim

= form_with(model: user, url: registration_path, method: :post) do |form|
  = form.label :job
  = form.select :job, User.jobs_i18n.invert, {}, required: true
  = form.text_field :other_jobs, required: true, class: 'other_jobs-input', placeholder: '職種を入力してください'
```

`User.jobs_i18n.invert`は選択肢としてjobsのenumを一覧にして日本語化し、かつenumのhashのkey, valueを逆転させる。
これで選択肢の表示名にenumのkeyの日本語名を、valueにkeyをセット出来る。

## JQuery
Formの表示・非表示を動的に行うためJQueryで操作を行う。

```javascript

  $(function() {
    $(".other_jobs-input").hide();
  });
  // 選択肢の変更を検知してイベントを発生させる。
  $('select[name="user[job]"]').change(function() {
    if ($(this).val() === 'others')
      $(".other_jobs-input").show();
    else
      $(".other_jobs-input").hide();
  });
```

## Model
最後にModelのコードを。

```ruby

class User < ApplicationRecord
  validates :other_jobs, presence: true, if: -> { self.others? }
  validates_presence_of %i(
    job
  )

  before_validation :other_jobs_validation

  enum job: {
    engineer:   0,
    marketter:  1,
    designer:   2,
    operation:  3,
    management: 4,
    others:     5
  }

  private

  def other_jobs_validation
    self.other_jobs = "" unless self.others?
  end
```

まずenumを用いて選択肢管理を行う。
`job`は必須項目としたいので`validates_presence_of`を使いvalidationをかける。

また、`job`で`others`が選択された時は`other_jobs`を必須としたいので、`if:`オプションにlambdaを使ってbooleanを返すブロックを渡す。
こうすることで、職業選択欄でその他が選択された時にテキスト入力を必須と出来る。

逆にその他以外が選択された時は`other_jobs`に値が入っていて欲しくない。
そこで`other_jobs_validation`を定義し、`before_validation`に渡すことで目的を果たすことが出来る。
PureScriptでメモ化

# 準備

まず、お試し用のプロジェクトを作成します。

```
$ mkdir fibmemo
$ cd fibmemo
$ spago init
```

PureScriptには[purescript-memoize](https://pursuit.purescript.org/packages/purescript-memoize/5.0.0)というメモ化用の便利なライブラリがあるので、インストールしておきましょう。

```bash
$ spago install memoize
$ spago build
```

また、フィボナッチ関数の実行時間を測るために以下のような関数を定義しておきます。

```haskell
import Effect.Console (time, timeEnd) as Console

time :: String -> (Unit -> Effect Unit) -> Effect Unit
time label f = do
  Console.time label
  f unit
  Console.timeEnd label
```

# 実行結果

## メモ化なしの場合

実装は以下のようになります。

```Haskell
fib :: Int -> Int
fib 0 = 1
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)
```

試しに48回で実行すると、以下のような結果になります。

|n|time|
|---|---|
|48|53927.511ms|

非常に遅く、耐えがたいものになっています。

## メモ化ありの場合

実装は以下のようになります。

```Haskell
fib_memo :: Int -> Int
fib_memo = memoize cache
  where
    cache 0 = 1
    cache 1 = 1
    cache n = fib_memo (n - 1) + fib_memo (n - 2)
```

実行すると、以下のような結果になります。nを300回まで増やしても問題ありません。

|n|time|
|---|---|
|48|0.081ms|
|300|4.192ms|


# まとめ

記事を読んでくださってありがとうございます。

Twitterフォローしていただけると嬉しいです！
https://twitter.com/_matoruru
XQuartzが起動しない→解決

# はじめに

[XQuartz]()はMac OS X上で動作するX Window Systemです。起動せず困り果てていましたが、解決に至ったのでメモを残します。

# 実行環境

バージョン: macOS Catalina Version 10.15.2
Shell: fish

# 原因

fishでした。

問題発生時、筆者の`~/.bashrc`は以下のようになっていました。

```bash:~/.bashrc
#/usr/bin/env bash
exec fish
```

# 解決方法

`~/.bashrc`を以下のように変更します。

```bash:~/.bashrc
#/usr/bin/env bash

[[ $- != *i* ]] && return

exec fish
```

`[[ $- != *i* ]] && return`の記述は、「インタラクティブシェルでない場合(スクリプトなどから呼ばれた場合)にはその先を実行せず終了する」という意味です。これにより、fishが起動するのはターミナルなどから手動で呼ばれた時のみになります。
【ふくだ学習録】Docker入門 part1【20日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )

### 今読んでいる本

[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)

# Docker入門

### Dockerの特徴
①Linuxカーネル上に「Dockerエンジン」と呼ばれる仮想化基盤を構築でき、その上にアプリケーション実行環境を構築・稼働できる。
②設定ファイルに基づいて、Dockerエンジンで稼働可能なアプリケーション実行環境を素早く、自動的に構築できる。
③アプリケーション実行環境の構成に必要なイメージを配布する「Docker Hub」をはじめとするレジストリサービスを利用できる。
上記3点が主な特徴になる。

### Docker Hubはタダ？
基本タダ。ただしプライベートコンテナイメージは1つまでしか無料で作成できない。
DockerHubの料金体系と、AmazonECRの料金体系との比較は下記記事参考。
(Amazonはお得意のデータ転送量によって変わる従量課金制。よっぽど慣れるまでの間は無難に料金推測できるDockerHubのが安全かも)

[Docker による環境構築に必要なコンテナイメージの管理を考える、Amazon ECR と Docker Hub の料金を比較も解説](https://tracpath.com/works/devops/docker_hub_and_amazon_ec2_container_registry/)

### レジストリはDocker Hubを利用しなくてはいけないのか？
そんなことはない。プライベートレジストリサーバを作成することも可能。
やり方は下記記事を参考にする。

[プライベートなDockerレジストリサーバーをコンテナで立てる](https://qiita.com/rsakao/items/617f54579278173d3c20)

### Vagrantとは？
Dockerが、カーネル部分はホストのものを使用するのに対して、Vagrantはカーネルもシミュレータで作成する。（って言い方で多分あってるはず）
その分Dockerよりも重くなってしまうが、環境依存性はさらに低くできる。（Windowsなどで使用されたりすることが多いとのこと）

[Web系のDocker民から見たVagrantについて](https://qiita.com/Hibikine_Kage/items/77a32b8c715fb698d5a7)
[VagrantとDockerについて名前しか知らなかったので試した](https://qiita.com/hidekuro/items/fc12344d36d996198e96)

### OSについてもうちょい詳しく
この記事すんごい分かりやすくて神。

[OS基礎の基礎をまとめてみた。](https://qiita.com/tatsuya4150/items/f830c9b2ae33275aef42)

### プロビジョニングとは？
サーバーを選定したりOSやソフトウェアをインストールするなどして、サーバーがサービスを提供できるようにするまでの一連の作業のこと。
プロビジョニングを行うための大きな要素として、オーケストレーション、設定、ブートストラッピングの３種類がある。
Dockerは上記３種類全ての機能を提供しているが、主に提供しているものはブートストラッピング機能。

### オーケストレーションとは？
システムやソフトウェア、サービスなどの構築、運用管理を自動化することを指す言葉。

### ブートストラッピングとは？
クラウド/仮想イメージの実行やOSインストールを行うこと。

### DevOpsとは？
開発チーム（Development）と運用チーム（Operations）がお互いに協調し合うことで（図1参照）、開発・運用するソフトウェア／システムによってビジネスの価値をより高めるだけでなく、そのビジネスの価値をより確実かつ迅速にエンドユーザーに届け続ける」という概念。

[DevOpsとは何か？ そのツールと組織文化、アジャイルとの違い](https://www.buildinsider.net/enterprise/devops/01)

### Docker向きのOS
DockerはLinuxOSの上で稼働するため、無駄な機能（使わない機能）が出来るだけ少ないLinuxOSを選定した方がパフォーマンスもセキリュティも上がる。Docker向きのOSは下記サイト参考。（実際に企業レベルではどんなOS使ってるんやろ。。？結局UbuntuとかCentOSなんか。。？）

[Docker向けの軽量Linux OS 主要3種を比較する](https://thinkit.co.jp/story/2015/03/06/5672)
[ Linuxディストリビューション用途別おすすめ10選](https://www.kagoya.jp/howto/rentalserver/linuxdistribution/)

### Dockerのコンテナ内で使われるOSについて
この疑問はすごいあったけど、下記の回答が一番分かりやすかったかも。
結局Linux！（ディストリビューションごとの特性までは覚えてられん！！）

[Dockerのコンテナ内で使われるOSについて](https://teratail.com/questions/142866)


# 今日の一言
「Dockerについて体系的に知っておいた方がいいな」と思って勉強しだしたけど、疑問が疑問をよびまくってる。
いい感じ！勉強たのぴぃ！
超高速ハッシュアルゴリズム「xxHash」を試してみた。

ファイルの整合性を取る時、MD5とかでハッシュを取って確認する事が多いのですが、高速と噂のハッシュアルゴリズム「xxHash」がどれくらい早いのか検証してみた。

# windows
## MD5
だいたい250MB/sからたまに270MB/sになるくらい。コマンドは以下

```terminal
>certutil -hashfile filename.mp4 MD5
```
![md5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212587/3c856003-da35-81c7-9da1-4641213a030a.png)

## xxHash
https://github.com/Cyan4973/xxHash

430MB/s ~ 450MB/sくらい。下記から`xxhsum_win64_0_7_2_avx2.zip`をダウンロードして使用しました。
https://github.com/Cyan4973/xxHash/releases/tag/v0.7.2

```terminal
>xxhash.exe filename.mp4
```
![xxhas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212587/8d817b8b-e5d6-625f-a332-b95d4b1a2e05.png)

# macOS
同じ検証をmacOS(Macbook Pro)でも検証してみた所、1.24GB/sというとんでもない速度を叩き出しました。やはりストレージ速度が早いとかなり効いてきます。ちなみにMD5は400MB/sくらいでした。

## まとめ
ある程度スピードの出るストレージであれば効果的である事が分かりました。
ちなみに検証したストレージはSSDで、読みで500MB/sくらい出ます。

注意点としてxxHashは暗号化を行っていないので、セキュリティ目的には使ってはいけません。
今回のケースのようなファイルの整合性を取る処理には向いているのではと思います。
vim-surroundのysの覚え方 (プラグイン作者直伝)

vim-surroundは便利なプラグインですが、のショートカット"ys"が覚えにくいので、覚え方を調べたところ、プラグイン作者がコメントしているのを発見しました。

まずは"ys"の意味から。2014年に上がったissueから、"ys"の意味は"You surround"だとわかりました。"ysiw"の意味は"You surround inner word"です。
issue→https://github.com/tpope/vim-surround/issues/128
作者tpopeさん自身も、これはあまりにも苦しい意味付けだと言うニュアンスのコメントをしています。


そして2019年にtpopeさんが以下のコメントをしました。
https://github.com/tpope/vim-surround/pull/228#issuecomment-524701368
> Here's the real mnemonic: `d`, `c`, and `y` are the three most important Vim operations, and `ds`, `cs`, and `ys` are the three most important Surround operations. - tpope commented on Aug 26, 2019

意訳すると、「Vimの三大コマンドが`d``c``y`なら、Surroundの三大コマンドは`ds``cs``ys`だ。って覚えられるよ！」って意味です。


##### 以下、筆者より補足です。

`d``c``y`の覚え方も考慮した以下の覚え方を筆者は提案したいです。
「Vimの三大**ヤンクコマンド**は`d``c``y`だ。そして、Surroundの三大コマンドは`ds``cs``ys`だ。」

以上になります。

## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Amazon WorkSpaces会社でやってくれないかなという話

# Amazon WorkSpaces で実現するテレワークによる働き方改革
はい皆さんこんにちは

結論から言うとこの記事は
自宅でも職場でも外出先でも仕事用の仮想デスクトップを使えたら働き方が変わりますね
という話です。

ちなみにAWS Innovate Online Conferenceでも講習がありました

# 詳細
テレワークとは、情報通信技術 (ICT : Information
and Communication Technology)を活用した、場所や
時間にとらわれない柔軟な働き方のこと。

デスクトップ仮想化とは
ネットワークを通じてデータセンターやクラウド
上にあるサーバーで実行しているデスクトップ環
境に接続し、その画面情報をクライアントデバイ
スに転送することで、遠隔利用するしくみ

サテライトオフィスー＞外出先の近くであれば移動時間のロスが無い
在宅勤務ー＞通勤時間分を家庭の用事などに充てられる
モバイルワークー＞外出時の待機時間中に働ける


##Amazon WorkSpaces への接続
・クライアントソフトウェアからログインするだけ


##OSの種類
Windows 7/10（ライセンスの持ち込み[BYOL]も可能）、サーバー
Amazon Linux 2 
GPUインスタンス

##使えるデバイス
• Windows
• Mac
• Chromebook
• ゼロクライアント・シンクライアント
• iPad
• Android タブレット
• Kindle Fire HDX
• Web Access (Chrome, Firefox)

##いくらなの？
・月額料金
・時間料金（長時間使うと割高）

無料利用枠 
・2 vCPU
・4 GiB メモリ
・80GB/50GB(ルート / ユーザー)
・２つのWorkSpaceまで
・40時間/月(2ヶ月間利用可能)

3か月目からも無料利用枠と同じスペックを使う場合は
月額：$47/月
時間：$10.00/月　+ 0.30/時

細かい値段はこのURLでも見てください
https://aws.amazon.com/jp/workspaces/pricing/?nc=sn&loc=3


##感想

仮想デスクトップと聞くと、どうせ重いんでしょう？
という偏見があるのですがスペックも選べるのでいい時代ですねぇ。

近い将来完全テレワークが出来る日は来るのでしょうか。





**ありがとうございました。**
Googleが発表したITPの欠陥を眺めてみる

Googleが投稿した[ITPの欠陥に関する論文](https://arxiv.org/ftp/arxiv/papers/2001/2001.07421.pdf)の紹介です。

# tl;dr
* ITPのトラッキング判定はデバイス毎に行われるよ
* あるドメインがトラッキング判定されているかを知る方法がいくつかあるよ
 * 特にそのドメイン・サイトが攻撃者管理なら
* ので、閲覧情報のリークやフィンガープリントとして使われる可能性があるよ


# 指摘している問題
この論文では、

* あるドメインがトラッキング判定されているか、別のサイト（攻撃者管理）で判断出来る(1,2,3,5)
* 攻撃者が、あるドメインをトラッキング判定させることが意図的に出来る(2,3,4)

ことがマズい場合を指摘しています。

## 1.トラッキング判定されているドメインを判定出来る（かもしれない）
トラッキング判定はユーザー毎に異なるので、トラッキング判定されているドメインがわかると、ユーザーの地域などがわかる可能性があります。
（例：hoge.co.jpがトラッキング判定されているから、日本在住っぽい）

##2. ユーザーがあるWebサイトにアクセスしたかがわかる（かもしれない）
あるドメインがトラッキング判定されていれば、そこにリクエストするサイトに一回はアクセスしたことを意味します。
攻撃者管理のドメインを使えば、攻撃者のサイト(A)を訪れた後、別の攻撃者のサイト(B)で、サイトAへのアクセスの有無を判別することが出来ます。

## 3.フィンガープリントとして使われる（かもしれない）


1. ユーザーに適当なビット列を割り振る
2. 各ビットを攻撃者管理のドメインに対応させる
3. 値が1なビットに対応するドメインをトラッキング判定させるようにリクエスト
4. 以降、各ドメインがトラッキング判定されているかを調べ、ビット列を復元する

とすると、サイトを跨いでユーザーを特定するフィンガープリントに使えてしまいます。
同じようなことを、HTTPからHTTPSへのリダイレクトの記憶(HSTS)で行う手法もある（あった？）らしいです
（[techscoreさんの解説](https://www.techscore.com/blog/2017/11/06/super-cookie/)がわかりやすいです）。


## 4.管理外のドメインをトラッキング判定に加えられる
攻撃者が管理**していない**ドメインをトラッキング判定させることで、シングルサインオンなどのサービスを使用不可出来てしまうよねという話。


## 5. 検索結果のリーク(Cross-Site Search攻撃)
ITP以前から[Cross-Site Search Attacks](https://www.researchgate.net/publication/280738245_Cross-Site_Search_Attacks)という攻撃があります（[mbsdさんの解説](https://www.mbsd.jp/blog/20160826.html)がわかりやすいです）。
攻撃者のサイトから検索を受け付けるページ（ECサイトとかWebメール）にリクエストを投げ、レスポンス時間の違いで、ユーザーの情報を探ろうとする攻撃です、

検索結果がトラッキング判定されるドメインへのアクセスを含んでいる場合、同じ事がITPのトラッキング判定でも出来てしまう可能性があるよという話です。



# トラッキング判定されているかの判定
攻撃者がこの欠陥を利用するには、ドメインがトラッキング判定されているかを、攻撃者のサイトが知ることとが必要です（4除く）。
論文にはその方法がいくつか記載されています。

* 攻撃者が判定したいサイトを管理している場合、リファラかクッキーを見れば判定がわかる
* アクセス先に送るリファラ（＝アクセス元のURL）をむっちゃ長くして送ってみる
 * アクセス先がトラッカー判定されていなければ、リクエストサイズが多すぎてリクエストが失敗する（サイトの設定次第）
 * アクセス先がトラッカー判定されていれば、リファラが短縮され、リクエストが成功する
* などなど…
30分で瞬発的にコーディングする。(メモ)

#背景
朝にカフェで勉強などしているんですが、気分が乗らなかったので30分という時間制限でコーディングをしました。
そこでの気付きをここにまとめておきます。

# 目標
これをCSSに実装
元Tweet
https://twitter.com/InfinityLoopGIF/status/1221289968099823616?s=20
![あああああ.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/2077f4aa-520e-95ef-7567-86d0bb0f181d.gif)


# 結果
こちらになります。
色々未完成…
![名称未設定.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/e3a002a8-21ea-e9b3-2f95-1876f97f7e4b.gif)

Codepen
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="css,result" data-user="hashito" data-slug-hash="qBEwxoZ" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="half circle Animation">
  <span>See the Pen <a href="https://codepen.io/hashito/pen/qBEwxoZ">
  half circle Animation</a> by hashito (<a href="https://codepen.io/hashito">@hashito</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 気づき
## 考える時間を最小に、実装で試す
そのままですが、考え続けるとどうしても時間がかかってしまいます。
なので、出来る限り最短でトライアンドエラーを試すのが良いと思います。
1.結果を想像する
2.そのために何がたりないかを考える
3.どうすればそうなるかを考える←これが結構かかりますね…
4.可能性が高い方を試す
これの繰り返しかな。

## スマートな実装は捨てる、まず動かす
単純に私の中の悪魔が「これは、こうすれば…行数が減るな…」とか考えるんですが、
これは初期では無視しましょう。
まず、目的の形にすることを優先する。

## 思い切る
これが一番難しいですね。
例えば「思い切って別の場所に移動する」や「削除する」という判断です。
これをすると「そもそもしないほうが良かった」とかなる場合もあるので、

# 最後に
正直、実作業はもっと大規模なものがメインだと思うのでこれで最後まで実装しちゃうと大変な事になりそうですので、時々立ち戻ってシステム全体を構成し直したりとかが必要だと思います。

ただ、この集中と発散を効率的に繰り返せるプログラマの方は良いプログラミングができそうな気もします。
github/gitlab/bitbucketで作業（分析、診断、改善、鑑定、監査）

github/gitlab/bitbucketで作業（分析、改善、診断、鑑定、監査）

#機能

## URL
http://github.com

http://gitlab.com

http://bitbucket.com

## git

ソースファイル、道具類、手引き類の一括管理、版管理、作業記録

## issue

課題記録、課題解決、課題管理

## wiki

資料記録、資料整理、資料管理。


## ci

#分析

##人
作業した人名が入って記録している。人ごとの作業回数、作業量、作業密度などの分析ができる。

##時間
作業した時が入っている。作業開始時、作業終了時を識別する手順を決めれば、作業時間の記録、分析、管理ができる。


##作業内容
git, issue, wikiごとの分析。コンパイル、エラーなどの記録をファイルに残すようにすれば、作業内容の記録、分析、管理ができる。
はじめてのQiita

はじめまして, Sefoo(せふ)です。
Qiitaで記事をはじめて書いてみる。アカウントを作るところから始めて, 記事を投稿するまでをまとめた。本当に簡単にできるので, 気になっている方の参考になれば幸い。

#背景
とあるデスクトップアプリを作りたい。ただ, 自分が普段使っているJavaだと色々問題があるみたい。Windows環境でMacOSとかLinux向けのアプリの作り方が分からなかったし, そもそも環境によっちゃWindows OSでも動かない人がいるらしい。どうしようかと思って色々調べてみたのだが, Electronというのが面白いらしい。
>[Electron](https://www.electronjs.org/)は、GitHubが開発したオープンソースのソフトウェアフレームワークである。 ChromiumとNode.jsを使っており、HTML、CSS、JavaScriptのようなWeb技術で、macOS、Windows、Linuxに対応したデスクトップアプリケーションをつくることができる。
[Electron (ソフトウェア) - Wikipedia](https://ja.wikipedia.org/wiki/Electron_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)) 参照

Electronは昔にちょっとだけ触った事がある程度の知識しかないし, JavaScriptやNode.jsもちゃんと勉強したことはない。ならば, これを機に本格的に勉強してみることにする。まずは覚書代わりにQiitaを使おう。
>[Qiita](https://qiita.com/)は、プログラマのための技術情報共有サービスです。 プログラミングに関するTips、ノウハウ、メモを簡単に記録 & 公開することができます。
Qiita HP参照

ずっとお世話になっていたけど, 記事を書くとは思わなかった。アカウントすら持ってないので, まずはそこから。

#Qiitaアカウントを作る
1. [QiitaのHP](https://qiita.com/)にアクセスする。
2. タイトルバー右上のユーザ登録ボタンを押す。
3. アカウントの作成方法を選択する。
    - GitHubアカウントから連携して作る。
    - Twitterアカウントから連携して作る。
    - Googleアカウントから連携して作る。
    - Qiitaアカウントを直接作る。

ちなみに自分はGoogleアカウントから作った。勉強用にひとつメールアドレスが欲しかったので, Googleアカウントを作っておいたのだ。

最後に興味のあるカテゴリを選択して完了。

#さっそく記事を書いてみる
アカウントは作った。さっそく記事を書いてみよう。
![qiitaタイトルバー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574235/17c4eda3-9a22-dc13-51f0-acc385cc8398.png)
Qiitaのタイトルバー右上の投稿ボタンを押すと編集画面が開いてすぐに記事が書ける。
最初はビビって押せなかったというのはナイショ。自分のアイコンをクリックするとメニューが出てきて, 下書き一覧が見れるのだが, そこから編集画面を開いてた。

![縮小 - qiita記事編集画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574235/9aaf4d56-58e0-9b32-eb18-bd99180fa6c0.png)

記事はMarkdownという特殊な書き方をしなければならないが, 難しくはない。普通に文章を書くのと変わらない。自分はタイトルとか見出しの付け方だけ覚えてこの記事を書いている。分からないことがあって困ったらMarkdownの書き方を見ればいい。

<div align="center">
<img width="40%" alt="qiita Markdown書き方ヘルプ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574235/70560a0c-5158-c3f0-f3c7-893f5941e4e8.png"/> <img width="40%" alt="qiita Markdown書き方詳細.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574235/4d79ce58-fde6-2fe1-0db8-5c378b69d9c0.png"/>
</div>

##書き終えた後にすること
記事が書き終わったら右下の保存ボタンを押そう。まぁ, 記事は自動で保存されるのであまり意識する必要はない。
実際に公開する場合は上矢印からメニューを出して「Qiitaに投稿」を選択しよう。

<div align="center">
<img alt="qiita記事保存.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574235/3751005e-83a6-984c-d9f5-74ce3719acd3.png"/>
</div>

##見出しの書き方
最初に覚えたMarkdownの書き方を記しておく。
見出しの文章の前に「\#」記号を置けばその行が見出しになる。

```markdown:見出しの書き方1

#見出し
```

また, 「\#」記号の数を増やすとレベルの低い見出しにできる。

```markdown:見出しの書き方2

#見出し
##小さい見出し
###もっと小さい見出し
```


#Qiitaの記事をストックする
気になった記事をストックすることができる。
上から2番目のディレクトリマークを押すとストックできて, 一覧からすぐに見られる。

![qiita書き方メモ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574235/66080698-72b5-16ec-ac48-6f62606ba5de.png)

今まで気にしていなかっただけかもしれないが, アカウントを持つことで目が行くようになった。
記事を書く際には他のHPを参考にすることも多いのでさっそく使っている。

#最後に
最後まで読んで頂き, 感謝。
Qiitaの始め方をまとめてみた。難しいことはひとつも無かったので驚き。サービス品質の高さがうかがえる。
また, アカウント作成箇所で不親切な点があったと思われるので謝罪します。画面を保存してなかったので, テキストのみの説明になってしまった。
アプリを作るの話はどこへやら。まぁ, 当分先かな。

#参考資料
- [Qiita書き方メモ](https://qiita.com/hiroyuki_hon/items/f2a779bb295fd12646ab)
- [Qiita(28)画像の大きさ調整](https://qiita.com/kaizen_nagoya/items/cef6ae1fcbdbec9e7be2)
GoでExcelをcatするコマンドラインツールを作ってみた

# 要約
* GoでExcelをcatする[ツール](https://github.com/kuritayu/infra-tools/blob/master/cmd/xlctl/main.go)を作ってみた
* `xlctl ls エクセルファイル名`でシートの一覧を出す
* `xlctl cat エクセルファイル名 シート名`でシートをcatする
* これでExcelをターミナルから操作してパイプでつないで色々できる

# 背景
メモだったりオブジェクト組み合わせて画像編集したり、表計算以外にもExcelは人気です
(それについては賛否両論あると思いますが、ここでは触れません)

ワタシみたいなコマンドライン野郎にはExcelって煩わしい(使わないわけではない)ので、
コマンドラインでgrepableに操作したいなとは昔から思ってました

# 作ってみた
`github.com/tealeg/xlsx`という便利なライブラリで簡単につくれました

セル情報の書き出しを行う実装はこんな感じで、1rowの中の各cellの値をforData変数に突っ込んで、最後にjoinして出力

```golang

func printCell(sheet *xlsx.Sheet) {
	for _, row := range sheet.Rows {
		var rowData []string
		for _, cell := range row.Cells {
			rowData = append(rowData, cell.String())
		}
		fmt.Println(strings.Join(rowData, " "))
	}
}
```

# 昔を思い出した
昔、設計書をExcelで作る文化のプロジェクトに参加してました
Excelに`検討中_いつか削除`みたいなシートがあって、
`こういう意味不明シートを探せ！`みたいな指示が飛んだのを思い出しました
> 当時はVBA作った気がしますが、今回作った`xlctl`をforループで回したりすると一瞬でできますね

# 結論
* Excel文化とは付き合い方を考える必要がある
* プロパティ情報とか色々取れたら便利なのかしら
Go で Qiita API を叩いてみる

`net/http` と `encoding/json` パッケージを使えば簡単にできる。

Jsonをパースした結果を受け取るための構造体をあらかじめ用意してあげる必要はある。

Top Level が配列の場合どうすんだ？って思ったけど、`var hoge []構造体` のようにスライスを用意してあげるだけで良かった。

## コード

```go:main.go
package main

import (
        "encoding/json"
        "fmt"
        "io/ioutil"
        "log"
        "net/http"
        "time"
)

type Item struct {
        Title     string    `json:"title"`
        CreatedAt time.Time `json:"created_at"`
}

func main() {
        resp, err := http.Get("http://qiita.com/api/v2/users/snaka/items?page=1&per_page=10")
        if err != nil {
                log.Fatal(err)
        }
        defer resp.Body.Close()
        body, err := ioutil.ReadAll(resp.Body)
        if err != nil {
                log.Fatal(err)
        }

        var data []Item // nil slice
        // data := make([]Item, 0) のように要素数0の slice としても良い

        if err := json.Unmarshal(body, &data); err != nil {
                log.Fatal(err)
        }

        for _, item := range data {
                fmt.Printf("%s %s\n", item.CreatedAt, item.Title)
        }
}
```

### 変更(2020.1.31)

* 日付を受け取る箇所を `timt.Time` 型にした
* Jsonを受け取る変数を nil slice と宣言するようにした
    * [arrays - Correct way to initialize empty slice - Stack Overflow](https://stackoverflow.com/questions/29164375/correct-way-to-initialize-empty-slice)

## 実行結果

```
2020-01-29 08:24:56 +0900 +0900 Go で Qiita API を叩いてみる
2020-01-19 12:48:10 +0900 +0900 Goの勉強のため自分のグローバルIPを確認するコマンドを作った
2020-01-18 08:44:06 +0900 +0900 AWS認定 Alexa スキルビルダーに合格したので受験の感想など
2020-01-08 23:00:55 +0900 +0900 npm install で har-validator-5.1.2.tgz が Not Found と言われた
2020-01-07 08:42:34 +0900 +0900 GoでSTUNサーバを使って自分のパブリックIPアドレスを取得
2020-01-05 05:12:38 +0900 +0900 WSL2内で立ち上げたサーバにWindows側からlocalhostで接続する2020-01-04 22:23:55 +0900 +0900 Docker コンテナ内で立ち上げた godoc にホスト側からアクセスできなかった
2019-05-22 17:52:46 +0900 +0900 Cludfront + API Gateway + Lambda の環境でうまくいかない場合のレスポンスとその原因
2019-05-21 10:09:25 +0900 +0900 API Gateway で作成したAPIを独自に用意したCloudFrontディストリビューションで公開する
2019-04-04 17:18:48 +0900 +0900 API Gateway のエンドポイントを nginx で reverse proxy したら"SSL_do_handshake() failed" と言われた
```

## 参考

* [Qiita API v2ドキュメント - Qiita:Developer](https://qiita.com/api/v2/docs)
* [http - The Go Programming Language](https://golang.org/pkg/net/http/#pkg-overview)
* [json - The Go Programming Language](https://golang.org/pkg/encoding/json/)
* [JSONのパース/生成 - はじめてのGo言語](http://cuto.unirita.co.jp/gostudy/post/standard-library-json/)
* [Decode top level JSON array into a slice of structs in golang](https://coderwall.com/p/4c2zig/decode-top-level-json-array-into-a-slice-of-structs-in-golang)
ゼロからはじめる Dockerによるアプリケーション実行環境構築 メモ

udemyで「ゼロからはじめる Dockerによるアプリケーション実行環境構築 」を学習しているのでメモを残す
細かくはないが、同一人物が長文で言及しているレビューって以外と重宝したりするので残す。

動画に補足して参考資料を元にメモをつけたす

## 参考資料

[Docker入門](https://y-ohgi.com/introduction-docker/)


## 対象者
・Docker？なにそれ美味しいの？🐳のレベルの人
・RailsではCRUDアプリなら作れるような人
・mysqltとかで依存して死んだ経験ある人(私)


## 「ゼロからはじめる Dockerによるアプリケーション実行環境構築 」 の目的

・Dockerの概念、操作方法を学ぶ
・Dockerでの開発環境の構築方法を学ぶ
・クラウド環境にDockerコンテナをデプロイする方法を学ぶ

## 講座の注意

・講座はLinux、つまりMacコンテナが対象

Macがメジャーらしい

## Dockerとは何か

・Docker社が提供しているコンテナ型のアプリケーション実行環境
・Docker自体はGo言語

>Dockerはパッケージングのための技術と言っても過言ではないでしょう。
特定の環境をパッケージングし、どの環境でも動くポータビリティを保証します。
Dockerは任意のタイミングの状態（ライブラリ・ランタイム・コード）を1つのスナップショットとして保存します。
スナップショットは任意のタイミングの状態を再現することが可能で、そしてそのスナップショットを他の開発者やステージングや本番環境へ配布することが可能です。
当たり前ですがネットワークの疎通など、パッケージングされた外の環境は保証されないです。


メモ : 従来の仮想化(ホスト型)とコンテナ型仮想化。各違いを丁寧に説明してくれたが、知らない単語だらけでまだわかってないところも多い。Dockerコマンドを実行すると、Dockerエンジンが起動する。
コンテナ型だと、「起動が早い」「軽量」らしい。とにかく便利ということで、次に進む。


## 従来の仮想化とコンテナ型仮想化の違い①

<img width="743" alt="vm-docker.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342078/3ddc312e-5c3d-c69e-5478-177e08e248bb.png">

>従来のVM型の仮想化の場合、物理レイヤーの仮想化から行いますが、DockerはLinuxカーネルの機能を用いて1プロセスとして隔離された環境を実現します。
そのため仮想化レイヤーが少なく、VMと比較して少ないオーバーヘッドで環境を実現することができます。


メモ : 従来よりも、オーバーヘッドが少なく、動作が早くて軽量であることがメリット。

## 従来の仮想化とコンテナ型仮想化の違い②

アプリケーション実行の再現性

>コンテナ型仮想化では、特定のアプリケーションを動作させるために必要なものは、Dockerイメージにまとまっているので、同じDockerイメージからコンテナを起動する限り、環境に依存しない。


メモ : 仮想マシンの環境依存せずに、アプリケーションを起動できる。Aさんの環境では実行できたけど、Bさんの環境では実行できない。という状態がなくなる。つよい。

## 従来の仮想化とコンテナ型仮想化の違い③

・OSの自由度

> 従来型なら、仮想マシン上で任意のOSを起動させることができるが、コンテナ型仮想化だとホストOSのカーネルを使用するので、LinuxOS上でWindowコンテナ(逆も然り)ができない

メモ: ホストOSカーネルが謎

## 従来の仮想化とコンテナ型仮想化の違い④

・分離レベル

>コンテナ型仮想化は、従来の仮想化に比べて分離レベルは低い

メモ: 執筆中
wget で相対リンクがダウンロードされない

# Problem
大学のサーバ上の`neko.html`にリンクが張られてる書類をwgetで一括でダウンロードしようとしたかった

```
<http server>
- <nyaan>
    - neko.html（ここに<meow>以下のファイルの相対リンクが説明文とともにリストされている）
    - <meow>
        - cat1.pdf
        - cat2.pdf
        - ...
    - ...
- ...  

```

以下のようにしたら`neko.html`と`robot.txt`しかダウンロードされなかった．

``` bash
wget -r http://<nyaan>/neko.html
```


# Solution

以下のようにしたら解決した

``` bash
wget -r -F -B http://<nyaan>/ -i http://<nyaan>/neko.html
```

- `-F <=> force-html` :
    - `-i`で指定するfileをHTMLとして認識させ`<a>`で指定されたURLをたどる
- `-B URL <=> --base=URL`
    - 相対リンクのベースを指定する．
    - e.g. `-F -i neko.html`としたとき`neko.html`が`http://<nyaan>`以下にある想定で相対リンクが書かれている場合，
    - 参考: [このブログ](https://www.saburo.org/shell/2005/08/wget.html)の応用5 (ブログタイトルが参照禁止っていう名前だけどこういう参照もだめだったかな）
- `-i file <=> --input-file=file`
    - [単独]ダウンロードしたいファイルのURLのリストを記述したファイルを指定する．
    - [w/ `-F`] ダウンロードしたいファイルのURLを `<a>`タグでふくんだHTMLを指定
    - このオプション指定時にはWGET自体のコマンドライン引数は必要ない


`-L` とか態々相対リンクだけたどるオプションもあるし，元々相対リンクもたどってくれそうだけど何故？
`index.html`じゃなかったからかなとも思ったけどよくわかってない．調べる気になったら調べて追記．



# Postscript
- `-i`の指定URLがリモートの場合，デフォルトでHTMLとして解析してくれる．
- また`-B`も指定されなければ，`-i`で指定したところをベースに相対リンクを追ってくれる．
- `-i`はそもそもその指定ファイルに`<a>`で示されているURLをたどろうとするため，今回のように指定ファイルに欲しいファイルがすべてリストされている場合`-r`もいらない
- `-i`で指定したファイルもダウンロードしてくれるっぽい

したがって，

``` bash
wget -i http://<nyaan>/neko.html
```

でOK．

ただし最初のトライ（`-r`オプションのみ）がだめなのが今なお謎．

# neko.htmlの中身
大学の当該の書類をリストしているページの中身は多少改変しているがミスも含めて大体以下．質素というよりなんかかなりお粗末．そのせい？

``` html

<HTML>
<HEAD>
<TITLE> neko </TITLE>
</HEAD>
<body>

<CENTER>
<H2>neko</H2>
</CENTER>

<br>

<h3>neko document</h3>
<UL>
<LI>cat1:  <a href="meow/cat1.pdf" target="_blank">PDF</a>
<LI>cat2:  <a href="meow/cat2.pdf" target="_blank">PDF</a> 
</UL>

<br>

</BODY>
</HTML>
```
Pythonコードを書くならColaboratoryが楽ちんでおすすめ！

#Pythonのコードを書くなら「Google Colaboratory」がおすすめ

YoutubeでPython動画をググっていたら下記のような動画が！

- [いまにゅのプログラミング塾](https://youtu.be/CtPKH-Azd08)

Pythonだけでなく、様々なプログラミング言語って**始めるのが大変だったりしませんか？**

たとえば

- パソコンの用意
- もろもろのインストール
- エラーの対処
- 思うようにならないストレス・・・

ところが、Google Colaboratoryならコードを書くことに専念できる環境をGoogleが用意してくれてました！

※素人な見解なので間違っていたらすみません。

ちょうどテキストエディターを「Vim」でやろうと思っていたのですが、なかなか思うように進まず腐っていましたｗ




単純にプログラムを書きたい、実行してみたいと思ったら「Google Colaboratory」を検証してみてください。

# Google Colaboratoryの導入方法

Googleアカウントというのでしょうか。Gmailを登録していて、Googleドライブが使えたらできるようです。私はすぐに使えました。

## Google Colaboratoryの参考URL

- [Google Colaboratory](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwii1MLusKfnAhWLfXAKHbT2CooQtwIwAHoECAQQAQ&url=https%3A%2F%2Fcolab.research.google.com%2Fnotebooks%2Fwelcome.ipynb%3Fhl%3Dja&usg=AOvVaw0qrT1c7i_vNFAUuRBp9c6M)はこのURLから
- 設定などのYouTube動画は[いまにゅのプログラミング塾](https://youtu.be/CtPKH-Azd08)から

Googleの人が丁寧に説明してくれている（英語ですが字幕付き）があり、チュートリアルのようなものがたくさんあるので、あまり心配しなくても大丈夫でした。

Googleまじですごすぎ、ありがとうございます！
研磨や艶出しなどの仕上げ工程にロボットを導入することの重要性

![How-e-series-breaks-down-automation-barriers.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575285/77129cc8-686f-387a-f2a9-b3ce92e757a0.jpeg)


仕上げ工程にロボットを導入することは生産性を向上するだけではなく、研磨と艶出し工程の持続可能性を向上させます。

事業における持続可能性の重要性
事業の持続可能性の向上は、収益増加に繋がる新しい機会創出や、税制上の優遇措置の適用、顧客ニーズへ応えるためなど、様々な観点から非常に重要です。

仕上げ工程はロボットによる自動化に最適で、それらの業務に従事する従業員の多くが抱えている悩みも解決してくれます。
製品の品質を向上するだけではなく、より正確な作業を実現することにも繋がります。
仕上げ工程にロボットを導入することで得られる持続性向上に関するメリット
仕上げ工程へのロボットの導入により次のようなメリットを享受できます。

十分な材料の除去

ロボットの導入により研磨や艶出しの工程の一貫性を高めることができます。適正なプログラミングを行えば、仕上げ工程でロボットは材料の表面に安定した力を加えることができます。 
ロボットは必要な部分だけに仕上げを施すため、手動で行う場合と比べ効率が良く持続可能性も向上します。

工具の摩耗の低減

仕上げ工程において無駄が発生する大きな原因は工具の摩耗です。工具が摩耗するため、工具と部品の表面に少量の水を使用する必要があり ます。
工具の摩耗をさらに低減するために可能な範囲で工具の仕上げの調整をすることができます。そのためには接触面の補正など様々なテクニックを用います。 
この機能により、仕上げロボットは工具の摩耗を調整できるよう自動で動作を修正します。

無駄を削減 

特に手動での研磨、艶出し工程においては、仕上げ工程で使用する研磨材が消耗することがあります。 
熟練の職人でも仕上げ材を完全に均一に使用できないことがあるため、無駄が発生してしまいます。 
ロボットの導入により、これを防ぐことができます。ロボットの活用は消耗を最小限に食い止めるのに非常に便利です。 

ロボットのプログラムは簡単に修正、更新でき、無駄をさらに省き、仕上げ工程の効率を向上することができます。

工具の寿命を延ばす

工具の摩耗を低減できるよう動作を調整できるロボットを導入すると、工具の寿命を延長することができます。
工具の寿命が延びると事業の持続可能性を様々な点で向上することができます。 
例えば、工具の不具合によるダウンタイムを最小化し、無駄を省くことができます。
製造業において、工具の寿命は作業の持続可能性を大幅に向上させることが調査によって明らかになっています。

従業員の福利、健康を向上する

仕上げ工程は時に危険を伴う作業だということはご存知でしょうか？研磨や艶出し作業中の繰り返しの動作は時に筋骨格障害を引き起こすことがあります。 
また、ダストを吸い込んでしまうことに起因する健康被害や、工具の騒音による聴覚障害などの懸念もあります。これらの危険は、従来の手動の仕上げ作業に代わりロボットを導入することにより防ぐことができます。

人材の有効活用

他のロボットの場合と同様に、仕上げロボットを導入すれば従業員は単調な繰り返し作業や危険な作業から解放されます。 
その結果、人間は、付加価値の高いより高度な仕事に専念することができます。従業員の能力や専門性を最大限に利用できるため、理想的な状態だと言えるでしょう。 
ロボットが人間の作業員にとって代わってしまうのでは…という不安の声をよく耳にしますが、これは現実的にあり得ないことが調査によって明らかになっています。これは設計など一部の業務は自動化できないためです。 
むしろ、ロボットは単調で退屈な作業以外の新しい仕事を創出することにより業務の持続可能性を向上するのです。

エネルギー消費を効率化

エネルギー消費量は持続性を決定する柱です。事業のエネルギー消費を最小限に抑えることで環境への負荷を軽減することができます。さらに、経営者にとっての悩みの種であるランニングコストを削減することができます。

1日の動作をプログラムすることで、ロボットを効率的に稼働させることが可能です。エネルギー消費量が最小の時にだけロボットを稼働するよう設定することでエネルギー消費を低減することができる、という研究結果もあります。

イノベーションの選択肢が増える
事業の持続可能性を強化するためには経営者はより革新的にならなくてはなりません。選択肢が増えることで経営者は工程全体の持続可能性を強化しやすくなるのです。

最後に

仕上げロボットは大小問わず全ての工場の持続可能性を向上するのに非常に有効です。ロボットの導入により今回ご紹介したようなメリットを間違いなく享受することができるでしょう。


詳細については、以下を参照してください。 https://www.universal-robots.com/ja/
アーキテクト / テックリードの本

# はじめに

アーキテクト、テックリードの本です。何回も読んだものからあんまり読んでないものまで。

# 書籍

[プログラマの「本懐」 ~アーキテクトという選択](https://www.amazon.co.jp/dp/4822282082)

アーキテクトの仕事の仕方を書いた本。古典?。14年前の本だがこの中で一番のおすすめ、「メンバーのレベルにあったアーキテクチャを作る」という今でも頻繁に起こっているアンチパターンについて説明している。

[DEBUGGING THE DEVELOPMENT PROCESS](https://www.amazon.co.jp/dp/475611623)

昔のマイクロソフトでのアーキテクトの仕事の仕方を書いた本。メンバーの技術習得を軸にしたモチベ管理を中心に書いている。

[Androidアプリ設計パターン入門](https://peaks.cc/books/architecture_patterns)
前半の〜パターンはどうでもよくて、メルカリのAndroidチームが相次ぐ機能拡張でボロボロになった設計を、ビジネスとのバランスをとりながらどう立て直してきたかの奮闘記が参考になる。

[Design It! ―プログラマーのためのアーキテクティング入門](https://www.amazon.co.jp/dp/4873118956)

あまり読んでいないが、技術選定を中心した話題に振り切っている？

[エンジニアのためのマネジメントキャリアパス ―テックリードからCTOまでマネジメントスキル向上ガイド](https://www.amazon.co.jp/dp/4873118484)

テックリード、CTO、エンジニアリングマネージャーの職務について書いた本

[アート・オブ・アジャイル デベロップメント
――組織を成功に導くエクストリームプログラミング](https://www.oreilly.co.jp/books/9784873113951/)

コーディング規約の考え方のところがが参考になった。

# まとめ

アーキテクトはテックリードは会社の文化に沿った技術を中心とした組織設計の側面が強い。
カイ二乗分布に従うデータとカイ二乗検定【統計検定2級・母集団のパラメータ未知の検定】


カイ二乗分布を使ったカイ二乗検定が統計検定2級で出てきますが、これをRを使って理解していきます。

#カイ二乗値とは


まず一番簡単な例として標準正規分布から得られたデータの二乗の合計値が考えられる。
標準正規分布とは平均0標準偏差1の分布である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/385ba4bc-7f71-516e-c3c3-1703e510b0a9.png)


標準正規分布から1つデータをとる。
このデータを2乗する。

#ここでデータの性質を考える

標準正規分布から得た1つのデータの二乗ということは、データの性質としては
・平均0に近い値が多く得られる
・二乗にしているから完全に正の値である
・二乗にしているから1よりも小さい値はより小さくなる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/68e99efe-97d1-8e8b-e7d2-10a2af2c6ab4.png)




こんな図になる。

#上記では1つとってきたが、同じようにもう一つとってきて、足し合わせたものはどうなるか


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/7ab27047-4f05-6b22-7d3f-66ab00683475.png)

1つの値の二乗ならば0に近い値が多かったが、2つの値の二乗を合計するので少しだけ大きい値にズレていることが分かる。

#4つくらい合計してみると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/f423c18b-0924-c25e-7533-756defe5aafa.png)

0に近い部分は少なくなった。
なぜなら平均0から得られる確率が一番高いとはいえども4回もサンプルをとってくると、
0よりもずれた値をとっているデータが多くなる。

そんな性質を表現している分布が**カイ二乗分布**と呼ばれる

この場合のカイ二乗分布は標準正規分布から4つデータをとってきて合計しているので
4が自由度となる。
念のため自由度4の理論的な分布を確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/8b1ac129-638e-99d0-e545-a0a0980d34f7.png)



#標準正規分布から抽出したデータの二乗ということは

抽出データをxとする。標準正規分布の平均は0であるので、平均からデータまでの距離を求めたいとするならば

(x - 0)^2

と書ける。
これがカイ二乗分布に従っていた。


#標準正規分布とはZスコアと等しい

抽出したデータをxとすると
母集団既知の場合、Zスコアは

Zスコア = (x - 母集団平均) / 母集団標準偏差

で変形できるのであった。
詳しくは[私の昔の記事](https://qiita.com/Ringa_hyj/items/94564d25cef0d9ac4292)に譲る。

つまりZスコアの二乗はカイ二乗分布に従うということ想定できる。

検定では「母集団標準偏差」が未知であるときに母集団標準偏差を推定しなさい。
と言われる。
信頼度95%で検定するのならば自由度n(データ数)に従うカイ二乗分布の下側2.5%、上側2.5%地点と比較して、
範囲を求めてやれば母集団標準偏差の信頼区間を求められる。

#母平均すら不明のとき

この時はサンプルデータの平均を母集団平均の位置に置き換えて
自由度をn-1にする。
この辺りは別の時にやる気があれば検証する・・・かも・・・

以下にコードを置いておくので適当に標本平均でZスコアへ標準化して自由度n-1のグラフと比較してみてほしい。

```r
n=10000
m=0
s=1

hist(rnorm(n,m,s))

norm_data <- rnorm(n,m,s)

bind <- NULL
bindn <- NULL
bindn2 <- NULL

for(i in 1:10000){

set_number <- sample(n)
sample_1 <- norm_data[set_number[1]]
sample_2 <- norm_data[set_number[2]]
sample_3 <- norm_data[set_number[3]]
sample_4 <- norm_data[set_number[4]]

sample_sum_square <- c(sample_1**2 + sample_2**2 + sample_3**2 + sample_4**2)

bind <- c(bind, sample_sum_square)
bindn <- c(bindn, sample_1**2)
bindn2 <- c(bindn2, sample_1**2 + sample_2**2)

}

hist(bindn,breaks=100)

hist(bindn2,breaks=100)

hist(bind,breaks=100)

hist(rchisq(10000, 4),breaks=100)
```
変数の使用イメージ


- 左辺で代入したら、様々な目的地に応じて値を運び、右辺から値を取り出す。
- 下から上には運べないので、上から下に下ろしていく。
- 下であれば、必要なときに何回でも取り出せる。<?php〜?>の範囲を飛び越えて運ぶことも可能。

- また、途中で値を再代入(上書き保存)できる。
その場合は、前のデータは共存できず消えてしまい別の値を運ぶことになる。
![val.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14068/29b9b93a-2e93-1f51-cb35-2f7cf7ce1c60.jpeg)
基本的な関数をイラスト図にしてみた

魚の素材をfxという調理場に渡せば、自動的に調理されたものが返ってくるので、後はお皿に盛り付けてテーブルに置くだけ。
![functionline.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14068/598d2b1b-fb53-d466-8016-3a5ccf0b7d5f.jpeg)
エミュレータで動作しているFirebase firestore, functionsにアクセスする


FirebaseのエミュレータはHostingやFunctions(WebAPI)を開発するときには便利で使い方も明確なのですが、firestoreやFunctions(onCall)のときにどう使うのかがわからなかったのでメモ。

## エミュレータの実行

エミュレータ自体は

```bash
firebase serve --only hosting, functions, firestore
```

などとすることで利用できる。

>firebase emulators:start --only hosting...としたときと挙動が違うらしいが、それは別途調査。

## Firestore

正直、rulesのテスト以外にどう使うのかわからない。@firebase/testingを利用すると利用されるのは知っていたが、そもそも普通のアプリをローカルテストする際などに利用できるものなのか（@firebase/testing以外から利用できるのか）とか。

結論から言えば **できる** みたい。

[ここ](https://firebase.google.com/docs/emulator-suite/connect_and_prototype)とかに書いている。

### コードで指定する

firebase.firestore().setting()にて接続先を指定することでエミュレータを利用できるよう。
initializeApp()での設定は無視されるよう。

```js
const firebase = require('firebase');

const firebaseConfig = {
    apiKey: "xxxxxxxxxxxxxxxxxxxxxx",
    authDomain: "xxxxxxxxx.firebaseapp.com",
    databaseURL: "https://xxxxxxxxx.firebaseio.com",
    projectId: "xxxxxxxxx",
    storageBucket: "xxxxxxxxxx.appspot.com",
    messagingSenderId: "xxxxxxxxxxxx",
    appId: "xxxxxxxxxxxxxxxxxxxxxxxxxx",
    measurementId: "xxxxxxxxxxxxxx"
};

firebase.initializeApp(firebaseConfig);
const db = firebase.firestore();

//settingにエミュレータを利用するように記述
db.settings({
    host: "localhost:8080",
    ssl: false,
});

const main = async () => {

    const res = await db.collection("items").add({
        name: "hoge",
        age: 13,
    })

}

main();
```


### 環境変数で指定する（継続調査）

また、ネットには

```
FIRESTORE_EMULATOR_HOST=localhost:8080
```

というような形で環境変数を設定すれば、エミュレータ上のFirestoreを見に行ってくれるよ！みたいに書いている記事がいくつかあったのですが、軽く試した感じでは動かなかったので、継続調査とする。誰か教えて。

## Functions

FunctionsでもWebAPI(onRequest)の場合は難しくないがCallable()等の際どうしたらいいかわからなかった。
firebase.functions().useFunctionsEmulator()というので接続先としてローカルを設定すると良いらしい。

>Functionsの場合、環境変数で指定するような方法はなさそう。

```js
const firebase = require('firebase');

const firebaseConfig = {
    apiKey: "xxxxxxxxxxxxxxxxxxxxxx",
    authDomain: "xxxxxxxxx.firebaseapp.com",
    databaseURL: "https://xxxxxxxxx.firebaseio.com",
    projectId: "xxxxxxxxx",
    storageBucket: "xxxxxxxxxx.appspot.com",
    messagingSenderId: "xxxxxxxxxxxx",
    appId: "xxxxxxxxxxxxxxxxxxxxxxxxxx",
    measurementId: "xxxxxxxxxxxxxx"
};

firebase.initializeApp(firebaseConfig);

const db = firebase.firestore();
const functions = firebase.functions();
//接続先指定
functions.useFunctionsEmulator('http://localhost:5000');


const main = async () => {

    //Callable functionを利用
    const helloOnCall = functions.httpsCallable("helloOnCall");
    const res = await helloOnCall({});
    console.log(res);

}

main();
```
NULLの入ったレコードの抽出で迷わないために【ポイント: SQLは3値論理】

# はじめに

例えばフィールドにNULLが含まれていたり、WHERE句にNULLが含まれているときに意図したレコードが抽出できないことはないでしょうか？
これには、SQLが3値論理であることが関係しています。
つまり、3値論理を理解すると、NULLと上手く付き合うことができるようになります。

# 3値論理について

## 2値論理

3値論理の前に2値論理をおさらいしておきます。
プログラミングでは、真偽値を頻繁に取り扱います。
真偽値とは、真（true）かもしくは僞（false）のいずれかを持つ値のことです。
true以外ならばfalseとなります。
条件がtrueとなる場合にだけ処理をするif文は説明するまでもないでしょう。

```:php
if ($a >= 100) {
  // $a >= 100がtrueの場合、このブロックの中身が実行される。
}
```

if文は「()」の中身がtrueの場合に「{}」の中身を実行する構文です。
変数の箇所を数値に置き換えてみると、下記になります。

```:php
if (101 > 100) {
  // 101 > 100はtrueなので、このブロックの中身が実行される。
}

if (99 > 100) {
  // 99 > 100はfalseなので、このブロックの中身は実行されない。
}
```

### 2値論理の真理値表

例えばPHPやJavaScriptではANDを表す`&&`という論理演算子やORを表す`||`という論理演算子が存在します。
例えば`a > 1`か`b > 5`のいずれかがtrueならば、`a > 1 || b > 5`は真となります。
表にすると下記になります。

| AND | true | false |
|:------:|:-------:|:--------:|
| true | true | false |
| false | false | false |

| OR | true | false |
|:------:|:-------:|:--------:|
| true | true | true |
| false | true | false |


## 3値論理

2値論理のtrue/falseにunknownという第3の値を持ち込むと3値論理になります。
表にすると下記になります。

### 3値論理の真理値表 

| AND | true | unknown | false |
|:------:|:-------:|:--------:|:------:|
| true | true | unknown | false |
| unknown | unknown | unknown | false |
| false | false | false | false |

| OR | true | unknown | false |
|:------:|:-------:|:--------:|:------:|
| true | true | true | true |
| unknown | true | unknown | unknown |
| false | true | unknown | false |

### SQLは3値論理

SQLは3値論理です。
SQLにおけるunknownは未知（値がわからないもの）や適用不能（論理的に値を表現することが不可能）を表します。
例えば年齢不詳の人の年齢は未知です。
人間の羽の色は、そもそも人間には羽はついていないので適用不能です。
データベースの世界では、フィールドの値がunknownであることを示すマークとしてNULLが用いられます。

# NULLの取り扱い

## NULLに比較述語を使った結果は全てunknownに評価される

NULLの行を選択しようとして下記のようなSQLを実行するも選択されない、こんなことをした人は多いと思います。

```
SELECT * FROM members WHERE age = NULL;
```

これはNULLに比較述語を適用した結果が常にunknownになるからです。
以下は全てunknownに評価されます。

```
10 = NULL
2 > NULL
34 <> NULL
NULL = NULL
NULL > NULL
NULL <> NULL
```

さらに重要なのは**NULLは値ではなく、値がないことを示すマーク**だということです。
NULLに比較述語を適用するとは、下記のようなことをしようとしているということです。

```
10 = NULL -- 値と値がないものが同じかどうかを比較しようとしている -> 10と不明が同じかどうかは不明
NULL = NULL -- 値がないものと値がないものが同じかどうかを比較しようとしている => 不明と不明が同じかどうかは不明
```

## trueのみが抽出対象

WHERE句を使ってレコードを抽出する場合、trueに評価されるもののみが対象となります。
当たり前のようですが、言い換えると、falseあるいは**unknownに評価されるものは対象外**です。
特にunknownが対象外となることは見落としやすいので注意が必要です。

以下のテーブル（membersとします）を考えてみます。

| name | age | 
|:------|:-------|
| 鈴木 | 30 |
| 佐藤 | 28 |
| 田中 | NULL |
| 吉田 | 31 |

30歳か30歳以外の人を選択する場合、4人共全員選ばれそうに思えますが、
実際は「田中」は選ばれず、結果は3人となります。
SQLは下記です。

```:sql
SELECT * FROM members WHERE age = 30 OR age <> 30;
```

真理値を表に加えるとイメージをつかめます。

| name | age | age = 30 | age <> 30 | age = 30 OR age <> 30 |
|:------|:-------|:-------|:-------|:-------|
| 鈴木 | 30 | true | false | true |
| 佐藤 | 28 | false | true | true |
| 田中 | NULL | unknown | unknown | unknown |
| 吉田 | 31 | false | true | true |

「田中」のレコードは `NULL = 30`を評価することになり、これはunknownに評価されます。
`NULL <> 30`もunknownです。
3値論理の真理値表で前述したように`NULL = 30 OR NULL <> 30` -> `unknown OR unknown`もunknownに評価されます。
trueだけが抽出対象になるため、「田中」は対象外になるということです。
docker + mysql が接続できない... Access denied for user 'homestead'@'172.20.0.1' (using password: YES)

# 問題
db のコンテナを立ててアプリからつなぐ際に、接続ができない。

ログ

```
Access denied for user 'root'@'172.18.0.5' (using password: YES)
```

docker-compose.yml

```yaml:docker-compose.yml
version: "3"
services:
  db:
    image: mysql:8.0.19
    ports:
      - 13306:3306
    volumes:
      - db-store:/var/lib/mysql
      - ./logs:/var/log/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=homestead
      - MYSQL_USER=homestead
      - MYSQL_PASSWORD=secret
      - TZ=${TZ}
volumes:
  db-store:

```

#解決策
volumeを削除したらできました。

#削除方法
```
$ docker-compose down --volumes
$ docker-compose up -d --build
```
**down** コマンド時に **--volumes** オプションを付けるとコンテナと名前付きボリュームの削除が出来るらしい。知らなかった。。。

#参考にした記事
docker-compose MySQL8.0 のDBコンテナを作成する
https://qiita.com/ucan-lab/items/b094dbfc12ac1cbee8cb
君は、FastExcelを知っているか。

EXCELのネタを拾いに行くのに利用しているサイトで一番なのが、[Excel and UDF Performance Stuff](https://fastexcel.wordpress.com/)です。
最新の記事のCheckDAとか、Excelに有用なツールが拾えます。
Charles Williams on 'Making Excel go Faster'とあるようにスピード狂なのか。
英文記事なので、ちょっと読むのがつらいです。
ffmpegった備忘録

# 概要
`ffmpeg`で
キャプチャした動画をgifにしたり、mp4にしたり、aiffをmp3にしたときのやり方を記録してるだけの投稿

**ffmpegってほんとべんり**

# 導入

Macでの導入はこれ
```
brew install ffmpeg
```

# ソリューション
## mov to mp4

twitterとかにキャプチャを上げたりするときにやる

```
ffmpeg -i <movファイルのパス> -pix_fmt yuv420p <出力するmp4ファイルのパス>
```

movからmp4変換したときにデフォルトオプションだとquick time playerとかで再生ができないので、
`-pxt_fmt yuv420p`を指定する。
pix_fmtってなんぞ => [参考](http://www.nnet.ne.jp/~hi6/lab/pixel/index.html)

## mov to gif
キャプチャをqiitaにあげて投稿したいとき
```
ffmpeg -i <movファイルのパス> -r 10 <出力するgifファイルのパス>
```

動画を10fps(10フレーム/秒間)のgif動画に変換する指定。fpsの指定はご随意に。
動画のままだと大きい。とお嘆きの方は `-vf` オプションをつけてみるとよきです。

### -vfオプション : scale
video filter のオプションです。-filter:vのエイリアスらしい。

```
# 指定した大きさに合わせてリサイズする
-vf "scale=1920:1020"
# 横幅に合わせてアスペクト比キープ
-vf "scale=1920:-1"
# 縦幅に合わせてアスペクト比キープ
-vf "scale=-1:1020"
```
`scale=横:縦` で指定できます。アスペクト比キープも簡単です

### -vfオプション : crop

```
# 元動画から指定した位置と大きさの画像を切り出す : 詳細は下
-vf "crop=160:100:30:30"
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39229/0898c3e3-a4ad-cd78-c607-594601cd2212.png" width="300" />

つまり `crop=横:縦:xの開始位置:yの開始位置` でcropする位置や幅を設定できる

### aiff to mp3
Macから直でCDにつっこむとaiffで取り込まれるので、mp3に変換するときはこちら
（下の設定だと曲情報飛ぶので、ミュージックプレイヤーとかに取り込むなら注意

```
ffmpeg -i <aiffファイルパス> -ab 224k <出力先のmp3ファイルパス>
```

たしか ab = audio bitrate

# まとめ
ffmpegは便利
年末年始はお金の勉強に終始してたので、そろそろUnityお勉強再開したい
MATCH,INDEXの再定義を少し修正しました。

以前投稿した[記事](https://qiita.com/matumoto_onga/items/7adfd4cf48288c477901)の関数DI,MIを使い勝手が良いように修正しました。
なにが変わったかというと、Range名が文字列でも可能となりました。
文字列で可能ということは、さらに拡張するとマクロ的な表現が可能となります。

```vb
Function DI(R, I, Optional J = 1, Optional S = "")          ' DATA INDEX
    On Error Resume Next
    
    If TS_(R) Then Set R = Range(R)
    If I > 0 Then S = WorksheetFunction.Index(R, I, J)
    If TS_(R) Then S = ""
    DI = S
End Function

Function MI(R, V, Optional S = "")     ' MATCH INDEX
     On Error Resume Next
     If TS_(R) Then Set R = Range(R)
     
     S = WorksheetFunction.Match(V, R, 0)
     MI = S
End Function

Function TS_(M, Optional N = "", Optional L = "", Optional T = "String")
    TS_ = TR_(M, T) * TR_(N, T) * TR_(L, T)
End Function

Function TR_(R, Optional T = "Range")
    TR_ = (TypeName(R) = T)
End Function
```
今後やらかさないために失敗の経験から学ぶ記事まとめ

##はじめに
[本番環境でやらかしちゃった人 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/yarakashi-production)を読ませて頂いて、
色々な意味で本当に勇気を貰いました。

失敗は成功の基ということで、
個人的にやらかしてくじけそうな時や、
落ち込んだときにこそ読みたい記事をまとめてみました。

##やらかした関連

[Gitでやらかした時に使える19個の奥義]
(https://qiita.com/muran001/items/dea2bbbaea1260098051)

[自分、何のGitコマンドやったか分かっとんのか...？]
(https://qiita.com/endo_hizumi/items/e20d30cf3214eaa8fb0e)

[本当にあったAWSでやらかした話と対策]
(https://qiita.com/kaito_suzuki/items/70a320efcc6a050be3d9)

[個人開発したアプリが大コケしてるので失敗要因を分析してみた]
(https://qiita.com/aiiro_swift/items/fe27eae6e708b187d341)

[さよなら本番サーバー]
(https://qiita.com/dala00/items/bc03f6522dd20969f481)

[いつものように本番作業してたはずなのに]
(https://qiita.com/2gt/items/d6906a185109e66df74f)

[バズるためにジョイマンARを作ろうとしたら権利周りとかめちゃくちゃ苦労した話]
(https://qiita.com/fushikky/items/127f7ab6c12d9b9140c9)

[エラーメッセージの読み方と対処, 検索や質問の原則]
(https://qiita.com/cannorin/items/eb062aae88bfe2ad6fe5)

[誰も教えてくれなかったMySQLの障害解析方法]
(https://qiita.com/muran001/items/14f19959d4723ffc29cc)

[失敗・炎上に名前をつけることで、僕たちはもっと強く、生産的になれる。]
(https://qiita.com/gakuri/items/7910299855ac16a7ca8c)


##やらかさないために関連

[初心者プログラマが犯しがちな過ち25選]
(https://qiita.com/rana_kualu/items/379eefb3a40c6b44cb92)

[レビュー前に直して欲しい日本語の問題点８つ]
(https://qiita.com/tonluqclml/items/bc63c294dda6010b63e9)

[新人プログラマをレビューで殺さない方法]
(https://qiita.com/hiraike32/items/32840b11536fa1b78621)

[やめた方が良いコーディング・設計、アンチパターン]
(https://qiita.com/peutes/items/ad046baa2428b522a133)

[正しい名前をつけることが大切な理由]
(https://qiita.com/tutinoco/items/85641c0819d813186f9d)

[良いエラーメッセージの書き方]
(https://qiita.com/castaneai/items/da6baec750370689e2fa)

[例外入門以前]
(https://qiita.com/Kokudori/items/3a953c00012408f76ab9)

[強い意志で定時に帰る]
(https://qiita.com/furu8ma/items/f909b8820c9d6d21897a)

[githubで最もやべー関数を発掘する]
(https://qiita.com/AngryMane/items/2be9016f82653c8cc07f)