OmniAICreator/Qiita-1.07M huggingface dataset:
PythonAnywhereにDjangoアプリをデプロイする

環境
OS : macOS Mojave
Anaconda : python3.6.7
Django==2.1.5

#準備
Gitのインストール
Githubのアカウント作成
PythonAnywhereのユーザ登録

以下の記事を参考にさせていただきました

[GitHubのアカウント登録からリポジトリ操作まで](https://qiita.com/muneo/items/1321bf8cdb21178a73e2)
[【Django】PythonAnyWhereにデプロイする
](https://ymgsapo.com/deploy-pythonanywhere/)

#settings.py
末尾に以下の1行を追加

```python:settings.py
ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com']
```

#Gitレポジトリの作成
```:Terminal
$ git init
Initialized empty Git repository in ~/djangogirls/.git/
$ git config --global user.name "Your Name"
$ git config --global user.email you@example.com
```

#.gitignoreの作成
```:Terminal
touch .gitignore
```

```:.gitignore
*.pyc
*~
__pycache__
myvenv
db.sqlite3
/static
.DS_Store
```
#コミット
```:Terminal
$ git add --all .
$ git commit -m "ooooo, first commit"
```

#Githubのレポジトリ作成とプッシュ
```:Terminal
$ git remote add origin https://github.com/<your-github-username>/ooooo.git
$ git push -u origin master
```
#PythonAnywhere

```:bash
$ mkvirtualenv myenv --python=python3.6
$ pip install django
$ pip install (その他必要なパッケージ)
```
右上、WebタブからAdd a new web app
このときにframework選択画面でDjangoではなく、manual configurationを選択すること(詳しくは参考サイトを)

virtualenvの選択とWSGI Configlation fileの編集をし
コンソールをひらき、以下のコマンドを実行

```:bash
$ python3 manage.py collectstatic
$ python3 manage.py createsuperuser
```
staticファイルの場所を選択
WebページトップのReoladを押して更新

アプリページを開いて無事表示されればOK!

**追記**
PythonAnywhereで

```
$ python manage.py (コマンド)
```
とやるとエラーが出たりしたが、本文中にあるようにpython3とうって実行すると上手く実行できた

#終わりに
Django Girls Tutorialの手順でやったらうまく行かなかったので、いろいろ調べて一からやってみたらうまくできた。
よろしっかったらご参考までに。
【SSLメモ】自己署名証明書の作成コマンド

## 概要

## 前提

- 「自己署名証明書」（通称：オレオレ証明書）はそんなに安全ではない、という理解。
- オレオレ証明局を用意している状態。
- サーバー用のCSR情報ファイルを作成している状態。

## 自己署名証明書作成

SSL証明書の自己署名証明書の話。
オレオレ証明局を使って任意のサーバー用のSSL証明書を発行する場合に、
認証局とサーバー用のcsr情報が完全一致じゃないと怒られる(例 `The organizationName field needed to be the same`)ので
オプション(`-policy policy_anything`)を付けて回避しましょうと。
調べても断片的な情報しか出てこないので、自分用に各オプションをついでにメモ。

``` shell
$ # ca(certification authority)コマンドで、認証局を通してSSLを作成
$ openssl ca \
    -keyfile ./ca_nagait84.key \
    -cert ./ca_nagait84.crt \
    -outdir ./ \
    -policy policy_anything \
    -in ./server.csr \
    -out ./server.crt \
    -days 36500 \
    -extfile ./san.ext
```

- `-keyfile ./ca_nagait84.key` オレオレ証明局の秘密鍵を指定
- `-cert ./ca_nagait84.crt` オレオレ証明局のCRTを指定
- `-outdir ./` 発行されるSSL証明書の複製を保存するパスを指定？？
- `-policy policy_anything` オレオレ証明局の情報とサーバー用のCSR情報が完全一致である必要が**ない**とき
- `-in ./server.csr` サーバー用のCSR情報ファイルを指定
- `-out ./server.crt` 発行されるSSL証明書のパスを指定
- `-days 36500` 発行されるSSL証明書の有効期限を指定
- `-extfile ./san.ext` Chromeの「SSL_ERROR_BAD_CERT_DOMAIN」エラー対策。SAN(SubjectAltName)の指定が必要なとき、SAN情報を書いているファイルを指定。（前提として `openssl.cnf` の `[ usr_cert ]` セクションの `subjectAltName = @alt_names` などの設定が必要。もしくは `-config` オプションにして上書きする）
rails タグ検索実装

##はじめに
自作のポータルサイトにタグ検索を実装したので、復習しておきます。
http://nishikanako.work

##方法

下記のソースのように、スクレイピングしてきたurlのタイトルと説明文の中に、選択しているキーワードがあれば、抜き出してテーブルにデータの中に保存。

```scrape.rb
tag_keyword = ["あおい", "さくら", "きいろいゾウ", "通天閣", "しずく", "こうふく みどりの", "こうふく あかの", "窓の魚", "映画", "i", "イベント", "うつくしい人", "きりこについて", "炎上する君", "白いしるし", "円卓", "漁港の肉子ちゃん", "地下の鳩", "ふくわらい", "インタビュー", "サイン会", "ふる", "舞台", "サラバ", "まく子", "おまじない", "イベント", "劇場", "上映", "まにまに" ,"ご飯ぐるり", "作家", "小説家", "Youtube", "対談"]
      tag_keyword.each do |keyword|
        if (title+description).index(keyword) != nil then
          scrape_tag = ScrapeTag.create(
            :tag        =>  keyword,
            :scrape_id  =>  scrape.id
          )
          p '[Tag] ' + keyword
        end
      end
```
>indexメソッドは、配列から引数objと同じ要素を探し、その位置を整数で返します（1番目が0、2番目が1、...）。要素が見つからないときは、nilを返します。
https://ref.xaio.jp/ruby/classes/array/index

とのこと。
上のソースを文章で整理すると、キーワードの存在性を一つ一つ検証する。ここで、タイトルと概要文のなかにキーワードがあれば（nilでなければ）、そのキーワードを該当するurlに紐づけて（scrape.id）、データとして保存する。二つのテーブルの紐付けは ```belongs_to``` と ```has_many``` を利用した。

これを記事の概要文の下に表示。

```views/home.html.rb
<% scrape.scrape_tags.each do |tag| %>
　#bootstrap
  <span class="badge badge-lg badge-primary  ">
  <a href="/?keyword=<%= tag.tag %>" style="color:white"><%= tag.tag %></a>
  </span>
<% end %>
```
下の青のボックスの中に入った単語がタグとして表示される。
aタグでリンクにしているので、タグをクリックすればそのタグがついた記事がだけが表示されるようになる。

<img width="1440" alt="スクリーンショット 2019-04-16 16.31.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365406/84cb324e-3a38-0f80-6bcc-e1e20bc35e0c.png">

上記のようにするには、contorollerの方で記事の集合体のインスタンス変数（@scrapes）を条件に分けて定義する必要がある。



```sample_controller.rb
def home
    if params[:keyword].present?
      @scrapes = Scrape.where("title LIKE ? or description LIKE ?","%"+params[:keyword]+"%","%"+params[:keyword]+"%").paginate(page: params[:page],:per_page => 21).includes(:scrape_tags)
    else
      @scrapes = Scrape.paginate(page: params[:page],:per_page => 21).includes(:scrape_tags)
    end
end
```

paramsでキーワードの存在性を確認して、ない場合は全ての記事を取得、ある場合はタイトルか概要文にキーワードが含まれている記事だけを取得するようにしている。

##終わりに
今回,mecabを利用しようと思いましたが、例えば名詞だけを抜き取ろうとしたところ、あまり有用性のある単語がなかったので、indexメソッドを利用しました。

解説不足なところがありましたら、コメントよろしくお願いします♪( ´▽｀)
ActionView::Template::Error (undefined method `admin?' for #<User:0x00005608848acef0>):でなかなかハマった

##状況説明
rails tutorialの10章をやってた時、local環境では問題なく動いてたのに、herokuにデプロイしたら一部のページでエラーが帰ってきた。

![heroku3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393042/e83a46d3-300f-ea5a-c7ad-8612e0e9d325.png)

##仮説
undefined method 'admin?' ということだが、もしかしてheroku上のデータベースがlocal環境のものと一致してないのではと考えた


##解決方法
結果から言うと、上の通りでheroku上のデータベースが更新されていないから、admin?メソッドなんてないよって怒られたみたい。（そりゃそうだ）
と言うわけで以下のコマンドをherokuファイルがあるディレクトリで実行

```
$heroku run rake db:migrate
$heroku restart
```
sakura.ioにAPI経由でモジュールを登録する

sakura.ioのAPIを使ってモジュールを登録する。モジュールの登録は `POST https://api.sakura.io/v1/modules/` として行う。 ([APIドキュメント](https://api.sakura.io/v1/docs/#!/Module/post_v1_modules))

## 事前作業
### APIキーの発行

[sakura.ioコンソール](https://secure.sakura.ad.jp/iot/console/#/)にログインしてAPIキーを発行します。

右上のプルダウンから「APIキー」を開き…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29860/16b6a8dc-d606-df72-4a0e-96b8b96caaec.png)

「APIキー追加」を進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29860/c208e422-12e1-eaa3-ec4e-3d1974554061.png)

「全権限」で作成。TokenとSecretを控えましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29860/be029b8b-3b36-bd0b-f298-b09f48705316.png)


### プロジェクト作成

「プロジェクトを追加」します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29860/6d9f65d4-9dfc-4071-ed15-c41dd2b60412.png)

