OmniAICreator/Qiita-1.07M huggingface dataset:
2点間の直線距離の公式がわからなかったので分かった気になれるよう補足してみた。



#はじめに

～あらすじ～
むかしむかしあるところにコードを理屈が分からないままに使うのが嫌なエンジニアがおりました。
ある日彼はとあるサイトで2点間の直線距離を求めるjavascript・コードをみつけました。
コードを読んでも意味が理解できなかった彼はくやしくなって、数学の勉強を（さわりだけ）やってみました。


……ひとに見せるのが目的じゃあない雑記メモなので、とくに解説はしません。

#備考

※各引数の内訳

current_lat = 現在地の緯度
current_long = 現在地の経度
target_lat = 目的地の緯度
target_long = 目的地の経度
precision = 精度(くわしくは後述)

※「化成緯度」について

>地球楕円体上のある地点を通る赤道面の法線と地球楕円体と
赤道で接する球面との交点を考える。その交点と地球楕円体中心
とを結ぶ直線が赤道面となす角が化成緯度。
>![kasei.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416995/80794e72-6058-ddfd-6780-2ee2afd227e2.gif)
http://motochan.sakura.ne.jp/public_html/GISContents/16.htm より


……図を見て「ああこんなもんなんだ」と理解した。筆者は。たぶん。


#コード
説明とかは半分くらいコードの中に書いてある。

```javascript:test.js

	// 現在地と目的地との距離を計算
	function geo_calculate(current_lat, current_long, target_lat, target_long, precision){

		// ※公式「測地線航海算法」（Lambert-Andoyerの公式）を用いています。
		let distance = 0;

		// ２点間の緯度の差と経度の差が両方とも0.00001(＝10万分の一)未満なら、２点間は同じ位置であるとみなし、計算しない
		if((Math.abs(current_lat - target_lat) < 0.00001) && (Math.abs(current_long - target_long) < 0.00001)) {
			distance = 0;
		}else{
			// 緯度に円周率を掛けて180で割る
			current_lat = current_lat * Math.PI / 180;
			current_long = current_long * Math.PI / 180;
			target_lat = target_lat * Math.PI / 180;
			target_long = target_long * Math.PI / 180;

			const QUATOR_RADIUS = 6378140; // <-地球赤道半径(単位はm)
			const POSITION_RADIUS = 6356755; // <-地球極半径(単位はm)
			const ASPECT_RATIO = (QUATOR_RADIUS - POSITION_RADIUS) / QUATOR_RADIUS; // <-地球の扁平率

			// 測地緯度（ここでは、current_latとtarget_latのこと）を化成緯度に変換。
			// P1は現在地の化成緯度、P2は目的地の化成緯度。
			const P1 = Math.atan((POSITION_RADIUS / QUATOR_RADIUS) * Math.tan(current_lat));
			const P2 = Math.atan((POSITION_RADIUS / QUATOR_RADIUS) * Math.tan(target_lat));

			// 球面上の距離の計算
			const X = Math.acos(Math.sin(P1) * Math.sin(P2) + Math.cos(P1) * Math.cos(P2) * Math.cos(current_long - target_long));

			// 距離補正量を算出
			const L = (ASPECT_RATIO / 8) * ((Math.sin(X) - X) * Math.pow((Math.sin(P1) + Math.sin(P2)), 2) / Math.pow(Math.cos(X / 2), 2) - (Math.sin(X) - X) * Math.pow(Math.sin(P1) - Math.sin(P2), 2) / Math.pow(Math.sin(X), 2));

			// 上で算出した距離補正量をもとに、測地線の長さ（≒地球上の２つの場所の最短距離）を算出する
			distance = QUATOR_RADIUS * (X + L);

			// 算出された値の精度
			// この「精度」は「正確さ」ではなく、「値を表現する細かさ」のことなので注意！
			const decimal_no = Math.pow(10, precision);

			// ここで出たdistanceの単位はメートル。
			distance = Math.round(decimal_no * distance / 1) / decimal_no;
		}
		return distance;
	}



```



#参考文献

http://www2.nc-toyama.ac.jp/~mkawai/lecture/sailing/geodetic/geosail.html
http://motochan.sakura.ne.jp/public_html/GISContents/16.htm
https://qiita.com/damyarou/items/9cb633e844c78307134a
https://ja.wikipedia.org/wiki/%E6%B8%AC%E5%9C%B0%E7%B7%9A
Ajax利用時にローカルファイルがCORSエラーになった時の対応

#発生した経緯
初歩の初歩で入門編の参考書をみながら勉強しており、
Ajaxでローカルファイルを呼ぼうとしたらとしたがCORSポリシーエラーになって失敗した。

##前提
- ブラウザでローカルファイル（html）を表示させただけ。
- 使用ブラウザはchrome。
- OSはmac。

##エラー内容
Ajaxを動かした結果、以下のようなエラーが出た

```
'[ファイル名]' from origin 'null' has been bloc
ked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https
```
**CORS policy ???**

#ざっくりすぎるCORS policy 
##CORSとは
Cross-Origin Resource Sharing (オリジン間リソース共有)
オリジンの構成要素はスキーム、ホスト、ポート。

例えば

```
①　http://qiita.com/users?char=A
②　http://qiita.com/users?char=B
③　http://qiita.com/users?char=C:80
④　http://qiita.com/users?char=D:8080
```
①〜③はスキーム(http)、ホスト(qiita.com)、ポート(:80)が同じ（８０番ポートは既定)なので同一オリジンと言える。
④はポートが違うため別のオリジン。

##CORS policy とは
CORS policy (同一オリジンポリシー)
一言で言うと**セキュリティのために同一オリジンからしか取得しません**っていう制約。
今回はchromeからローカルファイルサーバにアクセスしようとしたのでこの制約に引っかかったったいねー。


##対応方法
色々あるが一番簡単(ソースへの加筆等が不要)なのはブラウザ起動時にCORSを許可してしまうこと。
つまり、別オリジンからもアクセスできるようにしてしまうこと。

chromeを終了して（not 閉じて）
![chrome終了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513179/f3e30fc3-4a7d-c1e5-10f7-a029b2298d83.png)

以下のコマンドをterminal等から実施する

```
open -a Google\ Chrome --args -allow-file-access-from-files
```

ブラウザの上の方に警告文がでる。
で、Ajaxでローカルファイルを呼ぶと...呼べる！！


##注意点
>つまり、別オリジンからもアクセスできるようにしてしまうこと。

今回はローカルに閉じた話ですが外部からのアクセスを許可してしまっているのでセキュリティはガバガバです。
他人のPCや共有PC使用時には注意が必要です。
もちろん、社用PCでちょっとお勉強してますという人も要注意です。

我々初歩の人間には分からない脅威がごまんとあります。
詳しい方に聞きましょう。
そして自分の知見も増やしちゃいましょう。


#詳細を知りたい方は
chromeじゃなくてmozillaのサイト(これがわかりやすかった)
https://developer.mozilla.org/ja/docs/Web/HTTP/CORS
rails 発展その7 スクレイピング

スクレイピングとはwebページのHTMLから情報を抜き出す方法です。
データの集計にも役立ちます。

## railsスクレイピングの基本

```ruby:gemfile
  gem 'mechanize'
 # このgemでスクレイピングができるようになります。
```

```bash:ターミナル
　　$ bundle install
   #忘れずに反映します。
```

```ruby:controller

  # 上から順にスクレイピングの基本となるコード例一覧です。

   sample = Mechanize.new 
   # Mechanizeを使ってスクレイピングをするには、Mechanizeクラスのインスタンスを生成します。

   page = sample.get("http://~~(アドレス)") 
   # getメソッドでHTMLを取得

   ele = page.search('h2 a')
   # searchメソッドでh2とaの要素を検索
   
   puts ele.inner_text
   # inner_textメソッドで得られたHTML情報のテキストを取得する
  
   puts ele.get_attribute('href') 
   # get_attributeメソッドでhrefの取り出し
   # puts ele[:href]としても良い
```
アプリのMVPパターンについて

# 経緯
プロジェクトでAndroidとiOSを同時期に開発することになりました。
同じアプリだから挙動や仕様も合わせた方がいいよねという話をして、
Android、iOS両方で実績のあるパターンでかつ、メンバーの学習コストが少ない
アーキテクチャパターンを調査・検討することになりました。

いくつか候補が上がった中で、
MVPがiOSではデフォルトだし、Androidでもよく使われるパターンの一つなので、
まずはこれで行きたいという話になりました。
（AndroidではMVVMがいいかなぁと思いつつ、AndroidでもMVPでできないことはないので、
 比較的わかりやすいMVP（PassiveView）で行くことに決まりました）

