OmniAICreator/Qiita-1.07M huggingface dataset:
MVCの仕組みについて！

こんばんは！

最近は就職活動を始めるに当たっていろいろなWeb企業を探しているんですけど、、、

世の中にはワクワクするような心踊る事業を行なっている企業がたくさんありますね...:relaxed:

僕も早く現場に行って世の中にワクワクを届けていきます！

・・・という前置きはさておき！

今回はMVCの仕組みについてしっかりまとめていきます！

##MVCとは？？？
プログラミング手法のアプローチの一種です！
有名な言語で言えば、***Ruby on Rails***で採用されています！

Ruby on Railsでは、
***ルーティング→コントローラ→ビュー***の順番で処理が行われますよね！
このようにモデル(model)とビュー(view)とコントローラー(controller)を使用して処理を行なうシステムをそれぞれの頭文字を取って***MVC***と呼ばれています！

文字だけで説明しても、想像しにくと思うので、図を使って説明していきます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438981/2f8045ce-9caf-0de3-42a8-fafecc1f2ecb.png)

以下がMVCの流れとなります！

***➀リクエストに対応したルーティングが読まれ、それに対応したコントローラのアクションが動く！
➁アクション内でモデルとのやりとりを行なって、データベースのデータを取り出す！
➂呼び出したデータをビューに受け渡し、受け取ったデータをWebページに表示する！***

たったこれだけです！
とてもシンプルですよね:relaxed:

この仕組みを理解しておくだけで、エラーなどの問題が起こった時にロジックを立て、答えを導きやすくなると思います！

Ruby on Railsでアプリケーション開発を進めていく中ではこの仕組みをしっかり理解しておきたいですね:relaxed:

>引用:https://www.javadrive.jp/rails/ini/index7.html
VSCodeのRemote SSHでVirtualBoxのCentOS6へ接続する

## CentOS6につながらない問題
VSCodeに最近追加された公式の拡張機能である「Remote」は非常に使い勝手がいいですが、vagrantで立ち上げたCentOS6に対してSSH接続をしたところ`Failed to connect to the remote extension host server (Error: Connection error: Unauthorized client refused.)`とエラーが発生してしまう

## 解決法
https://github.com/microsoft/vscode-remote-release/issues/103#issuecomment-497118857
どうやらglibcとlibstdc++というライブラリが古いことに起因する不具合なのでglibcとlibstdc++をアップグレードすれば解決できるとのこと

```
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm
wget https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-utils-2.17-55.el6.x86_64.rpm
wget https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-static-2.17-55.el6.x86_64.rpm
sudo rpm -Uvh \
    glibc-2.17-55.el6.x86_64.rpm \
    glibc-common-2.17-55.el6.x86_64.rpm \
    glibc-devel-2.17-55.el6.x86_64.rpm \
    glibc-headers-2.17-55.el6.x86_64.rpm \
    glibc-static-2.17-55.el6.x86_64.rpm \
    glibc-utils-2.17-55.el6.x86_64.rpm --force --nodeps

# Update libstdc++
wget https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/gcc-4.8.2-16.3.fc20/libstdc++-4.8.2-16.3.el6.x86_64.rpm
wget  https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/gcc-4.8.2-16.3.fc20/libstdc++-devel-4.8.2-16.3.el6.x86_64.rpm
wget https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/gcc-4.8.2-16.3.fc20/libstdc++-static-4.8.2-16.3.el6.x86_64.rpm
sudo rpm -Uvh \
    libstdc++-4.8.2-16.3.el6.x86_64.rpm \
    libstdc++-devel-4.8.2-16.3.el6.x86_64.rpm \
    libstdc++-static-4.8.2-16.3.el6.x86_64.rpm
```

インストール後はCentOS6を再起動してからVSCodeでSSH接続しましょう
動いている docker コンテナを全部止めるワンライナー

# コピペして動かせ

```shell-session
docker ps -q | xargs docker stop
```

# 何を思ってこの記事を書いたか