プロジェクトの番号を控えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29860/e3dbf95e-2569-89e1-1831-3337573b90af.png)


## CSVを作る

`登録名称`, `registerId`, `registerPass` の形でCSVを作る。

```csv:sakuraio.csv
name,REGISTER_ID,REGISTER_PASS
```


## コード

次のコードでまとめて取り込む。

```python
import csv
import requests
from requests.auth import HTTPBasicAuth

TOKEN = '<INPUT_YOUR_TOKEN_HERE>'
SECRET = '<INPUT_YOUR_SECRET_HERE>'
PROJ_ID = <INPUT_PROJECT_ID_HERE>


reader = csv.reader(open('sakuraio.csv', 'r'))
url = 'https://api.sakura.io/v1/modules/'


for name, register_id, register_pass in reader:
  d = {
    'project': PROJ_ID,
    'name': name,
    'register_id': register_id,
    'register_pass': register_pass,
  }

  res = requests.post(url, json=d, headers={'Content-Type': 'application/json'}, auth=HTTPBasicAuth(TOKEN, SECRET))
  print(res)
```
NetworkX の使い方

NetworkX の使い方です。

```py:number01.py
#! /usr/bin/python
#
#	number01.py
#
#						Apr/16/2019
# ------------------------------------------------------------------
import sys
import networkx as nx

# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

G = nx.DiGraph()  # 有向グラフ (Directed Graph)

data_array = [1,2,3,4,5,6,7,8]

# 指定した閉路上の頂点と辺を追加
G.add_cycle(data_array)
#
nx.nx_agraph.view_pygraphviz(G, prog='fdp')
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行結果
![number01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/fd2247f5-ac7f-d06e-feb5-3345555c389d.png)


ラベルを使う例

```py:label01.py
#! /usr/bin/python
#
#	label01.py
#
#						Apr/16/2019
# ------------------------------------------------------------------
import sys
import networkx as nx
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

G = nx.DiGraph()  # 有向グラフ (Directed Graph)

data_array = ['文久','元治','慶応','明治','大正','昭和','平成','令和']

# 指定した閉路上の頂点と辺を追加
G.add_cycle(data_array)
#
nx.nx_agraph.view_pygraphviz(G, prog='fdp')
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行結果
![label01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/834cdd40-b6ec-e6ec-2919-72d00a094f0d.png)

使った NetworkX のバージョン

```text
$ python
Python 3.7.3 (default, Mar 26 2019, 21:43:19) 
[GCC 8.2.1 20181127] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import networkx
>>> networkx.__version__
'2.2'
```
DropzoneJSとCarrierwaveを使って複数のファイルをアップロードする

Githubページ
DropzoneJS：https://github.com/ncuesta/dropzonejs-rails
Carrierwave：https://github.com/carrierwaveuploader/carrierwave

#DropzoneJSとは何
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332720/0516ed3a-3939-dc3c-101e-8f0f5fba61c8.png)
DropzoneJSはAJAXで複数のファイルをアップロードすることを可能にするJavaScriptライブラリです。さらに、このライブラリはアップロードされた画像のドラッグアンドドロップファイルとプレビュー機能もサポートします。

#インストール
Gemfileに次のgemを追加します。

```
gem "dropzonejs-rails"
gem "carrierwave"
```
コマンドを実行します。

```
bundle install
```

ファイルapp/assets/javascripts/application.jsに次の行を追加します。

```
//= require dropzone
```
ファイルapp/assets/javascripts/application.cssに次の行を追加します。

```
*= require dropzone/dropzone
```
Pictureアップローダを作成します。

```
rails g uploader picture
```
モデルImageを生成します。

```
rails g model image file_name:string
```
ファイルapp/models/image.rb：

```image.rb
class Image < ApplicationRecord
  mount_uploader :file_name, PictureUploader
end
```
次に、コントローラapp/controllers/images_controller.rbを作成します

```images_controller.rb
class ImagesController < ApplicationController
  skip_before_action :verify_authenticity_token
  def index
  end
  
  def create
    @image = Image.new(file_name: params[:file])
    if @image.save
      render json: { message: "success", fileID: @image.id }, :status => 200
    else
      render json: { error: @image.errors.full_messages.join(',')}, :status => 400
    end
  end
end
```
それからroutes.rbに次の内容を追加します。

```routes.rb
Rails.application.routes.draw do
  resources :images, only: [:index, :create]
  root "images#index"
end
```
次はビューを作成します。ファイルapp/views/avatars/index.html.erbに以下のような内容を作成します。

```index.html.erb
<h1>My Images</h1>
<%= form_for(Image.new, html: {multipart: true, class: "dropzone"}) do |f|  %>
  <div class="fallback">
    <%= f.file_field :file_name, multiple: true %>
  </div>
<% end %>

<script>
  $(function() {
    // disable auto discover
    Dropzone.autoDiscover = false;

    $(".dropzone").dropzone({
      maxFilesize: 1,
      addRemoveLinks: true
    });
  });
</script>
```

#結果
![Apr-16-2019 14-45-47.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332720/adbc35ac-c4bf-3caf-394f-a410afa42760.gif)

