OmniAICreator/Qiita-1.07M huggingface dataset:
個別に計算した標本平均や標本分散から全体の標本平均や標本分散を求める

## 後から平均や分散を計算したいとき

大量のデータから平均や分散を計算したいが、全体のデータを分割した部分的なデータの平均や分散は持っているが、全体は捨ててしまっている場合がある。このときはそれぞれのデータ数と標本平均と標本分散から全体の標本平均や標本分散を求めることができる。

## 計算方法

今、全体のデータ $\mathbf{x}$ が $d$ 個に分割されていて、
$n_i$ 個の値からなるデータ $\mathbf{x}_i$ $(i = 1, \ldots, d)$ になっているとする。

$i$ 番目のデータの標本平均を $E_i$、標本分散（標本不偏分散ではない）を $V_i$ とする。また、$\mathbf{n} := (n_1, \ldots, n_d)^T, \mathbf{E} := (E_1, \ldots, E_d)^T, \mathbf{V} := (V_1, \ldots, V_d)^T$ とする。このとき、全体の標本平均 $E$ と標本分散 $V$ は、

```math
E = \frac{\sum_{i = 1}^d n_i E_i}{\sum_{i = 1}^d n_i} \\
= \text{center}(\mathbf{n}, \mathbf{E}), \\
V = \frac{\sum_{i = 1}^d n_i (V_i + E_i^2)}{\sum_{i = 1}^d n_i} - \left( \frac{\sum_{i = 1}^d n_i E_i}{\sum_{i = 1}^d n_i} \right)^2 \\
= \text{center}(\mathbf{n}, \mathbf{V}) + \text{center}(\mathbf{n}, \mathbf{E} \circ \mathbf{E}) - \text{center}(\mathbf{n}, \mathbf{E})^2
```

から求めることができる。

ただし、ここで $\text{center}$ は

```math
\text{center}(\mathbf{n}, \mathbf{x}) := \frac{\sum_{i = 1}^d n_i x_i}{\sum_{i = 1}^d n_i}
```

と定義される、 $\mathbf{x}$ の重心を求める関数で、$\circ$ は[要素積](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%80%E3%83%9E%E3%83%BC%E3%83%AB%E7%A9%8D)である。

このようにして個々の標本平均や標本分散から全体の標本平均や標本分散を復元できる。不偏分散が欲しい場合は、標本分散に直してから全体の標本分散を計算し、不偏分散を求めれば良い。

## 実装例

Julia 言語での実装例は次のようになる。

```julia
# 実装

using LinearAlgebra

center(n, x) = n ⋅ x / sum(n)
umean(n, e) = center(n, e)
uvar(n, e, v) = center(n, v) + center(n, e .* e) - center(n, e)^2

# 使用例

using Statistics

n1 = 10
n2 = 20
x1 = rand(n1)
x2 = rand(n2)
e1 = mean(x1)
e2 = mean(x2)
v1 = var(x1; corrected=false)
v2 = var(x2; corrected=false)

x = cat(x1, x2; dims=1)
n = [n1, n2]
e = [e1, e2]
v = [v1, v2]

mean(x) ≈ umean(n, e) # true
var(x; corrected=false) ≈ uvar(n, e, v) # true
```