[むしゃくしゃしてやった、後悔はしていない。](https://dic.nicovideo.jp/a/%E3%82%80%E3%81%97%E3%82%83%E3%81%8F%E3%81%97%E3%82%83%E3%81%97%E3%81%A6%E3%82%84%E3%81%A3%E3%81%9F)


# 最低限の解説

```shell-session
docker ps -q | xargs docker stop
```

は

```shell-session
xargs docker stop eb0dfeb2fc56 2deddec0fd03
```

みたいなやつと、実質同じ。たぶん。

## `docker ps -q`

[公式ドキュメント](https://docs.docker.com/engine/reference/commandline/ps/)を見れば一発でわかる。

`docker ps` ってのは、「コンテナの一覧を表示する」コマンド。
`-q` ってオプションは、「コンテナの ID だけを表示する」というオプション。

`docker ps -q` 実行すると、以下のような表示になる。

```shell-session
$ docker ps -q | xargs docker stop
eb0dfeb2fc56
2deddec0fd03
cf492e09d268
f21e4054ba37
1ae5f9023ad9
```

## `| xargs docker stop`

[`docker stop` の公式ドキュメント](https://docs.docker.com/engine/reference/commandline/stop/)を見ればわかるけれど、 **止める対象を標準出力で受け取れない** 。引数で渡す。
引数で渡すときに、2つ以上を指定することができるので、 [`xargs`](http://linuxjm.osdn.jp/html/GNU_findutils/man1/xargs.1.html) を使い、いい感じに結合して引数に渡す。

# 普通に `docker stop $(docker ps -q)` でよくね？

それな、わかる。
canopyで自作WEBアプリの自動テスト

## 要約

自作WEBアプリ[みちくさびゅあー](https://iranika.github.io/mo-code/)をWebDriverで自動テストしたかった。
F#のことが気になって調べてみたらcanopyというテストフレームワークを見つけたので試しに使ってみたら想像以上に手に馴染んだ。

## 前提条件

.NET Core 2.2のSDKとランタイムのインストール。

https://dotnet.microsoft.com/download/dotnet-core/2.2


## プロジェクトの作成

https://lefthandedgoat.github.io/canopy/  
上記のcanopy公式サイトとだいたい同じですが、dotnet CLIでやる手順を追って説明します。 
  
まずはプロジェクトを作成します。  
今回は自作WEBアプリ[みちくさびゅあー](https://iranika.github.io/mo-code/)のテスト用なので適当にmo-code-testerと名前をつけます。

``` sh
dotnet new console -lang F# -o mo-code-tester
cd mo-code-tester
```

プロジェクトにパッケージを追加します。

``` sh
dotnet add package canopy --version 2.1.0
dotnet add package Selenium.WebDriver.ChromeDriver
```

## コードの記述

Program.fsにコードを記述します。
canopyの詳細な使い方は公式サイトを参照してください。
主に下記を読めば分かるかと。
個人的感想ですがとても読みやすいです。
[Action](http://lefthandedgoat.github.io/canopy/actions.html)
[Assertions](http://lefthandedgoat.github.io/canopy/assertions.html)
[Test](http://lefthandedgoat.github.io/canopy/testing.html)

``` Program.fs
//these are similar to C# using statements
open canopy.runner.classic
open canopy.configuration
open canopy.classic

canopy.configuration.chromeDir <- System.AppContext.BaseDirectory

//start an instance of chrome
start chrome

//this is how you define a test
"モーダルチェックテスト" &&& fun _ ->
    //this is an F# function body, it's whitespace enforced

    url "https://iranika.github.io/mo-code/index.html" //mo-codeのサイトを開く
    displayed "#modal"  //モーダルが表示されている
    click ".modal-label" //モーダルラベル(右上バツ)をクリック
    notDisplayed "#modal"   //モーダルが非表示になっている

    url "https://iranika.github.io/mo-code/index.html" //mo-codeのサイトを開く
    displayed "#modal"  //モーダルが表示されている
    click "最初から読む" //最初から読むをクリック
    notDisplayed "#modal"   //モーダルが非表示になっている
    
    url "https://iranika.github.io/mo-code/index.html" //mo-codeのサイトを開く
    displayed "#modal"  //モーダルが表示されている
    click "新作から読む" //新作から読むをクリック
    notDisplayed "#modal"   //モーダルが非表示になっている

    url "https://iranika.github.io/mo-code/index.html#5" //mo-codeのサイトを開く#5のページ
    notDisplayed "#modal"   //モーダルが非表示になっている(ページ指定の場合はモーダル非表示が仕様)


//run all tests and quit
run()
quit()
```

## 実行

``` sh
dotnet run
```

Chromeが立ち上がって,テストが実行されます。
今回はChromeのWebDriverを使っているので、実行環境にChromeのインストールが必要です。

## 感想

書いていて非常に楽しかったです(小並感)
まぁテスト自体はこれから本格的に書くので、おいおいレビューもしようと思います。
ちなみに.NET Core 2.2は自己展開型でpublishできるので、以下のコマンドでlinux向けに展開できるのも便利。

``` sh
dotnet publish -c Release -r linux-x64 --self-contained true
```

もっとdotnet coreとF#を勉強していきたい。
Laravel5.8は、マイグレーションスタブの主キーのデフォルトが、increments()からbigIncrements()になった

Laravel5.8で既存のマイグレーションファイルに外部キーを追加しようとしたら、
`Cannot add foreign key constraint`なエラー
これは、主キーのデフォルトが、`increments()`から`bigIncrements()`になったため。

参考：
https://laravel.com/docs/5.8/upgrade
https://laraveldaily.com/be-careful-laravel-5-8-added-bigincrements-as-defaults

## 解決方法
下記のどちらかを行う

* 元のマイグレーションを`bigIncrements()`から`increments()`にする。
* 外部キーカラムを`integer()`ではなく`bigInteger()`にする。

## ところで、`bigIncrements()`の`increments()`どちらを使えばよいのか

### `INT`と`BIGINT`の違い(MySQL)

#### INT
INT(符号付き)の範囲は-2147483648〜2147483647。
INT(符号なし)の範囲は0〜4294967295。

#### BIGINT
BIGINT(符号付き)範囲は-9223372036854775808から9223372036854775807。
BIGINT(符号なし)範囲は0から18446744073709551615。

参考：https://dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html


* INTは21億までの値を格納可能
* BIGINTは20桁までの大きな数値まで値を格納可能
* BIGINTではなくINTを使用すると、ディスク容量を削減できる。
* 外部キーとインデックスに対して使用された場合、インデックスサイズが減り、インデックスが使用されたときのパフォーマンスが向上する。
* まず主キーと外部キーを考えて、テーブルに21億行以上格納するつもりがなければ、INT (つまり、主キーに`increments()`)を使うと良さそう。


参考：
http://ronaldbradford.com/blog/bigint-v-int-is-there-a-big-deal-2008-07-18/
試験のテストが、合格している人のみをリストアップする 【ruby初心者】

#はじめに

メモです。

###つくるもの

- テスト点数から、欠席日数×5を引いた数を成績とする
- それが合格点以上かを確認する
- 合格点を達成していた人のみ、リストアップする

#入力されるデータ

※数字と数字の間には空白が入る

```
受験者数 合格点数
テスト点数① 欠席数①
テスト点数② 欠席数②
...
テスト点数N 欠席数N
```

#入力を受け取る

受験者数と、合格点数を受け取る。

```
input_line = gets.split(" ").map &:to_i
```

配列の中に配列が入った、二次元配列を作成する。

```
#下記のように配列が入る
#score_absent=[[テスト点数①,欠席数①],[テスト点数②,欠席数②],...,[テスト点数N,欠席数N]]

score_absent=[]
input_line[0].times do
  score_absent.push(gets.chomp.split(" ").map &:to_i)
end
```

#最終成績を計算する

```
#最終成績の配列を作る
result = []

score_absent.each do |sa|
    result.push(sa[0] - sa[1]*5)
end
```

#合格しているかどうかを判断する
合格者用の空の配列を作成し、点数以上であれば、配列に追加する。

```
#出席番号のはじめ
attendance_number = 1
passes = []

result.each do |sa|
    if sa >= input_line[1]
        passes.push(attendance_number)
    end
    attendance_number += 1
end

puts passes
```
重線形回帰、スケーリング、多項式回帰、正規方程式

最近数学をやり直していてふと機械学習がどういう仕組みなのか知りたくなって、Courseraでスタンフォード大学が提供している機械学習講座を受けている。第6週まで終わったので思い出しながら軽くまとめる。講座はこちら [Coursera Machine Learning](https://www.coursera.org/learn/machine-learning)

[week1 機械学習とは何か、単線形回帰、仮説関数、コスト関数、最急降下法](https://qiita.com/yusayusa/items/b3b35e4f415f5c516d21)
[week2 重線形回帰、スケーリング、多項式回帰、正規方程式](https://qiita.com/yusayusa/items/d7f0224cabf7465a8d55)
[week3 ロジスティック回帰、共役勾配法・BFGS・L-BFGS、多クラス分類 、過学習と正則化](https://qiita.com/yusayusa/items/587a882b5d28cdd136e3)
[week4 ニューラルネットワークの基礎](https://qiita.com/yusayusa/items/b6b29b96ebcae0e8ea3c)
[week5 ニューラルネットワークのコスト関数とバックプロパゲーション](https://qiita.com/yusayusa/items/0b0a7a56c30b685aa521)
[week6 機械学習のモデルの評価 - 交差検証、バイアスとバリアンス、学習曲線、適合率と再現率](https://qiita.com/yusayusa/items/b49d9bd866526037cf02)

# Week 2 重線形回帰、スケーリング、多項式回帰、正規方程式

## 重線形回帰
前回の単線形回帰では単一の変数しか扱わなかったが、今回の重線形回帰では多変数を扱う。前回とは異なり入力の変数$x$をいくつでも持つことができる。

### 仮説関数 -  Hypothesis Function
仮説関数は以下のように表される。

```math
h\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3+⋯+\theta_nx_n = \theta^Tx
```

パラメータの更新式は前回と同じく以下のようになる。異なるのは同時に更新すべきパラメータ$\theta$が増えること。

```math
\theta_j:=\theta_j−α\frac{1}{m}\sum_{i=1}^{m}(h\theta(x^{(i)})−y^{(i)})⋅x^{(i)}_{j}
```

## 特徴量スケーリング - Feature Scaling
効率的に最急降下法を走らせるためにスケーリングという手段を使って、変数を$−1≤x_{(i)}≤1$のように一定の範囲に収まるようにする。スケーリングには正規化と標準化という方法がある。

### 正規化 - Normalization

正規化は以下のように表される。特徴量$x_i$から特徴量の最小値を引いたものを、特徴量の最大値から最小値を引いたもので割る。

```math
x_i:=\frac{x_i-x_{min}}{x_{max}-x_{min}} 
```

### 標準化 - Standardization

標準化は以下のように表される。特徴量$x_i$から平均$μ_i$を引いたものを$x$の標準偏差で割る。

```math
x_i:=\frac{x_i-μ_i}{s_i} 
```

## 多項式回帰
仮説関数に多項式を用いることで、線形ではなく非線形を表すことが可能となる。

$$
h\theta(x)=\theta_0+\theta_1x_1+\theta_2x_1^2+\theta_3x_1^3
$$

<img width="856" alt="Screen Shot 2019-06-24 at 17.18.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30575/47bc2f1e-3b32-e81c-9fd8-e6e2ac735b05.png">


## 正規方程式
コスト関数の最小値を求めるために最急降下法を使ったが、もう一つの方法が正規方程式を使った方法。コスト関数の傾きが$0$になる時のパラメータが知りたいので、コスト関数を微分したものを$=0$として解けばよい。正規方程式は方程式なので、最急降下法と異なり反復する必要がない。以下のように表すことができる。

$$\theta=(X^TX)^{−1}X^Ty$$

最急降下法と正規方程式にはそれぞれメリットデメリットがある。

|  | 最急降下法 | 正規方程式 |
|:-----------:|:-----------:|:------------:|
| 学習率 | 設定する必要あり | 設定する必要なし |
| 反復 | 必要あり | 必要なし |
| 計算量 | $O(kn^2)$ | $O(n^3)$ |
| 特徴量 | 多くてもよく動く | 多いと遅い |
rspec メモ

##確認作業
```ruby
Bin/rspec #だけだと全部になっちゃって重くなる

#コントローラも含んじゃうかも,重くなる
bin/rspec spec/*/admin_user_spec.rb

#モデルだけ
bin/rspec spec/models/admin_user_spec.rb  

#6行目のテストだけ確認
bin/rspec spec/models/admin_user_spec.rb:6

```

##subjectの位置
```
Contextの中に subject{}書いても反映されない、エラーになる
```


##スコープ
```ruby
 describe 'メソッド動作テスト' do
    context 'set_company_for_user' do
      subject { FactoryBot.create(:pre_order) }
      it 'userに紐付くcompanyに紐づけられること' do
        expect(subject.company).to eq subject.user.company
      end
    end
      before :all do
        @company = FactoryBot.create(:company)
        @shop = FactoryBot.create(:shop, company: @company)
        @user = FactoryBot.create(:user , shop: @shop)
        @sps_user = FactoryBot.create(:sps_user, user: @user)
        @cart = FactoryBot.create(:cart, user: @sps_user.user , created_at: 1.day.ago, shop_id: @shop.id)
        @pre_order = PreOrder.create_from_cart(@cart)
      end
    context 'create_from_cart' do
      it 'カートが正しくDBに作られる' do
        expect(@pre_order).to be_truthy
      end
    end
    context 'create_reserve_from_cart' do
      it '事前予約が正しくDBに作られる' do
        cart = FactoryBot.create(:cart, user: @sps_user.user, shop: @sps_user.user.shop)
        product = FactoryBot.create(:product, shop: cart.user.shop)
        cart.add_or_update(product , 1)
        pre_order = PreOrder.create_reserve_from_cart(cart, 1.day.since, 1.day.since)
        expect(pre_order).to be_truthy
      end
end
```

`before :all do`のスコープは１回しかまわらないから、`it`内で使うとするなら変数名の前に`@`をつける必要がある



##データ削除
```ruby
      context 'created_at' do
        before :all do
       ⭐️ PreOrder.destroy_all
          FactoryBot.create(:pre_order, created_at: Date.today.beginning_of_day)
          FactoryBot.create(:pre_order, created_at: Date.today.end_of_day)
        end
        it 'created_atは指定された日付の間の時間' do
          params = {}
          params[:created_at] = Date.today.strftime('%Y-%m-%d')
          expect(PreOrder.search(PreOrder, params).count).to be 2
        end
      end
```

FactoryBotで作成したデータが残っているせいで、`count`の値が想定している値と一致しない！
そんな時は、`PreOrder.destroy_all`モデルのデータを全削除すれば、ここれ作ったFactoryBot２件の世界でテストできる
【Rails】ローカル環境でrails s で class/module name must be CONSTANT (SyntaxError) と表示されたら

ローカル環境で

```ruby:コンソール
class/module name must be CONSTANT (SyntaxError)
```

とエラーメッセージが表示された時の対処。

```ruby:config/application.rb
module taskan
```
上記コードのファイル名の先頭を大文字にすればOK

```ruby:config/application.rb
module Taskan
```

これで解決
phpで「素数日」を求めたら・・・

よっしゃパクるぜ！！
https://qiita.com/yukid/items/3bb121e151903666a37e

「php 素数」ﾀｰﾝｯ
Google「GMP関数使え」

```php
<?php
	$start = microtime(true);
	$min = DateTime::createFromFormat('Ymd', '20190101');
	$max = DateTime::createFromFormat('Ymd', '30181231');
	$today = new DateInterval('P1D');

	$primesFound[1] = 0;//たぶん素数
	$primesFound[2] = 0;//確実に素数

	do {
		$x = $min->format('Ymd');
		$primeStatus = gmp_prob_prime($x);
		if ($primeStatus === 1 || $primeStatus === 2) {
			echo $min->format('Y年m月d日') . PHP_EOL;
			$primesFound[$primeStatus]++;
		}
		$min->add($today);
	} while ($min <= $max) ;
	echo "たぶん素数の数:{$primesFound[1]}.確実に素数の数:{$primesFound[2]}.". PHP_EOL;
	$stop = microtime(true);
	echo $stop - $start . PHP_EOL;
//約1000年を1.3秒
```

[gmp_prob_prime関数](https://www.php.net/manual/ja/function.gmp-nextprime.php)


>返り値
>この関数が 0 を返す場合、a は確実に素数ではありません。 1 を返す場合、a は「おそらく」 素数です。2 を返す場合、a は確実に素数です。

おそらく？

>この関数は、Miller-Rabin の確率的テストを使用して、 その数が素数かどうかを調べます。 

ん？

[ミラー–ラビン素数判定法#決定的アルゴリズム](https://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%A9%E3%83%BC%E2%80%93%E3%83%A9%E3%83%93%E3%83%B3%E7%B4%A0%E6%95%B0%E5%88%A4%E5%AE%9A%E6%B3%95#%E6%B1%BA%E5%AE%9A%E7%9A%84%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)

なるほどわからん。

と言うか先駆者が居た
https://qiita.com/rana_kualu/items/04cb330a0949f48cb7ab
https://qiita.com/rana_kualu/items/8b4e09f0410605f8180c
CloudFront + S3 + Cookie認証

## S3
特になし　通常通り
publicアクセスとかは無し

## Cloud Front
CNAMEなどの設定は省略

### Origin設定
![スクリーンショット 2019-06-24 16.27.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19792/178e189c-182e-efd8-dafc-8a786631813e.png)

- `Restrict Bucket Access`を`Yes`に設定
- `Origin Access Identity`で`Create a New Identity`とすると、新規にオリジンアクセスアイデンティティが作成される
- `Grant Read Permissions on Bucket`を`Yes, Update Bucket Policy`とすると、S3バケットのバケットポリシーが自動で更新される

### Behavior設定
![スクリーンショット 2019-06-24 16.28.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19792/af53d7ae-8cd3-2d60-4d52-0c06d7160c31.png)

- `Restrict Viewer Access`を`Yes`にする
- `Trusted Signers`で`Self`にチェック

## カスタムPolicy
```
{
  "Statement": [
	{
	"Resource": "https://hogehoge.com/*",
	"Condition": {
	    "DateLessThan": {
		"AWS:EpochTime": 1561417200
	    }
	}
     }
  ]
}
```
## 認証に必要なCookie

**CloudFront-Policy**
`cat policy.json | openssl base64 | tr '+=/' '-_~'`

**CloudFront-Signature**
`cat policy.json | openssl sha1 -sign pk.pem | openssl base64 | tr '+=/' '-_~'`

**CloudFront-Expires**
Epoch Time Format

**CloudFront-Key-Pair-Id**
Cloud Frontの認証キーID(ルートアカウントでしか作れない)

:warning: Reourceにワイルドカード使う場合は、カスタムポリシーを使う

## CORS設定
`Behaviors`にて、
`Cache Based on Selected Request Headers`を`Whitelist`
`Whitelist Headers`に`Origin``Access-Control-Request-Headers``Access-Control-Request-Method`をAdd
![スクリーンショット 2019-06-28 18.01.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19792/710245e6-e12c-d21e-feaa-38e2d341f274.png)


S3のアクセス権限にて

```xml
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>https://hogehoge.com</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
```
とかって感じで保存


## Test
```
curl -H 'Cookie: CloudFront-Expires=1741360031; CloudFront-Policy=; CloudFront-Signature=; CloudFront-Key-Pair-Id=XXXXXX' https://hogehoge.com/hoge/sample.html
```
merge sort, bubble sort, selection sort, quick sortをpythonで実装した。


#merge sort
備忘録に。


```python
def merge_sort(array):
    if len(array) == 1:
        return array
    left_array = merge_sort(array[:len(array) // 2])
    right_array = merge_sort(array[len(array) // 2:])
    sorted_array = []
    while left_array and right_array:
        print(left_array, right_array)
        if left_array[0] < right_array[0]:
            sorted_array.append(left_array.pop(0))
        else:
            sorted_array.append(right_array.pop(0))
    sorted_array.extend(right_array)
    sorted_array.extend(left_array)
    return sorted_array
```

再帰関数を使うとシンプルにかける。` array.append(right.pop(0))`を使うとrightの右端の要素をrightから取り除くと同時に、arrayに持ってこれる。


#bubble sort

```python

input_list = [2, 3, 10, 9, 4, 6, 7, 5, 8, 1]

def bubble_sort(input_list):
    total_number = len(input_list)
    flag = True
    finished = 0

    while flag:
        flag = False
        for i in range(total_number-1-finished):
            if input_list[i] > input_list[i+1]:
                input_list[i], input_list[i+1] = input_list[i+1], input_list[i]
                flag = True
        finished += 1

print(input_list)
```
結果はこうなる。

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

例えば、この例では、
1. 2と3を比較→右<左なのでそのまま
2. 3と10を比較→右<左なのでそのまま
3. 10と9を比較→左<右なので入れ替え→10と4を比較→左<右なので入れ替え→10と6を比較→
左<右なので入れ替え....と行って、10は右端まで持っていく、という流れだ。
これを繰り返すと、sortができている。

コメントを受けて、変更しました。flagをwhileの最初でTrueにしておいて、一個でもfor文の中のifで引っかかったら(つまりsortが完全でなかったら)flagをTrueにするやり方を初めて知りました！



# selection sort

```python
for i in range(len(array)-1):
    min=i
    for j in range(i+1, len(array)):
        if array[j] < array[min]: 
            min = j
    array[i], array[min] = array[min], array[i]
```


# quick sort
```python
def quick_sort(array):
    print(array)
    if len(array) <= 1:
        return array
    left = []
    right = []
    criterion_cnt = 0
    criterion = array[0]
    for i in range(len(array)):
        if array[i] < criterion:
            left.append(array[i])
        elif array[i] > criterion:
            right.append(array[i])
        elif array[i] == criterion:
            criterion_cnt += 1
    return quick_sort(left) + [criterion] * criterion_cnt + quick_sort(right)
```

criterionはleftかrightのどちらかに含ませればいいのでは？と思ったが、それだとうまくいかない。criterionが配列の最小値を取得し続け、無限ループになってしまうことがありうる。
【C#】導入



##参考
>導入
・https://westa.io/@alclimb/vs2017-cs-helloworld
>Visual Studioなしでコンパイル
・http://chivsp.hatenablog.com/entry/2018/02/26/090000
　-必要なファイル-
　　・バッチファイル.bat　←　これを実行
　　・Form1.cs
　　・Form1.Designer.cs
　　・Program.cs
hover情報を取得する。(jquery)

# はじめに
今回初めてhoverの情報を元に条件分岐して
hoverが外れたのかを判断して機能を実装したのでここに残しておきます。

hoverの情報を取得することに関する記事がほとんどなく
「もしなかったら・・・」と思ったので
せっかくなので僕も書いてみようと思います。

【僕が救われた参考記事】
・jQuery：現在カーソルがhoverしている要素を返す
https://hacknote.jp/archives/11228/

では行きます。
上記の記事をほぼ参考にコードを書いたのですがあ
一部違うとことがあり、そこにも理由があるのでその辺も解説できたらなと思います。

# hoverの情報を元に条件分岐
jqueryを初めてまもないのでとてもツッコミどこを満載かもしれませんが
何かあればアドバイスなど頂ければとても嬉しいです。

hoverのON,OFFには
.mouseenter()"と".mouseleave()"という書き方もあるようですが今回は動的に作られた
要素ではないのでhoverで書いていきます。

今回実装したのはこちらです。

```hover.js

$("#category-btn").hover(function() {
     $("#parent_ul").show();
   // ボタンをcategory_btnをhoverしたらparent_ulが現れる。ここまでは通常営業ですね
 },function() {
     var judgement = foge;
    // これはhoverの情報を元に判断するための変数
     var hover_ids = [];
    //　↑下で使ってる$.inArrayを使うために必要
     jQuery(":hover").each(function () {
    // hover時の要素を引っ張ってくる
       hover_ids.push($(this).attr("id"));
            //$(this).attr("id")で要素からidを取得する
         if ($.inArray("parent_ul", hover_ids) == -1) {
          //$.inArrayの仕様で-1という記述がある
           judgement = "out";
         }
     });
     if (judgement == "out") {
        $("#parent_ul").hide();
      }
});
```

## かなりごちゃごちゃしているので部分ごと分けて解説します

```hover.js
jQuery(":hover")
```
このメソッドはhoverしている全要素が返されます。
ですので

```hover.js
jQuery(":hover").each(function () {
   console.log($(this).attr("id"));
});
```
とやってやるとhoverしてる要素のidが出力されるます。

```hover.js
$.inArray("配列の中身の要素名","配列名")
```
このメソッドは
配列の中身に指定の要素があったらその[index番号]を返し,
なければ[-1]を返します。

ですのでhoverした中にその要素があるかないかを判断してもらっています。
今回は外れた時の処理を書きたかったので
-1の時にoutとして処理を書いています。

もしかしたら他にも役に立つことがありのそうなメソッドだったので
今回qiitaに書きました。

最後まで読んでいただきありがとうございました。
「setup」タグについて (タグシノニム: 「環境構築」「開発環境」「インストール」「install」「セットアップ」「開発環境構築」「ローカル環境」「構築」)

### 対象
(件数は2019/06/24現在)

- https://qiita.com/tags/setup : 156記事

### 説明

セットアップ関連の情報の記事が集まる。

### タグシノニム
(件数は2019/06/24現在)

- [https://qiita.com/tags/環境構築](https://qiita.com/tags/%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89) : 778記事
- [https://qiita.com/tags/開発環境](https://qiita.com/tags/%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83) : 469記事
- [https://qiita.com/tags/インストール](https://qiita.com/tags/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) : 282記事
- https://qiita.com/tags/install : 214記事
- [https://qiita.com/tags/セットアップ](https://qiita.com/tags/%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97) : 23記事
- [https://qiita.com/tags/開発環境構築](https://qiita.com/tags/%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89) : 19記事
- [https://qiita.com/tags/ローカル環境](https://qiita.com/tags/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E7%92%B0%E5%A2%83) : 14記事
- [https://qiita.com/tags/構築](https://qiita.com/tags/%E6%A7%8B%E7%AF%89) : 9記事


### 備考

そもそも、セットアップに関してタグを付けない記事も多い。
CSSが反映されない時の解消法(SCSS)

# CSSが反映されない時の解消法

**HTMLファイルにCSSが適用されなかったので、その解消法の説明になります**

HTMLのファイルにCSSが適用されなく、SCSSのファイル内のクラスや入れ子構造の間違いがないかを確認したところ、間違ってる箇所はありませんでした。

次にimport先のapplication.scss内のファイルを見たところ、



```scss:application.scss
@import './index';
@import './config/reset';
```

reset.scssのファイルより上に、HTMLファイルに当てるscssファイルを先にコードを書いたことにより、先にindex.scssファイルが読み込まれ、その後にreset.scssファイルが読み込まれリセットされていました。

```scss:application.scss
@import './config/reset';
@import './index';
```

基礎の基礎であるコードは上から読み込まれるというのを失念したことが原因でした。

application.scssに他のscssファイルをインポートする際は、リセットファイルや変数を定義したファイルを先に記述して、その後にHTMLファイルに当てるscssファイルを記述するようにしていきます。

## さいごに

基礎は大事!
わかってるつもりにならないこと!
[量子理論]量子コンピュータ本当は意味ないドイチュの問題その2

#こんな人に役立つと思いまして

- 量子コンピュータやりたいけどよくわからん
- 知的好奇心で量子コンピュータ知りたい
- 基礎からだれかまとめてくれ

ちなみにこの記事は量子コンピュータで有名なドイチュの問題その2になります。その1を読んでからの方がわかるかもしれません。その1はこちら。

[ドイチュの問題その1](https://qiita.com/OnigawaraTheTAKERIVER/items/7aa2450c6f54dd92a09e)

#ドイチュの問題復習

√2と√3それぞれを2進数展開した場合の1兆桁目が同じか否かを比較したい。f(x)={√(x+1)の1兆桁目}を計算する回路を実装しているとします。この回路を何回動かすと、一致しているかもとめられるでしょう？

###普通のコンピュータを使う場合

x=0とx=1をそれぞれ計算させて、そのアウトプットが一致するか比較します。つまり2回動かします。

###量子コンピュータを使う場合

1回の計算で終わります。それは次のように考えた場合です。

演算子**Uf**を以下の式のように定義します。この演算子で実効的な部分のf(x)の値は付加的なビットを用いて計算されるものとします。

![763268AF-EE0A-4485-996D-BA7CCA8B9FE1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/f11961d0-4f67-2a47-bf48-289b93f1e5d8.jpeg)

この**Uf**と用意した|1>|1>という2ビットを用いて次のようなを計算します。

![6ADB0B77-3935-41A9-957B-3F8D99E83BD9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/eb9ced8b-74d6-702d-bb5b-2541b2191804.jpeg)

**H**はアダマール演算子と呼ばれる有名な演算子です。上記の演算をした結果、もしf(0)=f(1)であれば、1ビット目の状態は|1>となり、f(0)≠f(1)であれば、|0>となります。1ビット目の様子を見るだけでわかります。肝はアダマール変換で状態の和を作り出すところです。これにより、ある意味並列的に評価できるのです。f(x)の計算は1回しか行っていないため、直感的には1回の計算で答えが出たように見えます。

ですが果たしてそうでしょうか？

#付加的なビットの部分を詳しく考えてみよう

上記の議論で唯一曖昧な箇所があるとすれば、関数f(x)を計算するプロセスです。いきなりですが、付加的なビットとの相互作用を含めて、ドイチュの問題を解くアルゴリズムをグラフで書き下しましょう。

![273F2119-DBFC-4D30-966B-FB3BACBA2C05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/1f6f8dce-b6e6-c181-da86-2505cbf40700.png)

まず、入力として、|1>|1>以外にf(x)の値を計算するための付加的なr個のQビット|ξ>を考えています。rの数はf(x)を計算するための難易度によって変わります。例えば1億桁目の値を計算するのと、1兆桁目を計算するのでは、後者のほうがrは大きくなるでしょう。

|y+f(x)>を2ビット目に実現するためには、2つのステップが必要になります。

- 1ビット目を付加的なQビットととまとめて演算させて|f(x)>にする
- |f(x)>を制御ビット、2ビット目を標的ビットとしてcNOT演算を行う

1ビット目と付加的なビット全体に作用するユニタリー演算子**V**で1ビット目を|f(x)>に変換します。この**V**の具体的な形を書き下すことはご勘弁を。ただし、量子コンピュータでもトフォリゲートと呼ばれるものを構成することができ、これを用いて任意の代数的計算が可能なため、理論上実行できるでしょう。

議論すべきは、1ビット目には**V**の前にアダマール演算子を作用させているので1ビット目は状態の和になっていることです。r個の付加的なビットと1ビット目は、**V**の作用で変なもつれが起こらないようにしなければなりません。すなわち、r個のQビットをまとめて|φ>として、アダマール演算子作用したあとの1ビット目を1/√2(|0>-|1>)とすると状態は1/√2|φ>|0>-1/√2|φ>|1>となり、これに**V**を作用させると1/√2|ξ>|f(0)>-1/√2|ξ>|f(1)>のようにr個のQビットは状態が変わったとしても、それだけで完結し、係数を変えない必要があります。

そして、1ビット目を用いて2ビット目をcNOT演算子でフリップさせます。本来その後に1ビット目に再度アダマール変換を作用させて、1ビット目が0か1かでf(0)=f(1)か否かを判定するのですが、1ビット目は|f(x)>に変換されたままです。元に戻さなければなりません。これには再度r個のQビットとの間で、**V**の逆演算を作用させる必要があります。**V**はユニタリー演算子で、**V^-1**=**V^+**のため、共役な演算子を作用させても良いです。その結果、1ビット目が|x>に戻り、アダマール演算子を作用させて、1ビット目を観測することでf(0)=f(1)かを判別します。

さて、r個のQビットを用いて|f(x)>を計算する際に**V**を作用させました。これが実質1回目の時間がかかる演算です。さらに1ビット目を元に戻すために、**V^-1**も作用させました。ここにも**V**の処理と同じ程度の計算時間がかかると推定されます。つまり、f(x)を計算する箇所を2回呼び出しているのです。

#これはドイチュの問題固有の話なのか？

この2回呼び出しは、ドイチュの問題のみの固有の話でしょうか。答えは否です。ただし多くの場合、計算速度向上が2倍どころではないため、量子コンピュータは意味のあるものになるのです。

#まとめ
- ドイチュの問題で1ビット目を|f(x)>とするために付加的なQビットとの間で計算をする
- ここに時間がかかる
- この|f(x)>を2ビット目とcNOT演算して計算する
- ただしこの後1ビット目は元に戻さないといけない
- これはf(x)の計算の逆演算でここでも時間がかかる
- 本来ドイチュの問題は計算が普通の半分で済むはずだがこれでは普通のコンピュータと一緒
- この理屈は別の問題でも言えることだが、別の問題では速度アップが2倍どころではないため意味が出てくる


次は有名なベルシュタインとバジラ二の問題を説明します。

こちらも参考にどうぞ
[量子コンピュータのための量子論](https://qiita.com/OnigawaraTheTAKERIVER/items/8215311c65b6e589d9cb)
【Python】開発環境などの基礎知識メモ

# Pythonのインストール

公式サイトでWindows用をダウンロードしてインストールする。
インストールする機能は推奨設定の通り。
環境変数PATHにPythonを追加するのを忘れずに。
環境変数を変更するので、インストール後にPCを再起動する。

# IDE

Visual Studio Codeが良さそう。
Pythonプラグインの追加が必要。

# Pythonでのパッケージ管理

「pip」という。前の手順の通りPythonをインストールすると、一緒にインストールされる。

他にも「Anaconda」というディストリビューションがお勧めされている。
こちらはPython+色々が詰まっていて、機械学習関連のパッケージや、IDEが付いてくるらしい。
ただ色々付いてくるということはそれしか使えない、ということでもあるので、
使わない方が無難かも知れない。

# OpenCV

色々な画像処理ができるライブラリ。
pipでインストールできる。が、非公式なパッケージらしい。
コマンドプロンプトで以下を実行する。

```python:コマンド
pip install opencv-python
```
【Python】gzipされたXMLをlxml.etree.iterparseする

大した話じゃないけど，日本語の記事が見当たらなかったので一応．

# 問題
`lxml.etree.parse`は***.xml.gzをそのまま読み込めるのに，`lxml.etree.iterparse`は読み込めない．

```parse.py
from lxml import etree
path = 'dataset/sample/sample.xml.gz'
tree = etree.parse(path)
print(tree.find('//PMID').text)

>> 1
```

```iterparse.py
from lxml import etree
path = 'dataset/sample/sample.xml.gz'
tree = etree.iterparse(path)
print(list(tree)[0][1].text)

>> lxml.etree.XMLSyntaxError: Document is empty, line 1, column 1

```

ちなみにpathを解凍した`sample.xml`にすると，iterparseでも 1 が出力されます．（当然）

# 解決策
こんな記事があった．
> https://mailman-mail5.webfaction.com/pipermail/lxml/20100103/013073.html

要約すると，parseはいろんなファイル形式に対応してるけど，iterparseはすごく単純なファイル形式しか対応してない．（たぶん）

よって，gzipモジュールを使う．

```iterparse.py
from lxml import etree
import gzip
path = 'dataset/sample/sample.xml.gz'
tree = etree.iterparse(gzip.GzipFile(path))
print(list(tree)[0][1].text)

>> 1
```

できた．
nginx: [warn] the "ssl" directive is deprecated,.... の対処法

nginxを更新して `nginx -t` をした時に ` nginx: [warn] the "ssl" directive is deprecated,...`と表示されて頭を抱えたときの対処法。

# 結論

**落ち着いてエラーメッセージをちゃんと読もう。**
`ssl on;` を消して、`Listen` のところに書こう。

# どうやったらいいの


おそらく設定ファイルがこのようになっているはず。

```
server {
        listen 443 http2;
        listen [::]:443 http2;
        root /var/www/public_html;
        index index.php index.html index.htm;
        server_name contoso.com;
        ssl on; <-これがだめ
        ssl_certificate      /hoge/nanka;
        ssl_certificate_key  /hoge/huga;
　　　　　...
}
```

`ssl on;` と書かれている部分がある。ここを消す。

次に、Listenディレクティブに `ssl` を足す。

```
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        root /var/www/public_html;
        index index.php index.html index.htm;
        server_name contoso.com;
        # ssl on;
        ssl_certificate      /hoge/nanka;
        ssl_certificate_key  /hoge/huga;
　　　　　...
}
```

これで `sudo nginx -t` をしてみよう。消えているはず。

```shell

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

# くわしくしりたい

[nginxのドキュメントに書かれている。]  (http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl) nginx 1.15.0で廃止されたようだ。
[随時更新] よく使う、または忘れがちな Docker docker compose Commandまとめ

# はじめに

よく使うコマンドや、オプションについて忘れてしまうことがあるので、まとめてみました。

# Docker コマンド

## imageの一覧を確認

```sh
docker images
```

## volumeの一覧を確認

```sh
docker volume ls
```

## volumeを指定して削除

```sh
docker volume rm -f [volume名]
```

## 未使用のvolumeを一括削除

```sh
docker volume prune
```

## 未使用のimageを一括削除

```sh
docker image prune
```

## 未使用のcontainerを一括削除

```sh
docker container prune
```

## 未使用のnetworkを一括削除

```sh
docker network prune
```

## 停止コンテナ、未使用Volume、未使用network、未使用Imageを削除

```sh
docker system prune
```

## Image,Container,Volumeの数や容量を表示

```sh
docker system df
```

### 詳細を表示

```sh
docker system df -v
```

# docker compose コマンド

## build

```sh
docker compose build
```

### キャッシュを使用しない

```sh
docker compose build --no-cache
```

## コンテナとネットワークを停止、削除

```sh
docker compose down
```

### イメージも削除

```sh
docker compose down --rmi all
```

### volumeも削除

```sh
docker compose down -v
```

### イメージもvolumeも削除

```sh
docker compose down --rmi all -v
```

## ログを表示

```sh
docker compose logs
```

### ログを表示し続ける

```sh
docker compose logs -f
```

### ログの最後から10行表示

```sh
docker compose logs --tail="10"
```

※サービス毎に10行

### サービスを指定して、ログの最後から10行表示

```sh
docker compose logs --tail="10" [サービス名]
```

### サービスを指定して、ログの最後から10行目を起点に表示し続ける

```sh
docker compose logs --tail="10" -f [サービス名]
```

## コンテナの一覧を確認

```sh
docker compose ps
```

## コンテナを起動（コンテナが無い）

```sh
docker compose up
```

## コンテナをバックグラウンドで起動

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

## サービスを指定して、コンテナをバックグラウンドで起動

```sh
docker compose up -d [サービス名]
```

## コンテナを起動（停止中のコンテナ）

```sh
docker compose start
```

## サービスを指定して、コンテナを起動（停止中のコンテナ）

```sh
docker compose start [サービス名]
```

## コンテナを再起動

```sh
docker compose restart
```

### サービスを指定して、コンテナを再起動

```sh
docker compose restart [サービス名]
```

## コンテナを停止

```sh
docker compose stop
```

## サービスを指定して、コンテナを停止

```sh
docker compose stop [サービス名]
```

# 最後に

エイリアスに設定すると、オプション等、忘れがちですよね。

# 参考文献

- [未使用のコンテナ、volumeなどを一括削除 - Qiita](https://qiita.com/reflet/items/5caa88abcf1e8964783a)
Espruino を Raytac MDBT42Q 搭載ボードへ移植する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29906/81b92a99-396b-dfbd-dc74-53edce0c44c1.png" width="640">

[Espruino](https://www.espruino.com/) という JavaScript で開発可能な Web IDE を備えた IoT 開発環境があります。
すべてが対応しているわけではないのですが、Web Bluetooth による Google Chrome から無線経由の書き込みが可能です。

[Espruino Shop](https://shop.espruino.com/espruino-boards) には、対応している公式開発ボードがいろいろ売っています。
[Puck.js](https://www.puck-js.com/) など Raytac MDBT42Q という BLE 対応モジュールを搭載したボードは、すべて無線で書き込みができます。

Espruino のドキュメントを見ていると、[MDBT42Q のブレイクアウトボード](https://www.espruino.com/MDBT42Q)にも対応しているし、これは Puck.js など Espruino 純正のボードじゃなくても移植できそうと思い、少しいじってみたら簡単に移植できたのでここで紹介します。

今回は、[LINE Things development board](https://github.com/line/line-things-dev-board) に Espruino を移植してみたいと思います。
Espruino 2V03 ぐらいのバージョンをもとに書いているので、これ以降のバージョンでは勝手が異なるかもしれません。

## 必要なもの

- JLink (JTAG デバッガ)
- `nrfjprog` コマンド
- ARM 向けの GCC (`gcc-arm-none-eabi`)
- Raytac MDBT42Q を搭載したボード (ここでは [LINE Things development board](https://github.com/line/line-things-dev-board) を利用)

## Espruino のボード定義を追加

Espruino の GitHub リポジトリの中の `/boards` というフォルダの下に、ボードごとの定義ファイルが配置されています。
このフォルダの下に、新しいボード定義を追加します。

例えば、[LINE Things development board の定義ファイル](https://github.com/techno/Espruino/blob/e656e86253fd796e1fcc61ae493ff0826d888efa/boards/LINETHINGS.py) のように定義を書いて、適当な名前で保存します。
ここでは、`LINETHINGS.py` としました。この名前がビルド時に必要です。

重要なのはピンのマッピングなどで、`board["_css"]` などピンの配置の定義などは省略しても問題ないと思います。
(実際どこで使われるのか不明)

詳しい定義は、[README_BuildProcess.md](https://github.com/espruino/Espruino/blob/master/README_BuildProcess.md#board-definition-file--) を見ると良いでしょう。

## ビルド & 書き込み

[README_Building.md](https://github.com/espruino/Espruino/blob/master/README_Building.md) や [NRF_Bootloader.md](https://github.com/espruino/Espruino/blob/master/NRF_Bootloader.md) をちゃんと読むのが良いですが、とりあえず以下のようなコマンドでビルドします。

```shell
$ BOARD=LINETHINGS RELEASE=1 make flash
```

`LINETHINGS` の部分は、ボード定義フォルダに追加したファイル名を指定してください。
`make flash` で、JLink が繋がれていれば自動的に bootloader が書き込まれます。

Espruino IDE を開くと、"`-DBLUETOOTH_NAME_PREFIX` で指定した名前 + ランダムな文字列" でアドバタイジングしているデバイスが検出できるはずです。

あとは、Puck.js など Espruino 公式対応ボードと同様に使えます。すごい！
良いと思ったら、[公式ショップ](https://shop.espruino.com/espruino-boards)から Espruino のオフィシャルボードも買ってあげてください。
コードレビューで詰まった時の解決方法(備忘録)

コードレビューしたいけど、レビューしてもらいたい部分のコードとは、別の部分にエラーが出てしまって、なかなかレビュー部分のコードを変更・修正できない時の解決方法

#解決方法
コードレビューをしたい時は、とりまコードがエラーなく作動するブランチ上でコードの修正をして、コードレビューでプルリクエストする予定のブランチ上にその修正コードをコピペすること。

#解決の手順
1.GitHub上において、コードがエラーなく作動するブランチに移動する。

2.そのブランチ上にて、レビューしてもらいたい部分のコードを修正を行う。

3.そのコードの修正部分を、一度メモにコピべしての別の場所に保存しておく。

4.さらに、それをプルリクエストでレビューに提出する予定のブランチのエディタ上にコピペする。

5.そのブランチの変更・修正をコミットして、プルリクエストする。
SQL Server SQL Command 経由 DDL ファイル、 .sql スクリプト実行する

#はじめに
DDLファイルが一杯あるので、一つずつで実行するのは大変だ。
そのため、もっと楽のやり方を検索する結果をメモーします。
#環境
SQL Server 2008以降
#やり方
```sql:doSqlScript.sql
EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE ;

DECLARE @DBServerName VARCHAR(50);
DECLARE @DBName VARCHAR(50);
DECLARE @FolderPath VARCHAR(100);
DECLARE @EXECString VARCHAR(200);

-- 変数は環境によって違っています。
SET @DBServerName = 'localhost';
SET @DBName = 'yourDBName';
SET @FolderPath = '"C:\sqlScriptFolder\';

SET @EXECString = 'sqlcmd -S ' + @DBServerName + ' -d  ' + @DBName + ' -i ' + @FolderPath + 'myScript.sql"';
EXEC xp_cmdshell  @EXECString;
```

#おわりに
複数ファイルがあった場合は編集してやりましょう(汗)。
もっといいやり方があれば、是非、教えてください。

#参考
https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/xp-cmdshell-transact-sql?view=sql-server-2017
Laravel で Eager Loading させてたら artisan:refresh がコケた

# 前提

- Laravel 5.7
- PostgreSQL
- [laravel-permission](https://github.com/spatie/laravel-permission) で `User` に対するパーミッション周りの実装を実施。
    - `User` から `Role` に対する `MorphToMany` のリレーションを持たせた。
    - `User` は Global Scope で `roles` に対する Eager Loading を実施するようにしてある。

# 起きたこと

`artisan migrate:refresh` をしたら以下のログと共に失敗して、それ以降 `artisan` コマンド自体がコケるようになりました。

```
In Connection.php line 664:

  SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "roles" does not exist
  LINE 1: ...as_roles"."model_type" as "pivot_model_type" from "roles" in...
                                                               ^ (SQL: select "roles".*, "model
  _has_roles"."model_id" as "pivot_model_id", "model_has_roles"."role_id" as "pivot_role_id", "
  model_has_roles"."model_type" as "pivot_model_type" from "roles" inner join "model_has_roles"
   on "roles"."id" = "model_has_roles"."role_id" where "model_has_roles"."model_id" in (1, 2, 3
  ) and "model_has_roles"."model_type" = App\User and "roles"."deleted_at" is null and "deleted
  _at" is null)
```

# 原因

処理は全部追えておらず推測を含むので、間違っているかもしれません。

- `User::boot()` 内で `roles` に対して Eager Loading をさせた事で `User` を参照する時に `roles` テーブルの存在が前提になってしまっていた。
- `artisan` 実行時に `AuthServiceProvider` で記述している `Gate::define` 等により `User` モデルが呼ばれるので、 `roles` テーブルも参照される。
    - `AuthServiceProvider` が呼ばれてるのは `config/app.php` によるもの？
- しかし直前に `migrate:refresh` で `roles` テーブルが既に削除されてるので無理…となっていた。

# 対応

該当のスコープ内で必要なテーブルの有無をチェックするようにしたら解消し、 `migrate:refresh` も無限に実行できるようになりました。

```php:app/Scopes/WithRolesScope.php
class WithRolesScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        if ($this->isExistRolesTable()) {
            $builder->with('roles');
        }
    }

    protected function isExistRolesTable()
    {
        $schemaName = config('database.connections.pgsql.schema');
        $rolesTableName = config('permission.table_names.roles');
        $rows = DB::select('SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = ? AND table_name = ?)', [$schemaName, $rolesTableName]);
        return $rows[0]->exists;
    }
}
```

これがスマートなやり方かどうかは分からない…。
野球ゲームのストライクとボールの宣言をする【ruby初心者】


#見出し
野球ゲームにて、審判が判定を出すためのプログラム

##入力
ballとstrikeの入力を受け付ける
`.map &:chomp` を利用することで、入力した文字が、改行されずに取得できる。

```
results = readlines.map &:chomp 
```

##結果を宣言する

"ball" と "strike" の回数に応じて宣言を返す。

```

ball = 0
strike = 0

results.each do |result| #入力した回数を繰り返す

    #"ball"の際の実行
    if result == "ball" 
        ball += 1
        if ball < 4
            puts "ball!"
        else
            puts "fourball!"
        end

    #"elsif"の際の実行
    elsif result == "strike"
        strike += 1
        if strike<3
            puts "strike!"
        else
            puts "out!"
        end
    end
end
```
【DLNA対応】Plex Media Server を Raspberry Pi にインストールする

[DLNA対応のゴージャスなメディアサーバソフトPlexをCentOS6.9にインストール](https://qiita.com/Zen_then/items/3c57059c97c2b7598c50)
を全面的に参考にさせていただきました。ありがとうございます。

# これは何


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176228/d113616e-5535-2657-267c-a06ce8c65721.png)

* RaspberryPi に、DLNA対応メディアサーバーである Plex メディアサーバーをインストールする
* テレビでだらだら動画を見たいけど、m4vとか再生できない
* PLEXならトランスコードしてくれる！テレビで見られる！！

# 手順
[公式ダウンロード](https://www.plex.tv/media-server-downloads/)から、linuxのdebianのARMv7のdebパッケージをダウンロードする。
コマンドならダウンロード、インストール2行だけ
（2020/04/14 の 最新version は 1.19.1.2645 です）

```
wget https://downloads.plex.tv/plex-media-server-new/1.18.3.2156-349e9837e/debian/plexmediaserver_1.19.1.2645-ccb6eb67e_armhf.deb
sudo dpkg -i plexmediaserver_1.19.1.2645-ccb6eb67e_armhf.deb
```
ラズパイのIPアドレスにアクセスして、設定する。ラズパイは3Bでも2Bでも動きました。
http://192.168.xxx.xxx:32400/web/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176228/d2319eb1-039e-57a4-5d07-76e1d4c749a5.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176228/460435f8-0af5-26ff-6706-f34e56d0c73d.png)
BuffaloのLS-VLにdebian busterをインストールして、nfsサーバーとして活用する

# これはなに
* Buffalo の NAS に debian をクリーンインストールして、いろんなサーバとして使う
* 個人的な目的は、nfs が使えるファイルサーバ。nfs と cifs 両方で使えるようにする
* raspberry pi から nfs をマウント出来るようにする。cifs マウントでもいいけど
* 理由は、nfs のほうがかっこいいから！
* こんなやつ。持ってない人は[中古](https://auctions.yahoo.co.jp/search/search?auccat=&p=buffalo+ls-v&tab_ex=commerce&ei=utf-8)はいかがでしょうか


<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176228/75686a4f-da39-5f4b-5781-512e74aa16b9.png>

引用 https://buffalonas.m.miraheze.org/wiki/Linkstation_LS-VL
Specs
Linkstation LS-VL

CPU	1.6 GHz ARMv5 (Marvell 88F6282)
Memory	256MB DDR3
Bays	1
Network	1x 10/100/1000 Mbps (Marvell 88E1518)
Sata	1x SATA II
NAND Flash	None
SPI Flash	512KB
USB 2.0	1x Rear
USB 3.0	None
Fan	Yes
Power	12V 2A
## LS-VLにdebian busterをインストール
こちらの記事がとても丁寧で分かりやすい。付け加えることが何もない。
https://wv4short.com/installing_debian_9_to_linkstation_ls-xhl_ls-vl_part1/

今回は正式リリース直前の buster をインストールした。




## sudo がない
sudoって、debianをクリーンインストールすると、最初はないんだ・・・

```
su
apt install sudo
nano /etc/sudoers
```

sudoers にも追加しないと、user で sudo が使えません。
当たり前なんだろうけど、初めてやったかも。

## nfs サーバーを構築し、raspberry pi でマウントする
こちらの素晴らしい記事を参考にさせていただいた。付け加えることが何もない。
https://qiita.com/tukiyo3/items/c4dfd6a12bf3255ddc78

## おまかん
私の環境では、2台のラズパイのうち1台で /etc/fstab での nfs マウントに失敗した。
理由は不明、失敗したのはラズパイ3B、うまくいくのは2B。どちらもraspbianで、起動時の設定をいじった覚えはない。
くやしいが対症療法となった。/etc/rc.local の最後、`exit 0` の前に `sleep 10 , sudo mount -a`を追加して対処した。

nano /etc/rc.local

```
sleep 10
sudo mount -a

exit 0
```

かっこ悪い・・・・
粗悪なIT投資によるエンジニア不足の演出。つまりいつも通りのバブルについて。


# エンジニア不足？ 何かがおかしい。

違和感を色々考えた結論を書いておく。

**行き先の失った(日銀の緩和という名のさらなる国債発行=借金による)バブルマネーが大体において諸悪の根源である。**

古くはこれが、安易な不動産投資に回り、低品質な債券が膨れ上がり、弾ける。

2019にそろそろ弾けそうなタワーマンションバブルも、同じ構図だろう。
いわゆるバブル、リーマンショック、サブプライム問題なども同じ構図だ。

[この本](https://www.amazon.co.jp/%E5%B9%B3%E6%88%90%E3%81%AF%E3%81%AA%E3%81%9C%E5%A4%B1%E6%95%97%E3%81%97%E3%81%9F%E3%81%AE%E3%81%8B-%E3%80%8C%E5%A4%B1%E3%82%8F%E3%82%8C%E3%81%9F30%E5%B9%B4%E3%80%8D%E3%81%AE%E5%88%86%E6%9E%90-%E9%87%8E%E5%8F%A3-%E6%82%A0%E7%B4%80%E9%9B%84/dp/4344034252)とかに詳しく載ってそう。読んでないけど。

日本の金融機関は基本的に無能なので、ベンチャー投資のような難しい案件を扱うことができない。
そして安直な不動産投資(サラリーマンに家を買わせて借金漬けにする。取りっぱぐれが少ない。投資とは呼びたくない。)
に流れる。
そしてバブルが起こり、弾けて、実体経済がさらにめちゃくちゃになる。
そういうことを延々と繰り返してきたらしい。

ところで最近感じる違和感であるが、やたらとエンジニア需要が高い。
誰もがエンジニアが足りないという。何かがおかしい。

エンジニアを採用している会社を見ると、いまいち将来性を感じないエセスタートアップがやたらと目につく。

嫌な予感がする。こんな記事も目にする。

https://www.wantedly.com/companies/trash-briefing/post_articles/153646
https://www.knynht.jp/entry/Start-Up-Bubble

不動産では流石に市井の人々を騙せなくなったのか、バブルマネーをベンチャー投資に回しているのか。

バズワード作って、スタートアップ乱立、（一般？）投資家を募り、IPOで売り抜けてゴール。

といった感じなんだろうか。

（いまさら）株式投資のステマを目にするようになったように感じる。
老後2000万円必要発言も、株式投資への誘導策と見る向きもある。（信じられないくらい阿呆な策ではあるけど）

構造的にはサブプライムと同じような構造に見える。日本は国債という名の麻薬に侵されて末期状態なのだろう。

世の中はいつでも腐ってる。

それでもそんな中で着実に価値を生み出すようなプロダクトや会社はあるので、
腐らずに進み続けるしかないんだろう。
配列において、前後の数字の差をとる【ruby初心者】

#はじめに
配列において、前後の数字の差をとる、プログラムを作ってみる

#方法①ごりごりやる

```
#入力データ
input_line = readlines.map(&:to_i)

#(配列数-1)回実施する
count = input_line.count-1

#差をとる
count.times do |timeCount|
    puts  input_line[timeCount+1] - input_line[timeCount]
end
```

#方法②each_consをつかう

```
input_line = readlines.map &:to_i

#前後の配列を作る
before_after = input_line.each_cons(2).to_a

before_after.each do |ba|
    puts ba[1] - ba[0]
end
```
時刻操作のSwift(Foundation)とRuby比較

## 現在時刻のインスタンスを生成する
```ruby:ruby
Time.now
# => 2019-07-03 18:01:06 +0900
```

```swift:swift
Date()
// Date = 2019-07-03 09:02:14 UTC
```

## システムのタイムゾーンで指定の日時を指定してインスタンスを生成する
```ruby:ruby
Time.new(2019, 6, 24)
# => 2019-06-24 00:00:00 +0900
```

```swift:swift
// 方法1
let calendar = Calendar(identifier: .gregorian)
DateComponents(calendar: calendar, year: 2018, month: 6, day: 24).date
// Date? = 2018-06-23 15:00:00 UTC

// 方法2
calendar.date(from: DateComponents(year: 2019, month: 6, day: 24))
// Date? = 2018-06-23 15:00:00 UTC
```

## 現在時刻をフォーマットを指定した文字列として取得する
```ruby:ruby
Time.now.strftime("%Y-%m-%d %H:%M")
# "2019-06-24 17:49"
```

```swift:swift
let formatter = DateFormatter()
formatter.dateFormat = "yyyy'-'MM'-'dd' 'HH':'mm"
formatter.locale = Locale(identifier: "en_US_POSIX")

formatter.string(from: Date())
// "2019-06-24 17:49"
```

## 時刻フォーマットっぽい文字列をパースする
```ruby:ruby
require 'time'
Time.parse("2019-06-24 17:49")
# 2019-06-24 17:49:00 +0900
```

```swift:swift
let formatter = DateFormatter()
formatter.dateFormat = "yyyy'-'MM'-'dd' 'HH':'mm'"
formatter.locale = Locale(identifier: "en_US_POSIX")

formatter.date(from: "2019-06-24 17:51")
// Date? = 2019-06-24 08:51:00 UTC
```
tryメソッド


 ```pre_order.rb
  before_validation :set_company_for_user

  def set_company_for_user
    self.company = self.user.company if self.user.company.present?
  end

```

このメソッドがある時rspecではここで引っかかるんだけど
![スクリーンショット 2019-06-24 17.53.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265805/dc50aebd-41ee-82dd-9a31-8504ce25b0e8.png)


```pre_order_spec.rb

  describe 'association' do
    subject { FactoryBot.create(:pre_order) }
    context 'belongs_to' do
      it { is_expected.to belong_to(:user) }
    end
  end
```

tryメソッドに書き換えたら通るようになっただ！

```pre_order.rb
  def set_company_for_user
    self.company = self.user.company if self.user.try(:company).present?
  end
```



参考：https://qiita.com/ngron/items/ec5f72639634949c126e
逆置換を求めるプログラム


逆置換を求めるプログラムです。置換、
　　　　　| 1 2 3 4 5 |
　　　 ρ＝| 1 5 3 2 4 |
の下の部分を、与えると、逆置換
　　　　　　　 ｜1 2 3 4 5｜
　　　 ρ^-１＝｜1 4 3 5 2｜
の下の部分を返します。
例えば、｜1 5 3 2 4 |は、一つの数字列15324で与えます。
返り値も、一つの数字列14352です。
なので、9桁までしか扱えません。

ターミナルから、
`chmod +x rperm.py`で、実行権限を付けて、
`./rperm.py 15324`として、実行して下さい。

```rperm.py
#!/usr/bin/python3
import sys

istr=sys.argv[1]
l=len(istr)
i=1
rstr=""
while(i<=l):
  k=1
  while(k<=l):
    if (int(istr[k-1])==i):
      rstr=rstr+str(k)
      break
    k+=1
  i+=1
print(rstr)
```

実行例

```
$ ./rperm.py 15324
14352
$ ./rperm.py 132
132
$
```
GASでTwitterのAPI利用時にエラー（Callback URL not approved）が出た場合の対処法

#前提
GoogleAppsScript(GAS)を用いたTwitterのAPIを利用する際の認証時にエラーが出たので対処法を記録しておきます。


#事象
```
Error starting OAuth flow: 
<?xml version="1.0" encoding="UTF-8"?>
<errors><error code="417">Desktop applications only support the oauth_callback value 'oob'</error></errors> 
(line 334, file "Service", project "OAuth1")
```
Twitter Apps側の設定で**Callback URL**を設定していなかったことが原因。
適当なURLを入力すると下記のエラーメッセージに変わる。

```
Error starting OAuth flow: 
<?xml version="1.0" encoding="UTF-8"?>
<errors><error code="415">Callback URL not approved for this client application. 
Approved callback URLs can be adjusted in your application settings</error></errors>
 (line 334, file "Service", project "OAuth1")
```

#対処法
適切なURLを入力する。




```
https://script.google.com/macros/d/[GASのスクリプトID]/usercallback
```
[GASのスクリプトID]はGAS利用時のURLの該当部分のこと。

```
https://script.google.com/d/[GASのスクリプトID]/edit
```
Linux2台でAnsible最速入門（CentOS）

## はじめに
　Ansibleで自動化してみたいと思った時、インストールから簡単なチュートリアルまでまとまってると楽しいのでまとめました。



## 概要

- 疎通が可能な端末（Windows,Mac）とLinux(CentOS7)が2台ある環境で行う
- 自動操作を行う方をServer、される方をCliantとする
- Terminalからsshして作業、確認すると良い
- Server側にAnsibleをインストールする
- Client側はAnsibleでhttpdをインストールされる


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228197/24784aab-f60d-457e-2108-ab432860d788.png" width="500">


## インストール(Serverのみ)


###### EPELの追加

```
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
```

###### Ansible インストール

```
# yum install ansible
```

###### バージョン確認

```
# ansible --version
```

[Ansible インストール方法(Centos7)](https://qiita.com/naka_mikito/items/9f378c123d248b609c92)

## チュートリル
[Ansibleのインストールとサンプルコードの実行](https://thinkit.co.jp/article/9472)

###### 操作可能端末の確認
ansibleは誤爆すると危険なのでリストにあるホストのみ操作できる
このチュートリアルの場合クライアントのIP（192.168.0.3）を追記

```
vi /etc/ansible/hosts
```

###### プレイブック
プレイブックは構築の手順書です
yaml形式で記述するためインデントがずれると意味が変わってしまうため注意
エラーが出たらyamlの書き方ググってくださ

```
cd
vi testbook.yml
```

```
- hosts: 172.20.10.3
  gather_facts: no
  become: yes

  tasks:
    - name: install the latest version of Apache
      yum:
       name: httpd
       state: latest
    - name: Make sure a service is running
      systemd:
       state: started
       name: httpd
    - name: Firewalld Start
      firewalld: service=http permanent=true state=enabled immediate=true
```



###### サーバからクライアントをSSHで操作できるように
AnsibleはSSHを利用して自動操作を行うため、サーバからクライアントへ、パスワードレスSSHできるように鍵の生成＋転送

- 試しにSSHしてみる

```
ssh root@192.168.0.3
パスワードが聞かれる
```

- 鍵の生成

```
ssh-keygen
全てエンター
```

- 鍵の転送

```
ssh-copy-id 192.168.0.3
```

- 確認

```
ssh root@192.168.0.3
聞かれない
```

##### 実行
```
ansible-playbook testbook.yml
```

##### 確認
TerminalのブラウザからクライアントのWEBページを見てみる

```
http://192.168.0.3
```

## まとめ
インストールから最小構成のプレイブック実行までとにかく簡単にまとめました。
チュートリアルができたらプレイブックを読んでみてググって改造ができると思います。
触ったことがない人の初めてになれればうれしいです。
Ansibleで複数ホストを同時にrebootする

## なんでやろうと思ったか
個人的に複数台の端末を管理することがあり、今まではスクリプトを書いて複数台rebootしていたがもっといい方法がないかと探していたとことAnsibleをつかえば簡単にできるのではと思い立ったから。

## 環境
Centos7
ansible 2.8.1

## まず1台をrebootする
```
vi reboot.yml

- hosts: ipaddress
  gather_facts: no
  become: yes

  tasks:
    - name: reboot
      reboot:
```
参考：https://docs.ansible.com/ansible/latest/modules/reboot_module.html#reboot-module

## グループを作成する
```
vi /etc/ansible/hosts

#追記
[グループ名]
ipaddress
ipaddress
```
## グループを指定して実行する
```
- hosts: グループ名
  gather_facts: no
  become: yes

  tasks:
    - name: reboot
      reboot:
```
## まとめ
予想以上に簡単にできて個人的には満足です。これを機にAnsibleの勉強をしてみようと思います。
### 注意
* ansibleのバージョン2.7以上にしか対応してない
* ネットワークを自動起動にしておかないと正常に終了したかわからない