#Dropzoneのevent
[ここ](https://www.dropzonejs.com/#event-drop)で提供されているdropzoneイベントのリストを参照することができます。

#Dropzone設定
[ここ](https://www.dropzonejs.com/#configuration)で設定できるコンフィグレーションの一覧を参照することができます。

#まとめ
この記事では、Dropzoneをインストールして使用するための基本的な手順を説明します。みんなの仕事に役に立つと嬉しいです。:smiley:
Numpy備忘録 その１(配列作成〜演算まで)

##参考文献
[はじめてのディープラーニング(我妻幸長[著])](https://www.sbcr.jp/products/4797396812.html)


# import
```
import numpy as np
```

# 一次元配列の作成 (array関数)
```
a = np.array([0,1,2,3,4,5])
print(a)
```
```
[0 1 2 3 4 5]
```
横に５

# 二次元配列の作成
```
b = np.array([[0,1,2], [3,4,5]])
print(b)
```
```
[[0 1 2]
 [3 4 5]]
```
縦が２、横が３

# 三次元配列の作成
```
c = np.array([[[0,1,2],[3,4,5]],[[6,7,8],[9,10,11]]])
print(c)
```
```
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]]
```
重なりが２、縦が２、横が
3

# 形状の取得(shape関数)
```
c = np.array([[[0,1,2],[3,4,5]],[[6,7,8],[9,10,11]]])
print(np.shape(c))
```
```
(2, 2, 3)
```
重なりが２要素、縦が２要素、横が3要素

# 要素数の取得(size関数)
```
c = np.array([[[0,1,2],[3,4,5]],[[6,7,8],[9,10,11]]])
print(np.size(c))
```
```
12
```
トータルの要素数は12

#全て０の配列(10個)
```
print(np.zeros(10))
```
```
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
```

#全て1の配列(10個)
```
print(np.ones(10))
```
```
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
```

# arange関数 (刻み値指定による連続した配列)
## その１
```
print (np.arange(0, 1, 0.1))
```
引数1:開始値
引数2:終了値
引数3:刻み値

```
[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
```
## その２
```
print (np.arange(10))
```
終了値のみ

```
[0 1 2 3 4 5 6 7 8 9]
```

# linspace関数　(要素数指定による連続した配列)
## その１
```
print(np.linspace(0,1,11))
```
引数1:開始値
引数2:終了値
引数3:要素数

```
[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]
```

## その２
```
print(np.linspace(0,1))
```
引数3:要素数　省略

```
[0.         0.02040816 0.04081633 0.06122449 0.08163265 0.10204082
 0.12244898 0.14285714 0.16326531 0.18367347 0.20408163 0.2244898
 0.24489796 0.26530612 0.28571429 0.30612245 0.32653061 0.34693878
 0.36734694 0.3877551  0.40816327 0.42857143 0.44897959 0.46938776
 0.48979592 0.51020408 0.53061224 0.55102041 0.57142857 0.59183673
 0.6122449  0.63265306 0.65306122 0.67346939 0.69387755 0.71428571
 0.73469388 0.75510204 0.7755102  0.79591837 0.81632653 0.83673469
 0.85714286 0.87755102 0.89795918 0.91836735 0.93877551 0.95918367
 0.97959184 1.        ]
```
要素数は５０になる

# reshape関数 (配列の形状変換)
## その１ 二次元配列への変換
``` 
a = np.array([0,1,2,3,4,5,6,7])
b = a.reshape(2,4)
print(b)
```
```
[[0 1 2 3]
 [4 5 6 7]]
```
縦２、横4

## その２ 三次元配列への変換
```
a = np.array([0,1,2,3,4,5,6,7])
c = a.reshape(2,2,2)
print(c)
```
```
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
```
重なり2, 縦2, 横2

## その3 三次元から二次元配列への変換
```
a = np.array([0,1,2,3,4,5,6,7])
c = a.reshape(2,2,2) # 一時的に三次元配列へ
d = c.reshape(4,2)   # 二次元配列へ 
print(d)
```

```
[[0 1]
 [2 3]
 [4 5]
 [6 7]]
```
縦4,横２

# 一次元配列への変換
```
a = np.array([0,1,2,3,4,5,6,7])
b = a.reshape(2,2,2) # 一時的に三次元配列
c = b.reshape(-1)　# 一次元配列へ
print(c)
```
引数に(-1)を指定することで、どんな形状の配列も一次元配列に変換する。

```
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]

[0 1 2 3 4 5 6 7]
```
三次元配列から一次元配列へ

#配列演算
## その１　単純演算
```
a = np.array([0,1,2,3,4,5]).reshape(2,3) #縦2,横３の配列作成
print(a,'\n')
print(a + 5,'\n') # 全ての要素に5を足す。
print(a * 5,'\n') # 全ての要素に5をかける。
```

```
[[0 1 2]
 [3 4 5]] 

[[ 5  6  7]
 [ 8  9 10]] 

[[ 0  5 10]
 [15 20 25]] 
```

## その2　ブロードキャスト(形状の違う配列同士の演算)
整理中。。
[swift] 配列に入れたUIButtonをaddSubviewできなかった問題

# はじめに
複数のボタンをaddSubviewで追加した際にうまく表示されない、というかsubviewに追加すらされてない、という問題が発生したのでメモ。

# 原因

addSubviewするごとにsubviewsを表示させてみたところ、常に一つしかボタンが追加されておらず、上書きされているような挙動をしていました。

配列を生成する際に

```swift
var buttons: [UIButton] = [UIButton](repeating: UIButton(), count: 5)
```

というように生成していたことが原因のようです。

このようにすると同一のインスタンスが配列の各要素に入るようで、addSubviewした際に上書きされるような挙動をするみたいです。

```swift
for _ in 0...4 {
    buttons.append(UIButton())
}
```

のようにすることで無事表示されるようになりました。
重回帰分析の係数の検定と信頼区間

#1. 要約
　本記事では重回帰分析によって求まった係数に対しての検定方法と，なぜその統計量を利用するのかについてまとめました．
#2. 係数の分布
　Xを1列目が$1_n$である$n\times (p+1)$行列とし，yを$n\times 1$の従属変数ベクトル，$\beta$を$p\times 1$の係数ベクトル，eを$n\times 1$の誤差ベクトル(確率変数ベクトル)とすると，重回帰分析のモデル式は$$y = X\beta + e$$と表され，係数$\beta$の最小二乗推定量$\widehat{\beta}$は$$\widehat{\beta} = (X^TX)^{-1}X^Ty$$で表されます．ここで$$e\sim N(0_n,\sigma^2 I_n)$$であることに注意すると，その線型結合で表されるyの分布は$$y\sim N(X\beta, \sigma^2I_n)$$となります．また係数の最小二乗推定量$\widehat{\beta}$は先ほどのyの場合と同様にeの線型結合で表されるので，

```math
\begin{eqnarray}
E[\widehat{\beta}] &=& (X^TX)^{-1}X^TE[y]\\
&=& (X^TX)^{-1}X^TX\beta\\
&=& \beta \\
V[\widehat{\beta}] &=& V[(X^TX)^{-1}X^Ty]\\
&=& (X^TX)^{-1}X^TV[y]X(X^TX)^{-1}\\
&=& (X^TX)^{-1}X^T\sigma^2I_nX(X^TX)^{-1}\\
&=& (X^TX)^{-1}\sigma^2
\end{eqnarray}
```
から，$$\widehat{\beta}\sim N(\beta, (X^TX)^{-1}\sigma^2)$$となることがわかります．重回帰分析ではどの係数がモデルにとって必要なのか，つまり，__どの係数が不要なのか__について検定を行います．$\beta = [\beta_1,\beta_2,\cdots,\beta_p]^T$とすると以上の検定の帰無仮説は$$H_0:\ \beta_j = 0\ (j=1,\cdots,p)$$
となり，これが有意水準$\alpha$で棄却されるか否かを計算します．次節では，$\beta$から検定統計量を導出します．
#3. 検定統計量
　先ほどの帰無仮説$H_0$:$\beta=0_p$が正しいとすると，$$\widehat{\beta}\sim N(0_p, (X^TX)^{-1}\sigma^2)$$となり，帰無仮説のもとで，統計量Tは

```math
\begin{eqnarray}
T = \frac{\beta_j-0}{\sqrt{\widehat{\sigma}^2v_{jj}}}
\end{eqnarray}
```
で表される．ここで$v_{jj}$は$(X^TX)^{-1}$の$(j,j)$成分を，$\widehat{\sigma}^2$は$\sigma^2$の不偏推定量を表している．$\widehat{\sigma}^2$が$$\frac{(N-p-1)\widehat{\sigma}^2}{\sigma^2}\sim\chi^2_{N-p-1}$$となることに注意すると，

```math
\begin{eqnarray}
T &=& \frac{\beta_j-0}{\sqrt{\widehat{\sigma}^2v_{jj}}}\\
&=& \frac{\frac{\beta_j-0}{\sigma\sqrt{v_{jj}}}}{\sqrt{\frac{\widehat{\sigma}^2}{\sigma^2}}}\\
&\sim&\frac{N(0,1)}{\sqrt{\frac{\chi^2_{N-p-1}}{N-p-1}}}\sim t_{N-p-1}\\
\end{eqnarray}
```
とTは自由度$N-p-1$のt分布に従うことがわかる．重回帰分析の係数が必要であるかどうかの検定は，この検定統計量を用いてt検定を行うことで検証されます．ちなみに，この検定統計量の分母$$se(\beta_j)=\sqrt{\widehat{\sigma}^2v_{jj}}\ (j=1,\cdots,p)$$は標準誤差と呼ばれ，係数の推定量の精度を表します．標準誤差はデータの標準偏差をサンプル数の平方根で割ったものとして定義されますが，今回の場合，サンプル数$n=1$なので，見かけ上割ってないように見えますが，これで標準誤差を表します．
#所感
　もう重回帰分析飽きてきた感ある．多変量解析のモデルの多くは線形モデルなので，重回帰分析は全ての基礎となりますが，流石にくどいです．次回は一旦ロジスティック回帰の話をやりたい．
#参考文献
[Hasitie,Tibshirani,Friedman(2009)._The elements of statistical learning_](https://www.springer.com/jp/book/9780387848570)
Flutter admob 初期設定　自分用メモ

初期設定をしないとアプリがクラッシュするので自分用メモ

# Flutter admob 以下参考ページ
使用プラグイン　
firebase_admob: 0.8.0+3
公式サイト
https://pub.dartlang.org/packages/firebase_admob

# 以下手順
## プロジェクト作成
省略
## プラグイン追加
1.作成したプロジェクトを開き<font color="red">「pubspec.yaml」</font>を開く
2.<font color="red">「pubspec.yaml」</font>に公式のページを参考にプラグインの追加の記載を行う
![スクリーンショット 2019-04-16 16.06.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399708/87517653-1da8-62de-f202-a9a91463e166.png)
3.ターミナルを開き以下のコマンドを流す<br>
<strong>flutter packages get</strong>
## AndroidManifest.xmlの設定追加
1.AndroidManifest.xmlを開く　以下filepass記載　<br>
filepass:<font color="red">プロジェクト名/android/app/src/main/AndroidManifest.xml</font>
2.公式のページを参考に以下の設定を追加 <br>
### 記載内容
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
    android:value="[ADMOB_APP_ID]"/>　<br>
※[ADMOB_APP_ID]　に関しては各自用意した値へ書き換え
![スクリーンショット 2019-04-16 16.23.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399708/cf3b6f88-e5ef-ec24-27a3-cae6c2202975.png)
3.アプリを起動してクラッシュせずに立ち上がれば初期設定は完了です。

![スクリーンショット 2019-04-16 16.29.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399708/77256356-9537-1d91-cce8-aa24f744458f.png)
D-Oceanの使い方

　BigQueryを無料で扱いたい方や、オープンデータの投稿、解析を行いたいという方にオススメなのが、D-Oceanというサイトです。
　FaceBook,Github,Googleいずれかのアカウントを持っている方はこちらのURLからすぐに登録できます。

https://www.docean.io/

　ログイン、アカウント登録を済ませると、すぐにPICK UPされたいくつかのオープンデータが現れます。その他にもSearchで様々なデータを閲覧可能になります。
![S__139747332.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396628/1d76f4b3-3034-bf8a-31f2-a96593560ecf.jpeg)

　ここから好きなものを一つ選んで見ましょう。以下の画面が表示されます。
![S__139747331.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396628/33f4a865-7ca7-b83f-206e-55adc6c24535.jpeg)

　さらに下のQueryを選択すると、それだけでBigQueryが利用できます。あとは好きにデータを利用するだけです！ちなみにCSVファイルとしてダウンロードすることも可能なのでpythonでの分析にも利用できます。
<img width="993" alt="スクリーンショット 2019-04-16 16.15.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396628/9c37c8e7-79cc-db49-2956-ddb0b3a0b8bf.png">


　非常に便利ですし、登録も簡単なので是非使ってみてください！
# よく使うRubyのメソッドとハッシュの書き方

### scanメソッド(正規表現にマッチした文字列を配列にして返す)

```ruby
def ints(arra)
  arr(/\w\w/).map do |s|
    s.hex
  end
end
```
もしくは、こうも書ける↓↓

### map/collectメソッド(事前に空の配列を用意し、他の配列をループ処理した結果を空の配列に入れて、配列を返す)
```ruby
def ints(array)
  arr(/\w\w/).map(&:hex)
  end
end
```
&に書く文字列の要素が入り、その要素毎にhexメソッドを適用させ、mapで、配列として返している。

違う書き方↓↓

````ruby
array.map {|s|  s.hex }  
```

### inject/reduceメソッド（配列を対象に、各要素毎に処理をした結果を繋げて、文字列を返す）

```ruby
def to_hex(r,g,b)
  [r,g,b].inject('#') do |hex, n|
    hex + n.to_s(16).rjust(2, '0')
  end
end
```
### where句の発展的な使い方(指定したフィールド内の値以外のレコードを取得したい場合)
```ruby
def map
    # @pictures = Picture.all.where('not latitude is null and not longitude is null')
    # @pictures = Picture.all.where.not(latitude: nil).where.not(longitude: nil)
    @pictures = Picture.all.where.not("latitude = ?", "nil").where.not("longitude = ?", "nil")
    @api_key = ENV["GOOGLE_MAP_API"]
  end
```


# ちょっと高度なハッシュ記法

```ruby
# fromはキーmのこと。toはキーmのこと。

def convert_length(length, from: :i, to: :i)
  units = {m: 1.0, ft: 3.28, in: 39.37}
  (length / units[from]) * units[to].round(2) 
end

puts convert_length(15, from: :in, to: :m)
=> 0.38

```


### ハッシュ
以下は同じ結果がでる。

```ruby
products = {lemon: 145, aplle: 180, orange: 170, tomato: 120, grape: 140}
p products.delete_if{|key, value| key == :lemon || key == :tomato || key == :grape}
p products.select { |key, value| key > 160}
```
Chrome のタブ汚い問題 ~それ Station で解決してみませんか~

Chrome に AWS とか Firebase のコンソールやら Backlog やら
頻繁に使うものをタブに残してると「あれ・・・どこいった・・・」ってなりますよね。
タブが乱立して汚いし。

それ、Station で解決しませんか。(受け売り)


## What's Station App

Web アプリを一元管理してそんな問題を解消してくれる便利なやつ。

ダウンロードはここから
[Station](https://getstation.com/)


## しかし、クラウドサービスとかメジャーなやつしか対応していない...!!

redmine とか GitBucket とかオンプレでたててるやつも管理できたら嬉しいなー🤔
社内サーバで動いてるアプリとか。


### できます

1. 適当なアプリを追加
2. `View -> Developer -> Toggle Page Developer Tools` を選んで
3. コンソールから魔法のコマンド `location.href="URL";`

で向き先を変えるだけ。


### アップデートで任意のアプリを追加できるようになりました

と思っていたら、

`バージョン 1.40.1` から個人使用で好きな URL の Web アプリを追加できるようになりました。

[Station 1.40.1 - Release notes - Station Community 🤗](https://community.getstation.com/t/station-1-40-1/7399)

> Improved the support of custom applications: newly added custom applications will be immediately available for installation


1. `Add an app`
2. `Private app` or `Company app` の `Add now`
3. 名前とアイコンとURLを決めて `Add` を ﾀｰﾝｯ!!

🤗


- Company app

追加すると同じドメインで管理されているメンバー間でアプリが共有できます。
チームで使いたい場合とかに便利ですね！

<img width="932" alt="スクリーンショット 2019-04-16 15.21.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308397/105501a1-8448-4990-f922-83d03046e4be.png">


スッキリ😄
Chrome が Viewer として機能する様になった気がします。

強引に URL を捻じ曲げる方法はファイルのダウンロードとかするとブラウザに連携するので、
独自アプリを追加した方が Station 内で解決していい感じです。


他にも複数アカウントを管理したりとかもできます！
チームごとのバックログの使い分けができたりしていいですね。

でも AWS で別アカウント用のインスタンスを追加したら
元々ログインしてたアカウントのインスタンスが強制ログアウトされてたし
アカウント名が追加したアカウントに変わってたりしたので注意してください。

mac だとトラックパッド [ｼｭｯ] てやっても画面戻ってくれなかったり色々と不満はありますが、
今の所仲のいい友達やっていけてます。


## 参考

[追伸。そろそろおまえもstationでslackやWebアプリを一括管理をするように。　母より - Qiita](https://qiita.com/shojimotio/items/77678d55a2d1557f5e68)

[Custom URL support / Support any web-app - Feature requests - Station Community 🤗](https://community.getstation.com/t/custom-url-support-support-any-web-app/363)
ubuntu環境でのanaconda3のインストール / condaが使えないとき

WSLを利用してanacondaの環境を設定する際のまとめです。(desktop ubuntuもほぼ同様です)
condaが利用できないときの対処法も書いてあります。

# インストール方法
### 1.　.shのダウンロード
https://www.anaconda.com/ から該当するものをダウンロードします。(DL先はどのディレクトリでも問題なし)
今回は、`Users/username/Downloads`にダウンロードした前提として進めます。
注)WSL環境で動かす場合はLinuxを選択！

### 2. bashからの実行
ダウンロードした.shファイルをもとにしてインストールしていきます。
WSLのbashの場合は、以下の1行を実行すれば完了です。

``` shell
bash ../../mnt/c/Users/user_name/Downloads/Anaconda3-2019.03-Linux-x86_64.sh
```
次のコマンドでちゃんとanacondaが使えるか確認しましょう。

``` shell
$ python3
>>> import numpy as np
>>> np.__file__
```
この実行結果で、anaconda3を参照できていればOKです。
anacondaが使えていない場合は次の節に進んでください。



# 想定される問題点
インストール完了後、次の２点の問題が発生する恐れがあります。

**(1)既存のpython環境で実行され、anacondaが利用できない。**
この場合、
`conda activate`
によってconda環境を適用できるようになるらしいです。
(私はこれでもできなくて次に進む。)

**(2) condaが利用できない。**
上記実行時、condaが使えない恐れがあります。このときはpathが通っていないのが原因です。
`.bashrc`に次を書き込みましょう。
`export PATH=“~/anaconda3/bin:$PATH"`
これで、bashを再起動すれば、使えるようになるはずです！

# おまけ
私はここまでやった後、`import numpy`の段階で、
**_ctypesがないよ**というエラーが出ました。
この場合、次を実行すれば良いようです。

``` bash
$ sudo apt install libffi-dev
```
BacklogのGitからssh認証でgit cloneするには

ハマったので備忘録

# 最初にユーザー名とホスト名を確認しましょう
プロジェクト-> Gitから、レポジトリ一覧がみれます。

`ssh`を選択し、得られる文字列があると思いますが、以下のような順番になっています。`git clone`で使う文字列です。
**ユーザー名とホスト名が重要です。メモってください**

```
ユーザー名@ホスト名:/プロジェクト名/レポジトリ名.git
```

# ssh-keygenで鍵を作成
`.ssh`で作るとひと手間省けます。

```shell
cd ~/.ssh/
ssh-keygen -t rsa -b 4096 -m pem -C "Backlog" -f id_rsa_backlog -N ""
```

# Backlogにコピペで貼り付ける

**個人設定**->**ssh公開鍵**に公開鍵の情報を貼り付ける
(上記の例では`id_rsa_backlog.pub`)

# ~/.ssh/configを書いてホストの解決

既存のconfigファイルがなければ作りましょう。

```config
# ~/.ssh/config
Host ホスト名
  HostName ホスト名
  IdentityFile ~/.ssh/id_rsa_backlog
  User ユーザー名
```

# 適切なフォルダでgit clone

```shell
git clone ユーザー名@ホスト名:/プロジェクト名/レポジトリ名.git
```
PDFのフォントと検索エンジンの関係

以前、ファイルサーバー上のファイルを検索するために、検索エンジンを構築したときのこと。

クロールしたファイルが正しくインデックスされているか確認するためキーワード検索を実施しました。すると、MS-Word, PowerPoint, Excel, TEXTファイルは検索出来たのに、ある特定のPDFファイルが見つかりませんでした。

インデックスされていないのかと思い、PDFファイル名を指定して検索すると、ファイル名が検索結果に表示されました。しかし、検索結果のサマリーには、文字化けしたテキストが表示されました。

元のファイル自体が文字化けしているのかと思い、対象のPDFをAdobe Readerで開くと、正しく日本語で表示されました。変だなぁと思い、メッセージをコピーしてテキストエディタにペーストしたところ、文字化け・・。正しく表示されるのは、Adobe Readerの時だけのようです。
検索でこのPDFファイルが検索出来なかったのは、この文字化けが原因の様です。

Adobe ReaderでこのPDFファイルで使用しているフォントを確認したところ、"Type 3" となっていました。
Windows OS には、"Type 3"フォントは無い(google検索より)ので、文字化けしてしまったようです。
（今回、検索エンジンを動かしているOSと、Adobe Readerを使用したOSは共に Windows OSです）

そもそも、"Type 3"フォントを指定したPDFファイルが作られた経緯は分かりませんでしたが（当時そのPDFファイルを作った人と連絡がつかないため）、フォントを適切なものに変更することで、解消できました。

フォントの変更方法としては、
1. Adobe DC などのPDF編集ツールを使用する。
2. PDF作成時に、"Type 3"フォントを使用しないように、 PDF作成ツールの設定を見直す、あるいはツールの選定を見直す。
になります。

なお、"Type 3"に限らず、利用者側のOSにフォントがないと文字化けするので、それを避ける場合は、使用するフォントをPDFファイルに組み込む必要があるようです。
ABC - 037- A&B&C

#AtCoder ABC 037 A&B&C
[AtCoder - 037](https://atcoder.jp/contests/abc037)

**2019/05/27**
　問題名修正
　B問題のコードの書き方を修正 ``int[][]の生成部分``

#A - 饅頭

 - 安いほうをたくさん買う

```java
	private void solveA() {
		int a = nextInt();
		int b = nextInt();
		int c = nextInt();

		int num = Integer.min(a, b);

		out.println(c / num);
	}
```

#B - 編集

 - 指定された範囲を指定された値で書き換える
 - 重複操作になる箇所を省けたら早いんだろうけど、、、

```java
	private void solveB() {
		int numN = nextInt();
		int numQ = nextInt();

		int[][] wk = Stream.generate(() -> new int[] { nextInt(), nextInt(), nextInt() }).limit(numQ)
				.toArray(int[][]::new);
		//		int[][] wk = IntStream.range(0, numQ).collect(() -> new int[numQ][3],
		//				(t, i) -> {
		//					t[i][0] = nextInt();
		//					t[i][1] = nextInt();
		//					t[i][2] = nextInt();
		//				}, (t, u) -> {
		//					Stream.concat(Arrays.stream(t), Arrays.stream(u));
		//				});

		int[] res = new int[numN];
		for (int j = 0; j < wk.length; j++) {
			Arrays.fill(res, wk[j][0] - 1, wk[j][1], wk[j][2]);
		}

		Arrays.stream(res).forEach(i -> out.println(i));
	}
```

#C - 総和

 - 最初にlength分の数値を足す
 - その後は、後ろにずらすたびに、範囲外になった値を消して範囲内になった値を足す
 - 最後は回収

 - 回収のところ、本体の累積を出すところにマージできるな。。。
 
```java
	private void solveC() {
		int numN = nextInt();
		int numK = nextInt();
		long[] wk = LongStream.range(0, numN).map(i -> nextLong()).toArray();

		int length = numN - numK + 1;

		long[] res = new long[numN];

		res[0] = wk[0];

		for (int i = 1; i < numN; i++) {
			if (i < length) {
				res[i] += wk[i] + res[i - 1];
			} else {
				res[i] += wk[i] + res[i - 1] - wk[i - length];

			}
		}
		long resNum = 0;
		for (int i = length - 1; i < res.length; i++) {
			resNum += res[i];
		}

		out.println(resNum);
	}
```
【WinActor】現在時刻をログファイル名として設定する方法

ここでは、ロボット実行時の日付と時刻をログファイル名に設定する方法を紹介します。

■用意する変数
・現在時刻
・ログファイル名

１．現在時刻取得
使用ノード：日時取得
・取得結果：現在時刻
・フォーマットタイプ：日付と時間

２．現在時刻からスラッシュを削除
使用ノード：07_文字列操作\01_変換・整形\文字列置換
・変換文字列：現在時刻
・変換前：値⇒/
・変換後：値⇒

３．現在時刻からコロンを削除
使用ノード：07_文字列操作\01_変換・整形\文字列置換
・変換文字列：現在時刻
・変換前：値⇒:
・変換後：値⇒

４．現在時刻からコロンを削除
使用ノード：07_文字列操作\01_変換・整形\文字列置換
・変換文字列：現在時刻
・変換前：値⇒ 
※半角スペース
・変換後：値⇒
※設定なし

５．ログファイル名設定
使用ノード：07_文字列操作\03_連結\文字列の連結(２つ)
・文字列1：ログファイル名
・文字列2：現在時刻
・連結結果：ログファイル名

実際にログ出力するには、フルパスで指定する必要がありますので、さらにフォルダパスと連結する処理が必要です。

以上がWinActorによる、現在時刻をログファイル名として設定する方法でした。
google apps script でシートがなかったら作成してシートのオブジェクトを返す。

#google apps script でシートがなかったら作成してシートのオブジェクトを返す。
google apps script でシートがなかったら作成してシートのオブジェクトを返す。

# usage
```
var sheet = set_sheet("test_sheet");
sheet.getRange(1, 1).setValue("test");
```

```
function set_sheet(name){
  //同じ名前のシートがなければ作成
  var sheet = SpreadsheetApp.getActive().getSheetByName(name)
  if(sheet)
    return sheet
  
  sheet=SpreadsheetApp.getActiveSpreadsheet().insertSheet();
  sheet.setName(name);
  return sheet;
}

```
[Laravel 5.8] ログに記録する補足情報を渡せる例外を作る

# 前提

Laravelでログに書き込むとき

```php
info('sample info', ['foo' => 'bar', 'no' => 1]);
```

と第2引数に補足情報を渡すと、ログファイルでは

```
[2019-04-16 15:03:57]  local.INFO: sample info {"foo":"bar","no":1} 
```

のように記録してくれます。

---

例外をスローすると

```php
throw new \Exception('sample exception');
```

Laravelが補足して、自動でログファイルに書き込んでくれます。

```
[2019-04-16 15:11:44] local.ERROR: sample exception {"exception":"[object] (Exception(code: 0): sample exception at /var/www/scripts/routes/web.php:43)
[stacktrace]
#0 /var/www/scripts/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\RouteFileRegistrar->{closure}()
#1 /var/www/scripts/vendor/laravel/framework/src/Illuminate/Routing/Route.php(179): Illuminate\\Routing\\Route->runCallable()
...
```

ただ、例外をスローするときは補足情報を渡せないので、渡せるようなカスタム例外を作成してみます。

# カスタム例外の定義

artisanコマンドでカスタム例外クラスを作成します。

```sh
$ php artisan make:exception CustomException
```

カスタム例外クラスでは以下のようにします。`report()`はスローされた時に自動でLaravelから呼ばれます。
参考：https://readouble.com/laravel/5.8/ja/errors.html

```php:app/Exceptions/CustomException.php
<?php

namespace App\Exceptions;

use Exception;

class CustomException extends Exception
{
    /**
     *
     */
    protected $ctx;

    /**
     *
     */
    public function __construct($message = null, $ctx = [], $code = 0, Exception $previous = null)
    {
        $this->ctx = $ctx;
        parent::__construct($message, $code, $previous);
    }

    /**
     *
     */
    public function report()
    {
        logger()->error(
            $this->getMessage(),
            array_merge($this->ctx, ['exception' => $this]
        ));
    }
}
```

# スローしてみる

```php
use App\Exceptions\CustomException;

throw new CustomException('custom exception', ['foo' => 'bar', 'no' => 1]);
```

結果、ログファイルでは

```
[2019-04-16 15:22:41] local.ERROR: custom exception {"foo":"bar","no":1,"exception":"[object] (App\\Exceptions\\CustomException(code: 0): custom exception at /var/www/scripts/routes/web.php:39)
[stacktrace]
#0 /var/www/scripts/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\RouteFileRegistrar->{closure}()
#1 /var/www/scripts/vendor/laravel/framework/src/Illuminate/Routing/Route.php(179): Illuminate\\Routing\\Route->runCallable()
...
```

補足情報を渡せるようになりました。
他人のコードを読んで学んだこと


[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている梅原です。

[ハッカーランク](https://www.hackerrank.com)というプログラミングのいろいろな問題を解けるサイトがあり、最近解いているのですが、実力不足で解けない問題もあり、そんなときは、他の優秀なプログラマーが書いた回答を見ることができるのですが、色んな学びがあったのでアウトプットです。

##リストのfor文でインデックスと要素の二つを取得

```js
for i, name in enumerate(l):
    print(i, name)
```

```text:実行結果
0 Alice
1 Bob
2 Charlie`
```
##文字列や数字の形式を解析するとき、（オブジェクト）[start:stop]のようなスライスを使う
```py
l = [0, 10, 20, 30, 40, 50, 60]
print(l[2:5])
```

```text:実行結果
[20, 30, 40]
```

##判別子を使う
TrueとFalseの状態変化で処理を分けることが可能

##range(10,0,-3) →１０、７、４、１という意味
等差数列なんですね。なるほど


##クラスと継承

「↓親クラスのPersonを定義」

```py
class Person:
	def __init__(self, firstName, lastName, idNumber):「←__init__はインスタンスのプロパティの定義かな？」
		self.firstName = firstName
		self.lastName = lastName
		self.idNumber = idNumber
	def printPerson(self):「←これはメソッドの定義」
		print("Name:", self.lastName + ",", self.firstName)
		print("ID:", self.idNumber)
```

「↓親クラスを継承した、Studentクラス」

```py
class Student(Person):「←引数に親クラスを書くことで継承できる、といってももう一回、プロパティとかは設定しなきゃいけない」
    def __init__(self,firstName,lastName,ids,scores):
        self.scores = scores
        super().__init__(firstName,lastName,ids)「←superは親クラスの関数を呼び出せる。」`
```

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
Craft CMS のシステムアップデート時に実行されるデータベースのバックアップを無効化する

Craft CMS 本体のアップデートを適用する際、デフォルトでは自動的にデータベースのバックアップが生成される。

これを無効化するには `config/general.php` に `backupOnUpdate` を追記する。

```php:config/general.php
<?php

return [
    // Global settings
    '*' => [
        // アップデート時の DB バックアップを無効化
        'backupOnUpdate' => false,
    ],

    // Dev environment settings
    'dev' => [
        // （中略）
    ],
];
```

以降、システムアップデート時にデータベースの自動バックアップが生成されなくなるため、適宜マニュアルでバックアップを取得する。

## 参考

**General Config Settings > backupOnUpdate**
https://docs.craftcms.com/v3/config/config-settings.html#backuponupdate
【初心者のための】rails generate コマンド

初心者のための`rails generate コマンド`集です。`rails g migration`や`rails g controller`の違いを含めてシンプルに書いておきます。

### マイグレーションファイル作成

```terminal
$ rails g migration テーブル名

[例：User]
$ rails g migration users name:string age:integer
```

### モデル　＋　マイグレーションファイル作成

```terminal
$ rails g model モデル名

[例：User]
$ rails g model user name:string age:integer
```

### コントローラー　＋　ビュー作成　＋　ルーティング

```terminal
$ rails g controller コントローラー名

[例：User]
$ rails g controller users index show
```

### 全部一括で作成 （モデル ＋ マイグレーションファイル + コントローラー ＋ ビュー作成 ＋ ルーティング）

```terminal
$ rails g scaffold 

[例：User]
$ rails g scaffold user name:string age:integer
```




railsコマンドは-h (or --help)オプションでヘルプが見れるくさい


```
$ rails -h
$ rails g -h
$ rails g scaffold -h
```
https://maeharin.hatenablog.com/entry/20130212/rails_generate
https://qiita.com/kodai_0122/items/14494a3848654f32909d
LINE Messagin API JSONでの注意

# LINEのMessagingAPIでのJSONの記述方法ではまった
LINE側でMessaginAPIで用意されているAPIに対してJSON文字列を送信した際に、
iOS版のLINEと、Android版のLINEアプリとで動作の挙動が異なっていたので、メモとして。

# JSON文字列の定義は厳密に
結論から言うと、ios版のLINEの方が、Android版のLINEよりも、JSONの定義をしっかり判別している。

例えば、数値型のデータをそのまま数値としてセットして
下記のようなJSONを作って送信した場合、
iosは正常に処理できませんでしたと表示されるが、
Androidはよきように解釈して表示してくれる。

```json

略
{  
   "type":"box",
   "layout":"horizontal",
   "contents":[  
      {  
         "type":"button",
         "action":{  
            "type":"postback",
            "label":250,
            "data":"action=hit&unit_no=250&machine_type=S",
            "displayText":250
         }
      }
   ]
}
```
## SDKでもメッセージを受け付けたAPIでもチェックしない
PHPのSDKではそもそも型チェックなんてしないし、
そのSDK使ってMessaginAPIを叩いてもその時点ではエラーにならないので
動かしてから違いに気づくこととなりました。


あんまり発生しないとは思いますが、備忘録として。
reactコンポーネントで出力したsvgタグでマウスイベントを拾う方法を教えてください。

初めて投稿します。よろしくお願いいたします。

reactのコンポーネントでsvgタグを出力する処理で、svgイメージ上のマウスoverまたはoutのイベントを拾うのに以下のようなコードを使用しています。

ところが最近reactのバージョンアップしてv16にしたところ、当該イベントを拾わなくなりました。

v15までは動作したので、原因や対策を調べたのですがわかりませんでした。

もし原因や対策をご存知でしたらご教授お願いいたします。

```react:SvgIcon.tsx
import * as React from 'react';

interface Props {
  onMouseOver?: any,
  onMouseOut?: any,
}

export default class SvgIcon extends React.PureComponent<Props> {
  static defaultProps = {
    onMouseOver: ()=>{}, //popup表示処理を呼び出し元にて指定
    onMouseOut: ()=>{},  //popup非表示処理を呼び出し元にて指定
  };

  render() {
    const { onMouseOver, onMouseOut } = this.props;
    return (
      <svg ～いろいろ～ onMouseOver={onMouseOver} onMouseOut={onMouseOut} >
        <rect ～いろいろ～ />
      </svg>
    );
  }
}
```
【MarkLogic】MarkLogic9をインストールしてみた。

## はじめに
MarkLogicとは、MarkLogic社が提供するNoSQLデータベース。
あとは調べながら進めていく。

## やること
- 試用版をインストールして触ってみる。
- 使い勝手を他（RDBMS等）と比べてみる。

## 事前準備
- MarkLogic コミュニティ（無料）への参加

## 開発者ライセンス（試用版）の注意事項
- 利用期間は最大6ヶ月
- アップロードできるデータは最大1TB
- 本番や商用利用はNG

MarkLogicは商用DBなので、あくまでも導入前の検証目的で配布しているのでしょう。

## 環境
- Windows10 (64bit)
- MarkLogic 9

## MarkLogic Serverのインストール
インストーラを[公式サイト](https://developer.marklogic.com/products)から入手しました。
今回はあくまでも動作確認目的のためクライアントPCへのインストールを行っています。

ナビゲーションに従ってインストールを進めます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/383325/ef4fc787-8c3f-6edc-d617-5348d7d9ad43.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/383325/739a4c5f-e6f1-7670-0648-3ea10843f020.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/383325/63bf9d21-a1bb-9f26-3efa-5e77c6a6e25a.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/383325/4b923af9-cb6b-7873-2651-ea1b2ad09be5.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/383325/5cd35b1c-56e5-e1f1-aa1a-a3613500267a.png)
ここまで1～2分くらいで完了。

|インストール先|データディレクトリ|
|:------------------|:------------------|
|C:\Program Files\MarkLogic|C:\Program Files\MarkLogic\Data|

## MarkLogic Serverの起動
1. プログラム / MarkLogic Server を選択
2. 「Start MarkLogic Server」を右クリックして、「管理者として起動」をクリック

## MarkLogic Serverへの接続

管理者インターフェースへログイン

```
http://localhost:8001
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/383325/8ca7f09b-7ffd-7dae-6d2a-bd9ec82e600d.png)
クラスタには参加しない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/383325/77c5e056-5bfb-cb16-ab24-b3e953d3546f.png)
管理ユーザのログイン名とパスワードを設定 (メモっとく)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/383325/1b4cb412-074e-4140-433f-f70518a0d54d.png)
設定したログイン名とパスワードでログイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/383325/d07021c6-ec47-4bbf-f0d7-4dee23230b37.png)
管理インターフェースが表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/383325/df97221a-b613-4e05-d023-97f4ccd49c5d.png)
インストール完了。
androidスマホの実機で、monacaの指紋認証プラグインcordova-plugin-keychain-touch-idが使えるか、検証

androidスマホの実機で、monacaの指紋認証プラグインcordova-plugin-keychain-touch-idが使えるか、検証しました。
結果、指紋センサーあっても、指紋認証できない機種がありました。要注意ですね。

## monaca

* 指紋認証プラグインcordova-plugin-keychain-touch-id
    * サードパーティ製プラグイン
    * https://github.com/sjhoeksma/cordova-plugin-keychain-touch-id
        * プラグイン追加手順
            * monaca クラウドIDEの下側、「デバッガー」「プレビュー」の並びの(+)ボタン押下＞新規ターミナル
                * proプランじゃないと新規ターミナルない？
            * ターミナルでコマンド入力
            * `$ cordova plugin add cordova-plugin-keychain-touch-id`
            * `$ cordova prepare`
                * `$ cordova prepare`不要かも
            * プラグイン追加完了
                * monaca クラウドIDEのメニューバー＞設定＞cordovaプラグインの管理を開いて、有効なプラグインにcordova-plugin-keychain-touch-idが追加されてることを確認できる。
* monacaでサードパーティ製プラグイン使うには、proプラン(有料)以上が必要
    * monaca proプラン費用: https://ja.monaca.io/pricing.html
    * プラン変更手順
        * monaca クラウドIEDのダッシュボードで、右上の「人」マーク＞アカウント設定
            * プラン管理＞プラン変更 から変更できる。



## 指紋認証-検証プログラム

```index.html
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <meta http-equiv="Content-Security-Policy" content="default-src * data: gap: content: https://ssl.gstatic.com; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">
    <script src="components/loader.js"></script>
    <link rel="stylesheet" href="components/loader.css">
    <link rel="stylesheet" href="css/style.css">
    <script>
        // アプリ起動時
        function onDeviceReady() {
            if (window.plugins) {
              window.plugins.touchid.isAvailable(() => {
                console.log('できるよ');
              },
              () => {
                console.log('対応してないよ');
              });
            } else {
                console.log('window.pluginsないよ');
            }
        }
        document.addEventListener("deviceready", onDeviceReady, false);

    </script>
</head>
<body>
    指紋認証の検証プログラム
</body>
</html>
```

## monacaのAndroid アプリの検証方法

1. Android アプリのビルド
    1. monaca クラウドIDEのメニューバー＞ビルド＞Android アプリのビルド
    1. デバッグ向けビルド＞カスタムビルドデバッガー [ビルドを開始する] 押下
1. Androidスマホにアプリインストール
    1. ビルド後のQRコードを、Androidスマホで読み込み
    1. monaca のログイン画面が表示されるので、ログインすると、Android アプリダウンロードされる
        1. もしダウンロードされなかったら、ブラウザを再読み込みしてみる
        1. もしくは、ブラウザを閉じて、再度QRコードのURLを開いて、ログイン試してみる
    1. Androidスマホで、ダウンロードしたアプリを開いて、インストール
1. 検証
    1. 初回起動時、アプリを重ねて表示を確認されるので、とりあえずONにする。（どっちでもいいはず）
    1. monaca のログイン画面が表示されるので、ログインして、作った検証プログラムを開く
    1. 検証結果が、PCのmonaca クラウドIEDのデバッガーに表示される。


## 検証結果

### OK-Android

Xperia SO-04H [OS]Android8.0.0 指紋センサーあり
https://www.sonymobile.co.jp/xperia/docomo/so-04h/spec.html

### NG-Android

KYOCERA android one S4-KC [OS]Android9 指紋センサーなし 
https://www.kyocera.co.jp/prdct/telecom/consumer/lineup/s4/spec.html

HUAWEI P10 lite WAS-LX2J [OS]Android8.0.0 指紋センサーあり（だけどNG）
https://consumer.huawei.com/jp/phones/p10-lite/specs/

## 参照記事

指紋認証プラグインcordova-plugin-keychain-touch-idを使ってパスワードをセキュアに保存しよう | モナカプレス
https://press.monaca.io/atsushi/2898

Monacaアプリで指紋認証を実装する | ほしのえんじにありんぐ
https://www.ohoshi-tech.io/2018/11/02/monaca-touch-auth/
Linux基本コマンド cut

## オプション
| オプション | 説明| 
|:-----------|:-----------|
| -b リスト | 切り出す位置のリストをバイト数で指定 |
| -c リスト | 切り出す位置のリストを文字数で指定 |
| -f リスト | 切り出す位置のリストを区切りのフィールドで指定 |
| -d リスト | 区切り文字を指定、デフォルトはタブ |

### リスト指定
| オプション | 説明| 
|:-----------|:-----------|
| N | N番目 |
| N-M | N ~ M |
| N- | N ~ 最後 |
| -M | 最初 ~ M |

## 利用例

### バイト数を指定して切り出す

```bash
$ ls -l * | cut -b 1-10,42-
-rw-rw-r-- test
-rw-rw-r-- uniq.txt
```

### フィールドを指定して切り出す

```bash
# ユーザー一覧
$ cat /etc/passwd | cut -f1 -d':'
root
bin

# home directoryも出力
$ cat /etc/passwd | cut -f1,6 -d':'
root:/root
bin:/bin

# shellも出力
$ cat /etc/passwd | cut -f1,6-7 -d':'
root:/root:/bin/bash
bin:/bin:/sbin/nologin

# CSVの9列目出力
$ cut -d ',' -f 9 sample.csv
```

### 出力区切りを指定

```bash
$ cat /etc/passwd | cut -f1,6-7 -d':' --output-delimiter='----'
root----/root----/bin/bash
bin----/bin----/sbin/nologin
```
Macにtmuxで複数サーバの同時オペレーション

## Macに tmux インストール
`$ brew install tmux`
`$ tmux -V`

## multi_ssh スクリプト作成
下記を参考、基本的に全部コピペ：
[tmuxで複数サーバの同時オペレーション](https://tech.naviplus.co.jp/2014/01/09/tmux%E3%81%A7%E8%A4%87%E6%95%B0%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E5%90%8C%E6%99%82%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/)

## chmod +x multi_ssh

## 使い方
./multi_ssh server{1,2}
ウェブUIにてメニューを上部固定にしたときに、本文の内容と重ならないようにする安易な方法


# 問題
メニューバーを上部固定(fixed)にした場合、本文の上の方(Testという文字列)がメニューバーにかぶって表示されない。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159980/532c4e53-d27e-2295-2d39-5c7fba5d27e6.png)

```html
<!DOCTYPE html>
<html>
<head>
    <title>Test</title>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.3/semantic.min.css">
    <script src="https://code.jquery.com/jquery-3.3.1.slim.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.3/semantic.min.js"></script>
</head>
<div class="ui fixed inverted menu">
    <div class="ui container">
        <a class="active item">Home</a>
        <a class="item">releasenote</a>
        <a class="item">FAQ</a>
    </div>
</div>
<div class="ui container">
    <h2> Test </h2>
    <p>Under Construction.</p>
</div>
</html>
```

# 解決策
一般的には、paddingやmarginを追加する形がよいようですが、最も安易なのは、
以下のように、ずらすだけの要素を追加する形かと思います。
`<div style="height:45px"></div>`

```html
<!DOCTYPE html>
<html>
<head>
    <title>Test</title>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.3/semantic.min.css">
    <script src="https://code.jquery.com/jquery-3.3.1.slim.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.3/semantic.min.js"></script>
</head>

<div style="height:45px"></div>
<div class="ui fixed inverted menu">
    <div class="ui container">
        <a class="active item">Home</a>
        <a class="item">releasenote</a>
        <a class="item">FAQ</a>
    </div>
</div>
<div class="ui container">
    <h2> Test </h2>
    <p>Under Construction.</p>
</div>
</html>
```
ログで複数ファイルを一気に読みたい時のTips(less, tail)

# 概要

サーバーの移設作業の時などには、ログをリアルタイムで表示したり、
うまく動作が行われているかの最終確認などで、ログを確認したい時がある。
ただ、そのような時に、複数のログファイルを別々に開いて、確認するのは、
非常に面倒。なので、一気に読むためのTipsをまとめてみた。


# tail

## 固定して確認したい場合

```shell
tail *txt
tail /var/www/app/logs/*/*log
```

## リアルタイムに確認をしておきたい場合

```shell
tail -f *txt
tail -f /var/www/app/logs/*/*log # logディレクトリを作成し、ディレクトリを分けたりしている場合はこちらで。
```

単に -f オプションをつけるだけなので、普通の tail コマンドと変わりはないがとても便利。

# less

```shell
less *txt
less /var/www/app/logs/*/*log # logディレクトリを作成し、ディレクトリを分けたりしている場合はこちらで。
```

ファイルの切り替え自体は以下のコマンド実行によって実現可能。


# 参考

[lessで複数ファイルを読む](https://hogem.hatenablog.com/entry/20070509/1178637366)
[Rails] 1対多フォームが簡単に作れるCocoonで子要素の制限をかける

公式ページに書いてあるけどメモがてらに。

```javascript

$(function() {
  // limits the number of categories
  $('#categories').on('cocoon:after-insert', function() {
    check_to_hide_or_show_add_link();
  });

  $('#categories').on('cocoon:after-remove', function() {
    check_to_hide_or_show_add_link();
  });

  check_to_hide_or_show_add_link();

  function check_to_hide_or_show_add_link() {
    if ($('#categories .nested-fields').length == 5) {
      $('#add-category a').hide();
    } else {
      $('#add-category a').show();
    }
  }
})
```
参考：[How to limit the number of nested fields](https://github.com/nathanvda/cocoon/wiki/How-to-limit-the-number-of-nested-fields)

CocoonにはJavaScriptで要素の追加・削除時のフックが用意されています。
フック一覧はこちら

## 要素追加前
```javascript
cocoon:before-insert
```

## 要素追加後
```javascript

cocoon:after-insert
```

## 要素削除前
```javascript
cocoon:before-remove
```

## 要素削除後
```javascript

cocoon:after-remove
```
Google DriveのAPIを利用して画像ファイルをアップロードしてWebブラウザで参照できるよう共有URLを取得する

##1.概要
 時間が空いたが続編。
自分がやりたいのは、G Suiteの[Google hangout chatを用いて、画像とテキストが入ったcard形式のメッセージを定期投稿する事](https://qiita.com/Fortinbras/items/7d96ae4d7cd61d4e630e)であり、その際Google hangout chatのcard形式に含まれた画像を、**(1)Google Driveに保存**して、**(2)そのファイルを共有設定かけて**、**(3)Webで参照閲覧できるようにURLを取得する**という一連の作業をGoogle DriveのAPIを使って実装できるかどうかを今回調べてみた。
※前回[DropBoxに画像を投稿して共有設定してWebで参照閲覧できるようにした](https://qiita.com/Fortinbras/items/f77984e5a7c2b3045473)が、今回はGoogle Driveで同じ処理が実装できるか確認。

##2.Google Drive上のファイルを閲覧参照する共有URLについて
 こちらの[ページ](https://qiita.com/rot-z/items/299ac40361690c51ce1d)を参照。Google Drive上のファイルには、おのおのファイルIDが付与されており、直接URLを参照してブラウザで閲覧する場合、`https://drive.google.com/uc?id=<ファイルID>`というURLで閲覧可能。

つまりGoogle Driveに画像ファイルをアップロードしてそのファイルのファイルIDを取得できれば、ブラウザ上で閲覧可能なURLを生成することが可能。


##3.Google Driveへの画像ファイルをアップロードして、アップしたファイルのファイルIDを取得する
```python:test_upload.py
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

def fn_upload(path ):
    # 画像の挿入
    image_mimetype = 'image/jpeg'
    folder_id = '1234567890abcdefghijklmn' #root/hogehoge/image
    f = drive.CreateFile({'title': path
                          , 'mimeType': image_mimetype
                          ,  'parents': [{'kind': 'drive#fileLink', 'id':folder_id}]})
                       
    f.SetContentFile(path)
    f.Upload()
    
    image_url = 'https://drive.google.com/uc?id=' + str( f['id'] ) 
    return image_url

```

・Google Driveへのファイルアップロード等は、ライブラリ「[pydrive](https://pythonhosted.org/PyDrive/)」を利用。
・設定等で留意するべきは、settings.yamlにclient_idとclient_secretを指定する必要がある点。GoogleのDevelopers ConsoleにてGoogle DriveのAPIを利用可能にして、認証の設定等をして付与されたclient_idとclient_secretをsettings.yamlに設定してあげれば、利用可能。
 ※詳細は[こちら](https://qiita.com/soup01/items/670107d8454274297b5d)のページを参照

・上記スクリプトでは、ローカルの画像ファイルのpathを引数にしてGoogle Driveの任意のフォルダ(上記では「root/hogehoge/imageフォルダ」のfolder_id)を指定してファイルアップロードを実行している。
・ファイルアップロード先をroot以外のGoogle Driveの任意のフォルダを指定することも可能。
・folder_idはブラウザでGoogle Driveを開いて該当フォルダを開くと、URL文字列にフォルダIDが含まれているのでそこからIDが判明。
・アップロード後に戻り値としてアップロードした画像ファイルのGoogle Drive上のファイルIDを取得して、そのファイルIDをもとに閲覧用のURL文字列を生成。

##4.その他
・自分はローカルPCでanacondaを入れているので、pyDriveのインストールはpipコマンドではなくcondaコマンドでインストールした。 ※参考：[https://anaconda.org/conda-forge/pydrive](https://anaconda.org/conda-forge/pydrive) 
・画像ファイルは、RDBのテーブルのデータをpandasのread_query()で取得してdataflameオブジェクトを生成、matpltlibでグラフを描画してファイル保存。複数のファイルを生成した上で、ファイル名を逐次指定して上記3.のfanctionを実行してGoogle Driveへの画像ファイルアップロードと閲覧用URLを取得。そのURLを引数を指定してGoogle Hangout chatにメッセージ投稿するという処理を実行(以下スクリプト例を参考)

```python:hoge.py

from datetime import datetime, timedelta

#昨日の日付を取得
tdy =datetime.datetime.today()
ysdy = tdy - timedelta(days=1)
ysdy = ysdy.strftime("%Y-%m-%d")

#画像アップロードとメッセージ投稿
fn = 'test' + str(ysdy)
image_file_path = [fn + '_' + str(i)+ '.png' for i in range(1,7)]
url = [fn_upload(path)for path in image_file_path]
x = [fn_send_msg( i, j ,lst) for i, j in enumerate(url)]


```