OmniAICreator/Qiita-1.07M huggingface dataset:
nginxでベーシック認証設定

最近、現場でnginxを触り始めたので学んだ事を細々とメモします。

### パッケージインストール
htpasswdコマンドを使用するため下記パッケージをインストールする

```
$ sudo yum install httpd-tools
```

### .htpasswdファイルの作成
```
$ sudo htpasswd -c /etc/nginx/.htpasswd <ユーザ名>
New password:
Re-type new password:
Adding password for user <ユーザ名>
```

### nginx.confに下記を追記
```
auth_basic "<認証領域名>";
auth_basic_user_file /etc/nginx/.htpasswd;
```


設定例

```/etc/nginx.conf
# ワーカプロセス数
worker_processes 1;
# エラーログ出力先
error_log /var/log/nginx/error.log;
# PIDファイルの配置先
pid /var/run/nginx.pid;
# 1ワーカプロセスが同時オープン可能なファイルディスクリプタ数最大値
worker_rlimit_nofile 1024;

events {
    # 1ワーカプロセスが同時オープン可能なコネクション数最大値
    worker_connections 512;
}
http {
    # アクセスログ出力先
    access_log /var/log/nginx/access.log;
    # nginxに常時接続しているクライアントに対するタイムアウト時間
    keepalive_timeout 10s;
    server {
        listen 80;
        location / {
            # 全てのアドレスを許可
            allow all;
            # Basic認証有効化
            auth_basic "Login Authentication";
            # パスワードファイルの指定
            auth_basic_user_file /etc/nginx/.htpasswd;
            # プロキシ設定
            proxy_pass http://xxx.xxx.xxx.xxx:80;
        }
    }
}

```


### nginxを再起動
```
$ sudo service nginx restart
```
three.js 画像をマテリアルに使用する方法


#画像をマテリアルに使用する方法

```javascript

//画像を読み込む
const loader = new THREE.TextureLoader();
const texture = loader.load('画像のパス');

//マテリアルにテクスチャーを設定
cost material = new THREEE.MeshStandardMaterial({
    map: texture
});
```

## 参考
https://ics.media/tutorial-three/material_basic/
Leetcode #643: Maximum Average Subarray I

```swift
func findMaxAverage(_ nums: [Int], _ k: Int) -> Double {
    var ar = Array(repeating: 0, count: nums.count + 1)
    var sum = 0
    for (index, num) in nums.enumerated() {
        sum += num
        ar[index+1] = sum
    }
    var answer = Int.min
    for i in stride(from: k, through: nums.count, by: 1) {
        answer = max(answer, ar[i] - ar[i-k])
    }
    return Double(answer) / Double(k)
}
```
Leetcode #941: Valid Mountain Array

```swift
func validMountainArray(_ A: [Int]) -> Bool {
    var i = 0
    while i < A.count && i + 1 < A.count && A[i] < A[i+1] {
        i+=1
    }
    if i == 0 || i + 1 == A.count {
        return false
    }
    while i < A.count && i + 1 < A.count {
        if A[i+1] >= A[i] {
            return false
        }
        i += 1
    }
    return true
}
```
GKE上のPodにGCPの認証情報を設定する

GKEで動かすPodにGCPの認証情報を渡す手順を何度もやっているので手順をまとめておく。

## ServiceAccountを作成する　

```bash
$ gcloud iam service-accounts create example-sa \
         --display-name "this is example"
```

## カスタムロールを定義する

```yaml
title: example-role
description: example role
stage: ALPHA
includedPermissions:
- storage.objects.create
- storage.objects.delete
- storage.objects.get
- storage.objects.getIamPolicy
- storage.objects.list
- storage.objects.setIamPolicy
- storage.objects.update
```

```bash
$ gcloud iam roles create example_role \
       --project [PROJECT_ID] 
       --file custom-role.yaml
```

## カスタムロールにServiceAccountを紐付ける

```bash
$ gcloud projects add-iam-policy-binding [PROJECT_ID] \
         --member=serviceAccount:example-sa@[PROJECT_ID].iam.gserviceaccount.com \
         --role=projects/[PROJECT_ID]/roles/example_role
```

- ロールの紐付けを確認する

```bash
$ gcloud projects get-iam-policy [PROJECT_ID] \
         --flatten="bindings[].members" \
         --format='table(bindings.role)' \
         --filter="bindings.members:example-sa@[PROJECT_ID].iam.gserviceaccount.com"
```

## ServiceAccountの鍵を作成する

```bash
$ gcloud iam service-accounts keys create gcp_credentials.json \
         --iam-account example-sa@[PROJECT_ID].iam.gserviceaccount.com
```

## 鍵をSecretsとして登録する

```bash
$ kubectl create secret generic example-sa-cred \
          --from-file=gcp_credentials.json=./gcp_credentials.json
```

## Podをデプロイする

Secretに登録した鍵をマウントし、 `GOOGLE_APPLICATION_CREDENTIALS` にパスを設定します

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: gcr.io/[PROJECT_ID]/my-contailer
          env:
            - name: GOOGLE_APPLICATION_CREDENTIALS
              value: /var/secrets/google/gcp_credentials.json
          volumeMounts:
            - name: example-sa-cred
              mountPath: /var/secrets/google
      volumes:
        - name: example-sa-cred
          secret:
            secretName: example-sa-cred
