OmniAICreator/Qiita-1.07M huggingface dataset:
firestore.rulesで$(database)って書くよね

はい！firestore.rulesで嵌まった私が来ました。

以下のようなfirestore.rulesを書いたんですね。pagesコレクションがあってそのドキュメントにはそのドキュメントのオーナーを示すusers_refというusersコレクションへのリファレンスがあって、アクセスして来たユーザがオーナーかどうかチェックして真の時のみ読み書き出来る、というルールを書いたつもりなんですが、この書き方だとダメでした。「FirebaseError: Missing or insufficient permissions.」とエラーが出ます。

```:ダメ
service cloud.firestore {
  match /databases/{database}/documents {
    match /pages/{pageId} {
      allow read, write: matchUserReference(resource.data.users_ref, request.auth.uid)
    }
  }
  function matchUserReference(ref, uid) {
    return ref == /databases/$(database)/documents/users/$(uid)
  }
}
```

で、以下のように書き直したら期待通りに動きました。

```:正解
service cloud.firestore {
  match /databases/{database}/documents {
    match /pages/{pageId} {
      allow read, write: matchUserReference(resource.data.users_ref, request.auth.uid)
    }
    function matchUserReference(ref, uid) {
      return ref == /databases/$(database)/documents/users/$(uid)
    }
  }
}
```

変わったのはfunctionの位置です。matchUserReferenceの中の\$(database)という記述は変数:databaseが無いと成立しないわけですが、私はこの一連の文字列 /databases/\$(database)/documents をおまじないみたいに思っていてどこに書いてもいんだと思っていたんですが、この\$(database)はmatchステートメントの{database}だったんですよ！ほげー！つまり

    /databases/$(database)/documents/users/$(uid)

というパスの記述は、

    match /databases/{database}/documents {
      ...
    }

の中じゃないと「$(database)？なんのこっちゃ」ということになるのです。関数は何処に書いてもいいって言うから…。いやーちゃんと理解してないとダメですねー、という話でした。
Nuxt.jsをインストールしたらビルド時にエラーになった -v2.8.1-

# はじめに
この記事は「[Nuxt.js の導入 -2.8.1ver-](https://qiita.com/dama-a/items/c8e9053444b2aecbe5ca#_reference-9079ec9ab8e890824645)」を対応している際に、インストールされたサンプルプログラムがエラーを出していたので、その理由と対策を調べてまとめました。

# 2019.07.25 追記
現在はERRORではなくINFOレベルになっていますが、エラーがどこで起こっているかもわからず苦労したので、その解決までの流れをまとめています！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311982/c4b479be-7b58-b0b4-e46e-b1f6098adf8d.png)


# エラーの内容



```
ERROR  (node:22276) DeprecationWarning: Tapable.plugin is deprecated. Use new API on .hooks instea
```

Nuxtプロジェクトを作成し `npm run dev` すると起動はするのですが、上記のようなエラーが出てしまいます。




# 原因の調査



### エラーメッセージから検索



まずはエラーメッセージそのままでググってみました。

どうやら `webpack` のバージョンと他のライブラリの互換性の問題のようです。