注意点は、分散を求める関数 [`var`](https://docs.julialang.org/en/v1/stdlib/Statistics/#Statistics.var) の `corrected` はデフォルトだと `true` になっており、このままだと標本不偏分散になってしまうので、標本分散を求めるために `false` を指定することである。また、数値計算上の誤差が積もるため、`==` で比較しても直に計算したものと一致するとは限らないので、[`≈`](https://docs.julialang.org/en/v1/base/math/#Base.isapprox) でチェックすると良い。
MacOS High SierraでPHP5.3のインストール



### 環境情報
- MacOS High Sierra 10.13.6
- Homebrew 2.1.11
- phpenv v0.9.0-rc.1
- php 5.3.29

### phpenvでPHP5.3.29をインストール

以下のエラーで、インストールに失敗した。
autoconfのバージョン2.59以下を使用する必要がある。
現在のバージョンは、2.69を使用している。

```
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
make: *** [buildmk.stamp] Error 1
Failed to run 'buildconf'.
Forcing buildconf
buildconf: checking installation...
buildconf: You need autoconf 2.59 or lower to build this version of PHP.
           You are currently trying to use 2.69
           Most distros have separate autoconf 2.13 or 2.59 packages.
           On Debian/Ubuntu both autoconf2.13 and autoconf2.59 packages exist.
           Install autoconf2.13 and set the PHP_AUTOCONF env var to
           autoconf2.13 and try again.
-----------------------------------------
```

### 使用しているautoconfのバージョンを確認する

バージョンを確認したところ、2.69を使用している。

```
# brew list autoconf
/usr/local/Cellar/autoconf/2.69/bin/autoconf
```

### brewで2.59以下のバージョンを探す

brewで2.59以下のバージョンがインストールできないか確認する。
2.13があるようなので今回はこちらを使用。

```
# brew search autoconf                                                                                         
==> Formulae
autoconf ✔ autoconf-archive  autoconf@2.13
```

### autoconf2.13をインストール

autoconfのインストール。

```
brew install autoconf@2.13
```

### autoconf2.13のインストールを確認する

インストールが完了したか、確認してみる。

```
ls -al /usr/local/opt/autoconf@2.13/bin/autoconf213
```

### 環境変数をexportしてインストールする

環境変数をPHP_AUTOCONFでexportし、インストールすればインストールが完了する。

```
export PHP_AUTOCONF=/usr/local/opt/autoconf@2.13/bin/autoconf213
phpenv install 5.3.29
```
## 関連

[phpenvで5.6と7.2の開発環境を準備する](https://qiita.com/kazumiiiiiiiiiii/items/acc57a71783f39cc853c)
ThunderbirdでGmailのメールの送受信をPOPでやる

## はじめに
このご時世に、POP使う？Thunderbirdいる？
例えば、みんな持ってるPCのOSが違って、Officeソフトも入ってたり入ってなかったり、オフライン環境に1ヶ月以上閉じ込められるみたいな特殊事情により必要に迫らせたので、とりあえず設定でハマったことだけ書いておきます。

## やり方
1. GmailでPOPを許可する
https://support.google.com/mail/answer/7104828?hl=ja

1. Gmailのアカウントのセキュリティを緩める（ここにハマった）
「安全性の低いアプリがアカウントにアクセスすることを許可」を有効にする
https://support.google.com/accounts/answer/6010255

1. Thunderbirdのインストール
https://www.thunderbird.net/ja/

1. Thunderbirdでのアカウントの設定（ここもなんかハマる）
https://synclogue-navi.com/thunderbird-gmail-pop

## Thunderbirdでのアカウントの設定
Gmail側の設定反映がなぜかうまく行ってなくてパスワードが違うよってひたすら怒られた。
何度か設定をやり直しているうちにうまくきましたがセキュリティのメールが届いたりもしてました。

メールが5年分以上溜まっているアカウントの設定をしたらパスワードが間違ってるってひたすらエラーがでてうまくいかなかった。
メールがおおすぎるとエラーになるのかな？とも思うけど、確証はない。

GmailのPOPの設定で「今後受信するメールで POP を有効にする」を選んで
アカウント削除→再設定
Thunderbirdの再インストール
の順でやったら接続できるようになった。（Thunderbirdのバージョンのせいかもしれない）

で接続できるようになった後「全てのメールでPOPを有効にする」にして
今も絶賛メールの読み込み中（４時間ぐらい経ってるけど、後一年分ぐらいある）


## 終わりに
何台かPCを設定してみたがアカウントの情報間違ってるってエラーがでますが
大体が

* Gmailの設定反映に時間がかかってる
* Thunderbirdのバージョンが最新か？

が原因かも。
deviseを導入してフラッシュメッセージを追加する

##devise導入からフラッシュメッセージを追加するまで

###deviseの導入
```Gemfile.
gem 'devise'
```
のあとターミナルで`bundle install`と`rails generate devise:install`

以下のファイルができる
`create  config/initializers/devise.rb
create  config/locales/devise.en.yml
`

###フラッシュメッセージの追加
```application.html.erb
<body>
    
    <% if flash[:notice] %>
      <div class="alert alert-info">
        <%= flash[:notice] %>
      </div>
    <% end %>
    <% if flash[:alert] %>
      <div class="alert alert-danger">
        <%= flash[:alert] %>
      </div>
    <% end %>
    
  </body>
```
をbodyタグの中に追加

###Deviseのビュ-をインストール
ターミナルで`rails g devise:views`

ターミナルで以下が表示される

```ターミナル
$ rails g devise:views
   invoke  Devise::Generators::SharedViewsGenerator
   create    app/views/devise/shared
   create    app/views/devise/shared/_links.html.erb
   invoke  form_for
   create    app/views/devise/confirmations
   create    app/views/devise/confirmations/new.html.erb
   create    app/views/devise/passwords
   create    app/views/devise/passwords/edit.html.erb
   create    app/views/devise/passwords/new.html.erb
   create    app/views/devise/registrations
   create    app/views/devise/registrations/edit.html.erb
   create    app/views/devise/registrations/new.html.erb
   create    app/views/devise/sessions
   create    app/views/devise/sessions/new.html.erb
   create    app/views/devise/unlocks
   create    app/views/devise/unlocks/new.html.erb
   invoke  erb
   create    app/views/devise/mailer
   create    app/views/devise/mailer/confirmation_instructions.html.erb
   create    app/views/devise/mailer/email_changed.html.erb
   create    app/views/devise/mailer/password_change.html.erb
   create    app/views/devise/mailer/reset_password_instructions.html.erb
   create    app/views/devise/mailer/unlock_instructions.html.erb
```
###Userモデルを作成
ターミナルで`rails g devise User`

ターミナルで以下が表示される

```
$ rails g devise User
   invoke  active_record
   create    db/migrate/20180925032152_devise_create_users.rb
   create    app/models/user.rb
   invoke    test_unit
   create      test/models/user_test.rb
   create      test/fixtures/users.yml
   insert    app/models/user.rb
    route  devise_for :users
```
###Usersテーブルを作成
ターミナルで`rails db:migrate`

ターミナルで以下が表示される

```
== 20180925032152 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.0013s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0008s
-- add_index(:users, :reset_password_token, {:unique=>true})
   -> 0.0018s
== 20180925032152 DeviseCreateUsers: migrated (0.0042s) ======================
```


deviseを入れることでcurrent_userが使えるようになる
markdownを語源から

markdownの語源を調べる。

markdownの対比語としてmarkupがある。

#markup

##up
upの中心概念(core image)は、上に


【きほんごレシピ】up 基本イメージ【DataBaseシリーズ】桐原書店
https://www.youtube.com/watch?v=7ED5FmIiHZE

新感覚☆キーワードで英会話３-前置詞（副詞）編, 田中茂範,
https://www.amazon.co.jp/dp/4828804692/
46. up & down


## Tex



## SGML

## HTML

## XML



#markdown

## down

【きほんごレシピ】down 基本イメージ【DataBaseシリーズ】桐原書店
https://www.youtube.com/watch?v=T4pvY8A5hKw

## history and definition

markdownはmarkupの一種。

簡単に書き下す意味で、upよりも単純だという趣旨でdownをつけたのだろうか。

RFC7763  The text/markdown Media Type,  S. Leonard, 2016 
https://tools.ietf.org/html/rfc7763

MDSYNTAX, Gruber, J., "Daring Fireball: Markdown Syntax Documentation", December 2004,
http://daringfireball.net/projects/markdown/syntax
> HTML is a publishing format; Markdown is a writing format. 

Why You Shouldn’t Use “Markdown” for Documentation
https://www.ericholscher.com/blog/2016/mar/15/dont-use-markdown-for-technical-docs/
>“Markdown” is the most commonly used lightweight markup language on the internet.
Raspbianで画面のスクリーンショットを取得する

# 全画面のスクリーンショット取得
    $ scrot

# 対象ウィンドウのみのスクリーンショット取得
    $ scrot -s

コマンド実行後，対象ウィンドウをマウスでクリックすると，対象ウィンドウのスクリーンショットがホームディレクトリに保管されます。ただし，-sコマンドのみでは対象ウィンドウの枠まで取得することができません。対象ウィンドウの枠まで取得する際には，

# 対象ウィンドウの枠を含むスクリーンショットの取得
    $ scrot -s -b

を実行します。
TortoiseGitでユーザ情報を保存する

ホームディレクトリ直下(C:\Users\ユーザ名)に「_netrc」というファイルを下記内容で作成する。

```
machine [gitレポジトリのドメイン名]
login [ユーザ名]
password [パスワード]
protocol https
```
curlでNGN経路情報取得

### curl

```shell
/usr/bin/curl -6 --http1.1 \
 -A '' \
 -H 'Accept: */*' \
 -H 'Connection: close' \
  http://route-info.flets-east.jp:49881/v6/route-info
```

```shell
/usr/bin/curl -6 --http1.1 \
 -A '' \
 -H 'Accept: */*' \
 -H 'Connection: close' \
  http://route-info.flets-west.jp:49881/v6/route-info
```
保存するたびにstylelint fixする方法

## 🎉追記：2020年3月7日

結構前ですが、こちらvscode-stylelint本家でautofixが追加されました🎉
https://github.com/stylelint/vscode-stylelint#editorcodeactionsonsave
ということで、vscodeを使われている方は↑のオプションを使ったほうが速いし軽いしので、これ使ったほうがいいと思います！！！
（on-change方法だとファイル増えたときが辛いので😭）


## 事の発端
`vscode prettier stylelint autofix`
でググったらよく出てくる

```json:settings.json
{
  prettier.stylelintIntegration: true
}
```

が、VS Code Prettier v2でDEPRECATEDになっていた。
なんだかクリティカルなバグがあったっぽくてしかたないけど、それでも保存かけた時にESLint + Prettierの`eslint.autoFixOnSave`と同じ様に`stylelint fix`してほしいなぁと思ってた。


## やり方
色々調べてて思いついたのが、[onchnage](https://www.npmjs.com/package/onchange)を使ってwatchさせて置く方法。
そのままwatchしてもいいが、例えばNuxtプロジェクトと一緒に使うとこんな感じに使ってる。

```bash:bash
$ yarn add onchange npm-run-all -D
$ vim package.json
```

```json:package.json
{
  scripts: {
    "dev": "run-p serve:dev watch:style",
    "serve:dev": "nuxt",
    "watch:style": "onchange 'app/**/*.{css,scss}' -- yarn stylelint"
  }
}
```


## 嫌なところ
onchangeで常に対象ファイルをwatchしないといけないことと（ファイル数増えたら重くなると思うし）、`watch:style`コマンドを実行しておかないといけないこと。
あと、フォーマットかかったときも検知して、二回フォーマットかけてくるので、ちょっと嫌だなぁと。
`eslint.autoFixOnSave`にまとまってほしい…

もっといい方法知ってる人いたら教えて下さい🙋‍♂️
[Scala]implicitを含むprivateメソッドへのテストが失敗する(invokePrivate)

privateメソッドのテストで `invokePrivate` を使います
今回以下のメソッドに対してテストを書いてみました

Hogeを生成するメソッド
 
```scala
object Sample {
  private def generateHoge (hogeId: Int, hogeFlag: Boolean, fugaId: Int)
                           (implicit hogeRepository: HogeRepository,
                                     fugaRepository: FugaRepository) : Hoge = {
    ...
    Hoge(hogeId, hogeName)
  }
}
```

これに対してのテストを記述する

```scala
val A = PrivateMethod[返り値] ('メソッド名)
val result = オブジェクト名orクラス名 invokePrivate(A(引数))

result should be Hoge(1, "hogehoge")
```

今回だとこんな感じ

```scala
val generateHoge = PrivateMethod[Hoge] ('generateHoge)
val result = generateHoge invokePrivate(generateHoge(1, true, 1))

result should be Hoge(1, "hogehoge")
```

これでテストを実行すると、テストに失敗する

```scala
java.lang.IllegalArgumentException: 
  Can't find a private method named: generateHoge
```

invokePrivateの記述が通ってないみたい？ :thinking: 

#### 確認してみる
他のprivateメソッドに対するテストでは、同じ記述で通った
今回の違いは implicit の有無
なんとか渡せるようにしてみる

* 直接渡してみる

```scala
val generateHoge = PrivateMethod[Hoge] ('generateHoge)
val result = generateHoge invokePrivate(generateHoge(1, true, 1)(HogeRepository, 
 FugaRepository))

-> エラー
```

* 宣言時に渡してみる

```scala
val generateHoge = PrivateMethod[Hoge] ('generateHoge)(HogeRepository, 
 FugaRepository)
val result = generateHoge invokePrivate(generateHoge(1, true, 1))

-> エラー
```

* 事前にimplicitで宣言しておく

```scala
implicit val hogeRepository = HogeRepository
implicit val fugaRepository = FugaRepository

val generateHoge = PrivateMethod[Hoge] ('generateHoge)
val result = generateHoge invokePrivate(generateHoge(1, true, 1))

-> エラー。メソッドの通常呼び出しではないため、implicitを渡してくれない
```

この辺りで結構手詰まりに。そもそも公式のREADMEに記述が書いてないので無理だと思ってしばらく諦めました。

## 解決
絶対同じ症状になってる人がいると思って気合いでググりまくっていたら、以下の記事がヒット

https://stackoverflow.com/questions/34172387/how-to-invokeprivate-on-a-function-with-implicit-parameters

全く同じ症状で、回答に「サポートしていないように書かれているが普通の引数のように渡すと可能」との記述

つまりこのように書けば可能になるはず

```scala
val generateHoge = PrivateMethod[Hoge] ('generateHoge)
val result = generateHoge invokePrivate(generateHoge(1, true, 1, HogeRepository, FugaRepository))

result should be Hoge(1, "hogehoge")
```

エラーなし、通りました。

結構長い時間格闘したので、誰かの助けになればなと思います。
せっかく対応してるんだからREADMEに書いておいて欲しかったなぁ・・・
配列の積で混乱しないためのNumPy配列の作り方


##機械学習でも必須の配列（行列）の積
機械学習において最もシンプルなニューラルネットワークでは、重み$w_1,w_2$と入力値$x_1,x_2$の積の総和とバイアス値$b$の和 $y = w_1 x_1+w_2 x_2 +b$ を出力する計算をします。
重みと入力値が2つずつの場合は非常にシンプルですが、3つ以上、または更に多い場合、Pythonでfor loopを用いた実装を行うと、コードの実行に非常に時間がかかります。特に巨大なデータを用いる場合、ベクトル化（vectorization）を行い、重み$W$と入力値$X$の積により出力値$Y$を求めるのが効率的です（$W,X,Y$は行列）。

本記事では、Python/NumPyで行列演算（特に積）を行う際に留意すべき「配列の形状」の取扱い方について説明します。

##NumPyによる行列の積の基本
PythonのNumPyでは、np.arrayにより任意の次元の配列を作成できます。
そして配列同士の積を行う際、初心者が混同しがちな演算を、簡単な例を用いて説明します。

```python:配列同士の積
import numpy as np

A = np.array([[1,2],[3,4]])
B = np.array([5,6])
print(A * B) #broadcastにより1次元の配列Bが2次元の配列（行列）に変形
print(np.dot(A, B)) 
```
A * B は、「要素ごとの積」を求める演算式です。
上記の場合、$\begin{bmatrix}
1 & 2 \\\
3 & 4 \\
\end{bmatrix}$と$\begin{bmatrix}
5 & 6 \\\
5 & 6 \\
\end{bmatrix}$
の対応する要素同士で掛け算を行い、結果は$\begin{bmatrix}
5 & 12 \\\
15 & 24 \\
\end{bmatrix}$になります。
ここで、$\begin{bmatrix}
5 & 6 \\
\end{bmatrix}$が$\begin{bmatrix}
5 & 6 \\\
5 & 6 \\
\end{bmatrix}$に置き換わっていることに気づくと思います。これは、NumPyの**broadcast** という機能によるもので、次元が異なる配列の演算を行えるように変形を行うのです。上の例の場合、1次元の配列Bが2次元の配列（＝行列）に変形されています。

もう一つのnp.dot(A, B)はドット積と呼ばれる演算で、配列同士の内積を計算します。ここでの結果は$\begin{bmatrix}
17 & 39 \\
\end{bmatrix}$になります。
通常、2次元の配列（＝行列）同士の積では、$i \times j$ の行列$M$ と$j \times k$ の行列$N$ の積を求める際、行列$M$ の2次元目の要素数$j$ と行列$N$ の1次元目の要素数$j$ を一致させます。
上記のPythonコードでは、2次元の行列$A$ に「1次元の配列$B$」を掛ける演算を行っています。1次元の配列は、階数（rank）1の配列とも呼ばれます。この**1次元の配列は行ベクトルでも列ベクトルでもない**ため、行列演算に慣れた身からすると、実際のところ直観的でないプロセスを辿ります。
##NumPyによる配列の形状確認
```python:配列の形状確認
import numpy as np

A = np.array([[1,2],[3,4]])
print(A.shape) #(2, 2)
B = np.array([5,6])
print(B.shape) #(2,)
print(B.T.shape) #(2,)
print(np.dot(B, B.T)) #61
```
上記コードでは、各配列の形状確認を行っています。注目していただきたいのが$B$の形状です。まずB.shapeを返して配列の形状確認を行っていますが、繰り返しますように1次元配列は行列ではなく、行ベクトルでも列ベクトルでもないため、要素数2のみを返します。
次に、B.T.shapeを返して配列を転置したものの形状確認を行っていますが、これもB.shapeと同じ結果になります。
更に、BとB.Tの内積を求めると、行列ではなく1つの値を返します。

#1次元配列を避けた実装
機械学習の実装の過程で、行列や配列の形状を確認しながら丁寧に四則演算を繋げていきますが、その際に上記のような**1次元配列が混在することは混乱やエラーの元**となります。そのため、コーディングの際には、(n,)という配列をできるだけ避け、**(n, 1)と形状を指定して列ベクトルとして作成する**習慣をつけておくと分かりやすくなります。(1, n)の行ベクトルにする際には、当該ベクトルを転置すれば良いのです。

もし1次元配列として作成してしまった場合には、以下を追記することにより列ベクトルに変換できます。

```python:
B = B.reshape(2,1)
print(B.shape) #(2,1)
```
また、配列の形状を把握できていない場合、assert()構文を挟んで確認するのも有効です。

```python:
assert(B.shape = (2,1))
```
##参考文献
以上の方法は、[Courseraのオンライン講座 "Deep Learning Specialization"](https://www.coursera.org/specializations/deep-learning)で紹介されていた方法です。講師のAndrew Ng先生は、指導してきた学生が多くつまづくポイントとして1次元配列の混在を挙げており、それに対するアプローチとして紹介している手法です。
機械学習の初心者を始め、NumPyによる計算を多用する方にお薦めしたいtipsです。

以上、分かりにくい点や誤りがございましたらコメント等でご指摘いただければ幸いです。
VSCodeで拡張機能がインストールできない

# 拡張機能がインストールできない
こんなメッセージが出てた。

```
EPERM: operation not permitted, open 'C:\Users\%USERNAME%\.vscode\extensions\...'
```

```
Failed to install 'パッケージ名'
please manually install the downloaded VSIX of 'パッケージ名'
```

# tl;dr
* `C:\Users\%USERNAME%\.vscode\extensions\.obsolete`を削除した。
    * あんまり深く追求してないので、あくまで私の場合は上手くいった話です。

# 対応
* エラーメッセージで調べたけど、まんま同じ情報があまり見つけられなかったので、とりあえず`C:\Users\%USERNAME%\.vscode\extensions\`を見に行った。
* `.obsolete`には過去にアンインストールされた拡張機能が書き込まれていくらしいが、なぜか中身がスカスカだったので、いったんバックアップ取ってから削除してみた。
* VSCodeを再起動したら、無事に拡張機能がインストールできるようになった。
    * `.obsolete`もまた勝手に作られたが、今度は中身がちゃんと書き込まれてそう。
    * 今使ってる拡張機能が消えたり、アンインストールした拡張機能が復活したりするかな？と思ったけど、私の場合は特にそんなことは無く、何も異常無しでした。

# 参考
* [VSCodeの拡張機能を修復目的で再インストールする時に気をつけた方がいいこと](https://qiita.com/s_p_Toyu/items/d985ec79ca94a83db442)
webarenaでubuntu その45

#概要

webarenaでubuntu18.04やってみた。
apache2.4 perl5.26 やってみた。
cgiやってみた。
jcode.plやってみた。

#error修正。

```
    &init_z2h_euc unless defined %z2h_euc;
                    ↓
    &init_z2h_euc unless %z2h_euc;


    &init_z2h_sjis unless defined %z2h_sjis;
                    ↓
    &init_z2h_sjis unless %z2h_sjis;

```

以上。
gcloudで出力される日時項目のタイムゾーンをJSTに変換する

GCPのStackdriver Loggingは最高のプロダクトの一つですよね。

Stackdriverに限らずですがGCPのリソースを確認する際に、慣れてくるとgcloudのCLI経由で作業したいケースが増えてくると思います。その場合に、特にログ周りの出力日時は、国内サービスを運営している人からするとTimezoneがUTCだと脳内マッピングが発生して混乱する人が多いと思います。（というか私です）

...という訳で、JST(Japan Standard Time: 日本標準時)で出力する方法を調べました。


# 結論

日付項目に対して、`--format`オプション内で `.date(tz=Asia/Tokyo)` を提供すればOKです。これで変換してくれるのは不思議ですね。当初は取得した文字列をawkとかで変換するかーとか思っていたのですが、gcloudのオプションでできました。凄い。

```bash:JST指定する例
$ gcloud logging read --project <Your GCP Project ID> "resource.type=<Your Resource Type>" \
  --format="table(receiveTimestamp.date(tz=Asia/Tokyo), textPayload)" \
  --order=asc
RECEIVE_TIMESTAMP    TEXT_PAYLOAD
2019-09-03T21:00:10  Function execution started
2019-09-03T21:00:27  Function execution took 17391 ms, finished with status: 'ok'
...省略...
```

デフォルトでは並び順がdescなので、`--order`オプションで昇順に切り替えています。

ちなみに、日付フォーマットも変換できます。`.date('%Y-%m-%d %H:%M:%S.%Z', tz=Asia/Tokyo)` のように記載することでTimezone付きで出力することもできます。

```bash:日付フォーマットでTimezoneまで指定した例
$ gcloud logging read --project <Your GCP Project ID> "resource.type=<Your Resource Type>" \
  --format="table(receiveTimestamp.date('%Y-%m-%d %H:%M:%S%Z', tz=Asia/Tokyo), textPayload)" \
  --order=asc
RECEIVE_TIMESTAMP           TEXT_PAYLOAD
2019-09-03 21:00:10+09:00  Function execution started
2019-09-03 21:00:27+09:00  Function execution took 17391 ms, finished with status: 'ok'
...省略...
```

これでログをSlackなどで別の人に渡しても混乱が減りますね。

gcloudの`--format`オプションは中々趣がある機能が満載です。もちろんそのままJSONでもCSVでも出力できますし、いい感じにパディングしてくれるtableオプションもあります。

フィールドの項目も`jq`で絞り込みを行わずgcloudで行ってしまうことが、コマンドをシンプルにする上でもおすすめです。


# まとめ

* gcloudの`--format`オプションでTimezoneを始めとした日付整形が可能
* 良いログライフを！


# 参考

* https://cloud.google.com/sdk/docs/scripting-gcloud
* https://cloud.google.com/blog/products/gcp/filtering-and-formatting-fun-with
Go Modulesでgo.modのGo versionを変更するには

[Go 1.13][go113]がリリースされ、Go 1.12 時代から [Go Modules][gomodules]を利用していたプロジェクトでは、go.modファイルのGoバージョンを変更したいですね。

[go113]: https://golang.org/doc/go1.13
[gomodules]: https://github.com/golang/go/wiki/Modules

go.modファイルは`go mod edit`で変更を加えることができます。`go help`で使用方法を見ると、editing flagsというflagを指定することでどのように変更を加えたいかを指定します。

```
$ go help mod edit
usage: go mod edit [editing flags] [go.mod]

Edit provides a command-line interface for editing go.mod,
for use primarily by tools or scripts. It reads only go.mod;
it does not look up information about the modules involved.
By default, edit reads and writes the go.mod file of the main module,
but a different target file can be specified after the editing flags.
```

今回は、Goのバージョンを1.12から1.13へ変更したいので、次のediting flagsがその用途に該当します。

```
The -go=version flag sets the expected Go language version.
```

この説明の通り、所定プロジェクトのgo.modファイルが有るディレクトリにて、

```
go mod edit -go=1.13
```

とすることで、go.modファイルのGoバージョンが1.13に変更されます。

以上で、さくっとgo.modのGoバージョンを変更することができます。`go help`で書かれている説明は非常にわかりやすいので、こまったら`go help`してみるといいでしょう。
Docker + Laravel6 + Redis エラー: Please remove or rename the Redis facade alias in your "app" configuration file in order to avoid collision with the PHP Redis extension.

`Docker` で構築した `Laravel6` 環境に `Redis` を導入した際にエラーになったので、その対応策を残します。

## エラー内容

<img width="1304" alt="スクリーンショット 2019-09-04 15.50.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/3bdcf9e8-0a40-5017-5300-1b15e7fbafba.png">

> Please remove or rename the Redis facade alias in your "app" configuration file in order to avoid collision with the PHP Redis extension.

## 環境

- PHP 7.3
- Laravel 6.0.0

## 公式ドキュメント

- [Laravel 6.0 Redis](https://laravel.com/docs/6.0/redis)

> Before using Redis with Laravel, we encorage you to install and use the [PhpRedis](https://github.com/phpredis/phpredis) PHP extension via PECL. The extension is more complex to install but may yield better performance for applications that make heavy use of Redis.

PHP拡張機能の `php-redis` のインストールを推奨とのことです。
こちらを入れることによりパフォーマンスも向上しますよ。とのこと。

## 対応

`Dockerfile`の抜粋です。

```
FROM php:7.3-fpm-alpine

RUN apk add git
RUN git clone https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis
RUN docker-php-ext-install redis
```

`alpine`に`git`コマンドが入ってないので、`git`コマンドをインストールからやってます。
環境構築後は不要になるので、削除して良いですね。

実際のGitHubはコードはこちらです。
https://github.com/ucan-lab/docker-laravel/blob/master/docker/php/Dockerfile
C++のDebugログ出力

boost logを使う場合、Debugログをログファイルに出力するマクロの定義です。

```
#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/utility/setup/file.hpp>

#define LOG_INIT                                                                                           \
    boost::log::register_simple_formatter_factory<boost::log::trivial::severity_level, char>("Severity");  \
    boost::log::add_common_attributes();                                                                   \
    boost::log::add_file_log(“xxxx.log", boost::log::keywords::format = "[%TimeStamp%][%Severity%]%Message%", boost::log::keywords::auto_flush = true)

#define LOG_FILENAME    (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)
#define LOG_LOCATION    "[" << LOG_FILENAME << ":" << __LINE__ << ":" << __FUNCTION__ << "] "

#define DEBUG_LOG(X)   BOOST_LOG_TRIVIAL(debug) << LOG_LOCATION << X
```

DEBUG_LOG("Core::initialize finished")を叩くと

以下のようなフォーマットのログをxxxx.logファイルに出力され、出力する場所、時間をはっきりわかりますね

```
[2019-08-27 13:58:04.801361][debug][Core.cpp:74:Core::initialize] Core::initialize finished
```
`FASTLANE_SESSION` 環境変数の生成方法

## はじめに

CI/CDでiOSアプリをTestFlightへデプロイするのに必要なため、 `FASTLANE_SESSION` 環境変数を生成します。

## 環境

- Fastlane：2.130.0

## `FASTLANE_SESSION` 環境変数の生成

以下のコマンドを実行します。

```shell-session
$ fastlane spaceauth -u {Apple ID}
```

途中でパスワードや確認コードなどを聞かれるので、指示に従って入力してください。

成功すると `FASTLANE_SESSION` 環境変数が生成されます。

```shell-session
Successfully logged in to App Store Connect

---

Pass the following via the FASTLANE_SESSION environment variable:
{ `FASTLANE_SESSION` 環境変数}

Example:
export FASTLANE_SESSION='{ `FASTLANE_SESSION` 環境変数}'
```

## おわりに

`FASTLANE_SESSION` 環境変数が生成できました。
これでCI/CDでiOSアプリをTestFlightへデプロイできます。

## 参考リンク

- [継続的インテグレーション-fastlane docs](https://docs.fastlane.tools/best-practices/continuous-integration/#use-of-application-specific-passwords-and-spaceauth)
セキュリティ上の理由により、アプリケーション エラーの詳細をリモート表示できません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/97016982-9c76-31b6-9760-5ab83cb936a7.png)

「サーバーでアプリケーション エラーが発生しました。このアプリケーションの現在のカスタム エラー設定では、セキュリティ上の理由により、アプリケーション エラーの詳細をリモート表示できません。ただし、ローカル サーバー コンピューターで実行されているブラウザーで表示することはできます。」

###サーバーのイベントを確認するに限る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/cbbcc939-a67e-3415-eb69-dbe20c6f74d0.png)
Rails チュートリアルで生じたRails Asset Pipeline周りのエラー

#Rails チュートリアルでのエラー

5章に入り、久しぶりにサーバーを走らせると次のようなエラーが生じた。
対策にだいぶ困ったので、解決策だけ備忘録として書いておく。
なお、当方初学者につき、どうしてこれで解決したのかは全く分かりません。


##エラー内容

```サーバーエラー
ActionView::Template::Error (The asset "application.js" is not present in the asset pipeline.):
     5:     <%= csrf_meta_tags %>
     6:     <%= stylesheet_link_tag    'application', media: 'all',
     7:                                'data-turbolinks-track': 'reload' %>
     8:     <%= javascript_include_tag 'application',
     9:                                'data-turbolinks-track': 'reload' %>
    10:     <!--[if lt IE 9]>
    11:       <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/r29/html5.min.js">'
```

##解決策
なぜか、ファイルが自動作成されていなかった
app/assets/javascripts/application.js
を作成し、
この記事を参考に（https://blog.kasei-san.com/entry/2015/09/13/185400）
以下のように記述。

```app/assets/javascripts/application.js
// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .
```
Hello Laravel 6 !!!

# [Laravel 6 Is Now Released](https://laravel-news.com/laravel-6)

Laravel6リリースおめでとうございます㊗️
リリース記念に早速Laravel6.0でインストールしてみます！

## 環境構築

[予め用意していた docker 環境を使って構築する](https://qiita.com/ucan-lab/items/17c806973e69792ada99)

```
$ git clone git@github.com:ucan-lab/docker-laravel.git
$ cd docker-laravel
$ docker-compose up -d --build
```

## Laravel 6.0 をインストール

```
$ docker-compose exec app composer create-project --prefer-dist "laravel/laravel=6.0.*" .
$ docker-compose exec app composer require predis/predis
```

```
$ php artisan --version
Laravel Framework 6.0.0
```

👏👏👏👏👏

<img width="1007" alt="スクリーンショット 2019-09-04 15.33.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/97574a64-5529-e41d-bc94-ec14901f5f3b.png">

親の顔より見た安心のWelcome画面！
Laravel5と特に変わらないんすね🤔
Vuei18nで多言語化対応

せしまるです。

今回はVue.jsを使ったアプリで多言語化対応したのでその備忘録として書きます。

#環境
Vue.js
TypeScript
fuse.js

#実装

まずVueI18nをインストールします

```console
$ npm install vue-i18n
```

tsconfig.jsonに下記記述を追記します。

```json:tsconfig.json
{
    "compilerOptions": {
                ︙
        "resolveJsonModule": true
                ︙
    }
}
```

fuse.jsでJSONPluginを読み込みます。

```javascript:fuse.js
const { ..., JSONPlugin } = require("fuse-box");
                ︙
                ︙
context(
    class{
        config(name, template){
                ︙
            plugins: [
                JSONPlugin(),
                ︙
```

ここまでで準備はOK
jsonファイルを用意。
今回は日本語(ja)と英語(en)の2種類
私の環境ではassets/json/language.jsonとなってます。

```json:language.json
{
    {
        "ja": {
            "mypage":{
                "title": "タイトル"
            }
        },
        "en": {
            "mypage":{
                "title": "タイトル"
            }
        }
    }
}
```

次にi18n.tsを作成。
私の環境ではcore/i18n.tsとなってます。

```typescript:i18n.ts
import Vue from "vue"
import VueI18n from "vue-i18n"
import json from "../assets/json/language.json"
Vue.use(VueI18n)

export const i18n = new VueI18n({
    locale: "ja",
    messages: (<any>json)
})
```

使う側は先ほど作成したi18n.tsを読み込んで使います。
※一部省略してます.

```vuejs:mypage.vue
<template>
    <div>
        <p>{{geti18n("mypage.title")}}</p>
    </div>
</template>

<script>
import { i18n } from "../core/i18n"

export default class MyPage extends Vue{
        ︙
    geti18n(name: string) : string{
        return i18n.tc(name)
    }
        ︙
}
</script>
```

言語を切り替える際はi18n.localeに"en"や"ja"などjsonで定義した名前を入れると切り替わります。

#感想
私の環境ではVue-cliとかは特に使ってなかったので、かなりの数の記事を読んでここに行き着きました…（あとは先輩のお力を借りて）
Terraformの使用バージョンを固定する

### terraformはまだ1.x以上じゃない
[リリース情報](https://github.com/hashicorp/terraform/releases)より。
この記事の確認時点の最新は、0.12.7 (August 22, 2019)。
0.12.x。
安定バージョンを1.0.x以上と定義すると今後も細かいバージョンアップと仕様変更がるものと思われる。

### 0.11.xと0.12.xは大きくことなる
[HashiCorp Terraform 0.12 Preview](https://www.hashicorp.com/blog/terraform-0-1-2-preview)

こちらのとおりでだいぶ変わる。
[0.11.14](https://github.com/hashicorp/terraform/commit/12bf5f6afec2a9dcc97357671fdfa9fb972884eb)には0.12にアップデートするサポートコマンドも用意されている。

```
terraform 0.12checklist
```

例えば、以下の表示。
これは、変数 `count` を使ってしまっているが、 `Input Variables` の変更が今後ある指摘。

```
# Module `"hoge"`

- [ ] The variable name "count" is now reserved.

  Terraform 0.12 reserves certain variable names that have (or will have in future) a special meaning when used in a "module" block. The name of this variable must be changed before upgrading to v0.12. This will unfortunately be a breaking change for any user of this module, requiring a major release to indicate that.
  For more information on the reserved variable names, see the documentation at https://www.terraform.io/docs/configuration/variables.html .
```

### 0.12以上使わせたくないとき
とはいえ、0.11を使っている事情もあるだろう。
アップデート前に0.12を使おうとするクライアントがいて、tfstteなどを書き換えられると困る。
そこで、アップデート前にバージョンを固定させるようにしたほうがいい。

versionを固定するtfファイルをそえてあげるとよいだろう。

```
% cat version.tf
terraform {
  required_version = "~> 0.11"
}
```

### 逆に0.12しか使わせたくないとき
0.12から変わるので、基本0.12以上対応にした場合は以下のようにmoduleごとも含めて0.12以上を指定したほうがよいだろう。

```
terraform {
  required_version = "~> 0.12"
}
```

複数プロジェクトをまたいでいるときは、気にしておきたい。


### このmoduleは0.12以上対応です
参考： [terraform-aws-modules/terraform-aws-eks](https://github.com/terraform-aws-modules/terraform-aws-eks/blob/d8ed7d0b669a9d7ca1741c094c70ed00267bc661/versions.tf)のmoduleの使用例

```
terraform {
  required_version = ">= 0.12"

  required_providers {
    aws      = ">= 2.8"
    local    = ">= 1.2"
    null     = ">= 2.1"
    template = ">= 2.1"
    random   = ">= 2.1"
  }
}

```

providerも同様に指定するとよい。
このあたり、細かく設定するとterarform本体のバージョンやproviderのバージョンを固定しながら扱うことができる。
温湿度センサを使って不快指数をAzureIoTCentralで可視化する

#オフィス環境を可視化してみた
[前回](https://qiita.com/yukimatsu/items/a7d04f36c34eadf3b8ac)は、ESP8266+BME280+AzureIoTCentralを使ってオフィス環境（温度・湿度・気圧）の可視化（グラフ）を行いました。ただし、数値データだと体感と直感的にマッチしないので、不快指数を使ってより視覚的にオフィス環境が分かるようにしようと思います。

#不快指数
[Wikipedia](https://ja.wikipedia.org/wiki/%E4%B8%8D%E5%BF%AB%E6%8C%87%E6%95%B0)では、「夏の蒸し暑さを数値的に表した指数で、温熱指標の一つ」と書かれてます。
計算式も書いてあるので、デバイス側（ESP8266）で演算して、不快指数を算出して、Azure側にアップします。


#基本構成（前回と同様です）
・[ESPr® Developer](https://www.switch-science.com/catalog/2652/)
・[ESPr® Developer用環境センサシールド(BME280搭載)](https://www.switch-science.com/catalog/2703/)
・[Azure IoT Central](https://azure.microsoft.com/ja-jp/services/iot-central/)

#Azure IoT Centralで可視化
不快指数は８段階で表現できる為（肌寒い、快い、暑くてたまらないなど）、Azure IoT Central上では「State」を使用して可視化します。その場合、以下の画像のように表現が可能です。画像の下の方のバーがStateの表現となり、水色が「肌寒い」、赤色が「暑くてたまらない」などの設定になってます。これなら直感的に分かりやすい！
![Azure画面.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/6d4f40d5-dac0-eed1-e641-feff2221c207.jpeg)

#Azure IoT CentralでのStateの設定
- Field Nameは、送信するデータ側と合わせる必要があります
- [Values]の[value]は、デバイス側を合わせやすくする為、数値にします（今回は、0～7）
- [Values]の[display name]は、不快指数の体感の表現を使います（肌寒いとか）
- 色の表現は、体感に合わせて段階的に分かりやすい色にします（寒い：寒色系、暑い：暖色系）
![AzureIoTCentral設定.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/ba23d22b-33b4-b991-00fd-e35fea920568.jpeg)

#ESP8266からのデータアップロード
Githubに公開されている[サンプルコード](https://github.com/Azure/iot-central-firmware/tree/master/ESP8266)のiotc_send_state関数を使いますが、特に注意が必要なのが、値を文字として送る箇所。valueの比較は文字として行っているみたいで、送信の際に文字として""(ダブルコーテーション)で括ってやる必要があります。

```
  // Azureへの送信
  int discomfort_state = -1;
  if (discomfort < 55) {
    discomfort_state = 0;
  } else if (55 <= discomfort && discomfort < 60) {
    discomfort_state = 1;
  } else if (60 <= discomfort && discomfort < 65) {
    discomfort_state = 2;
  } else if (65 <= discomfort && discomfort < 70) {
    discomfort_state = 3;
  } else if (70 <= discomfort && discomfort < 75) {
    discomfort_state = 4;
  } else if (75 <= discomfort && discomfort < 80) {
    discomfort_state = 5;
  } else if (80 <= discomfort && discomfort < 85) {
    discomfort_state = 6;
  } else if (85 <= discomfort) {
    discomfort_state = 7;
  } else {
    discomfort_state = -1;
  }

  message = "{\"discomfort_state\":\"";
  message.concat(String(discomfort_state));
  message.concat("\"}");
  message.toCharArray(buf, message.length() + 1);
  errorCode = iotc_send_state(context, buf, message.length() + 1);
```

#まとめ
色で表現してすることで、かなり直感的に分かりやすくなりました。
あと、既にデバイス側で不快指数の上限・下限を超えたらイベントをAzure側にアップロードするようにしてあるので、Rulesを使って、イベント発生時にフロア内のメンバーにTeamsで通知したり、通知が来る上限・下限も場合に応じては変更したくなると思うので、Azure IoT Central側から変更できるようにしたりというのをやりたいと思います。
Apex Specialist Super Badge 復習[Challenge 3]

# Schedulableインターフェース

指定の時刻に実行したい処理はSchedulableインターフェースを実装したApexクラスに記述することで可能となります。
[公式：Apex スケジューラを使用したジョブのスケジュール](https://trailhead.salesforce.com/ja/content/learn/modules/asynchronous_apex/async_apex_scheduled)

# CRON式

スケジュール化する際に日時の指定をする際にCRON式を用いて表現します。
[公式：Apex スケジューラ](https://developer.salesforce.com/docs/atlas.ja-jp.220.0.apexcode.meta/apexcode/apex_scheduler.htm)下のほうにCRON式の構文が載っています。

# ソースコード
Schedulableインターフェースを実装したクラスから前Challengeで作成したメソッドを呼び出すだけです。
<details><summary>コード</summary><div>

```java
global class WarehouseSyncSchedule implements Schedulable{
  // implement scheduled code here
    global void execute(SchedulableContext ctx){
        WarehouseCalloutService.runWarehouseEquipmentSync();
    }
}
```
</div></summary>

スケジュール化の方法は3つあります。
1. Debugの匿名ウィンドウから実行
2. 上記WarehouseSyncScheduleクラスに記述
3. UIを使ってスケジュール
<details><summary>コード</summary><div>

```java
       String sch = '00 00 17 * * ?';//JST 5pm==PST 1am. My org is set in JST
       System.schedule('WarehouseSyncScheduleTest', sch, new WarehouseSyncSchedule());
```
</div></summary>

1,2番では上記コードを実行/記述します。(私は3番を用いたので検証はできていないです)
[Google先生によると](https://www.google.com/search?ei=-VFvXfCsPMfW-QamyaKQBA&q=PST+1%3A00+JST&oq=PST+1%3A00+JST&gs_l=psy-ab.3...1470065.1475892..1476220...0.0..0.84.638.9......0....1..gws-wiz.......0i67j0j0i30j0i19j0i10i19j0i30i19.6NNkIOSYock&ved=0ahUKEwiwjfPkvbbkAhVHa94KHaakCEIQ4dUDCAs&uact=5)、米国太平洋標準時(PST)の午前1時は日本標準時(JST)の午後5時に相当するとのことです。
組織の標準時を修正してもチェックは通りますが、私はJST PM5時で通しました。~~設定変えるの面倒~~

3番はSetUpのQuick Findにて、`Apex classes`と入力し、Apex classesをクリックします。
`Schedule Apex`というボタンをクリックすればスケジュールの作成が可能です。
(Schedulableクラスが表示されない場合、WarehouseSyncScheduleクラスを再度編集して保存すると表示されることがあります)

続き:[Apex Specialist Super Badge 復習[Challenge 4]](https://qiita.com/jitao/private/bcd9ddf2cefc065b7e35)
Firebase デプロイに Cloud Build を使う

Firebase Hosting や Functions に CI 通じてデプロイしたくなったので、GCP の Cloud Build を使って設定をしてみます。公式ドキュメントや他の方が試された記事だと `FIREBASE_TOKEN` が必要と書いてありますが、実は GCP の Google Application Default Credentials でトークン設定なしにデプロイが可能です。

教えていただいた @iwata@github さん感謝。

https://twitter.com/mobcov/status/1169116064199917569

なお Cloud Build を有効にすると、自動的に Firebase のプランが Spark （無料） から Blaze になるので注意してください。

## Firebase コンテナの用意

まず firebase コマンドを実行可能なコンテナを用意します。

```bash
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
cd cloud-builders-community/firebase
gcloud builds submit --project <project name> --config cloudbuild.yaml .
```

## Cloud Build 設定ファイル

Firebase にデプロイするアプリケーションの Cloud Build 設定をします。今回の例は next.js のアプリケーションなので最初に node npm 関係のビルドをしています。重要なのは一番最後のステップです。ここで Firebase へデプロイをします。 `FIREBASE_TOKEN` の指定は必要ありません。

```yaml:cloudbuild.yaml
steps:
  - id: 'Install npm packages'
    name: 'node:12.9-buster'
    args: ['npm', 'install']
  - id: 'Build App'
    name: 'node:12.9-buster'
    args: ['npm', 'run', 'build-app']
  - id: "Deploy to Firebase"
    name: 'gcr.io/$PROJECT_ID/firebase'
    args: ['deploy']
```

## Cloud Build ADC 設定

Cloud Build から Firebase Hosting / Functions へデプロイするために権限を付与します。コンソール画面から設定します。

https://console.cloud.google.com/cloud-build/settings?hl=ja&project=<project name>

<img width="641" alt="スクリーンショット_2019-09-04_15_38_50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152/bc1c7a0b-bb63-1a1b-7bfe-3326acc4ee7d.png">

## デプロイ

あとはデプロイできるか試してみます。

```bash
gcloud builds submit --project <project name> --config cloudbuild.yaml .
```

正常にデプロイされたらトリガーを設定して終了です。簡単になりましたね。

（… functions を個別にデプロイさせるにはトリガーを細かく作りわけないと駄目なのがちょっと面倒くさいけど）
uWSGIで負荷試験をやったときに出会った壁たち

かなり前の話になるけどnginx + uWSGI で秒間2000アクセスくらいさばく必要があったので負荷試験をやった。
アプリケーションによってオプションの最適値はいろいろあると思うし、負荷をかけるとアプリ側にボトルネック見つかったりすると思うので、そういうのはめいめいやっていただくとして、あのー、やってるときに、ある多重数にすると突然全部エラーになる、みたいな、これはサーバの限界とかでなく明らかに何かの制限に引っかかってんなーという事象がいくつかあって、調べて対応するなどした。
有名なお話が多いけど、もしかしたら誰か探してるもしれないからまとめておくね。

## 同時100アクセスの壁

最初に出会った壁。Apache Benchで100より多くの同時アクセスをすると死ぬ。そんな貧弱なサーバを買った覚えはない。誰だ。お前だ。uWSGIのlistenキューのデフォルトが100だからだ。

https://uwsgi-docs.readthedocs.io/en/latest/articles/TheArtOfGracefulReloading.html?highlight=listen#the-listen-queue

```
listen=10000
```

とか適当に上げてuWSGIの再起動。


## 同時128アクセスの壁

上で出てきた話の関連で、そもそもuWSGIのlistenキューのデフォルトが100である理由は、OSの設定がそんなもんだからとのこと。
Linuxのsomaxconn のデフォルトは128。これも変更。

https://qiita.com/kuni-nakaji/items/38d46b09f3bff1d1a973

適当に上げて、設定読み込み、NGINX、uWSGIの再起動。


## 同時1000アクセスの壁

これはuWSGI Emperorを使って複数のuWSGIアプリをまとめているときだけの話だけど、同じvassalを起動する制限（スロットリング）があって、デフォルトはミリ秒単位で1000個までとなっている。Fork爆弾対策らしいけど、これは知らなかったから半日ハマった。nginxで絞るからいいのでは……とか思うけどそういうわけにもいかないのか。

https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html?highlight=throttle#throttling

uwsgi emperor のオプション

```
emperor-throttle=10000
```

とか適当に上げた。


おしまい！
JSONデータをSwiftで扱う

# この記事は何？
JSON形式で記述されたデータをSwiftプログラミングで扱う方法です。

## 実行環境
macOS10.15 Catalina beta7
Xcode11 beta7

## コンテキスト
Xcodeプロジェクトのリソースとして、JSON形式のファイル `someData.json` があることを前提にしています。

# コード全体
プロジェクトのどこかに、次のように記述したSwiftファイルを配置しておくと、JSONデータをでコートした内容が割り当てられた定数 `someData` を呼び出すことができます。

````Swift:JSONデータをコードで扱う
let someData: [SomeDecodableType] = load("someData.json")

func load<T: Decodable>(_ filename: String, as type: T.Type = T.self) -> T {
    let data: Data
    let decoder = JSONDecoder()

    guard let file = Bundle.main.url(forResource: filename, withExtension: nil) else {
            fatalError("No \(filename) in main bundle.")
    }

    data = try! Data(contentsOf: file)
    return try! decoder.decode(type, from: data)
}
````

### someData
グローバル定数として `someData` を定義しています。

````Swift:
let someData: [SomeDecodableType] = load("someData.json")
````

`: [SomeDecodableType]` と明示することで、`load()` 関数内で扱う方が推論されます。
なお、`SomeDecodableType` が `Codable` プロトコルに準拠している必要があります。
JSONファイルの構成と一致していることも注意してください。
Pythonからredis SentinelのMaster確認

ローカルのredisにPythonから接続確認ができます。

```python
>>> from redis.sentinel import Sentinel
>>> sentinel = Sentinel([('localhost', 26379)], stream_timeout=0.1)
>>> sentinel.discover_master('mymaster')
('xxx.xxx.xxx.xxx', 6379)
```

接続できてないときはNotFoundErrorが出ます。

```python
>>> sentinel.discover_master('mymaster')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.linux-x86_64/egg/redis/sentinel.py", line 220, in discover_master
redis.sentinel.MasterNotFoundError: No master found for 'mymaster'
```

その他詳しくはこちら
https://pypi.org/project/redis/
Redmine(docker) + MariaDB(docker)からバックアップとリストア

# 前提

docker hubにあるbitnamiのRedmineを使う。
以下のようにRedmine + MariaDBのコンテナを作成した。
docker-compose使っててもバックアップやリストアの手順は変わらないはず。

```
$ docker network create redmine_network
$ docker run -d --name mariadb --net=redmine_network -e ALLOW_EMPTY_PASSWORD=yes -e MYSQL_USER=root  bitnami/mariadb
$ docker run -d --name redmine --net=redmine_network -p 外部から接続するポート:3000 bitnami/redmine:3.3.1-r11
```


# バックアップ

### Redmineコンテナからファイルが入っているディレクトリを圧縮

コンテナに入って、/bitnami/redmine/files配下をまるごと圧縮する。

```
$ docker exec -it redmine /bin/bash
(コンテナに入った↓)
# tar -zcvf /bitnami/redmine/files.tar.gz /bitnami/redmine/files
```

### mariadbからデータダンプ取得

コンテナに入って、mysqldumpでデータをEXPORTする。

```
$ docker exec -it --user root mariadb /bin/bash
(コンテナに入った↓)
# mysqldump -u ユーザ -pパスワード bitnami_redmine > /bitnami/db_backup.dmp
```

### コンテナ内のファイルを取り出す

```
$ docker cp mariadb:/bitnami/db_backup.dmp ~
$ docker cp redmine:/bitnami/redmine/files.tar.gz ~
```

# リストア

### バックアップファイルをコンテナに入れる

```
$ docker cp ./db_backup.dmp mariadb:/bitnami/
$ docker cp ./files.tar.gz redmine:/bitnami/redmine/
```

### Redmineのコンテナ内でバックアップファイルを展開する

```
$ docker exec -it redmine /bin/bash
(コンテナに入った↓)
# tar -zxvf /bitnami/redmine/files.tar.gz
```

※ファイルの権限には注意
※解凍する場所に注意

### MariaDBのユーザとパスワードを確認する

Redmineのコンテナに入ったまま、データベースへの接続情報を確認する。

```
# cat /bitnami/redmine/conf

(省略)
production:
  adapter: mysql2
  database: bitnami_redmine
  host: mariadb
  username: ユーザ
  password: パスワード
  encoding: utf8
(省略)

```

### MariaDBのコンテナでダンプファイルをインポートする

```
$ docker exec -it --user root mariadb /bin/bash
(コンテナに入った↓)
# mysql -u ユーザ -pパスワード bitnami_redmine < /bitnami/db_backup.dmp
```
HTTP レスポンスステータスコードについて

# HTTP レスポンスステータスコード

## 200 OK
リクエストが成功したことを示します。
成功が意味することは、HTTPメソッドにより異なります

## 301 Moved Permanently
リクエストされたリソースのURLが永遠に変更されたことを示します。
レスポンスで新しいURLが与えられます。
## 302 Found
このレスポンスコードは、リクエストされたリソースの URI が一時的に変更されたことを示します。URI は将来、新たに変更される可能性があります。従って、クライアントは将来のリクエストでも同じ URI を使用するべきです。


## 301と302がSEO対策に
Googleさんは301と302を区別する必要があります。
永遠に変更されたのであれば元のサイトの評価を移動先のサイトに移し替えることができます。
しかし、間違えて永遠に変更しているのに302としてしまったのであれば元のサイトが評価され、移動先のサイトが評価されないとなってしまいます。
また、元のサイトと移動先のサイトが重複内容のため評価をさげられてしまうことがある
ドットインストール勉強メモ01

【Java8入門 #31 例外処理を扱ってみよう】に関する疑問メモ

疑問1. いきなり以下の継承から始まっているが、Exceptionクラス(？)がJavaにあらかじめ定義されているの？
　class MyException extends Exception
理解1. そうみたい。
　参考：https://qiita.com/k4h4shi/items/2c39edaeef1c92f6644a
　　　　http://www.itsenka.com/contents/development/java/exception.html

疑問2. "throw"と"catch"ってなんだ？
理解2. tryとセットで使う、例外に関するもの。
　参考：https://www.sejuku.net/blog/26344

疑問3. ArithmeticExceptionとは？
理解3. 不正な算術処理（ゼロ除算など）
　　これもあらかじめ定義されており(？)いきなり書いてOK。
Apple IDにApp用パスワードを設定する方法

## はじめに

CI/CDでiOSアプリをTestFlightにデプロイするのに必要なため、Apple IDにApp用パスワードを設定します。

## 「App用パスワード(Application specific passwords)」とは？

> App 用パスワードは、他社製の App を Apple ID で使う際に、アカウントに安全にサインインできるようにするしくみです。

引用： [App 用パスワードを使う - Apple サポート](https://support.apple.com/ja-jp/HT204397)

## 注意

App用パスワードを設定するためには、2ステップ確認または2ファクタ認証を設定する必要があります。
2ファクタ認証の方が新しくて望ましいです。

参考
[Apple IDで2ステップ確認を有効にする方法 - Qiita](https://qiita.com/uhooi/items/8e4710451299b92c41db)

## App用パスワードの設定

以下のページにアクセスし、App用パスワードを設定したいApple IDでログインします。
https://appleid.apple.com/account/home
<img width="1039" alt="スクリーンショット_2019-09-04_11_35_57.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/7eeafef4-2854-d4cd-79bc-2d89860aacb9.jpeg">

[セキュリティ]で、[App用パスワード]の[パスワードを生成…]をクリックします。
<img width="1016" alt="スクリーンショット_2019-09-04_14_38_54.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/7a3cad36-e01a-5f39-9ecb-a9f5541a8043.jpeg">

パスワードのラベルを入力し、[作成]をクリックします。
ラベルはAppを自分で特定できれば、適当な文字列でOKです。
<img width="457" alt="スクリーンショット_2019-09-04_14_41_01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/6ec8c1b3-3415-ba15-f5a3-e6c2caa1abf7.jpeg">

App用パスワードが作成されました。
App用パスワードをコピーし、[完了]をクリックします。
<img width="454" alt="スクリーンショット_2019-09-04_14_43_17.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/ab59f239-1c87-4000-4f96-371001ddf988.jpeg">

## おわりに

App用パスワードを作成できました。
これでCI/CDでiOSアプリをTestFlightにデプロイできます。
DynamoDBをpythonで扱う

# 目的
DynamoDBを使った方法をメモ。
boto3を使う前提。

# 前提
扱うテーブルはパーティションキーとソートキーがあるテーブルとする。

# 事前準備
対象のテーブルを指定する関数を定義。(別に関数を用意しなくてもよい)

```python
def getTable():
        return boto3.resource('dynamodb').Table('テーブル名')
```

# 検索
・パーティションキーとソートキーを指定して一意検索

```python:一意検索
rst = getTable().query(
    KeyConditionExpression = Key('パーティションキー名').eq('検索項目') & Key('ソートキー').eq('検索項目')
)
```
※and条件は「&」、or条件は「|」で指定する。

・前方一致

```python:ソートキーの前方一致検索
rst = getTable().query(
    KeyConditionExpression = Key('パーティションキー名').eq('検索項目') & Key('ソートキー名').begins_with('検索文字列')
)
```
※パーティションキーを指定しないとエラーになる。

・パーティションキーのみで検索

```python
rst = getTable().scan(
    FilterExpression= Key('パーティションキー').eq('検索項目')
)
```

# 更新

```python:1レコード更新
getTable().update_item(
        Key = {
                'パーティションキー名': 'パーティションキーの値',
                'ソートキー名': 'ソートキーの値'
        },
        UpdateExpression = 'set ' \
                + '更新カラム名1' + '=:' + '更新カラム名1' + ',' \
                + '更新カラム名2' + '=:' + '更新カラム名2',
        ExpressionAttributeValues = {
                ':' + '更新カラム名1' : `更新する値1`,
                ':' + '更新カラム名2' : `更新する値2`
        },
        ReturnValues="UPDATED_NEW"
)
```

# 登録

```python:1レコード登録
getTable().put_item(
        Item = {
                # パーティションキー
                'パーティションキー名': 'パーティションキーの値',
                # ソートキー
                'ソートキー名': 'ソートキーの値',
                # カラム1
                'カラム名': 'カラム1の値'
        }
)
```

# 削除

```python:1レコード削除

getTable().delete_item(
        Key = {
                # パーティションキー
                'パーティションキー名': 'パーティションキーの値',
                # ソートキー
                'ソートキー名': 'ソートキーの値'
        }
)
```

# 最後に
違う検索方法を知ったときに随時メモを増やしていきたい。
開発備忘録 メソッドとカラム名について

<h1>Railsでの開発でメソッド名とカラム名で苦戦したので備忘録で書いています。(メモ程度)</h1>

<h3>メソッド名とカラム名が同一なものを避ける。</h3>
例えば、下記の2つのコードがあったとします。

⓵test.hoge 
②test.hoge

どちらも同じ値が出力されるように見えますが、異なる場合がありまます。

・変数がモデルを指していない場合 ex) test = hogehoge
・モデルなどに記載しているメソッドを利用している場合 ex) def hoge
・メソッドと同一名のカラムをDBで保持していた場合
・モデルが違うのにeachなどの変数で同一の変数名を利用している場合 ex) test_1.find_each do |test|

上記に記載したような書き方になっていると開発改修時に混乱を招きます。
Javaでの配列のしくみ(図解)

#配列
配列とは、データを並べて入れておく箱を準備して、出し入れをする表現です。
配列には一次元配列と多次元配列というものがあります。
例題を使いながら、配列の仕組みを説明していきます。

#一次元配列
配列の各要素に1,2,3,4,5を代入して表示してみましょう

```java:Array1

class Array {
	public static void main(String[] args) {

		int[] a = new int[5];

		for (int i = 0; i < a.length; i++){
			a[i] = i + 1;
		}

		for (int i = 0; i < a.length; i++){
			System.out.println("a[" + i + "] = " + a[i]);
		}
	} 
}
```

```
【実行結果】
a[0]=1
a[1]=2
a[2]=3
a[3]=4
a[4]=5
```

![Qiita用_配列1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434899/ef64b833-f5d8-30d9-02e4-17ef84f830af.png)



#多次元配列
配列の各要素に1,2,3,4,1,2,3,4を代入して表示してみましょう

```java:Array2
class A2 {
	public static void main(String[] args) {

			int[][] x = new int[2][4];

			for (int i = 0; i < 2; i++) {
				for (int j = 0; j < 4; j++) {
					x[i][j] = j + 1;
					System.out.println("x[" + i + "][" + j + "] = " + x[i][j]);
				}
			}
	} 
} 
```

```
【実行結果】
x[0][0] = 1
x[0][1] = 2
x[0][2] = 3
x[0][3] = 4
x[1][0] = 1
x[1][1] = 2
x[1][2] = 3
x[1][3] = 4
```

![Qiita用_配列2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434899/da35ec1c-69bd-f04b-ca34-8e1d084901c4.png)
MicrosoftFlowで「エクセルの行を挿入」をするときの必須項目“キー値”は何でしょう

お世話になっております。

MicrosoftFlowで「エクセルの行を挿入」をするときの必須項目“キー値”とは何でしょう。
参照：画像オレンジ部分
教えていただけると嬉しいです。よろしくお願いいたします。
![question.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492164/067171c0-7f4d-0a3a-3321-4595197c1deb.png)
#PowerApps #MicrosoftFlow の新しいプランによるAPI問い合わせ回数上限について自分なりにまとめてみた。

# 注意
本内容は独自解釈が多分に含まれているため、誤っている可能性があります。ご承知おきください。

# 元ネタ

https://docs.microsoft.com/ja-jp/power-platform/admin/api-request-limits-allocations#non-licensed-usersapplication-users

[吉田の備忘録](https://memo.tyoshida.me/powerapps/powerapps-microsoft-flow-oct-2019-license/)

# API問い合わせ数上限（24時間中）

|所有ライセンス|実行上限|
|:--|:--|
|Dynamics 365 Enterprise [^1]|20,000|
|Dynamics 365 Professional|10,000|
|Dynamics 365 Team Member|5,000|
|PowerApps Per User(旧PowerApps P2)|5,000|
|Microsoft Flow Per User(旧Microsoft Flow P2)|5,000|
|Office Licence|2,000|
|Per Apps  |1,000 [^2]|
|Per Flow  |15,000 [^3]|

ところでこれ、ライセンス分合算して全ユーザー使えるのか？
それともライセンスを所持しているユーザーのみなのか・・・？
多分後者な気がする。

[^1]: Dynamics 365 SE, CE, FS, PSA, Retail, Talent
[^2]: 対象のアプリのみ
[^3]: 対象のフローのみ

## API問い合わせ数について

### PowerApps

以下の操作を１回とカウント
- コネクタを使用した参照・登録・更新・削除
- データソースを使用した参照・登録・更新・削除

例１）Office365ユーザー.MyProfile().userprincibalname
Office365ユーザーコネクタを使用した参照を行ったため１回

例２）Patch(SharePointList,defaults(SharePointList),{name:test,value:1})
Patch関数を使用してSharePointのカスタムリストに登録したため１回

### Microsoft Flow

以下の操作を１回とカウント

- トリガー実行
- アクション実行

→ Logic Appsと同じカウント方法に変更

例１）Flowボタン→twitter投稿
→トリガー1回＋Twitterアクション1回＝2回

例２）Flowボタン→CDS内のエンティティ参照→100件のデータを更新
→トリガー1回＋CDSのエンティティ参照1回＋Apply to EachによりCDS更新アクション100回+1回＝103回
RewriteEngine On にならない場合は、mod_rewrite を有効にする

未だに、Apache2のRewriteEngine はオプションなので、有効にしてあげないと動作しない。

```error.log
/var/www/html/folder/public/.htaccess: Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration
```

## 現在の状態を確認する

apache2 のモジュール関連が有効かどうかは、 /etc/apache2/mods-enabled を見れば分かる。

```
# ls /etc/apache2/mods-enabled
access_compat.load  auth_basic.load  authz_core.load  autoindex.conf  deflate.load  env.load	 mime.load	   negotiation.conf  reqtimeout.conf  setenvif.conf  status.load
alias.conf	    authn_core.load  authz_host.load  autoindex.load  dir.conf	    filter.load  mpm_prefork.conf  negotiation.load  reqtimeout.load  setenvif.load
alias.load	    authn_file.load  authz_user.load  deflate.conf    dir.load	    mime.conf	 mpm_prefork.load  php7.load	status.conf
```

## mod_rewrite を有効にする

```
# a2enmod rewrite
```

## apache2 を再起動する

```
service apache2 restart
```

## （番外） Dockerfile でやる場合は

以下の行を Dockerfile に追加しておけばOK。

```Dockerfile.
RUN a2enmod rewrite \
  && service apache2 restart
```
とあるデータサイエンス入門まわりのインデックス

[2019年データサイエンスにオススメの本80冊！](https://www.octoparse.jp/blog/80-best-data-science-books-that-are-worthy-reading)
[【データサイエンス入門】必要な基本的スキルトップ10](https://www.octoparse.jp/blog/10-must-have-skills-for-data-mining/)
[機械学習に知っておくべき10のアルゴリズム](https://www.octoparse.jp/blog/10-machine-learning-algorithms-you-should-know/)