# 参考書
- [Android アプリ設計パターン入門](https://peaks.cc/books/architecture_patterns)
- [iOSアプリ設計パターン入門](https://peaks.cc/books/iOS_architecture)

この2冊を参考にそれぞれのOSでどう設計するかを検討しました。
ご存知の方も多いかもしれませんが、この2冊本当に良書です。

iOSの方は特にアーキテクチャ検討の歴史や直近流行しているアーキテクチャに対して
GUIアーキテクチャやシステムアーキテクチャなどアーキテクチャについて
整理もしてくれていてとても参考になります！

AndroidもiOSもソースはgithubで公開されているので、実装はこちらで確認しました。

- https://github.com/android/architecture-samples/
- https://github.com/peaks-cc/iOS_architecture_samplecode

# 悩んだ点と解決
android と iOS の MVP の違いがしっくり吸収できませんでした...
一旦、表に整理してみると頭が整理されました。

| Layer / OS       | Android           | iOS                |
|:-----------------|:------------------|:-------------------|
| View             | Fragment          | ViewController     |
| Presenter        | View / Presenter  | Input / Output     |
| Model            | RepositoryPattern | Model              |
| injection        | Activity          | AppDelegate        |

Android と iOS で MVPの実装は同じなんですが、
違い（実は違わなくても）を整理してみました。

- AndroidはModel層をRepositoryパターンで提示している、iOSはModelそのまま。
（画面に対するModelというよりデータに対して提供するイメージなのかな？）

- AndroidはPresenterを Contract という 一つ上のInterfaceに挟み込んでいる。iOSはInput/Output。
（どちらでもいいけど、iOSの方がとっつきやすい印象。Swiftの言語仕様的にKotlinの形はできないかも）
（iOSも変数名はpresenter/viewになっているので、ここの差異は小さい）

違いではないけど、ちょっと考え方に慣れなかったのが、
AndroidもiOSもViewを作るタイミングでPresenterもModelも生成して、
依存関係を全て解決している。
これは、テストをする上ではやりやすいのかもしれない。

ちなみに、Androidの実装内容についてはこちらの記事にすごく綺麗にまとまってました！
[Android Architecture Blueprintsで学んだアプリ実装(MVP)]
(https://qiita.com/HunterPigeon52/items/427417785563480cbc830)

# まとめ
自分の整理としてまとめてみると、頭で整理できなかったところが、
実はそれほど大きな違いではない事を気付きました（記事としては薄い内容に...）

とはいえ、両方のOSがそれぞれの推奨Practiceで進むべきかどうか、
整理してみて改めて検討の予知を知ることができたことは大きかったです。
（特にModel層は揃えないと挙動の違いに直結しそう...）

iOSはRepositoryパターンの記事が少ないので、まずは単純にModelで考えてみます。
【備忘録】Ruby on Rails でDBにカラムを追加する

Rails初心者がDBの扱いの基本を備忘録として書いていきます。

〇やりたい事
・tasksというテーブルにDate型のDeadlineという名のカラムを追加する。



##手順1  Rails DBConsole起動

`$rails dbconsole`


##手順2　スキーマでテーブルの中身を確認

`sqlite> .schema`


##手順3　.exitでdbconsoleを抜ける

`sqlite> .exit`


##手順4　rails g migration AddTo〇〇の構文でカラムを追加

`rails g migration AddDeadlineTOtasks Deadline:date`



>参考記事
>https://qiita.com/ai_qiita/items/9c28d0c161f845b9e9a6
【Ruby】strftimeメソッドでよく使われるフォーマット文字列まとめ




## はじめに
最近Rubyで時間や日付関連をいじくっていて、何回もこのメソッドが出てきています。

しかし、どうも覚えられない。毎回ググる。
リファレンスマニュアルは全部書かれすぎて探すのに時間がかかる。**面倒！**:sweat_smile:

ということで、よく使うフォーマットに絞ってまとめることにしました。

## この記事が役に立つ方
- 日付や時間を活用するシーンに遭遇した
- Ruby初心者

## この記事のメリット
- `strftime`メソッドで好きなフォーマットを指定出来るようになる:thumbsup_tone2:

## 環境
* Ruby 2.6.3

## `strftime`メソッドとは
**Timeクラス**のDate型やDatetime型オブジェクトに使用可能なメソッド。
String(文字列)が返される。

Rubyで時間や日付を扱うのなら頻出。

↓Rubyリファレンスマニュアルはこちら。
[instance method Time#strftime (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/latest/method/Time/i/strftime.html)

以下、公式サイトの例を引用させて頂きます。

```ruby
  t = Time.now                         #=> 2010-09-05 15:41:17 0900
  t.strftime(“Printed on %m/%d/%Y")    #=> “Printed on 09/05/2010”
  t.strftime(“Printed on %m/%-d/%_6Y”) #=> “Printed on 09/5/  2010”
  t.strftime(“at %I:%M%p”)             #=> “at 03:41PM"
  t.strftime("at %I:%M%#p")            #=> "at 03:41pm"

```

↑この用法って日本向きじゃないですよね。直感的に「あ、なるほどね！」ってならない、わかりにくい・・・。:sweat:

## よく使われる用法
個人的にこれだけあれば間に合うと考えているものを列挙していきます。

### 【前提】
以下のようにして変数`t`を定義します。
変数`t`には現在時刻が入っています。
ここから、欲しいところを抽出するためにどうするか確認していきましょう。

```ruby
t = Time.now
=> 2019-11-10 22:59:06 +0900
```
---
### 【年月日が欲しい】
#### `%Y/%m/%d` 
日本的な表示。

```ruby
t.strftime('%Y/%m/%d')
=> "2019/11/10"
```

#### `%D`=`%x`
アメリカンな表示。

```ruby
t.strftime('%D')
=> "11/10/19"

t.strftime('%x')
=> "11/10/19"
```
---
### 【時分秒が欲しい】
#### `%H:%M:%S` = `%T`=`%X`
どれを使っても同じ。
個人的には`%T`が覚えやすくて好きです。

```ruby
t.strftime('%H:%M:%S')
=> "22:59:06"

t.strftime('%T')
=> "22:59:06"

t.strftime('%X')
=> "22:59:06"
```
---
### 【コンマ２桁まで秒数が欲しい】
#### `%H:%M:%S:%2N` = `%T:%2N`=`%X:%2N`
ストップウォッチなどはこれが多いですね。
`%H`（時間）を除いて使うことも多そうです。

```ruby
t.strftime('%H:%M:%S:%2N')
=> "22:59:06:55"

t.strftime('%T:%2N')
=> "22:59:06:55"

t.strftime('%X:%2N')
=> "22:59:06:55"
```
---

### 【週を表す数（日曜始まり）】
#### `%U`
一年間のうち、何週目かを確認。

```ruby
t.strftime('%U')
=> "45"
```
---
### 【週を表す数（月曜始まり）】
#### `%W`
月曜始まりで週をカウントするならこちら。
日曜日に試したので、こちらのほうが１つ少なくなりました。

```ruby
t.strftime('%W')
=> "44"
```

## おわりに
ちなみに、皆さんは`strftime`をどう音読されてますか？
「えすてぃーあーるえふたいむ」？:sweat_smile:

音読できなくて`srtftime`とか`stfrtime`とかタイポ多発します。
パッと見間違いに気づけません。笑

意味的には`str` + `f` + `time`ですかね。

## 参考にさせて頂いたサイト（いつもありがとうございます）
[instance method Time#strftime (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/latest/method/Time/i/strftime.html)
OSL の envmap の importance sampling と MIS の計算についてのメモ

OSL testrender のコードを参考にします.

## 語彙

* 4 PI : 単位球の表面積
* CDF : Cumulative Density Function. envmap の importance sampling に利用
* MIS : Multiple importance sampling

## OSL background.

background.h では

4 PI は, MIS で BSDF とサンプリングを行うために確率の計算空間を合わせるために必要です. CDF を正規化したのち, sample/eval で pdf/f を返すときに 4pi 補正を入れるのでも OK です.

## Implicit

diffuse などで反射したレイが envmap に当たるケース.

## Explicit

レイが surface にあたり, 交点で光源を明示的にサンプルして寄与を計算するケース.

ちなみに OSL testrender では envmap(background) と, 他の光源(point, directional, area など)は別であつかっています.

つまり integrator では, explicit の直接光計算で, envmap と, それ以外の光源とで二回レイを飛ばします.
manylight + envmap のシーンでは, こちらのほうが効率(収束)がよいです.
(ただし shadow catcher material があるシーンでは, 扱いが面倒だったような) 

## note

OSL testrender では sinTheta を考慮しない jacobian を使っています(理由は不明). pbrt は sinTheta で補正をいれた jacobian を使っています. 

したがって, レイの方向から UV 座標を計算する map 関数(vector -> uv) だけを別の環境マップツールで使う場合などに注意が必要です(これで筆者はハマりました).


### MIS weight

OSL test render では power heuristic を使っています.

しかし OSL testrender では f(eval) が f/pdf と pdf で割った値が含まれているものに対して MIS を計算しているので, そのままで他のレンダラに使う場合には注意がいります.

```
power_heuristic_weight(sampled_pdf, other_pdf):

  if (sampeld_pdf > other_pdf) {
    r = other_pdf / sampled_pdf;
    mis = 1 / (1 + r * r)
  } else if (sampled_pdf < other_pdf) {
    r = sampled_pdf / other_pdf;
    mis = 1 - 1 / (1 + r * r)
  } else { // inf/inf
    mis = 0.5
  }

  return mis
```

## implicit hit to envmap

```
input: bsdf_pdf

(Le, bg_pdf) = envmap.Le(dir)

mis_weight = eyeray ? 1.0 : power_heuristic_weight(bsdf_pdf, bg_pdf);

L = Le * mis_weight 
```


## explicit hit(sample envmap)

```
u0, u1 = random number
(Li, L_dir, L_pdf) = envmap.Sample_Li(u0, u1);

mis_weight = power_heuristic_weight(L_pdf, bsdf_pdf)

contrib = throughput * bsdf_f * L * mis_weight / L_pdf
```

## TODO

* [ ] さらなる検算
* [ ] PBRT-v3 integrator との比較(PBRT では, implicit/explicit の扱いが異なる)
「docker18.09」の失敗しないインストール方法のまとめ

docker単体をセットアップしたい人、kubernetesでdockerを利用する際にハマらないセットアップ手順及び参考サイト紹介します。ご自身の環境に適宜読み替えて参考にしてください。

## 検証環境
OS : Centos7.6（minimal)


## インストール時に参考にする情報
基本的には[公式サイト](https://docs.docker.com/install/linux/docker-ce/centos/)を参考するのが良いと思います。
（リンクはcentosの手順ページになります左側のメニューからご自身のデストリビーションを選択してください）

## docker インストール手順
上記の公式インストールサイトを参考に私が実行したコマンドを以下に掲載します

### 1.古いバージョンをアンインストールする
これにより古いバージョンがあればアンインストールします。これらのパッケージがいずれもインストールされていないことが報告されれば問題ありません。(私の環境ではアンインストールされるものはありませんでした）

```
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
```
### 2.dockerに必要なユーティリティを先にインストール

```
$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
```
### 3.yumのリポジトリの追加

```
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
```

### 4.インストールしたいバージョンの確認をする
以下のコマンドを実行すると、インストール可能なバージョンが表示されるので確認します
完全修飾パッケージ名で特定のバージョンをインストールします。完全修飾パッケージ名は、パッケージ名（docker-ce）と、最初のコロン（:）から始まり、ハイフン（-）で区切られた最初のハイフンまでのバージョン文字列（2列目）です。たとえば、`docker-ce-19.03.4`を指定します

```
$ sudo yum list docker-ce --showduplicates | sort -r

docker-ce.x86_64            3:19.03.4-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.3-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.2-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.1-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.0-3.el7                    docker-ce-stable 
```
### 5.dockerをインストール

```
$ sudo yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io
```

### 6.docker serviceの起動
エラーが表示されなければdocker serviceが起動されています

```
$ sudo systemctl start docker
```

#### 7.dockerのバージョンを確認

```
$ sudo docker version
Client:
 Version:           18.09.9
 API version:       1.39
 Go version:        go1.11.13
 Git commit:        039a7df9ba
 Built:             Wed Sep  4 16:51:21 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.9
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.11.13
  Git commit:       039a7df
  Built:            Wed Sep  4 16:22:32 2019
  OS/Arch:          linux/amd64
  Experimental:     false
```

## 参考サイト
https://docs.docker.com/install/linux/docker-ce/centos/
面倒なことはプログラミングで一発解決

# 面倒なことはプログラミングで一発解決

```php:index.php
id thumbnail name ruby area parent location latitude longitude kind type introduction description request score status
```

この横並びの非常に長い文字列を

```php:index.php
id
thumbnail
name
ruby
area
parent
location
latitude
longitude
kind
type
introduction
description
request
score
status
```

このようにインデントを揃えたいとき、一つずつENTERで改行するの正直面倒です。

***これを関数使ってスマートにやっていきましょう！***

```php:index.php
$str = 'id thumbnail name ruby area parent location latitude longitude kind type introduction description request score status';

$arr = explode(' ', $str);

var_dump($arr);
```

文字列を変数`$str`に代入し`$str`に対して`explode関数`を適用します。

`explode関数`:第二引数の文字列を、第一引数で指定した区切り文字で区切りそれぞれ文字列を配列にする。
第一引数：区切り文字を指定
第二引数：文字列

このように表示されます。

```php:index.php
array(16) {
  [0]=>
  string(2) "id"
  [1]=>
  string(9) "thumbnail"
  [2]=>
  string(4) "name"
  [3]=>
  string(4) "ruby"
  [4]=>
  string(4) "area"
  [5]=>
  string(6) "parent"
  [6]=>
  string(8) "location"
  [7]=>
  string(8) "latitude"
  [8]=>
  string(9) "longitude"
  [9]=>
  string(4) "kind"
  [10]=>
  string(4) "type"
  [11]=>
  string(12) "introduction"
  [12]=>
  string(11) "description"
  [13]=>
  string(7) "request"
  [14]=>
  string(5) "score"
  [15]=>
  string(6) "status"
}
```

これをforeachでループしechoすると
```php:index.php
foreach ($arr as $column) {
   echo $column . "\n";
}
```

```php:index.php
id
thumbnail
name
ruby
area
parent
location
latitude
longitude
kind
type
introduction
description
request
score
status
```
するとこのように一発でインデントが揃えました。

`私の上長の名言`
***人のすることじゃないと思ったら自動化すべし***

ご閲覧ありがとうございました。
Laravel+dockerで、新規プロジェクトを作った後でハマるポイント

# Laravelを使ってアプリケーションを開発してみようと考えました
仕事でPHP + MySQLで小さいシステムを開発することになったのですが、NOフレームワークだとちょっと開発時間がかかってしまうので、フレームワークを導入しようと思いました。調べたら、CakePHPとか、FuelPHPとか、Laravelが出てきたので、最近人気上昇中のLaravelを使ってみることにしました。ただ、新規で開発しようとしたら、いろんなところでハマったので、メモを残しておくことにしました。

## 開発環境
* PHP7.2
* apache2
* Docker（php:7.2-apache）
* Laravel 6.5.0

## LaravelのWelcome画面が表示されるまでのハマりポイント

### vendor/autoload.php): failed to open stream: No such file or directory
最初に、以下のコマンド

```bash
$ laravel new
```
を、実行して、Laravelプロジェクトを作り、

```bash
$ docker-compose up -d
```
なんてことをすると、画面にはきれいなwelcome画面ではなく、autoload.phpがないというログが表示されます。原因は、public/index.phpから読み込まれるautoload.phpがないからですが、自分で実装するわけではありません。

#### 解決策
以下のコマンドのどちらかを実行すると自動で生成されて解決します。（composerがインストールされていなければいけない）

```bash
$ composer update
$ composer install
```

### No application encryption key has been specified.
これは画面上は500としか表示されないので、所見ではわかりませんが、Laravelのログを見るとエラーメッセージが出力されています。

#### 初期値では、Laravelのログはstorage/logsに出力される。
初期値の状態で動作させると、apache2のログには出力されないので、困ったのですが、調べてみると、storage/logsディレクトリが作られて、laravel-YYYY-MM-DD.logに出力されています。

#### 解決策
このログが出力されたときは、Encription Keyを生成します。以下のコマンドをappディレクトリで実行すると、.envの設定を書き換えてくれます。（コピーはしなくても良いかもしれませんが、本来はコピーして使うようなので…）

```bash
$ cp -p .env.sample .env
$ php artisan key:generate
```

すると、.envにキーが保存され、正常なwelcome画面が表示されます。

## 参考資料
https://qiita.com/pugiemonn/items/3d000ac0486987dd92df
https://qiita.com/ponsuke0531/items/197c76fcb9300d7c5f36

# Disclaimer
* この記事は個人的なものです｡私の雇用者とは全く関係はありません｡（一応つけておきます）
[Visual Studio]作業速度向上ショートカット 

## 対象読者
これからWindows、Visual Studioで開発をする方

## はじめに
私がよく使うショートカットを集めてみました。
こんなんもあるよという方は教えてください。

## Windows
|キー|動き|
|:---|:---|
|Ctrl + a|全選択|
|Alt+→|進む|
|Alt+→|戻る|
|Windows|検索(アプリとか)|
|Windows + L|画面ロック|
|タスクバーで右クリしてD|重ねて表示|
|Windows + e|エクスプローラー開く|
|Windows + (↑↓←→)|最大化、最小化、左寄せ、右寄せ|

## Chrome
|Shift (+ Ctrl) + Tab|タブの切り替え|
|Ctrl + r|更新|

## Visual Studio
|キー|動き|
|:---|:---|
|Ctrl + .|クイック操作|
|Ctrl + w|文字選択|
|Ctrl + c|行コピー|
|Ctrl + x|行切り取り(削除でよく使う)|
|Ctrl (+ Shift) + Enter|上に(下に)改行|
|Alt + ↑(↓)|1行を上(下)に移動|
|Ctrl + f|検索|
|Ctrl + Shift + f|ファイルまたぎの検索、置換|
|F12|定義に移動|
|Shift + F12|参照をリストアップ|
|Ctrl + Shift + b|ビルド|
|F5|デバッグ開始|
|F2|名前の変更|
|Ctrl + r, Ctrl + r|名前の変更(変数、メソッドなど)|
|Ctrl + r, Ctrl + m|メソッド化|
|Ctrl + r, Ctrl + i|インターフェイス化|


### 使いたい
|キー|動き|
|:---|:---|
|Ctrl + k,Ctrl + c|コメントアウト|
|Ctrl + k,Ctrl + u|コメントアウト解除|
|Ctrl + g|指定した行にカーソルを移動させる|
PAMでsu先を制限する方法

#su先を制限したい

LinuxでユーザーAからはユーザーBにsuできるが、ユーザーCからはユーザーBに行けないという状況を作りたいことはないでしょうか。
そういう時のやり方をメモしておきます。

#実際の設定方法

/etc/pam.d/suを変更します。

以下は、Redhatの公式リファレンスに記載されている方法です。

```text:su
auth           [success=2 default=ignore] pam_succeed_if.so use_uid user notingroup <su元グループ名>
auth           required pam_wheel.so use_uid group=<su元グループ名>
auth           required pam_listfile.so item=user sense=allow onerr=fail file=/etc/security/<su先ユーザーを列挙したファイル>
```

「su先ユーザーを列挙したファイル」にはプレーンテキストでただユーザーを書いていくだけです。
UTF-8 BOMなしにしましょう。BOMありで保存したらうまく動かず、悩みました。(CentOS 7.5 64bit)

```text:su先を列挙したファイル
root
operator01
operator02
```

###設定内容の解説

1行目
実行したユーザーが<ユーザー名>ではない場合、後続の2行を飛ばす。
実行したユーザーが<ユーザー名>の場合、無視する(次の行に進む)

2行目
所属グループが<グループ名>ではない場合は、処理を中止する。

3行目
su先ユーザーが指定したファイル内に書かれていない場合は、処理を中止する。

###複数ユーザーで指定する時

複数ユーザーでこの指定をしたい時は、1行目～3行目を繰り返しコピペして貼り付けていきましょう。

#参考URL

https://access.redhat.com/solutions/64860
http://www.linux-pam.org
PAM設定ファイルの意味と書き方メモ


#PAMとは何か
Pluggable Authentication Modulesの略。ユーザー認証を行う仕組みです。

PAMの設定は/etc/pam.confまたは/etc/pam.d/配下にテキストファイルで記載されます。
PAMの内容は上から順に1行づつ評価されていき、各行は必ず成功か失敗かの結果を返します。
それぞれの成功、失敗を元に全体の認証の成否を決定します。

例：/etc/pam.d/common-auth

```conf:common-auth
#module-type    control                      module-path      arguments
auth            [success=1 default=ignore]   pam_unix.so      nullok_secure
auth            requisite                    pam_deny.so
auth            required                     pam_permit.so
auth            optional                     pam_cap.so
```

#PAMの各行を構成する要素

上記の例を見ると分かる通り、各行はmodule-type, control, module-path, argumentsという4つの構成要素で構成されています。それぞれの意味を引用を交えて解説します。

引用部分は全てRedHatのドキュメンテーションからです。

##module-type

Module-typeというのは、各モジュールが提供するインターフェース(機能)のことです。
例えば、pam-unix.soというモジュールは4つ全てのインターフェースを持っていて、例えばauthモジュールの場合はパスワードの認証を行い、accountモジュールの場合はアカウントの有効期限を確認するなど、同じモジュールでもインターフェースによって動作が異なります。

###account

accountは、アカウントの有効性などを検証するモジュールタイプです。

>このモジュールインターフェースは、ユーザーを認証します。たとえば、パスワードの有効性を要求したり検証したりします。このインターフェースがあるモジュールは、グループメンバーシップといった認証情報も設定できます。

例

| モジュール        |       accountインターフェースでできること |
|:-----------------|----------------------------------------:|
| pam_unix.so      |  アカウントの有効期限や有効/無効を判断する |
| pam_localuser.so      |  /etc/passwdにユーザーが存在するかを確認する |
| pam_unix.so      |  入力されたパスワードを元に認証の許可/不許可を判断 |

###auth

>このモジュールインターフェースは、アクセスが許可されたことを確認します。たとえば、ユーザーアカウントの期限が切れたか、またはユーザーが 1 日の特定の時間にログインを許可されるかどうかをチェックします。

アカウント有効期間や有効性に関するモジュール

###password

>このモジュールインターフェースは、ユーザーのパスワード変更に使用されます。

パスワードの設定、確認に関するモジュール

###session

>このモジュールインターフェースは、ユーザーセッションを設定、管理します。このインターフェースのあるモジュールは、ユーザーのホームディレクトリーをマウントしたり、ユーザーのメールボックスを利用可能にするなど、アクセスの許可を必要とする追加タスクも実行できます。

ユーザーセッションを設定、管理に関するモジュール

##control

各モジュールは実行されると必ず成功か失敗の結果を返します。
成功/失敗した場合にどのような挙動をするのかがcontrolです。

引用部分は全てRedHatのドキュメンテーションからです。

###required

> 認証を継続するには、モジュール結果が成功する必要があります。この時点でテストが失敗すると、該当インターフェースを参照するすべてのモジュールテストの結果が完了するまでユーザーには通知されません。

文字通り「必須」。つまり必要条件。
このモジュールが失敗したら認証は失敗する。
ただし、このモジュールの成否はすぐにユーザーに通知されず、次に進む場合もある。

###requisite

>認証を継続するには、モジュール結果が成功する必要があります。ただし、この時点でテストが失敗するとユーザーに直ちに通知され、そのメッセージには最初に失敗した `required` または `requisite` モジュールテストが反映されます。

こちらも必要条件。このモジュールが失敗したら認証は失敗する。
ただし、`required`と違って失敗したらすぐにユーザーに通知される。

###sufficient

>モジュール結果は失敗した場合でも無視されます。ただし、`sufficient` のフラグの付いたモジュールが成功して、かつ required のフラグが付いたモジュールがそれまでに失敗していなければ、それ以上の結果は要求されず、ユーザーはサービスに認証されます。

これが成功すれば認証成功となる。
ただし、もしそれまでの`required`に失敗があった場合(つまり必要条件が満たされていない場合)は認証されないので、十分条件ではない。失敗したら無視して次に進む。

###optional

>モジュール結果は無視されます。`optional` のフラグのついたモジュールは、他のモジュールが該当インターフェースを参照しない場合にのみ、認証成功に必要となります。

###その他の条件指定方法

`[success=ok default=ignore]`などのようにさらに細かく指定する方法もあるが、ここでは割愛する。

##module-path

ここでは、実際のモジュール名を指定します。
pathと書かれていますが、ほとんどの場合ファイル名だけで十分です。

##arguments

モジュールに与える追加の情報を記載します。
無効な名前の引数は無視され、モジュールの実行結果に影響を与えることはありません。
【Node.js】LambdaでIAMからcredentialsを取得しAPIGateway実行

# 試したいこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480978/fe2a234f-d49b-6f01-bcef-ed35024a7a28.png)
上図のように、APIGatewayを実行するIAMポリシーがアタッチされているLambdaのIAMロールを使ってAPIGatewayの認証を行うことが今回行いたいことです。サービス間のAPI連携なんかでは、実装方針の一つになるかと思います。
APIGatewayを実行するIAMポリシーのアタッチ、Lambda関数やAPIGatewayの作成手順は割愛しています。
### 処理フロー
1. LambdaがIAMのSTSよりCredentialsを取得する
2. 取得したCredentialsを付与してAPIGatewayにRequest
3. APIGatewayでは受け取ったCredentialsの検証を行い、認証認可を行う

# Lambdaの実装
今回、LambdaはNode.js v10で実装しています。
まず、libフォルダを作成し、その配下にAPI実行処理コードを作成、モジュール化します。
以下のような実装です。

```execute.js
var AWS = require('aws-sdk');
//create a object which executes APIGateway.
const apigClientFactory = require('aws-api-gateway-client').default;
//get credentials of AWS sercvices
const apiExe = AWS.config.credentials.get(function (err) {
    if (!err) {
        //get required parameters from credentials and set required configurations
        const apigClient = apigClientFactory.newClient({
            accessKey: AWS.config.credentials.accessKeyId,
            secretKey: AWS.config.credentials.secretAccessKey,
            sessionToken: AWS.config.credentials.sessionToken,
            region: 'xx-xxxx-x',
            invokeUrl: 'https://XXXXXXXXXXXXXXXXXXXXXXX'
        });
        const params = {
        };
        //set HTTP configurations
        const pathTemplate = '/xxxx';
        const method = 'GET';
        const additionalParams = {
            queryParams: {
            }
        };
        const body = {};
        apigClient.invokeApi(params, pathTemplate, method, additionalParams, body)
            .then(function (result) {
                console.log(result.data);
            })
            .catch(function (result) {
                console.log(result);
            });
    } else {
        console.log(err);
    }
});
module.exports = apiExe;
```
aws-sdkを使って、credentialsを取得します。
ちなみに、APIGatewayの実行には<b>[aws-api-gateway-client](https://www.npmjs.com/package/aws-api-gateway-client)</b>というライブラリを使用しています。
このようにして作成したAPIGateway認証＆実行モジュールを下記のようなLambdaで実行します。

```index.js
var apiExe = require("./lib/execute.js")

exports.handler = function(event, context) {
    apiExe;
};
```

これで処理は完了です。
【AWS×Docker】RancherOS上でDrupalの雛形を立てる

#概要
最近Drupalを良く聞くようになったのでAWSの無料枠を駆使して雛形サイトを構築する

Amazon EC2(t2.micro)
 -RancherOS  HVM

AWSMarketplaceでRancherでググると出てきます。
※ベンダーの推奨スペックとしてはt2.small以上とのこと
　今回は無料枠で行くので逆らってmicroです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309466/36e605b0-9ff3-f756-9f7f-7a26fc5ba07d.png)

ちなみにRancherOSはRancherとは異なります！
RancherOS自体はコンテナ管理に特化した超軽量OSになります。
なんとOSイメージそのものは40MBほどのサイズです。

セキュリティグループ
RancherOSでインスタンスを作ると自動で下記のようなセキュリティグループができる
インバウンドの設定でTCP8080を追加しておくこと
-RancherOS - HVM～～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309466/4f72d6b6-03ce-87c6-5acc-f51e6073c0c5.png)

Docker
 -[使用コンテナ](https://hub.docker.com/_/drupal/)
　開発用途としては微妙らしいのでガッツリ開発したい、って人は別の方法のほうがいいです。

#下準備
EC2
  いかんせんt2.microなのでリソースが常に枯渇の危機、少しでもマシにするため小細工します。

```
sudo vi runcmd.yaml

runcmd:
- sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
- sudo chmod 600 /swapfile
- sudo mkswap /swapfile
- sudo swapon /swapfile
```

```
sudo ros config merge -i runcmd.yaml
```

何をやっているかというと2Gのswap領域を作ってOS側でswapを使うように設定しているのですが、
RancherOSで環境もろもろのことを変更するにはros configコマンドで設定変更しないといけません。

runcmd.yaml内にOS起動時にswapの有効化を行う指示を書き
ros config merge コマンドで環境設定に反映しています。
↑これを行ったら一度インスタンスを再起動してみてください。
再度立ち上がった後 swapon -s コマンドを入力してやればswapが有効になっていることがわかるはずです。

#本題
SSH接続でインスタンスに入る。※他のOSと違ってユーザーは[**rancher**]なので注意！
下記のコマンドを叩くだけ

```
docker run --name some-drupal -p 8080:80 -d drupal
```
http://{{パブリックIP}}:8080　で接続できる
うまくつながらない場合はセキュリティグループの設定を見直して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309466/a762c4f6-19ad-e790-0836-4fa9b1cb08e4.png)

こんな感じの画面が表示されていたらOKです。
後は画面の手順に従って初期インストールを行ってください。
SQLite以外のDBを使う場合はこれとは別にDBのが必要です。
SVT-AV1をVisual Studioでビルドしてエンコード

# SVT-AV1とは
IntelのオープンソースのCPUベースのAV1エンコーダ。ビルドしてAV1をエンコードしてみた。
# SVT-AV1をVisual Studio 2017でビルドする
[SVT-AV1のgithub](https://github.com/OpenVisualCloud/SVT-AV1)の手順に従った。
まず以下をインストールした。

- Visual Studio 2017
- CMake
  - CMake 3.5以降が必要とのこと。CMake 3.16.0をインストール。
- YASM
  - YASM Assembler version 1.2.0以降が必要とのこと。上記githubのリンクからyasm-1.3.0をダウンロードしインストール。ただ、下記に記載のようにyasm-1.2.0ではビルドエラーになる。またyasm-1.x.0-win64.exeをyasm.exeにリネームし、PATHを通した。

git cloneした後、SVT-AV1\Build\windowsにcdして、以下を実行。
`build.bat 2017`
※Visual Studioのバージョンに合わせる。
SVT-AV1\Build\windowsにsvt-av1.slnが作成させるので、Visual Studioで開く。
ALL_BUILDを右クリックして、Build。
しかし以下のエラーが発生した。
`Error	MSB3721	The command ... exited with code -1073741515. ...`
原因については深追いしていないが、https://yasm.tortall.net/Download.html からyasm-1.2.0をダウンロードし上記の方法で再度ビルドすることで、今度はビルド成功した。
SVT-AV1\Bin\Release\DebugまたはSVT-AV1\Bin\Release\Releaseディレクトリ以下に各種.dllと.exeが生成された。
  

# SVT-AV1でエンコードする
SVT-AV1のエンコーダはyuvのみ入力とするので、
.mp4ファイルの場合、ffmpegで以下のようにyuv形式に変換する。
`ffmpeg -i test.mp4  -nostdin -f rawvideo -pix_fmt yuv420p test.yuv`
実際にエンコードする。
`SvtAv1EncApp.exe -i test.yuv -n 300 -w 1920 -h 1080 -b test.ivf`
※.ivf: AV1の拡張子。-n, -w, -hにフレーム数、フレーム幅、高さの指定が必要。
無事エンコードに成功し、VLCで再生できた。
MySQLの外部接続の設定

# MySQLの外部接続の設定
PiZeroWにインストールしたMySQLのテーブルに同じネットワーク内にあるPCのMySQL Workbenchからアクセスするための設定メモ。
## 環境
Debian 9.8
mysql  Ver 15.1 Distrib 10.1.37-MariaDB
MySQL Workbench 8.0

## 設定
下記のサイトと同じように進めようとすると、自分の環境ではディレクトリ構造が違ったので、メモを残しておきます。
[MySQLの外部接続の設定](https://qiita.com/irabu1/items/4c08fcbac384e05a90ac)

50-server.cnfを編集する。

```
root@raspberrypi:~# nano /etc/mysql/mariadb.conf.d/50-server.cnf
```

bind-addressの行をコメントアウトする。

```
#bind-address           = 127.0.0.1
```

MySQLを再起動

```
root@raspberrypi:~# sudo service mysql restart
```

以上
Cloud Firestore のリアルタイムアップデートで初期状態の added イベント発火による課金を回避する

## はじめに

- Firebase の Cloud Firestore をある程度触ってる方向けの内容なので、基礎的な説明は省きます。
- サンプルコードは JavaScript ですので、他言語の SDK をお使いの方は適宜読み替えてください。

公式ドキュメントにも載っておらず、ググってもなかなか出てこない情報だったのでどなたかの役に立てば幸いです :pray:

## 何を解決したいか

ref. https://firebase.google.com/docs/firestore/query-data/listen

Cloud Firestore でリアルタイムアップデートを入手する際、以下のように何も考えず今までのドキュメントを全件取得すると、保存済みのデータ 1 件ごとに `added` イベントが発火します。

```js
// チャットアプリなどで messages コレクションのドキュメントスナップショットを取得する例
firebase
  .firestore()
  .collection("messages")
  .orderBy("createdAt", "desc")
  .onSnapshot(snapshot => {
    snapshot.docChanges().forEach(change => {
      if (change.type === "added") {
        // 保存済みのデータ n 件分出力される
        console.log("New message:", change.doc.data());
      }
    });
  });
```

ref. https://firebase.google.com/docs/firestore/query-data/listen#view_changes_between_snapshots

> 最初のクエリ スナップショットには、クエリに一致する既存のすべてのドキュメントの added イベントが含まれています。これは、クエリの初期状態に対してクエリ スナップショットが最新の状態になるように、一連の変更を取得しているためです。

これの何が問題かというと、 `added` イベント 1 回につき 1 回の読み取りとしてカウントされてしまうので、ものすごく無駄なコストがかかってしまいます。

ref. https://firebase.google.com/docs/firestore/pricing#listens

> クエリの結果をリッスンする場合、結果セット内のドキュメントを追加または更新するたびに、1 回の読み取りとして課金されます。


## 解決方法

上記のチャットアプリの例であれば、スナップショットとして以前の最新メッセージの保存時間より新しいメッセージだけ取得するようにすれば良いです。

※ Firestore の Timestamp 型と JavaScript の Date 型を比較するためには `fromDate()` メソッドを使って型変換してあげる必要があります。


```js
// チャットアプリなどで messages コレクションのドキュメントスナップショットを取得する例
firebase
  .firestore()
  .collection("messages")
  .orderBy("createdAt", "desc")
  .where(
    "createdAt",
    ">",
    // 変数 lastCreatedAt には Date 型の値を渡してあげてください
    // See. https://firebase.google.com/docs/reference/js/firebase.firestore.Timestamp.html#fromdate
    firebase.firestore.Timestamp.fromDate(lastCreatedAt)
  )
  .onSnapshot(snapshot => {
    snapshot.docChanges().forEach(change => {
      if (change.type === "added") {
        // 新しく追加されたデータのみ出力される
        console.log("New message:", change.doc.data());
      }
    });
  });
```

## 参考

- [How to skip initial data and trigger only new updates in Firestore Firebase? - Stack Overflow](https://stackoverflow.com/questions/53156109/how-to-skip-initial-data-and-trigger-only-new-updates-in-firestore-firebase)
- [Convert date to timestamp for storing into firebase firestore in javascript - Stack Overflow](https://stackoverflow.com/questions/53482750/convert-date-to-timestamp-for-storing-into-firebase-firestore-in-javascript)
いろんな言語でCPUのコアを使い切ってみる

## 経緯
仲間内で「コアを使い切るプログラムをいっぱい書いてみよう」という話題が出たためノリで書いてみました。せっかくなので ~~時間がないため~~ 仕事でよく使っている `Ruby` `Elixir` `Go` の3言語で試してみました。

**マサカリ防止対応**
- 実用性、最適化などは一切考えておらず ただコアを使い切ることにフォーカス。
- そのため処理速度やsyntaxは無視
- 標準ライブラリしか使わない 
- 30分で書けるレベルのものという制約で殴り書きをする

### 実行環境
<img width="495" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19993/c6e71670-c222-e192-18f5-40adf1b8bc93.png">
**OSが古いというツッコミはダメです**

- ruby
  + 2.6.4
- Elixir
  + 1.9.4
- golang
  + 1.12.7

### テストシナリオ
1. 1〜100000(1+2+3+4...)の合計求める計算を1000回実行する
2. `1` の処理を並列で実行する
3. [htop](https://hisham.hm/htop/index.php) でCPU使用状況を見る

### 1.Ruby
比較的マルチコア環境で性能を引き出しにくいと言われがちなRuby ですがプロセスフォークをすれば簡単に使いきれます。

しかしながら **この実装ではprocess をfork しすぎてOS の挙動が怪しくなる** ため実際にマルチコア環境で処理を動かすためには頑張ってプログラムを書く必要があるでしょう。
~~（いいexample があればおしえてください）~~


gist:
https://gist.github.com/ohta-rh/8fffb2ae778e4135d4f195fb7baf42d7
result:
<img width="713" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19993/686676b6-7333-efa0-3573-df42cf2d4218.png">
*OSが固まるので* htopのキャプチャーをとる作業が一番苦労しました

*悲鳴をあげるOS*
<img width="424" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19993/c765f5e6-d1bd-3e49-72d7-92e61555b4cc.png">

### 2.Elixir
マルチコア環境下に強いと呼ばれているElixir / Erlangですが、はたしてどうなのでしょうか。
*GenServer を使うのが普通かなと思いますがコアを使い切ることしか考えてません。はい、手抜きです*

gist:
https://gist.github.com/ohta-rh/254b84ddf666947e92405abeeefc2dc1
result:
<img width="666" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19993/034e8d07-8956-7e64-98f5-9da842ddade5.png">

さすがに簡単に使い切りますね。実装は一番簡単でした。

### 3.Golang
こちらもマルチコア環境下につよいというGolangです。間抜けな顔が素敵です。さてさてどうなのでしょうか。

gist:
https://gist.github.com/ohta-rh/0982ee468b3ba00a9a0be98b24c4b4a7
<img width="242" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19993/9b22e228-12c5-be0f-f78f-8ed9fccfbf16.png">

今までのシナリオの実装では**goが早すぎて** CPUを使いきれません。
<img width="659" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19993/0153aaaf-b7ea-b0ce-e53e-5f6a58de459c.png">

ということで急遽処理オーダー数を増やして使い切ることができました。go早い！
<img width="660" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19993/7e585ed1-fd5f-e942-3345-a06f93db48b1.png">

### 総論
最適化など全く考えずに書いていましたが「言語仕様レベルでマルチコアを意識しているか、そうでないか」で書きやすさはもちろん、動作の安定性にも随分と差がでました。
本格的に並列処理を書こうとしたら サンプルの~~クソ~~コードでは対応できないためもっと複雑な処理が必要になってくるでしょう。

次はもう少し実用的な処理を書いてみようと思いました。

### おまけ
90%くらいの仕事において（独断と偏見）パフォーマンスは、特に意識しなくてもフレームワークや、ミドルウェアがだいたいよろしくやってくれます。そして問題になるのはI/Oが絡む部分であり コアを使い切って最適化しよう！みたいな状況は少ないかなとおもいます。
~~いざとなれば札束で殴ればいいしね！~~

結局のところ**「好きな言語でとりあえず書いて、必要になったら得意とする言語で書き直せばいい」**と思ってます。だって、嫌いな言語を書いててもつまらないでしょうw

Let's enjoy programing!!!!!
intellijでコンソールが文字化けする

#対応
以下のいずれかが問題

##コンソールの文字エンコード
https://pleiades.io/help/idea/configuring-individual-file-encoding.html

##ファイルの文字エンコード
https://pleiades.io/help/idea/configuring-individual-file-encoding.html

##gradleのコンパイル時のエンコード
```build.gradle
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}
```
【Python中級者への道】リスト内包表記でif文を使う


# まとめへのリンク

https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8

# はじめに

Pythonの勉強をするために、[acopy](https://github.com/rhgrant10/acopy)という群知能ライブラリを写経していました。

acopyでは、多くのPythonの面白い文法・イディオムが使われており、その中でも便利だなぁというのをまとめています。


今回は、Pythonのリスト内包表記のif文を学びます。

# 書き方

リスト内包表記でif文を使うことで、リストに使用する値の選別ができます。

例えば、$[0, N)$に含まれる偶数を洗い出すリストを書くと

```py
N = int(input())

odds = [x for x in range(N) if x % 2]
print(odds)
```

上記のように書くことができます。
これは、`if x % 2`の条件を満たすときのみxを判定します。

つまり

```py
N = int(input())

arr = []
for x in range(N):
    if x % 2 == 0:
        arr.append(x)
```

上記のようなのが等価的なコードになります。

# 三項演算子と組み合わせる

三項演算子と組み合わせることができます。

リスト内包表記で**右側**につける条件は、値を判定するか？しないか？の**選別**です。

一方、三項演算子は、選別された値から条件を判定して、Trueの場合とFalseの場合の返す値を変えます。


先程のように偶数を返しますが、１の位が0のときは$0$が$x$個入ったリストを返すようにしましょう。

```py

N = int(input())

'''
[[], 2, 4, 6, 8, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 12, 14, 16, 18, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 22, 24, 26, 28, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
'''
evens = [x if x % 10 else [0] * x for x in range(N) if x % 2 == 0]
print(evens)
```

for以降の後ろ側のifは、偶数かどうかの判定をし、選別を行います。
選別をくぐり抜けた後は三項演算子を利用して、１の位が０でないなら、そのまま、そうでないなら$0$を$x$個入れた配列を返しています。

正直、上の例だと使いどころさんが　ないです。
bashでパッケージがインストールされているか調べる方法

# 注意
ArchLinuxとDebian（pacmanとapt）しか書いていません。（筆者がこれしかわからない）
pacman -Qの部分を変更すればyumなどでも使用できると思います。
ディストリビューションに関係なくbashです。
今回はnanoがインストールされているか調べることにします。
（変数pkgの値を変更すれば他のパッケージも調べられるようにしてあります。）

# ArchLinux

```bash
pkg=nano
if [[ -z $(pacman -Q | awk '{print $1}' | grep -x $pkg) ]]; then
    echo "$pkg is installed."
else
    echo "$pkg is not installed."
fi
```

# Ubuntu

```bash
pkg=nano
if [[ -z $(dpkg --get-selections | awk '{print $1}' | grep -x $pkg ) ]]; then
    echo "$pkg is installed."
else
    echo "$pkg is not installed."
fi
```
ディストリビューションをスクリプトで分ける（os-releaseの値について）

# とりあえずコード

```bash
if [[ -f /etc/os-release ]]; then
    source /usr/lib/os-release
    case $ID in
        debian ) echo "Debian";;
        ubuntu ) echo "Ubuntu";;
          arch ) echo "ArchLinux";;
          rhel ) echo "Red Hat Enterprise Linux";;
        centos ) echp "CentOS";;
        fedora ) echo "Fedora";;
      opensuse ) echo "OpenSUSE";;
             * ) echo "Other";;
    esac
else
    echo "/etc/os-release is not exist."
fi
```

# 解説   
ほとんどのLinuxディストリビューションには`/etc/os-release`というディストリビューションごとの内容を表示したファイルがあります。
これをsourceで読み込み、IDという変数に「〜〜系」のディストリビューションというのが載っています。
この部分のIDをcaseで分けています。
IDという変数を変えることで様々な分類分けができます。

# よくある値
今回はDebianを例に見ていきます。

```/etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```

## PRETTY_NAME
ディストリビューションの固有名です。
バージョンやコードネームなど一般向けの正式名です。
スクリプトではあまり使用しないですね。（パターンが多すぎるため）

## NAME
ディストリビューションの総称です。バージョン名は含まれていない場合が多いです。
スクリプトで使うのはIDやID_LIKE、VERSION_IDくらいですかね。

## VERSION_ID
バージョン情報です。コードネームなどは無く、数字だけの場合が多いです。

## VERSION
コードネームなども含めたバージョン情報です。

## ID
ディストリビューションのIDです。NAMEと似たようなものですが、スクリプト向けに簡略化されています。

## ID_LIKE
Debianにはありませんが他の殆どのディストリビューションにあります。
互換性のあるディストリビューションや大本のディストリビューションのIDが書かれています。

例：ManjaroではID_LINE=arch、UbuntuではID_LIKE=Debianなど

## HOME_URL
ディストリビューションの公式サイトです。

## SUPPORT_URL
サポートページのURLです。フォーラムなどへのリンクの場合もあります。

## BUG_REPORT_URL
バグレポートページへのURLです。フォーラムなどへのリンクの場合もあります。

# 参考記事

[Linuxのバージョンの確認方法](https://qiita.com/bezeklik/items/5edb638becd8858abb80#etcos-release-4)
各ディストリビューションのos-releaseの値が書いてあったので助かりました。
OpenVPNサーバの負荷分散＋冗長構成と、やってはいけない設定

[OpenVPN](https://www.openvpn.jp/) は別のミドルウェアやロードバランサを追加しなくても、標準機能だけでサーバの負荷分散＋冗長化を実現できるように作られています。

ところが不適切な設定のために正常にフェールオーバーしないという失敗をしてしまいました。この件に関する情報が見つからなかったので、恥ずかしながら今回の記事にしました。

# 基本設定
以下すべて、クライアント側の設定ファイルの内容です。
参考: https://www.openvpn.jp/document/how-to/#LoadBalancing

## 冗長構成
`remote`で複数の OpenVPN サーバを設定するだけで冗長化が実現します。接続の試行はリスト順なので、以下の例ではまず server1 に、失敗したら server2 に接続を試みます。つまり全クライアントの設定ファイルが共通なら、server1 が正常に稼働していれば接続は server1 に集中します。
`remote`でさらに多くのサーバを設定することもでき、上限数は明記されていません。

```Shell:/etc/openvpn/client.conf
remote server1 1194  # 最初に接続を試みるサーバ
remote server2 1194
```

## 負荷分散＋冗長構成
さらにラウンドロビンによる負荷分散を実現するには、`remote-random`を追加します。これで接続を試みるサーバの順序がリスト順ではなくランダムに選択されるので、各サーバへの接続数の平準化が期待されます。

```Shell:/etc/openvpn/client.conf
remote server1 1194
remote server2 1194
remote-random        # remoteで指定されたサーバにランダムに接続する
```

以上が負荷分散＋冗長構成のための基本的な設定です。

# 不適切な設定と修正
## 修正前の設定
以下はクライアント側の設定ファイルの一部です。デフォルトのクライアント設定に、セキュリティを考慮して`user nobody`と`group nobody`を追加（アンコメント）しました。
参考: https://www.openvpn.jp/document/how-to/#Security

```Shell:/etc/openvpn/client.conf
client
dev tun
proto udp

remote server1 1194
remote server2 1194
remote-random

resolv-retry infinite
nobind
user  nobody
group nobody
persist-key
persist-tun
```

### 問題点
接続中のサーバを停止してもフェールオーバーせず、切断状態のままになりました。

## 修正後の設定
`user nobody`と`group nobody`を削除（コメントアウト）しました。

```Shell:/etc/openvpn/client.conf
# user  nobody
# group nobody
```

### 結果
接続中のサーバを停止すると自動的にフェールオーバーし、15秒後に他方のサーバに接続しました。

## 原因
`user nobody`と`group nobody`は初期化完了後に実行ユーザーを降格する設定なので、接続中は問題が発生しません。しかし切断が発生して別のサーバに接続しようとしても、新しい tun デバイスをオープンする権限がないためにフェールオーバーができなくなっていました。

# 反省
## 悪かった点
デフォルトでコメントアウトされていた設定をアンコメントして有効化する際に、影響への考慮が足りていませんでした。
## 良かった点
フェールオーバーのテストをしたのでリリース前に問題に気付くことができました。
また問題の発生がなければスルーしていた内部処理について調査したので、少しですが理解が深まりました。
【Python中級者への道】三項演算子を利用する


# まとめへのリンク

https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8

# はじめに

Pythonの勉強をするために、[acopy](https://github.com/rhgrant10/acopy)という群知能ライブラリを写経していました。

acopyでは、多くのPythonの面白い文法・イディオムが使われており、その中でも便利だなぁというのをまとめています。


今回は、Pythonの三項演算子を学びます。

# 三項演算子

三項演算子は、C++などでは
`条件式: trueの値: falseの値`などで、if-elseで表現できる文を一行で終わらす演算子です。

当然記述量は断然短くなりますが、その分三項演算子をネストすると可視化性は著しく下がります。

もし、ネストするならばアルゴリズムの見直しや、if文で普通に書くことを意識しましょう。

# Pythonの三項演算子

Pythonの三項演算子は
`Trueの値 if 条件式 else Falseの値`と
C++やC言語と順番が違います。

C++やCを使っている自分にとっては、かなり違和感がする記法です。
C++なら

1. とりあえず条件式書いたろ！
2. Trueの値書いちゃえ
3. Falseの値書いちゃえ

と自然な流れが出来るので嬉しいのですがPythonの場合

1. 条件式なんやろ･･･たしかTrueのときはこの値やな
2. 条件式こうやな
3. Falseはこう

のように順序が逆で非常にやりずらいなぁって感じます。
Vimmerなどならこれがすらってかけるんだろうなぁって思いますね。

# 偶数奇数

とりあえず偶数奇数判定を書いてみます。
　

```python

a = int(input())

s = "odd" if a % 2 else "even"
print(s)

```

ここらへんの書き方が、英語っぽいなぁってなんか感じます。
先に真　条件式　偽　の順を早く覚えたいですね。


# 偶数奇数(負を除く)

負があると、面倒なので、負の場合はminusと出力するようにしましょう。

```py
a = int(input())

s = "minus" if a < 0 else "even" if a % 2 == 0 else "odd"
print(s)
```


まず、マイナスかどうかをチェックしてマイナスなら`minus`で終了です。
そうでないなら、入れ子になっている三項演算子で再びeven, oddをチェックします。

# 最後に

三項演算子を使うのはやめよう！（適度に）
【初心者】 SQL・データ取得の基本

未来電子テクノロジーでインターンをしているtokky08です。
SQLについて学習したのでアウトプットとして書こうと思います。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#SQLって何？
SQLはデータベース言語であり、データベースを管理するソフトウェアを操作・制御することができます。プログラミング言語とは違います！プログラミング言語は、ソースコードに記述された通りに順次実行されますが、SQLはデータベースに命令文を一方的に送り、返ってきた処理の結果に応じてまた送ると言った対話式になっています。

#データベースって何？
データベースとは、テキストや数値などのデータを保存するためのツールです。エクセルのようなもので、表のことを「テーブル」と言います。また、縦の列のことを「カラム」、横の列のことを「レコード」と言います。

#クエリって何？
データベースからデータを取得するためにはデータベースに命令を送ってデータを操作・取得したりします。この命令のことをクエリと言います。具体的にはデータを取得する命令「SELECT」、どのテーブルかを指定する命令「FROM」と言ったものとなります。

#SQLでデータを取得する書き方

##SELECT / FROM / WHERE
テーブルからデータを取得します。

```sql
SELECT カラム名
FROM テーブル名
WHERE カラム名=値;
```

###演算子

####比較演算子
|比較演算子|     意味        |  
|:--------:|:-------------:|
|    <    |   小さい　       |   
|    >    |   大きい         |      
|    =<   |   以下　        |      
|    =>   |   以上　        |        

####LIKE演算子
`LIKE "%〇〇"` で"~〇〇"に一致するものを検索できる。
`LIKE "〇〇%"` で"〇〇~"に一致するものを検索できる。
`LIKE "%〇〇%"` で"~〇〇~"に一致するものを検索できる。

####NOT演算子
条件文に合わないデータを取得できる。

```sql

WHERE NOT 条件文;
```

####IS NULL / IS NOT NULL演算子
指定したカラムがNULLのデータを取得できます。

```sql
WHERE カラム名 IS NULL;
```

指定したカラムがNULLでないデータを取得できます。

```sql
WHERE カラム名 IS NOT NULL;
```

####AND/OR演算子
条件1と条件2を共に満たすデータを検索することができる。

```sql
WHERE 条件１ AND 条件２;
```

条件1または条件2を満たすデータを検索することができる。

```sql
WHERE 条件１ OR 条件２
```


##ORDER BY
取得したデータを昇順で並び替えます。

```sql
ORDER BY 並び替えたいカラム名 ASC;
```

取得したデータを降順で並び替えます。

```sql
ORDER BY 並び替えたいカラム名 DESC;
```

##LIMIT
取得するデータの数を制限します。

```sql
LIMIT 数値;
```
[ゼロから作るDeep Learning]勾配確認について分かりやすく解説してみた

#はじめに
この記事は**ゼロから作るディープラーニング 6章誤差逆伝播法**を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。


#勾配確認とは
前回の記事で実装した誤差逆伝播法による勾配式はとても複雑な作りの為ミスが出る可能性が高いです。しかし処理速度がものすごく早い為に使用せざるえません。そこで大切なことは、誤差逆伝播法による勾配式にミスがあるかどうかを確かめることです。それを勾配確認と言い、その勾配確認に作りが単純でミスの少ない数値微分の勾配式を使います。

数値微分の勾配式は処理速度は遅いものの、単純な作りの為にミスが少ないです。
そこで、勾配確認で行うことは数値微分の勾配式から求められた勾配と誤差逆伝播法による勾配式によって求められた勾配の誤差を確認します。

では、実装をしてみたいと思います。

```python
# 下の数値微分の勾配式をニューラルネットワークのクラスメソッドに加える
def slopeing_grad_net(self,x,t):#誤差逆伝播法が正しいかを確認するための数値微分の勾配式
    loss_c = lambda W: self.loss(x, t) 
        
    grads_t = {}
    grads_t['W1'] = slopeing_grad(loss_c,self.params['W1'])
    grads_t['b1'] = slopeing_grad(loss_c,self.params['b1'])
    grads_t['W2'] = slopeing_grad(loss_c,self.params['W2'])
    grads_t['b2'] = slopeing_grad(loss_c,self.params['b2'])
        
    return grads_t

# 勾配確認
# ミニバッチを出す
x_train, x_test, t_train, t_test = dataset['train_img'], dataset['test_img'], \
                                            dataset['train_label'], dataset['test_label']

x_batch = x_train[:3]
t_batch = t_train[:3]

netwark = LayerNet(input_size = 784, hiden_size = 50, output_size = 10)
# 各勾配を出す
grad_slope = netwark.slopeing_grad_net(x_batch, t_batch)
grad_new = netwark.gradient(x_batch, t_batch)

for key in grad_slope.keys(): # それらの違いを比べる
    diff = np.average(np.abs(grad_new[key] - grad_slope[key]))
    print(key + ':' + str(diff))


W1:0.03976913034251971
b1:0.0008997051177847986
W2:0.3926011094391389
b2:0.04117287920452093
```

上のようなコードで勾配の誤差の平均を確認して、誤差が範囲内かどうかを確認します。
TextViewに取り消し線をつける

Todoリストを作っていて特定の条件下で取り消し線と色を変えるために調べていたので備忘録

```kotlin
object AlreadyReadEffect {

    fun invoke(textView: TextView, checked: Boolean) {
        if (checked) {
            textView.apply {
                setTextColor(Color.LTGRAY)
                paint.flags = this.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
                paint.isAntiAlias = true
            }
        } else {
            textView.apply {
                setTextColor(Color.BLACK)
                paint.flags = Paint.ANTI_ALIAS_FLAG
                paint.isAntiAlias = false
            }
        }
    }
}
```
SwiftUIでWebViewを使う

令和元年のご時世でもWebViewでラッピングしたアプリを作りたいという要望は多くSwiftUIでWebViewを使う方法について調べたのでメモ
ソースコードは<a href="https://github.com/wiii-na/SimpleWebView">Github</a>にも上げてあります

#開発環境
* MacOS: 10.14.6
* Xcode: 11.1

#実装
###WKWebViewのセットアップ

`WKWebView`がないので、`UIViewRepresentable `を利用して`WKWebView`を表示する`View`を用意する

```WebView.swift
import SwiftUI
import WebKit

struct WebView: UIViewRepresentable {
    var loadUrl:String
      
    func makeUIView(context: Context) -> WKWebView {
        return WKWebView()
    }
      
    func updateUIView(_ uiView: WKWebView, context: Context) {
        uiView.load(URLRequest(url: URL(string: loadUrl)!))
    }
}
```

このWebViewを使えばWebサイトの表示ができる。

```ContentView.swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        WebView(loadUrl: "https://www.apple.com")
    }
}
```

###画面遷移を検知する

単純にさっきの`WebView`にDelegate追加して`struct WebView: UIViewRepresentable, WKWebViewDelegate`みたいにできればいいけど、`Class`ではなく、`struct`なのでエラーが出てしまいdelegateをそのまま実装できない。

今回はObserverを使ってURLの変化を検知して対応した。さっきの`WebView`に`ObservableObject`を追加する感じ。

```WebView.swift

class observable: ObservableObject {
    @Published var observation:NSKeyValueObservation?
}

struct WebView: UIViewRepresentable {
    var loadUrl:String
    @ObservedObject var observe = observable()
      
    func makeUIView(context: Context) -> WKWebView {
        return WKWebView()
    }
      
    func updateUIView(_ uiView: WKWebView, context: Context) {
        observe.observation = uiView.observe(\WKWebView.url, options: .new) { view, change in
            if let url = uiView.url {
                print("Page loaded: \(url)")
            }
        }
        uiView.load(URLRequest(url: URL(string: loadUrl)!))
    }
}
```

ここでは`WKWebView`の`url`を比べているけど、`title`や他のプロパティでも可能なので、ロード中かどうか知りたければ`isLoading`を`observe`するようにすれば大丈夫。
【Rails】Action Text 試してみた

#参考元
[ゼロから10分でブログが作れる！Rails6の新機能Action Textを試してみた](https://tech.libinc.co.jp/entry/rails6_action_text)
[Ruby on Rails 6の主要な新機能・機能追加・変更点](https://qiita.com/ryohashimoto/items/622c3bcfb3336cb9317e)




# 作ってみる

```terminal:
$ rails  new blogApp --webpack
```

## article モデル作成

```
$ rails g scaffold article title:string
```

## Action Text導入
```
gem 'actiontext', github: 'kobaltz/actiontext', branch: 'archive', require: 'action_text'
gem 'image_processing'
```
```
$ bundle
```

```
$ rails action_text:install
$ rails db:migrate
```

```erb:app/views/layouts/application.html.erb
- <%= javascript_link_tag 'application', 'data-turbolinks-track': 'reload' %>
+ <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```

## モデル編集
`has_rich_text`は独自メソッド

```ruby:app/models/article.rb
class Article < ApplicationRecord
  has_rich_text :content
end
```

## コントローラーを編集
```ruby:app/controllers/articles_controller.rb
class ArticlesController < ApplicationController 
  before_action :set_article, only: [:show, :edit, :update, :destroy] |
  
  #省略

  private
    #省略
 
    def article_params
      params.require(:article).permit(:title, :content) #:contentを追加
    end
end
```

## view編集
```erb
:app/views/articles/_form/html.erb
<%= form_with(model: article, local: true) do |form| %> |
  <% if article.errors.any? %> 
    <div id="error_explanation"> 
      <h2><%= pluralize(article.errors.count, "error") %> prohibited this article from being saved:</h2>
        <ul> 
          <% article.errors.full_messages.each do |message| %>
            <li><%= message %></li>
          <% end %>
        </ul>
    </div>
 <% end %>

  <div class="field"> 
     <%= form.label :title %> 
     <%= form.text_field :title %> 
  </div> 
  <!-- 追記 --> 
  <div class="field"> 
    <%= form.label :content %> 
    <%= form.rich_text_area :content %> 
  </div> 

  <div class="actions"> 
    <%= form.submit %> 
  </div> 
<% end %>
```

<img width="1424" alt="Screen Shot 0001-11-10 at 19.51.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212678/35772d38-5841-9fab-7f26-c2c16478894c.png">

できた

# 注意点(私がはまりました)
slimで実装してるとリッチテキストエディターが実装できてもshow.html.slimだと
表示が変になります

<img width="924" alt="Screen Shot 0001-11-10 at 19.54.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212678/7c83474e-cf9c-dcff-0d75-be328f9871a1.png">

こんな風になってしまいました。

まだslimがaction textのやり方に対応してないからここだけ仕方なくhtml.erbで書きました
。