```

```bash
$ kubectl apply -f myapp.yaml
```

#### References

[Creating and managing custom roles](https://cloud.google.com/iam/docs/creating-custom-roles#iam-custom-roles-testable-permissions-gcloud)
Salesforce開発者視点から見た Salesforce Platform vs Microsoft Office 365

## はじめに

Office365のアプリが多すぎてよくわからなくなったので、
Office365をSalesforce開発者視点で比べてみようと思う。

なお、Office365について調べてみたという企画ですので、
過不足があることをご了承ください。


## コンセプトから見た比較

### Salesforce Platform

Salesforceは、CRMツールを基点とするプラットフォーム。
元々はそのCRMツールを補助する形で提供されたオブジェクトやカスタムアプリが発展し、
様々な開発を可能となった。

### Microsoft Office 365

Office365は、Microsoft Officeを基点とするプラットフォーム。
Azureの登場によって、
SharePointやActiveDirectoryが統合されトータルソリューションとなった。

## 機能比較

Salesforceを基準として、
同等の機能がOffice365サイドの機能・アプリに紐づけた結果が以下。

| Salesforce | Microsoft |
|:--:|:--:|
| Sales Cloud | Dynamics CRM |
| カスタムアプリ| SharePointサイト |
| カスタムオブジェクト | SharePointリスト |
| VFページ / LEX | PowerApps|
| Chatter | Yammer |
| ワークフロー | Flow|
| Apexトリガ | PowerApps or Flowで作りこみが必要 |
| AppExchange | SharePointストア |
| Heroku + Canvas | Azure VM or Websites|
| Database.com | Azure SQL Database |

こんな感じでしょうか。
やり方は結構違いますが、割と同じことはできるのではないでしょうか。

Apexトリガの代替だけ、入力する口毎に実装が必要そうなので、
同じ感覚でやるにはちょっと難しいかもしれない。ここは要調査。


## どちらがいいの？

### CRMとしての比較

SalesforceはAI分析など、CRMの機能を基軸とした様々な機能を有しています。
CRMとしての単体を見た場合、DynamicsよりもSales Cloudの方が高機能でしょう。


### プラットフォームとしての比較

Office製品やSharePoint、Azure ADの使用が前提の場合、
カスタマイズ性を持ったプラットフォームとしての魅力はOffice 365に軍配が上がるかと思います。

なお、競合とは言ってもSalesforce社とMicrosoft社は提携しています。
SalesforceからAzure ADやOffice365へのアクセス、またはSharePointからSalesforceへのアクセスができる環境は提供されているため、両方のいいところを使った業務を行うこともできるようになっています。

### 開発者視点としての比較

ガリガリコードを組める人からすれば、Apexで組めるSalesforceの方がわかりやすいでしょう。
無料のDeveloper環境やSandbox環境、Salesforce DXなど、開発に関数環境が整備されていますので、
開発者にとってはどんどん開発しやすくなっていっています。
ブラウザ上で操作したカスタムオブジェクト等の情報もローカルにダウンロード可能なので、
ソースの管理も一元で行うことができます。

一方、SharePointもVisual Studioを用いたSharePointの開発が可能ですので、
.NETの開発経験がある人には比較的導入しやすいかと思います。
また、一部制限はありますが、サンドボックスソリューションは存在しますので、
それで本番を汚さないテストは可能なようです。
ただし、PowerAppなど、ブラウザ上で操作するものについては基本ブラウザでの管理となるため、
ソース管理が必要なものについては工夫が必要かもしれません。


## まとめ

どちらを選ぶか？という選択肢になった場合、

**CRMは必要か？**

の一点が最も重要かと思います。
正直、CRMの機能が不要なのであればSalesforceは高すぎます。

しかしながら、値段に見合うCRMとしての機能を準備なしで使うことができるのはとても大きいです。

なので、
**「もっと効率のよい営業活動がしたい」**
ということであれば、Salesforceの方が向いているでしょう。

一方、「そこまで高機能である必要はない」、「Excelを脱却した管理がしたい」
というのであれば、Office 365(DynamicsとSharePoint)に利があるかもしれません。
特に、Office365 E3を契約しているような企業様であれば、

- Office Pro Plusのアプリ利用可能
- Azure ADによるユーザー管理(機能は制限される)
- Outlookによるメール機能
- OneDriveによるファイルストレージ
- SharePointやExchangeが使える

など、様々な追加機能を利用することができます。
思ったよりもオールインワンERPとして役割を果たせますね。

## 最後に

### Microsoft Action Packという存在

Microsoftにはパートナー制度があり、特定の条件を満たすことで、
様々なアプリケーションを利用できるサブスクリプションがついてきます。

特にAction Packは、小規模の企業様、もしくは個人事業主で契約できるものですが、
5名までのOffice365やDynamics、$100/月のAzure、Visual Studio Proなどの利用券がついてくるようです。

年間44,000円という価格で使用できますので、ぜひ活用していきたいですね。
(本当のスタートアップでしたら無料で使えるBizSparkというものもあるようです。)
「ならば」と 数学

# 0. 概要
数学では「ならば」に相当するような 記号や表記や概念 がたくさん出てくるので整理してみた。数理論理学に関連。

# 1. 「ならば」っぽい奴の一覧

- `→`, `⊃`
   - 論理学の「ならば」。真理値表を書けばその機能は明確。`A→B`のように使われ`A`がtrueかつ`B`がfalseの時にのみfalseとなる。定義が明確なので使用上の混乱はないが、「なぜその真理値表を持つのか？」というそもそもの疑問を持つ人もいる（`→`をならばと読んでいるからこその疑問）

- 定理における ⇒, $\Longrightarrow$, ならば
  - 定理の中に出てくる日本語「ならば」。⇒や $\Longrightarrow$ とも。
  - 例「xが4の倍数 ならば xは2の倍数 である」
  - 「`A`ならば`B`」という形で文の間に配置されて、新しい言明を生成する。`A`が成立していないときのことについては何も主張しないので その時の `B` の成否は問わない。
  - メタな文（論理式で表せない文）とメタな文の間に配置して、新しい言明を生成することもある
  - 人によっては頭の中で自動的に `A→B` に翻訳しているかもしれない（がそれは先走りすぎかも。後述。）

- ならば（日常）
    - 日本語などの自然言語での「ならば」。「雨が降るならば遠足は中止です」に見られるように、雨が降らない場合も暗示すること**も**ある（つまり、雨が降らなかった時には遠足は行うといったように。この場合、ならばというよりも同値となる）。数学のテクストも日本語で記載されるので、自然言語での説明や解説において影響がありうる。

- ⊢, 「・・を仮定するならば・・が証明できる/導出できる」
    - 「`A`と`B`を仮定するならば`C`が導出できる」のように使われる。論理学では ⊢ という記号を用い、{`A`,`B`} ⊢ `C` と書く。
    - 公理と定理の関係もこのカテゴリに入る。
    - 上述の「⇒」と似ているがこちらの方が意味が限定されている。「⇒」の証明ヴァージョンが「 ⊢ 」だと理解してもよい。

- 推論・演繹としての ならば/よって/ゆえに/ということは
    - 背理法: 「`A`と仮定すると矛盾。ならば`A`でない」
    - 場合分け: 「`A`と仮定すると`B`。`¬A`と仮定しても`B`。よって`B`」
    - 三段論法: 「`A`と`A→B`が示せた。よって`B`」
    - 二重否定除去:「`¬¬A`だ。ならば `A`。」
    - ・・・
    - これらは、推論規則と呼ばれる。いくつかの基本的な推論規則をベースに、それらを組み合わせた派生規則が無数に生み出される。

- モデル版 ⊨ 「・・・という構造を決める ならば成立する/正しい」
    - 「3つの元からなる集合を考える ならば 互いに異なる二つの元が存在する」のように使う。公理を与えるのではなく、対象や演算の性質を具体的に定めることにより、文の成立不成立を議論する。意味論・モデル論的なアプローチ。
    - 数理論理学では ⊨ を使い、左辺に構造を配置する M ⊨ `∃x∃y¬(x=y)`

- 帰結版 ⊨ 「・・・が成立するならば・・・が帰結する」
    - 「`A`が成立する ならば `B`が成立するのように使う。前述の⇒と似ているが意味が限定されており、背後に特定の構造（およびそれによって定まる理論）を背景にある。しかし、我々が（通常の用途で） 「⇒」 や 「ならば」を利用するときには、特定の構造を前提とするのが普通なので、⇒ と同一視してもいいのかもしれない。`A` ⊨ `B` のように使う


# 2. ならばに関するトピック

## 2-1. 演繹定理
「`A`⊢`B`(つまり `A`を仮定するならば`B`が証明できる)」を「`A → B` が証明できる」と同一視してよいことを保証するのが演繹定理。演繹定理が成立しない場合もあるけれど、普通の数学では成立する。概念的に異なる `→` と ⊢ を（ある意味で）同一視しても、変なことにはならないことを主張。

「定理における日本語の ならば、つまり $\Longrightarrow$ 」 を「 ⊢ 」として解釈できる場合「`A`$\Longrightarrow$`B`」という言明は、演繹定理により「`A→B`」が定理であると解釈することができることを示している。

- `A`$\Longrightarrow$`B` : 日本語(自然言語)を使った言明
- `A`⊢`B` : 数理論理学を使ったメタレベルの言明
- `A → B`: 数理論理学を使ったオブジェクトレベルの言明

## 2-2. 完全性定理
「`T` ⊢ `A`（Tを公理としてAが証明できる）」を「`T` ⊨ `A` (Tが成立するときには Aが成立する)」と同一視してよいことを保証するのが完全性定理。完全性定理が成立しない場合もあるけれど、普通の数学では成立するので、概念的に異なる ⊨ と ⊢ を同一視しても、変なことにはならない。（注：ゲーデルの不完全性定理とはまた別の話）

以上2-1.2-2 より、以下は通常同一視して構わない:

- `A`を仮定するならば`B`が証明できる
- `A`が成立するならば`B`が成立する
- `A→B`が証明できる
- `A→B`が成立する


## 2-3. 対偶証明
対偶証明と呼ばれる論法は、前述の演繹定理を使って正当化できる。つまり、「`A`ならば`B`が成立する」は「`A→B`が成立する」と言い換えてよい。あとは真理値表を使うと、「`¬B→¬A`が成立する」と言い換えてよく、これに再度演繹定理を使えば「`¬B`ならば`¬A`が成立する」と同一視できる。

## 2-4. 可証性述語
既にみたように、「`A`ならば`B`」というメタな文は `A→B` というオブジェクトレベルの文に変換できる。では同様に「`T`を仮定するならば`A`は証明可能」というメタな文での ならば＝「 ⊢ 」はオブジェクトレベルに落とし込めるのだろうか？

答えはできる場合とできない場合がある。ペアノ算術や集合論では可能。可証性述語`Pr`とよばれ。不完全性定理への第一歩。

可証性述語を使うと、演繹定理を形式化できる（論理式として書ける）。つまり、形式化された演繹定理は `PrA("B") ↔ Pr("A→B")` ここで `PrA` は 議論の土台となっている理論に`A`を定理として組み込んだ理論における可証性述語であり、 クォーテーション`"`で囲まれた表現は、クォートされた論理式のゲーデル数を表す数である。

# 3. 参考文献とまとめ
菊池『不完全性定理』の2章と9章において、`→`の真理値表が納得がいきにくい理由を論じていたり、`→`を定理に ⊢ を証明を対応付けて考察しており、大いに刺激を受けた。また標準的な論理学の教科書でも、ここに記載されていることがある程度考察されている。例えば野矢『論理学』。

コメントや議論はウェルカムです。
【超初心者】Rails×Vue.jsファイルの内容あれこれ

Railsが学習ひと段落し、Vue.jsの学習をはじめました。
Vue.jsの学習では、Udemyの講座でHTML,CSS,JavaScriptファイルを編集しながら、Vue.jsの理解を深めていきました。終盤では、HTMLファイルのみを使い、コンポーネントという概念を使っています。

ある程度基礎の理解をしたので、既存のRailsアプリを使おうとしますが、Railsで独自で作成されたファイル(app.vueやhello_vue.js)の内容がよくわかりません。

ということで、RailsでVue.jsを利用するための各ファイルは、Vue.js単独で利用するときの場合とどのように関連しているのか、整理していきます。

# （前置き）環境構築
環境構築は下記の記事に従い完了。

