OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyのmap.flatten(1)よりもflat_mapの方が高速な理由をふわっと調べてみる

# 概要

タイトルの通りですが、具体的にソースを見るまで納得できなかったので調べてみました。

## Rubyのソースコードを見てみる

本当はバージョンとかも考慮したほうがいいですが、下記リポジトリの最新版で見てみます。  
https://github.com/ruby/ruby

### まずはflat_mapを見てみる

どうやらEnumeratorのソースは`enum.c`にありそうでしたので、flat_mapに関連する箇所を確認してみました。
単純に配列を生成して、yieldした結果を格納しているというシンプルな内容でした。

```c:enum.c
enum_flat_map(VALUE obj)
{
    VALUE ary;

    RETURN_SIZED_ENUMERATOR(obj, 0, 0, enum_size);

    ary = rb_ary_new();
    rb_block_call(obj, id_each, 0, 0, flat_map_i, ary);

    return ary;
}

flat_map_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, ary))
{
    VALUE tmp;

    i = rb_yield_values2(argc, argv);
    tmp = rb_check_array_type(i);

    if (NIL_P(tmp)) {
	rb_ary_push(ary, i);
    }
    else {
	rb_ary_concat(ary, tmp);
    }
    return Qnil;
}
```

### map.flatten(1)を見てみる

こちらは挙動そのままなので言わずもがなでした。

```c:enum.c
# map
static VALUE
enum_collect(VALUE obj)
{
    VALUE ary;
    int min_argc, max_argc;

    RETURN_SIZED_ENUMERATOR(obj, 0, 0, enum_size);

    ary = rb_ary_new();
    min_argc = rb_block_min_max_arity(&max_argc);
    rb_lambda_call(obj, id_each, 0, 0, collect_i, min_argc, max_argc, ary);

    return ary;
}
```
```c:hash.c
# flatten

static VALUE
rb_hash_flatten(int argc, VALUE *argv, VALUE hash)
{
    VALUE ary;

    rb_check_arity(argc, 0, 1);

    if (argc) {
	int level = NUM2INT(argv[0]);

	if (level == 0) return rb_hash_to_a(hash);

	ary = rb_ary_new_capa(RHASH_SIZE(hash) * 2);
	# flatten(1)なのでここが１回だけ実行される
	rb_hash_foreach(hash, flatten_i, ary);
	level--;

	if (level > 0) {
	    VALUE ary_flatten_level = INT2FIX(level);
	    rb_funcallv(ary, id_flatten_bang, 1, &ary_flatten_level);
	}
	else if (level < 0) {
	    /* flatten recursively */
	    rb_funcallv(ary, id_flatten_bang, 0, 0);
	}
    }
    else {
	ary = rb_ary_new_capa(RHASH_SIZE(hash) * 2);
	rb_hash_foreach(hash, flatten_i, ary);
    }

    return ary;
}

static int
flatten_i(VALUE key, VALUE val, VALUE ary)
{
    VALUE pair[2];

    pair[0] = key;
    pair[1] = val;
    rb_ary_cat(ary, pair, 2);

    return ST_CONTINUE;
}
```

## 結論

確かに`map.flatten(1)`の方が配列の生成、ループ処理が1回づつ多かったので、早くなるのは納得でした。
Djangoで時間経過が見やすい体験紹介サービスを作った話

## 実行環境
macOS Catalina
Python3.7
Django2.1.8
(Djangoの最新バージョンは3.0ですがGAEでデプロイする時にデータベースをMySQLを利用する場合、依存するライブラリのPyMySQLがDjango2.2系に対応していないため、当記事ではDjango2.1.8を利用しています。)

## 作ったもの
実際にデプロイ作業まで行ったので良かったら見てください。
[関東とっておきプロジェクト]
https://kanto.dev/

## 謝辞
はじめに、下記のgithubのソースコードの一部を利用させて頂きました。
この場をお借り致しましてお礼申し上げます。ありがとうございました。
https://github.com/naritotakizawa/django-simple-calendar

## 概要
この記事の内容はタイトルの通りですが、具体的には自分が開発中に躓いた箇所をまとめたものです。

## 躓いたポイント
- データベースの値を弄って(計算して)、cssの値を変更させる
- DateTimeFieldとタイムゾーンの扱い
- データベース上の定休日の考え方
- Google Map JavaScript APIにDjangoのデータベースに登録された値を展開する

### データベースの値を計算して、cssの値を変更させる

自分の中で最終的な最適解はモデルメソッドを作ることです。私が知らなかった技術というか気づけば当然の事ですが、データベースの値を書き換える必要は無くテンプレートで扱う値を変えたい場合、モデルメソッドを生やすというのが単純で簡単です。具体的には以下のような形で実装しました。(経過時間分を左から右にずらす場合)

```python:models.py
def ratio_time(self, date):
    return ( 60*date.hour + date.minute ) / ( 60*24 )

def create_margin_left(self):
    return str( self.ratio_time(self.FIELD + timedelta(hours=9)) * 100) + "%"
```

```html:template.html
<div style="margin-left: {{ OBJECT.create_margin_left }}; width: 10px; height: 5px;"></div>
```

### DateTimeFieldとタイムゾーンの扱い

このDatetimeFieldの扱いとして、最初の勘違いはタイムゾーンを**保持していない**ということです。つまり、テンプレート内で仮に日本時間で扱いたい場合は、これをイギリス時間にtimezone分(+9時間)を設定しなくてはなりません。当初、Djangoプロジェクト内の`settings.py`で記述した`timezone='Asia/Tokyo'`が適用されて上手くやってくれると思っていましたが、違っていたようです。また、テンプレート内で表示形式を変更する場合や、タイムゾーンを付けたり消したりしたい場合にはこちらをご覧ください。

[Pythonのdatetime型の扱い]
https://docs.python.org/ja/3/library/datetime.html

[Djangoのtimezoneの扱い]
https://docs.djangoproject.com/en/2.2/topics/i18n/timezones/

### データベース上の定休日の考え方

この考え方を知る前と知った後では新しい考え方が身につきました。定休日はその日が空いてる・空いていないの1Bitの情報が7つ分連なっているだけに過ぎません。つまり、データベース上では7bitのIntegerField(0~127)までを扱えれば済む訳です。0bit目を日曜日として扱う場合、`0010001`は火曜日と土曜日が定休日という感じで扱えます。割とよく使われるみたいなので覚えておいて損はないと思います。(ただし、実装は若干難しくなります。)

[考え方について]
https://lambdalisue.hatenablog.com/entry/2013/12/22/041347
[実装中に参考になったURL]
https://stackoverflow.com/questions/9921221/how-to-perform-db-bitwise-queries-in-django

### Google Map JavaScript APIにDjangoのデータベースに登録された値を展開する

筆者はエディタ(Visual Studio Code)を利用しているのですが、そこでコード整形等の見た目を整える拡張機能を入れています。プラグインによってはJavaScriptのように整形するツールがあり使用すると、`before.html`のようになることがあります。しかし、テンプレート内でDjangoのデータを扱う場合は必ず`{{ FIELD_NAME }}`のようにする必要があります。適切なコードフォーマットを利用しないと値を読み込めなくなりますので、気をつけましょう。

```html:before.html
<script>
var latitude = {
    {
        OBJECT.latitude
    }
};
var longitude = {
    {
        OBJECT.longitude
    }
}
</script>
```

```html:after.html
<script>
    var latitude = {{ OBJECT.latitude }};
    var longitude = {{ OBJECT.longitude }};
</script>
```

### その他の躓いた点
CSSが実装出来ているのか不明だったので、確認作業を行っていたが、横幅しか気にしていなくて、縦幅を設定をし忘れていた。色を表示させたりする場合、横幅だけでなく縦幅も設定しないと視覚的に変化はない。

## まとめ
- カレンダーの実装はタイムゾーンを意識する必要があるが、データベース自体を変更しない場合は割と簡単に扱えることがわかった。(モデルメソッドを使う)
- 定休日を実装する場合、少し検索すると各曜日にFieldを追加(合計で7つ)して、実装するものが多かったが、ON-OFFのような1bitで表せる情報を複数同時に扱う効率的なやり方を知れた。
- プラグインは用量・用法を適切に使うべき。

当記事で誰か1人のエラーや疑問解消の一助になれば幸いです。
JavaScriptのテスト用ツールやライブラリの分類


いっぱいありすぎてわけわからなくなりがちなので整理のため


# テストツールタイプ

| タイプ                 | 役割                                                                                            | ツール例                                                     |
|------------------------|-------------------------------------------------------------------------------------------------|--------------------------------------------------------------|
| テストランナー         | Node.js(cli)やブラウザ上でテストを実行・ウォッチするためのツール                                               | Karma(ブラウザ), Mocha(cli), Jasmine(cli), Jest(cli), TestCafe(ブラウザ), Cypress(ブラウザ)                      |
| テストフレームワーク   | 構造的にテストを書くためのライブラリ                                                          | Mocha, Jasmine, Jest, Cucumber, TestCafe, Cypress, Ava, tape     |
| アサーション           | テストが返す結果が期待どおりかどうかを確認するためのライブラリ                                      | Chai, Jasmine, Jest, Unexpected, TestCafe, Cypress           |
| モック、スパイ、スタブ | いわゆるモック。例えばAPIの呼び出しなどの副作用がある部分を分離しそれらを置き換えるためのライブラリ | Sinon, Jasmine, enzyme, Jest, testdouble                     |
| コードカバレッジ       | 書いたテストでどのくらいのコードを網羅できているかレポートするツール                            | Istanbul, Jest, Blanket                                      |
| ブラウザコントローラ   | シミュレータを利用して機能テストを行うためのツール                                              | Nightwatch, Nightmare, Phantom, Puppeteer, TestCafe, Cypress |
| ビジュアル回帰ツール   | 画像を使って前回のバージョンのものと比較して変更点を検知するためのツール                        | Applitools、Percy、Wraith、WebdriverCSS                      |


