OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift】日本語を含むURLを使いたい時はaddingPercentEncodingせよ

知らなくて、APIのコールにつまずいた。

json -> swiftの型生成は [quicktype](https://app.quicktype.io/) を使った

（NewsAPIからデータを取得しようとしてデコードで失敗した話はこちら
[【Swift】NewsAPIで取得したjsonのデコードで失敗して半日潰した話](https://qiita.com/komatsuuuuuna/items/4c6f5668c12952cc276a)）

APIで日本語を含むURLからデータをとってきたい時はaddingPercentEncodingを使う必要があった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513179/f272c595-87fe-4682-d1d5-4bd3453bac74.png)

なので日本語を含むURLの場合は以下のように書くべきだった
※`keyword`に日本語が入る

```
let NewsApiURL="https://newsapi.org/v2/everything?q=\(keyword)&num=3&sortBy=latest&apiKey=\(myApiKey)"
let encodedURL = NewsApiURL.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)

guard let url = NSURL(string: encodedURL!) else {
    print("無効なURLです。")
    return
}
```

のようにしてあげたらうまく行った。
[Angular] 「基本的なAngularアプリをはじめる」をやってみる(4)親コンポーネントにデータを渡す

#「基本的なAngularアプリをはじめる」をやってみる(4)

[[Angular] 「基本的なAngularアプリをはじめる」をやってみる(準備)](https://qiita.com/IwashiMorino/items/3325a4a3f7fe6692c259 "[Angular] 「基本的なAngularアプリをはじめる」をやってみる(準備)")

[[Angular] 「基本的なAngularアプリをはじめる」をやってみる(1)](https://qiita.com/IwashiMorino/items/91da278069abff1f500d "[Angular] 「基本的なAngularアプリをはじめる」をやってみる(1)")

[[Angular] 「基本的なAngularアプリをはじめる」をやってみる(2)](https://qiita.com/IwashiMorino/items/a11376f060639c3b4c74 "[Angular] 「基本的なAngularアプリをはじめる」をやってみる(2)")

[[Angular] 「基本的なAngularアプリをはじめる」をやってみる(3)子コンポーネントにデータを渡す](https://qiita.com/IwashiMorino/items/9930c34a73e0840ce6e9 "[Angular] 「基本的なAngularアプリをはじめる」をやってみる(3)子コンポーネントにデータを渡す")

Angular のチュートリアルをやってみています。

##親コンポーネントにデータを渡す

Angular公式ページ ： [親コンポーネントにデータを渡す](https://angular.jp/start#%E8%A6%AA%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%B8%A1%E3%81%99 "親コンポーネントにデータを渡す")

>Notify Meボタンを動作させるには、子コンポーネントが通知して親コンポーネントにデータを渡す必要があります。

#####1.product-alerts.component.ts で、Output と EventEmitter をインポートする

```typescript:product-alerts.component.ts
import { Component } from '@angular/core';
import { Input } from '@angular/core';
import { Output, EventEmitter } from '@angular/core';
```

#####2.notify という名前のプロパティを @Output() デコレーターと EventEmitter() のインスタンスで定義する

```typescript:product-alerts.component.ts
export class ProductAlertsComponent {
  @Input() product;
  @Output() notify = new EventEmitter();
}
```

#####3.Notify Meボタンをイベントバインディングで更新し、notify.emit()メソッドを呼び出す

```html:product-alerts.component.html
<p *ngIf="product.price > 700">
  <button (click)="notify.emit()">Notify Me</button>
</p>
```

#####4.product-list.component.ts で onNotify() メソッドを定義

```typescript:product-list.component.ts
export class ProductListComponent {
  products = products;
  test_1 = '製品';
  
  share() {
    window.alert('The product has been shared!');
  }

  onNotify() {
    window.alert('メッセージ : You will be notified when the product goes on sale');
  }
}
```

親の ProductListComponentは、ProductAlertsComponentがイベントを発生させたときに動作します。

#####5.product-list.component.html で、<app-product-alerts> を製品リストコンポーネントの onNotify() メソッドにバインドする

```html:product-list.component.html
<button (click)="share()">
  shareボタン
</button>

<app-product-alerts
  [product]="product" 
  (notify)="onNotify()">
</app-product-alerts>
```

Notify Meボタンをクリックすると、下図のようなアラートが表示されるようになります。
![022a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/897250/8acb06cf-4d1e-30be-57e1-a9d79cdd30ad.png)

ここまでで、いちおうAngularチュートリアルの入門編は終わりです。
MobaXTermことはじめ

# MobaXTermの概要
Windowsで使えるターミナルエミュレーター。

[MobaXterm free Xserver and tabbed SSH client for Windows](https://mobaxterm.mobatek.net/)


## 良いと思ったところ
- 良いところの中で一番気に入っているのはX11 serverが入っていること
Mobaxtermを入れるだけで、X windowが飛ばせる。PuttyとかだとX serverを別にインストールしないといけない。
- VNC, RDPクライアントになる
VNC, RDPのクライアントになるので、VNC用に別にアプリを入れる必要がない。
- WSLのインターフェースにもなる
デフォルトでは、WSLはwindows内にコンソールのような形で起動するが、mobaxtermのコンソールを使ってWSLを立ち上げることができる。X serverが使えるので、X windowを使えるアプリをaptなりyumでインストールすれば、WSL-mobaxtermからGUIが使える。
- sshの接続先のファイルがダウンロードできる
sshで接続した際に、sftpも同時につなげているようで、ウィンドウ左のエクスプローラー様の場所を操作することで、ローカルとリモートのファイルをやりとりできる

`.ssh/config`にいろいろ書いてlinuxのように使えるし、`apt-get install`で、いくつかのアプリケーションも追加できる。
Windows側のファイルは、WindowsのCドライブが`/mnt/c/`にマウントされているので、そこからたどればアクセスできる。

普通の人なら、Free editionで十分なはず。

# MobaXTermの初期設定

## アプリケーションのインストール
元々、`apt-get install`で入れる方法を試していたのだけれど、もしかするとアイコン付きのメニューにあるPackagesから入れる方が良いのかも。なぜか`apt-get install emacs`だと、警告が出てそれでもインストールを試みると、emacsがインストールされない症状が出たときにも、Packagesから入れたら入ったので。ちなみに`apt-get install emacs`でうまくいかない時は、二度目にこのコマンドを入力すると、既にインストールされています という旨のメッセージがでて、何も進まない。


### `apt-get install`をつかったインストール
非推奨なのかもしれないけれど、一応書いておく:

```bash
apt-get install emacs
```
## `.bashrc`

何はなくともとりあえず書いておくもの。

```bash:.bashrc
stty erase ^H

alias mv="mv -i"
alias cp="cp -i"
alias rm="rm -i"

alias emacs="emacs -nw"

export TERM=xterm-256color
```

## Emacsを使うときに設定する項目

上の`.bashrc`にも書いてあるけれど、以下を入れておかないと、backspaceを入力したときに問題が起きる。

```bash:.bashrc
stty erase ^H
```

emacsを使っているとき、ctrl + spaceを使うけれど、これがMobaXTermのショートカットと食い合っている。Settingタブ => Keyboard Shortcut 出てくるMacro Executeの箇所のショートカットを(None)に変える。Macro使いたい場合は、emacsと食い合わないキーの組み合わせに変える。

# アプリ内のファイル一式 
MobaXTermのファイル一式(何となくMobaXTermのアプリ/バイナリではなく、それが参照する設定ファイルが書き込まれたファイルいっしい)はWindowsの各ユーザーのドキュメント以下の`MobaXterm/home`に一般ユーザーのhome以下があり、いわゆる`/`以下は`MobaXTerm/slash/(コンピューター名)`に入っている。
【Swift】NewsAPIで取得したjsonのデコードで失敗して半日潰した話

#前提
swiftの入門書を読んだだけの初学者がニュースアプリを作ってみたレベル。
ニュースはNewsAPIから取得。
取得したjsonは [quicktype](https://app.quicktype.io/) を使ってswiftのコードを生成した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513179/18ff770b-557a-c3ab-c4e2-ea10f375d7d1.png)


生成されたコード

```

// This file was generated from JSON Schema using quicktype, do not modify it directly.
// To parse the JSON, add this file to your project and do:
//
//   let welcome = try? newJSONDecoder().decode(Welcome.self, from: jsonData)

import Foundation

// MARK: - Welcome
struct Welcome: Codable {
    let status: String
    let totalResults: Int
    let articles: [Article]
}

// MARK: - Article
struct Article: Codable {
    let source: Source
    let author: String?
    let title, articleDescription: String
    let url: String
    let urlToImage: String
    let publishedAt: Date
    let content: String?

    enum CodingKeys: String, CodingKey {
        case source, author, title
        case articleDescription = "description"
        case url, urlToImage, publishedAt, content
    }
}

// MARK: - Source
struct Source: Codable {
    let id: String?
    let name: String
}
```

#デコード処理に失敗した理由はデータ型のミスだった

設定の問題だったのか特にエラーも吐かず、なんで失敗しているのかわからなかったので、jsonとquicktype生成したコードをひたすらにらめっこしていたら、publishedAtの型が犯人だとわかった


json

```
// MARK: - Article
struct Article: Codable {
　　　　〜略〜
　　"publishedAt": "2020-12-07T14:30:00Z",
　　　　〜略〜
}
```


生成コード

```
let publishedAt: Date
```

修正後

```
let publishedAt: String
```



上記の型を修正したら無事にデコードできた。
firewall-cmdでローカルに来た特定のポートを別サーバの指定したポートへ転送する

## 追加
- externalzoneに所属してるネットワークインターフェースに5003ポートでアクセスが来たら、192.168.11.254:5003へ転送する
    - という例

```bash
firewall-cmd --zone=external --add-forward-port=port=5003:proto=tcp:toport=5003:toaddr=192.168.11.254 --permanent
```

### パラメータの意味
- `port=`
    - 待ち受けるポート
- `proto`
    - 待ち受けるポートのプロトコル
- `toport`
    - 転送先のポート
- `toaddr`
    - 転送先のIPアドレス


## 追加確認
```
firewall-cmd --list-forward-ports --zone=external
```

出力

```
port=5003:proto=tcp:toport=5003:toaddr=192.168.11.254
```

## 削除

```
firewall-cmd --zone=external --remove-forward-port=por
t=5003:proto=tcp:toport=5003:toaddr=192.168.11.254 --permanent
```
GitHub DeskTopについて

# はじめに
GitHub DeskTopを用いて、データ管理をする際の自分用メモです。

#GitHub DeskTopとは？
変更履歴などのバージョン管理を行うシステムのGitを
利用して複数人での開発を簡単に行うことのできるDeskTop用のアプリケーション

# GitHub DeskTopの使用手順
1.「GitHub DeskTop」のインストール + アカウント登録

2.左上の「Current Repository」→「Add」→「Add Existing Repository...」をクリック

3.表示されたPopupにて「Choose...」にて扱いたいアプリを選択

4.「Add Repository」をクリック

5.全ファイルを選択してコミットする。

6.「Publish Branch」でクリックする。
　※初回のみPopupが表示されるので、名前を確認し「Keep this code private」(公開するかしないか)を選択した後リモートリポジトリを作成する

7.「Current Branch」→「New Branch」→「作業内容の名称記入」でブランチを作成する。

8.作業ごとにcommitする。

9.「Publish Branch」をクリックしてプッシュする。

10.「Create Pull Request」をクリックして、プルリクエストを作成する。
　※読み取りやすさを重視して簡潔かつマークダウン表記で記述を行う。

11.プルリクエストのURLをレビュアーに送りレビュー依頼を行う。
　※修正依頼が来た場合は、修正を行う

12.レビュアーから「LGTM」をもらったら、「Marge Pull Request」→「Confirm marge」でマージを行う。

13.マージ完了後に、「Delete branch」をクリックしてブランチを削除する。

14.ブランチを「master」に切り替え、「Fetch origin」→「Pull origin」でプルを行う。

※１０〜13の作業内容は、リモートリポジトリ上(Web上)で行う。

#よくある困った時の解消方法
長くなってしまうので、後日、改めて別の記事で、記載予定です。
JavaScriptの便利部品

# 空文字確認
引数で渡されたオブジェクトが空文字だったらTRUEを返す部品

 - 空文字の条件
  - Null
  - Undefined
  - 長さ0のString
  - 長さ0のArray

#
    isBlank = function(chkObj) {
      if (chkObj == undefined || chkObj == null) {
        return true;
      }

      if (typeof chkObj == "boolean") {
        return !chkObj;
      } else if (typeof chkObj == "number") {
        return false;
      } else if (typeof chkObj == "string") {
        return (chkObj.length == 0) ? true : false;
      } else if (Array.isArray(chkObj)) {
        return (chkObj.length == 0) ? true : false;
      } else {
        return false
      }
    }

# 使い方
if文の中で真偽(空文字かどうか)判定をして、空文字で無ければその後の処理を行う
等の使い方です。

#
    // 例1 
    let unKnownVal = "test";
    if (!isBlank(unKnownVal)) {
      // 空文字で無ければコンソールに出力
      console.log(unKnownVal);
    }

    // 例2
    let unKnownVal = "";
    if(isBlank(unKnownVal)){
      // 空文字であればコンソールに出力
      console.log(unKnownVal);
    }
「【Ruby】配列から重複していない要素を取得する」を参考にSymPyLiveでやってみた。

(オリジナルポスト)
https://qiita.com/suzu12/items/af0ccbca88f33dec2fda#実践
https://qiita.com/suzu12/items/af0ccbca88f33dec2fda
##SymPy Liveで

Pythonでリストから重複した要素を抽出して、Pythonでlistのlistを引き算をしています。
もっと短くなるような気がします。教えて下さい。

https://live.sympy.org/

sum( [i for i in [1,2,3] if i not in [x for x in set([1,2,3]) if [1,2,3].count(x) > 1]])
6
sum( [i for i in [3,2,3] if i not in [x for x in set([3,2,3]) if [3,2,3].count(x) > 1]])
2
sum( [i for i in [3,3,3] if i not in [x for x in set([3,3,3]) if [3,3,3].count(x) > 1]])
0
rails error解消まとめ


▼問題点
railsにてコマンドrails　console　と打ったが下記errorがでる。

Usage:
  rails new APP_PATH [options]


▼対処手順
①qiitaで調べる

②gitやbundleの再インストールが必要？
⇨解決できず

③カレントディレクトリがプロジェクトと紐づいてないのでは？
⇨解決

▼所感
どうやら、ターミナルを新しく立ち上げた際にカレントディレクトリが変更されていたようだ。


初歩的だが、同じ系統の過ちが多いので留意する。
AWS CloudFormationのデプロイ済みスタックのテンプレートをYAMLで取得

デプロイ済みのスタックのテンプレートファイルがどうだったかを見たいときに、awscliの`aws cloudformation get-template`コマンドで見ることができます。

```console
$ aws cloudformation get-template --stack-name STACK_NAME
```

~~しかし、フォーマットはJSONで固定のようです。たとえデプロイ時はYAMLだったとしてもです。YAMLで見たい場合は、JSONからYAMLに変換する必要があります。~~

2021/03/08 追記
この記事を書いた当時なにを勘違いしていたのか不明ですが、YAMLでデプロイしたらYAMLで取得できます。↓もう一度記事にして整理しました。
[AWS CloudFormationのデプロイ済みスタックのテンプレートを取得 - Qiita](https://qiita.com/suzuki-navi/items/b901ec9741253dfa7ecb)


# yqコマンドでYAMLに変換

`yq`というコマンドがあります。JSONを扱う`jq`コマンドのYAML版です。

[yq: Command-line YAML/XML processor - jq wrapper for YAML and XML documents — yq documentation](https://kislyuk.github.io/yq/)

実行例

```console
$ aws cloudformation get-template --stack-name STACK_NAME | yq . -y
```

YAMLはJSONの上位互換なので、`yq`コマンドはYAML、JSONどちらも入力に受け付けます。出力はデフォルトではJSONで、 `-y` を付けることでYAML出力になります。


## yqコマンドのインストール

`yq`はPythonで書かれており、pipでインストールできます。

```console
$ pip install yq
```

内部で`jq`を呼び出しているようで、`jq`がないと次のようなエラーになります。

```
yq: Error starting jq: FileNotFoundError: [Errno 2] No such file or directory: 'jq'. Is jq installed and available on PATH?
```

`jq` のインストールはUbuntuならば

```console
$ sudo apt install -y jq
```

CentOS 8ならば

```console
$ sudo yum install -y jq
```


# RubyのワンライナーでYAMLに変換

JSONからYAMLへの変換はRubyのワンライナーでもできます。

```console
$ aws cloudformation get-template --stack-name STACK_NAME | ruby -rjson -ryaml -e 'puts YAML.dump(JSON.load(ARGF))'
```

と書いてから、ついさっきYAMLはJSONの上位互換と書いたばかりなのを思い出しました。次のほうが短くて済みます。

```console
$ aws cloudformation get-template --stack-name STACK_NAME | ruby -ryaml -e 'puts YAML.dump(YAML.load(ARGF))'
```
CSSで「余っている高さすべて」を指定する


やりたいのは上に説明文があって、残りを画像で埋めたい、みたいなケースです。

Flexible Box Layout を使います。

```html
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8"/>
    <style>
        body {
            margin: 0;
        }

        #content {
            display: flex;
            position: absolute;
            flex-direction: column;
            margin: 10px;
            width: 95vw;
            height: 95vh;
        }

        #content>p:last-of-type {
            flex: 1;
            min-height: 100px;
        }

        .image {
            height: 100%;
            max-width: 100%;
        }
    </style>
</head>

<body>
    <div id="content">
        <h1>Flexible Box Layoutのサンプル</h1>
        <ul>
            <li>hogehoge</li>
            <li>fugafuga</li>
        </ul>
        <p><img src="computer_desktop_document.png" class="image"></p>
    </div>
</body>

</html>
```
GCP で Latency を計測し可視化する

# はじめに
Regression Test で Web Application のレイテンシを計測する話です。

# レイテンシの機械的な集計
以前の記事でも書いていますが、レガシーな monolithic な system を Cloud に Lift & Shift を行っています。
数百ある Web-API の性能劣化の有無を確認するため、Production 環境の Packet をリプレイしています。

この結果を機械的に集計する方法について。

Web サーバーの log に処理時間を出力し、それを集計するというのが、当初の計画でした。
conf の Log format を変更して、それを集計する。

# 対応策
より効率的な方法を考察し、たどり着いたのは、LoadBarancer の log にある `latency` を bq で集計する。

```yaml:log-query
severity=INFO
httpRequest.requestMethod="POST"
```

1. logging をシンクで bq に送る。
2. bq でクエリを作成する。対象は、`httpRequest.requestUrl` `httpRequest.latency`
3. データポータルを作成する。
4. カスタムクエリでデータを抽出する。
5. グラフを作成する。

![qiita_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569971/69dea4c7-0160-5324-a7d3-5d1c63ad318a.png)


これで、解決しました。

# まとめ
これがベストなのかは、考察を続けたいと思います。
以上。

皆さんの参考になれば幸いです。
『アウトプット』の重要性


・記事の概要

webエンジニアとして活動したく、現在独学でPHPの学習に取り組んでいます。
PHPを用いたWebアプリケーション開発経験を積んでいきたいので、
効率的な学習のためにもインプット、アウトプット、フィードバックを繰り返していくためにこの場をかりていこうと思います。

ショッピングサイトやチケット購入サイトを利用することが多く、自分でもECサイト関連を作ってみたいと思ったので
ポートフォリオを作成の記録を残していこうと思います。

①スペック

言語：PHP 7.2.24

DBMS：MySQL

CSSフレームワーク：milligram

開発環境：macOS Catalina 10.15.6、Apache 2.4.46

バージョン管理：Git 2.21.0

本番環境：Heroku



②Webアプリケーションの機能

公演のチケットを購入することができる。

サイトマップ
![IMG_6492.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671217/1a99fc3e-ba34-fee1-7377-3cbcfe8ca14d.jpeg)

データベース図は後ほど。
Sassでeach文を書く

## はじめに

タイトルについて記事にしました。
この記事で得る内容は以下の通りです。

・ Sassでeach文を使って効率よく修正・変更をする方法

## 例

例えば、以下のようなSNSで共有する項目があったとします

![スクリーンショット 2021-01-07 14.09.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/7c82d9a8-e961-ee71-c5af-70e1ec9e6a30.png)

```haml:index.haml
%button.twitter twitterで呟く
%button.facebook facebookで共有する
%button.line LINEで開く
```

##### 配列の定義

`$変数名: ('文字列A', '文字列B', '文字列C');`のように記述します。

```scss:style.scss
$sns: ('twitter', 'facebook', 'line');
```

##### each文の定義

`@each $eachで使う変数名 in $配列の変数名{}`のように記述します。
each文は配列の文字列を順番に取り出して、文字列の数だけ処理を行います。

```scss:style.scss
@each $value in $sns { 
}
```

##### 連想配列の定義

今回は、twitter,facebook,lineそれぞれのボタンを、each文を使ってそれぞれに色をつけたいと思います。
まず、先程定義した変数`$sns`を連想配列を使い書き換えます。

```scss:style.scss
$sns: (
  'twitter': #00aced,
  'facebook': #305097,
  'line': #5ae628
);
```

コロンの左側が`$key`、右側が`$value`となります。
画像のように`$key`をクラス名にし、`$value`を`background-color`プロパティに当てます。

![スクリーンショット 2021-01-07 17.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/5520235c-cc43-8ea6-91b5-290223dd52c3.png)

`@each`の横に、`$key`とカンマ区切りで`$value`と書くとそれぞれを呼び出すことができます。
また、`$key`と`$value`の変数名も自由に決めることができます。

`$key`の呼び出し方が少し特殊で、呼び出すには`#{$key}`と記述します。
この記述方法を<font color="red">インターポレーション</font>といいます。

> [Sass - チュートリアル](https://hail2u.net/documents/sass-tutorial.html)より引用
> 変数はプロパティの値に使えるだけではありません。
>  #{} で括ることによってプロパティ名やセレクタに使うこともできます:

```scss:style.scss
@each $key, $value in $sns {
  button.#{$key} {
    background-color: $value;
  }
}
```

結果、それぞれ配列の`$value`が順番に取り出されて、各ボタンにプロパティを適用することができました。

![スクリーンショット 2021-01-07 18.11.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/142e5801-e230-4f4a-b52b-8e8c0564e811.png)
Pythonでフォルダ内の日付順に管理されたExcelファイルの最新データを開いてみた

```Python
import subprocess
import glob
import pathlib

def findOpen(url, fil):
        share = pathlib.WindowsPath(url)
        try:
                if share.exists():
                        path = ''
                        print(url)
                        for x in share.glob(fil):
                                print(x)
                                path = str(x)
                        if path != '':
                                print('Open : ' + path)
                                subprocess.Popen(['start','', path], shell=True)
        except:
                import traceback
                traceback.print_exc()
                input("Press Enter to continue...")

url = r'C:\\フォルダ'
fil = '[!(~$)]*ファイル名.xls?'

findOpen(url,fil)
PHP 0を使って桁数を揃える

# 目的

- PHPのsprintf関数を使用して数値の桁数を合わせる方法をメモ的にまとめる

# 情報

- 筆者は下記のサイトで動作を確認した。
    - [https://paiza.io/ja](https://paiza.io/ja) 

# 方法

- 下記を実行する。

    ```php
    printf("%'空欄部分を埋めたい文字桁数d\n", 数値);
    ```

- 例えば数値「123456789」を「00123456789」としたいときは下記のようになる。

    ```php
    printf("%'011d\n", 123456789);
    ```

# 参考文献

- [https://www.php.net/manual/ja/function.sprintf.php](https://www.php.net/manual/ja/function.sprintf.php)
【ネットワーク用語】TCPヘッダとは

__[TCP](https://qiita.com/sasami_dc2/items/025b0817708be64592f6)__のデータの伝送単位をTCPパケットと呼ぶが、その先頭にある制御情報の部分のことを表す。
先頭の20バイトは以下の表の上から順に内容が固定されている。

|フィールド名|ビット長|内容|
|:--|:--:|:--|
|送信元ポート番号|16|送信側のプログラムポート番号|
|宛先ポート番号|16|受信側のプログラムポート番号|
|シーケンス番号|32|先頭位置のデータが送信データの何バイト目かを受信側へ伝える番号|
|ACK番号|32|何バイト目までのデータが届いたかを伝える番号|
|データ・オフセット|4|データ部分の開始箇所を表す|
|未使用|6|特になし|
|コントロール・ビット|6|ビットの内容によって通信制御のいみが変わる([こちらを参照](https://qiita.com/sasami_dc2/items/103fb95534f0890bdde1))|
|ウインドウ|16|受信側から送信側に受信確認を待たずに<br/>送信可能なデータ量(ウインドウ・サイズ)を通知するための番号|
|チェックサム|16|誤りの有無を表す|
|緊急ポインタ|16|緊急処理が必要なデータ位置を表す|
|オプション|可変長|上記以外のヘッダー・フィールドを記載するオプション追加が可能|
Python 3.8の新構文【代入式】

# はじめに
　[Effective Python 第二版](https://www.oreilly.co.jp/books/9784873119175/)をよんで、感動した機能などを備忘録を兼ねてまとめておきたいと思います。チョイスは個人的な主観でやっているのでご承知おきください。。

# 代入式とは？
　簡単にいうと、**if文で使う変数の宣言を短く記述できる**ものです。
具体的には、ifの条件式のなかで **:=（セイウチ演算子）**を使って式の評価と変数への代入をひといきに行います。

　例えば、フルーツの在庫を表す辞書があるとします。

```python
fruits = {
  'apple': 10,
  'banana': 8,
  'lemon': 5,
}
```
　リンゴジュースをつくるのに少なくとも４つのリンゴが必要な場合、ジュースを実際につくれるかどうかは下のように条件分岐できます。

```python
n_apple = fruits.get('apple', 0)
if n_apple >= 4:
  # n_apple個のリンゴでジュースを作る
  make_juice(n_apple
else:
  # 在庫不足のためジュースを作らない
  out_of_stock()
```

　これを**セイウチ演算子**を使って同じような動作を記述すると、

```python
# リンゴの個数の評価と変数への代入を同時に行う
if (n_apple := fruits.get('apple', 0)) >= 4: 
  make_juice(n_apple)
else:
  out_of_stock()
```
　一見してコードが一行へっただけのように思えますが、このような書き方をすることで、n_appleがifの１つ目のブロックにしか使われないことを明確に表現することができます。

# 応用例
　これだけだと、いまいち良さが理解できないと思うので、よりうれしい例を取り上げてみます。
　バナナ→リンゴ→レモンの順番で優先順位をつけて在庫を消化したいとします。また、ジュースをつくるのに最低限必要なフルーツの個数はバナナは２本、リンゴは４個、レモンは１個とします。
　おそらく、以下のような**入れ子になったif-elseブロック**を作るのではないでしょうか。

```python
n_banana = fruits.get('banana', 0)
if n_banana >= 2:
  # バナナが２個以上ならバナナジュースを作る
  make_juice(n_banana)
else:
  n_apple = fruits.get('apple', 0)
  if n_apple >= 4:
    # リンゴが４個以上ならリンゴジュースを作る
    make_juice(n_apple)
  else:
    n_lemon = fruits.get('lemon', 0)
    if n_lemon:
      # レモンが１個以上ならレモンジュースを作る
      make_juice(n_lemon)
    else:
      # 在庫不足のためジュースを作らない
      out_of_stock()
```
　これはかなり冗長な感じがしますよね。セイウチ演算子を使うと以下のようになります。

```python
if (n_banana := fruits.get('banana', 0)) >= 2:
  # バナナが２個以上ならバナナジュースを作る
  make_juice(n_banana)
elif (n_apple := fruits.get('apple', 0)) >= 4:
  # リンゴが４個以上ならリンゴジュースを作る
  make_juice(n_apple)
elif n_lemon = fruits.get('lemon', 0):
  # レモンが１個以上ならレモンジュースを作る
  make_juice(n_lemon)
else:
  # 在庫不足のためジュースを作らない
  out_of_stock()
```
　大分よみやすくなりました。
　どうですか？これなら使ってみたくなったのではないでしょうか(笑)。
　ただし、**代入された変数を比較に使う場合には代入式を括弧でくくる**必要があることに注意してください。

# do-while文的な使い方
　もう少し応用的な使い方を紹介します。**pythonにはdo/whileループがありません**が、whileブロックとbreak文で同じようなロジックを実装できます。
　例えば、在庫の補充とジュースの瓶詰を繰り返しおこなう処理を考えます。在庫の補充がなくなった時点で処理を終了させます。
 make_juice()関数は、フルーツの種類と個数を受け取って適切な本数（batch）の瓶づめジュースを返すように変更したとします。

```python
# 瓶を収納するケース
bottles = []
while True:
  # フルーツを補充
  fruits = pick_fruit() 
  if not fruits:
    # 補充がなければ終了
    break
  for fruit, count in fruits.items():
    # フルーツごとに適切な本数に瓶詰め
    batch = make_juice(fruit, count)
    # 瓶をケースに追加
    bottles.extend(batch)
```
　このような処理も代入式で短く書くことができます。

```python
bottles = []
# 補充したフルーツをfruits変数に代入&空かどうか評価
while fruits := pick_fruit():
  for fruit, count in fruits.items():
    batch = make_juice(fruit, count)
    bottles.extend(batch)
```
　代入文とbreakのためのifブロックが不要になったのがうれしいですね。

# おわりに
　セイウチ演算子、なかなか便利ですね。python3.8を仕事では使わないけど、この機能は3.7にもあってほしい。

# 参考文献
　[Effective Python 第2版 ―Pythonプログラムを改良する90項目](https://www.oreilly.co.jp/books/9784873119175/)
【ネットワーク用語】コントロール・ビットの内容一覧

フィールド内の各ビットによって通信制御上の意味が変わる

|ビット名|内容|
|:--|:--|
|URG|緊急ポインタのフィールドが有効なことを表す|
|ACK|受信データの連番フィールドが有効であることを表す<br/>(通常はデータが正常に届いたかを表す)|
|PSH|flush動作で送信されたデータであることを表す|
|RST|接続を強制終了する|
|SYN|送信側と受信側で連番を確認しあう|
|FIN|切断を表す|
Pythonでフォルダ配下のファイルをファイル名で検索してみた

# ソースコード
```Python
import subprocess
import glob
import pathlib

def find(url, fil):
        share = pathlib.WindowsPath(url)
        try:
                if share.exists():
                        print(url)
                        for x in share.glob(fil):
                                print(str(x).replace(url, ''))
                return True
        except:
                import traceback
                traceback.print_exc()
                input("Press Enter to continue...")
                return False

def doFunc():
        print('検索キーワードを入力して下さい')
        word = input()

        if word:
                print('キーワード 『'+word+'』で検索中です。')
                url = r'D:\\対象フォルダ'
                fil = '**/[!(~$)]*' + word + '*.*'
                return find(url,fil)
        else:
                return True

        input("検索が完了しました。\nEnterキーを押すと処理を終了します。")


while doFunc():
        print('処理を継続します！\n'+"-"*100)
```
はじめてのterraform

> ※ terraformプロジェクトが既に運用されているけど初めてterraformに触れるよっていう前提です

## そもそもterraformとは
超ざっくり言うとソースコードでインフラ構築できちゃうツールです
最初勘違いしてたんですが、AWSのサービスではないです

## tfenv導入
自分のPCにterraformをインストールする前にtfenvを導入します

terraformは割と頻繁にアップデートがあって、バージョンがちょっと違うだけでも動かなくなったりするのでrubyでいうrbenvのようなバージョン管理ツールを入れといた方が後々楽だと思います

```
$ brew install tfenv
```

既にterraformを導入済み等の場合は、正しく動くようにコマンドを実行してくれって出てくるので忘れずに実行しましょう

```
// 例1
Please `brew unlink terraform` before continuing.

// 例2
To force the link and overwrite all conflicting files:
  brew link --overwrite tfenv
```

terraformをインストールするときは下記コマンドを実行します

```
$ tfenv install 0.12.29 // インストールしたいバージョン 又は latest
```

インストール終わったらuseコマンドでそのバージョンを使うようにします

```
$ tfenv use 0.12.29
```

最後に下記コマンドで正しく設定されたか確認します

```
$ terraform -v
> Terraform v0.12.29
```

他にtfenvでできることは下記の記事がわかりやすかったです
https://qiita.com/kamatama_41/items/ba59a070d8389aab7694

## 前回構築した時のバージョンを確認する
先に書いたようにバージョンが違うと動かなくなる可能性が高いので、(別の人が)前回構築した時のバージョンと同じにするのが良さそうですよね

前回構築した時の情報はAWSのS3に保存されています(この辺はプロジェクトに寄って違ったりするかも？です)
tfstateファイル(xxxx.tfstate)を探して中身を見てみると、上から2つ目に`"terraform_version"`があると思います
これが前回構築した時のterraformのバージョンです
それからコードが変更されてなければこのterraformのバージョンを使えばうまくいく"はず"です

## 実行してみる
terraformで構築するまでの大まかな流れは初期化して、確認して、構築！です

1. プロジェクトの中はおそらく環境毎にフォルダ分けされてると思うので、構築したい環境に移動します
2. `$ terraform init`を実行して初期化します
3. `$ terraform plan`を実行して前回との差分を確認します
4. 問題なければ`$ terraform apply`を実行するとインフラ構築されます

(applyするとtfstateファイルが生成されるみたいです)

#### 認証周り
init実行してクレデンシャルがどうのこうのとか、見つかんないよってエラーが出たらだいたい認証周りの不備の可能性大です
下記を特に見直してみるといいかもです(自分はアクセスキーが未発行の状態でinitしてました…orz)

- 秘密鍵と公開鍵が正しくセットされているか
- アクセスキーとシークレットアクセスキーが発行済みでちゃんと設定されているか
  - 複数ある場合は切り替わっているか 

　

超ざっくりな解説でしたが、これさえできれば最低限の運用はなんとかなりそうです！
[Swift] Resultのもう一つの使い方？

:::note warn
(2021年9月追記)
Swift 5.5以降、computed propertyでも`throw`できるようになりました。
参照: https://github.com/apple/swift-evolution/blob/main/proposals/0310-effectful-readonly-properties.md
この記事はSwift 5.4以前を前提としています。
:::

# 最初に結論

`Result`をcomputed propertyで使うのはどうですか？(※推奨ではなく提案)


# Computed propertyでも`throw`したい！

Swiftでは次のようなコードは書けません(Swift 5現在)。

```Swift
enum E: Error {
  case someError
}

struct S {
  var someProperty: throws Int { // ⛔️ コンパイルできない
    if Bool.random() {
      return 0
    } else {
      throw E.someError
    }
  }
}
```

なぜならば、そもそもプロパティに対して`throws`というキーワードを使うことができないからです。`throws`は`func`(またはクロージャ)でしか使えないので、同様のことをしたい場合、普通はこうします：

```Swift
enum E: Error {
  case someError
}

struct S {
  func someProperty() throws -> Int {
    if Bool.random() {
      return 0
    } else {
      throw E.someError
    }
  }
}
```

…ところで、`Result`を使うという手もありませんかね？？

```Swift
enum E: Error {
  case someError
}

struct S {
  var someProperty: Result<Int, Error> {
    return .init(catching: {
      if Bool.random() {
        return 0
      } else {
        throw E.someError
      }
    })
  }
}
```


# `Result`を使うメリット？

特にメリットはありませんけども…あえて挙げるなら：

- *“プロパティはあくまでプロパティであってほしい。`func`は使いたくない。”*と思う気持ちを実現する。
- `.get()`を呼び出すまで評価[^eval]を遅延できる。

[^eval]: ここでいう「評価」とはエラーが生じたかどうかを確認するという意味


# おわりに

単なる思いつきですが、個人的には*`public`じゃない(∴そのモジュール内で完結する)プロパティ*で使用すると便利な(場面がある)のではないかと考えています。
Pythonでファイルをダウンロードする

[言語処理100本ノック 2020 (Rev 2)](https://nlp100.github.io/ja/)ではファイルをダウンロードしてから処理することが多い

いろんなやり方があるので収集してみる。

ファイルは[第3章: 正規表現](https://nlp100.github.io/ja/ch03.html)の[jawiki-country.json.gz](https://nlp100.github.io/data/jawiki-country.json.gz)

[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)にて実施
#requests

```python:requests.py
import requests

url='https://nlp100.github.io/data/jawiki-country.json.gz'
filename='jawiki-country.json.gz'

urlData = requests.get(url).content

with open(filename ,mode='wb') as f: # wb でバイト型を書き込める
  f.write(urlData)
```

自分のやり方。
[Requets](https://requests-docs-ja.readthedocs.io/en/latest/)は`wget`とおんなじ感じで使えるのがいい。

ファイルの書き込みは定番のやり方

[Python、Requestsを使ったダウンロード](https://blog.narito.ninja/detail/67/)のように大きなファイルを扱うのもできるのでしょう。

```python:requests2.py
import requests
import os

url='https://nlp100.github.io/data/jawiki-country.json.gz'
filename=os.path.basename(url)

r = requests.get(url, stream=True)
with open(filename, 'wb') as f:
  for chunk in r.iter_content(chunk_size=1024):
    if chunk:
      f.write(chunk)
      f.flush()
```

直で書き込むにはこちら。

#urllib.request

```python:urllib_request.py
import urllib.request

url='https://nlp100.github.io/data/jawiki-country.json.gz'
save_name='jawiki-country.json.gz'

urllib.request.urlretrieve(url, save_name)
```

今回で調べてみたら出てきました。
[pythonでwebからのファイルのダウンロード](https://sites.google.com/site/hymd3a/python/python-download)
ファイルのセーブまでできるすぐれもの

#pandas.read_X
```python:read_X.py
import pandas as pd

url='https://nlp100.github.io/data/jawiki-country.json.gz'

df=pd.read_json(url, lines=True)
```

第２章で大活躍だった[pandas](https://pandas.pydata.org/pandas-docs/stable/index.html)

[input/output](https://pandas.pydata.org/pandas-docs/stable/reference/io.html)にある各コマンドはurlから直で読めて圧縮も自動で判別してくれる優れもの。

読み込むと[データフレーム](https://pandas.pydata.org/pandas-docs/stable/getting_started/intro_tutorials/01_table_oriented.html)になってしまうので使いどころを選ぶけど、そのまま処理するのであればこちらでもいい。

#まとめ
コマンドだと`wget`でなにも考えなくていいけど、プログラムからやる時はそれなりに考えないといけない。

いずれかの方法でやっていけばいいと思います。
PHP8にアップデートしたら、laravelでMethod ReflectionParameter::getClass() is deprecated in ... エラーが出た話

## 使用していたバージョン
Laravel Framework 7.30.1
PHP 8.0.0 

## エラー発生時
laravelでいつものように``php artisan コマンド``を使ったが、

```
Method ReflectionParameter::getClass() is deprecated in ...
```
長ったらしい文が出てきて、コマンドが使えない。

参考サイトによるとphp8で推奨されていないらしい、、、。

## 解決方法
- composer.jsonファイルのphpのバージョンを変更
例えば

```
php:^7.2.5  =>  php:^8.0
```
- コマンドで``composer update``を実行
で解決します。

** また、バージョン変更により本番環境でがシステムが動かなくなる可能性があるので、
念のため

```
php:^7.2.5  =>  php:^8.0
ではなく

php:^7.2.5|^8.0
```
上記のように書き換えるといいです。




## 参考サイト
- [slack overflow](https://stackoverflow.com/questions/65218631/laravel-app-stopped-working-after-upgrading-to-php-8)
- [laravel公式ブログ](https://blog.laravel.com/laravel-php-8-support)
ひとくちExcel スピルで指定の列全体を動的に取得する


CSVデータ等の表データから何かしらの計算をする際に
計算用の列に「列全体をとりあえず持ってきたい」ケースがあると思います。

データが入っているシート[Sheet1]の指定の列A全体を抜き出す関数を作ってみました。

例えば以下のような表がシート[Sheet1]にある場合
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/f1acf98b-939b-a98f-40b8-b421efbe879f.png)


別シート[Sheet2]のセル[A1]に

```
=Sheet1!A:A
```
と入力して全表示しても良いのですが、これではデータ量が多くなった場合や計算を絡めた場合にこの参照を用いると処理が重くなります。

なのでCOUNTA関数で「ここからここまで」と正確な範囲を指定することで処理の負荷を抑えられます。


```
=INDIRECT("'"&$A$2&"'!"&B2&"1:"&B2&COUNTA(INDIRECT("'"&$A$2&"'!"&B2&":"&B2)))
```

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/d31d5092-09ce-f1be-c8d1-3f51eef13ada.png)

参照先はダブルクリックで参照を表示させドラッグで変更してお使いください。
わざわざ引数をINDIRECT関数でゴチャゴチャさせた理由は、参照先の変化に対応させる為です。

上記の関数では、セル[A2][B2]をパラメータとして扱うことで、参照先の変化に対応させます。
これなら急に列の参照位置が変わってもアルファベットを変えれば楽に変更が可能です。

またケースによっては、「1行目の見出し行は含みたくない」時もあると思います。
その場合は以下のようにデータの開始位置を指定できるようにすればメンテナンス性も向上するでしょう。

```
=INDIRECT("'"&$A$2&"'!"&B2&C2&":"&B2&COUNTA(INDIRECT("'"&$A$2&"'!"&B2&":"&B2)))
```

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/4e709888-0e18-8639-f57b-4fe7877475aa.png)


##応用例：列のアルファベットを入力しておき、オートフィルで参照させる

参照先をパラメーターで動的に指定できるようになったので、参照が増えた時のことを考えます。
以下のような表があるとします。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/5de8e2e0-4ea9-095b-d052-bc0e5133deef.png)

この表を先ほどの関数で1つ1つ定義していっては時間がかかるので、
上記の関数を少し変えてオートフィルで参照を増減できるようにします。

```
=INDIRECT("'"&$A$2&"'!"&B1&"1:"&B1&COUNTA(INDIRECT("'"&$A$2&"'!"&B1&":"&B1)))
```

これで、参照列さえ押さえていれば逐一データシートを身に行って確認しながら参照の設定を行わなくてもよくなりました。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/7c4347d6-35c7-29a7-b647-d74226cd1366.png)

列でアルファベットの連続データを作成したい場合には、先頭のアルファベットが入力されているセルに
以下の関数で次のように関数を入れオートフィルすれば良いでしょう。(Zまでしか入力できませんが)

```
=CHAR(CODE(B1)+1)
```

#まとめ
Excelのライセンスによってはスピル機能が使えない場合があります。
他人が使うテンプレートを作る場合は使う人のExcelを確認してから渡しましょう。
Android Studio ＋GitをProxy設定＆Proxy設定解除

## 出来事
昨今の大学生は全員サイバーテロや違法サイトに興味あると思っているのか知らないですが、
大学の学内でのHTTP通信は、すべて監視用のProxyサーバーを経由しなければなりません。

僕は誰かを幸せにするAndroidアプリを開発したいだけなのに。。。。

3億番煎じかもしれませんが、今回は**Android開発をProxyを経由して行う方法**と**Proxy設定後の正しい解除の方法**を書いていきます。

## Android開発の場合
・Git
・Gradle
この2つのProxyの設定が主に必要であります。
Gitを使っていない人は、Gitはやらなくていいと思います。

## Proxyの設定をするとき
##### 1. Android Studio のSettingでProxyをセッティングする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520701/63fdcbe6-8449-e6b3-5bf3-93cf6161ef22.png)

こんな感じ

##### 2. Project直下の`gradle.properties`を変更

```
systemProp.http.proxyHost=proxy.hoge
systemProp.http.proxyPort=8080
systemProp.https.proxyHost=proxy.hoge
systemProp.https.proxyPort=8080
```

多くは語るまい。

##### 3. Git

自分はWindowsなので、GitBashかWslで以下コマンドを打ちます。

```shell
git config --global http.proxy http://proxy.hoge:8080
git config --global https.proxy http://proxy.hoge:8080
```

自分の場合、`.sh`ファイルでまとめて使うようにしています。

直接2回コマンドを叩いても問題ありません。



## Proxyを解除するとき

家やカフェなど、Proxyサーバーを経由しない場所のネットワークを使う場合、

Proxyサーバを経由させる設定のままですと、永遠に通信が終わりません。

自分の場合、アプリのビルドがいつまで経っても終わりませんでした。

ゆえに解除させる必要があります。

やることを載せておきます

##### 1. Android Studio のSettingで`No Proxy`にチェックを入れる

##### 2. Project直下の`gradle.properties` からProxyの記述を削除

ようは、Proxyの設定を行う際と逆のことをするだけです。しかし、これだけではProxyの設定が解除されきらないことがあります。

先ほどやったことをすべて直したというのに、Buildが終わりません。

結果、もう一つ手順が必要ということがわかりました。


## 3 ~/.gradle/gradle.properties を変更する

ホームディレクトリ直下に、隠しフォルダとして、`.gradle`が存在すると思います。

こちらの中にも、`gradle.properties`が存在します。

僕の場合は、こちらのファイルにProject直下のgradle.propertiesと同じProxyの設定が書いてありました。

```
## こいつらを消す
systemProp.http.proxyHost=proxy.hoge
systemProp.http.proxyPort=8080
systemProp.https.proxyHost=proxy.hoge
systemProp.https.proxyPort=8080
```

自分の場合、この3つの手順を行えば、Proxyの設定が完全に解除されます。

逆にProxyの設定の時点で躓いた方は、ホームディレクトリ直下の.gradleファイルにこちらのProxyの設定を見るべきです。

一応Gitも載せておきます。

```shell
git config --global --unset http.proxy
git config --global --unset https.proxy
```

厄介なポイントとして、設定する時と設定を解除する手順で違う場所が存在するところですね。

これを使えば、Proxyサーバー経由を必要とする場所においてもAndroid開発ができます。

大学のレポートや研究の息抜きにアプリ開発できます。やったぜ



## 参考にした記事
https://qiita.com/offwhite/items/82b9ac5a751142c2d58e
S3の特定のキーを持つオブジェクトのサイズを集計する

# 概要

S3の特定のキーを含むオブジェクトのサイズを集計するメモです。
ポイントはコード内にコメントしたので、必要であればご参照ください。

# コード

```python:count_s3_objects.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import boto3

client = boto3.client('s3', aws_access_key_id='', aws_secret_access_key='', region_name='')
size = 0
start_after = ''

def getObjectList(size, start_after=''):
    next_start = ''

    param = {
        'Bucket': 'hoge',
        # 一部分まででOK
        # 2020を含むオブジェクトが取得対象になります
        'Prefix': 'access-log/2020',
        # 指定したKEYの次から取得するようになる
        'StartAfter': start_after
    }

    # s3.Bucket().objects.all()は非推奨のため、list_objects_v2を使います
    # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.list_objects_v2
    res = client.list_objects_v2(**param)
    
    # オブジェクトがなければContentsは空になります
    if 'Contents' in res:

        # オブジェクトの数
        print('object counts:' + str(len(res['Contents'])))

        for con in res['Contents']:
            # サイズを加算する
            size += con['Size']
            next_start = con['Key']

        # 一度に1000までしか取得しないため、1000ある場合はTrueになる
        # その場合は次の処理で継続して取得する
        # Falseの場合は削除し、再帰処理を停止させる
        if res['IsTruncated'] == False:
            next_start = ''

    return size, next_start

# 初回実行
size, start_after = getObjectList(size, start_after)

# 後続がある場合は、再帰処理で取得する
while start_after != '':
    print('start_after: ' + start_after)
    size, start_after = getObjectList(size, start_after)

# 合計サイズを表示
print('size:' + str(size))
```
Regional Scrum Gathering Tokyo 2021 Day 2 「Integrate your cycle with OODA (Extended Edition of Scrum X Army at ‘RSGT2020’)」

# Regional Scrum Gathering Tokyo 2021 Day 2 「Integrate your cycle with OODA (Extended Edition of Scrum X Army at ‘RSGT2020’)」
 
202/01/07に開催されたRegional Scrum Gathering Tokyo 2021での発表です。
https://confengine.com/regional-scrum-gathering-tokyo-2021/proposal/14632/integrate-your-cycle-with-ooda-extended-edition-of-scrum-x-army-at-rsgt2020
 
# チーム参加してきました
 
[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html) のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu?slide=3)」にて参加してきました。
チーム7人で参加して、その場で実況しつつ、記事も作っています。
 
# 本セッションについて
Scrumと軍隊でどう類似点があるのかを軽く見たことがある。
それをもう少し深堀したものが今回のセッション
 
# 自己紹介
関西のセレニウムのコミュニティを運営している
4年ほど士官として韓国の軍隊に在籍
 
# PDCA
PDCAの成功事例は多々ある。これを守れば上手くいくだろうと期待する。
計画を立てた時点で満足する。
 
ただし、PDCAには大きな弱点がある。
変数に弱い。変数により、計画が崩壊することがある。
 
# Season 1 のハイライト
スクラムのバックログは軍隊の組織論に基づいている。
ビビジネスも軍隊も同じ概念に基づいている。
どちらも戦闘力を最大化し、最大化した能力を保つことが目標。
 
Jeffさんも日本でいう防衛大学出身である。
「なぜ相手の心をOODAループとともに理解しないのか？」
とJeffさんも言っている。
 
# OODAとは？
パイロットとして戦争に参加していたJohn Boyd大佐が作成したもの。
戦争に勝利した要因は、適切な状況で人間が適切な判断を行ったこと。
 
OODAは基本的にリスクマネジメントの手法
Observe -> Orient -> Decide -> Act
 
## Observe（観察）
世の中の出来事や物事を単純化したうえで、様々な角度から本質を把握する。
１つに集中しすぎると、バランスが崩れてしまうので、あまり1つのことに集中しないこと。
 
## Orient（抽出・加工）
どう抽出するのか

- 信頼できる情報を集める
- 似ている事例を調べる
 
夏休みの宿題で考えると...

- 宿題なんだっけ？
- みんなはもう終わってる？
- やらないとどうなる？
- 今からでもできることは？
 
## Decide（決断）
やることとあきらめることを決める
 
## Act（実行）
やると決めたことを実行する
 
# PDCAとの違いは柔軟性
PDCAの場合、Planが崩壊すると後ろの工程が崩壊する。
OODAではどこかの工程で問題があれば、すぐにObserveへ戻ることができる
 
# OODA × SCRUM
スクラムもOODAも再帰的なプロセスである。
プランニングは絶対的なものではないという考え方を持つ必要がある。
 
完璧な計画は難しいので、そこにこだわる必要はない。
変化の可能性を認めて、普段からリスクに備える。
 
予測できるリスクに対して対応する。
 
# OODAを使ってScrumをどう改善すればよいか
1. スプリントを通して発生しうるリスクをリストアップする。
2. 原因を把握するために分析を行う。
3. 何をどういうやりかたで防ぐかを決める。リスクを評価したうえで、どれにまず対処するか判断する。
4. 前向きに何をやればいいか決まった状態で実行する。
 
# OODAも常に正しいとは限らない
判断は人間が行うもの。
OODAループの絶対的な方針としてRoad Mapを持っておくことが重要。
 
スクラムマスターはリーダではないが、決定する権限を持っている。
また、スクラムマスターはより観察がうまくなるように、勉強し続ける必要がある。
また、チームメンバーと協力し、１つのことに集中しすぎない、自信をもって行動することが重要。
最後に体調管理に全集中！
 
# 感想
- OODAループについて知りませんでしたが、このセッションを聞いて理解することができました。
- 他のセッションでもありましたが、SMとして全体を常に観察し、リスクになりそうなことを把握できているという状態が大切だと改めて感じました。
AWSスポットインスタンス基本

[Auto Scaling / Spot Instances ハンズオンセミナー](https://autoscalingandspotinstanceshan.splashthat.com/?em=537&guest-access-hash=MzMzMjAxN3wyMTkyNDM4ODZ8MTU1Mjg2NTQxMjs5N2FjYWM1ZTIyNzRiZGU4MWRlYjk4OTA1YzY0OWNmZGQyY2Y5ZWQ5ZGE2ZmFkYWMxNTg3Y2RlY2MxMmVhMjE5) に参加した。
ハンズオンは、（能力的に）書けることは無いので
EC2のスポットインスタンスの基本についてだけまとめる。

## スポットインスタンスとは

EC２の購入オプションの一つ。

- オンデマンドインスタンス
- リザーブドインスタンス
- スポットインスタンス

### スポットインスタンスのメリット
- 低コスト　最大９割引
- アベイラビリティゾーンの空き領域を利用している

### 仕組機能
- 価格は供給と需要に基づいて徐々に調整される。
- スポットインスタンスはAWSによって中断されることがあり中断される場合２分前に通知される。
- 中断されるのは、指定価格をスポットインスタンス価格が上回ったとき。

### 使いこなす４原則
- ステートレス：永続的に必要なものは置かない
- 再開可能なワークロード
- 疎結合：
- 分散：複数アベイラベリティゾーンと複数インスタンスタイプの活動：複数ビッティング（？）しておく

## AutoScaling
- AutoScalingの種類
 - EC2AutoScaling ←今回のハンズオン
 - ApplicationAutoScaling  
   ２０１６年登場
   ECSとか、DynamoDBとか
 - AWS AutoScaling  
  過去の統計を元に増やしておく。（いくつか問題点があるので本番適用は検証の上検討）

### 起動するインスタンスの設定
- LaunchConfiguration
- LaunchTemplate　推奨
AutoScaling購入オプションとインスタンスを組み合わせることができる

### ScalingPolicy
TargetTrackingPolicy 今回
　指定されたターゲット値に維持するためにスケールイン、アウトする

SimpleScalingPolicy
ScalingPolicywithStep


### クールダウンウォームアップ


### (補足)CodeDeploy
CodePipline

中断のエミュレートもある
rubyとpythonのif文の書き方の違い

Progateでpythonの基本的な文法を勉強中なので、rubyとの違いをまとめておく。



##rubyのif文
・if〜endで囲む

```ruby
x = 100

if x == 100
 print "xは100です"
else
 print "xは100じゃないです"
end
```

##pythonのif文
・条件式の最後に「:（コロン）」をつける
・実行する処理の記述はインデントする

```python
x = 100
if x == 100:
    print('xは100です')
else:
    print('xは100じゃないです')
```

pythonはインデントが動作に直接影響するから、自然と可読性が高いコードになりそうで良き
[TypeScript] 配列の要素だけを使った型を作りたい

## やりたいこと

こんな配列を使って、

```js
const names = [
  '佐藤',
  '鈴木',
  '田中',
];
```

こういう型を作成したい。

```js
type Name = '佐藤' | '鈴木' | '田中';
```

## やり方

やり方は至って簡単です。

`as const`を使う

```js
const names = [
  '佐藤',
  '鈴木',
  '田中',
] as const;

type Name = typeof names[number];
// type Name = "佐藤" | "鈴木" | "田中"
```

### 参考
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions
Font Awesomeで検討したアイコン


Font Awesomeで検討したアイコン

# Font Awesomeの使用方法
htmlで使用する場合

```
<i class="fas fa-caret-down"></i>
```

cssで使用する場合

```
.icon-fa:after {
    font-family: "Font Awesome 5 Free";
    content: '\f0d8';
}
```

#矢印

##caret-down

```
f0d7
<i class="fas fa-caret-down"></i>
```

![スクリーンショット 2021-01-07 16.59.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254652/fe032412-f0f6-122a-048e-7f7c0d6ab08f.png)

##caret-up

```
f0d8
<i class="fas fa-caret-up"></i>
```

![caret-down.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254652/37bb1d9e-c087-69a6-ac7f-d7af614c8492.png)


##arrow-down

```
f063
<i class="fas fa-arrow-down"></i>
```

![スクリーンショット 2021-01-07 17.04.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254652/8ab2d473-dca7-4da2-f1c0-8a4edd97581f.png)


##angle-double-left

```
f100
<i class="fas fa-angle-double-left"></i>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254652/72474b81-b896-de47-3b9a-5871f793ec8f.png)
スクリーンショット 2021-01-07 17.04.48.png

##angle-double-right

```
f101
<i class="fas fa-angle-double-right"></i>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254652/b5997a9f-4c89-775f-0e16-7ddb34238675.png)
スクリーンショット 2021-01-07 17.07.01.png

##chevron-left

```
f053
<i class="fas fa-chevron-left"></i>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254652/be6405fe-9eb7-1485-da5e-02ab495d7f63.png)
スクリーンショット 2021-01-07 17.05.41.png

##chevron-right

```
f054
<i class="fas fa-chevron-right"></i>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254652/1708a689-bcab-e13f-2d2c-d883c898dac2.png)
スクリーンショット 2021-01-07 17.06.24.png
【JavaScript】letとvarの違い

#プログラミング勉強日記
2021年1月7日
今まではとりあえずletを使えばいいと思っていて、letとvarの違いを知らなかった。今日はそのletとvarの違いを学んだので、簡単にまとめる。

#JavaScriptの変数宣言について
　JavaScriptの変数定義方法は、varを使うのが主流だった。
　ECMAScript 2015 (ES6)からはletとconstが追加された。letはvarに代わる変数定義方式として用いられ、constは定数を定義するために使われる。constは定数なので、後から変更不可能である。

```java:変数定義
// letとvarは同じように利用可能である
var str1 = "Hello";
let str2 = "Hello";
```

#letとvarの違い

##変数のスコープの違い
　letはブロックスコープで、varは関数スコープである。
　letを使って定義した変数はブロックスコープを持っている。varではブロックスコープに対応できないので、ES6でletが追加された。(if文やfor文などの中で定義された変数は、そのブロックの中でしか使えないことをブロックスコープという。)

```js:letを使用する場合
let num = 100;
if(num = 100) {
  // numが100だったら100を足す(number = 200)
  let number = num + 100;
}
console.log(number);
```

```:実行結果
ReferenceError: number is not defined
```

```js:varを使用する場合
var num = 100;
if(num = 100) {
  // numが100だったら100を足す(number = 200)
  var number = num + 100;
}
console.log(number);
```

```:実行結果
200
```
　このようにvarで宣言された変数にはブロックスコープが存在しない。


##varは変数の重複定義ができる
　バグにつながる仕様だが、varは同じ変数名で重複定義ができる。

```js
var testVar = "こんにちは";
console.log(testVar);
var testVar = "Hello";
console.log(testVar);
```

```:実行結果
こんにちは
Hello
```

　letで変数を重複定義すると、プログラム実行前にconsoleエラーになる。

#参考文献
[JavaScriptのletとvarの違いについて現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/45278)
[JavaScriptの変数宣言はletにすべきか 『入門JavaScriptプログラミング』から解説](https://codezine.jp/article/detail/11353)
自己署名証明書を作るスクリプト

# Usage

```shell-session
$ ./self-sign example.com \*.example.com  # SNI and wildcard
$ days=825 ./self-sign example.com  # Change expiration
$ check=1 ./self-sign example.com  # Show certificate
```

# Script

OpenSSL 1.1.1 以降が必要なことに留意する。
バージョンの確認は `openssl version` から。

```bash
#!/bin/bash

# Requires OpenSSL 1.1.1 or later

CN=$1
SAN=""
for name in $*; do
  # Note: IP:x.x.x.x is also valid
  SAN="${SAN}DNS:$name,"
done
SAN=${SAN::-1}

days=${days:-36500}  # days=825 ./self-sign ...
check=${check:-0}  # check=1 ./self-sign ...

secret=$CN.key
public=$CN.crt

openssl req -new -subj "/CN=$CN" -addext subjectAltName=$SAN \
  -newkey rsa:2048 -keyout $secret -nodes -x509 -days $days -out $public

# Check certificate
if [ $check != "0" ]; then
  openssl x509 -text -in $public -noout
fi

echo
echo "Secret key file: $secret"
echo "Public key file: $public"
```

# References

- [Provide subjectAltName to openssl directly on the command line](https://security.stackexchange.com/questions/74345)
- [【OpenSSL】SANでDNS情報を付与した証明書を作成する](https://kaede.jp/2018/06/10191854/)
[java] listのsort

javaで配列やlistをsortする方法を集めてみました。自分用メモ。

# 配列

``` java:昇順
int[] array = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8 };
Arrays.sort(array);
```

``` java:降順
Integer[] array = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8 };
Arrays.sort(array, Collections.reverseOrder());
```

※Collectionsクラスを使用しているため、Integer配列で宣言している。

# List

``` java:昇順
ArrayList<Integer> al = new ArrayList<>();
al.add(2);
al.add(7);
al.add(1);
al.add(8);
al.add(2);
al.add(8);
Collections.sort(al);
```

``` java:降順
ArrayList<Integer> al = new ArrayList<>();
al.add(2);
al.add(7);
al.add(1);
al.add(8);
al.add(2);
al.add(8);
Collections.sort(al, Collections.reverseOrder());
```
# 応用（ユーザ定義クラス、複数値）
``` java:応用
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Main {

	public static void main(String[] args) {

		List<Item> itemList = new ArrayList<>();
		itemList.add(new Item(4, "Book", 1000));
		itemList.add(new Item(2, "Bag", 3000));
		itemList.add(new Item(3, "Calendar", 2000));
		itemList.add(new Item(1, "pen", 200));

		// id昇順ソート
		itemList.sort(Comparator.comparing(Item::getId));

		// id降順ソート
		itemList.sort(Comparator.comparing(Item::getId).reversed());

		// kind昇順ソート
		itemList.sort(Comparator.comparing(Item::getKind));

		// kind降順ソート
		itemList.sort(Comparator.comparing(Item::getKind).reversed());

	}
}

class Item {
	int id;
	String kind;
	int price;

	Item(int id, String kind, int price) {

		this.id = id;
		this.kind = kind;
		this.price = price;
	}

	public int getId() {
		return id;
	}

	public String getKind() {
		return kind;
	}

}

```
Terminalでレポート執筆を完結させる

**<font color=#E11>MS Wordを開きたくない！</font>**
という思いから、Terminalでレポート執筆が出来ないか考えてみました。

##やりたいこと
- MarkDown記法で執筆してPDF出力する
- 最低限のCSS適用（MD単体では中央揃えが出来ない）
- Gitで管理したい（リモートリポジトリの活用でHDDの突然死に備える）~~（GitHubの草を生やせる）~~
- **MS Wordを開かない**（Emacsキーバインドを設定するのが面倒なので）（UbuntuにはMS Wordが存在しないので）

##導入ツール
- markdown-pdf
- git

##環境
Ubuntu 20.04 LTS
node 12.18.4

##注意
md -> PDF変換ツールはいくつかありますが、導入が簡単で~~エラーで1時間溶かしたなんて言えない~~変換が高速かつTerminalで完結出来るという理由からmarkdown-pdfを導入しています。
数式などを用いる場合は[Pandoc](https://qiita.com/sky_y/items/80bcd0f353ef5b8980ee)（対応フォーマットが豊富で、LaTeXにも対応しています）、ヘッダー・フッターを用いたい場合は[VSCodeの拡張機能](https://tako24.hatenadiary.jp/entry/2020/01/23/001120)などがおすすめです。

##やり方
git、及びNode.jsが導入できている前提で話します。

####1. markdown-pdfの導入
```
sudo npm install -g markdown-pdf --unsafe-perm
```
ここでめっちゃ詰まったのですが、[GitHubのIssues](https://github.com/alanshaw/markdown-pdf/issues/159)に回答がありました。

####2. 作業リポジトリの設定
言うまでもありませんが

```
mkdir report
cd report
git init
```
それでもって出力したPDFを.gitignoreに設定しておくと便利

```terminal
vim .gitignore
```

```gitignore:.gitignore
*.pdf
```

####3.スタイルシートの設定
```
vim style.css
```

```css:style.css
h1{
text-align: center;
font-size: 18px;
line-height: 18px;
margin-top: 0px;
} /*表題用*/

h2{
text-align: right;
font-size: 14px;
} /*名前用*/

p{
font-size: 10.5px;
text-indent: 1em;
}/*本文用*/
```
言うまでもありませんが、お好みで調節してください。

これで一通り設定は終わりです。

```md:report.md
# title
## name

content
```
```terminal
markdown-pdf report.md -s style.css
```

のように入力するとこのようなPDFが出力されます。
![report.pdf](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596394/cf460e29-7889-1133-64e9-b056e8a6569e.png)

####4.aliasの設定
いちいち`-s style.css`オプションを設定するのは面倒ですし、そもそもmarkdown-pdfという名称が長いのでaliasを設定します。

```
vim ~/.bashrc
```

```bash:~/.bashrc
alias m2p='markdown-pdf -s style.css'
```

```
source ~/.bashrc
```
で再読込みしてあげれば

```
m2p report.md
```
でPDF変換が出来るようになります。

###終わりに
レポートが大量に課されていて大変ではありますが、他の人にも是非Terminalでレポート執筆を完結していただきたいという<font color=#E11>強い思い</font>から、この時期に書かせていただきました。Wordとは決別して快適なレポート執筆ライフを満喫しましょう！
【ネットワーク用語】TCPとは

インターネット通信において利用されるプロトコルの一つ。
相手がデータを受信したかの確認や、データの破損・欠落があれば再送、受信したデータのソート制御を行う。
それにより、信頼度は高いが、転送効率が低くなるため、通信での遅延が起こりやすいのが特徴。
[R] PCA図の出力文字化け解決策

# 図の出力の文字化け
![截屏2021-01-07 16.37.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1009581/9a5b7c7e-a17e-89c7-4a77-0643935a1bc7.png)

Macユーザですから、図のアウトプットはよく文字化けが発生します。
主成分分析`PCA()`のアウトプットを例としました。
# 解決策
学修相談室の方に質問し、以下の解決策をいただいきました。
## Step 1
![截屏2021-01-07 16.17.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1009581/b1ea59ba-6449-e344-022e-abe9331b1dc8.png)
- Knitの隣のボタンを押し、Chunk Output in Consoleを選択します。
## Step 2
![截屏2021-01-07 16.18.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1009581/efad499a-d710-2c95-85b1-d9444b274297.png)
Export右の三角を押し、Save as PDFを選択し、保存します。
## 結果
私の場合はPDFで文字化けなく、うまく表示できます。
![截屏2021-01-07 16.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1009581/bfb7519a-35f7-d8b3-adf2-a6fd7979f53a.png)
Nuxt.jsでの「localstorage is not defined」への対応

Nuxt.jsでの開発でdata内でlocalstorageを使おうとしたときに「localstorage is not defined」エラーが出た時の対応メモです。

以下のようにdata内で直接呼び出すとサーバサイドレンダリングしているのでブラウザのストレージにアクセスできずエラーになる。

```javascript
data () {
  isLoggin: localStorage.currentUser.token !== null
}
```

### 対応

以下のようにmounted内でアクセスすれば動作する

```javascript
  data () {
    isLoggin: false
  },
  mounted () {
    if (localStorage.currentUser) {
      this.isLoggin = localStorage.currentUser.token !== null
    }
  }
```

参考
https://jp.vuejs.org/v2/cookbook/client-side-storage.html
mapについて（関数型の高階関数は配列をいい感じに扱うための処理）

あばろさん（神）に教えていただいたmapについてのメモ

# 関数型の高階関数は配列をいい感じに扱うための処理

配列に対して
`.map` -> 配列から別な配列を作る
`.reduce` -> 配列を１個ずつ順番に処理して配列を作る
`.filter` -> 配列から条件で絞り込んだ配列を作る
`.every` -> 全部条件を満たしてたらtrueが返る
`.some` -> 1個でも条件満たしてたらtrueが返る
iOS Simulator 実物大にする方法

#はじめに
シミュレータのサイズを実物大にする方法を調べてみても、
情報が古くて指定するメニューがなかったりしたので、
お助けになればと思います。
#手順
上部メニューのWindow > Physical Sizeにチェックを入れるだけです。
![スクリーンショット 2021-01-07 16.19.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/980010/d0ef4b52-565f-ae4a-9d7c-cee887827ca8.png)