### RailsとVueの取り込み
[Rails5.1, Vue.jsで動かしてみる](https://tech.mof-mof.co.jp/blog/rails-vue.html)

### webpack-dev-serverの起動
[【動画付き】Rails 5.1で作るVue.jsアプリケーション ～Herokuデプロイからシステムテストまで～](https://qiita.com/jnchito/items/30ab14ebf29b945559f6)

# ファイルの役割と構成
## app/javascript/packs内のファイル

```
app/javascript/
└── packs
    ├── app.vue
    ├── application.js
    └── hello_vue.js
```

### app.vue

単一コンポーネントファイルであり、Vue.jsで言う所の「コンポーネント」の理解が必要になる。

ざっくり言うと、HTML,CSS,JavaScript丸ごと1つのファイルにまとめ、機能ごとにファイルを分けられる。

```app.vue
<template>
  <div id="app">
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data: function () {
    return {
      message: "Hello Vue!"
    }
  }
}
</script>

<style scoped>
p {
  font-size: 2em;
  text-align: center;
}
</style>
```

## hello_vue.js

hello_vue.jsは上記のapp.vueを読み込んで、Vueのオブジェクトを作成している。

```hello_vue.js
import Vue from 'vue'
import App from './app.vue'

document.addEventListener('DOMContentLoaded', () => {
  document.body.appendChild(document.createElement('hello'))
  const app = new Vue(App).$mount('hello')

  console.log(app)
})
```

## Railsファイル

### ERB(Slim/Haml)

下記ファイルを追記することで、読み込める。

`<%= javascript_pack_tag 'hello_vue' %>`

全ファイルで読み込みたい場合は`application.html.erb`だし、個別ファイルで読み込みたい場合は例えば`home.html.erb`となる。

```home.html.erb
<h1>Page#home</h1>
<p>Find me in app/views/page/home.html.erb</p>
<%= javascript_pack_tag 'hello_vue' %>
```

### routes.rb

```routes.rb
Rails.application.routes.draw do
  root 'page#home'
end
```

### page_controller.rb

```page_controller.rb
class PageController < ApplicationController
  def home
  end
end
```

## （応用）複数のコンポーネントを作る場合

下記ファイルを複製し、変更する必要がある。

- `app.vue`
- `hello_vue.js`の`app.vue`の読み込み
- `html.erb`の`hello_vue.js`の読み込み

#　参考

[Rails5.1＋Vueで何か作る前の基礎勉強](https://qiita.com/magaya0403/items/1a2309b0e02fae95a5b1)
vimで存在する・存在しない行に特定のコマンドを実行する（:v, :g）

:g（存在する行）:v（存在しない行）に対してコマンド実行する方法よく忘れる。

# コマンドの詳細
[Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/vimindex.html)の"基本的な編集" - "repeat" - "多重繰り返し"を参照。
:gの詳細

```
:[range]g[lobal]/{pattern}/[cmd]
:[range]g[lobal]!/{pattern}/[cmd]  <-- :vと同義語
```

:vの詳細

```
:[range]v[global]/{pattern}/[cmd]
```

[range]は検索範囲。未設定はすべての行を対象に。
[pattern]は正規表現で検索対象の文字を設定。
[cmd]はExコマンド（いわゆる":"から始まるコマンド）を設定。

# でもここまで書いておいて・・・
実際に使うのって行の削除が主だと思うの。

ある文字を含む行だけ削除

```
:g/{pattern}/d
```

ある文字を含む行以外を削除

```
:v/{pattern}/d
```

空白の行をすべて削除（使うことが多い）

```
:v/./d   <--　つまり一文字に一致しない行＝空白行
```
ハッカリントに参加してスマートロックのAPIクライアントライブラリを作った話

# 進捗と成果
SESAMEのクライアントライブリを開発してきました。

# ハッカリントとは？

> ハッカソンより短時間でプログラミングに没頭するのがハッカリント
> 引用元：<https://co-lony.jp/pickup/575/>

今日は11時から14時の3時間+αで参加してきました。
参加人数は6~7人ほどでそれぞれテーマに沿って作業を進めました。

# 今回のテーマ
「今回は「[Sesame](https://jp.candyhouse.co/)」というオートロックのAPIを**Amazon Dash**やUIで操作する。」というテーマでした。
僕自身、こういうIoTは前から興味があったので想像以上に楽しめました。

# 環境
| 役 | 人数 |
|:-:|:-:|
| APIを試す人  | 2人  |
| Ruby on RailsでAPIを叩くAPIを作る人  | 2人  |
| サポート  | 1人  |
| フロント  | 1人  |

僕は「APIを試す人」としてTyepScriptでSesameのライブラリを作ってました。

# 自分の進捗というか成果
前述したとおり僕は**SesameをTypeScript(JavaScript)から操作するライブラリ**を作りました。
[リポジトリはここです](https://github.com/hota1024/node-sesame)
そのうちこのライブラリに関する記事を書く予定です。

AWS Lambdaからこのライブラリを呼び出すことでAmazon Dashに対応させ、無事にボタンを押すとロックを解除することができました。

# 感想と反省
これまで、なかなか複数人で開発するという経験がなかったので新鮮な気分で開発することができました。
自分一人で開発するよりも複数人で機能や設定を作ったほうが、モチベーションも保ちやすくて、コミュニケーションがたくさん取れて楽しい開発をすることができました。

反省としては、もうちょっとテストコードをしっかり書けるようになりたいです。

# まとめ
今回、たくさんの経験や刺激を得ました。今回の経験を最大限に活かしていきたいと思います。
ORA-28000: アカウントがロックされています

# 誰だOracleアカウントロックしたの

今なら怒らないから名乗り出なさい。

ただし、ロックした当人が気づいていないパターンが多い。理由は後述。

# 調査開始

誰も名乗り出ないので調査開始です。

## Oracleのログはイベントビューア

以降の内容はWindows Server限定です。
Windows Serverの場合、Oracleの各種ログはイベントビューアで見ることができます。

Oracle._SID_というソースでアプリケーションログに記録されるので、これでフィルタしてファイル保存すると調査がしやすくなります。証跡として取っておくのもいいかもしれませんね。

## エラーコードで検索

多くの場合はパスワード誤りです。
`ORA-28000: アカウントがロックされています` の直前にある `ORA-01017: ユーザー名/ パスワードが無効です。ログオンは拒否されました。` を探します。

よく見ると接続元ホスト名が出ているのがわかりますかね？

## ホスト名を大きな声で叫んでください

誰も名乗り出なかったら「顧客支給品管理簿」や「端末管理台帳」でも見て利用者を特定してください。

# 是正指導開始

いわゆるお説教タイムです。

## 原因の特定

原因は大きく分けて２つ。

* ローカル動作環境や接続ツールなど、自動的にOracleへ接続するものの設定が誤っている
* パスワードを５回間違えたことに気づかない

多くの場合は前者なので、これらの設定を徹底的に洗ってください。環境依存ファイルが当たっていないとか、他の環境向けの設定になっているとか、そんなのばかりです。どこを間違えたのかちゃんと理解させてください。
滅多にありませんが、後者はよほど疲れているかよほどアホかのどちらかなので、上司に報告して今日はもう帰ってもらってください。

## 再発防止

前述の調査手順もすべて明かした上で全メンバーに周知し、管理者からは逃げられないということを身体で覚えさせてください。
AWS Athenaを使ってCloudTrailのログを自分で設定した項目について解析したメモ


# 前提
Athenaのこと、きちんと理解できていないかもしれません。以下の記述はその場しのぎでうまくいっただけの可能性があります。

# やりたいこと
CloudTrailのログを必要な項目だけで解析したい。

# 最初にやってうまくいかなかった方法

ColudTrailの`イベント履歴`から`Amazon Athena で高度なクエリを実行します`で自動作成されるAthenaのテーブルは、自分で項目を追加することができませんでした。

```
CREATE EXTERNAL TABLE [TABLE_NAME] (
    eventVersion STRING,
    userIdentity STRUCT<
        type: STRING,
        principalId: STRING,
        arn: STRING,
        accountId: STRING,
        invokedBy: STRING,
        accessKeyId: STRING,
        userName: STRING,
        sessionContext: STRUCT<
            attributes: STRUCT<
           (中略)
    sharedEventID STRING,
    vpcEndpointId STRING
)
COMMENT 'CloudTrail table for [S3_BUCKET_NAME] bucket'
ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde'
STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '[S3_BUCKET_URL]'
TBLPROPERTIES ('classification'='cloudtrail');

```

ここで指定している項目(例えば `userIdentity.type` など)以外は、いくら上記の`CREATE TABLE`の内容をコピペしてAthenaで直接必要な項目を追加してテーブルを作成しても、クエリ(SELECT)時にその追加した項目を指定すると構文エラーが起こってしまいました。

どうも　`ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde'`でSerDeをCloudTrailSerdeを指定すると、デフォルトの項目しかシリアライズ・でシリアライズしてくれないもようでした。

# うまくいった方法

以下の記事を見つけて解決

[CloudTrailログからAmazon Athenaを使ってログイン監査レポートを作成する](https://dev.classmethod.jp/cloud/aws/cloudtrail-audit-report-by-amazon-athena/) 

こちらの記事では、SerDeを`ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'`を指定し、CloudTrailのログJSONファイルのから取得していました。


```SQL:上記記事より引用
CREATE EXTERNAL TABLE IF NOT EXISTS records_201702 (
  records ARRAY<
    STRUCT<
      eventTime:STRING,
      eventSource:STRING,
      eventName:STRING,
      awsRegion:STRING,
      sourceIPAddress:STRING,
      userIdentity:STRUCT<
        type:STRING,
        arn:STRING
      >
    >
  >
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://[CloudTrailログ出力バケット名]/[prefix指定があれば]/AWSLogs/[AWSアカウントID]/CloudTrail/[Region]/2017/02';
```

こうしたらうまくいきました！

ちなみにクエリーは、`records[]`に複数含まれる`STRUCT`を取得する必要があるので、以下のようになります。


```SQL
SELECT \
  record.eventTime, \
  record.eventName, \
  record.userIdentity.type, \
  FROM JOIN UNNEST(records) AS t (record) \
WHERE record.eventName = 'GetObject' \
LIMIT 10;
```

上記はS3のGetObjectイベントだけ10件取得するクエリーです。

# 最後に
Athenaのことをきちんと理解できていれば、もっとスマートなやり方がある
のかもしれません。もし記述した内容に間違いがあればすぐ訂正いたしますので、ご指摘いただければ嬉しいです。
【WPF】MVVMの仕組みでComboBoxの選択値をバインドする

C#erを自称しているのに、WPFやったことないなって思い始めてみました。
まずはだいたいどのアプリでも使いそうなComboBoxと値のバインドの忘備録。

コードは現在開発中の [Reseacher](https://github.com/nqdior/Reseacher) のコードから抜粋。

#### ViewModel

MVVMだしViewModel使いますね。
MVVMとは？って方は [この記事](https://qiita.com/nia_tn1012/items/de5c8f83f9a638f6e44e)など参考にしてください。

```csharp:ComboBoxViewModel.cs
using System.Collections.ObjectModel;

namespace Reseacher
{
    public class ComboBoxViewModel
    { 
        public ObservableCollection<Server> ServerItems { get; set; }

        public ComboBoxViewModel(ServerRack serverRack)
        {
            ServerItems = serverRack;
        }
    }
}
```

ServerItemsプロパティがComboBoxにバインドしたいクラスです。
内部には `string Name { get; set; }` プロパティを保持しています。

上記コードで肝になるのが `ObservableCollection<T>`。
こいつはList<T>などと同じでT型の配列を持てます。
違うところは **コレクションに変更があった場合にイベントを発火する** ところ。
何が嬉しいかは以下で説明します。まずは上記Boldのところだけ覚えておきましょう。

### Xaml

```xml:DataGridViewPage.xaml
            <ComboBox x:Name="serverComboBox"
                      ItemsSource="{Binding ServerItems, Mode=OneWay}"
                      Grid.Column="1"
                      DisplayMemberPath="Name"/>
```

**Name**
オブジェクトの固有名称を表します。

**ItemSource**
今回バインドしたいプロパティ。`ComboBoxViewModel.cs` のグローバル変数ですね。
Modeオプションについては一方向か双方向を選択できます。詳しくはMSDN参照。
[方法: バインディングの方向を指定する](https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/data/how-to-specify-the-direction-of-the-binding)

**DisplayMemberPath** 
「ItemSourceで指定したプロパティの中のどのプロパティを表示するか」を設定します。

フォームアプリケーションと違ってタグでさっぱり書けるのがいいですね。
手動でInitializeComponent触らなくていいのが嬉しいです。


### バインド

```csharp:DataViewPage.xaml.cs
            var model = new ComboBoxViewModel(Nucleus.ServerRack);
            serverComboBox.DataContext = model;
```

ViewModelのインスタンスを生成します。
自分はStaticClassの値をバインドしたかったのでコンストラクタで渡して処理していますが、
ViewModelクラスのプロパティに値が設定できればなんでも構いません。

生成後、XAMLで作成したオブジェクトのDataContextにViewModelを渡します。
これで実行すれば、以下の通りバインド処理が走ってコンボボックスが表示できます。
1. ViewModel内のプロパティ`ObservableCollection<T>`がコンボボックスにバインドされる
2. T内のNameプロパティがコンボボックスの描画欄に描画される

双方向バインディング
---

ここからがキモです。
上の方で話していた通り、ObservableCollectionの何が嬉しいかを解説します。

例えば、コード側でObservableCollectionのItemを一つ削除したとします。
Formアプリケーションの方なら、「同期のために画面のComboBox側のItemも削除しなきゃ･･」となるでしょう。

**ObservableCollectionでは不要です。**
ObservableCollectionに対し、追加・削除が行われた場合、変更通知イベントが着火します。
それがView側に通知され、View側のComboBoxの値が自動的に変更されます。
また、画面側から値が追加・削除された場合も同じです。双方向バインディングですね。

一点注意が必要なのが、
**コレクションのアイテムのプロパティが変更された場合はObservableCollectionで拾えません。**
その場合は `INotifyPropertyChanged` を使用します。
詳しくは次回以降で。

C#はしくみは良いけどForm側がイマイチだなと思っていたので、WPFの仕組みは素晴らしいですね。
一方向の仕組みですが、Reactっぽいなと思うところがチラホラ。

双方向バインディング便利すぎて脳汁出た。
【初学者向け】Railsアプリケーションにカスタムフォントを追加する方法

*本記事執筆時点での私の環境はRuby 2.6.3p62, Rails 5.1.6です。環境が違う場合同じ様に動作しない場合もありますのでご注意下さい。


アプリケーションがある程度仕上がり始めると、デフォルトのつまらないフォントがつまらなくなってくることもあるかと思います。
![スクリーンショット 2019-07-20 23.28.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433449/9ba46908-bddf-55be-d0e3-a7181dee58e8.png)
もう一歩足りないランディングページ。。。
Railsでは外部で配信されてるカスタムフォントを簡単に導入して自由に使うことができます◎
順を追ってかんたんに説明します💡

①フォントを用意する
グーグルで検索する(フォント フリー等)と面白いフォントがゴロゴロ転がってます。気に入った物を早速ダウンロードしてみましょう。
私は銀魂次回予告体(http://fontlab.web.fc2.com/sweetheavycalligraphy.html)なる物を拾いましたので、こちらを使用します。
ダウンロードしたフォルダを開くと以下のようなファイルが収納されていました。
拡張子ttfが付いているファイルがフォントの入ったファイルになりますのでこちらを使用します。(ttfではなくotfファイルが存在している場合もあります。その場合はそれを使用して下さい。)
![スクリーンショット 2019-07-20 23.38.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433449/8eac5222-68f4-7bef-97f2-ee5f7b859afe.png)

②app/assetsフォルダ配下にfontsフォルダを作成
app/assetsフォルダ配下にjavascriptsフォルダやstylesheetsフォルダと並んでfontsフォルダを作成します。
そしてその中に先ほどダウンロードしたttfファイルを配置します。
![スクリーンショット 2019-07-20 23.46.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433449/f5ff7f76-f8a0-41f4-2977-66f1f8cb907a.png)
fontsフォルダ内にkssweetheavycalligraphy.ttfファイルを配置。他の三つは別用で使用しているファイルなので気にしないで下さいm(_ _)m

③CSSにフォントファイルの読み込みを記載
CSSに使用するファイルを以下の様に記載します。
利用したい部位によって適切なファイルを選択して下さい。今回はapplication.scssに記載します。
![スクリーンショット 2019-07-20 23.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433449/88d49d14-31cd-432a-a774-7bb26bdee67f.png)
ここで注意！！！
指定方法は'/assets/~~~~~.ttf'であり、'/assets/fonts/~~~~~.ttf'ではありません。私はここで小一時間詰まりました🙃

④フォントを変更したい箇所のCSSにfont-familyを指定する
最後に使用したい箇所のCSSにfont-familyを指定します。
![スクリーンショット 2019-07-21 0.12.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433449/9093030b-08de-64d6-3ad7-e75241ea68fd.png)
フォントのサイズ等もここで指定できます。

結果
![スクリーンショット 2019-07-20 21.10.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433449/09db3471-ee26-0a88-155e-49f40e8a61ce.png)
良き具合に仕上がりました◎
node.jsのプログラミングをするために準備するツール

重い腰を上げてようやくnode.jsでのプログラミングを楽しもうという事で、まずは楽しむために準備する愛らしいツール群をまとめる。

### [Git for Windows](https://gitforwindows.org/)

私は元々linuxベースのエンジニアだったが現在はWindowsの世界どっぷりで、手元のPCもWindows、会社のPCもWindows。

だがプログラミングを楽しむためにはshellは欲しい。
Windowsで動作するshellとしてCygwin、MinGW、Git for WindowsがあったがWindowsのディレクトリ構成に自然にマッチした形で利用できたのはGit bash。
使ってみたところ、何もせずに日本語も対応しているし。高度にUnix/Linux環境じゃないとダメという事もなく、普通にお手軽にshellが利用できればよいからこれで確定。

### vim（Git for Windowsに標準のツールなのでリンクなし）

エディターはGit bash標準のvimを利用することにした。Git bashインストール時に標準で利用でき、かつデフォルトで日本語にも対応している。最近はVisual Studio Codeなるフリーの高機能エディターが幅を利かせてきており、vimプラグインもいっぱいあり、vimチックに利用できるが私の感覚ではとにかく重い。。。vimプラグインをインストールして様々なvim機能を利用してみたが、かなりモッサリしている事と、たまに「Activating extentions...」的なメッセージが表示され、vimプラグイン（キーバインディング）が有効化されるのが起動後数十秒待たされるのは勘弁ならぬ。

vimを使ってnode.jsプログラムを開発するための準備はいくつかの方が既にアップしてくださっているので参考までにlinkする。（後でしっかり参考にさせて頂きます）

[Node.js開発のためのvim設定](https://qiita.com/hisayuki/items/b0d60168975d7cc8cbce)
[Node.jsをVimで書く時に設定したことメモ](https://qiita.com/toshihirock/items/39ee62ddee2eb997f7b7)
[vimrcをカスタムしてnode.jsの開発環境を作る](https://www.kato-eng.info/entry/vimrc)
[Node.vim](https://github.com/moll/vim-node)

### ESLint(npmでインストールするのでリンクなし)

2000年前半で開発環境の知識がストップしている私にとって、「これ何？」って感じのもの。JavaScriptの構文チェック的なものとしか認識していないが、今後徐々に明らかにしていく。
これはnode.jsのパッケージ管理ツールnpmでインストールする。

```
$npm install -g eslint
C:\Users\satom\AppData\Roaming\npm\eslint -> C:\Users\satom\AppData\Roaming\npm\node_modules\eslint\bin\eslint.js
+ eslint@6.0.1
added 121 packages from 75 contributors in 22.636s
```
npm自体も慣れないツールで、上記コマンドでインストールしたという事は理解できるが、具体的に何が行われたのか詳細がわからない。
後で確認することにしよう。

### [node.js](https://nodejs.org/ja/)

当然node.jsもインストール。
私のポリシーとして、インストールするツール群は常に$home/appsというフォルダーと決めている。今回はGit bashを利用するので、「C:\users\satom\apps」にインストールすればよかったのだが、元々MinGWを利用していたため、c:\mingw\msys\1.0\home\username\appsにしてしまった。。。

とりあえずまずはこれぐらいからスタートしよう。
強くお勧め！PAD図ならブレない！！フローチャート、アクティビティ図だと制御構造表現がブレる

# PAD図ってご存じですかね？

順次、選択、反復といった制御フローをブロック単位で表現し、それらを直列または入れ子状に配置する事でプログラムの構造を図示するものと言えばよいでしょうか。

---

私の場合、制御構造を図示するときにはPAD図一択です。何故か？フローチャートやアクティビティ図だと、注意して書かないと表現がブレるからです。PAD図は誰が書いても同じ表現になります。ちょっと言いすぎかもですが、表記に縛りがあるので、同じ表現に落ち着きます。
なので、強くお勧めしたいです

---

また、PAD図で書いた制御構造は、Scratchと相性が良いです。ほぼそのまま写像できる感じです。(Scratchを使うならPAD図を書く意味がないので、身もふたもないですが・・・)

---

詳しい話は、次を参照してもらうとして、フローチャートとPAD図を比較してみて、その良さを感じてみてください。
(UMLのアクティビティ図もフローチャートと同じように下記のような良くないところがあります)

---

# FizzBuzzをフローチャートとPAD図で書いてみる
FizzBuzz問題を次のように定義したとします。

```
1から100までの数字を順番に表示してください。
ただし、3の倍数のときは「Fizz」、
5の倍数のときは「Buzz」、
3と5の公倍数のときは「FizzBuzz」と表示してください。
```

これを、フローチャートとPAD図で書いてみて比較してみます。

---

## FizzBuzzをフローチャートで表現-その１
条件分岐のYesを下に、Noは右に。ループの戻りは左側。というように注意して書いたフローチャートです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76786/a9330ab1-a695-256a-41fd-7d3409cc1532.png)

---

## FizzBuzzをフローチャートで表現-その２
条件分岐のYesを右に、Noは下に。ループの戻りは右側。というように注意して書いたフローチャートです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76786/680807b6-8301-af02-6c7f-46f05957168c.png)

---

## FizzBuzzをフローチャートで表現-その３
条件分岐表現のルールなし、ループ表現ルールなし。わけがわからないフローチャートです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76786/d37c90b3-45e0-134d-5c29-78e714f1b9db.png)

---

## PAD図-その１
ループの制御構造は入れ子で表現。条件分岐は上がYes、Noが下。という縛りがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76786/4eba8ece-32c9-570b-3c69-1847fda28b29.png)

---

## PAD図-その２
case文の表現ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76786/0f95fb65-2e8f-7d79-93f3-d6f5f883ceac.png)

---

## Scratchで表現

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76786/1b605d5c-5897-4fb0-ca3e-323149060eaf.png)

---

# 考察
+ フローチャートは、注意して書かないと訳が分からなくなる(その３)。
+ フローチャートは、表現の縛りを入れれば見やすくなるが、Yes下派かYes右派か、ループ左派か右派かで見え方が変わるので、同じ制御構造に見えない(その１とその２)
+ PAD図は表現に縛りがあるので、表現にブレがない。
+ Scratchの制御構造とPAD図で書いた制御構造は同じ(と言ってよい)。

実は、投稿後に気づいたのですが、上記のフロチャート、PAD図、Scratchのいずれかにはバグがあります。
ちゃんと動作するのはどれでしょうか？

<details><summary>解答</summary><div>

ちゃんと動くのはScratchです。

</div></details>

ここからちょっとした気づきがあったのですが、どんなに良い表記であっても実際に動かしてテストできないものはダメなんだなぁと。

これまで、PAD図をどんな時に書いていたか振り返ると、他人の書いたコードを理解するために書いていました。
つまり、先にソースコードがあって、その後で作図していました。

昔々のその昔、ソースコードの入力がパンチカードくらいの昔。よく制御構造を考えずに、いきなりパンチカードにコーディングして、うまく動かなかった時のコストがばかにならなかったので、机上でフローチャートを書いて、頭の中でデバッグして、いよいようまくいくと納得してからパンチしていたそうです。

つまり当時は先に図を書いてからコードを書いていたと。

コンピュータが安価になり、手軽にソースコードが書けるようになったので、PAD図などで図示する局面はそうとう稀になりましたが、「理解」を助けるツールとしては有用ですので、これからも使っていくでしょう。

---

# 参考

PAD図の書き方などは、次のURLが参考になります。

[素晴らしいPAD図 | ある計算機屋さんの手帳](http://my-web-site.iobb.net/~yuki/book/bit-pad/ "http://my-web-site.iobb.net/~yuki/book/bit-pad/")
CSSで要素を真ん中に配置する方法とは？

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしています。
今回はCSSで要素を真ん中に配置する方法を解説します。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください！

#CSSで要素を真ん中に配置する方法
要素を真ん中に配置するためには`text-align:center`を利用します。

##文章の場合
`text-align:center`の指定先を文章が含まれる要素、もしくは親要素にします。

##写真の場合
`text-align:center`の指定先をimgタグではなく、親要素にすることで、写真を中央寄せにできます。

#blockの要素を真ん中に配置
ブロック要素に`text-align:center`を指定しても、ブロック要素全体は真ん中に寄りません。
そのため、marginプロパティを利用して真ん中に配置します。

```console
margin-left:auto
margin-right:auto
```
上記のCSSをブロック要素に対して指定すると、ブロック要素を真ん中に配置することができます。

#まとめ
今回は要素を真ん中に配置する方法についてご紹介しました。
これからもフロントエンドを勉強していきます！
10パズル（４つの数字から四則演算で10を作る！）その２

## 10パズルの解を調べる！の続き

前回作ったものはあまりに遅かったので，ちょっとコードを改良することにしました。

https://qiita.com/dannchu/items/a1d93b44405143c5be3d


## 前回のコード

```Julia:rpn2(s)
function rpn2(s)
    stack = Any[]
    for op in map(eval, map(Meta.parse, split(s)))
        if isa(op, Function)
            arg2 = pop!(stack)
            arg1 = pop!(stack)
            push!(stack, op(arg1, arg2))
        else
            push!(stack, op)
        end
        #println("$op: ", join(stack, ", "))
    end
    length(stack) != 1 && error("invalid RPN expression $s")
    return stack[1]
end
```

```Julia:test3()
function test3()
    stack=Any[]
    mklist=["+","-","*","/"]
    @time for i=0:9,j=0:9,k=0:9,l=0:9,mk1∈ mklist,mk2∈ mklist,mk3∈ mklist
        if rpn2("$i $j $mk1 $k $mk2 $l $mk3")==10
            push!(stack, sort([i,j,k,l]))
        elseif rpn2("$i $j $mk1 $k $l $mk2 $mk3")==10
            push!(stack, sort([i,j,k,l]))
        elseif rpn2("$i $j $k $l $mk1 $mk2 $mk3")==10
            push!(stack, sort([i,j,k,l])) 
        else
        end
    end
    # println(m)
    @time m=unique(stack)
    @time n=length(m)
    println(n)
    @time for i=1:n
    println(m[i][1],m[i][2],m[i][3],m[i][4])
    end  
end
test3()

300.455424 seconds (194.31 M allocations: 6.866 GiB, 0.21% gc time)
  0.103924 seconds (295.01 k allocations: 14.552 MiB, 2.53% gc time)
  0.000000 seconds
552
0019
0025
0028
.
.
.
8999
9999
  0.050996 seconds (91.19 k allocations: 3.792 MiB)
```


前のコードの時間を計ってみるとちょうど5分（300 seconds）でした。


## 今回のコード


逆ポーランド記法で利用した関数``rpn2``が遅いのかと考えて，その部分を今回利用するところだけ書くことにしました。

```Julia:test4()
function test4()
    stack=Any[]
    mklist=[+,-,*,/]
    @time for i=0:9,j=0:9,k=0:9,l=0:9,mk1∈ mklist,mk2∈ mklist,mk3∈ mklist
        if  mk3(mk2(mk1(i,j),k),l) ==10
            push!(stack, sort([i,j,k,l]))
        elseif mk3(mk1(i,j),mk2(k,l))==10
            push!(stack, sort([i,j,k,l]))
        elseif mk3(i,mk2(j,mk1(k,l)))==10
            push!(stack, sort([i,j,k,l])) 
        else
        end
    end
    # println(m)
    @time m=unique(stack)
    @time n=length(m)
    println(n)
    @time for i=1:n
    println(m[i][1],m[i][2],m[i][3],m[i][4])
    end  
end
test4()

  0.380766 seconds (2.35 M allocations: 39.753 MiB, 12.75% gc time)
  0.006553 seconds (304 allocations: 35.734 KiB)
  0.000000 seconds
552
0019
0025
0028
.
.
.
8999
9999
  0.017615 seconds (32.36 k allocations: 889.469 KiB)
```

結果はなんと``0.380766 seconds``です。ざっくり$\frac1{1000}$です。こんなに違うんですね。

大した工夫はしていないのですが，びっくりです！
WordPressの備忘録

AWSでEC2にWordpress環境を構築して色々勉強する。

# インストール
Amazonのチュートリアルを参考にインストールする
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/hosting-wordpress.html

# トラブルシューティング

### 日本語化されていない
以下のサイトを参考にした


### SSL化したらログインページが表示されなくなった。
以下の設定で解決した。

```tex:wp-config.php
$_SERVER['HTTPS'] = 'on';
```

### SSL化してログインページが表示されたけど、管理者ページが表示されなくなった。

追加した場所が悪かった。
下記の設定の下(一番下)に「$_SERVER['HTTPS'] = 'on';」を追加していたが、下記の設定の上にする必要があった。

```tex:wp-config.php
if ( ! defined( 'ABSPATH' ) ) {
        define( 'ABSPATH', dirname( __FILE__ ) . '/' );
}
```
### テーマがダウンロードできない

FTPの設定画面が表示される。EC2は証明書でログインしているので、パスワード指定が無い。
以下の設定でFTPのパスワードが面は出てこなくなった。

```tex:wp-config.php
define('FS_METHOD','direct');
```

が・・・

### テーマのインストールに失敗する。
「define('FS_METHOD','direct');」の設定後、テーマのインストールを行ったら、「インストールにしっぱいしました：ディレクトリを作成できませんでした。」が表示された。

chown nginx:nginxとか、SELinuxが有効になっていないかなど確認したが、解決せず。

無理やりだが以下で解決

```sh
sudo chmod -R 777 wp-content/
```

### 新規投稿のプレビューが終わらない
贈り物としてのプログラミング

※技術的なことはこの記事では触れません

とあるスマホオンラインゲームが好きで、所謂ギルドに所属しており複数名の方と交流しながら楽しんでいます。
そんな中ゲーム仲間のお一人がリアルでご結婚されるというお話がありました。

リアルでの面識は一切なく、チャットでのやり取りしかしたことがありません。
きちんとお祝いをしたくても、当然個人情報を伺うわけにもいきません。

そこで『Webを使った贈り物をしよう』と提案がありました。
オンライン申し込みできるお祝いサービスはあるのですが、多くが受付のみWebでモノはリアルというものばかりでした。

幸いに広告のつかない無償のレンタルサーバはいくつかあるので、結果的に自作しようということに。
仕様の条件としては以下。
・スマホのブラウザで動作すること
・フォルダごとダウンロードしてオフラインでも見てもらうことができること

ゲームがRPGなので、宝箱を発見して開けたら音楽が流れ、色紙が表示されるという単純なものですが、
jsでCSSのパラメータを視覚上丁度良くなるように制御するのがなかなか骨が折れた記憶があります。

動画であれば見る、という一方通行な成果物しかできませんが、
プログラムすることで受け取っていただく方に体感していただける作品となり、非常に良い贈り物になりました。
最終的にはオンラインストレージの共有機能を使ってzipファイルでお渡しさせていただきました。

昨今ネットのみの繋がりも当たり前になっている中、現代的で贈り物の新しいカタチだなぁと作りながら感じました。
GUIで誰でも簡単に作成できるようなオンラインサービスが生まれれば、今後需要はあるかもしれませんね。
Word for Mac でのショートカットキー Ctrl + K の設定

Word for macでは、普段よく使うショートカットキーの`Control-K`だけ、マクロで設定しなければならず初心者には分かりにくかったので備忘録として置いておきます。
基本的には、[こちら](https://medium.com/@inu_ga_suki/word-for-mac-2016%E3%81%A7emacs%E9%A2%A8%E3%81%AE%E3%82%AD%E3%83%BC%E3%82%A2%E3%82%B5%E3%82%A4%E3%83%B3-mac%E6%A8%99%E6%BA%96-%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B-e6cb7508b522)のサイトを参考にしています。

**マクロ作成手順**
1. `ツール > マクロ > マクロ...`を開く。
2. マクロの保存先を`Normal.dotm(全文書対象のテンプレート)`にする。
3. マクロ名をDeleteOneLineのように任意で設定する。
4. 実行をクリックすることで、Visual Basic Editor (VBA)が自動で開くので、以下を記述する

```vb
Sub DeleteOneLine()
    ' カーソル以降の現在の行をカット
    Selection.EndKey Unit:=wdLine, Extend:=wdExtend
    Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Selection.Delete
End Sub
```
これによって`Control-K`と同じ役割のマクロが作成される。
あとは`ショートカットキーのユーザー設定`から`Control-K`にこのマクロを割り当てることで使用できる。

[参考にしたコード](https://medium.com/@inu_ga_suki/word-for-mac-2016%E3%81%A7emacs%E9%A2%A8%E3%81%AE%E3%82%AD%E3%83%BC%E3%82%A2%E3%82%B5%E3%82%A4%E3%83%B3-mac%E6%A8%99%E6%BA%96-%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B-e6cb7508b522)をほんの少しだけ書き換えています。
文末にある改行コードまで削除してしまうのを`Selection.MoveLeft`で防いだだけです。
もう少し良い方法がありそうです。
自力でリバーシ(オセロ)を作っていく#02

#前回までの進捗
[自力でリバーシ(オセロ)を作っていく#00](https://qiita.com/taniguchi06/items/fb4c7a5426625a4887d5)
[自力でリバーシ(オセロ)を作っていく#01](https://qiita.com/taniguchi06/items/6d25a4055a5fa0ea1f8d)

前回作った処理は以下の通りです。

- 8*8のマス描画
- クリックで石置ける
- ヨコではさまれたら色変更

ヨコで挟んだ時の処理を個々で書いていたので、まとめたいな〜とか思っていました。
こういった部分も含め今回の進捗から記録していこうと思います。

#進捗
作業時間は3時間ほどでした。
今回作った処理は

- 石を置く座標を取得する処理と、色変更する処理を分けて、ヨコで挟まれた時の処理を関数にまとめた
- タテで挟まれた時に色変更
- 斜めの1方向で挟んだ時に色変更

以上の3つです。

#作った処理の流れ説明
今回は3つの処理を1つずつ見ていきます。

## ヨコで挟まれた時の処理を関数に
まず、タテで挟まれた時に色変更する処理は、ヨコで挟んだ時とほとんど同じになるので、ヨコで挟んだ時の処理を整理するところから始めました。

前回はfor文のなかで、クリックしたマスの座標を取得して、そのままその中で石の色を変更する処理を書いていました。

今回では、for文の中で取得した座標をvar currentXCoord、 var currentYCoordとして変数に格納しました。
これで、この座標を引数にして、挟んだ時の処理を関数にまとめることができました。
関数の中はまだ汚いままなんですけど、メインの部分が見やすくなったのでとりあえず良しとします笑

また、黒石の間に白石が詰まっているかの判定では、前回は間のそれぞれのマスに白石があったかどうかの結果を別々の変数に格納していました。
ただ、これでは変数の数も無駄に多くなってしまうので、配列にtrue/falseの値を入れて、全部がtrueの時に色変更の処理をするようにしました。

```javascript:JavaScript
array.every(item => item == true)) {
  forLeftReverse(2);
}
```

##タテで挟まれた時に色変更
タテで挟まれた時に色変更する処理は、ヨコで挟まれた時に色変更する処理で、座標のXとYの部分を反転させるだけだったのですぐできました。
ただ、関数としてはバラバラになっているので、もう少しまとめられたらいいなあと思います。

処理の流れを復習がてら整理した画像がこちら。
![横ハサミ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462701/a6b11bd8-d9e1-6fd7-8c18-a7d50e07197f.png)

##斜めの1方向で挟んだ時に色変更
斜めで挟んだ時の処理は、タテとヨコで挟んだ時と同じ感じにしたかったんですよね。
その方が最後に、処理を綺麗にまとめられそうだったので。
ただ、タテヨコの処理で最初にしている、同じX座標の黒石を取得みたいな処理が斜めでどうすればいいかわかりませんでした。
「傾きが1or-1で、クリックしたマスの座標を通る直線」
この直線上にある黒石を取得したかったんですけど、なんちゃって座標なので、これができず別の処理の流れを考えました。
以下がその処理の流れです。
![斜めの処理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462701/ab2c60b0-b1d8-e5d6-d508-c5af52161851.png)

ちなみに、まだクリックしたマスの右上方向に黒石があった場合の処理しか作れていないので、あと3方向分作成しないといけないですね。

#詰まった部分
斜めの処理を作成するにあたって、設計から見直した方がいいんじゃないかとめちゃくちゃ思いました笑

あとはやっぱりeval関連でエラーが出ることが多くて辛いですね。
できれば使いたくないんですが、変数名を動的に決めたくてつい使っちゃうんですよね…

``` javascript:JavaScript
eval(“var elementClassList = element.classList;”);
console.log(elementClassList);
```
これは動くんですけど、同じようにeval内で宣言した変数がundefinedとエラー出ることがちょいちょいあって、その度に使うのやめたいな〜と思いますね〜

もちろん動的に変数名を作らなくていい部分は、配列で十分なので、そこは追々修正していくつもりです。
ただ、ループ内で'x'+iで文字列'x1'を作りたい時なんかは、eval使っちゃうんですよね〜
これどうしようかなって悩んでます。


#できれば改善したい部分
やっぱりevalの使用と、ほぼ共通しているのに別々で書いている処理がまだあるのでそこは関数にまとめたいなって感じですね。

#学んだこと(今後の予想なども)
配列の初期化って
```arr.length = 0;```
これでもできるんですね。
ずっと新しい配列に置き換える```arr = [];```を使っていました…

そろそろ、黒石か白石のどっちを置くかボタンで切り替えられるようにしたいですね。
今の状態だと動作確認がかなり面倒なので…

斜めの処理を残り3方向完成させたあとは、黒石白石の切り替え処理を作りかもです。

最後まで読んでいただきありがとうございました。
Qiitaで記事書いていなかったら心折れていたかもしれないので、本当に書いておいてよかったです…

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="taniguchi06" data-slug-hash="JgdBXd" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="reversi#02">
  <span>See the Pen <a href="https://codepen.io/taniguchi06/pen/JgdBXd/">
  reversi#02</a> by 谷口 (<a href="https://codepen.io/taniguchi06">@taniguchi06</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
HTML の 文字サイズ の 指定 際などに使用する remとemとは

# 目的 
文字サイズの指定などで使用されるremとemは何なのかについてまとめる。

# rem
- html要素のfont-sizeを基準にした相対的なサイズの指定単位。
- html要素のfont-sizeが変化すれば自動的にremで指定した各サイズも変更になる。
- ブラウザにより、文字の大きさが変わるために相対的な値で指定する。
- ブラウザや、表示端末の違いを受けにくいなどのメリットがある。
- 1remでhtml要素のfont-sizeと同じサイズになる。
- 2remでhtml要素のfont-sizeの倍のサイズになる。

# em
- 親要素のfont-sizeを基準にした相対的なサイズの指定単位。
- 親要素のfont-sizeが変化すれば自動的にemで指定した各サイズも変更になる。
- 単純なデザインのページだとemでもある程度のレスポンシブ対応はできるが、入れ子が乱立すると指定が複雑になってしまう。
- 1remで親要素のfont-sizeと同じサイズになる。
- 2remで親要素のfont-sizeの倍のサイズになる。

# remを使いたいけど文字サイズの実感が沸かない。。。
- remを使って文字サイズを指定したいけど1remや2remのサイズはサイズ感に実感が沸かない。
- 1remが10pxとなる設定をすることにより躊躇なくremによるサイズ設定ができるようになる。
- 1remが10pxとなるCSSファイルでの設定方法を下記に記載する。

``` css
*/ 下記の設定をCSSファイルの最初に記載する。 /*
html {
 font-size: 62.5%;
}
```
【Mac】Laravelの環境構築手順書(メモ)

#想定読者
Laravelの勉強を始めた人
環境構築がまだな人。

#やること
- Laravelの環境構築。
- サーバーを立ち上げて[http:localhost:8000](http:localhost:8000)にアクセスする。

#最初に準備するもの
- [iTerm2](https://www.iterm2.com/)
- [Home brew](https://brew.sh/)
- [Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)


#今回インストールするもの
PHP 7.2
Composer 1.8
Laravel 5.8

##PHPのインストール
LaravelはPHPのフレームワークです。
なので、PHPをインストールする必要があります。
HomeBrewでインストールできるphpの種類を確認します。

```brew search [検索したい言葉]```のコマンドを使用します。

```zsh

$ brew search php
brew-php-switcher   php-code-sniffer    php@7.1             phplint             phpmyadmin          phpunit
php                 php-cs-fixer        php@7.2             phpmd               phpstan
```

今回は```php@7.2```をインストールを行います。

```zsh

$ brew install php@7.2
```

インストールに時間がかかるので、しばらく待ちましょう。
インストールが終わったら下記のコマンドを入力して、無事にインストールされているか確認しましょう。


```zsh

$  php -v                                                                                                          yutakayamasaki@Yutakas-MacBook-Pro
PHP 7.2.19 (cli) (built: Jun 17 2019 09:03:55) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.19, Copyright (c) 1999-2018, by Zend Technologies

```

###(注意)PHPのバージョンが変わっていなかったら。
PHPのバージョンが5.6で7.2になってなかった場合の対応です。

```zsh

$ php -v
PHP 5.6.30 (cli) (built: Oct 29 2017 20:30:32) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
```

下記のコマンドを打ちましょう。
`.bash_profile`のファイルを編集します。

```zsh

$ echo 'export PATH="/usr/local/opt/php@7.2/bin:$PATH"' >> ~/.bash_profile
$ sources ~/.bash_profile
```

再度```php -v```を入力してバージョンが更新されているか、確認してください。


## Composerのインストール

Composerもインストールします。
```brew search```でComposerがある確認しましょう。


```zsh

$ brew search composer
composer 
```

Composerが確認できたので、インストールしましょう。

```zsh

$ brew install composer
```

最後に`composer -v`で確認します。

```zsh
$ composer -V                                                                                                    
Composer version 1.8.6 2019-06-11 15:03:05
```

これでComposerのインストールが完了しました。


##Laravelをインストール

Composerを使ってLaravelをインストールしましょう。
下記のコマンドを入力してください。

```zsh

$ composer global require laravel/installer
```

インストールが終わったら、下記のコマンドを入力しましょう。

```zsh

$ laravel -V                                                                                                     
Laravel Installer 2.1.0
```

#Laravelのサンプルアプリケーションを立ち上げる。

##サンプルアプリケーションの作成。
下記のコマンドでサンプルを作成します。
今回は```sample```という名前にします。

```
$ laravel new sample
```

サーバを立ち上げるためにも、`sample`のディレクトリに移動しましょう。

```zsh

$ cd sample
```

##アプリケーションを立ち上げる。

```zsh

$ php artisan serve                                                                                               
Laravel development server started: <http://127.0.0.1:8000>
[Sun Jul 21 17:22:55 2019] 127.0.0.1:55480 [200]: /favicon.ico
```

[http://127.0.0.1:8000](http://127.0.0.1:8000)にアクセスしてみましょう！
下記のように表示されれば完了です！

![localhost_8000_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387875/f3d1699b-bc04-a2d9-e55b-36ea16cdad7a.png)

#終わりに
現在、Laravel+MySQLで個人開発中、
終わったら、振り返りとしてまた記事として書く予定。
Leetcode #567: Permutation in String

```swift
func checkInclusion(_ s1: String, _ s2: String) -> Bool {
    if s1.count > s2.count {
        return false
    }
    
    let s1 = Array(s1)
    let s2 = Array(s2)
    let len1 = s1.count
    let len2 = s2.count
    var counts = Array(repeating: 0, count: 26)
    
    for i in 0..<len1 {
        counts[Int(s1[i].asciiValue! - 97)] += 1
        counts[Int(s2[i].asciiValue! - 97)] -= 1
    }
    if allZero(counts) {
        return true
    }
    for i in len1..<len2 {
        counts[Int(s2[i].asciiValue! - 97)] -= 1
        counts[Int(s2[i - len1].asciiValue! - 97)] += 1
        if allZero(counts) {
            return true
        }
    }
    
    return false
}

private func allZero(_ counts: [Int]) -> Bool {
    for i in 0..<26 {
        if counts[i] != 0 {
            return false
        }
    }
    return true
}
```
gitでsquashする(rebase)

備忘録です

# やりたいこと

ブランチ切って開発が完了。
適度にローカルリポジトリにcommitしたはいいが、
リモートリポジトリにpushする前にはある程度まとめておきたい

# やりかた

**git rebase** を使う


以下は直近3コミットをまとめる場合

```bash
git rebase -i HEAD~3
```

どれをrebaseするのか聞かれるので、
pick → squashに変更する

```
pick 111111 コミットコメント3
squash aaaaaa コミットコメント2
squash bbbbbb コミットコメント1
```

最後にrebaseしたcommitのコメント入力なので、
適切なものを入れる
(予めこれまでのコメントが入るので、適当にマージする)

```
# This is a combination of 2 commits.
# The first commit's message is:

コミットコメント3

# This is the commit message #2:

コミットコメント2

# This is the commit message #1:

コミットコメント1

# Please enter the commit message for your changes. Lines starting
...

```

# ドキュメント

[Git - git-rebase Documentation](https://git-scm.com/docs/git-rebase)
【Go】書く時に気にすべきこと(よりリーダブルなコードにするために)

# 背景
Goでコードを書く時に無意識で気をつけていることを、コードレビュー時に指摘することが多い。
書き出してみると結構な量になるのでまとめておきます。
実行効率と可読性を考えて試行錯誤を続けてきたノウハウを書いて、自分のコーディングルールを作る参考になればと願う所存である。
なお、どの言語でも共通のことにはあまり触れません。


## 基本編
### 1. go fmt, go lint, go import, go vetに逆らわない
これは本当に基本です。vscodeを使用していて、保存時に自動的に解析して直してくれます。
#### go lint
一例ですが以下を指摘してくれます。

- キャメルケース,
- idがあればIDの大文字で書く、
- グローバルな変数やメソッドにはコメントをつける。
- ErrFooと書くべきでFooErrと書いてはいけない

lintのレベルを設定できるので、プロジェクトのはじめにきつめの設定をすることをお勧めします。
#### go import
足りないimportを自動で読み込んだり削除します。
#### go vet
動くけどおかしな書き方を指摘してくれます。例えば途中リターンが含まれる場合や。無駄なelse文など
->細かくはこちら
[go vetの使い方(go vetとは)](https://qiita.com/marnie_ms4/items/b343165efb4235906db7)

### 2. struct宣言時には必ずフィールドを書くこと
goではstructのフィールドの省略ができるが決してしてはいけない。
仮にhogeのフィールドの1行目にhageが追加された時、wrongPatternの場合はfuga,chigeの代入で無くなってしまう。

```Go
	type hoge struct {
		fuga  int
		chige int
	}
	wrongPattern := hoge{1, 0}         // これでも動く
	correct := hoge{fuga: 1, chige: 0} // こう書くべき
```

### 3. 引数や戻り値が多い時はまとめる
例えばこういうコードがあったとき

```Go
func hoge(a int, b int, c int) (d int, e int, f int) {
```

以下のように引数をまとめる

```Go
func hoge(a, b, c int) (d, e, f int) {
```

## 応用編
### 1. メソッドの引数をポインタにするときは明確に理由を持つ
1. メソッドが引数の値を変更するとき。
2. 画像などサイズの大きい引数のとき

### 2. メソッドの戻り値は基本的にポインタにしない。
```Go
func pattern1() (int) {return 0} 
func pattern2() (out int) {return }
func pattern3() (out *int) {return }
```

上記のような書き方があるが基本的にpattern2を使用する
ポインタにしなくてもpattern2は参照を返している（以下リンクを参照）
https://medium.com/eureka-engineering/named-return-values-7f485d867df0

例外として気にすべきは参照を引き回して欲しいことを明示する時ぐらいだと思う。

### 3. 変数名の省略
変数の生存区間が長いものはより正確名前で書き、短いものは1文字の省略にしても良い。

```Go
// これはnでも明確
func inclimentNum(n int) (out int){
	out = n + 1
	return
}
// こちらは、100行後にnやsと書かれているとなんのことかわからなくなる
func enctyptNum(inputNum, seed int) (encryptString string){
	// 100行くらいのコード
	encryptString = getEncrptString(inputNum, seed, salt)
	return
}
```

以下も参考にすると良い
[Go Code Review Commentsの翻訳](https://qiita.com/knsh14/items/8b73b31822c109d4c497)

#　おわりに
多分もっとあるけどパッと思いついたのはこれぐらいでした。
【備忘録】Djangoのインストール及び起動方法

# はじめに

今回、諸事情でDjangoを触る必要があったので、備忘録としてDjangoのインストール、アプリケーションの立ち上げについて記述する。

なお、ここではMacOSを環境としている。

# Djangoって何？
DjangoはWEBアプリケーションを開発する際に使用する、Pythonで実装されたフレームワークである。
フレームワークなので、ある程度型にはまった記述が求められるが、そのおかげで初心者でも一定レベルのアプリケーションを開発することができる。

また、Djangoは日本人にも結構人気なフレームワークなので、日本語で書かれたドキュメントが多く存在しており、英語弱者にとってはとっつきやすい。実際に、Qiitaでも多くの記事が投稿されている。

# Djangoのインストール

さて、ここではDjangoのインストール方法について述べる。前提として、Python3系はインストール済みとする。

色々インストール方法はあるだろうが、ここではpip3を用いる。
ターミナルで以下コマンドを入力。

```
bash$ pip3 install django
```

これで普通にインストールされるはず。

# プロジェクトの立ち上げ

Djangoでは複数のアプリケーションを作成して、それらを管理する必要がある。その管理の単位はプロジェクトと呼ばれ、まずそれを作成する必要がある。

Django専用のディレクトリを作成し、その中でプロジェクトを立ち上げる。

```
bash$ mkdir Django
bash$ cd Django
bash$ django-admin startproject [プロジェクト名]
```

今回、仮にプロジェクト名を'project'とした。そして、projectディレクトリ内を見てみると、プロジェクトが立ち上がっていることがわかる。

```
bash$ cd project
bash$ tree
```

![スクリーンショット 2019-07-06 13.34.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253596/d43eacbf-154f-291b-8859-a906163d5fca.png)

このプロジェクト内に複数のアプリケーションを記述することになる。

# アプリケーションの作成

アプリケーションの作成方法は以下の通り。

```
bash$ python3 manage.py startapp [アプリケーション名]
```

これでアプリケーションの初期型を作成することができた。実際にrunserverしてみる。

```
bash$ python3 mange.py runserver [ポート番号]
```

ブラウザで開くとこのようなページが表示される。

![スクリーンショット 2019-07-06 17.17.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253596/2193a279-0c6b-d831-4aef-af3b9c13bbf4.png)

まだアプリケーション内でHTML,CSSの記述を行っていないので、特に何も表示されない。

ここからアプリケーションディレクトリに生成されたpythonファイルに記述を加える、あるいは新たにpythonファイルを作成することで、ページ遷移、DB管理等ができるようになる。

最後に、アプリケーション作成、runserverした後のprojectディレクトリの中身を見てみる。

```
bash$ tree
```

![スクリーンショット 2019-07-06 17.27.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253596/3e87174e-d1b8-f600-b8a7-a2411c2f556f.png)


すると、先と比較してアプリケーションディレクトリ、db.sqlite3が新たに追加されていることがわかる。
色々ファイルがあって混乱するが、主に編集していくのは以下の通り。

- project/
    - settings.py:データベース、タイムゾーン、言語など様々な設定を行う。
    - urls.py：ルーティング情報を書き込む（実際には各アプリへのルーティングを書き込むだけ）。
- myapp/
    - admin.py:管理画面の設定を行う。
    - models.py:モデルの情報（どのようなデータを持つかなど）を書き込む。
    - urls.py（自分で作る）:ページ・画面遷移などのルーティング情報を書き込む（こっちがメイン）。
    - views.py:処理を書き込む。
    - forms.py（自分で作る）:フォームを作成する。

実際には各アプリケーションの下に実現させたい機能ごとにスクリプトファイルを作成していくが、大まかには上記の通りである。
次回、実際に簡単なアプリケーションを作成していく中で、具体的な説明を行う。

# 終わりに
今回はDjangoのインストール・起動方法について備忘録的にまとめた。
次回は上述の通り、実際に簡単なアプリケーションを作成してみようと思う。

ありがとうございました。
CircleCIのpersist_to_workspaceで複数のジョブからファイルを保存したい

# 課題
ステージング環境と本番環境のビルドを並行で行い、それぞれ別の資材を`persist_to_workspace`で保存したい場合があります。現状、`persist_to_workspace`ではエイリアス等は付けられません。

# 対応法1
ワークフローを2つに分ける。
こういった場合はワークフローを分けてしまうのが良いかと思います。異なる環境へのデプロイに`persist_to_workspace`を2つのジョブで使用したい場合、おそらくそのワークフローは依存関係が複雑になりすぎています。
特に本番環境が絡む場合は事故の元なので、ここは多少冗長であってもワークフローを分けてしまうべきでしょう。ワークフローをまたいだ`persist_to_workspace`による資材の受け渡しは不可能なので、ワークフローを分けることで依存関係は明示的となります。

```yaml
workflows:
  # 本番環境以外のワークフロー
  staging-and-others:
    jobs:
      - lint-and-test
      - build:
          context: common_staging_deployment

      # ステージング環境へのデプロイ
      - deploy:
          name: deploy-staging
          <<: *only_master
          context: common_staging_deployment
          requires:
            - lint-and-test
            - build

  # 本番環境のワークフロー
  production:
    jobs:
      - lint-and-test:
          name: lint-and-test-production
          <<: *production_jobs
      - build:
          name: build-production
          <<: *production_jobs

      # 承認処理
      - notify-to-slack-for-approval:
          <<: *production_jobs
          requires: &test-and-build-production
            - lint-and-test-production
            - build-production
      - approval:
          <<: *production_jobs
          type: approval
          requires: *test-and-build-production

      - deploy:
          name: deploy-production
          <<: *production_jobs
          requires:
            - approval
```
- [全コード](https://github.com/AlisProject/frontend-application/blob/master/.circleci/config.yml)


# 対応法2
ワークフローを分けたくない場合は`executor`の`working_directory`を分ける手もあります。


```yaml
executors:
  default:
    working_directory: ~/repo
    docker:
      - image: circleci/node:10.15.3-browsers

  production:
    # 本番環境では、persist_to_workspaceで保存されるワークスペースを独自のパスとするためにworking_directoryを変えている
    working_directory: ~/repo_production
    docker:
      - image: circleci/node:10.15.3-browsers
```

`executor`を上記のように設定すれば、面倒なことを考えずに`persist_to_workspace`を使用できます。

```yaml
  build-staging:
    executor:
      name: default

    steps:
      - prepare-deployment

      - run:
          name: "Build Nuxt resources"
          command: |
            mkdir .nuxt
            if [ $ALIS_APP_ID ]; then
              yarn build
            fi

      - persist_to_workspace:
          root: .
          paths:
            - .nuxt/*

  build-production:
    executor:
      name: production

    steps:
      - prepare-deployment

      - run: yarn build

      - persist_to_workspace:
          root: .
          paths:
            - .nuxt/*
```

# メモ
- もっと良い方法がありましたらご教示ください
Raspberry PiでPythonファイルを自動起動させる

# やること
タイトル通り

# やり方
1. ラズパイに入っているエディタで/etc/rc.localを開く
`sudo thonny /etc/rc.local`

2. exit 0の上に実行したいコマンドを書く

```
sudo python3 PathToFile

exit 0
```

以上