「 [webpack3から4に移行した時に出たエラーとやったこと](https://e-joint.jp/504/) 」という記事が参考になりましたが、インストールしたばっかりの Nuxt プロジェクトには `extract-text-webpack-plugin` というライブラリは使われていないので、別ライブラリが原因のようです。



### どのライブラリーが原因なのか？



今のままではバージョン違いでエラーになっているライブラリがわかりません。
そんななか、闇雲にググっていると偶然見つけました。

:link: ​[webpack の (node-16181) DeprecationWarning- Tapable.plugin is deprecated. Use new API on `.hooks` instead の対処方法](https://mutter.monotalk.xyz/posts/c5611095ba5bd8d824b3a76359650141)



こちらもエラーになっているライブラリが違いますが、詳細ログを表示する方法が紹介されていました。
`webpack.config.js` に `process.traceDeprecation = true;` を指定すればいいみたいです！

Nuxt.js の場合は `nuxt.config.js` が設定ファイルになるので、そこに記載、 `nmp run dev` してみました！

どうやら `@nuxtjs` のライブラリのどれかが原因みたいです。



### エラーメッセージ + `@nuxtjs` で検索



クリティカルな Issues を発見しました！



:link: ​[Tapable.plugin is deprecated #185](https://github.com/nuxt/create-nuxt-app/issues/185)



この Issues によると、エラーの原因は `@nuxtjs/pwa` みたいです。



ちなみにこのエラー、 **将来のバージョンアップで解消予定なので無視してもいい** らしいです！



# エラーの解消



でもやっぱりエラーは気になる……ということでエラーを解消させちゃいましょう！
原因を特定した Issues の中で、 `@nuxtjs/pwa` のベータバージョンを入れればエラーが解消する説明がありました。



### @nuxtjs/pwa のバージョンを確認する



```shell
> npm info @nuxtjs/pwa versions
```

このコマンドでバージョンの一覧が表示されます。
最新は `3.0.0-beta.16` みたいです！



### ベータバージョンのインストール



```shell
> npm install @nuxtjs/pwa@3.0.0-beta.16
```



### 実行してみましょう！

```shell
   ╭──────────────────────────────────────────╮
   │                                          │
   │   Nuxt.js v2.8.1                         │
   │   Running in development mode (spa)      │
   │                                          │
   │   Listening on: http://localhost:3000/   │
   │                                          │
   ╰──────────────────────────────────────────╯

i Preparing project for development                                                                           14:20:36
i Initial build may take a while                                                                              14:20:36
√ Builder initialized                                                                                         14:20:36
√ Nuxt files generated                                                                                        14:20:36

√ Client
  Compiled successfully in 5.95s
```

ｴﾗｰ  ｷｴﾀ  ﾜｰｲ (/・ω・)/



# おわりに

エラーをそのまま検索してヒットしたものが解決策だと思い込んでいて、解決せずに困っていました。
解決できなかったのは、検索条件の不足と、その不足部分が何なのかを調べる手段を知らなかったからでした。
結局先輩の力を借りてしまいましたが、問題解決のいい勉強になりました！
anacondaにpolyglotをインストールする

# 背景
- pipだとビルド周りで失敗したのでanacondaを使用
- コンフリクトを避けるためpipは使わずcondaだけでパッケージ管理
- polyglotをインストールしたい
- pip使うインストール方法しかヒットしなかったので書いた

# 実行環境
- CentOS 6.7
- (pyenv)anaconda3-5.3.1
- conda createで仮想環境を作ってその中でインストール


# インストール作業

```bash
polyglotが使うライブラリをインストール
$ conda install numpy -y
$ conda install -c conda-forge icu -y
$ conda install -c conda-forge pyicu -y
pyicuはpython3.6をピンポイントで要求する

ここからはPyPIのパッケージからcondaパッケージを作ってインストールする
$ conda skeleton pypi morfessor
$ conda build morfessor
$ conda install --use-local morfessor -y

$ conda skeleton pypi --python-version 3.6 pycld2
pyicuがpython3.6を要求するので明示的にpython3.6でビルドしておく
$ conda build --python 3.6 pycld2
なんかすごい警告出るけど動く
$ conda install --use-local pycld2

最後にpolyglotを入れる
$ conda skeleton pypi --python-version 3.6 polyglot
これは失敗するので自分でレシピファイルを作る

$ mkdir polyglot
$ vim polyglot/meta.yaml
``` 

# polyglotのレシピファイル
- polyglot/meta.yaml を以下のように編集する

```yaml
{% set name = "polyglot" %}
{% set version = "16.7.4" %}

package:
  name: "{{ name|lower }}"
  version: "{{ version }}"

source:
  url: https://files.pythonhosted.org/packages/e7/98/e24e2489114c5112b083714277204d92d372f5bbe00d5507acf40370edb9/polyglot-16.7.4.tar.gz
  sha256: f7d9cca9a212622548e9416fb89f1238b994b8860ef49e03b7c82c67f9b6269b

build:
  number: 0
  script: "{{ PYTHON }} -m pip install . --no-deps --ignore-installed -vvv "
requirements:
  host:
    - pip
    - python
  run:
    - python
    - six
test:
  imports:
    - polyglot
```

- source.url にはPyPIのtar.gzファイルのパスを記述
- source.sha256 にはtar.gzファイルのSHA256チェックサムを記述

レシピファイルが完成したらビルドしてインストール

```
$ conda build --python 3.6 polyglot
ビルドできたら掃除する
$ conda build purge
インストールする
$ conda install --use-local polyglot
```

# 参考
- https://docs.conda.io/projects/conda-build/en/latest/concepts/recipe.html
- https://docs.conda.io/projects/conda-build/en/latest/user-guide/wheel-files.html
- https://docs.conda.io/projects/conda-build/en/latest/resources/define-metadata.html
Laravel 5.8 多言語化対応

#言語ファイル
標準で用意されているのは以下の４つ
./resources/lang/en/auth.php,password.php,pagination.php,validation.php

上記のファイルについてはLaravel側で予め用意しているがカスタマイズも可能
また以下のコマンドで標準で用意されている日本語版が導入される

```bash
$ php -r "copy('https://readouble.com/laravel/5.8/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
$ php -f install-ja-lang.php
$ php -r "unlink('install-ja-lang.php');"
```
展開先は./resources/lang/ja/

#多言語対応
[Laravel 5.8 多言語化](https://readouble.com/laravel/5.8/ja/localization.html)
上記4ファイル以外のメッセージの定義は各言語フォルダにmessages.phpとするか
/resources/lang/配下に`言語2文字.json`(ja.json / es.jsonなど)でjson形式で用意する。
key側はデフォルト言語(英語が無難か)

##多言語切り替え
https://qiita.com/kumamon_engineer/items/4a83344744db605e3e52
こちらを参考にさせてもらいました。

デザインだけnav-bar用に変更

```html:resources/views/layouts/app.blade.php
(略)
<li class="nav-item dropdown">
    <a class="nav-link dropdown-toggle" href="javascript:void(0)" id="dropdown-lang" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
        {{ Config::get('languages')[App::getLocale()] }}
    </a>
    <div class="dropdown-menu dropdown-menu-right" aria-lledby="dropdown-lang">
        @foreach (Config::get('languages') as $lang => $language)
            <a class="dropdown-item" href="{{ route('lang.switch', $lang) }}">{{ $language }}</a>
        @endforeach
    </div>
</li>
(略)
```
【GitHub】プルリクエストの画面で変更があったファイルのdiff画面を全部折りたたむ

標準機能で出来たけど知らなかったのでメモ

`Alt` + 任意のファイルの `ˇ` ボタンを押下でOK

![pr.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50690/d4de3fd2-eaed-bf94-7999-fbed07facece.gif)


The GitHub Changelog https://github.blog/changelog/2018-08-17-collapse-all-diffs-in-a-pull-request-at-once/
Swift ジェネリッククラスでシングルトンを実現する

Swiftでシングルトンを実現する場合、以下のようになりますが

``` swift
class foo {
    static let shared = foo()
    private init(){}
}
```


ジェネリッククラスにするとエラーになってしまいます。

``` swift
class foo<T> {
    static let shared = foo<T>() // Static stored properties not supported in generic types
    private init(){}
}
```


コンピューテッドプロパティにすれば回避できますが、アクセスする度にインスタンスを生成してしまいます。インスタンスはできるかぎり再利用したいです。

``` swift
class foo<T> {
    static var shared: foo<T> {
        return foo<T>()
    }
    private init(){}
}
```

インスタンスを保持しようとしても、上記と同じエラーになってしまいます。

``` swift
class foo<T> {
    private static var instances: [String: AnyObject] = [:] // Static stored properties not supported in generic types

    static var shared: foo<T> {
        let type = String(describing: T.self)

        if let instance = instances[type] as? foo<T> {
            return instance
        }

        let instance = foo<T>()
        instances[type] = instance
        return instance
    }

    private init() { }
}
```

そこで、いささか不格好ですがグローバル空間にインスタンスを保存する作戦に至りました。さいわいにもSwiftはfileprivateという便利なアクセスレベルがあるので、グローバル空間もそこまで汚れません。

``` swift
fileprivate var instances: [String: AnyObject] = [:]

class foo<T> {
    static var shared: foo<T> {
        let type = String(describing: T.self)

        if let instance = instances[type] as? foo<T> {
            return instance
        }

        let instance = foo<T>()
        instances[type] = instance
        return instance
    }

    private init() { }
}
```

もっとイケてる方法がありましたら教えてください。
Rails+Rspec+Headless Chromeの設定

試した環境:

- rails 5.1.6.2
- rspec-rails 3.8.2
- capybara 3.26.0
- selenium-webdriver 3.142.3
- webdrivers 4.1.1
- Google Chrome 75

```ruby:Gemfile
group :test do
  gem 'rspec-rails'
  gem 'capybara'
  gem 'webdrivers'
end
```

```ruby:spec_helper.rb
Capybara.register_driver :headless_chrome do |app|
  chrome_options = Selenium::WebDriver::Chrome::Options.new
  chrome_options.args << '--headless'

  driver = Capybara::Selenium::Driver.new(app, browser: :chrome, options: chrome_options)
  driver.browser.manage.window.size = Selenium::WebDriver::Dimension.new(2000, 3000)
  driver
end

Capybara.javascript_driver = :headless_chrome
Capybara.default_max_wait_time = 5
Capybara.server = :puma, { Silent: true }
```

2019年5月以降、Rspecのfeature specがまともに動かないことで悩まされてきました。Chrome 74では謎のネットワークエラーが発生し、Chrome 75ではブラウザーがヘッドレスにならない、というものです。上記の設定により無事動くようになりました。

参考にしたのは、Rails 5.2のsystem testのソースコードです。

- https://github.com/rails/rails/blob/5-2-stable/actionpack/lib/action_dispatch/system_testing/driver.rb
- https://github.com/rails/rails/blob/5-2-stable/actionpack/lib/action_dispatch/system_testing/browser.rb

Rails 5.1.7と5.2以降 [^1] では、feature specではなく [system spec](https://relishapp.com/rspec/rspec-rails/docs/system-specs/system-spec) を使うほうがよいと思いますが、なかなかRailsをバージョンアップできない環境もありますので。

[^1]: これより前では、system testでCapybara 3が使えない。</small>

### Rails 5.0 でも動く

Rails 5.0のアプリケーションでも試してみたところうまくいきました。

- rails 5.0.7.2
- rspec-rails 3.5.2
- capybara 2.16.0
- selenium-webdriver 3.14.0
- webdrivers 4.1.1
- Google Chrome 75

`Cannot call non W3C standard command while in W3C mode` というエラーが出る場合は、上記の `chrome_options` にオプションを加えます。

```ruby:spec_helper.rb
  chrome_options.add_option(:w3c, false)
```
PostgreSQLのインストールから起動/停止まで

PostgreSQLについて忘れないようささっと。

今回の環境は

+ macOS Mojave 10.14.5
+ postgresql-11.4

##HomebrewでpostgreSQLインストール

```terminal:terminal
$ brew install postgresql
~~
==> Summary
🍺  /usr/local/Cellar/postgresql/11.4: 3,188 files, 35.4MB
~~
```
数分で完了。

しっかり入ったことを確認

```terminal:terminal
$ postgres --version     /* psql -V でもOK */
postgres (PostgreSQL) 11.4
```


DBをUTF-8で初期化して

```terminal:terminal
$ initdb /usr/local/var/postgres -E utf8
The files belonging to this database system will be owned by user "sf213471118".
This user must also own the server process.

The database cluster will be initialized with locale "ja_JP.UTF-8".
initdb: could not find suitable text search configuration for locale "ja_JP.UTF-8"
The default text search configuration will be set to "simple".

Data page checksums are disabled.

initdb: directory "/usr/local/var/postgres" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/usr/local/var/postgres" or run initdb
with an argument other than "/usr/local/var/postgres".
```

準備完了。


##postgreSQLの起動/停止

MacであればHomebrewの`brew services`コマンドを使うと便利。

MySQLであれば下記のpostgreSQLの部分だけ書き換えるだけでOK

###postgreSQLの起動

```terminal:terminal
$ brew services start postgresql
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
```

起動完了。



###postgreSQLの停止


```terminal:terminal
$ brew services stop postgresql
Stopping `postgresql`... (might take a while)
==> Successfully stopped `postgresql` (label: homebrew.mxcl.postgresql)     
```

停止完了。

###postgreSQLの起動状況の確認

これが起動状態

```terminal:terminal
$ brew services list
Name       Status  User     Plist
postgresql started sf213471118 /Users/sf213471118/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```


これが停止状態

```terminal:terminal
$ brew services list
Name       Status  User     Plist
postgresql stopped
```
【エラー修正】gcloud crashed (AttributeError): 'NoneType' object has no attribute 'revisionTemplate'

### Cloud Runでデプロイしようとしている時に、エラーが出ました。

```
ERROR: gcloud crashed (AttributeError): 'NoneType' object has no attribute 'revisionTemplate'
```

結果以下のコマンドで、SDKを更新するとデプロイできました。

```bash
$ gcloud components update
```

無事、`Done`と表示されて、コンソール画面からも正常にデプロイできていることが確認できました。



### 参考
- [Cloud SDK コンポーネントの管理](https://cloud.google.com/sdk/docs/managing-components?hl=ja)
- [stack overflow](https://stackoverflow.com/questions/57031471/gcloud-crashed-attributeerror-nonetype-object-has-no-attribute-revisiontem)
[memo] git rebaseでdevelopの変更を取り込む

## 概要

- プルリクエストを作成するときは`git rebase`で`develop`の変更を取り込んでからプッシュしてほしい

## なんで？

デグレが起きるかもしれないから

## 方法

### 1. 作業ブランチにチェックアウト

```bash
git checkout 作業ブランチ
```

### 2. `develop`の変更を取り込む

変更を取り込んだあとにコンフリクトがあれば修正する

```bash
git rebase origin/develop
```

### 3. プッシュする

```bash
git push
```
WindowsServer2016のRDS CALを設定した時のメモ

####はじめに
WindowsServer2016でリモートデスクトップサービスクライアントアクセスライセンス(RDS CAL)を設定する場面がありましたので、その時のメモのようなものを書き起こしていきます。

####リモートデスクトップライセンスツールのインストール
インストールの部分はいろんなサイトで紹介されているので詳しくは書きませんが、役割と機能の追加ウィザードより「リモートデスクトップサービスライセンスツール」をインストールします。

途中で「必要に応じて対象サーバーを自動的に再起動する」の項目がありますがインストール時に再起動は特に必要ありませんでした。
アンインストール時には再起動が必要です。

####リモートデスクトップライセンスサーバーをアクティブ化
リモートデスクトップサービスライセンスツールをインストールすると、Windowsボタン→Windows管理ツール→リモートデスクトップライセンスマネージャーが増えているので起動します。
「licmgr.exe」で直接起動することもできます。

RDライセンスマネージャという名前のアプリケーションが立ち上がりますので、アクティブ化したいサーバを選択し、右クリックします。

「サーバーのアクティブ化」という項目があるので選択します。

サーバーのアクティブ化ウィザードの開始が始まりますので「次へ」を選択します。

接続方法ではどの方法でアクティブ化するか選択できます。

- 自動接続（推奨） ・・・SSL接続でインターネットに接続する必要がある。今回のWindowsServerは現状ネットに繋がっていないので使用出来ず。
- Webブラウザー　・・・ネットに繋がっている端末があれば [https://activate.microsoft.com/](https://activate.microsoft.com/) でアクティブ化出来る。
- 電話 ・・・電話でアクティブ化出来る。

上記3点の接続方法があります。サーバーのアクティブ化ではWebブラウザーを選択しました。

[https://activate.microsoft.com/](https://activate.microsoft.com/) を開きます。

![コメント 2019-07-19 135130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340676/d9e05eb5-9780-d1ce-de28-94be9bc0d775.png)

~~英語が読めないので~~EnglishのところからJapaneseを選択して日本語に変えます。

「ライセンス サーバーのアクティブ化」を選択し、次へ。

プロダクトIDの入力がありますが、アクティブ化ウィザードに表示されている文字列をコピーして貼り付けます。

会社、国/地域の部分を入力し、次へを押し進んでいけばライセンスサーバーIDが発行されるので、アクティブ化ウィザードで貼り付けるとアクティブ化は完了です。

次が本題、RDS CALライセンスの部分です。

####リモートデスクトップサービスクライアントアクセスライセンスのインストール（RDS CAL）

「RDライセンスマネージャー」で「アクティブ化」となっていると「ライセンスのインストール」という項目が選べるようになっています。

特になにも変更せずにライセンスのインストールウィザードを開けば、アクティブ化で選んだ接続方法が選ばれていますが、なぜか「Webブラウザー」ではクライアントライセンスキーパックが発行出来なかったので電話で発行してもらうことにしました。

接続方法の変更は右クリックからプロパティを選べば変更出来るようになっています。

次の電話番号に問い合わせて～と書いている下に電話番号が書いてあります。フリーダイヤルなので無料です。良かった。

最初は音声ガイダンスに従って数字を入力していきます。

しばらくするとオペレーターの方に繋がり、発行してもらえます。

ここでオペレーターの方に教えないといけないこと

- ライセンスサーバーID　・・・アクティブ化するときに発行した35桁
- 会社名
- 名前
- 契約番号　
- 追加したいCALの個数

CALの個数間違えたら非アクティブ化してアンインストールして最初からになってしまうので、間違えないようにしましょう（1敗）

オペレーターの方は聞き間違えやすいDとかは「DriveのD」といった風に言ってくれる（フォネティックコードというらしい）のでメモを取っていきましょう。

メモ取りながらライセンスのインストールウィザードでも入力していき、次へを押し完了しました。という表示が出ればRDS CALのインストールは終了です。

####あとがき
接続方法の自動接続が選べれば勝手にアクティブ化とインストールまで終わってくれるらしいのでとても便利そうなのでできるならそっちが良かったなあと思いました。
wordpressでURLを変更した時に起きたエラー

# Wordpressで作成したサイトのURLを変更したい！

下記のような私と同じ状況の方でしたら参考になるかもしれません:relieved:

* サーバーはロリポップを使用している。
* URLだけ変更したい。サーバーは変更しない。
* すでにある程度サイトを構築してしまった後にURLを変えたくなった
* ドメインを変更したら500エラーになった

### やり方を調べたけれど、方法が色々あってどれにすればいいかわからない:joy:

1. Wordpressの設定でサイトアドレスを変更し、ファイルをいくつか修正するだけでできる方法
2. サーバーデータとデータベースを全てインポートしてエクスポートする方法

1のサイトアドレスの変更だけだど、後ほどエラーが起きる可能性があるとのことで、２の方法でやってみることにしました。下記のサイトを参考にさせていただきました！

　[【徹底解説】WordPressドメイン変更の手順と注意点(2019年最新)](https://site-hikkoshi.com/1006/#STEP4_FTP "【徹底解説】WordPressドメイン変更の手順と注意点(2019年最新)")

基本的にはこちらの通りにやれば解決なのですが、いくつかひっかかったところがあるので備忘録として残します。

## 1.新たなドメインの設定
　新たにムームドメインで新しいドメインを取得しました。その後にロリポップでマルチドメインの設定をします。
　[マルチドメイン設定について](https://lolipop.jp/manual/hp/htaccess-08/ "マルチドメイン設定について")

## 2.SSL化をしていた場合は、新しいドメインもSSL化させる
　これをやらずに、データを移行させてた後に表示されず、焦りました:joy:
　今回のエラーはこれが問題でした。
　こちらの記事を参考にさせていただきました。
　[WordPressサイト「このサイトは安全に接続できません」 解決方法【ロリポップ】](https://hidesanpo.com/lolipop-sub-konositeha "WordPressサイト「このサイトは安全に接続できません」 解決方法【ロリポップ】")


## 3.FileZillaを使ってサーバーデータをインポート
　FileZillaの使い方に不慣れでしたので、こちらの記事を参考にしました。
　[ロリポップで簡単FTP設定-Filezilla編](http://pasonal.com/lolipop-ftp-filezilla-settings/ "ロリポップで簡単FTP設定-Filezilla編")
  [超初心者向け！FileZilla（ファイルジラ）の使い方](超初心者向け！FileZilla（ファイルジラ）の使い方"https://techacademy.jp/magazine/2447")

## 4.Macでの置換えソフトはTextWranglerを使う

  記事だと「Devas」というソフトで置換えをしていましたが、Macでしたので、TextWranglerを使いました。
  [TextWrangler 複数のファイルを一括置換](TextWrangler 複数のファイルを一括置換"https://ex1.m-yabe.com/archives/748")


## 5.「.htaccess」の修正について

最後までの工程を経て、サイトにアクセスしたところ、エラーの表示が出てしまったので、.htaccessファイルに余計な記述あるのかもしれないと思い、参考にした記事を参考に修正してしまったところ、それでも治らず。そもそも「2.SSL化をしていた場合は、新しいドメインもSSL化させる」でひっかかっていたのでそこを修正するにも治らず。そこで、もしや.htaccessファイルを修正すべきではなかったのかも？と思い、元に戻したところ、サイトが表示されました！！
今回、ドメインを移す前のサイトをは別の方が作成していて途中から引き継いだので、htaccessファイルは修正すべきではなかったようです。
AnsibleTowerのログイン認証をAD認証でやる@勉強中

#はじめに
Ansible Towerにログインする時に入力されたユーザーIDがADの特定グループに所属してればログインできるようにする。

手探りだったので一部誤りがあるかもしれませんが誰かのヒントになれば、と。
(Quiitaも初投稿ゆえ見づらい箇所ありますがお許しください。)

#環境
- Red Hat Enterprise Linux release 8.0 (Ootpa)
- Ansible Tower 3.5.1


#参考にしたページ
最新版マニュアルと日本語マニュアルを参照
- https://docs.ansible.com/ansible-tower/latest/html/administration/ldap_auth.html#ag-ldap
- https://docs.ansible.com/ansible-tower/3.1.4/html_ja/administration/ldap_auth.html
- https://docs.ansible.com/ansible-tower/latest/html/administration/kerberos_auth.html

#設定
 SETTINGS / AUTHENTICATION / LDAP

- LDAPサーバURI  
--
  ```
  ldap://(ADサーバのアドレス)　　　 　　例)  ad01.contoso.local
  ```
- LDAPバインドDN  
--
　  AD情報にアクセスするためのユーザ　  例)  AnsibleTower@contoso.local
- LDAPバインドパスワード  
--
　（LDAPバインドDNに対するパスワード）  
- LDAPグループタイプ  
--
  GroupOFNamesType  
- LDAP要求グループ  
--
  ``` 
  CN=TowerUsers,CN=Users,DC=contoso,DC=local
  ```
- LDAPユーザー検索
--
  ```
  [
   "DC=contoso,DC=local",
   "SCOPE_SUBTREE",
   "(sAMAccountName=%(user)s)"
  ]
  ```
- LDAPグループ検索
--
  ```
  [
   "DC=contoso,DC=local",
   "SCOPE_SUBTREE",
   "(objectClass=group)"
  ]
  ```
- LDAPユーザー属性マップ
-- 
  ```
  {
   "first_name": "givenName",
   "last_name": "sn",
   "email": "userPrincipalName"
  }
  ```

#注意点・気になった点
- 内部のLDAP処理でキャッシュ期間があるのかAD情報を編集してからTower上でログインできるのに時差がある。
pipパッケージの作成

pip install でライブラリを配布したい時ありますよね。
そこで出くわす問題をいくつか


### ・.cfg .txtが入ってくれない
解決策：MANIFEST.inに書く。
config.cfgを入れたい時、
`include (module name)/config.cfg`
[この記事も参考になります](https://qiita.com/airtoxin/items/2eafb930fa9b54ee7149)

### ・ROOTの設定がわからない
人によって、どの場所にソースコードが入れられるかは確定していません。なのでその情報をどうにかして取りたいと。
その時は、

```python:config.py
HOME_DIR = Path(os.path.dirname(os.path.abspath(__file__)))
```

とした上で、　`from config import HOME_DIR` としましょう。

### ・他のファイルから変数をimportしたい
importはライブラリやモジュールだけじゃなくて変数に対してもできるんですね。驚きました。

```
from (file_name) import (variable_name)
```
もしくは

```
from (file_name) import *  →　全ての変数をimport
```
ただ、特に後者の場合は、コードを読むのが難しくなってしまうのでできるだけ明示的にimportしましょう。
Docker+Redash+MySQLでデータ可視化環境セットアップ手順

#何を作るか
OSSのBIツールを試してみるために,有名どころのRedashを使ってみようと思いました。
今回は関東の人口のヒートマップを作ることを目的とします。
関東の人口を記述した表形式のデータをMySQLに保存します。
データソースとなるMySQLはDocker外に出します。

#環境
macOS High Sierra
バージョン 10.13.6

#インストールするもの
* Docker for Mac（https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81）
* Docker compose(https://qiita.com/zembutsu/items/dd2209a663cae37dfa81)
* MySQL
* Node.js(https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)

#手順概要
Redashの公式サイト（https://redash.io/help/open-source/dev-guide/docker）
を参考に、進めていく。

1.Gitレポジトリのクローン
2.Dockerイメージのビルド
3.npmパッケージのインストール
4.RedashのPostgresデータベースの作成
5.Devサーバーの実行
6.MySQLデータベースへの接続
7.クエリーを取得して、地図に可視化

#1.Gitレポジトリのクローン

```
git clone https://github.com/getredash/redash.git
cd redash/
```

#2.Dockerイメージのビルド

```
docker-compose up -d
```

redashディレクトリにdocker-compose.ymlがインストールされている。
ビルド済みイメージ(Redash web server, worker, PostgreSQL and Redis)をフェッチし、Dockerイメージをビルドする。
今回は、特にdocker-compose.ymlファイルを編集はしなかった。

#3.npmパッケージのインストール
**package.json**を用いることで、インストールパッケージの種類やバージョンを指定できる。

```
npm install
```

#4.データベースの作成
テーブルの作成

```
docker-compose run --rm server create_db
```

テスト用のデータベースの作成(https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121324/284bfc6e-d03e-dff0-2f76-1ecbb04cd91f.png)


```
docker-compose run --rm postgres psql -h postgres -U postgres -c "create database tests"
```

#5.Devサーバーの実行

```
npm run build
```

```
npm run start
```
**http://localhost:8080**でアクセスできる

#6.データベースの接続
MySQLを用いたデータベース接続は、別の資料を参考。

Docker for macで作成されたコンテナはLocalhostでは接続できないことを知らなかったため、一番苦労しました。
Docker for macでコンテナの中からホストに接続する方法はこちらのサイトを参照して解決。(https://cockscomb.hatenablog.com/entry/docker-for-mac-localhost)

以下のようにデータベースを設定

![redash_データベース設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121324/2cf2cc29-e268-96a5-fe67-39eec1a2c6b9.png)

#7.クエリーを取得して、地図に可視化
適当なテーブルからSELECT文で、クエリーを取得。
クエリーから以下を用いて、可視化の設定を行う。
![redash_地図可視化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121324/ee4cd407-77bd-99aa-c7d8-1afd05d397ea.png)

※おまけ
東京のマクドナルドのデータを緯度、経度を指定し、表示
![スクリーンショット 2019-07-23 12.58.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121324/ba79ff56-c814-f58d-2dbc-2153ee0585b7.png)


#今後の展望
・県区切りではなく、県の市区町村区切りで、人口を可視化したい
→shapeファイルの設定の変更ができれば実現が可能

・データソースを今回は,MySQLを使ったが、他のデータソースも使ってみたい

・メッシュコードに応じたコロプレス図、マーカー図を使ってみたい

・綺麗なダッシュボードの作成（https://github.com/kakakakakku/redash-hands-on/blob/master/README.md）
SpekでLifecycleを利用したテストをする方法

# 

例えば `val liveData: LiveData<Int>` みたいな値があってそれのライフサイクルに応じた変化をテストしたい場合 

なぜこんなことをしたいかというと、RxJava→LiveDataの変換をした際に、初期値が正しく設定されるかなどのテストをしたかったので、Lifecycleを利用する方法を調べた。


## 全体のテストコード

``` kotlin
object LifecycleTest : Spek({
    Feature("hoge機能") {
        val lifeCycleObserver: LifecycleObserver by memoized { mockk<LifecycleObserver>() }
        val lifeCycleOwner: LifecycleOwner by memoized { mockk<LifecycleOwner>() }
        val lifeCycle: LifecycleRegistry by memoized { LifecycleRegistry(lifeCycleOwner) }
        
        val observer: Observer<Int> by memoized { mockk<Observer<Int>>(relaxed = true) }


        beforeEachTest {
            every {
                lifeCycleOwner.lifecycle
            } returns lifeCycle

            lifeCycle.addObserver(lifeCycleObserver)
        }

        Scenario("開始状態") {

            Given("LiveDataを購読") {
                liveData.observe(lifeCycleOwner, observer)
            }

            When("ライフサイクルを開始状態にする") {
                lifeCycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
                lifeCycle.handleLifecycleEvent(Lifecycle.Event.ON_START)
            }

            Then("期待値") {
                verifySequence {
                    observer.onChanged(1)
                }
            }
        }

    }
})
```

## Lifecycleの設定

``` kotlin:Lifecycle関連のコード
val lifeCycleObserver: LifecycleObserver by memoized { mockk<LifecycleObserver>() }
val lifeCycleOwner: LifecycleOwner by memoized { mockk<LifecycleOwner>() }
val lifeCycle: LifecycleRegistry by memoized { LifecycleRegistry(lifeCycleOwner) }

beforeEachTest {
    every {
        lifeCycleOwner.lifecycle
    } returns lifeCycle

    lifeCycle.addObserver(lifeCycleObserver)
}
```

lifeCycleOwnerをLiveDataにわたすOwnerにし、 mockkで `lifeCycleOwner.lifecycle` の戻り値を `LifecycleRegistry` になるようにモック化

`LifecycleRegistry` にObserverが1件も無いステータスを変化するロジックで以下のコード部分で mObserverMap.sizeが0になり、更新されなくなってしまうのでダミーで `lifeCycle.addObserver(lifeCycleObserver)` している。

``` LifecycleRegistry.kt
    private boolean isSynced() {
        if (mObserverMap.size() == 0) {
            return true;
        }
        State eldestObserverState = mObserverMap.eldest().getValue().mState;
        State newestObserverState = mObserverMap.newest().getValue().mState;
        return eldestObserverState == newestObserverState && mState == newestObserverState;
    }
```

## Lifecycleの設定

``` kotlin
lifeCycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
lifeCycle.handleLifecycleEvent(Lifecycle.Event.ON_START)
```
こんな感じで `lifeCycle.handleLifecycleEvent` を呼ぶことで状態遷移を起こすことができる。
Selenium::WebDriver::Element#click が position: fixed のヘッダやフッタに邪魔されて not clickable になってクリックできない

## 事象

ヘッダとフッタが `position: fixed;` で固定されたUIを持ったWebページのe2eテストとか書いてるとクリックできないよーってエラーがよく起きる。こんな感じのUIで;

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="oieioi" data-slug-hash="dxPMap" 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="fixed header and footer">
  <span>See the Pen <a href="https://codepen.io/oieioi/pen/dxPMap/">
  fixed header and footer</a> by oieioi (<a href="https://codepen.io/oieioi">@oieioi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

このページに対してこんなスクリプトを実行すると;

```ruby:test.rb
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome
driver.navigate.to "http://127.0.0.1:8081/"
element = driver.find_element(name: 'button')
element.click
driver.quit
```

こんなエラーになる。 fixed された `<footer>` とクリックしたい `<button>` が被っているためクリックできないという。

```
Element <button name="button">...</button> is not clickable at point (40, 881).
Other element would receive the click: <footer>...</footer>
```

## 解決策

目標をセンターに入れてクリックする。

色々方法はあるが、今回はJavaScriptの[ `Element.scrollIntoView()` ](https://developer.mozilla.org/ja/docs/Web/API/Element/scrollIntoView) を使って解決した。以下を `click` する前に実行すれば目標の要素を真ん中になるようにスクロールするので、クリックできるようになる。

```ruby
driver.execute_script("arguments[0].scrollIntoView({behavior: 'auto', block: 'center', inline: 'nearest'});", element)
```

で、この動作を `click` をモンキーパッチする Gem をつくりました。

https://github.com/oieioi/selenium-webdriver-element-extend_click_again

使い方は `require` するだけです。

```ruby:test.rb
require 'selenium-webdriver'
require 'selenium/webdriver/element/extend_click_again'
...
```

たまに便利です。
Python3 > datetime > カレンダの特定日に印を付ける (C++ BuilderのTCalendarのARow, ACol計算用)

```txt:動作環境
ideone (Python 3 (python 3.5)
```

### 概要

- C++ Builderで設計中の機能をPython実装でさっと確認
- 年を通した366の要素にあらかじめマークを付け、それをもとにカレンダの該当箇所をマーク付けする
    - C++ BuilderのTCalenderのACol, ARowの計算に使う

### 備考

曜日の定義は

- 0(Monday): python
    - https://docs.python.org/3.7/library/calendar.html#calendar.weekday
        - `Returns the day of the week (0 is Monday) for year (1970–…), month (1–12), day (1–31).`
- 1(Sunday): Delphi



### 実装

https://ideone.com/n113iw

```py
# [x] PEP8 check

from datetime import datetime

aymd = datetime(2019, 7, 18, 12, 30, 45)


def getWeekDay(adate):
    return (adate.weekday() + 1) % 7  # for 0:Sunday[Delphi]


def getYearDay(adate):
    return (adate.timetuple().tm_yday)


def dispCal(alist):
    for idx in range(len(alist)):
        print(alist[idx], end='')
        if idx % 7 == 6:
            print()  # CRLF

# 1. preparation -------------------------
NUM_YEAR = 366  # maximum number of days in a year (including leap-year)
yrs = [[]]*NUM_YEAR
for idx in range(NUM_YEAR):
    yrs[idx] = 0
yrs[getYearDay(datetime(2019, 1, 1, 0, 0, 0))] = 1  # Jan
yrs[getYearDay(datetime(2019, 2, 1, 0, 0, 0))] = 1  # Feb.
yrs[getYearDay(datetime(2019, 3, 1, 0, 0, 0))] = 1  # Mar.
NUM_MONTH = 37  # 6 lines in calendar ( 7 * 5 lines + 2 [30, 31 days])
mts = [[]]*NUM_MONTH
for idx in range(NUM_MONTH):
    mts[idx] = 0

# 2. main part -------------------------

adt = datetime(2019, 2, 1, 0, 0, 0)  # ymdhns

awday = getWeekDay(adt)
ayday = getYearDay(adt)

for idx in range(31):  # 31: maximum for one month
    mts[awday + idx] = yrs[ayday + idx]

print('Feb')
dispCal(mts)

```

### 結果

```
Feb
0000010
0000000
0000000
0000000
0000010
00
```

### 備考

確認は済んだので、このコードはここまで。

さらに良いコードにする時間は今回は取らない。

### 関連

- Python
    - [Convert Year/Month/Day to Day of Year in Python](https://stackoverflow.com/questions/620305/convert-year-month-day-to-day-of-year-in-python)
    - [How do I get the day of week given a date in Python?](https://stackoverflow.com/questions/9847213/how-do-i-get-the-day-of-week-given-a-date-in-python)
- Delphi (C++ Builder)
    - [DayOfTheWeek](http://www.delphibasics.co.uk/RTL.asp?Name=DayOfTheWeek)
    - [DayOfTheYear](http://www.delphibasics.co.uk/RTL.asp?Name=DayOfTheYear)
- C++ Builder
    - [SysUtils.DayOfWeek 関数](http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/delphivclwin32/SysUtils_DayOfWeek.html)
        - > 日曜が週の先頭で，土曜が 7 番めの曜日です。 
    - [DateUtils.DayOfTheYear 関数](http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/delphivclwin32/DateUtils_DayOfTheYear.html)
    - [DateUtils.DayOfTheWeek 関数](http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/delphivclwin32/DateUtils_DayOfTheWeek.html)
        - > 1 は月曜，7 は日曜を示します。 

C++ Builderに関してはDateUtilsを使う。
WSLでJuliaを使う

##背景
JuliaをWSL(Windows Subsystem for Linux)にインストールした際
グラフ描画関係でいろいろ不具合があったのでメモ
##環境
Windows10
Debian9 on WSL
Bash shell
##Juliaをインストール
https://julialang.org/downloads/
からGeneric Linux Binaries for x86の64-bitをダウンロード&解凍。

公式にはシンボリックリンクを作成してパスを通す方法が書いてあるが、なぜかうまく行かなかったのでaliasでパスを通した。

```bash:.bashrc
alias julia='juliaの場所/bin/julia'
```


##Jupyter-notebookをインストール

```
sudo apt install jupyter-notebook
```
でインストールできる．
デフォルトブラウザをWindows側のブラウザに設定する． Chromeに設定する場合は.bashrc等に

```bash:.bashrc
export BROWSER='/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe' 
```
と追記しておくと，　`jupyter-notebook`を実行すると自動でChromeが立ち上がる．


##必要なJuliaパッケージをインストール
`julia`を実行するとREPL(read-eval-print loop. インタラクティブシェルのこと)が立ち上がる。
`]`をタイプした後

```julia
add パッケージ名
```
でJuliaのパッケージをインストールできる。
IJulia(juliaをjupyterで使えるようにする), GR(グラフの描画), Plots(GRなどのグラフ描画パッケージを統一的な文法で使えるようにする)をインストール

(注)GRにはlinux側の依存パッケージがあるので、linuxディストリビューションに応じて[ここ](http://gr-framework.org/julia.html#installation)にあるパッケージをインストールしておく。
###それぞれのドキュメント
GR　http://gr-framework.org/julia.html
Plots http://docs.juliaplots.org/latest/

##REPLからグラフを描画したい場合
グラフをjupyter上でのみ表示させる場合は以上で終わり. REPLからもグラフを表示させたい場合はX11(ウインドウを表示するソフト）が必要なので, 以下の手順も必要
###VcXsrvをインストール
Windows用X11であるVcXsrvを
https://sourceforge.net/projects/vcxsrv/
からダウンロード＆（Windowsに）インストールして立ち上げる
![2019-06-29 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271560/9e7c5b68-1de4-e6f7-836b-96033910552c.png)
![2019-06-29 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271560/857e709e-2478-a68d-1b89-48b5a332f87e.png)

![2019-06-29 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271560/4a3c484a-8803-4c74-e38c-b739b48f1371.png)
Native openglのチェックを外すか、 チェックを付けて`export LIBGL_ALWAYS_INDIRECT=1`を.bashrc等に追記する。

![2019-06-29 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271560/0c0f874d-c98f-d3f0-bf0d-f3d982b7d317.png)
Save configurationをクリックして，生成されたファイルを`C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`に置いておくと，Windows起動時に自動でVcXsrvが立ち上がって便利
完了を押すとトレイに常駐する.

WSLの.bashrc等に

```bash:.bashrc
export DISPLAY='localhost:0.0'
```
と追記する．

##確認


```
~ $ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.1.1 (2019-05-16)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> using Plots

julia> plot(rand(10))
```
![2019-07-18 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271560/e5e63274-3599-f615-9a74-04057f4bc536.png)
[Git] git log の日時を見やすくする

# TL;DR

標準出力は日付部分のみを抜粋している。

```console
$ git log
Wed Jul 10 15:59:02 2019 +0900
Tue Jul 16 02:36:47 2019 +0000

$ git log --date=iso-local
2019-07-10 15:59:02 +0900
2019-07-16 11:36:47 +0900

$ git log --date=format-local:'%Y/%m/%d %H:%M:%S'
2019/07/10 15:59:02
2019/07/16 11:36:47
```

# 説明

`git log` で表示される日時は (おそらく多くの日本人にとって) 読みにくい。

```console
$ git log
Wed Jul 10 15:59:02 2019 +0900 # JST
Tue Jul 16 02:36:47 2019 +0000 # UTC
```

そこで `--date` オプションでフォーマットを指定する。`iso-local` ([ISO 8601](https://ja.wikipedia.org/wiki/ISO_8601) 形式) が読みやすい。

```console
$ git log --date=iso-local
2019-07-10 15:59:02 +0900
2019-07-16 11:36:47 +0900
```

フォーマットに独自のものを指定したい場合は `format-local` を使う。`format` ではなく `format-local` を使うことで、タイムゾーンがローカルに統一される。

```console
$ git log --date=format:'%Y/%m/%d %H:%M:%S'
2019/07/10 15:59:02
2019/07/16 02:36:47

$ git log --date=format-local:'%Y/%m/%d %H:%M:%S'
2019/07/10 15:59:02
2019/07/16 11:36:47
```

# 参考

* [Git - git-log Documentation](https://git-scm.com/docs/git-log)
* [git: timezone and timestamp format](https://stackoverflow.com/questions/7651644/git-timezone-and-timestamp-format)
さくらVPSでCentOS7 ８．phpMyAdminインストール

#はじめに

自由にテスト出来るLinuxのサーバーがほしくて、さくらVPSで構築してみました。
順次手順をアップしていく予定です。

今回は、phpMyAdminをインストールします。
phpMyAdminは、MariaDBやMySQLをブラウザで管理する為のデータベース接続クライアントツールです。

#目次

1. [申し込み](https://qiita.com/Qsugi/items/9239f93f35967e567b5b)
2. [CentOS7インストール](https://qiita.com/Qsugi/items/4cc4ba9983191a306b19)
3. [SSH接続](https://qiita.com/Qsugi/items/45772c8a71a31bd0d3c8)
4. [Apache・PHPインストール](https://qiita.com/Qsugi/items/bf9740f31b4c42eaad91)
5. [MariaDBインストール](https://qiita.com/Qsugi/items/7798669338b555f4ea8d)
6. [FTP接続](https://qiita.com/Qsugi/items/6f383694f60913abb948)
7. [sftp接続](https://qiita.com/Qsugi/items/a8328a116218b058a8bf)
8. phpMyAdminインストール
9. [環境のバックアップ](https://qiita.com/Qsugi/items/a83076eb657157f12f17)
10. [Ruby On Railsインストール](https://qiita.com/Qsugi/items/c7e69a6761f125846bff)
11. [RailsプロジェクトをGitで共同開発](https://qiita.com/Qsugi/items/3c31cfeffee288c05d5e)

#８．phpMyAdminインストール

##インストール

* インストール

    ```
$ sudo yum install -y --enablerepo=remi,remi-php56 phpMyAdmin
```

    ※PHP7.1をインストールした場合は、remi-php71

* Apache用設定ファイルを修正

    ```
$ sudo vi /etc/httpd/conf.d/phpMyAdmin.conf
```

    「Require all granted」を追加

    ```
<IfModule mod_authz_core.c>
  # Apache 2.4
  Require local
  # この行を追加！
  Require all granted
</IfModule>
```

* Apache再起動

    ```
$ sudo systemctl restart httpd.service
```

##起動確認と設定

* 起動確認

    ブラウザを起動し、サーバーのIPアドレス又はURLの後ろに/phpmyadminを指定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222823/105b6016-332f-7813-2961-2c3c58ed57c3.png" width=600>
<br>

* ログイン

    MariaDBインストール時に作成したユーザーでログインします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222823/7158c344-d201-b14f-9dbd-bd658158f322.png" width=600>
<br>

* 環境保管領域設定

    phpMyAdminにログインすると、「phpMyAdmin 環境保管領域が完全に設定されていないため、いくつかの拡張機能が無効になっています。理由についてはこちらをご覧ください。 
代わりにデータベースの操作タブを使って設定することもできます。」というメッセージが表示される場合があります。
画面キャプチャしていなかったので画像はありませんが、下の方にでます。

    この文の「こちら」がリンクになってますので、これをクリックすると「Create a database named 'phpmyadmin' and setup the phpMyAdmin configuration storage there.」というメッセージが表示されます。
直訳すると『「phpmyadmin」という名前のデータベースを作成し、そこにphpMyAdmin設定ストレージを設定します。』

    このメッセージの「Create」がリンクになっていますので、これをクリックすると、phpmyadminというデータベースが作成されます。（表示させるにはページの再読み込みが必要です）

    環境保管領域設定は以上です。

* 非公開パスフレーズ

    phpMyAdminにログインすると、「設定ファイルに、暗号化 (blowfish_secret) 用の非公開パスフレーズの設定を必要とするようになりました。」というメッセージが表示されます。

    メッセージのとおり、非公開パスフレーズが必要ですので設定します。
    /etc/phpMyAdmin/config.inc.phpを編集します。

    ```
$ vi /etc/phpMyAdmin/config.inc.php
```

    $cfg['blowfish_secret'] = '' に値をセットします。
    任意の文字を32文字以上入力します。内部で使用されるだけなので、何でも良さそうです。

    ```
/**
 * This is needed for cookie based authentication to encrypt password in
 * cookie. Needs to be 32 chars long.
 */
$cfg['blowfish_secret'] = 'fswefiojoweifja3sldkfjoeifjaojkl';
```

    非公開パスフレーズ設定は以上です。

#次回

前回：[sftp接続](https://qiita.com/Qsugi/items/a8328a116218b058a8bf)
次回：[環境のバックアップ](https://qiita.com/Qsugi/items/a83076eb657157f12f17)
create reat app 環境構築メモ

前の記事で書いたようにReduxはちょっとめんどうです。
業務ではRedux使っているものの、プライベートではReactのみでサイト作ろうと思います。

簡単でした。
Reactのひな形を簡単に作れるcreate-react-appを利用します。

#導入

##create-react-appコマンドをインストール、アプリ作成

```javascript
npm install -g create-react-app
create-react-app hello-world
```

##サーバーを開始する
作ったアプリのディレクトリ（今回はhello-world）に行き以下のコマンドを実行
サーバーが起動し、http://localhost:3000 などのURLでアプリを見ることができます。

```javascript
npm start
```

##eslint設定

###eslintとprettierのモジュールをインストール

```sh

yarn add -D eslint prettier eslint-plugin-prettier eslint-config-prettier
yarn add -D eslint-plugin-react eslint-config-react-app eslint-plugin-import eslint-plugin-flowtype eslint-plugin-jsx-a11y
yarn add -D eslint-plugin-standard eslint-config-standard eslint-plugin-node eslint-plugin-promise
```

###eslint設定ファイル追加

```sh
cat<<EOF > .eslintrc.json
{
  "extends": [
    "standard",
    "plugin:prettier/recommended"
  ],
  "plugins": [
    "react",
    "prettier"
  ],
  "parser": "babel-eslint",
  "parserOptions": {},
  "env": {
    "browser": true,
    "es6": true
  },
  "globals": {
    "it": false
  },
  "rules": {
    "prettier/prettier": "error",
    "react/jsx-uses-react": 1,
    "react/jsx-uses-vars": 1,
    "no-console": "warn",
    // warning  Definition for rule 'jsx-a11y/href-no-hash' was not found に対応
    "jsx-a11y/href-no-hash": "off",
    "jsx-a11y/anchor-is-valid": "off"
  }
}
EOF



cat<<EOF > .eslintignore
node_modules
**/*.min.js
src/registerServiceWorker.js
EOF

cat<<EOF > .prettierrc
{
  "singleQuote": false,
  "trailingComma": "es5",
  "semi": false
}
EOF
```

#参考

###Intellijの設定

<img width="933" alt="lint設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192134/daa4319b-4063-4c39-5a4f-55f5a9908a4f.png">

```
プログラム：　eslint のPATH　（プロジェクトのディレクトリ/node_modules/.bin/eslint )
引数：　--fix $FileDir$
```
拡張オプション
Auto-save edited files to trigger the watcherのチェックを外します ※付けると、編集するたびにコードフォーマットされてうざいです。
Wordpressの子テーマを作る方法

#はじめに

Wordpressの子テーマを作る方法をまとめます。

##なぜ子テーマをつくるのか

* WordpressでテーマのCSSやPHPをガシガシいじりたい。

* 親テーマのアップデートしたときに、自分のカスタマイズが上書きされないようにしたい。



#子テーマディレクトリを作成する。

`/wp-content/themes`にフォルダを作成します。フォルダー名はなんでもいいです。

![スクリーンショット 2019-07-19 11.58.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452235/c319d265-4cf0-bfd5-52b4-6e115875b61a.png)


#style.cssを作成する

子テーマ内に`style.css`ファイルを作成します。
以下の内容を記述します。

```css
/*
Theme Name:twentyseventeen-child
Theme URI:空欄でいい
Description:空欄でいい
Template:twentyseventeen
Author:空欄でいい
Author URI:空欄でいい
Version:2.2
*/
```

* Theme Name: 子テーマの名前です。自分で名付けます。

* Template:　親テンプレートの名前です。間違えないよう気をつけます。

* Version: 親テンプレートのバージョンを書いておきます。



#functions.phpを作成する

子テーマ内に`functions.php`ファイルを作成します。
以下の内容を記述します。

```php
<?php
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
  wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
  wp_enqueue_style( 'child-style', get_stylesheet_directory_uri() . '/style.css', array('parent-style')
);
}
?>
```

#Wordpressで確認する

ダッシュボードからテーマ変更画面を開き、子テーマが認識されているか確認します。

![スクリーンショット 2019-07-19 12.06.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452235/d450d1c6-283a-7952-23fb-37e533c1428f.png)


CSSを適当にいじってみて、動作確認もしてみましょう。



#まとめ

Wordpressの子テーマを作る方法をまとめました。
anacondaにsentencepieceをwheelファイル経由でインストールする

# 背景
- 機械学習関連のライブラリをインストールするためにanacondaを使用
- コンフリクトを避けるためpipは使わずcondaでパッケージ管理
- sentencepieceのPythonバインディングをインストールしたい

# 実行環境
- CentOS 6.7
- (pyenv)anaconda3-5.3.1
- conda createで仮想環境を作ってその中でインストール


# リポジトリにあるか確認

```bash
$ conda search sentencepiece
```

ヒットせず。

# conda skeleteonを使ってみる（失敗）
- anacondaのリポジトリになくてPyPIにある(pip installできる)パッケージは、conda skeletonを使うことでcondaにインストールするためのレシピファイルを作成できる

```bash
$ conda skeleton pypi sentencepiece
```

Error: No source urls found for sentencepiece
というエラーが出て失敗。

sentencepieceのPyPIにはwhlファイルはあるが
tar.gzファイルがなかったのでインストールできず失敗した模様。

# 自分でcondaレシピを作る
- conda skeletonで作られるレシピを参考に作る
- meta.yaml, build.shが必要って書いてあったけどmeta.yamlだけでインストールできた
- sentencepiece/meta.yaml を編集する

```bash
$ mkdir sentencepiece
$ vim sentencepiece/meta.yaml
```
- meta.yaml はこんな感じ

```yaml

{% set name = "sentencepiece" %}
{% set version = "0.1.82" %}

package:
  name: "{{ name|lower }}"
  version: "{{ version }}"

source:
  url: https://github.com/google/sentencepiece/releases/download/v0.1.82/sentencepiece-0.1.82-cp37-cp37m-manylinux1_x86_64.whl
  sha256: 3fc02ba62f2d5c624f3f107cc256c1c5f877fb7fa80754e2e7cd7f0aa5e0c86f

build:
  number: 0
  script: "{{ PYTHON }} -m pip install sentencepiece-0.1.82-cp37-cp37m-manylinux1_x86_64.whl --no-deps --ignore-installed -vvv "
requirements:
  host:
    - pip
    - python
  run:
    - python
test:
  imports:
    - sentencepiece
```
- ポイント
  - 先頭にインストール対象のライブラリ名(sentencepiece)とバージョン(0.1.82)を記述する
  - source.urlにGitHub上のwhlファイルのURLを記述する
  - sha256チェックサムはなくても動くらしいが、一応事前にダウンロードしてチェックサムを調べてから書いておく
  - build.scriptにwhlファイルをpip installするコマンドを書く(build.shの代わり)
  - --no-deps --ignore-installedを付けているのは他の依存ライブラリをインストールさせないため
  - もしかしたら必要ない行があるかも
- できたらビルドする

```
$ conda build sentencepiece
最後にファイルが残ってると言われるので掃除する
$ conda build purge
```

- ビルドが無事完了したらインストールする

```
$ conda install --use-local sentencepiece
```

- インストールが完了したら作成したレシピディレクトリを削除する

```
$ rm -r sentencepiece
```

# まとめ
- conda skeleton pypiで上手くレシピが作れなくても自分でmeta.yaml書けばインストールできる
- wheelファイルがあるライブラリなら大体condaでもインストールできそう

# 参考
- https://docs.conda.io/projects/conda-build/en/latest/concepts/recipe.html
- https://docs.conda.io/projects/conda-build/en/latest/user-guide/wheel-files.html
- https://docs.conda.io/projects/conda-build/en/latest/resources/define-metadata.html
Flaskでmysqlからデータ取得し表示

## anaconda環境にFlask環境構築済みであることが前提です
---
### 1.pymysqlを組み込む
```console
(flask-test) [xxx flask-test]$ conda install pymysql
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /home/xxx/anaconda3/envs/flask-test

  added / updated specs:
    - pymysql

The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    pymysql-0.9.3              |           py37_0          83 KB
    ------------------------------------------------------------
                                           Total:          83 KB

The following NEW packages will be INSTALLED:

  pymysql            pkgs/main/linux-64::pymysql-0.9.3-py37_0

Proceed ([y]/n)? y

Downloading and Extracting Packages
pymysql-0.9.3        | 83 KB     | ################################################################################## | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
```
## 2.Flask環境に以下モジュールを組み込む
### 2-1.ファイル
```console
(flask-test) [xxx flask-test]$ tree
.
├── db_mysql_get.py
└── templates
    └── dbmysql.html
```
### 2-2.db_mysql_get.py
```python
import pymysql

from flask import Flask,render_template,request

#インスタンス生成
app = Flask(__name__)

def getConnection():
  return pymysql.connect(
    host='[hostname]',
    port=int(3306),
    db='[dbname]',
    user='[userid]',
    passwd='[password]',
    charset='utf8',
  )

@app.route('/dbmysql/')
def dbmysql():
  conn = getConnection()
  cur = conn.cursor()
  sql = "select"
  sql += " col1 "
  sql += ",col2 "
  sql += " from "
  sql += " table1 "
  cur.execute(sql)
  datalist = cur.fetchall()

  cur.close()
  conn.close()

  return render_template('dbmysql.html',datalist=datalist)

if __name__ == "__main__":
  #Webサーバ立ち上げ
  app.debug=True
  app.run(host='xxx.xxx.xxx.xxx')
```
### 2-3.dbmysql.html
```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>db Mysql Data</title>
</head>
<body>
  <table border=1>
    <tr>
     <th>col1name</th>
     <th>col2name</th>
    </tr>
   {% for data in datalist %}
     <tr>
       <td>{{data[0]}}</td>
       <td>{{data[1]}}</td>
     </tr>
     </tr>
   {% endfor %}
   </table>  
</body>
</html>
```
## 3.実行
```console
(flask-test) [xxx flask-test]$ python db_mysql_get.py
 * Serving Flask app "db_mysql_get" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://xxx.xxx.xxx.xxx:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 217-574-955
```
## 4.確認
####http://xxx.xxx.xxx.xxx:5000/dbmysql/
![mysqlimage.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236342/8bfd3387-4294-2e2e-c73a-815a09595823.png)
Rails で MySQL インデックスヒントを使う (USE INDEX, IGNORE INDEX, FORCE INDEX)

MySQL を使った Rails で

```ruby
Model.where(created_at: 1.yea.ago..1.day.ago).order(:id).last
```

などとすると、MySQL の仕様で `created_at` の INDEX ではなく、`PRIMARY` を使ってしまってものすごく遅くなることがあった。

調べてみたところ、どうやら自分で拡張するしかないようなので書いたという話です。

## Concern

ググると類似コードが出てきますが、違いは下記の通り

* カラム名で指定可能
* 複合インデックスも`[カラム名, カラム名]`で指定可能
* 普通にインデックス名もok

```ruby:app/models/concerns/index_hint.rb
module IndexHint
  extend ActiveSupport::Concern

  class_methods do
    def convert_to_index_name_in_case_of_column_name(*names)
      names.map { |idx| find_index_name_by_colomun_names(idx) || idx }
    end

    private

    def find_index_name_by_colomun_names(column_names)
      column_names = Array.wrap(column_names).map(&:to_s)

      name = connection.indexes(table_name).find { |index| index.columns == column_names }&.name
      connection.quote_column_name(name) if name
    end
  end

  included do
    scope :use_index, lambda { |*indexes|
      index_names = convert_to_index_name_in_case_of_column_name(*indexes)
      from("#{quoted_table_name} USE INDEX(#{index_names.join(', ')})")
    }

    scope :ignore_index, lambda { |*indexes|
      index_names = convert_to_index_name_in_case_of_column_name(*indexes)
      from("#{quoted_table_name} IGNORE INDEX(#{index_names.join(', ')})")
    }

    scope :force_index, lambda { |*indexes|
      index_names = convert_to_index_name_in_case_of_column_name(*indexes)
      from("#{quoted_table_name} FORCE INDEX(#{index_names.join(', ')})")
    }
  end
end
```

## Use

`ApplicationRecord` レベルで `include` してあげれば全てのモデルで使えますね。
モデル単体で `include` してもokです。

```ruby:app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  include IndexHint
...
```

実際に使うとこんな感じ

```ruby
Model.use_index(:created_at).to_sql
#=> "SELECT `models`.* FROM `models` USE INDEX(`index_models_on_created_at`)"

Model.force_index([:section, :name]).to_sql
#=> "SELECT `models`.* FROM `models` FORCE INDEX(`index_models_on_section_and_name`)"

Model.ignore_index([:section, :name], :created_at).to_sql
#=> "SELECT `models`.* FROM `models` IGNORE INDEX(`index_models_on_section_and_name`, `index_models_on_created_at`)"
```

## 注意点

* `from`, `use_index`, `force_index`, `ignore_index` を組み合わせられない

## 参考

* [\[Feature\] Active Record: Add \`use\_index\` by gaurish · Pull Request \#30514 · rails/rails](https://github.com/rails/rails/pull/30514)
* [MySQL :: MySQL 5\.6 リファレンスマニュアル :: 13\.2\.9\.3 インデックスヒントの構文](https://dev.mysql.com/doc/refman/5.6/ja/index-hints.html)
* [ruby on rails & mysql use force index \- Qiita](https://qiita.com/cut_yocchan_ika/items/98280f0b91b3af0aef84)