OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerコンテナ内のRで図をプロットする

# はじめに

R の `tidyverse` パッケージ群を含む docker イメージとして `rocker/tidyverse` が有名です。ただし、これらのイメージは（恐らく）RStudio を使用する前提で作成されています。

私は RStudio を使用しておらず、以下のような経緯もあってコンテナ内の R でプロットを表示させる方法を調べてみました。

1. R のパッケージのバージョンを固定したい
2. `tidyverse` パッケージ群のインストールは時間がかかる
3. `rockerjp/tidyverse` を使用すれば、自分で大量のパッケージをインストールしなくてすむため便利だろう
4. コンテナ内の R でプロットを表示させたい


## 参考URL

- [Dockerを用いたGUIアプリケーションの実行](https://postd.cc/running-gui-apps-with-docker/)
- [Docker コンテナ内のGUIアプリを起動してホスト側に表示する](https://zukucode.com/2019/07/docker-gui-show.html)
- [Dockerコンテナの中でGUIアプリケーションを起動させる](https://unskilled.site/docker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E4%B8%AD%E3%81%A7gui%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%95%E3%81%9B%E3%82%8B/)

これらのリンク先の設定と比較すると項目が少ないですが、恐らく使用した R のコンテナ内で設定されているからと思います。


# 実例その1：`r-base` イメージの場合

まず、R の公式イメージである `r-base` で試しました。試行錯誤した後の結果を示します。

## 設定項目

- `-u docker`
  - これを指定しないとプロットが表示されませんでした
- `-e DISPLAY=$DISPLAY` および `-v /tmp/.X11-unix:/tmp/.X11-unix`
  - 参考記事を参照


```bash
docker run --rm -it \
  -u docker \
  -e DISPLAY=$DISPLAY \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
    r-base R
```


```r
boxplot(iris$Sepal.Length ~ iris$Species)
```

<img width=60% alt="unnamed-chunk-2-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373740/fdd4d3be-2087-17a8-cd2c-d9954c15a0b4.png">

プロットされました。


# 実例その2：`rockerjp/tidyverse` イメージの場合
## とりあえずチャレンジ

先程と異なり、ユーザー名は `rstudio` とします（元々のイメージ内で指定されています）。


```bash
docker run --rm -it \
  -u rstudio \
  -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix \
  rockerjp/tidyverse R
```


```r
> boxplot(iris$Sepal.Length ~ iris$Species)
Error in (function (display = "", width, height, pointsize, gamma, bg,  : 
  X11 module cannot be loaded
In addition: Warning message:
In grSoftVersion() :
  unable to load shared object '/usr/local/lib/R/modules//R_X11.so':
  libXt.so.6: cannot open shared object file: No such file or directory
```

このようにエラーが出てしまい、プロットされませんでした。
`libXt.so.6` が不足しているようです。

## `libxt6` パッケージを追加したイメージの場合

そこで、以下のような Docker ファイルを用意しました。


```bash
FROM rockerjp/tidyverse:latest

RUN apt-get update \
    && apt-get install -y libxt6
```

ビルドします。イメージ名は仮に `mytidyverse` とします。


```bash
docker build -t mytidyverse .
```


```bash
docker run --rm -it \
  -u rstudio \
  -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix \
  mytidyverse R
```


```r
boxplot(iris$Sepal.Length ~ iris$Species)
```

図は省略しますが今度はプロットされました。

`tidyverse` がインストールされているので `ggplot2` でも試してみます。


```r
library(ggplot2)
ggplot(iris, aes(Species, Sepal.Length)) +
    geom_boxplot()
```

<img width=60% alt="unnamed-chunk-9-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373740/61ef5011-f5c0-e1e1-bc8b-3de578101cbc.png">

これもプロットされました。

# おわりに

`rockerjp/tidyverse` のコンテナ内で R を起動して、プロットすることに成功しました。これで自分で `tidyverse` パッケージ群をインストールせずに済みます。

公式イメージで `libxt6` パッケージを追加してもらえれたら今回のような手間は減るのですが……（他力本願）
国内の COVID-19 の死亡率はなぜ、緊急事態宣言以降に上昇しているのか

2020年５月中旬以降の日々のニュースでは、COVID-19 による日本国内の死者数はそこそこ多い。総感染者数と総死亡者数の比である死亡率が 4% を超える日々が続く。季節性インフルエンザの死亡率は教科書的には 0.1% くらいのようなので、実に 40 倍である。高年齢や持病による偏りが大きいという情報が正しいなら、そういった人々ではもっと死亡率が高い事になる。

へぇ、そうなんだ... と思ったときにまずやるべきは、データのプロットである。報道から受ける印象を真に受ける前に、その印象と、自分なりにプロットしたときの印象を比較しなければならない。そこで欧州疾病対策センター ([European Centre for Disease prevension and Control](https://www.ecdc.europa.eu/en/publications-data/download-todays-data-geographic-distribution-covid-19-cases-worldwide
), ECDC) のデータから日本の部分を取り出してプロットしてみた。

まず、死亡率。日ごとの感染者発生数に対する、その日の死亡者数の比である。死亡者の割合が高いな、と思ったからまずそれを見てみる（灰色は標準誤差）。

![01death_rate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377279/e03b4ad5-5511-be0b-080b-b4433e1b04b0.png)


どうやら、2020/04/07 に緊急事態宣言が出たとき（元旦から97日目）くらいから、急速に上昇している感じである（縦軸は常用対数なので注意）。日々の死亡率で言えば 4% どころか、50% を超える日さえある。感染者の半数が死んだ？そんなバカな！と思うのが普通である。あれだけ自粛ムードになったんだから、事態は収まってくることが期待されるし、そうなるはずである。スペイン風邪でもそんなに死んでない。そこで、死亡率を計算する元となっている、感染者発生数と死亡者数を見てみる。

![02case_and_death.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377279/e3ee7f28-3c13-8851-eca8-1d8f95f1b22a.png)


赤が感染者発生数、青緑が死亡者数である。あぁなるほど、という感じである。緊急事態宣言の出た二週間後くらいに、感染者発生数は減少に転じている。しかし死亡者数の減少はそれからさらに二週間くらい遅れている。「死亡率 = 死亡者数 / 感染者発生数」なので、分母が小さくなっていっているのに分子の減少が遅れていれば、分数の値は大きくなるのも納得できる。つまり、事態の変動が早いのである。

なお感染者発生数と死亡者数について、値が０の日はデータから除いた（対数が未定義なので）。値が１の日は、対数空間では０としてプロットされている。こういったデータは一般化線形モデル (GLM) が適切といわれる事もあるが、この感染者発生数のデータについては、GLM では残差の分布が均一ではなく、あまりよくなかった。

まぁ時系列データのモデリングは、試行錯誤でいろいろ探すのが基本、という事である。
ウェルノウンポートについて



よく使う、最低限これだけは覚えておきたいウェルノウンポートだけまとめてみました。

#ウェルノウンポート(TCP & UDP)
**20**-FTP(データ転送)
**21**-FTP(コントロール)
**22**-ssh(リモートログイン（セキュア）
**23**-telnet(リモートログイン)
**25**-smtp(メール送信)
**53**-domain(DNS)
**80**-http(www)
**110**-POP3(メール受信)
**443**-https(www（セキュア）)

#自身がよく使う登録済ポート番号
**3000**-Ruby on Rails
**3306**-MySQL
**5432**-PostgreSQL


>[Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版](https://www.amazon.co.jp/gp/product/4822237443/)
>[「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか](https://www.amazon.co.jp/%E3%80%8C%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8D-%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%E3%80%81%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B-%E5%B0%8F%E6%A3%AE-%E8%A3%95%E4%BB%8B/dp/4774142352/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3GC4RJQUPJ2D9&dchild=1&keywords=%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEweb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80&qid=1590072146&sprefix=%E3%83%97%E3%83%AD%E3%81%AB%E6%88%90%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%2Caps%2C276&sr=8-1)
【Python】スクリーンショットを撮る【Mac】

#環境
macOS Mojave
Python 3.7.6
#動機
数多のスクリーンショットの取り方を見たが、全くわからない。
そもそも、このコードを入れるとかあるが、それがターミナルなのかコードで書けばいいのか全くわからなかったので備忘録も兼ねてここに書き連ねておく。
#スクリーンショットを撮る
####はじめに
まずここで気をつけて欲しいことは、sshを通してやらないこと。（ここでかなり苦戦した）
環境構築の際にVagrantを使った人もいるかもしれないが、今回は使わないのでターミナル起動時の

```
(base) 自分のMacの名前:ユーザー名$ 
```
の状態になっていることを確認して欲しい。

####次にpyautoguiのインストール
ターミナルに

```
pip install pyautogui
```
を打ち込む。
しばらくするとインストールが完了するので終わったら今度はテキストソフトで

```
import pyautogui

screenshot = pyautogui.screenshot()
screenshot.save('保存名.png')
```
を打ち込んでscreenshot.pyで保存。（screenshotという名前でなくてもいい）
そしたらターミナルに戻り、

```
python screenshot.py
```
と打ち込む。これでスクリーンショットが保存される。

#注意点
screenshot.pyは自分のユーザーファイルに入れておく。
例えば、ターミナルに

```
(base) mba:yamadatarou$
```
と表示されているのならば、yamadatarouというフォルダに入れなければならない。
またスクリーンショットもそのフォルダに入っているので注意が必要。

#おわりに
研究でpythonを使うため初めて２日目の初心者だがwebを見て調べても何を言っているのかさっぱりわからなかったためこの記事を作成した。初心者なのでこの記事には至らぬ点も多いと思うが自分の備忘録兼同じ悩みを抱えているpython初心者の人の役に立てれば幸いだ。
それと勘違いして欲しくなのいのだが、参考記事の方が悪いのでなくPythonの理解が全くない自分が悪いということだけは覚えておいて欲しい。
＃参考
[【Python】スクリーンショットをとる](https://qiita.com/eito_2/items/1974f3cfa1f4d101378d)
OutSystemsのReactive Web App更新処理のバリデーション

ある日、Reactive Web Appでは、更新処理におけるバリデーションをどうすべきか？　という話をチーム内でしたのですが、2020/5時点では、この部分のドキュメントがまだ日本語になっていないようなので記録しておきます。

ドキュメント（英語）：
[Validate the fields of a form](https://success.outsystems.com/Documentation/11/Developing_an_Application/Design_UI/Forms/Validate_the_fields_of_a_form)

# サンプル
https://www.outsystems.com/forge/Component_Overview.aspx?ProjectId=7086
Validation Screenを参照してください。

# Reactive Web Appの更新時バリデーション実装方針
Reactive Web Appの場合、以下の方針で作るのが、実装コストが低く、アーキテクチャ設計ルールにも適合するのではないかと思います。

- 型チェック・必須チェックはInput Widgetが自動で行うものに委せる（Form Widgetを使ってUIやロジックの自動生成を利用する）
- EntityとEntityを操作するServer Actionは別のモジュールに分離する（[EntityはPublic=YesかつExpose Read Only=Yesとし、画面側から行う操作に対応するActionをPublic=Yesで作成する](https://qiita.com/jyunji_watanabe/items/e4a023919bdd54f9c5d8)）
- サーバ側で行う更新処理は1 Actionにまとめ、型・必須以外のチェックはこのActionで行う
- サーバ側のチェック結果はOutput Parameterで返し、Screen Actionで表示する

データの整合性を保つためにも、サーバ側のチェックは必須です。クライアント側は省く余地がありますが、型チェックと必須チェックだけであれば自動生成なのでわざわざ省く必要もないでしょう。

# 実装手順
1. 画面にForm Widgetを配置
2. Entity型の変数をドラッグ＆ドロップしてInput/Button Widgetを自動作成する
3. 必要に応じてUIを修正する
4. ButtonのOn Clickの(New Client Action)を選択してActionを作成。Built-in ValidationsはYesのままにしておく
5. Server側実装で作成するServer Actionを呼ぶ
6. Server Actionの結果をUIに反映する

# Input Widget
![qForm1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/fe6561ea-718b-ce3b-6360-7f3d87ce236a.png)

Mandatoryプロパティは、その項目への入力が必須かどうかを設定します。Save Buttonをクリックしたときに該当項目が未入力だと、Input Widgetの下に必須項目であることを示すメッセージを表示します。

Input Typeプロパティは入力方式を規定します。Numberなら数値のみ入力可能になります。Numberにした場合、整数の他に小数も入力可能。ただし、Variableプロパティで指定した変数の型がIntegerであれば、小数を入力するとエラーになります。これが、自動生成される型チェック。

# Button Widget
![qForm2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5efe8f7b-0f8f-d0a9-794c-16fadc3f9633.png)

Formに配置されたButton WidgetのEvents>On Click>Built-in Validations=Yesにしておくと、Buttonをクリックしたときに、上で設定したMandatoryとData Typeによるチェックがききます。

下の例でいうと、Text AttributeがMandatoryのチェック違反、Integer AttributeがData Typeによる型チェックの例です。
![qForm3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/232d961a-82c6-0a63-dc97-e153ceb73177.png)

上のように自動生成される必須・型チェックに失敗していると、対応するInput WidgetのValid=Falseとなり、ValidationMessageにはInput Widgetの下に赤字で表示するテキストが表示されます。
![qForm4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/22a35d36-ca06-b9e3-5f1e-1246418a2aa2.png)

# サーバ側で必須・型以外のチェックを行う
サーバ側で何らかのバリデーションを行い、発生したエラーをServer ActionのOutput Parameterとして返し、Client Actionでエラーを表示する処理を書きます。

## 単独の列の値に関するエラーの場合
特定の列に完全に紐付けられるエラーであれば、組み込みのバリデーションと同じようにInput Widgetの下に表示するのがいいでしょう。

Input WidgetのValidプロパティにFalse、ValidationMessageに表示したいエラーメッセージを設定してください。
![qForm5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/89e7d9b3-1e64-180c-511e-cb139cd38b9c.png)

## 特定の列に限定できないエラーの場合
こういうときは、通常のエラー表示と同じようにするしかないです。
Messageを使うか、Alert Widgetを使うといいのではないかと思います。
【学習メモ】Rails　Bootstrapの均等配置ができない原因について

【解決したいこと】
Railsアプリ制作する際に、Bootstrapの均等配置ができない問題を解決したい

【試していたこと】
下記のようなコードを打っていた。

```slim
.d-flex.align-center（flex要素と中央揃え）
  .col-4（３分割）
    = link_to 'A（文字列）', new_record_path（遷移先リンク）, class: 'btn btn-primary'
  .col-4
    = link_to 'B（文字列）', reminder_record_path, class: 'btn btn-primary'
  .col-4
    = link_to 'C（文字列）', report_record_path, class: 'btn btn-primary'
```

それまでの

【原因】
・デベロッパーツールからCSSを確認し、ブロック要素のみ中央揃えになっていたが、インライン要素が左揃えのまま（＝設定されていなかった）だったことが原因と判明。

【解決策】
・下記の通りに変更したら成功。

```slim
.d-flex
  .col-4.text-align: center
    = link_to '新規登録', new_record_path, class: 'btn btn-primary'
  .col-4.text-align: center
    = link_to 'リマインダー設定', reminder_record_path, class: 'btn btn-primary'
  .col-4.text-align: center
    = link_to 'レポートを見る', report_record_path, class: 'btn btn-primary'
```

【学び】
1.Bootstrapでレイアウトがうまく行っていなければ、検証ツールでレイアウトを確認すると見えてくる!
2.他の場合も同様の考え方で成功できるのでは？
[TypeScript] Nuxt.jsでプロジェクト共通で使う関数や変数を定義する場合はInjectを使う(サンプルコードつき)

## 筆者のバージョン

nuxt: 2.11.0

## 産業

- pluginsに適切な形でInjectを書いてnuxt.config.tsで参照する
- types/vue.d.tsにグローバル定義するものの型定義を書く
- `context.app.$someMethods` に入るので、asyncDataなりtemplateなりstoreなりで参照する(勝手にダラーがつくので気にしなくていい)

## pluginsにInject構文を記述する

第一引数のcontextは使わないのだが、ないとエラーが出てしまうので必要
引数が必要なメソッドの場合でもおｋ

```typescript:some.ts
import { Plugin } from '@nuxt/types'
import { useGlobalMethods } from '~/utils/nantoka.ts'

const plugin: Plugin = (context, inject) =>
  inject('getAuthority', useGlobalMethods)

export default plugin
```

## 型定義を書く

正しく型定義する

```typescript:types/vue.d.ts
import { APIClient } from './api'
import { GraphQLClient } from './graphql'
import { UseGlobalMethods } from '~/commons/interfaces/useGlobalMethods'

// vue.prototypeに入るやつっぽい
declare module 'vue/types/vue' {
  interface Vue {
    $api: APIClient
    $gql: GraphQLClient
    $useGlobalMethods: (
      argument1: string,
      argument2: number
    ) => boolean
  }
}

// contextに入るやつっぽい
declare module '@nuxt/types' {
  interface NuxtAppOptions {
    $api: APIClient
    $gql: GraphQLClient
  }
  interface Context {
    $api: APIClient
  }
}

// vuexに入るやつっぽい
declare module 'vuex/types/index' {
  interface Store<S> {
    $api: APIClient
  }
}

```

## 画面から呼ぶ

適当

contextのドット記法がだるいときはこれでもいける

`async asyncData({ app: { $useGlobalMethods } }) {`



```vue:pages/index.vue
<template>
 <p>{{ $constantsWords.SERVICE_NAME }}</p>
</template>


// いろいろ省略
<script lang="ts">
  async asyncData(context) {
    const isActive = context.app.$useGlobalMethods('aaa', 2)

    return {
      isButtonActive: isActive
    }
  }
</script>
```


## 参考リンク

[TypeScript のサポート — Vue.js](https://jp.vuejs.org/v2/guide/typescript.html#%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E5%9E%8B%E6%8B%A1%E5%BC%B5)
UILabelの三点リーダーの位置のバラツキの調査

※調査記事の為、誤りが含まれている可能性があります。

## はじめに
様々なアプリでUILabelが使われていますが、UILabelにおいて指定の領域を超えた文字数を保有する場合、領域外の文字は三点リーダー以降切り捨てられます。（見た目上は）
そこで、UILabelの三点リーダーの位置のバラつきが気になったので試してみました。

## 試した内容
下記で試した文字列の長さに対して、UILabelのwidthは短い長さに設定しました。  
  
|文字列|三点リーダーより前の文字列の文字数|三点リーダー|
|---|---|---|
|aaaaaaaaaaaaaaaaaa|2|![スクリーンショット 2020-05-21 22.47.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559964/46f8bd00-c57d-c195-6ce4-67ed03bba24a.png) (下)|
|aaaaaaaaaaaaaaaaaaあ|2|![スクリーンショット 2020-05-21 22.47.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559964/46f8bd00-c57d-c195-6ce4-67ed03bba24a.png) (下)|
|あaaaaaaaaaaaaaaa|2|![スクリーンショット 2020-05-21 22.47.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559964/46f8bd00-c57d-c195-6ce4-67ed03bba24a.png) (下)|
|aaaaaaaaaaaaaaaaあaaaaaaaa|2|![スクリーンショット 2020-05-21 22.47.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559964/46f8bd00-c57d-c195-6ce4-67ed03bba24a.png) (下)|
|あaああああああああああ|1|![スクリーンショット 2020-05-21 22.47.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559964/46f8bd00-c57d-c195-6ce4-67ed03bba24a.png) (下)|
|あああああああああ|1|![スクリーンショット 2020-05-21 22.46.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559964/4f1e87d9-fda7-c0b7-a3d2-f016bb913b2d.png) (中)|
|ああaa|1|![スクリーンショット 2020-05-21 22.46.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559964/4f1e87d9-fda7-c0b7-a3d2-f016bb913b2d.png) (中)|
  
## 仮説  
文字列の末尾がマルチバイト文字か否かで三点リーダーの位置が変わると考えていました。
しかし、上記の結果を見る限りでは「三点リーダーで切り捨てられる最初の文字」がマルチバイト文字か否かで三点リーダーの位置が変わります。
    
- シングルバイト文字（アルファベットや数字など）：下  
- マルチバイト文字（ひらがなや漢字など）：中  
  
## 最後に  
色々なアプリを覗いてみると、三点リーダーの位置がバラバラなことが分かるので見てみると良いかも知れません。
ページのURLごとにタブアイコンの色を変える（React）

###ページのURLを取得する

```
props.history.location.pathname;
```

:point_up_tone1:Reactのhistoryにはページ遷移の履歴が入っている
上記のようにReactRouterのpropsからhistoryを取ってくることができる。

###startsWith / includesWith
ある文字列が含まれている時はtrueを返す。

```
①const pagePath = this.props.history.location.pathname;
②const isActive = pagePath.startsWith(***)
```
①今いるページのURLをpagePathに渡す。
②pagePathに***が含まれていればtrueを返す

###タブアイコンの色が変わるようにする

```index.js
class FooterTabItem extends React.Component {
  render() {
    const pagePath = this.props.history.location.pathname;
    const isActive = pagePath.startsWith(this.props.link)
    //今いるページのURLにthis.pros.link(Footer.jsの変数linkで定義されてるもの)
　　//が含まれているか？
    const Icon = this.props.icon
　　//Footer.jsのiconから取得
    return (
      <Link to={this.props.link}>
        <Icon className={isActive ? styles.activeTab : styles.tab} />
        //isActiveがtrueだったらstyles.activeTab、falseだったらstyles.tabになる
　　　　　//→style.module.scssの記載している色になる
      </Link>
    )
  }
}
export default withRouter(FooterTabItem); 
```

```Footer.js
import FooterTabItem from './index'

<FooterTabItem icon={なんかのアイコン} link={routes.home()} />
```

```style.module.scss
.activeTab {
  color: red;
}

.tab {
  color: green;
} 
```
[git github]初めて使用する手順　一人でpush

##ゲームで言うとgithubはセーブ場所
さーて環境構築したし　rails newして何か作成していくかー！　の前に
作成したものを保存する、いわゆるセーブする所が要りますよねっ？


私が一番初めに覚えた、githubの使い方さらっと記録します。

#難しく考えずに手順はこれだけ
#####１、まず、セーブしたいディレクトリに移動。

  ```$ cd ディレクトリ名```


#####２、　そのディレクトリの中で
  ```$ git init```

　git initは新規作成の時のみ！



#####３、　ディレクトリの中身を追加
  ```$ git add *```

 　*印は、今からディレクトリの中身全部入れます！って感じ。
　（その都度、追加したものだけ入れたいときは、```$ git add -A```が良さげ。）



#####４、　コミットする（今から追加するものはこんなものですよ〜っていうコメント）
  ```$ git commit -m "コメント" ```

  コメント内容はできるだけ英語で記述できるようになった方がいい気がする。
　(```$ git commit -m "[add] user model"```みたいな感じでパッとわかりやすく。)


#####５、 originという名でリポジトリURL登録
```$ git remote add origin　'リポジトリURL'```

　githubのHPで作成した新しいリポジトリのURLを貼ります。
　ちなみに私ここで初めてつまずいたんですけど、'リポジトリURL'の　'　'　←　これっ！　笑

　いらないですよ。　URLは、そのままコピペして貼り付けてください。

　どこの記事でもよくいろんな方がわかりやすく囲って下さってるんですけど
　これで１日中macと格闘しました。。。

　あとoriginって何ってなるけど気にせず使ってたら慣れます。

#####６、　最後に　push！

```$ git push origin master```

 ゆるく言いますとpushで、githubにセーブしました。

これでgithubのリポジトリを確認したら入ってると思います。


もっと詳しく勉強していくならば、masterの部分も変わりますが
最初は一人で使うと思うので考えずバンバンpushして草を生やしていきましょー！！

#####２回目以降　同じリポジトリでしたら、ひたすら３・４・６の繰り返しですね。

###基本的に最初はこれだけ

まだ私もgithubについて知らない事だらけですが
######セーブできるし、内容見れるし、草生やせるし、まだまだ機能がいっぱいのgithub様。

少しづつ慣れていきましょ〜！
Rails5.2系にwebpackerを導入した途端元から実装してあったログアウト機能がno route matches [get] "/logout"エラーで動かなくなった

##はじめに
投稿系のアプリケーションを作成中、Rails5.2にwebpackerを導入した途端、元から実装してあったログアウト機能が動作しなくなりました。
```no route matches [get] "/logout"```エラーが出てdeleteリクエストを送信できなくなってしまったので、これを解決します。

##環境
Ruby 2.6.5
Rails 5.2.4.2
webpacker 5.1.1

##エラー発生地点

webpackerビルド後に、application.html.slimにwebpackerのスクリプトタグを読み込んだ瞬間から。

```ruby:app/views/layouts/application.html.slim
head
    .
    .
    .
    - = javascript_include_tag 'application','data-turbolinks-track': 'reload'
    + = javascript_pack_tag 'application'
    .
    .
    .
```
<br>

##解決策

1.まずはyarnのパッケージファイルに```rails-ujs```を追加します。そしてpackage.jsonにこれが追加されていることを確認します。

```
$ yarn add rails-ujs
```

```ruby:package.json
{
  "name": ,
  "dependencies": {
    "@rails/webpacker": "5.1.1", 
    "rails-ujs": "^5.2.4-3",
  },
}
```
<br>

2.app/javascript/packsディレクトリ配下に```rails-ujs.js```ファイルを作成し、下記の記述を追加します。

```ruby:app/javascript/packs/rails-ujs.js
import Rails from 'rails-ujs';
Rails.start();
```
<br>

3.app/javascript/packs/application.jsファイルに、rails-ujs.jsファイルを読み込ませます。

```ruby:app/javascript/packs/application.js
require("./rails-ujs.js");
```
<br>
4.app/views/layouts/application.html.slimファイルに、webpackerスクリプトを記述します。

```ruby:app/views/layouts/application.html.slim
head
    .
    .
    .
    = javascript_pack_tag 'application'
    .
    .
    .
```

以上で、DELETEリクエストを受けてくれるようなったかと思います。

###何故これで動作するのか
色々調べた結果、辻褄を合わせただけのため断言はできませんが、こうだろうみたいな予想を立ててみました。

もし間違っていたら、ご指摘して頂けるととてもありがたいです！

まず前提として、デフォルトの状態ではHTMLはGET,POSTのリクエストを送信することしかできません（なのでログインなどは通常通り行えます）

しかしRailsにてDELETE,PATCHなどのRESTful APIを発行する場合は、JavaScriptに処理を任せているため```gem rails-ujs```もしくは```gem jquery-rails```を用いています。

Rails5.1以降ではJavaScriptの統括ファイルにこの```rails-ujsがデフォルトで読み込まれています```（下記ファイルを参照）。

なので我々は特に気にしなくとも、ただRails側でmethod: :deleteなどのオプションを記述すれば、あとはJavaScriptが勝手に処理してくれるため、HTMLからDELETEリクエストを送信することができるようになっています。

ちなみにjquery-ujsはRails5.1以降サポートが廃止されています（[Railsガイド](https://railsguides.jp/working_with_javascript_in_rails.html)より。）


```ruby:app/assets/javascript/application.js
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require_tree .
```
<br>
しかしwebpackerを導入すると、デフォルトの状態ではrails-ujsがそもそも導入されていないので、サポートを受けることができません。

なのでrails-ujsを導入し、packs/application.jsファイルに新たにrails-ujs読み込みさせてあげなければ、RESTfulなAPIの処理を使用できないのは当然だったのかなと思いました。


##参考
　http://docs.komagata.org/5456
　https://www.inodev.jp/entry/2019/12/03/234210
gitでauthorを間違えてコミットしちゃって手遅れなとき

## 要旨
誤った名前でコミットしたとき、名前（過去のすべてのAuthor)を変更したいときは、
ターミナルで以下のように指定する。

    $  git filter-branch -f --env-filter "GIT_AUTHOR_NAME='ajimarusyokudo'; GIT_AUTHOR_EMAIL='valid_email@example.com'; GIT_COMMITTER_NAME='ajimarusyokudo'; GIT_COMMITTER_EMAIL='valid_email@example.com';" HEAD
## 実例
誤ってMona Lisaとして挙げてしまったとき（ほんとはMilk Boyなのに)の修正
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617712/df454c31-7474-0657-a969-dc9c6483e959.png)

以下をターミナルで叩く

    $  git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Milk Boy'; GIT_AUTHOR_EMAIL='milkboy@example.com'; GIT_COMMITTER_NAME='Milk Boy'; GIT_COMMITTER_EMAIL='milkboy@example.com';" HEAD

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617712/f93ab98c-f695-b5db-dbad-39ba30e5898a.png)


### 注意
変更がコミットされていないと怒られるので、.gitnoreに追加するか、退避させることが必要
（怒られるときとそうでないときがある、原因不明）
### 参考
https://qiita.com/sea_mountain/items/d70216a5bc16a88ed932
Jiraの履歴を簡単に復元できるよう記法をMarkdownに変換するwebツールを作った

https://jira2md.web.app/

# 背景

Jiraの説明を複数人が編集して気づかないうちにコンフリクト、苦労して書いた説明が消えていたのが辛かったので簡単に戻せるようJira記法からMarkdownに変換するwebツールを作りました。
Jira絶対に許さないぞ！

# 使い方

## 変更履歴をアクティビティから確認

<img width="846" alt="スクリーンショット 2020-05-21 22.24.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218/7b269210-71d6-ee85-8777-21ab26a5232a.png">


## 開発者ツールで変更前のテキストをコピー  

改行含むテキストを取得できます
<img width="910" alt="スクリーンショット 2020-05-21 22.26.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218/249001dc-c416-f74a-124c-33b0243a83e7.png">


## ツールに貼り付けて変換完了
<img width="1212" alt="スクリーンショット 2020-05-21 22.30.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218/d8605a72-e702-5025-a69b-851181591625.png">


# 使った技術など

- Nuxt
- Firebase Hosting
- Jira記法をMDに変換するnpm [jira2md](https://www.npmjs.com/package/jira2md)

Nuxtの設定とnpmでJira記法をMDに変換をしただけなので2時間でリリースまでいけました✌️
OGPとか何もやっていないので少しは整えたい。。。

---

※こちらの記事は自ブログからの転載です

https://akinov.hatenablog.com/entry/2020/05/21/223349
TensorFlow 2.0 で tf.keras.utils.plot_model() を使った時 AttributeError: 'dict' object has no attribute 'name' になるエラーとその解決法

# 概要

`tf.keras.utils.plot_model()` 使用時に以下のエラーが発生する。

```
AttributeError: 'dict' object has no attribute 'name'
```

マルチモデルで発生しがちらしい。以前はこんなエラー出なかったはず。
自分は GAN の Generator, Discriminator, Generator+Discriminator(combined) の三つをプロットしようとしたところ、最初の二つはエラーが出なかったが、三つ目でエラーが出た(なんで？)

# 修正方法

通常、以下のようになっているはず。

```python
tf.keras.utils.plot_model(model, to_file='model_img.png', show_shapes=True)
```

これを、以下のようにリスト内包表記で一気に名前をつけ直すことで治る。

```python
model._layers = [
  layer for layer in model._layers if isinstance(layer, tf.keras.layers.Layer)
]
tf.keras.utils.plot_model(model)
```

# 参考

- AttributeError: 'dict' object has no attribute 'name' #38988: https://github.com/tensorflow/tensorflow/issues/38988
【Flutter Web】TypeError: dart.global.firebase.firestore is not a function （Flutter WebでFirestoreにアクセスできない）

#エラー内容
Flutter WebにFirestoreを使ってデータ保存機能を追加しようとしたところ、下記のエラーが発生しました。

```Console
TypeError: dart.global.firebase.firestore is not a function
    at /* --- 省略 --- */
```

#解決方法
web/index.htmlファイルのbodyタグ内に以下を記述。
※本記事執筆時ではver7.14.4ですが、ここは各自最新verを記述してください。

```index.html
<script src="https://www.gstatic.com/firebasejs/7.14.4/firebase-firestore.js"></script>
```
記述できたらもう一度ビルドし直すと反映されます。

[参考記事](https://stackoverflow.com/questions/57242045/flutter-web-tried-to-call-a-non-function-such-as-null-dart-global-firebase-s)
【PHP8】PHP Deprecated:  PHP Startup: Use of mbstring.internal_encoding is deprecated

> PHP 8 で、`mbstring` を有効にすると `mbstring.internal_encoding is deprecated` と表示される。
>
> ```shell-session
> $ docker run --rm -it keinos/php8-jit /bin/sh
> / $ php -v
> PHP Deprecated:  PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
> 
> Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
> PHP 8.0.0-dev (cli) (built: May 21 2020 15:58:54) ( NTS )
> Copyright (c) The PHP Group
> Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
>     with Zend OPcache v8.0.0-dev, Copyright (c), by Zend Technologies
> ```

## TL; DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

1. `mbstring.internal_encoding` は PHP 8.0.0 から削除されました。
2. `php.ini` を修正して回避します。
    - `mbstring.internal_encoding` を設定している `php.ini` ファイルを探し、`mbstring.internal_encoding` の項目を削除（or `;` でコメントアウト）します。
3. 具体的な修正箇所は以下のとおり：

    ```diff:/usr/local/etc/php/conf.d/docker-php-enable-mb.ini
    ; Extended PHP.ini file to enable mbstring.
    ; =========================================
    ; Place this file under /usr/local/etc/php/conf.d/
    
    zend.multibyte = On
    zend.script_encoding = UTF-8
    mbstring.language = Japanese
    - mbstring.internal_encoding = UTF-8
    + ;mbstring.internal_encoding = UTF-8
    ```

## TS; DR

2020 年の 6 月ごろの話しです。JIT を有効にした PHP8-dev の Docker イメージで遊んでいました。

- [【PHP8】JIT=on の Docker を触ってみたい人。爆速だったよ。](https://qiita.com/KEINOS/items/ca0f130c48e407fc5790) @ Qiita 

すると、ある時から `PHP Deprecated:  PHP Startup: Use of mbstring.internal_encoding is deprecated` エラーが出るようになりました。

「`mbstring.internal_encoding` は廃止になりました」とのこと。調べてみたら、もともと `php.ini` の `mbstring.internal_encoding` 設定は PHP 5.6.0 以降から非推奨でした。

どうやら、`master` ブランチ（PHP 8.0.0-dev）のコミット [3ca08ee](https://github.com/php/php-src/commit/3ca08ee764a372f65a2469ca72270aef32249a5b)（2020/03/31）で削除され `Deprecated` となり、このまま差し戻されなければ PHP 8.0.0 の正式リリースで削除され~~ます~~ました。

- [https://github.com/php/php-src/commit/3ca08ee](https://github.com/php/php-src/commit/3ca08ee764a372f65a2469ca72270aef32249a5b#diff-5c428faebf391d7ac9810aae7799e2daR23-R25) @ GitHub

おそらく、`mbstring.internal_encoding` 以外の非推奨設定も PHP 8.0.0 を機に削除されるかもしれません。

### 2021/03/24 現在、非推奨とされる `mbstring` の設定項目。

| 名前 | 変更履歴 | 変更予定 |
|:--|:--|:--|
| mbstring.http_input | PHP 5.6.0 で非推奨 ||
| mbstring.http_output | PHP 5.6.0 で非推奨 ||
| mbstring.internal_encoding | PHP 5.6.0 で非推奨 |PHP 8.0.0 以降で削除予定（[3ca08ee](https://github.com/php/php-src/commit/3ca08ee764a372f65a2469ca72270aef32249a5b)では削除済み）|
| mbstring.func_overload | PHP 7.2.0 で非推奨|PHP 8.0.0 で削除されました。|

- https://www.php.net/manual/ja/mbstring.configuration.php

[2020/06/23 に PHP8-alpha1 がリリースされた](https://github.com/php/php-src/releases/tag/php-8.0.0alpha1)ので、いよいよリリース間近。たのしみです。
Mac にhomebrew caskでfira-codeフォントをインストールする

# インストールメモ

MacのVisual Studio Codeで合字（リガチャ）フォントを使用したくて、Windowsでも使用している`fira-code`をインストールしようとしたのだが、ググって出てくる記事が古いのが多かったので、自分用メモ  

## homebrewのバージョン
* 2.2.17

## 記事でよくみたコマンド
```
brew tap caskroom/fonts
brew cask install font-fira-code
```
このコマンドだと以下のエラーが出てしまうので、

```
Error: caskroom/fonts was moved. Tap homebrew/cask-fonts instead.
```

## 正しくは
```
brew tap homebrew/cask-fonts
brew cask install font-fira-code
```

これにてインストール完了！
ってここまで書いて、ちゃんとエラーメッセージみれば答え書いてあるじゃん。。。
DockerHubでデバッグ環境構築(Ubuntu,Rust,Docker,lldb)

# 追記2020/06/20
Rustは公式でDockerイメージを公表しているので、そちらを参考にされる方がよいです。

# 目的
配布可能なRustの実行・デバッグ環境が必要になったのでDockerで作りました。
dockerさえインストールしてあれば１行で環境構築が終わるはず。


# TLTR
dockerhubに公開したので、以下のコマンドを実行すれば実行環境が手に入るはず！

```
docker pull padawane15/ubuntu_rust_exa
```
Ubuntu 20.04 LTS
MacOS 10.15.4 Catalina
Docker version 19.03.8





# docker環境を自分で構築する方法
上記の環境構築ではなく、自分で作りたい場合には以下のような手順を踏みます。


## Ubuntu(イメージ？)をダウンロードして、デバッグのためのコンテナを作成する
この際、ubuntu:[バージョン]とすることで、バージョンを指定できる。指定しないと最新がインストールされる。

```zsh

docker pull utuntu

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined -it --name ubuntu_rust_exa ubuntu  /bin/bash

```



## 必要なパッケージをインストールする

[dockerコンテナの中]

* パッケージインストーラ

```
apt-get update -y && apt-get upgrade -y
apt-get install -y build-essential curl vim llvm lldb make wget git

```

* もしかしたら必要なもの(要求されれば入れる)

```
 apt-get install -y tzdata build-essential curl git libbz2-dev libffi-dev liblzma-dev libncurses5-dev libncursesw5-dev libpq-dev libreadline-dev libsqlite3-dev libssl-dev llvm make tk-dev unzip vim wget xz-utils zlib1g-dev
```

* rustのインストールとパスの設定

```
curl https://sh.rustup.rs -sSf | sh
source $HOME/.cargo/env
source .bashrc
rustup component add rust-src
```

* 読みたいパッケージ`exa`を用意する

ソースコードからビルドしたいので、githubのソースコードをダウンロードする

```
git clone https://github.com/ogham/exa.git
```

* ビルドする

`cargo build`でデバッグビルドになる(らしい？)
最適化は`--release`をつけてビルドする。

```
cd exa
cargo build --release
cargo run --release
make install
```
* その他
これでもいいみたい。

```
cargo install --git https://github.com/ogham/exa

```


## エラーになる原因 `docker run オプション`の注意点

`error: process launch failed: 'A' packet returned an error: 8`

dockerの内部からlldbやgdbの機能を使うと出てくる。

今回オプションに付けたもので解決できる。

解決方法の参考文献 https://forums.swift.org/t/debugging-using-lldb/18046/2



## dockerの停止、再開
dockerは仮想サーバーに近い。`exit`で抜けても動いている。

* 停止したdockerコンテナに対してスタートして入る

```
docker start ubuntu_rust_exa
docker exec -it ubuntu_rust_exa /bin/bash
```

* dockerの中から抜ける

```
exit
```

* 動いているdockerコンテナの中に入る

```
docker attach ubuntu_rust_exa
```

* dockerの状態を確認する

```
docker image ls 
docker container ls
```

* 実行中のプロセスを確認する

```
docker ps -a
```

* コンテナの削除

```
docker rm [containerid]
```

* イメージの削除

```
docker rmi [imageid]
```

* 全コンテナ停止

```
docker stop $(docker ps -qa)
```

## dockerを公開する

* コンテナIDの確認

```
docker container ls
```

* dockerhubにコミットする

DockerHubに自分のアカウントを作成する。
コミットが成功したら、DockerHubの自分のアカウントページを見てみましょう。そこにさっき作ったリポジトリが追加されていたら成功です。

```
docker commit -m "first commit " -a "username" [containerid] [username]/[containername]
```






# 参考文献
https://github.com/ogham/exa
https://www.fabrica-com.co.jp/techblog/technology/994/
https://qiita.com/kiii142/items/cad9ac53a78c401545a2
https://www.slideshare.net/ShinichiMakino1/exa-84358376
https://blog.codecamp.jp/programming-docker-hub
https://qiita.com/legokichi/items/e2f807f70316a916f4be
https://forums.swift.org/t/debugging-using-lldb/18046/2
今日の授業まとめ

# ムービーをみて予習する
言い訳ですが、ここ二日ほど仕事が忙しくムービーを
見る気力もなかったため、駆け足で配布されたムービーを当日見ました。
##### 感想
ね…眠い…。梅雨の時期は雨がシトシト。
布団の温度がちょうどよく、一周を集中してみた後は
お昼寝タイムへ突入してしいました。
子供たちが家におしよせマスクしなさいと怒ると言う
現実的な夢まで見る始末…。
##### 結果
授業についていける訳でもなく、何も理解していないため講師陣の力を借りながら
なんとか名前付きパラメーターを使えた…ような気がします。

#### 今、全然眠くないよ！
と、言う訳でsinatraの大きな山だけは確認できたので
再度いただいたムービーを見返し
課題をこれからやってみようと思います！

美味しいコーヒーでも入れてこよ♪
個人アプリの制作日記３

#今日の実装
##viewの作成　tewwt #index
見た目を整え、教えてほしい問題の連絡記事を閲覧できるようにした。
７割は終わった。tewwt indexをroot_pathにあて、１ページですべての種類の記事を見られるようになった。１ページにまとめることでstu-suppo（アプリケーション）がどんなサイトなのかひと目で見られうようにするのが狙いだ。

##users_controller #edit　#updeta サインアウト
deviseにあるもとのカラム以外にname,image,introduction,subjectカラムを追加したのでfrom-forを用いでデーターベースに更新できるようにした。

苦戦したこと
railsのversionが5.0なのにform withメソッドを使うことを使おうとしていた。
後でわかったことだがform withメソッドはrailsのversionが5.0は非対応。

#tewwt index　で未実装なもの
SCSSでおしゃれなレイアウトにする
動画の埋め込み
インクリメンタルサーチ

#まとめ
今日はだいぶ手間取ってしまったから、朝にしっかりタスクを分けて計画的進む必要あり。
また、睡眠時間をしっかり確保し体調を整える。
OnBeginDrag内でSerializeFieldを取得できない

つい最近Unityでゲーム制作を始めたのですが、標記の通りで困っています。
Unityの画面からオブジェクトを設定した状態で
OnBeginDragのコード上でDebug.Log(オブジェクト名)をしてもnullと表示されてしまいます。
これはUnityの仕様でしょうか？
Reactのルーティング　メモ

Reactでページを追加する手順

####1.routes/index.jsにルーティングの追加

```
export default {
  top: () => '/',
  signIn: () => '/sign_in',
  signUp: () => '/sign_up',
}
```

####2.containers/以下にページようファイルを作成

####3.routes/Router.jsにページをインポートしてルーティング作成

```
import React from 'react'
import { ConnectedRouter } from 'connected-react-router'
import { Route, Switch } from 'react-router-dom'
import routes from '../routes'
import requireAuth from '../components/requireAuth'
import { withGuestLayout, withMemberLayout } from '../components/Layouts/RouteWithLayout'
import TopPage from '../containers/TopPage'
import SignInPage from '../containers/SignInPage'
import SignUpPage from '../containers/SignUpPage'

export default ({ history }) => (
  <ConnectedRouter history={history}>
    <Switch>
      <Route exact path={routes.top()} render={withGuestLayout(TopPage)} />
      <Route exact path={routes.signIn()} render={withGuestLayout(SignInPage)} />
      <Route exact path={routes.signUp()} render={withGuestLayout(SignUpPage)} />
    </Switch>
  </ConnectedRouter>
)
```
SpreadsheetにGASを導入しレポートを楽々に

ウェブディレクターとしてはあるあるの話なんですが、解析ツール上のデータを何かしらんのレポートを作って上司への報告や関係各所への共有は日常茶飯事のように求められます。
心のなかでは、自分で見ればいいのにと叫びたいところですが、そうもいかず、きちんと報告・共有することこそが社会人としての見せ所です。
しかし、地味なコピペ作業こそ、人生の無駄かと思います。
そこで、なにかと自動化にできれば万々歳です。
GAの場合、APIとかを活用してSpreadsheetへの連携はなんとか実現できるものの、しかし、問題児のAdobe Analyticsはなかなかしんどいです。
一応、重要な情報としては扱いであり、サードパーティのツールを使うのにヒヤヒヤします。
それでもやらねばと思い、下記手順を考えました。

1. Adobe Analyticsのレポートビルダーで必要なレポートを作成
2. そのレポートを毎日Gsuiteのメールに配信する
3. GASで配信されたファイルをハイジャックする
4. ハイジャックしたエクセルファイルを既存のスプレッドシートへデータを移す

少々手間がかかりますが、これで人生に余分な時間を節約できると考えるとなにかとうれしいです。
下記、ソースコードを紹介します。

```report.js
function getReport(){

  // 各定義
  var now = new Date();
  var yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate());
  var thisDate = Utilities.formatDate(yesterday,"JST","yyyy/M/d");
  var Folder_ID = 'xxxxxxxxxxxxxx'; //保存するフォルダ
  var Search_Term = 'subject:(xxxxxxxxx.xlsx)　after:' + thisDate; //該当条件のスレッドを検索、ファイル名を入力
  var myFolder = DriveApp.getFolderById(Folder_ID); //フォルダを取得
  var myThreads = GmailApp.search(Search_Term, 0, 30); //条件にマッチしたスレッドを検索して取得
  var myMessages = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得し二次元配列で格納

  //　メールから最新版のXLSファイルを取得・保存
  for(var i in myMessages){
    for(var j in myMessages[i]){
      var attachments = myMessages[i][j].getAttachments(); //添付ファイルを取得
        myFolder.createFile(attachments[3]); //ドライブに添付ファイルを保存
    }
  }

  //　取得したXLSファイルをスプレッドシートへ変換
  var targetXLS = myFolder.getFilesByName('xxxxxxxxx.xlsx').next(); //臨時XLSファイルを定義
  var xlsID = targetXLS.getId(); //臨時XLSのID取得
  var filename = "xxxxxxxx";　 //書き出すスプレッドシートファイル名を定義
  var res = Drive.Files.insert({
    "mimeType": "application/vnd.google-apps.spreadsheet",
    "parents": [{id: Folder_ID}],
    "title": filename
  }, DriveApp.getFileById(xlsID).getBlob()); //XLSからスプレッドシートへ変換
  myFolder.removeFile(targetXLS);　//臨時XLSファイルを削除

  // 抽出用ファイルとその各シートを定義
  var thisFile = SpreadsheetApp.openById('xxxxxxxxxxxx'); //フォルダ名を入力
  var thisDaily = thisFile.getSheetByName("daily");
  var thisWeekly = thisFile.getSheetByName("weekly");
  var thisMonthly = thisFile.getSheetByName("monthly");

  // 更新されるファイルとその各シートを定義
  // 一応日次、週次、月次のシートがあるとして
  var newFile = myFolder.getFilesByName('xxxxxxxxx').next(); //ファイル名を指定
  var targetID = newFile.getId();
  var targetFile = SpreadsheetApp.openById(targetID);
  var targetDaily = targetFile.getSheetByName("daily");
  var targetWeekly = targetFile.getSheetByName("weekly");
  var targetMonthly = targetFile.getSheetByName("monthly");

  // ループで各数値を上書き
  // データの範囲を各々に合わせて修正していただくように
  for (var x=3; x<=8; x++) {
    for (var y=4; y<=10; y++) {
      thisDaily.getRange(y, x).setValue(targetDaily.getRange(y, x).getValue());
    }
  }
  for (var x=3; x<=8; x++) {
    for (var y=4; y<=7; y++) {
      thisWeekly.getRange(y, x).setValue(targetWeekly.getRange(y, x).getValue());
    }
  }
  for (var x=3; x<=8; x++) {
    for (var y=4; y<=16; y++) {
      thisMonthly.getRange(y, x).setValue(targetMonthly.getRange(y, x).getValue());
    }
  }
  //臨時スプレッドシートを削除
  var oldFile = myFolder.getFilesByName('xxxxxxx').next(); //旧ファイル名からファイルを検索
  myFolder.removeFile(oldFile);　//旧ファイルを削除
}


```
Djangoの開発環境でiframeが表示されない（127.0.0.1から接続を拒否される）

DjangoのTemplatesに置いたHTMLファイル内に\<iframe>を利用してPDF等を表示させようとすると表示がされない。
（Chromeからは127.0.0.1 refused to connect.と言われる。）

これは[clickjacking](https://docs.djangoproject.com/ja/2.1/ref/clickjacking/)に引っかかっているためと考えられるので、settings.pyに以下の設定をすることで解決できた。

`X_FRAME_OPTIONS = 'ALLOW'`

※前提としてsettings.pyに以下Middlewareが入っていること
MIDDLEWARE = [
　　　　　    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Macのeclipseでsysoutしたい。

〜Javaプログラマにはお馴染みのsysout〜

入社研修で勉強して以来、多分2年ぶりくらいにJavaの勉強を始めました。

最近全くコード書いてないし、本当に基礎の基礎から始めようと意気込んで、さあSystem.out.println...と入力して思い出しました。

「確かこれめっちゃ早く入力するコマンドあったはず・・・」

調べると、syso + controlキー　＋　spaceキーでできるとあるがうんともすんとも言わず。

どうやらMac版のeclipseだと違うみたい。

というわけで、私みたいな超初心者の為に残しておこうと思います。

1. 画面上部の設定（歯車アイコン）をクリック
2. 左枠の「一般」　→　キーと進む
3. 「コンテンツ・アシスト」を選択（アシストの後に何も書いていないやつ）
4. バインディングで好きなキーの組み合わせを入力
（どうもcontrol + spaceとかはできないみたい。私はcontrol + Z にしました）

以上で、簡単にsysout　→　System.out.printlnの入力ができるようになりました！（やったね！）
初心者の単語No3(パッケージ、import、修飾子)

## パッケージ宣言
クラスやインターフェースをグループ化するための仕組み。
パッケージを利用することで同名のクラスも使用可能になる。

例：Java
1.package aaa;
2.import java.io.*;
3.public class test{}
のように順番がある。
パッケージ⇒インポート⇒クラス

各順番は上記のように、パッケージから記述します。

## import命令
パッケージ名を含めたクラス名の事を完全修飾名と言う。
パッケージを利用することで、ソース内のコードでパッケージを省略して
記述できるようになる。

**例：Java**
import java.util.Calendar;
上記のimportを使用していると、Calendarから使用できる。
importを使用しない場合は、
java.util.Calendar.MONTHのように長い命令文の記述が必要になる。

**＊但し例外がある。(java.langパッケージ)**
例えば、Stringを例として
Stringは「java.lang」の中に含まれるクラスで、プログラム中では
「java.lang.String str = new java.lang.String("Test");」としないで
「String str = new String("Test");」と記述できる。

#### 補足
インポートには使用しない方が良いとされている記述がある。
例：先ほどのjava.langを例に！
import java.lang.*;
上記の記述方法を、オンデマンドインポートと呼ばれている。
java.langのパッケージ全体をインポートとして使用できるが、
クラスを明確にするという意味で使用を避ける！
(Calendarで使用しているinportの仕方は単一型インポートとも言う)

### static import命令
クラスのメンバーで、クラス名を指定せずに呼び出せる。
例：円周率を求めるにはMath.PIを使用。
static importを用いればPIだけで参照できる。
(同様にabsやtoRadians、toDegressも直接使用可能。)

## 修飾子

### クラス修飾子
final・abstract・publicがある。

### クラス

| アクセス修飾子 | 意味 |
|--------|------|
| final | 拡張継承を禁止する。（継承可能） |
| abstract | インスタンス化できない。抽象クラス |
| public | どこでもアクセス可能 |

### コンストラクタ

| アクセス修飾子 | 意味 |
|--------|------|
| public | どこでもアクセス可能なコンストラクタ |
| protected | 同一のクラス・パッケージ・サブクラスからＯＫ |
| private | 同一クラスからのみＯＫ |

### メソッド

| アクセス修飾子 | 意味 |
|--------|------|
| public | どこでもアクセス可能なコンストラクタ |
| protected | 同一のクラス・パッケージ・サブクラスからＯＫ |
| private | 同一クラスからのみＯＫ |
| abstract | 抽象メソッド。実装はしない |
| final | オーバーライド不可 |
| static | 静的メソッド |
| native | Java言語以外のモジュール内のメソッドの実装 |
| synchronized | ロックを取得、同時アクセス× |

### 変数

| アクセス修飾子 | 意味 |
|--------|------|
| public | どこでもアクセス可能なコンストラクタ |
| protected | 同一のクラス・パッケージ・サブクラスからＯＫ |
| private | 同一クラスからのみＯＫ |
| final | 値の変更ができない変数 |
| static | 静的変数 |
| transient | シリアライズの対象から除外 |

### アクセス修飾子
|  | public | protected | 省略 | private |
|----|:----:|:----:|:----:|:----:|
| 同一クラス | 〇 | 〇 | 〇 | 〇 |
| 同一パッケージ | 〇 | 〇 | 〇 | × |
| サブクラス | 〇 | 〇 | × | × |
| 無関係 | 〇 | × | × | × |
Apache Airflowのwait_for_downstreamに関する挙動（を自分なりに考えた）

[Apache Airflow](https://airflow.apache.org/) で自分なりに試行錯誤したことを忘れないように記録する。

**ご指摘歓迎**

# 環境

AirflowはVersion:1.10.10
OSはCentOS Linux release 8.1.1911
DBは組み込みのSQLite

# wait_for_downstreamのTrue/Falseに関する動作確認

## 事の発端

チュートリアルを参考にして、タスクrun_this_firstとrun_this_lastを実行させることを試したいと考えた。
実行したところ、脳内での結果と実際の結果が異なった。

```python:試したコード

# -*- coding: utf-8 -*-

from builtins import range
from datetime import timedelta

from airflow.models import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.dummy_operator import DummyOperator
from airflow.utils.dates import days_ago

args = {
    'owner': 'Airflow',
    'start_date': days_ago(2),
    'depends_on_past': True,
}

dag = DAG(
    dag_id='bash_operator4',
    default_args=args,
    schedule_interval=timedelta(days=1),
    catchup=False,
)

run_this_first = BashOperator(
    task_id='run_this_first',
    bash_command='echo 0 >> /tmp/hogehoge ',
    dag=dag,
)

run_this_last = BashOperator(
    task_id='run_this_last',
    bash_command='echo 1 >> /tmp/hogehoge ',
    dag=dag,
)

run_this_first >> run_this_last
```

```command:実行したコマンド
airflow backfill bash_operator4 -s 2015-06-1 -e 2015-06-03
```

DAGの処理が3回実行されるはず、つまり結果は以下ではないか。

```text:コマンド実行前の脳内での/tmp/hogehoge出力
0
1
0
1
0
1
```

結果は以下の通り、DAG内の処理はrun_this_first >> run_this_lastの順になっているが3回分の処理については
1回目、2回目、3回目の順となっていない。

```text:実際の/tmp/hogehoge出力
0
0
1
0
1
1
```

## 調査

Airflowのドキュメントを調査した。
結果、[こちら](https://airflow.apache.org/docs/stable/_api/airflow/models/index.html#package-contents)のwait_for_downstreamを発見。

上記コードのargsに下記コードを追記することで脳内の結果と実際の結果が一致した。

```python:追加コード
'wait_for_downstream': True,
```

### もう少し気になったことと考察

結果としてargs部分にdepends_on_pastとwait_for_downstreamを設定したが、そのTrue/Falseの組み合わせで挙動が変わるかを調査した。
結果は以下の通り。（出力に工夫すればよかったと後悔した。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409722/bf0c774c-8cc8-9629-5b94-0c188548dc20.png)

#### wait_for_downstream=True, depends_on_past=True/False

wait_for_downstreamがTrueの場合はdepends_on_pastのTrue/Falseに関わらず、2回目の処理は1回目の処理終了を、3回目の処理は2回目の処理終了を待つので理解できる。

#### wait_for_downstream=Flase, depends_on_past=True

depends_on_pastがTrueの場合は前タスクインスタンスの成功に依存するため、以下の動きと理解した（ログより推測）。
**なおqueueの設定はデフォルト**

| 出力値 | 推測動作 |
|:-----:|:-------|
|0|1回目のrun_this_first処理|
|0|1回目のrun_this_first処理成功を受けて<br>2回目のrun_this_first処理がdequeue|
|1|1回目のrun_this_last処理後<br>1回目のrun_this_last処理がdequeue|
|0|2回目のrun_this_first処理成功を受けて<br>3回目のrun_this_first処理がdequeue|
|1|2回目のrun_this_last処理後<br>1回目のrun_this_last処理がdequeue|
|1|3回目のrun_this_last処理後<br>1回目のrun_this_last処理がdequeue|

#### wait_for_downstream=Flase, depends_on_past=Flase

depends_on_pastがFlaseの場合は前タスクインスタンスの成功に依存しないため1回目、2回目、3回目のrun_this_first処理が先に処理されると理解した。

## その他

引き続き触って動きの理解と調査を行う。
Google Analytics AMP版のカスタムディメンション・カスタムコンバージョン対応

Google AnalyticsでAMP計測する方法は公式で紹介されていますが、
カスタムディメンションとカスタムコンバージョンの計測方法は意外とあまり見当たらなく、
GTMでの計測方法しか紹介されていないことに気付きました。
GTM未導入の場合はどうなるのかなと思って、AMP以外のカスタムディメンションのトラッキングの送信方法を調べてみて、それをURLにくっつけてみたら、意外と問題なく動いてくれて、GA上もちゃんとデータがとれました。
一応そのコードの一部をご紹介します。


```ga_amp.js
var cd1 = 'xxx'; //カスタムディメンション１を設定
var cd2 = 'xxx'; //カスタムディメンション2を設定
var cd3 = 'xxx'; //カスタムディメンション3を設定
var gauri = 'cd1=' + cd1 + '&cd2=' + cd2 + '&cd3=' + cd3; //カスタムディメンションのパラメーター生成
<amp-analytics type="googleanalytics" id="analytics">
	<script type="application/json">
	{
		"requests": {
			"trackPageview": "${pageview}&" + gauri //上記生成したパラメータをこちらで受け渡す
		},
		"vars": {
			"account": "UA-xxxxxxxxx-1"
		},
    "triggers": {
			"trackPageview" : {
				"on": "visible",
				"request": "trackPageview"
			},
			"trackItemClicks": { //カスタムコンバージョンの設定
				"selector": "a", //該当タグをcssセレクトで指定
				"on": "click",
				"request": "event",
				"vars": {
					"eventCategory": "カテゴリ名の設定",
					"eventAction": "アクション名の設定",
					"eventLabel": "イベントラベルの設定"
				}
			},
		}
	}
	</script>
</amp-analytics>
```
【言語処理100本ノック 2020】第2章: UNIXコマンド

## はじめに
自然言語処理の問題集として有名な言語処理100本ノックの[2020年版](https://nlp100.github.io/ja/)が公開されました。
この記事では、以下の第1章から第10章のうち、「第2章: UNIXコマンド」を解いてみた結果をまとめています。

本編は以下のリンク先に移転しました。
https://amaru-ai.com/entry/2022/10/05/104131

[全100問の解答へ](https://amaru-ai.com/entry/2022/10/15/204035)
【メモ】[Mac OS] OneDriveの暴走対策

#ファンが止まらない
[Dropbox デバイス数制限への対策](https://qiita.com/rpscrw/items/02a3963f826500eca351)で取り上げたように、MacOSも含めてOneDriveへの依存度を高めていたところ今回の問題にぶち当たった。

使用環境はざっと以下のような感じ

```
[Mac]
MacOS Mojave 10.14.6
MacBook Pro (13-inch, 2019, Four Thunderbolt 3 ports)
2.4 GHz Intel Core i5
16 GB 2133 MHz LPDDR3
Intel Iris Plus Graphics 655 1536 MB

[OneDrive]
19.192.0926.0012
```
ここ最近OneDriveを仕事で使うことが増えたのだが、ファイルを更新して同期が発生するたびに半端ないCPU使用率で本体が発熱する事態に見舞われている。ファンが五月蠅いだけで済まず、Web会議のアプリが煽りを食らってフリーズしたり実害も出てきたことから、少し調べてみた。

アクティビティモニタでは disnoted というプロセスが暴走しているようだ。これは結構有名な問題で、5年くらい前からずっとあるらしい。ただしOneDriveそのものの暴走というより、Emacsなどでも発生するようなので、macOS側の問題と切り分けが難しいようだ。この問題について未だにMicrosoftからの修正は無い。

（対処療法的な）解決策に行き着くのに時間がかかったため、および掲載先がいつまで保存されるか分からないので、備忘録として書き残しておく。

#先人の知恵
オリジナルの投稿は下記のサイトにあった。
https://apple.stackexchange.com/questions/111197/runaway-distnoted-process

["Michael Rourke"](https://apple.stackexchange.com/users/151599/michael-rourke)さんが2016年に最初に回答しているスクリプトは以下の通り。

```
#!/bin/sh
#
# check for runaway distnoted, kill if necessary
#
PATH=/bin:/usr/bin
export PATH

ps -reo '%cpu,uid,pid,command' | 
    awk -v UID=$UID '
    /distnoted agent$/ && $1 > 100.0 && $2 == UID { 
        system("kill -9 " $3) 
    }
    '
```

作者の意図に沿うならば、$HOME/bin に置くと良いようだ。これをcrontabに登録して常時監視・実行することで、disnoted を KILL してしまう。


```
*   *  *   *  *   sh "$HOME/bin/checkdistnoted"
```

同じ回答欄には自動でインストールしてcronも編集してくれるスクリプトまで記載されている。

ひとまず、これでしばらく様子を見ようと思う。今のところ、何度かファイルを更新してみても暴走は起きないので効果が期待できる。
AWS の Workspaces のマシンに起動後に既存のEIPを割り当てる方法

AWS の Workspaces に EIP を割り当てるのは、あらたに EIP を取得して割り当てるのは簡単ですが、既に持っている EIP を割り当てたい場合はどうしたらいいかという記事になります。

これは、既に作ってしまった Workspaces では、どうしようもないのですが、まずはディレクトリの設定で、パブリック IP をもらわない設定にしてから、あらたに Workspaces で適当なものを選んで起動させます。そうすると、プライベート IP は持っているが、パブリック IP は持っていない Workspaces が出来上がります。

ネットワークインターフェースに行って、Workspaces のプライベート IP と同じプライベート IP を持つネットワークインターフェースを覚えておき、それに既存の EIP を割当てます。

コツとしては、Workspaces のディレクトリ設定でパブリック IP の割り当てをしない設定にすることです。そうしないと、既存の EIP を割り当てようとした時に、「既にパブリック IP が割り当てられているので割り当てできません」、というエラーが表示されます。
QQuickImageProviderを使うとプログラム終了時に不正終了する問題

# 問題
`QQuickImageProvider`を使ったプログラムでは、`main.cpp`内での登録方法に気を付けないとプログラム終了時に謎のエラーに遭遇することがある。

参照 → [Qtを使った簡単なGUIアプリ(1) マンデルブロー集合を描いてみる](https://qiita.com/y_uehara1011/items/70ee55ce14cd8189e54d)

QtCreatorから実行した場合、メインウインドウを閉じるとQtCreatorのApplication Outputペインにこんなエラーが出る

```
20:51:15: Starting C:\git\build-QtMandelbrot-Qt_5_14_1_msvc2017_64-Release\release\QtMandelbrot.exe ...
20:51:23: The program has unexpectedly finished.
20:51:23: The process was ended forcefully.
20:51:23: C:\git\build-QtMandelbrot-Qt_5_14_1_msvc2017_64-Release\release\QtMandelbrot.exe crashed.
```

プログラムの動作自体は正常なのでなかなか気づかなかったが、気持ち悪いので修正したい。

# 原因
問題の箇所

```cpp:main.cpp
    FractalDrawer fractalDrawer(sizeSettings.getCanvasWidth(), sizeSettings.getCanvasHeight());
    QQmlApplicationEngine engine;
    engine.addImageProvider(QLatin1String("fractalDrawer"), &fractalDrawer);
    engine.rootContext()->setContextProperty("fractalDrawer", &fractalDrawer);
```

```cpp:FractalDrawer.h
class FractalDrawer : public QObject, public QQuickImageProvider
{
```

- `QObject`の派生クラスは、スタック上にインスタンスを確保してもメモリの管理はQtがよろしくやってくれる
- `QQuickImageProvider`は`QObject`の派生クラスではないので、`addImageProvider()`の引数としてアドレスを渡すと、エンジン終了時にdeleteされてしまう
- 今回の例では`FractalDrawer`は`QObject`からも多重継承されているが、`addImageProvider()`からは`QQmlImageProviderBase`型として扱われる
- 結果、スタックに置いてあるにも関わらずエンジン終了時にdeleteされる
- `main()`終了時にメモリ解放しようとして二重解放でエラー

# 修正方法

スタックに置くのをやめてヒープに置くようにした

```cpp:main.cpp
    auto *fractalDrawer = new FractalDrawer(sizeSettings.getCanvasWidth(), sizeSettings.getCanvasHeight());
    QQmlApplicationEngine engine;
    engine.addImageProvider(QLatin1String("fractalDrawer"), fractalDrawer);
    engine.rootContext()->setContextProperty("fractalDrawer", fractalDrawer);
```

# 感想

- 多重継承はやっぱりやめたほうがいいかもしれない
- QObjectをC#や基本型の変数のように気楽に定義できるQtの世界観は好きなのだけど、やはりC++ベースである以上この手の隙間的な問題はいろいろありそう
heroku にデプロイしようとしてusr/bin/env ruby\r 'such no file or directry'と表示される。

# herokuデプロイ時にアプリケーションエラー（H10）になる。

heroku logs --tails でログを確認してみるとapp crashedになってしまっていた。

#解決方法

ログを確認した際に`usr/bin/env ruby\r 'such no file or directry'`と出ていたのでbinディレクトリを確認した。
そしてruby\rの部分から改行について怪しいと踏んで調べた結果どうやら改行コードがCRLFとなっていた。これをLFに変えたら通常通りherokuアプリケーションが起動した。
CRLFはwindows、LFはmacOS/Linuxのデフォルトの改行コードらしい。
URLsessionを用いたHTTPリクエストの方法(Swift, Xcode)

#はじめに
APIKitやAlamofireなどのライブラリを使わず標準のURLsessionを用いたHTTPリクエストを実行するを簡単にまとめました。

##1. URLsession手順
1. URLを生成
2. URLRequestを生成
3. 必要なパラメーターを付与
4. 通信を行う
5. レスポンスで受け取ったdata, response, errorの処理を行う

##2.基本のコード

###Get
基本は以下のコードのようになります。

```swift
let url = URL(string: "https://hogehoge.hoge")!  //URLを生成
var request = URLRequest(url: url)               //Requestを生成
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in  //非同期で通信を行う
    guard let data = data else { return }
    do {
        let object = try JSONSerialization.jsonObject(with: data, options: [])  // DataをJsonに変換
        print(object)
    } catch let error {
        print(error)
    }
}
task.resume()
```

###Post, Put
PostやPutにしたい場合はrequest.httpMethodを使います。

```swift
let url = URL(string: "https://hogehoge.hoge")! 
var request = URLRequest(url: url)
request.httpMethod = "POST"      // Postリクエストを送る(このコードがないとGetリクエストになる) 
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in  
    guard let data = data else { return }
    do {
        let object = try JSONSerialization.jsonObject(with: data, options: [])
        print(object)
    } catch let error {
        print(error)
    }
}
task.resume()
```

##3. Body, Header, Queryを付与したいときのコード
Bodyを付与(Get)

```swift
let url = URL(string: "https://hogehoge.hoge")! 
var request = URLRequest(url: url)
request.httpBody = "email=hoge@hoge.com&username=hogehoge".data(using: .utf8)  // 例)emailとpasswordを付与する場合
```

Headerを付与(Get)

```swift
let url = URL(string: "https://hogehoge.hoge")! 
var request = URLRequest(url: url)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")  //jsonでヘッダーに付与
request.allHTTPHeaderFields = ["Token": "snsjetnglsdfnm"]                 // 例) ヘッダーにトークンを付与する場合
```



Queryを付与(Get)

```swift
var urlComponents = URLComponents(string: "https://hogehoge.hoge")!  //URLComponentsでURLを生成
urlComponents.queryItems = [
    URLQueryItem(name: "email", value: "hoge@hoge.com"),      // 例) emailとpasswordを付与
    URLQueryItem(name: "username", value: "hogehoge")         //クエリを追加したければ、ここに書いていく
]
var request = URLRequest(url: urlComponents.url!)

→ 生成されるリクエスト "https://hogehoge.hoge?email=hoge@hoge.com&username=hogehoge"
```

##参考
下記のサイトを見ながら実装したので詳細はこちらをご確認ください。

[URLSessionを用いた通信 - GitHub](https://github.com/mixi-inc/iOSTraining/blob/master/Swift/pages/day3/4-2_HTTP-request-basic.md)
[HTTP GETとPOST(Swift)](http://www.office-matsunaga.biz/ios/description.php?id=54)
[【Swift】URLSessionまとめ](https://qiita.com/shiz/items/09523baf7d1cd37f6dee)