# 参考

https://medium.com/welldone-software/an-overview-of-javascript-testing-in-2019-264e19514d0a
ERB Snippetsの使い方

##Sublimetextに入ってる、「ERB Sippets」が便利！



(１) Ctrl + Shift + P で  Install package　を開く
(２) ERB Snippets　を選択





###ERB Sippetsでできること

ビューに使う erb ファイル(new.html.erb等)で

```
e + Tabキー →　<% %>

pe + Tabキー →　<%= %>

if + Tabキー →　<% if      %>
　　　　　　　　　<% end %>

div + Tabキー　→　<div></div>

```

などなど、、めちゃくちゃ楽にコードを打てます。時短にも繋がります。おすすめです。
【CLPEXメモ】COS導入済み環境でDO Python APIを動かす

# 始めに
IBMの最適化ソリューションCPLEXの標準的な開発環境は、**IBM ILOG CPLEX Optimization Studio**(略称**COS**)です。
COS導入済みのPCでは、通常Eclipseのプラグインを使ってOPLと呼ばれる最適化専用の言語でモデル開発をしますが、Python APIを使った開発も可能です。
その手順のメモを記載します。

## 参考リンク
[Setting up an optimization engine](http://ibmdecisionoptimization.github.io/docplex-doc/getting_started.html)

# 前提
動作確認は、

MacOS: 10.14.6
CPLEX Optimization Studio: 12.9

の環境で行いました。

# 設定手順

## COSの導入
COSに関しては、通常の方法ですべてデフォルトで導入を行います。

## anacondaの導入
テストはJupyter Notebookで行いました。
その前提のanacondaに関しても、通常の方法で、全部デフォルトで行っています。

## COS/cplex導入先パスの確認
次のコマンドでCOS導入先パスを確認します。

```
$ ls -l /Applications | grep CPLEX
```
手元の環境では

```
drwxrwxr-x  11 AKAISHI@jp.ibm.com  admin  352  9 13 10:19 CPLEX_Optimizer129
```

という結果でした。

## Python versionの確認
次のコマンドで確認します。

```
$ python -V
```

手元の環境では、次の結果でした。


```
Python 3.7.3
```

## 環境変数 PYTHONPATHの設定

今までの結果を元に、次のような行を ~/.bash_profile に追加します。

```
export PYTHONPATH=/Applications/CPLEX_Optimizer129/cplex/python/3.7/x86-64_osx
```

``3.7/x86-64_osx``の部分に関しては、Pythonバージョンとプラットフォームに対応して適宜修正して下さい。

## ライブラリの導入
次のpipコマンドで、DO Python APIライブラリの導入を行います。

```
$ pip install docplex
```


# 動作確認
以上で、必要な準備は完了です。環境変数``PYTHONPATH``が設定されている状態で、

```
$ jupyter notebook
```

で、Jupyter Notebookを起動します。

[Watsonで巡回セールスマン問題を解く](https://qiita.com/makaishi2/items/78570f9283c0bc6c7e6c)
で紹介している[Jupyter Notebookファイル](https://raw.githubusercontent.com/makaishi2/sample-data/master/notebooks/TSP.ipynb)をダウンロードし、読み込みます。

後は、Shift + Enterでセルを順番に実行すると、下の図のような最適な道順をCPLEXがみつけてくれるはずです。

![スクリーンショット 2019-12-02 15.28.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/64b57ba9-7436-ec85-643d-c232a859a78c.png)

# 機能制約とライセンスの関係
COSには、無料で利用な評価版もあります。評価版を使って、上記の設定を行い、巡回セールス問題を解こうとすると、以下のようなメッセージが表示されます。

```
CPLEX Error  1016: Community Edition. Problem size limits exceeded. Purchase at https://ibm.co/2s0wqSa.
```

これは、文字通り評価版の機能制約(ルール数最大1000個)で起きたエラーです。
評価版の場合、循環セールス問題で点の数(N)=5と修正して実行すると、機能制約にヒットしなくなり、正常終了するようになります。
Railsの新卒研修で役に立つもの一覧

この記事はZeals Advent Calendar 2019の3日目の記事です。
はじめまして。ZealsでRailsエンジニアとして働いている鈴木です。
プログラミングの初心者向けの方ように、新卒研修のカリキュラムを作成しました。
そのカリキュラム作成時に、役に立ったサイトや書籍を、紹介させていただきます。

## 役に立った本一覧
### なぜオブジェクト指向で作るのか
[なぜオブジェクト指向で作るのか](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC2%E7%89%88-%E5%B9%B3%E6%BE%A4-%E7%AB%A0/dp/4822284654
)

オブジェクト指向について１からわかりやすく書いているため、プログラミング言語の入門本でオブジェクト指向を知ったけど、よくわからないという人がオブジェクト指向について理解するために適しているので課題図書としてピックアップしました。

### プロを目指す人のためのRuby入門
[プロを目指す人のためのRuby入門](
https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80&qid=1571188323&s=books&sr=1-1)

Rubyについてわかりやすく一通りのことを書いてあるため、Rubyの言語仕様をわかりやすく理解するのに一番適しているだろうということで課題図書としてピックアップしました。

### 現場で使える Ruby on Rails 5速習実践ガイド
[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)

万葉さんが公開している研修の参考本ということと、Railsで開発する時に必要になることを一通り解説しているということでこの本をピックアップしました。

### Everyday Rails - RSpecによるRailsテスト入門
[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)
Railsで開発をしていくためには、Rspecを使いこなすのが必要不可欠だと思います。
この本はFactoryBotやフィーチャースペックまで解説しているため課題図書としてピックアップしました


### 改訂第3版 SQL書き方ドリル
[改訂第3版 SQL書き方ドリル](
https://www.amazon.co.jp/s?k=%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88+SQL%E6%9B%B8%E3%81%8D%E6%96%B9%E3%83%89%E3%83%AA%E3%83%AB&i=stripbooks&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&ref=nb_sb_noss)
SQLを理解するには、直接手を動かした記述していくほうが理解しやすくなるため課題図書としてピックアップしました。


### サルでもわかるGit入門
[サルでもわかるGit入門](https://backlog.com/ja/git-tutorial/)

無料でGitのコマンドだけではなく、プルリクエストのやりとりまで解説しているため
この資料をピックアップしました。

### el-training
[el-training](https://github.com/everyleaf/el-training/blob/master/docs/el-training.md)
株式会社万葉さんの新卒研修の課題です
Railsアプリのタスク管理システムを開発していくので、実践的な課題になると思いピックアップしました。

### TDD Boot Campの課題
[TDD Boot Campの課題一覧](http://devtesting.jp/tddbc/?c=index)
Rubyやテストコードを書いていくのには、ある程度大きな問題になれる必要があります。
TDD Boot Campの課題は、TDD初心者がTDDに慣れるということを考えて問題設計をしていると思いピックアップしました

### 最後に
以上の本やサイトがRailsでシステムを開発していくために、勉強しておいたほうがいいと思った本です。
今回リストアップしたのがこれから、Railsを勉強している人や新卒研修を考えている人の参考になれば幸いです。

明日の担当者は、[aburd](https://qiita.com/aburd)さんです。　ぜひお楽しみにしてください。
通信×エネルギーについて書きます

ドコモ先進技術研究所アドベントカレンダー20日目の記事です。

ドコモの中村と申します。この記事では，通信用電源分野の国際会議に参加してきた感想について記載しています。本分野の最新のトレンドなどご興味ある方はご覧いただけますと幸いです。


# PEDS2019 (Power Electronics and Drive Systems)
PEDSは、IEEEが主催する2年毎に開催されているパワーエレクトロニクスとドライブシステムに関する国際会議。今回、Toulouse（France）で開催された PEDS 2019は第13回目にあたります。
本会議は、最新の研究成果を議論する技術プログラムと、展示会から構成され、太陽光発電システムからモータードライブなど幅広い発表が行われました。
印象に残ったキーワードについて下記に列記してみます。

### - 再生可能エネルギー関連
       ・ 自律型マイクログリッドシステム（蓄電池群の運転計画）
       ・ 負荷エミュレータ（再エネの並列接続を想定した整流器のテスト環境）
       ・ ＭＰＰＴ（予測制御）
       ・ ＤＳＴＡＴＣＯＭ（ＶＳＩとスーパーキャパシタ適用）

### - ＥＭＩ／ＥＭＣ
       ・ GaNトランジスタ適用のカスケードマルチレベルインバータ（全高調波歪み改善）
       ・ 三相単スイッチBoost PFC（5次高調波抑制）
       ・ コモンモード伝導ノイズのモデリング（ターミナルポート理論）
       ・ 2相インターリーブ方式ブーストコンバータ（追加の巻線とダイオード）

### - 特定領域への適用
       ・ IH応用：ソフトスイッチング三相商用周波数交流 - 単相高周波交流直接電力変換器
       ・ 三相独立型インバータ：Lyapunov関数を用いてモデル化
       ・ ＡＦＥＲ：LCLフィルタの静電容量値を推定
       ・ ナノサテライト：COEPSAT-2にてマグネットコイルの電流制御を検証

### - 電源技術
       ・ LLC共振コンバータ（カレントダブラ整流回路によるリプル抑制）
       ・ リバースＨ３ＩＭＣ（軽負荷状態改善）
       ・ グリッド接続ＶＳＣ（FS-MPCによるAC電圧制御）


# ICRERA2019 (International Conference on Renewable Energy Research and Applications)
ICRERAは、IJRER主催・IEEEが共催する毎年開催の再生可能エネルギーシステムやエネルギー源に関する国際会議。今回 Brasov（Rumania）にて開催された ICRERA2019は第8回目にあたります。
本会議では、世界38カ国から296の論文が採択され、オーラルまたはポスター形式で再生可能エネルギー関連の最新の研究成果の発表が行われました。
印象に残ったキーワードについて下記に列記してみます。

### - ＲＥＳｓ
       ・ 三相カスケードHブリッジマルチレベルインバータ（比例共振制御）
       ・ DigSILENTシミュレーションモデル（グリッドに流れるバックグラウンド高調波を考慮）
       ・ ＰＣＳ（マルチレベルカスケードインバーターベース）
       ・ ＰＣＳ向け L型、L-C型およびL-C-L型のパッシブフィルター（ＴＨＤ分析）

### - ＡＩ・機械学習
       ・ 太陽光発電の部分影対策（粒子群最適化アルゴリズム）
       ・ Ａ／Ｄコンバータの分解能改善（Nelder–Mead法）
       ・ 温室効果ガス削減に向けた再エネ発電設備設置の最適化（k平均法）

### - スマートグリッド
       ・ ＤＣ－ＤＣブーストコンバータ（MPPTとPIコントローラー）
       ・ 消費者が気づかない負荷抑制（リビアで実証）
       ・ 電気自動車向けのワイヤレス電力伝送システム（Maxwell・ANSYS Simplorer使用）
       ・ 二次増幅器調整システム（Cuttlefish Algorithm）
       ・ 風力発電システムのための二重給電誘導発電機（無効電力抑制）
       ・ エアコンに組み込まれたアクティブフィルター（軽負荷時の歪み補償）

### - グリーンエネルギーシステム
       ・ ブラジルにおける太陽光発電と蓄電池の最適化検討（周期的自己回帰モデル）
       ・ 社会経済的パラメータの検討（損失電力値"VOLL"、活用されないエネルギー"EENS"）
       ・ 西アフリカにおける農村地域向けマイクログリッドシステム（分散型電源）
       ・ ソーラーパネルとインバータの最適化検討（系統連系インバーターの過剰投資抑制）

# 最後に
通信用電源技術は、通信技術の進歩、エネルギー需要に占める情報機器の割合の増加、再生可能エネルギーの活用、災害時の早急な復旧の重要性といった時代の要請に基づき、ソフトウェアデファインド電力や直流給電、災害復旧電源といった新たな広がりを見せてきています。これからも世の中の役に立てるような研究に取り組んでまいります。
pythonでオブジェクト指向

# Pythonでオブジェクト指向

## オブジェクト指向の三大要素

#### カプセル化

関連するデータやそれに対する操作をひとつのオブジェクトにまとめ、外部には情報の開示と最低限の操作だけ提供することです。
オブジェクトの変数や関数のうち、外部から直接参照する必要のないデータや使わない操作は保護し、秘匿される必要があります。
保護するとは、そのクラスの外で使用したり書き換えたりしないようにすることです。
これにより、プログラム間の疎結合性が維持され、メンテナンスが容易になります。
また、型が違う等のエラーを出しにくくしたり、データを保護することができます。
特に大規模のシステムを構築する場合は重要です。

#### ポリモーフィズム（多様性）

同じ関数や変数であるが、データの型に合わせて異なる動作ができるということです。
型に合わせてメソッドを作ると、プログラムがとても長くなってしまいます。

#### 継承

あるクラスのメンバやメソッドを引き継いで新しい子クラスを作ることです。
継承することで、共通部分をまとめて再利用できます。
継承には特殊なものがあり、それは以下の二つの継承です。

###### 抽象クラス

抽象クラスはインスタンスを作ることができず、継承されて初めてプログラムとして機能します。
抽象クラスではメソッドの実装と、抽象メソッドの宣言を行うことができます。
宣言された抽象メソッドは継承先で必ず実装する必要があります。

###### インターフェース

ここではプログラムは書かず、メソッドの宣言だけを行います。
継承したクラスはそのメソッドを必ず実装する必要があります。
また、通常の継承や抽象クラスの継承では複数のクラスを継承することはできませんが、インターフェースは多重継承を行うことができます。
インターフェースを分けることで、その部品を継承するかしないか選ぶことができます。

###### 抽象クラスとインターフェースの違い

抽象クラスはメソッドの実装を行うことができます。
インターフェースは多重継承を行うとができます。
別の見方では、抽象クラスは内部向け、インターフェースは外部向け、というものもあります。
抽象クラスを継承する場合はそこで完結する場合が多く、インターフェースを継承する場合は外部でそのインスタンスを使用することが多いです。

## pythonでは

### カプセル化

Pythonでは、変数やメソッドは全てpublicなので、アンダースコア_で区別します。
アンダースコアが最初に一つ付いた変数やメソッドはprivateとして扱います。

```python

Class ClassName():
    def __init__(self):
        self.public_variable = ‘safe’
        self._private_variable = ‘unsafe’

    def public_method():
        pass

    def _private_method():
        pass

```

### 抽象クラス

pythonでは、抽象規定クラス(ABC:Abstract Base Class)を使います。

```python

class BaseClassName(metaclass=ABCMeta):
    
    @abstractmethod
    def abst_method_name(self):
        pass
    
    def method_name(self):
        print(self.name)

```

メタクラスにABCMetaを指定し、抽象メソッドの定義に@abstractmethodというデコレータをつけます。
これにより継承するクラスはabst_method_nameを必ずオーバーライドしなければなりません。

### インターフェース

pythonには標準でインターフェースがなく、多重継承が可能なので、インターフェースっぽいものしか作れません。
っぽいものを作る場合は、上記の抽象クラスを実装なしで定義します。
データベース設計

# DB設計

## データモデリングの要素
 
* エンティティ
管理する必要がある情報

* リレーション
結びつきのあるエンティティをリンクさせること。

* 属性
あるエンティティに属する項目のこと。

* 多重度
関連のあるエンティティの片方から他方を見たときの関連先の数。
多重度を決定する過程で、エンティティの位置づけをはっきりさせ、抽出漏れを防ぐことができる。



## 正規化理論
エンティティを可能な限り細かい最小単位にしておく
あるエンティティの中の属性同士に従属関係を作らない。

正規化のメリットは、データの汎用性アップ、容量削減、保守性アップなどです。
デメリットは、検索のパフォーマンスが低下することがあること。
実務で使うのは第3正規形まで。
また正規化の影響でパフォーマンスが足りない場合はあえて正規化を崩すことも大切です。

#### 非正規形
1つのテーブルに同じような値が複数回登場するようなテーブル

#### 第1正規形
横方向のデータの繰り返しを整理
データベースではカラムは固定なので、固定できるように横方向のデータの繰り返しを縦に並べるように変更します。

#### 第2正規形
従属関係にあるデータの分離
注文情報から、ユーザデータと商品データを分離するなど。

#### 第3正規形
推移的関数従属という従属関係の分離

#### ボイスコッド正規形
主キー以外のカラムが全て主キーに完全関数従属であり、それ以外の従属関係があればテーブルを分離すること

#### 第4正規形
3つ以上の主キーのみで構成されたテーブルから、さらに主キーを分解して多値従属性を排除する。

#### 第5正規形
主キーを分解して、候補キーの中で結合従属性が満足されるようにする。



## データモデリング
データモデルを理解することがシステムを理解する近道となる。
データベースからリバースしたER図ではなく、論理モデルがあるとより良い。

#### 表記法を知る
ER図やUMLの書き方をざっくりと知る

#### モデルを作成する
顧客から要求を聞き出すコミュニケーション能力や、論理思考能力が必要

#### モデルを書く
作成したモデルを、他の開発者にも読みやすいように、誤解しないように、モデルを表現する。



## データモデリングの手順

#### 概念設計
顧客との打ち合わせを通して要件を明確にする。
エンティティを抽出する。
業務に必要なエンティティを全て洗い出したら、それをもとに概念データモデルを設計する。
ER図を書く。

#### 論理設計
テーブル定義を作成する。
適度に正規化を行う

#### 物理設計
各データの型を決める
格納されるデータの容量やアクセス数から性能要件を確認する。
パフォーマンス向上のためにインデックスをはり、必要に応じて正規化を崩す。
ハードウェア上でデータの格納領域を設計する。
Regex

# Regexについて
Regexとは正規表現(Regular Expression)のことで、記号を使って高度な検索条件を与える表現技法です。

|記号|意味|例|マッチする|同様|
|:---|:---|:---|:---|:---|
|^|行頭を表す|^asd|asdfgh,asdzxc,||
|$|行末を表す|asd$|qweasd,zxcasd,||
|.|任意の一字を意味する|a.s|ads,ahs,||
|*|直前文字の0回以上の繰り替えし|as*|a,ass,assss,||
|+|1回以上の繰り返し|as+|as,ass,asssss,||
|?|0回または1回|as?|a,as||
|{m}|m回の繰り返し|a{3}|aaa||
|{m,n}|m~n回の繰り返し|a{3,5}|aaa,aaaa,aaaaa||
|[...]|...のなかの任意の一字を意味する|[asd]|a,s,d||
|[^...]|...の文字が含まれないことを意味する|[^asd]|q,w,e,||
|[a-d]|aからdまで|[a-d]|a,b,c,d||
|\||or|a\|d|a,d||
|\\|正規表現の記号をエスケープする|
|()|グループ化|(asd)+|asd,asdasd,asdasdasd,||
|\d|1つの半角数字|||[0-9]|
|\D|任意の数字以外|||[^0-9]|
|\s|任意の空白文字|||[\t\n\r\f\v]|
|\S|任意の空白文字以外|||[^\t\n\r\f\v]|
|\w|任意の英数字|||[a-zA-Z0-9_]|
|\W|任意の英数字以外|||[^a-zA-Z0-9_]|
|\A|文字列の先頭|||^|
|\Z|文字列の末尾|||$|
Raspberry Pi 4 4GBモデルでUbuntu Server 19.10を起動

#はじめに
この記事は2019/12/02現在の話であって、それ以降の動作を保証するものではありません。
加えて記者はコンピュータウルトラ初心者なので、内容にガバが散見されるかと思います。
また、基本的にはインターネッツに散らばっているものをまとめて、後日個人的に再インストールするためのメモ書きのようなものです。ご容赦ください。
というか多分、後一週間もすれば何もせずに動くようになると思います。

また、今回の説明はデスクトップ環境構築ではなく、あくまでsshセッションが貼れるようになるところまでです。

#今回用意する(使用する)もの
・Raspberry Pi 4 4GBモデル(OKDO、及技適マークがついた国内流通品)
・microSD 32GB
・各種ケーブル
　　・type-C：技適ついてるモデルはPD対応になってるので、macbookの充電器とケーブルぶっ刺して使えました。
　　・micro-HDMI：強気にいけばこれいらないですよね。エラー発生は認知できませんけど。
　　・有線LAN：sshセッションを貼るので基本これで。type-Cが通信を兼ねているので、PCと直でつなげればいいのかもしれませんが動作未確認なので今回は話しません。

・LinuxPC
　　SDにOSイメージを焼き込むのに使っているだけです。

#やること目次
1. OSイメージ取得
2. OSイメージをSDに焼き込み
3. OSイメージの一部を書き換え
4. raspberry pi 4にSDをぶっ刺して各種ケーブルを接続
5. sshセッションを貼ってファームウェアの部分に追記
6. アップデートして、3.の書き換えを削除して再起動
7. おわり。

#手順
1.Raspberry-Pi用のUbuntu Serverイメージを取得
  Ubuntu公式配布ページ(https://ubuntu.com/download/raspberry-pi) から64bit版を選択してダウンロードしちゃってください。

2.OSイメージをSDに焼き込み
Ether(https://www.balena.io/etcher/) っていうソフトを今回は利用しました。
LinuxPCにSDを接続したのちにEtherを起動すればSDの認識は勝手にやってくれます。あとは1.でDLしたイメージファイルを投げ入れて、動作させれば5分程度で終わります。

3.OSイメージの書き換え
Ubuntu Server19.10について、焼き込んだだけでは動作しません。焼き込んだSDの`/boot/firmware/usercfg.txt`に追加で`total_mem = 2048`と書き込みます。
メモリを4GB指定する(`total_mem = 4096`)と起動しないのを避けるためです。あとで戻す(4GB使える状態にする)のでご安心を。

4.raspberry pi 4起動
各種ケーブルを挿して、SDカードを入れて最後に電源をさせばラズパイのロゴが4つとログが流れるはずです。ある程度経つと画面が遷移してSSHキーが表示される画面で表示が止まると思います。

5.sshセッションを貼る
著者、ipアドレスはあらかじめraspianで起動した際のを使いました。SSHキーが表示される画面にはipアドレスが表示されていなかったので、ルータのDHCP管理画面とかから取得するのが早いと思います。
sshセッションを貼ると、ubuntu/ubuntuのデフォルトのUser/PWが設定されているので、パスワードの変更が強制されるので適当に変更してください。それが終わればいつものubuntuのCLI画面が出てくるはずです。

6.一旦アップデート
普通に`update, upgrade`を叩いてください。エラーログが出てきて完走しないはずです。したら更新がきてるんでもうおわりだと思います。よかったですね。

7.ハードウェアの登録
この時点でupdateをかけても国内技適適応モデルはまだリストに登録されていないのか通んないです。そのため、`/usr/share/flash-kernel/db/all.db`に追記をします。
中身を見ると`Machine`から始まる行が、個別の機械の固有名詞ごとにアルファベット順に並んでます。なんで中盤〜後半あたり(正確には1966行)に`Machine: Raspberry Pi 4 Model B`から始まるブロックがあるはずです。そこに`Machine: Raspberry Pi 4 Model B Rev 1.2` を追記してください。

8.最終仕上げ
`sudo apt-get install linux-headers-raspi2 linux-image-raspi2 linux-raspi2`を叩いて、そののち再起動(`sudo reboot`)してください。
終わったら`uname -a`の実行後、`Linux ubuntu 5.3.0-1012-raspi2`が出てくれば完了です。3.で追記した`/usr/firmware/usercfg.txt`の`total_mem = 2096`を消してまた再起動すれば普通に動くはずです。再起動後に`free -m`でも実行してメモリ容量を確認してください。

おつかれさまでした。
4GBメモリがあれば[CeforeのCS](https://qiita.com/shimejifarm/items/3da2e6040a5fc047cf5e) が動作させられるので遊んでください。

#参照
[技適通過版Raspberry Pi 4のUbuntuで、Karnelアップデートがコケる件](https://qiita.com/takasan/items/ef93be9e9d3f791eee66)
[海岸砂丘さん(sack_magiclight)のTweet](https://twitter.com/sack_magiclight/status/1201060921537257479)
[expo][Reactnative]エラー「there was a problem loading the requested app. 」

# エラー内容
expoの画面上に`there was a problem loading the requested app. The experience you requested requires a newer version of the Expo Client app.`と出てしまい、画面が更新されない。

# ターミナルの確認
```
This version of the Expo app is out of date. Uninstall the app and run again to upgrade.
```
どうやらexpoアプリのバージョンに原因があるっぽい。

[expo is out of date uninstall and run again to upgrade](https://stackoverflow.com/a/54251496)
上記記事によると、iOSシミュレーターとインストールされているexpoアプリのバージョンが原因のようだ。

# 解決法
アプリを消去して、再度`expo start`し、新しいexpoアプリをインストールし直す。
![スクリーンショット 2019-12-02 14.15.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/aa94c894-a0f2-c5c0-ad8b-c0dfa175d6b2.png)
Swagger Viewer（VSCodeプラグイン）

# 概要
WebAPIの仕様書を書く際、何を使って書くかを考え、どうせなら OpenAPI の仕様に沿ってちゃんと書いてみようと思った。

その際のツールとして、[SwggerEditor](https://editor.swagger.io/) はすぐに利用できるので、便利でとっつきやすいと思う。
ただ、ローカル環境で SwggerEditor を使おうと思うと、Dockerなどを使って環境を整備しなくてはいけないので面倒。

自分が普段使っているエディターでもある VSCode（Visual Studio Code）で使えるプラグインがあったので、その紹介。

# Swagger Viewer
https://marketplace.visualstudio.com/items?itemName=Arjun.swagger-viewer

自分が編集しているyamlファイルの内容をSwaggerUIの画面に変換した状態で表示できる。
編集内容もリアルタイムで反映されるため、記述内容での見え方（改行など）の調整にも便利。

# インストール方法
1. VSCodeの「Extensions」を開く。
2. 検索欄に「SwaggerViewer」と入力するとプラグインが出てくるので、プラグインを選択し、インストールを実行する。

![SwaggerViewer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/09a6fa37-e549-2d8f-daae-434406672563.png)

# 感想
ローカルでの編集時に、SwaggerUIで表示した場合の見た目が確認できるのはかなり便利だと思いました。
また、プラグインを入れるだけなので、導入のハードルも低めかと思います。（VSCode使っている人前提）
[The Go Programming Language Specification] Iota

# Iota
Golangのspecificationの日本語訳と、ちょっとした遊びぐらいのコードを載せていく感じで進めようと思うので、
すでにGolangでコードを書いている人にはつまらないかもしれないです

また、間違っている部分があればぜひご指摘いただけると嬉しいです🙇‍♂️

#### 想定する読者層
- Golang初めてそこまで期間が経っていない
- 英語の公式読むの辛い
    - https://golang.org/ref/spec


### Iota
本記事は公式のドキュメントを参考にしています

- https://golang.org/ref/spec#Defer_statements

Iotaは以下のような状況になるまで関数の実行を遅延します

- 関数がreturnを返す時
- goroutinがpanicになった時

### iotaの宣言方法
iotaはconstによる変数宣言の中で使うことができます。iotaは0から始まる連続する型のない定数を表します。

```golang
const (
    c0 = iota // c0 = 0
    c1 = iota // c1 = 1
    c2 = iota // c2 = 2
)
```

ちなみにvarでは宣言することができません

```golang
package main

import (
	"fmt"
)

var (
	zero = iota
)

func main() {
	fmt.Println(zero)
}
```

```golang
undefined: iota
```
https://play.golang.org/p/Ft1J5TkmZIa

### サンプルプログラム
#### 通常

```golang
package main

import (
	"fmt"
)

const (
	zero = iota
)

func main() {
	fmt.Println(zero)
}
```

```text
0
```
https://play.golang.org/p/sNzbM3BmQw4

#### iotaよりも早くconst内で宣言されている変数がある場合

```golang
package main
import (
	"fmt"
)
const (
	hoge = 10
	zero = iota
)
func main() {
	fmt.Println(zero)
}
```
```text
1
```
https://play.golang.org/p/2hyCghuWOh4

#### iotaの宣言の合間に別の変数を宣言した時
- const内ではiotaはインクリメントされる
- iotaは前の値からインクリメントされる

```golang
package main
import (
	"fmt"
)
const (
	zero = iota + 1
	one
	hoge = 10
	three = iota
)
func main() {
	fmt.Println(zero)
	fmt.Println(one)
	fmt.Println(hoge)
	fmt.Println(three)
}
```

```text
1
2
10
3
```

#### constでiotaを分ける
- iotaはconstで分けると0へと初期化される

```golang

package main
import (
	"fmt"
)
const (
	zero = iota + 1
	one
	hoge = 10
)
const (
	three = iota
)
func main() {
	fmt.Println(hoge)
	fmt.Println(zero)
	fmt.Println(one)
	fmt.Println(three)
}
```

```text
10
1
2
0
```

#### おまけ
- iotaは整数値だけではない
- floatを設定してみた

```golang
package main

import (
	"fmt"
)

const (
	zero = iota
	one
	two
	three float64 = iota * 0.4
	four
	five
)

func main() {
	fmt.Println(zero) // iota = 0
	fmt.Println(one)  // iota = 1
	fmt.Println(two)  // iota = 2
	fmt.Println(three)// iota = 3 * 0.4
	fmt.Println(four) // iota = 4 * 0.4
	fmt.Println(five) // iota = 5 * 0.4
}
```

```text
0
1
2
1.2
1.6
2
```
https://play.golang.org/p/_GfAzIXKn9O
JScript 覚書

この記事は、[Fujitsu Advent Calender](http://qiita.com/advent-calendar/2019/fujitsu)の 3 日目の記事です。

# はじめに

@GORO_Nekoです。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

えーっと、先にお断りをば一言。

以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

# JScriptって知ってます？

JavaScriptじゃございません。

いや JavaScript の一種ではあると思うんだけど、なんかそう言い辛いスクリプト言語。

… そう、Open JDK だったり OracleJDK だったりに対する Visual J++ のようなスクリプト言語と言えば「…わかってもらえるでしょうか？」なスクリプト言語です（どっちも産みの親 Microsoft サンだし）。

# で、JScript ってナニ？

ざっくり言えば、ECMA 262 規格に準拠した Javascript の一種になります。

Microsoft サン自身 docs.microsoft.com の[Microsoft Windows スクリプト テクノロジに関する説明記事](https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392483(v=msdn.10))で、そう述べています。

[ECMA 準拠の機能](https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392015(v=msdn.10))、[ECMA に準拠しない機能](https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc409840(v=msdn.10))の一覧や機能詳細が公開されているので、ここいらを見れば特に他の解説本等が手元になくてもプログラムを組めるはずです。

JScript は WScript オブジェクトやMicrosoft ActiveX Data Objects (ADO) オブジェクト等を利用する機能を有しており、MS Windows 、.Net の諸機能や、MS OFFICE の提供するコンポーネントや機能を、便利に利用することにたけています。

動作するプラットフォームが MS Windows OS のみで OK なら、ディレクトリ・ファイル操作、標準入力・出力・エラー出力操作、レジストリ操作、DBアクセス等の機能を持ったスクリプトを、これ 1 つでゴリゴリかけてしまいます。

Javascript の一種なので当然「構造化プログラミング機能」「オブジェクト指向プログラミング機能」を持ち合わせたうえ、MS Windows 由来の機能を便利に使え、バッチファイル代わりにコマンドラインアプリケーションが結構便利にかけちゃう（まぁ、非 MS Windows プラットフォーム上では動かんけど）スクリプト言語。それが**自分にとっての**JScript だと思っています。

# 機能紹介その壱: JScript で標準入出力操作

前述の通り JScript は WScript オブジェクトの利用が可能です。

WScript オブジェクトには標準入力・出力・エラー出力を操作するためのプロパティ（ StdIn、StdOut、StdErr ）が用意されています。

各プロパティには入力内容を読み取ったり、コマンドプロンプトに出力を行ったりするためのメソッドが実装されえているので、これを使って標準入力・出力・エラー出力を操作できます。

【プログラミング例】

``` test01.js
WScript.StdOut.WriteLine("テストです");
WScript.StdOut.WriteLine("何か入力してください");
in_string = WScript.StdIn.ReadLine();
WScript.StdOut.WriteLine(in_string + " と入力しましたね？");
```

上記のコードをエディタ等でファイル名 "test01.js" と言うファイルを作ったとします。

```
x:\> cscript test01.js
```

作成した js ファイルは、スクリプトエンジン "cscript" を使って実行することができます。

コマンドプロンプト（ "CMD" ）上で以下のコマンドを実行してみると、JScript で標準入出力を操作できることがわかると思います。

ある縁で JScript を使う羽目（…ゑ？）になって、「結構集中的に使い方を調べた」 & 「このまま調べた結果を放置してるとじきに忘れて近い将来泣くことになりそうな気がする」だったので、この記事を備忘録代わりに書いてみました。

ディレクトリ・ファイル操作方法や DB アクセス方法等、どっかに書いておかないと忘れそうな情報がまだいくつか頭の中に残っているので、気力が続いたらそれらの紹介文も書いてみようと思います（…まぁ、そのうち…）。

自分以外のどっかの誰かの為になれば、Ruby 以外のスクリプト言語を使う羽目になったのも「無駄じゃなかった…かな？」と思いつつ。

では、また。

※　追記（2019/12/02）

[続編](https://qiita.com/GORO_Neko/items/1ff0b973deb72bf4a6e7)書きました。
データベース ざっくり解説　１正規化

##正規化
データベースで扱いやすいようにデータ整理すること
整合性が守られるデータベース設計

##主キー候補キー
主キーとは、「リレーショナルデータベースのテーブル内でレコードを一意に定められる項目」。主キーはNULLは許されない。
候補キーとは、主キーの候補になるキー。テーブル内でレコードを一意に定められる項目の組み合わせ。

#第1正規形

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382669/637c0793-eb95-2181-9515-91038b207d9f.png)

表に繰り返しの空きが出ないように繰り返し部分を列に増やす(あまりうまい説明ができないので空きのない表を作る的な感じで)

#第2正規形
##(条件) すべてのキー属性は候補キーに部分関数従属していない
###部分関数従属していないとは
候補キーの一部だけで他の項目が一意に定まる場合。
要は<font color="Red">
**候補キーの一部で項目が決まるのに、他に必要のない候補キーを入れていないこと。**
</font>
***

候補キーを第一正規形から探す。
***{ レシート番号, 商品コード }***
が候補キー

{レシート番号, 商品コード} → {数量, 小計}
{商品コード} → {商品名, 単価}
{レシート番号} → {店舗ID, 店舗名,住所 ,合計 ,消費税 ,請求額, 日時, 担当者コード, 担当者名 }

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382669/b659ce32-65e2-ab74-875b-ed75216858e9.png)


#第三正規形
## (条件)非キー属性は候補キーに推移的関数従属していない
推移的関数従属とは<font color="red"> **非キー または 候補キー + 非キー によって非キー項目が一意に定まること**</font>
第二正規化のときのテーブルを例にすると、非キー属性の{店舗ID}が決まると{店舗名,住所}が一意に定まる。← 推移的関数従属している。
<hr>

一般的には第二正規形から導出項目(計算によって求められる項目)を除く。
今回は{小計, 合計, 消費税, 請求額}


推移的関数従属を排除して完成

![db_3_seikika.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382669/96d48869-752f-5c39-4aea-d2f3f98547ad.png)


### 補足
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382669/92526e22-98b7-2123-69d5-be242647e974.png)
超キーも重要ポイント
第三正規形は超キーを作り出すのがポイント



##参考にしたサイト

[第一正規化・第二正規化・第三正規化の違い](https://high-programmer.com/2017/10/21/db-normalization-difference/)

[データベースの正規形について考える](https://qiita.com/nomunomu0504/items/0ff1329dce297c8bd5c9)

[候補キーから第3正規化までをマスターする](https://qiita.com/naoqoo2/items/cdda5fe6f9935a03189d)
GAからExcelへ転記する際に邪魔になる割合のパーセンテージを簡単に削除する方法 

本記事は[GoogleAnalytics Advent Calendar 2019](https://qiita.com/advent-calendar/2019/google_analytics) 2日目の記事になります。

- GA＋Excelでサクッと集計・レポートしたい時ありますよね？

## 問題点
メニューからエクスポート、Excelを選んでダウンロードして、
シートを変えてデータをコピーなんてやってられませんよね。

GAの画面に出てるディメンションとメトリックスの文字や数字をExcelに転記しようとすると、
割合のパーセンテージが邪魔になりませんか？？

### GA側
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142130/81bdefed-1847-9386-4a12-cc428469562d.png)

### Excel側
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142130/09d6a00e-68f3-1062-6c70-668f37d593d7.png)


## 解決法
- 置換（Ctrl+h）＋正規表現（*(）で簡単に(以下を削除できます
![excel.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142130/3cf5c1a2-360a-3bc5-90ed-fa3df24dbbb3.gif)


覚えておくと時短にもなるので、是非使ってみて下さい！
FireFoxだとテーブルを縦コピーできるので、本Tipsと組み合わせて仕様できます。
Chromeだと拡張を入れないといけないので、また別記事で紹介します！
[React] 年末だしwindow.matchMedia()で爆速レスポンシブ対応していこうな

# はじめに
この記事は [[React] 年末だしstyled-componentsで爆速レスポンシブ対応していこうな] (https://qiita.com/nerikosans/items/b2f6934347563d9a2587) の続きです。

前回は styled-components 内でレスポンシブを爆速にする方法を書きましたが、この方法では「端末がモバイルのときだけ`render`」といったことはできません。 

例えば以下のようにすれば

``` .tsx
const SPOnlyBox = styled.div`
  background: black;

  /* PC */
  ${media.pc`
    display: none;
  `}
`;
```

一応PC上でDOMを見えなくすることはできますが、これだとDOMそのものは残ってしまいますね。

ということで、便利な解決策を考えていきます。

# 目標
最近のReactはまさに大 hooks 時代です。仮に `useMedia` っていうhookがあって、端末がモバイルかPCか、こんなふうに書けたら嬉しいですよね。

``` .tsx
const media = useMedia();
const isSP = media.sp;

return (
  <div>
    { isSP && <SPOnlyBox /> }
  </div>
)
```

これを目指します！

# Solution: `window.matchMedia()`
### つかうもの
世の中には便利なものがあるんですね。ブラウザ標準で、CSS media query形式から、それが現在の環境に合致するかどうか判定してくれる関数があります。
[Window.matchMedia() - Web APIs | MDN](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia)

この関数を使えば次のようになります。

``` .tsx
const isSP = window.matchMedia('screen and (max-width: 767px)').matches;
```

### hook化する
上記の状態で事は済んでいますが、hooksとして共通化しましょう。

``` .tsx
export const useMedia = () => {
  const queryStrings = {
    pc: 'screen and (min-width: 768px)',
    sp: 'screen and (max-width: 767px)',
    short: 'screen and (max-height: 480px)',
  };

  return Object.fromEntries(
    Object.entries(queryStrings).map(([k, v]: [string, string]) => [
      k,
      window.matchMedia(v),
    ])
  );
};
```

### できあがり
これで問題ありません。以下のように書けます。

``` .tsx
const media = useMedia();
const isSP = media.sp.matches;
```

実に簡潔で最高ですね。

# 補足
### event listener
このとき `media.sp` は `MediaQueryList` になっており、

``` .tsx
media.sp.addListener((e) => { ... })
```

することでメディアクエリの変更を動的に検知することもできるみたいです。

### react-media-hook
[lessmess-dev/react-media-hook](https://github.com/lessmess-dev/react-media-hook#readme) が近い思想で存在してます。これをつかっても良いですし、どちらにせよwrapしたくなるので、上記のように自分で書いてもいいと思います。

以上です！ ありがとうございました！
AWS CloudFront + ALB + httpd の組み合わせで一部のブラウザでページが表示できなかった問題の原因と対処

# 2021/04/07 追記

ALB - EC2 間を HTTP/2 で接続する方法について、ALBに追加された機能を使って解決する方法書きました。

https://qiita.com/t-kigi/items/ccb6b84138f5c602d9c8


# はじめに

https 通信で CloudFront を経由し、ALB -> EC2 という非常に標準的な構成を採っていたのだが、一部のツール・ブラウザで表示が行われなかったため調査を実施した。
概要は以下の通り。

- iPhone の Safari ではページが全く表示されない
- curl を打つと `curl: (92) HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)`
- Windows の Safari (古いけど...) では `キュリティ保護された接続を確立できません` という表示

結果として、2つの問題があった。


## 問題1. Upgrade: h2,h2c

これは全く同じ問題が公開されていたので引用。

https://dev.classmethod.jp/cloud/aws/resolve-safari-and-alb-https-connection-errors/

ALB は HTTP2 を受け付けるが、ALB-EC2間は HTTP 1.1 で通信される。
Apache の mod_http2 を有効にしていると、HTTP 2 通信が可能なので Upgrade をレスポンスヘッダに含めてしまう。
すると、ユーザーとALBの間は HTTP2 でやり取りされているので、HTTP2 通信にも関わらず、レスポンスヘッダにUpgradeタグが注入されてしまう。
しかし、HTTP 2のRFCでは

> 8.1.2.2.  Connection-Specific Header Fields
> HTTP/2 does not use the Connection header field to indicate
> connection-specific header fields; in this protocol, connection-
> specific metadata is conveyed by other means.  An endpoint MUST NOT
> generate an HTTP/2 message containing connection-specific header
> fields; any message containing connection-specific header fields MUST
> be treated as malformed (Section 8.1.2.6).
> 引用元: https://tools.ietf.org/html/rfc7540#section-8.1.2.2

となっており、HTTP2 通信の中に HTTP2 をupgradeさせる情報を含めてはいけない(MUST NOT)。
この仕様を厳格に守った場合はそのような通信を受け入れてはならないので、Safari や curl では通信を行うことができない。

対処方法は EC2 側の httpd で HTTP2 を無効化して HTTP 1.1 のみを有効とすればよい。 一般的には mod_http2 を Load しなければよい。 やり方は上記URL参照。


## 問題2. TLS のデフォルトバージョン

問題1. を対処した結果、iPhone と curl は正常に通信できるようになったが、Windows の Safari のみ通信ができない状態だった。また、CloudFrontへ向けた場合は失敗、ALBへ向けた場合は成功、と地味にふるまいが一貫していない。

あれやこれやと試してみた結果、WindowsのSafariリリースが2012年で止まっているということで思い当たったのがサーバーサイドで受け入れ可能なTLSバージョンだったので確認。

リソースの生成時には CloudFront も ALB もセキュリティポリシーには、Management Console から選択可能なデフォルト/recommended を選択した。
しかし、実はこの２つで受け入れ可能なTLSのバージョンが異なっている(※記事執筆の19/12/02時点)

| コンテンツ | デフォルト(recommend)ポリシー | サポートするTLSの最低バージョン |
|---|---|---|
| ALB | ELBSecurityPolicy-2016-08　| TLSv1.0 |
| CloudFront | TLSv1.1_2016 (recommended) | TLSv1.1 |


今回は、下位側に合わせる意味で CloudFront 側のセキュリティポリシーを `TLSv1_2016` に修正してDeployを実施。 ステータスが Deployed になった後に再度 Windows Safari で接続すると接続できた。
xmlHttpRequestでファイル読み取り

#xmlHttpRequestでファイル読み込みを行う
javascriptでどうにかローカルファイルを読み込みたくて、
xmlHttpRequestで実装することにした。以下の点で、困ったので
記録として残しておこうと思います。

下記コードでファイル読み込み実施したが、古いファイル内容が読み込まれる
時が多々あり、困っていた。
原因は頻繁に発生するリクエストはキャッシュに保存され、ファイルが更新
されていてもキャッシュからデータを取得することで古いデータしか取得できなかった。

```
var rawFile = new XMLHttpRequest();
var allText = "";
rawFile.open("GET", file, true);
rawFile.onreadystatechange = function (){
  if(rawFile.readyState === 4){
     if(rawFile.status === 200){
　　　　allText = rawFile.responseText;
     }else{
        alert("データ取得失敗")
     }
  }
}
rawFile.send(null);
```

キャッシュからデータを取得しない設定を下記のように実施し、改善できた。

```
var rawFile = new XMLHttpRequest();
var allText = "";
var file ="xxx.txt"
rawFile.open("GET", file, true);　//false:同期通信 true:非同期通信
//以下３行はキャッシュから取得しない設定
rawFile.setRequestHeader('Pragma', 'no-cache');
rawFile.setRequestHeader('Cache-Control', 'no-cache');
rawFile.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT');
rawFile.onreadystatechange = function (){
  if(rawFile.readyState === 4){
     if(rawFile.status === 200){
　　　　allText = rawFile.responseText; //取得完了時の処理
     }else{
        alert("データ取得失敗")
     }
  }
}
rawFile.send(null); //上記設定でリクエストを送信
```

問題発生時は、全く原因がわからず、キャッシュというキーワードにたどり着くまで、
長い闘いでした。
原因探索のために、対象のファイルパスを削除してもファイルがリードされ、
何が何やらわからなかった。とりあえず、解決できてよかった。

今回、ついでに勉強になったこと。。。
同期通信で取得すると、データを受信するまで、クライアント側の処理がストップする
ため、非同期で取得するほうがいい。

参照ページ
http://butaryuu.web.fc2.com/httpreq_cache.html
Vuejsのcomputedでsliceを使う方法

# はじめに
メモ程度に置いときます。

# 成功したコード
```home.vue
<template>
 <div v-for="group in limitedGroups" :key="groups.id">
  <h1>{{ group.name }}</h1>
 </div>
</template>
<script>
export default {
// めんどくさいんでAPI叩いてるところは省略します
 computed: {
  limitedGroups() {
   return this.groups.slice(0, 2)
  }
 }
}
```

# 失敗したコード
```home.vue
<template>
 <div v-for="group in limitedGroups" :key="groups.id">
  <h1>{{ group.name }}</h1>
 </div>
</template>
<script>
export default {
// めんどくさいんでAPI叩いてるところは省略します
 computed: {
  limitedGroups: function() {
   return this.groups.slice(0, 2)
  }
 }
}
```

# まとめ
特になし！
誰かの参考になればいいな。
#Stripe #API でカスタマー = 顧客を作成・取得する ( 公式ドキュメントのまま ) ( #Ruby )

# Command

Ruby

```rb
require 'stripe'
Stripe.api_key = 'sk_test_xxxxx'

Stripe::Customer.create({
  description: 'Customer for jenny.rosen@example.com',
})
```

curl

```
curl https://api.stripe.com/v1/customers -u sk_test_xxxxx: -d description="Customer for jenny.rosen@example.com"
```

# API Doc

https://stripe.com/docs/api/customers/create?lang=curl

# example

```json
$ curl -s curl https://api.stripe.com/v1/customers -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: -d description="Customer for jenny.rosen@example.com"
{
  "id": "cus_GHaC8VxZWYuwcl",
  "object": "customer",
  "account_balance": 0,
  "address": null,
  "balance": 0,
  "created": 1575239418,
  "currency": null,
  "default_source": null,
  "delinquent": false,
  "description": "Customer for jenny.rosen@example.com",
  "discount": null,
  "email": null,
  "invoice_prefix": "B92698A0",
  "invoice_settings": {
    "custom_fields": null,
    "default_payment_method": null,
    "footer": null
  },
  "livemode": false,
  "metadata": {
  },
  "name": null,
  "phone": null,
  "preferred_locales": [

  ],
  "shipping": null,
  "sources": {
    "object": "list",
    "data": [

    ],
    "has_more": false,
    "total_count": 0,
    "url": "/v1/customers/cus_GHa5lNIgPs4wF3/sources"
  },
  "subscriptions": {
    "object": "list",
    "data": [

    ],
    "has_more": false,
    "total_count": 0,
    "url": "/v1/customers/cus_GHa5lNIgPs4wF3/subscriptions"
  },
  "tax_exempt": "none",
  "tax_ids": {
    "object": "list",
    "data": [

    ],
    "has_more": false,
    "total_count": 0,
    "url": "/v1/customers/cus_GHa5lNIgPs4wF3/tax_ids"
  },
  "tax_info": null,
  "tax_info_verification": null
}
```

# ダッシュボードで確認

https://dashboard.stripe.com/test/customers

![image](https://user-images.githubusercontent.com/13635059/69921450-102a0400-14d5-11ea-8b1a-a93cdfea357f.png)

発行された customer_id がURLにも反映されるみたいだ

https://dashboard.stripe.com/test/customers/cus_GHaC8VxZWYuwcl

![image](https://user-images.githubusercontent.com/13635059/69921526-e4f3e480-14d5-11ea-940a-b3f8cba63050.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2796








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
formのactionを上書きするformactionが便利

## 従来はformのactionの場所にのみ遷移する

遷移先を変えるにはjsなどが必要だった

## HTML5で上書きできるformactionが登場

- inputやbuttonに記述する
- selectにはなさそう（これはまだjsで制御？
- 押すものによって別々の場所に遷移（趣味が映画なら好きな映画のジャンルのページに、アニメなら好きなアニメのジャンルのページに移動など）
- inputならactionをオーバーライド、buttonならそのまま移動できる
- [対応ブラウザ](https://caniuse.com/#search=formaction)
Notionでよく使うショートカット

アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2019](https://qiita.com/advent-calendar/2019/notion) 2日目のエントリです。
1日目は[プロジェクト管理やドキュメンテーションにNotionを使おう](https://qiita.com/pictiny/items/1f442697bac06bde0205) でした。

# よく使うショートカット集

Notionのショートカットは公式で [Learn the shortcuts](https://www.notion.so/Learn-the-shortcuts-66e28cec810548c3a4061513126766b0) にまとまっていますが、その中でも実用でよく使うものをご紹介します。

## 見出し

Markdown記法でもよく使う `#` `##` `###` が使えます。Notionでは H3 までしかありません。
レイアウトや文字サイズを意識してH2やH3の見出しから書き始める人もいると思いますが、NotionではH1ヘッダーから使うのがよいでしょう。

<img width="371" alt="見出し" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/b52c1555-70bf-c631-c77f-595040bc1505.png">

## リスト

これもMarkdown記法ですが、`-` や `*` でリストになります。Notionでは `+` もリストのショートカットに割り当てられていますが、個人的には `+` を使うことはあまりないです。
余談ですが、チェックボックスのリストは `- [ ]` ではなく、 `[]` になります。

<img width="409" alt="リスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/e1dbc642-b9f0-bb18-bab5-08fe1b9bbe27.png">


## コードブロック

これまたMarkdown記法ですが、

```lang:Markdown
```here is code```
```

のようなコードブロックが使えます。バッククオートが1つだと、文中のコードブロックになります。

<img width="735" alt="コードブロック" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/bdf5897b-f882-6681-4320-f72f04049ea1.png">

# まとめ

Notionでは慣れ親しんだMerkdown記法のようなショートカットで使えるので便利ですね！
Pythonのダックタイピング（duck typing）を理解する

`  ”If it walks like a duck and quacks like a duck, it must be a duck” `

Pythonに限らず、プログラミングにはポリモーフィズムという概念があります。これはオブジェクト指向プログラミングの概念の一つで、日本語では多態性・多様性など言われています。

クラスの型が別であっても同じ名前のメソッドがあればそれを使用することができ、異なるオブジェクトで同じ操作を切り替えて使うことができます。

このようなコードをダックタイピング（duck typing）などと言います。




```Python

class Animal(object):
    def run(self):
        print('Animal is running...')
class Dog(Animal):
    def run(self):
        print('Dog is running...')
class Cat(Animal):

    def run(self):
        print('Cat is running...')
class people():           #ご注目してください、Amimalのサブクラスではありません
    def run(self):
        print("people is running...(do not extends Animal)")
def run_twice(animal):
    animal.run()
    animal.run()
    
run_twice(Cat())
run_twice(Animal())
run_twice(people())   #問題がなく実行できます。

```

Cat is running...
Cat is running...
Animal is running...
Animal is running...
people is running...(do not extends Animal)
people is running...(do not extends Animal)
GCPのCloud Runで一瞬でKnative環境を構築する

# Knativeとは
## サーバーレス機能を提供
k8s上に構築されるが、クラスターに依存せず、サーバーレスなワークロードの実行をする。
k8sの機能を利用しながら簡単にサーバーレスな環境構築ができるいいとこ取り環境

## Knative Build
### Kubernetesでビルドをする場合の手順
- プログラムはGitHubにpushしておく。
- Dockerfileをbuildしてimageを作成
- それをコンテナ内にCOPYしておく必要があるので、毎回違うイメージが出来る。
- Cloud Registryにdocker push
- kubernetesからデプロイしたいimageを選択できるようにymlを作る

これらを実際に行うには、まずはGoogleCloudBuild、GoogleCloudPipelineなどを用いてCIを設定する必要がある。また、TravisやJenkinsのようなツールでコンテナを構築する必要がある。

Knative Buildでは、
これらの作業を全てKnativeによって行うことができる。
つまり、クラスター内部でBuildを完結させられる。

## Knative Serve
ServiceのConfigとRoutingを一括して巻き取ってくれる。
また、マイクロサービスのサービスメッシュで標準的なistioのコンポーネントが組み込まれている。
これによって、マイクロサービスでの、トラフィック管理、ルーティング、オートスケールもしくはゼロスケールをしてくれる。

また、pushを行うと毎回プロビジョンが保管されるため、大規模アップデートにおける段階的なロールアウトやグロースハックにおけるA/Bテストも、Knative Serveを用いて行うことができる。
当然、ロールアップの際にサービスを停止する必要もない。

# では、本題のCloudRunとは
上で説明した、Knativeのマネージドサービスである。

Knative から作成されているため、Cloud Run を使用してフルマネージド型でコンテナを実行するか、Cloud Run with GKE を使用して Google Kubernetes Engine クラスタ内でコンテナを実行するかを選択できる。

ここでは、フルマネージド型CloudRunでHTTP リクエスト経由で呼び出し可能なステートレス コンテナを実行する。

何がすごいって、フルマネージドで、サーバーレスなので、インフラ管理なしで、Kubernetesの基本的な機能がつかえるということ。

# 一瞬でKnative環境を構築する。
## [準備]DockerImageを作っておく。
まず、Dockerfileを作成して
https://qiita.com/riita10069/items/7c6d2958294910d346d1
https://qiita.com/riita10069/items/396f1d86cd7ebe21f75b
必要であれば、docker-composeも作成して
https://qiita.com/riita10069/items/5c7eac45486c8fff91fb

## GCRにpushする。
#### ビルド
`docker build -t practice:1 . `
`docker-compose build`

#### Resistory用にタグをつける必要があるので忘れないように
`docker tag images:tag gcr.io/$PROJECT_ID/imageの名前:tag`

#### GCRにpushする
`gcloud docker --push gcr.io/$PROJECT_ID/imageの名前:tag`

## CloudRunを設定する。
まず、CloudRunのAPIを有効化して
コンソールで、CloudRunを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309507/d0b260b0-e0e8-9756-1833-a855f2653973.png)

これのサービスを作成を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309507/085c7759-180f-e48f-8bcc-574339929cb6.png)


ここに指定したタグ名を
`gcr.io/$PROJECT_ID/imageの名前:tag`
って書いてあげて
「作成」をクリックしたらコンテナが完成する
｢FreeBSD 10 で ports だけなんとか延命させながら使い潰している人｣

# オチ
ports の Mk ディレクトリにある mk ファイルをいじればなんとか延命出来るけど、12-RELEASE など最新リリース版にアップデートできる環境ならさっさとアップグレードしたり新しいマシンに置き換えよう!!

# はじめに
FreeBSD Advent Calendar 2019 の18日目の記事です。
このお話は古い FreeBSD の環境で「[[FreeBSD] FreeBSD ports tree の更新を portsnap から git (github) に変更](http://w.vmeta.jp/tdiary/?date=20130313)」に記載している内容で実行･使用しています。

# 環境と経緯
- 中古で売られていた FMV-D3260 に FreeBSD 10(amd64)をインストールして使用
- 手持ちの NAT 箱に載せている FreeBSD 10 をアップグレードする際に確認でアップグレード
    - ｢あれ? 起動が途中でコケてんな?｣
        - それが[某所へこういう内容](https://mint.5ch.net/test/read.cgi/chakumelo/1430800774/529)で告知する理由になった
- 色々動かしている筐体なので数時間止めるにもなぁ･･･
    - かといって確認するためにモニタのところへ持って行くのも~~正直ﾒﾝﾄﾞｸｻｲ~~ちと大変だし･･･
        - カスタムカーネルを作って起動するかいちいち確認する手間
- (「キモーイ」[^motoneta1]とか「キャハハハハ」[^motoneta1]とか言われるほどパソコンが買い換えられない貧乏人なので)それでもなんとか延命させてる ← ｲﾏｺｺ

# ports の configure でコケる
それでもなんとか延命させていますが ports のアップグレードをする際に configure でエラーが出てビルドがコケるようになりました

```shell:console(一部抜粋)
configure:3250: checking whether the C compiler works
configure:3272: cc -O2 -pipe  -fstack-protector-strong -fno-strict-aliasing    -fstack-protector-strong  conftest.c  >&5
cc: error: unknown argument: '-fstack-protector-strong'
cc: error: unknown argument: '-fstack-protector-strong'
```

# diff
コケる原因を探して最終的にどうにかした diff です

```shell:console
[root@FMV-D3260 Mk]# git diff * 
diff --git a/Mk/bsd.ssp.mk b/Mk/bsd.ssp.mk
index 0bc5819bcd..2a39fc59b8 100644
--- a/Mk/bsd.ssp.mk
+++ b/Mk/bsd.ssp.mk
@@ -6,7 +6,7 @@ SSP_Include_MAINTAINER= portmgr@FreeBSD.org
 .if !defined(SSP_UNSAFE) && \
     (${MACHINE} != "mips")
 # Overridable as a user may want to use -fstack-protector-all
-SSP_CFLAGS?=   -fstack-protector-strong
+SSP_CFLAGS?=   -fstack-protector
 CFLAGS+=       ${SSP_CFLAGS}
 LDFLAGS+=      ${SSP_CFLAGS}
 .endif
[root@FMV-D3260 Mk]# 
```
はじめは SSP_CFLAGS を外した状態にしていましたが [GitHub の履歴](https://github.com/freebsd/freebsd-ports/commit/e657299ccde222d07ed1c19fd464ac81583320d6#diff-fc7ba6e2deae177edca140db0af61dcd)ではオプションを切り替えただけになっていたのでこっそり直したのは(ry

# (最後に大事なことなので)オチ
**ports の Mk ディレクトリにある mk ファイルをいじればなんとか延命出来るけど、12-RELEASE など最新リリース版にアップデートできる環境ならさっさとアップグレードしたり新しいマシンに置き換えよう!! な!!![^motoneta2]**
make.conf でコンパイラを置き換えてもなんとか延命できるでしょうけど(ry

[^motoneta1]: [キモーイガールズ - ニコ百](https://dic.nicovideo.jp/id/4862908)
[^motoneta2]: [熊先生 | やる夫 Wiki | Fandom](https://yaruo.fandom.com/wiki/%E7%86%8A%E5%85%88%E7%94%9F)
[The Go Programming Language Specification] Defer

# Defer
Golangのspecificationの日本語訳と、ちょっとした遊びぐらいのコードを載せていく感じで進めようと思うので、
すでにGolangでコードを書いている人にはつまらないかもしれないです

また、間違っている部分があればぜひご指摘いただけると嬉しいです🙇‍♂️

#### 想定する読者層
- Golang初めてそこまで期間が経っていない
- 英語の公式読むの辛い
    - https://golang.org/ref/spec


### Defer statements
本記事は公式のドキュメントを参考にしています
- https://golang.org/ref/spec#Defer_statements

Deferは以下のような状況になるまで関数の実行を遅延します
- 関数がreturnを返す時
- goroutinがpanicになった時

### Deferの使用方法

```golang
defer function
```

### サンプルプログラム
例えば以下のようなプログラムの場合、main関数がreturnされる直前に `defer print(s)` が呼び出されて出力される値が入れ替わっているように見えます。

```golang
package main

import (
	"fmt"
)

func main() {
	s := "Hello, playground"
	print(s)
	defer print(s)

	fmt.Println("before return")
}

func print(s string) {
	fmt.Println(s)
}
```

```text
Hello, playground
before return
Hello, playground
```
https://play.golang.org/p/oBfrVbpttpm


[[The Go Programming Language Specification] Channel](https://qiita.com/mergit/items/52b0ff5e46bfba29048f) についてもぜひ、ご一読ください。
golangでAzureDevOps

最近Goを勉強する機会があった為、まとめの意味も込めて書いてみます。
色々やり方はあると思いますが、この方法が作り易いと感じました。
まずはDevOpsプロジェクト作成まで。

# 作り方

## テンプレートからDevOpsのプロジェクトを作成
まずはテンプレートからDevOpsのプロジェクトを作成します。
[Azure Portal](https://portal.azure.com/#home)へログインします。

※最初にハマったんですが「Azure Portal」と「Azure DevOps」は別のサイトになってます。
これを理解するまで結構苦戦しました。
Azure DevOpsは元々Visual Studio Team Servicesという別のサービスだったようです。

ポータル上部の検索ウィンドウに「devops」と入力すると候補が表示されます。
「DevOps Projects」を選択
![スクリーンショット 2019-11-29 14.56.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30796/097b8b3f-af5e-2604-8866-8b3894918207.png)

プロジェクトを作成します。
![S01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30796/0bc8b42e-8b72-6d85-e4dc-48877faf75ac.png)

今回はGoを使うのでGoを選択します。
![S02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30796/02a2108e-39c8-a800-1d06-6e4c8136efcb.png)

確認画面
![S03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30796/2837068e-fc22-3195-9b64-09af2a61fb89.png)

コンテナを使いたいのでコンテナを選択します。
![S04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30796/25ea2adc-e8db-15f0-5e8f-f6eebeda2032.png)

DevOpsのプロジェクト名とサーバー名を設定します。
Additional settingsでサーバー構成も設定しておきましょう。
![S05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30796/a57d2ed8-36ac-d627-8de6-bea7718781dd.png)

WebAppとコンテナレジストリ名は勝手に入ってくれます。
サーバー構成を設定します。
一番安いやつにしました。
![S06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30796/a6f0c888-e2af-3a43-5650-b5165dccc37a.png)

これで設定は完了です。Doneを押します。
![S07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30796/3d5008f1-3308-e6bc-266c-8dd3a2c68ac3.png)

しばらく待つと完成します。
![S08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30796/70f356a6-e25d-dfbc-db4b-6af467710814.png)

「リソース移動」から遷移すると下記のような画面が表示されます。
![スクリーンショット 2019-11-29 15.56.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30796/bc756a53-e5f4-6cd1-ceb3-349e29ecc25d.png)

「Browse」からweb画面でサンプル表示を確認出来ます。
![スクリーンショット 2019-11-29 15.56.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30796/94f5a38a-0c1b-afd8-f5f5-2da931428c87.png)

以上
お疲れ様でした。