OmniAICreator/Qiita-1.07M huggingface dataset:
pandas.queryからの値の更新はできない(chained indexing)

numpy & pandasの講座の演習課題でハマったのでメモ。

環境は、anaconda3でまとめてインストールした、python3.6.5、pandas0.23.0

## DataFrameの値を変更したいときはqueryではなくlocを使う。

例えばこんなDataFrameがあったとする

```python3
In [2]: df = pd.DataFrame({"score":[10, 20, 30],
   ...:                   "address":["Kashiwa", "Matsudo", "Noda"],
   ...:                   "weight":[70, 80, 90]},
   ...:                  columns = ["score", "weight", "address"])
   ...: df.index = ["Taro", "Jiro", "Hanako"]
   ...: df
   ...:                  
Out[2]: 
        score  weight  address
Taro       10      70  Kashiwa
Jiro       20      80  Matsudo
Hanako     30      90     Noda
```

で、これをlocで絞り込んでから更新するとこう。

```python3
In [3]: df.loc["Taro", "weight"]  = 123
   ...: df.loc["Taro", "weight"]
Out[3]: 123.0
```

これが正解。同じことをDataFrame.queryでできないのかな？と思ってやってみるとこんな感じになる

```python3
In [4]: df.loc["Taro", "weight"]  = 70
   ...: 
   ...: df.query("index == 'Taro'").weight = 123
   ...: df.loc["Taro", "weight"]
   ...: 
   ...: 
/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py:4401: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self[name] = value
Out[4]: 70.0
```

なんかWarningが出て更新されない。

## 理由

出力されたWarningの中に示されているドキュメント<http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy>をみてみると、どうも`loc`で絞り込んだ場合と `[]` によるスライスを連続して書いた場合ではインタプリタの評価が違うらしい。`chained indexing` (インデックスの連鎖？)の問題というらしい。

以下、ドキュメントからの引用。

`loc`だとこんな感じにインタプリタが解釈するが

```python3
dfmi.loc[:,('one','second')] = value
# becomes
dfmi.loc.__setitem__((slice(None), ('one', 'second')), value)
```

`[]`を連続させるとこう。

```python3
dfmi['one']['second'] = value
# becomes
dfmi.__getitem__('one').__setitem__('second', value)
```

で、こんな感じの説明が書いてある(だいぶ意訳)


> `__getitem__`があるのが分かるだろうか？シンプルな場合を除いては、後者の表現が参照(view)を返すかコピーを返すかを予測するのは難しい。(その時のメモリ配置による。で、その配置についてはpandasは保証できない) よって`__setitem__`がdfmiを更新するか、一時オブジェクト(その後すぐ捨てられる)を更新するのかは誰にもわからない。そ　ん　な　わ　け　で　SettingWithCopy警告が出るのだ!

今回私がやってしまったような`query`で絞り込み -> 列名でスライスした場合も同じことが起きると思われる。

ハンズオンの講座でやっていたときはなぜかWarningも出なかったので困った。後でDataFrame.queryのドキュメントを見て、そこから上記のindexingのページ<http://pandas.pydata.org/pandas-docs/stable/indexing.html>に行って解決。
Docker イメージの置き場所の変更

# 環境
```
Ubuntu 14.04 LTS
Docker version 18.06.1-ce, build e68fc7a
```

#方法

Docker のイメージ、コンテナー、データボリューム等、Docker が自動的に作るもろもろのファイルの置き場所は、デフォルトでは、`/var/lib/docker` になっているらしい。これを他の場所に移す場合、docker のデーモンを停止した上で、`/etc/docker/daemon.json` というファイルに、

```
{
 "data-root": "/to/some/path"
}
```
と書いてデーモンを再開すればよい（daemon.json は、私の環境ではなかったので作った)。
Ubuntu 14.04 では、docker デーモンの停止(再開)は `sudo service docker stop(start)`。

ウェブ上ではいろんな情報が錯綜しているのだが、[公式ページにも案内があるし](https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file)、おそらくこの方法が今のところ一番安全ではないかと考えている。
【まとめ中】javaの環境準備とか



javaの環境をmacで手に入れるとか

```shell
brew search java

brew cask install java
brew cask install java8
*java10がリリースされてjava9はサポート終了になったため、java9のことは忘れてjava10以上を使ったほうが良い。
brew cask install java10
*ちなみに、java7はないらしい
```

$ jenv versions
* system (set by /Users/t-carlo/.jenv/version) #環境が一つもない場合

$ ls -lsa /Library/Java/JavaVirtualMachines/
jdk-10.0.2.jdk
jdk1.8.0_131.jdk
jdk1.8.0_181.jdk
 openjdk-11.jdk
zulu-7.jdk -> /Library/Java/JavaVirtualMachines/zulu1.7.0_181.jdk
zulu-8.jdk -> /Library/Java/JavaVirtualMachines/zulu1.8.0_181.jdk
zulu1.7.0_181.jdk
zulu1.8.0_181.jdk

*上記の理由により、以下のみを今後使ってゆこうと考えた
java7
java8
java10

*1.7, 1.8 は、zuluを使うことに決めた。
$ jenv add /Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
$ jenv add /Library/Java/JavaVirtualMachines/zulu1.8.0_181.jdk/Contents/Home
$ jenv add /Library/Java/JavaVirtualMachines/zulu1.7.0_181.jdk/Contents/Home

*追加後
$ jenv versions
* system (set by /Users/t-carlo/.jenv/version)
  1.7
  1.7.0.181
  1.8
  1.8.0.181
  10.0
  10.0.2
  openjdk64-1.7.0.181
  openjdk64-1.8.0.181
  oracle64-10.0.2

### 操作、切り替えとか

$ jenv global 1.8



REF
https://qiita.com/yu-iskw/items/79d9bddb77efaf2ca255
https://qiita.com/takuya71/items/8d670d8f216af87cfe01
https://qiita.com/uhooi/items/9a6747084bcfd4df07a6
https://stackoverflow.com/questions/24342886/how-to-install-java-8-on-mac
https://code.i-harness.com/ja/q/190952f
http://www.utsushiiro.jp/blog/archives/452
https://qiita.com/jyotti/items/22f07d807fb95fd24330
Rubyのクラスの継承について

# クラスの継承について
子クラス　 <　親クラスと記述することで、　親クラスに定義されてあるメソッドを子クラスでも使うことができる。師匠から弟子に秘伝技が引き継がれるというようなイメージですね。　
railsで開発していると以下のような記述があるけど、　これはApplicationControllerを継承しているという意味ということですね。　やはりよりRailsを理解するために、Rubyの基礎を固めていくことは大事だということを感じる。

class UsersController < ApplicationController

```ruby:clas.rb
class Hello
  def say_hello
    puts "hello"
  end
end

class Hey < Hello
  def say_hey
    puts "hey"
  end
end

hey1 = Hey.new

hey1.say_hey
hey1.say_hello

#hey
#hello
```
定常過程と非定常過程で相関出したらどうなるのっと…

非定常過程（≒前の値に値を足して現在の値を作る時系列データ）が2つあったとき、2つのデータからそのまま相関係数や線形回帰を出すと見せかけの回帰になるから気をつけろとよく言われる。

https://ja.wikipedia.org/wiki/%E8%A6%8B%E3%81%9B%E3%81%8B%E3%81%91%E3%81%AE%E5%9B%9E%E5%B8%B0

じゃあ、片方が非定常過程で、もう片方が定常過程の時系列データだった時はどうなるの？と思って実験してみた。

Rの実験コードは以下。

```R
#定常過程と定常過程
p1 <- c()
for (i in 1:10000) {
  p1 <- c(p1, cor.test(rnorm(100),rnorm(100))$p.value)
}
hist(p1)

#定常過程と非定常過程
p2 <- c()
for (i in 1:10000) {
  p2 <- c(p2, cor.test(cumsum(rnorm(100)),rnorm(100))$p.value)
}
hist(p2)

#非定常過程と非定常過程
p3 <- c()
for (i in 1:10000) {
  p3 <- c(p3, cor.test(cumsum(rnorm(100)),cumsum(rnorm(100)))$p.value)
}
hist(p3)
```


結果。
定常過程と定常過程のP値の分布は一様分布
![定常過程と定常過程のP値](https://qiita-image-store.s3.amazonaws.com/0/53775/8376623e-4277-7bfc-ffd7-1e2d9cfd183b.png)
定常過程と非定常過程のP値の分布は一様分布
![定常過程と非定常過程のP値](https://qiita-image-store.s3.amazonaws.com/0/53775/b6aac4dc-6a81-856b-2b69-19c57c0b6fc4.png)
非定常過程と非定常過程のP値の分布は一様分布ではない
![非定常過程と非定常過程のP値](https://qiita-image-store.s3.amazonaws.com/0/53775/48a1d216-7cbb-daab-fe08-c07db8d861a6.png)
定常過程と非定常過程の相関のP値は一様分布になっているので、問題なさそう（見せかけの回帰にはなっていない）。つまり定常過程と非定常過程で相関を出してもOKっぽい？
誤りがありましたらコメントにてお願いいたしますm(__)m
ゼロから作るDeep Learning 〜Affineレイヤ〜

# 行列の積と転置

準備のために行列の積と転置について説明します。
行列Aのサイズが(N,M)、行列Bのサイズが(M,L)とすると、行列C=ABの要素は以下のようになります。行列Aの列の数(横のサイズ)と行列Bの行の数(縦のサイズ)は一致させる必要があります。

```math
c_{ij}=\sum_{k=1}^M a_{ik}b_{kj}
```

Aの転置行列は以下のようになります。(右が要素)

```math
A: a_{ij} \; \rightarrow \; A^T: a_{ji}
```

転置行列と通常の行列の積は以下のようになります。添字の位置に注目して下さい。

```math
C=A^T B \; \rightarrow \; c_{ij}=\sum_{k=1}^M a_{ki}b_{kj} \\
C=A B^T \; \rightarrow \; c_{ij}=\sum_{k=1}^M a_{ik}b_{jk}
```

# 順方向の計算

Affineレイヤの順方向の計算では、入力Xと重みWの行列の積を計算して、バイアスBを加算します。入力Xは以下のようにバッチ処理を行うものとします。

![pic1.png](https://qiita-image-store.s3.amazonaws.com/0/120566/cd993f45-8a5b-a252-0198-c93c3b3b1b61.png)

数式で書くと以下のようになります。バイアスBはXWの各行に加算するので添字にiはありません。

```math
Y = XW + B : y_{ij} = \sum_k x_{ik}w_{kj}+b_j
```

Pythonで書くと下記のようになります。bは縦方向にブロードキャストします。本書のコードと説明のために少し変えています。

```python:common/layers.py
class Affine
    def __init__(self, W, b):
        self.W = W # サイズは(入力Xの要素数,次レイヤの入力の要素数)
        self.b = b # サイズは(1,次レイヤの入力の要素数)
        self.x = None

    def forward(self, x):
        self.x = x
        out = np.dot(self.x, self.W) + self.b # bはブロードキャスト
        return out # サイズは(データ数,次レイヤの入力の要素数)
```

# 逆方向の計算

行列の積について、出力Yと損失Lの微分であるdL/dyと、Yと(X,W)の関係式から、dL/dXとdL/dWを計算します。

以下のAffine変換の数式について、

```math
y_{kl} = \sum_j x_{kj}w_{jl} + b_l
```

x, wで偏微分を計算すると、

```math
\frac{\partial y_{kl}}{\partial x_{kj}} = w_{jl}, \;
\frac{\partial y_{kl}}{\partial w_{jl}} = x_{kj}
```

以下のクロネッカーのデルタを使って、

```math
\delta_{ij} = \begin{cases} 1 & (i=j)\\ 0 & (i \ne j)\end{cases}
```

以下のように書き換えられます。

```math
\frac{\partial y_{kl}}{\partial x_{ij}}
= \delta_{ik} \frac{\partial y_{il}}{\partial x_{ij}}
= \delta_{ik} w_{jl}, \;
\frac{\partial y_{kl}}{\partial w_{ij}}
= \delta_{jl} \frac{\partial y_{kj}}{\partial w_{ij}}
= \delta_{jl} x_{ki}
```

この関係を使って、dY/dXとdY/dWを計算します。

```math
\frac{\partial L}{\partial x_{ij}}
= \sum_{k,l} \frac{\partial L}{\partial y_{kl}}
\frac{\partial y_{kl}}{\partial x_{ij}}
= \sum_{k,l} \frac{\partial L}{\partial y_{kl}} \delta_{ik} w_{jl}
= \sum_l \frac{\partial L}{\partial y_{il}} w_{jl} \\
\frac{\partial L}{\partial w_{ij}}
= \sum_{k,l} \frac{\partial L}{\partial y_{kl}}
\frac{\partial y_{kl}}{\partial w_{ij}}
= \sum_{k,l} \frac{\partial L}{\partial y_{kl}} \delta_{jl} x_{ki}
= \sum_k \frac{\partial L}{\partial y_{kj}} x_{ki}
```

これを行列を使って書き直すと以下になります。

```math
\frac{\partial L}{\partial X} = \frac{\partial L}{\partial Y} W^T, \;
\frac{\partial L}{\partial W} = X^T \frac{\partial L}{\partial Y}
```

バイアスBについては以下の記事に書いた通り、
[ゼロから作るDeep Learning 〜誤差逆伝播法の概要〜]
(https://qiita.com/Yoko303/items/b67ea27ae221fb5386d1)

以下のようになります。

```math
\frac{\partial L}{\partial b_l}
= \sum_{k} \frac{\partial L}{\partial y_{kl}}
```

以上をまとめてPythonで書くと以下になります。

```python:common/layers.py
class Affine
    def backward(self, dout):
        dx = np.dot(dout, self.W.T)
        dW = np.dot(self.x.T, dout)
        db = np.sum(dout, axis=0)
        return dx, dw, db
```
メソッドの引数にデフォルト値を設定する

# 引数のデフォルト値を設定する
メソッドの定義部分でデフォルト値を設定することができる。　引数を渡さない場合は、　デフォルトで設定されてあるデータを利用する。　引数を渡す場合は、引数で渡したデータを利用することができる。

```ruby:def.rb
def introduce(name = "PG")
    puts "私は#{name}です。"
end

introduce("hiro")   # 私はhiroです。
introduce()        # 私はPGです。
```
# ハッシュを引数に渡す
引数にハッシュを渡すこともできる。
引数呼び出して、末尾がハッシュの場合、波カッコを省略することもできる。でもあえて波カッコを与えたほうが個人的にはわかりやすい。

```ruby:def.rb
def introduce(name = "hirokun", msg)
    puts "私は#{name}です。"
    puts "#{msg[:greeting]}、#{msg[:introduce]}。"
end

introduce("hiro", introduce: "I am sales representative", greeting: "hello")
introduce("hiro", {introduce: "I am sales representative", greeting: "hello"})

#私はhiroです。
#hello、I am sales representative
#私はhiroです。
#hello、I am sales representative
```

#キーワード引数を引数に設定する
呼び出し元でキーさえ指定してあげれば、どの順番でおいてもメソッドが動いてくれる。

```ruby:def.rb
def say_hello(greeting: "hello", introduce: "I am PG")
    puts "#{greeting} #{introduce}"
end

say_hello()
say_hello(greeting: "good morning", introduce: "I am sales represantative")
say_hello(introduce: "I am sales represantative", greeting: "お世話になっております！")

#hello I am PG
#good morning I am sales represantative
#お世話になっております！ I am sales represantative
```
Macでmysqlの初期設定

# 手順
- [Homebrew](https://brew.sh/index_ja)をインストールしておく

```shell
# インストール
$ brew install mysql
# バージョン確認
$ mysql --version
mysql  Ver 8.0.12 for osx10.13 on x86_64 (Homebrew)

# mysqlサーバを立ち上げる。
$ mysql.server start
Starting MySQL
.. SUCCESS!

# mysql_secure_installationを実行
$ mysql_secure_installation
Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

# VALIDATE PASSWORDというコンポーネントをインストールするか。
# ゆるいパスワード（abc/passwdなど）を登録したい場合はｎ
Press y|Y for Yes, any other key for No: y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

# ログインパスワードの強度指定。
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
Please set the password for root here.

# パスワードを２回入力。
New password:

Re-enter new password:

Estimated strength of the password: 50
# 入力したパスワードで先に進みたければy
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

# 匿名ユーザを削除しますか？
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

# リモートログインを許可しない設定にしますか？
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

# テスト用データベースを削除してもいいですか？
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

# 権限関連の設定テーブルをリロードしますか？
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

# ログインしてみる
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.12 Homebrew

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

# 終了する場合はexitかquit
mysql> quit
Bye
```
[Laravel] レイアウトを多重継承する

# 環境

- Laravel 5.5

# やりたいこと

- 全体に共通する部分と一部に共通する部分のそれぞれに対してレイアウト定義を行いたい
- ページの title を「サイト名 - ジャンル名 - サブジャンル名」としたい

# 方法

- レイアウトを多重継承する
- 親レイアウト: 全体に共通する部分を記述する
- 子レイアウト: 一部に共通する部分を記述する（ジャンル）
- 孫セクション: 共通しない部分を記述する（サブジャンル）

# 実装

## 親レイアウト

````resources/views/layouts/parent.blade.php
<!DOCTYPE html>
<html>
    <head>
        <title>サイト名 - @yield('genre')</title>
    </head>
    <body>
        <header>
            【全体に共通するヘッダーをここに書く】
        </header>
        <main>
            @yield('main')
        </main>
        <footer>
            【全体に共通するフッターをここに書く】
        </footer>
    </body>
</html>
````

## 子レイアウト

````resources/views/layouts/child.blade.php
@extends('layouts.parent')

@section('title')
    ジャンル名 - @yield('subGenre')
@endsection

@section('main')
    <h1>@yield('title')</h1>
    【一部に共通する部分をここに書く】
    @yield('notCommon')
@endsection
````

## 孫セクション

````resources/views/child/grandchild.blade.php
@extends('layouts.child')

@section('subGenre', 'サブジャンル名')

@section('notCommon')
    【共通しない部分をここに書く】
@endsection

````
アイコンの右上に丸をつけるCSS


https://fontawesome.com/v4.7.0

と

bootstrap3 を読みこみ、以下をコピペで動く。


```

  <a href="/timelines/flow/">
                        <i class="fa fa-id-card-o fa-lg" aria-hidden="true"></i> <span style="margin-left:-10px;display: inline-block;width:10px;height:10px;border-radius: 50%;background-color:red!important;">　</span>
                    </a>


```
php-master-changes 2018-10-07

今日は少なめ、ext/mysqli のテスト修正、クラスエントリの初期化処理修正があった！

# 2018-10-07
## bugreportuser: mysqli_fork: Fix undefined variable
- https://github.com/php/php-src/commit/cdedc1cb896177fe8896834b6f0d17f49db09aa2
- ext/mysqli のテストで未定義変数を参照している箇所があったのを修正

## bwoebi: Initialize ce->parent_name to NULL
- https://github.com/php/php-src/commit/dcdf1ccf685a486c8073cedb7533302a4171bea1
- クラスエントリの初期化処理で親の名前をさすポインタを NULL で初期化するよう修正
- parent_name 自体は [8 月に Dmitry の修正](https://qiita.com/sj-i/items/883fa3bd35eecc5e6e66#dstogov-keep-information-about-unresolved-parent-class-in-zend_class_entry-parent_name)で入った奴、parent との union だし parent 初期化してれば十分なのでは？みたいな気も一瞬したけれど
- 型によってポインタサイズが違うという状況も有り得なくはないか
no branch, rebasing | git

#発生状況
gitでコンフリクトを発生させテストしていて
Git branchで現場を確認しようとしたところ発生。

# エラーメッセージ

```

$ git branch #現在のブランチを確認
* (no branch, rebasing fiz)
  master
  fiz

$ git checkout master #マスターブランチに切り替え
example.txt: needs merge
error: you need to resolve your current index first
```

インデックス（ステージングエリアの管理をしているファイルみたいなイメージ）で
コンフリクトが発生している状態でブランチ切り替え時にエラーが発生している。



#対処法

```

git reset --merge
```

Git reset --mergeはワーキングツリー（実際のフォルダ）の状態まで
インデックスをリセット（巻き戻）します。
[原文](https://git-scm.com/docs/git-reset)

これでブランチの切り替えができるようになりました。
using declarationとADLに関する覚書

using declarationは、その名の通り宣言なので、ある名前空間で他の名前空間の関数をusing宣言すると、その関数はADLによって呼ばれる可能性が生じる。

```cpp
#include <iostream>

void print(void){}

namespace ns1{
	template<typename T>
	void print(T const& obj){
		std::cout << obj <<std::endl;
	}
}

namespace ns2{
	struct foo{
		int bar = 0;
		friend std::ostream& operator<<(std::ostream& o, foo const& obj){
			return o << obj.bar;
		}
	};
	using ::ns1::print;
}

int main() {
	print(ns2::foo{}); //ns1::printが呼ばれる。
	return 0;
}
```

逆に、他の名前空間に属する関数をADLで呼び出せるようにしたい場合、これを利用できる。例えば、std::rel_ops名前空間内の関数テンプレートは、これを応用するのが最善の活用方法だと思われる(もっとも、std::rel_opsはC++2aでdeprecatedになる)。

```cpp
#include <iostream>
#include <utility>

namespace my{
	namespace _impl{
		struct foo{
			int bar = 0;
			bool operator==(foo other)const{
				return bar == other.bar;
			}
			bool operator<(foo other)const{
				return bar < other.bar;
			}
		};
		
		using std::rel_ops::operator!=;
		using std::rel_ops::operator<=;
		using std::rel_ops::operator>;
		using std::rel_ops::operator>=;
	}
	typedef _impl::foo foo;
}

int main() {
	my::foo foo1{100}, foo2{1000};
	std::cout << std::boolalpha;
	std::cout << (foo1 != foo2) <<std::endl;
	std::cout << (foo1 <= foo2) <<std::endl;
	std::cout << (foo1 >  foo2) <<std::endl;
	std::cout << (foo1 >= foo2) <<std::endl;
	return 0;
}
```
ヘッダ固定・フッタ固定にはFlexboxを使うべし

# なぜならば
* JavaScriptで高さを計算しなくて良い
    * position、padding、margin…
    * 全て気にしなくて良い
* position:fixed; では見えない数行にpadding… 
    * 不要
* 余計な領域までスクロールバーが出現しない
    * 完璧

# まとめ

* 参考サイト
    * [CSS Flexbox の各プロパティの使い方を詳しく解説](https://coliss.com/articles/build-websites/operation/css/css3-flexbox-properties-by-scotch.html)
    * [ヘッダー・フッターの固定とスクロールバー](https://www.tee-talog.com/entry/2018/07/14/154601)

* 余談
    * position: sticky; を使って、CSSだけで待望のヘッダ固定テーブルが[実現できるようだ](https://qiita.com/s0tter/items/14fb4ec2600828a21a22)素晴らしい
wordpressで管理バーが表示されない時

wordpressで管理バーが表示されない時メモ

##ダッシュボードで`サイトを見るときにツールバーを表示する`にチェックを入れる

ダッシュボード > ユーザー > あなたのプロフィール > ツールバー > サイトを見るときにツールバーを表示する

##サイトをログアウトする
ダッシュボードで`サイトを見るときにツールバーを表示する`にチェックを入れても表示さればい場合、
一度ログアウトしてから、再度ログインする
【未解決】macでubuntuのGUIを用意する


### 前準備とか

1.
Xquartzの導入・起動
```shell
$ brew cask install xquartz
$ open -a XQuartz
```

2.
6000番への通信をホスト側のディスプレイで表示するようにする
socatを起動すると、そのまま待ち状態になる。別のターミナルを用意する
```shell
$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
```

3.
dockerイメージの導入
```shell
$ docker pull ubuntu
```

dockerコンテナの作成・起動

4.
先にdockerコンテナ側からMacにアクセスする際のホスト側のIPアドレスを取得する
```shell
# ホストのIPアドレスを取得する
$ ifconfig en0 | grep inet | awk '$1=="inet" {print $2}'
```

5.
↑で取得したIPアドレスを下記にする
```shell
$ docker run -it -e DISPLAY="xxxx:0" ubuntu
↓
root@xxxxxxxxx:/#
```

---

6.
上記5. でXtermのウィンドウが開く
コマンド+N or GUIアプリのメニューから Application -> Terminal から開ける

7.
下記のコマンドでホストXサーバーへの接続権限を与える

```shell
# xtermのターミナル上から下記を実行
bash-3.2$ xhost xxxx

↓

bash-3.2$ xhost xxxx # xxxx は、上記 4. でわかったIPを使う
xxxx being added to access control list
```

---

### Dockerコンテナ内にGUIアプリを導入・起動

コンテナ内で（5. のターミナルで続ける）実行する
ここらへんは時間かかるから
```shell
# apt-get update
# apt-get install ubuntu-desktop

↓
「Configuring tzdata」のターミナル画面では、Asia -> Tokyo を選んだ

# exit # コンテナを再起動するためexit
```

ホスト側でコンテナを再起動
```shell
$ docker restart コンテナID

$ docker ps # コンテナIDを調べられるが、一度停止するわからないので、面倒くさかったら↓の方法もある?(確認中)

or

kitematic で起動すれば、コンテナIDがすぐわかる
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
こてんなID        ubuntu              "/bin/bash"         About an hour ago   Up 24 seconds                           condescending_hodgkin
```

### REF

https://qiita.com/ryoya-s/items/ee1daf9cab18c100c990
https://qiita.com/akiko-pusu/items/e42aab2df1a5772f9585
今日は全人類が判る統計学のPython初心者向け講座に来た

初心者向け講座だったので、初心者を自認する自分が向かった。

https://to-kei.connpass.com/event/102619/
↑ここ。もう少し統計学的なとこまで踏み込むか、と思ったがそこまでじゃなかった。でも、CSVの前処理とかのやり方というか初歩というかまではわかったし一人で調べてかけるところまではこぎつけたので、次の段階までいけるかなーどーかなーみたいな感じだ。

ひとまず初心者を脱出することは出来そうな印象はある。ただ、相変わらずメソッド呼び出し時のカッコを忘れる癖が抜けず。つまらないことでシンタックスエラーを吐かせてしまった。良くない

ただ、こうなってくるともう少し実践的な講座を受けたくなってくるが、実際に例えば多くのデータを使った統計処理とかするような場合『何を目標にすべきか』がちょっとわかんなくなってくるな。Kaggleはいきなりハードル高いし。

https://to-kei.net/

ここ読んで勉強を進めるべきだな。

あと、Jupyter notebook って便利やね。思いつきのPythonコードが打ててその場で保存できる。
DS1307.cpp:363:35: error: variable 'daysInMonth' must be const in order to be put into read-only section 発生

#　DS1307 使用時のコンパイルエラー対処・・覚書

## sketch

https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/DS1307/examples/DS1307_tick

## コンパイルエラー（下記）

```
Arduino：1.8.7 (Windows 10), ボード："Arduino/Genuino Uno"

ビルドオプションが変更されました。全体をリビルドしています。
In file included from d:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28:0,

                 from sketch\I2Cdev.h:80,

                 from sketch\DS1307.h:37,

                 from sketch\DS1307.cpp:37:

sketch\DS1307.cpp:363:35: error: variable 'daysInMonth' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

     static uint8_t daysInMonth [] PROGMEM = { 31,28,31,30,31,30,31,31,30,31,30,31 };

                                   ^

exit status 1
ボードArduino/Genuino Unoに対するコンパイル時にエラーが発生しました。

「ファイル」メニューの「環境設定」から
「より詳細な情報を表示する：コンパイル」を有効にすると
より詳しい情報が表示されます。

```
## Arduino 仕様変更

https://github.com/arduino/Arduino/wiki/1.6-Frequently-Asked-Questions#errors-related-to-avr-progmem-changes

## 下記の通り修正
```
    //static uint8_t daysInMonth [] PROGMEM = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    const uint8_t daysInMonth [] PROGMEM = { 31,28,31,30,31,30,31,31,30,31,30,31 };
```
## ピン配置
１、Ｂａｔ：バックアップ電圧（ＤＳ１３０７　３番ピン）
２、Ｇｎｄ：ＧＮＤ
３、Ｖｃｃ：ＶＣＣ（５Ｖ）
４、Ｓｄａ：ＳＤＡ（Ｉ２Ｃ）
５、Ｓｃｌ：ＳＣＬ（Ｉ２Ｃ）
６、ＤＳ　：ＤＳ１８Ｂ２０　Ｉ／Ｏ
７、ＳＱ　：クロックパルス出力（１Ｈｚ、４．０９６ｋＨｚ、８．１９２ｋＨｚ、３２．７６８ｋＨｚ）

## 接続例(GND/VCC 以外)

Arduuino:A4 ⇔ SDA
Arduuino:A5 ⇔ SCL

![実行結果](https://qiita-image-store.s3.amazonaws.com/0/77496/08908670-6e31-977e-749d-4e245e9dc7d1.jpeg)
yarn upgradeのあれこれ

# 公式ドキュメント

[yarn upgrade | Yarn](https://yarnpkg.com/lang/ja/docs/cli/upgrade/)

# いろいろな`yarn upgrade`

よく使うやつを紹介。

## `yarn upgrade`

```bash
$ yarn upgrade [package | package@tag | package@version]
```

* `package.json`で指定した範囲内の最新バージョンで更新する
* 個別でパッケージを指定出来る
* `package.json`は更新しない

## `yarn upgrade --latest`

```bash
$ yarn upgrade --latest
```

> `package.json` は最新バージョンの範囲を反映したものに更新されます。 デフォルトでは、`package.json` で既存の範囲を指定する表現が、 ^、 ~、 &lt、 =、 > のいずれか、もしくは当該のバージョンであった場合は再利用されます。 それ以外の場合、キャレット (^) に変更されます。 フラグ `--caret`、 `--tilde` もしくは `--exact` のいずれかが範囲を明示的に指定するのに使用されます。

* `package.json`で指定した範囲を超えて最新バージョンで更新する
    * 具体的には各パッケージの`latest`タグが付いたバージョンに更新する
    * そのため、メジャーバージョンが変わったりする場合があるので、注意が必要
* 個別でパッケージ指定は出来ない
* `package.json`を更新する☺

## `yarn upgrade-interactive`

```bash
$ yarn upgrade-interactive
```

`npm-check`の対話モードと同じ。

* シェル上でグラフィカルにアップグレードするパッケージを選択可能
* どのパッケージがどのバージョンまで更新されるのか一目瞭然
* `package.json`で指定した範囲内で更新する

操作:

* 移動: `↑` `↓`
* 選択: `space`

<img width="968" alt="スクリーンショット 2018-10-08 11.22.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/241738/31e05700-45a2-092c-586e-b557dc30ff4f.png">
Ubuntuでapt updateしようとしたらnvidia-dockerのGPGキー周りでエラーが起こった時の対処法

# 解決策
https://nvidia.github.io/nvidia-docker/

このコードを実行すれば良い


```bash
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
```

# 詳細
僕の場合、出ていたのはこんなエラー

```
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64  InRelease: The following signatures were invalid: KEYEXPIRED 1538166745  KEYEXPIRED 1538166745  KEYEXPIRED 1538166745  KEYEXPIRED 1538166745

```

GPGキーの期限が切れたのが原因かなと思う。





(`apt`は深く理解しないまま使ってきていたので、問題が発生したときに解決するのがちょっと大変。この記事も、友達に解決策を教えてもらったので、共有するために書いた。時間作って勉強しよう。)
AsusマシンでUSBドライブなどからの起動ができなくなったとき

- 起動時にEscを押してBIOSに入ります
- BootタブからCSMオプションをEnabledにします
- CSMオプションが選択できない場合はSecurityタブからSerurity boot?（項目名次BIOSを見たとき確認します）とかをDisabledにするとできます

# 参考
https://superuser.com/questions/524598/asus-uefi-bios-options-how-to-boot-from-dvd
レイマーチングでHeight Map Distance Field

## 概要

今回はレイマーチングでHeight Mapを使って凹凸のある平面を描いてみます。
実際にレンダリングした結果は以下みたいな感じになります。
[![mountain.jpg](https://qiita-image-store.s3.amazonaws.com/0/5616/e28e9e25-3838-576e-9d98-933c8a443343.jpeg)](https://www.shadertoy.com/view/MltBRN)
アニメーションさせたやつ↓
[![output.gif](https://qiita-image-store.s3.amazonaws.com/0/5616/238c807f-2ffc-3dea-8da8-37ea98770804.gif)](https://www.shadertoy.com/view/MltBRN)
Shadertoyで[実際に動くデモ](https://www.shadertoy.com/view/MltBRN)もあります。

見てもらうと分かりますが、とても「平面」には見えませんねｗ

が、距離関数自体は平面のものを使い、距離に多少細工をしてこの描画を行っています。

今回の実装については「こんな感じかなー」という想像で行いました。
ただShadertoyでは以下のようにコメントもらったので、基本的なアプローチは合っていると思います。

>Most heightmap distance field formula will look like this yeah.


## 実装解説

### 距離関数

今回の実装の距離関数をまずコードで示します。

```glsl:距離関数
// テクセル（高さ）の倍率
const float heightFactor = 3.0;

// 平面との距離関数
float distPlane(in vec3 p, vec4 n)
{
    return dot(p, n.xyz) * n.w;
}

// Height Mapを使った距離関数
float distFunc(in vec3 p)
{
    float d = distPlane(p, plane);
    vec4 tex = texture(iChannel0, mod(p.xz * 0.2, 1.0));
    tex *= heightFactor;
	return d - tex.x;
}
```

`distFunc`が距離関数です。
内部では平面との距離関数である`distPlane`を呼び出し結果を少し細工しています。


細工は、

```glsl
vec4 tex = texture(iChannel0, mod(p.xz * 0.2, 1.0));
return d - tex.x;
```

の部分ですね。（`heightFactor`は単にテクセルの値を増減させる目的で用意してます）

ちなみにこの`texture`関数ですが、これはShadertoy上で定義されている関数です。
第一引数に渡している`iChannel0`は、これもShadertoy上で用意されているテクスチャへの参照です。
今回の例では普通のテクスチャサンプリングと考えてもらって大丈夫です。


### XZ平面上のテクスチャをサンプリング

さてここでやっていることですが、`p.xz`というパラメータを使っています。
これは平面に対しての距離関数を求めたあと、その時点でのレイの位置をUV座標として利用し、平面のテクスチャを（概念的に）サンプリングします。
そしてサンプリングしたテクセルの値（つまり高さ）を、求めておいた平面との距離から減算することで平面との距離を操作している、というわけです。

と、言葉にすると分かりづらいので図にすると以下のような感じになります。

![raymarching-heightmap.png](https://qiita-image-store.s3.amazonaws.com/0/5616/d7d3693a-426a-2ee3-fe51-17ba2c3c32d8.png)


元々は平らな平面から、HeightMapを使うことで擬似的に平面に凹凸を生み出している、というわけですね。
距離についての計算ができてしまえば、あとは通常のレイマーチングの仕組みに則って法線も求められるし、ライティングやシェーディングを行うことができる、というわけです。

ちなみに今回使っているテクスチャは以下の画像です。
![tex.png](https://qiita-image-store.s3.amazonaws.com/0/5616/4888113b-7bc8-d8d5-f70a-1a83d0bea08b.png)

今回はHeightMapの実装を確かめることが目的だったのでShadertoyに用意されているテクスチャを使いましたが、実際には「**フラクタルブラウン運動（Fractal Brownian Motion(FBM)）**」と呼ばれるパーリンノイズに似たノイズ関数を利用してランタイムで地面を生成してレンダリングしているのが一般的なようです。（Shadertoyの中で）

ちなみに、フラクタルブラウン運動についてはこちらの記事が実装込みで解説してくれています。（ただ、画像のリンクが切れてしまっていますが・・・）

- [ランダム地形生成 Part2～フラクタルブラウン運動](https://qiita.com/y_li/items/290754b9c3ba18e9fb2b)

以上がHeightMapを使った地形のレンダリングです。
それ以外のレイマーチングの実装は一般的な実装だと思うので解説は割愛します。

レイマーチング自体の仕組みなどについては以前、記事を書いたのでそちらを参照ください。

- [[GLSL] レイマーチング入門 vol.1](https://qiita.com/edo_m18/items/034665d42c562da88cb6)

（vol.1とか言いながらvol.2書いてない・・・;）


## その他参考記事

- [Inigo Quilez :: fractals, computer graphics, mathematics, demoscene and more](http://www.iquilezles.org/www/articles/terrainmarching/terrainmarching.htm)
- [Raymarching a fractal terrain](http://users.csc.calpoly.edu/~zwood/teaching/csc473/final13/mkhafate/)
ProgateでHTML、CSSの中級道場をやってみた

# ProgateでHTML,CSS　中級道場にチャレンジ！
Progateさんで勉強を始めて1週間ほど経ちました

最初はrubyを覚えたかったのですが
**「まずはHTML、CSSを操れるようにならねば！(ノД`)・゜・。」**と決意。
で、HTML,CSSの学習（「学習」コースと「道場」コースがあります）は
上級まで終了したので、力だめしのつもりでチャレンジしました。

##まずはコンテンツのレイアウトから
初級の道場では「ヘッダーを作成」が課題でした。
今回はトップページのメインコンテンツを作成します。

課題としては
**・divタグをパーツで切り分ける**
**・文字に透過性をつける**
**・aタグをボタンのように表示させる**
**・パーツの間隔、余白などをきちんと調整する**

私は「margin」と「padding」の使い分けが苦手です((+_+))
これは作って慣れるしかないかな～と思っています

##divタグをパーツで切り分ける
これはhtmlのソースを書いた後にCSSで調整しやすくするため、と考えています
今回の作成対象全体をtop-wrapperというクラスでくくる

```html
<div class="top-wrapper">
　　　<div class="container">タイトルなどを記述するエリア</div>
     <div class="btn-wrapper">新規登録やSNSのボタンを載せるエリア</div>
</div>         
```
私は上記のようにくくりました
最初にここをきちんと決めておくとCSSで調整がしやすいです

##文字に透過性をつける
文字だけではなく「要素の透過」というようです
背景に画像など使用している場合は上に乗せる要素を透明にすると見栄えが良い！

この設定はCSSで行います

```css
.top-wrapper p{
  color:white;
  opacity: 0.7; ←ここ　0.0（完全に透明）～1.0（完全に不透明）で指定
}
```
課題ではaタグで作成するボタンも透過させています

##＜a＞タグをボタンのように表示させる
私はこれもなかなか理解できませんでした

PHPの学習とかからHTMLに入るとどうしても
<input type=～ で送信ボタンにするイメージを持ってしまいます

もしくは画像(img)を表示したものにaタグでリンクを貼るとかですね

タイトルの方法を理解するためには「インライン要素」「ブロック要素」を知る
（　aタグは「インライン要素」、divやpタグは「ブロック要素」になります　）

2つの違いは
「インライン要素」：幅(width)、高さ(height)の指定ができない
　　　　　　　　　　横並びで表示
　　　　　　　　　　間隔(margin,padding)は左右のみ指定可能
「ブロック要素」 ：幅(width)、高さ(height)の指定が可能
　　　　　　　　　 縦並びで表示
　　　　　　　　　 間隔(margin,padding)は上下左右に指定可能
そして・・
**上の2つのいいとこどりするのが「インラインブロック要素」です**

そしてCSSでは「display」プロパティでインライン要素をブロック要素や
インラインブロックに変更することが可能なのです！

```html
<a class="btn sign-up" href="#">新規登録はこちら</a>
<a class="btn facebook" href="#">Facebookで登録</a>
<a class="btn Twitter" href="#">Twitterで登録</a>
```
この3つのaタグには共通して「btn」というクラスを指定してます
なのでcssで3つまとめてインラインブロック要素に変更します

```css
.btn {
  display:inline-block;　←ここでインラインブロックに変更
  padding: 8px 24px;　←インラインブロックになったので幅を調整できる！
  color: white;
}
```
これでボタンの形になりました！

##パーツの間隔、余白などをきちんと調整する
これはプレビュー画面を見ながら試行錯誤( ;∀;)

paddingで試す　⇒失敗　⇒marginで試す　⇒ビミョー・・

色がついた要素の調整は失敗するとわかりやすいのですが
外側の余白だったりすると目視では苦労しました・・

初級の道場ではかなり苦労したのを覚えています
Progateさんの判定は指定された文字を１文字まちがっても不合格になるので
タイプミスに気付かず、「何が違うんだ～！」と頭を抱えることも

さて、引き続き　次の課題にチャレンジします！
表示順の変更にorderメソッドを使う

###viewで一覧を表示

```
 <% @messages.each do |message| %>
            <tbody> 
            <tr>
              <td><%= message.id %></td>
              <td><%= message.title %></td>
              <td><%= message.content %></td>
              <td><%= message.created_at %></td>
              <td><%= link_to '詳細', message %></td>
            <% end %>
```


###次に下記のコントローラ内コードに追記する。

```controller.rb
@messages = @user.messages.page(params[:page]).per(5)
```

上記を下記に変更。（.order('updated_at DESC')を追記）

```controller.rb
@messages = @user.messages.page(params[:page]).per(5).order('updated_at DESC')
```

***orderメソッド***でupdate_atカラムの順番、かつ***DESC***の指定で降順で表示させている。
なので、投稿が新しいものが一番上から表示されていく。

参考：https://qiita.com/you8/items/df68aaee3010e282d1ae
https://techacademy.jp/magazine/7727
Linux で UnityHubをインストールしたときのメモ

最近開発がすべてlinuxになって、そのときにUnityもlinuxで動かせないかなと色々探したときのメモ

# 環境
OS: Ubuntu Mate 18.04

# やり方
Unityはlinuxを公式サポートしているわけではないようで、
独自のバイナリを取ってくる

## 必要ファイルを取得
以下のURLからファイルを取得する

Unity本体
https://forum.unity.com/threads/unity-on-linux-release-notes-and-known-issues.350256/page-2#post-3625345

Unityhub
https://forum.unity.com/threads/unity-hub-release-candidate-0-20-1-is-now-available.546315/

## ファイルの展開
なんか手こずった。
Appimage Application bundle というファイル形式なので、GUIで開いて、左クリック -> property -> アクセスからファイルの実行を許可をチェック
そしてクリックして実行

あとはアカウントのアクティベーションなり、開発なりをすればおｋ
ペアプログラミングして気がついた新人プログラマの成長を加速する３つの習慣

# はじめに
先月、初めて「ペアプロ」なるものを先輩エンジニアに行ってもらいました。その際にとても学びになったので、その学びをメモしておこうと思います。

先輩とペアプロをする予定の新人エンジニアの方には「ペアプロからこういうことが学べるよ」ということ、ペアプロで新人を育成する予定のベテランエンジニアの方には「新人はペアプロでこんなことを感じるよ」ということが伝わると嬉しいです。

ただ学びと言っても、既にこの記事にまとめられていることが全てだったかなと思います。
- [ペアプログラミングして気がついた新人プログラマの成長を阻害する悪習](https://qiita.com/hirokidaichi/items/27c757d92b6915e8ecf7)

こちらの記事はベテラン×新人のペアプロで、ベテラン側から書かれた記事であったため、ここでは新人側の目線から「具体的にどういう点が学びになったのか」ということについて書ければと思います（タイトルもパクってます）。

因みに「そもそもペアプロとは何ぞや？」という方には、こちらの記事がおすすめです。

- [ペアプロ懐疑派だった僕が、実務でペアプロ導入して180度考えが変わった話](https://qiita.com/YudaiTsukamoto/items/06b426f4dbee268d5035)

# 新人プログラマの成長を加速する３つの習慣
先述の通り、「[ペアプログラミングして気がついた新人プログラマの成長を阻害する悪習](https://qiita.com/hirokidaichi/items/27c757d92b6915e8ecf7)」に書かれていることが全てだったかなと思うのですが、こちらの記事に書いてある「良い習慣」の中で、私が特に実感したものが３つあります。

## よくコードを読み、理解することに時間をかける
まずはこれです。以前は全然コードを読んでいなかったなと実感しました。新人から見ると、ベテランエンジニアの方はさらっとコードを書いているように見えるので、まさかそんなにコードを読むことに時間を掛けているとは思いません。

**「コードを理解するために時間が掛かる」という当たり前のことが分かっていない**ので、大して理解していないのにどんどんコードを読み進めてしまい、途中から全く分からなくなってしまうということがあります。

ペアプロをすることで、良い意味で「ベテランエンジニアもスーパーマンな訳ではない」という当たり前のことが分かり、以前よりコードを読む時間を長く取るようになりました。

## 常に目の前の問題を単純化することに知恵を使う
以前は、エラーが出てきた時は大して考えずに「とりあえず自分の書いたコードをもう一回眺めてみる」「エラーコードをググってみる」ぐらいのことしかやっていませんでした。「どこまでちゃんと動いていて、どの部分がエラーを吐いていて、その原因は何なのかを考える」という当たり前のことをしていませんでした。

これもベテランエンジニアの方が、新人から見ると**エラーが出た瞬間に一瞬で原因を特定しているように見える**ため、エラーの原因を突き止めるために段階を踏んでいるということが分かっていないからだと思います。

ベテランエンジニアに方にとっては「当たり前」に思っているエラーの原因の特定の方法も、一から説明してもらうと新人にとっては目から鱗でした。

## 道具の改善および自動化をおこなう
ベテランエンジニアの方は、とにかくコードを書くのが早いと新人から見ると感じます。これはスキルの差ももちろんありますが、**「道具を自分の使いやすいようにカスタマイズしているかどうか」もこのスピードの差を生んでいる**ことがペアプロをしていて気付きました。エディタの機能やショートカットキーを使いこなすだけでスピードが全然違います。

これらは使わなくてもコードを打つことができてしまうので、打ち方の「お手本」みたいなものがないと、新人にとっては「自分は効率の悪いことをしている」ということに気付くことすらできません。気付くことができないので、当然自分で改善もできません。

ペアプロで先輩がコードを打っているのを後ろで見ているだけでも、自分の問題を認識することができるので、あとは頑張れば自分で改善することができます。私もペアプロをすることで、今まで知らなかったエディタの機能を知り、開発スピードをあげることができました。

# 終わりに
**ペアプロをしてもらった後で、自分のコードの質もコードを書くスピードも飛躍的に上がった**と感じています。私の場合は、先輩の方から「ペアプロやるぞ」と声を掛けてもらって学べただけなので偉そうなことは言えませんが、新人エンジニアの方は先輩エンジニアにペアプロをお願いしてみるととても学びがあると思います。ベテランエンジニアの方は、新人とのペアプロに付き合うことで、その新人が成長してコードレビューが少し楽になるかなと思うので、是非やってみてもらえると嬉しいです。
保存してないオブジェクトの削除

まだDBに保存していない状況で作成したオブジェクトを削除したいシーンがあった。

destroyやdeleteを直接オブジェクトに使用してもまだ保存されていないので意味がなく、少し迷ったのでメモをしておきます。


```
@objects.each { |m| @objects.destroy(m) if m.status.nil? }
```

上記のように削除する時に紐づいているオブジェクトを記載することで削除できました。
Apex(エラー処理)

####DMLExceptionから日本語のメッセージ部分だけを取り出す

```java
try {
    update xx;
} catch(DmlException e) {
    String dmlMessage = '';
    for (Integer i = 0; i < e.getNumDml(); i++) {
        dmlMessage += e.getDmlMessage(i);
    }
    ・・・・
}
```
オブジェクト指向と関数型についての自分の考え

#どう違うのか。
　初心者から見たらどちらもよくわからないと思う。僕もその一人だ。オブジェクト指向の本当の利用価値はまだ僕の中では測れないし、関数型もいろいろな人が言っているようにプログラミングがしやすいのかも計り知れない（例えば、副作用がないとかプログラミングがオブジェクト指向に比べて楽だとかだ）。議論を始める前に、どちらの性質を理解してない限り、議論をすることもできない。
　だから、まずは初心者を含めた読者に対しても同様に、どう違うのかを見ていこう。

#オブジェクト指向について

　オブジェクト指向とはなんぞや、という質問に関してはいくつかの答えがネットでは用意されている。主な答えというのは「哺乳類の分類」だ。哺乳類の分類とは、哺乳類をいう物を親として、それの特性（恒温動物である）を引き継いで、犬は「人間に従う」という機能をつけて、猫には「自由気ままに生活する」という機能をつける。
　だが、こんな説明だと普通はわからない（現に僕も大学のときこういう説明を受けて、理解できなかった）。今回はロボットで説明をしてみる。
　今回扱うロボットは「轟轟戦隊ボウケンジャー」のロボットだ。ボウケンジャーには「ゴーゴービークル」という乗り物を大元として、作っている。ゴーゴービークルの機能は以下の通りだ。

+　パラレルエンジンというエンジンを積んでいる
+　冒険仕様になっている
+　換装できるようになっている

　今回の場合だと、「ダンプ」、「フォーミュラー」、「ジャイロ」、「ドーザー」、「マリン」が「ゴーゴービークル」の特徴を継承をしている。
　そして、合体はこれらの「ゴーゴービークル」を組み合わせ行う。
　オブジェクト指向もだいたいこんな感じで、springでウェブサービスを作るのであれば、springから提供されているオブジェクトを組み合わせて作る。つまり、オブジェクト指向とは使うであろう部品を個々で作っておいてあとで合体させるものだ。
#関数型について
　一般的には「ラムダ計算を要したプログラミングスタイル。第一オブジェクトがオブジェクトではなく、関数である」という。これもよくわからない。僕の場合は最初に触った言語が関数型だったので、感覚としてわかるが正確に定義しないといけない場合は難しい。
　今回もロボットで例えてみることにしよう。
　さっきのロボットの説明を引き継いでみる。さっきは大まかな機能というオブジェクトを引き継いで作るのがオブジェクト指向だったのに対して、関数型は動きのみで作るという感じだ。
　ゴーゴービークルを動かすのにも同じような動きがある。例えば、「車輪を回す」、「モーターを回す」、「プロペラを回す」といった具合に、「回す」という動きが共通している。この「回す」という動きを一つの関数として扱う。こうすれば「回す（車輪（））」「回す（モーター（））」「回す（プロペラ（））」といったようになる。こうすることによって、いちいち「回す」というプログラムを書かずに済む。なおかつ、「回す」というプログラムは回転に関するプログラムを外部の変数に対して変えない決まりがある。これによって、どんな機械でも汎用的に機能する、ということができる。

#それでは、自分なりの考えを述べる。

　慣れ親しんだのは関数型だが、どちらがやりやすいかは一概に言えない。というのも、オブジェクト指向自体に致命的な欠陥があるわけでもないし、関数型がオブジェクト指向よりも遥かに優れているともいえないからだ。
　というのも、どちらとも記述の仕方の違いがある。一方は物事を部品ごとに管理し、もう一方は動きによって管理をするという手法を取っている。細かい部分でお互い一長一短があるのも事実だ。
　オブジェクト指向の良いところは、プログラム同士をくっつけたり、受け継いだりすることによって一回オブジェクト指向をある程度理解できれば再利用が楽というところだろう。入り口に躓かなれければ、かなりプログラムが楽になるということだ。
　関数型のよいところは、動きによって記述することによって予期せぬ代入に怯えなくて済む。副作用とは、グローバルな値に変化をつけてしまうこと。プログラムが一つならよいが、これがいくつもあったらどこかでバグが起こった時にデバッグが大変だ。関数型の欠点としては理解の難しさだろう。僕の場合はなぜか、関数型に合っていた。だが、調べれば調べるほど難しいということがわかった。Haskellのモナドなどが最たる例だろう。圏論を使ったり、厳密に定義をしている。この定義を読み解くのも難しく、それに加えて数学の知識をある程度持ち合わせてないといけない。
　それなら、どちらが一番よいのか？という答えにたどり着かないではない。おそらく、僕の考えでは住み分けが大切だと思う。
　オブジェクト指向は工学的な考えが強いと思う。結合や継承というを、数学的に定義するのは難しい。ならば、端から工学、つまり作ることに特化した考え方と定義すればいい。反対に、関数型は数学的で綿密に作りたい、数学的な考えでプログラムを作ってみるというふうに住み分けをする。
　ここからが重要なのだが、お互いの世界を行き来できればいい。オブジェクト指向のプログラムでどうしても副作用を起こしたくない！という場合に関数型のプログラムを使えたり、反対に関数型でやっていたがデスクトップ周りのプログラムでどうしてもオブジェクト指向のプログラムが必要！となったら、オブジェクト指向が使えるようにすればいい。
　これが現状できるのが、僕の考えだと「JavaScript」だろう。typescript,es6を使うことによって住み分けられる。他の言語でもできるであろうが、厳密に関数型を定義できていない言語もあるので、alt.jsで言語が作れるJavaScriptが一番良いと思う。
#まとめ

　長々と語ったが、重要なことはどちらが劣っているとは測れないということだ。たしかに、関数型は「古くて新しい」。反対にオブジェクト指向は「新しくて古い」。だが、これらは単なる思い込みだろう。極論を言ってしまえば「どちらも正しく世界を記述することができる」。
　これからもこの議論は続くであろうが、これを読んでちょっとでも関数型に興味を持った！オブジェクト指向に興味を持った！という人がこの議論を発展させてくれればいいなと思う
テキストの改行が無視されて１行で表示されるときの対応

Windows環境で、テキストファイル（設定ファイル、ログなど）をテキストエディタで開いたときに、改行が無視されて１行で表示されることがあります。検索を使って無理やり参照する破目になったり、編集がやりにくかったりします。

テキストの改行が無視されて１行で表示される原因と対応方法について考えてみます。

#原因
改行を表す文字はOS毎に差異があります。
※文字コードはSJIS、UTF8

| 文字     |文字コード |OS                   |
|:---------|:---------|:--------------------|
| CR + LF  | 0x0d0a   | Windows             |
| LF       | 0x0a     | Linux、Mac(OS X以降) |
| CR       | 0x0d     | Mac(OS 9以前)       |

テキストファイルで使用している改行文字に、テキストエディタが対応していないと、改行が無視されて１行で表示されてしまいます。

例）Windowsのメモ帳で、改行がLinux形式のLFで書かれたファイルを開く。

#対応方法

対応方法を羅列してみます。

##さくらエディタを使う

全ての改行文字に対応したテキストエディタを使えばいい、ということでサクラエディタを使います。zip版なら本番サーバで使用しても大丈夫な場合が多いかと思います。
サクラエディタでは改行文字の違いは矢印の違いにより表されます。

改行文字がCR + LFのとき、
![crlf.png](https://qiita-image-store.s3.amazonaws.com/0/298692/1f4f8129-0282-b2e5-a2bb-cd1a7807b42f.png)

改行文字がLFのとき、
![lf.png](https://qiita-image-store.s3.amazonaws.com/0/298692/a0d61b6f-503a-426b-746a-b94c13a77a33.png)


改行文字がCRのとき、
![cr.png](https://qiita-image-store.s3.amazonaws.com/0/298692/2ee1dd41-f63a-a670-2d25-d021b48ed358.png)

Enterキーで改行を新たに入力すると、そのファイルの改行文字が入力される。
（改行文字LFに一行追加）
![lf2.png](https://qiita-image-store.s3.amazonaws.com/0/298692/876648c2-2844-dc6b-c365-1cafc5c39c5a.png)

##メモ帳の対応を待つ

本番サーバだとテキストエディタを新たにインストールできないこともあるので、ビルトインのメモ帳が全ての改行文字に対応すると嬉しいですね。Windows 10 Insider Previewで既に公開されており、今後リリース予定とのことです。
https://blogs.msdn.microsoft.com/commandline/2018/05/08/extended-eol-in-notepad/


##Javaで編集するとき

Javaでテキストファイルを編集するときは、System.lineSeparator()を使い、自動的にOSに依存した改行コードが出力されます。
そのため改行文字がLFのファイルをWindows環境で編集すると、LFとCR+LFが混在してしまうので別途対応が必要です。
暗い画像を鮮明にするStretch

カメラの画像が、夜の蛍光灯の下などでは、暗すぎて、解析に使えないことがあります。

簡易に、より鮮明にするのに、OpenCVのcv2.equalizeHistがありますが、これはイメージへのDamageが大きい。また、Unsharpなどの手法では暗さは克服できません。

[「OpenCVやDlibの使い方で失敗した諸点」](https://qiita.com/satoyoshiharu/items/dbc401640f75a2ed16f9)に書いたように、以下のStretchですと、Damageが少なく、より明るくて鮮明にできます。

```py
def stretch(self, img):
        # input must be gray
        inImg = img.astype('float64')
        maxv = np.amax(inImg)
        minv = np.amin(inImg)
        factor = 255.0 / (maxv - minv)
        out = (inImg - minv) * factor
        out = cv2.blur(out.astype('uint8'), (3, 3))
        return out
```

さらに、暗い部分をより鮮明にしたいとき、変換式をいじります。明るい部分をより鮮明にしたければ、0..1に正規化した値に対し、math.sqrtでなくてその代わりにmath.powを使います。

```py
    def stretchLow(self, img):
        # input must be gray
        inImg = img.astype('float64')
        maxv = np.amax(inImg)
        minv = np.amin(inImg)
        mean = np.mean(inImg)
        std = np.std(inImg)
        maxv = min(maxv, mean + 2.0 * std) #あまりに明るい部分は切る
        factor = 255.0 / (maxv - minv)
        out = (inImg - minv) * factor
        out = np.sqrt((out / 256))*256 #小さい値の部分をより広い範囲の値へ対応付ける
        out = cv2.blur(out.astype('uint8'), (3, 3))
        return out
```
Rで複数の異なる要素を一括で置換する

最近PythonだけでなくRも使うようになり、Pythonで行っていた処理をRでどう書くのか悩んだのでメモしておきます。

## 目的
僕は、データの前処理で、日本語の要素を英語に変換したいことがよくあります。
数学を'math'と置換するような方法を書きます。

## データセット
適当ですが以下のデータセットを利用します。

```R
library(tidyverse)

df <- tibble(
  subject = c('数学', '英語', '国語'),
  scores = c(80, 70, 90)
)
```

## stringrを使った方法
[tidyverse](https://www.tidyverse.org/)に入信したので、[stringr](https://stringr.tidyverse.org/index.html)を使います。

```R
df %>% 
  mutate(subject = str_replace_all(
    subject,
    c('数学' = 'math', '英語' = 'english', '国語' = 'japanese')
  ))
```
置換できました。以下の方がスッキリしてますかね。

```R
df$subject %>% 
  str_replace_all(c('数学' = 'math', '英語' = 'english', '国語' = 'japanese'))
```

## 余談
[tidyverse](https://www.tidyverse.org/)はかなり使いやすいなと思いました。Rの基本パッケージのみだと使いにくいなと思っていたところなのでありがたい限りです。
Quizletの便利な使い方

#Quizletとは
自分専用の*暗記カード*を作成できるサイトです。
忘れてしまったりイメージしにくい単語をカードにして学習できます。

https://quizlet.com

##エクセルで暗記カードを作る
まとめて編集して暗記カードを作ることができます。
###エクスポート
エクスポートをクリックします。
![figure1.gif](https://qiita-image-store.s3.amazonaws.com/0/245159/f17d1195-4a88-37b6-2253-2d9abff4e389.gif)
####エクスポートのオプション
"用語と定義のあいだ"→"カスタム"を選択します。単語と意味の間に指定した文字列を挿入できます。
![figure2.gif](https://qiita-image-store.s3.amazonaws.com/0/245159/8e69a9a7-d719-5e8f-54da-3c164675c242.gif)
今回はExcel上でカードを編集したいので、カンマを挿入します。※カンマを選択しても構いません。
![figure4.gif](https://qiita-image-store.s3.amazonaws.com/0/245159/453b98d4-2032-751a-9d33-838b8a150788.gif)
テキストをコピーします。
![figure3.gif](https://qiita-image-store.s3.amazonaws.com/0/245159/10ffc9cf-fc82-455a-3f39-baa2ba16e9b8.gif)

Windowsの場合、メモ帳を開いて貼り付けます。csv形式で保存します。

###インポート
"作成する" → "+ Word、Excel、Google Docsなどよりインポートする" の順にクリックします。
![figure5.gif](https://qiita-image-store.s3.amazonaws.com/0/245159/a13758f5-a1a8-facf-165e-4ba1f6332074.gif)
インポートしたいExcelの表からコピーします。
![figure6.gif](https://qiita-image-store.s3.amazonaws.com/0/245159/442e3389-bb2c-d51a-d53e-60f98efd42d2.gif)
コピーした表を貼り付けます。ここで"用語と定義のあいだ"からタブを選択します。"作成する"をクリックします。
![figure7.gif](https://qiita-image-store.s3.amazonaws.com/0/245159/4869ab74-4b7b-53db-dadd-c05c6d04f5d2.gif)
このようなエラーが出るはずです。
![figure8 164.png](https://qiita-image-store.s3.amazonaws.com/0/245159/f246e837-9580-53ea-7c31-d709c57ac4e9.png)
"言語の選択" → "日本語"を選択します。もう一度、"作成する"をクリックします。
![figure8.gif](https://qiita-image-store.s3.amazonaws.com/0/245159/fbf8df0c-125e-afb0-a49c-0dd8a40421c0.gif)

##まとめ
さらにQuizletは画像を挿入したり、音声を録音することもできます。
「ああ、この単語の意味なんだっけ」と思ったときはぜひ気軽に自分の単語帳を作成してみてはいかがですか。
暴れる値をおとなしくさせるには、カルマンフィルターが便利で高速

センサーの値などが、揺れて安定せずに、困ることがあります。
そういうときは、スカラー値に対するカルマンフィルターが、高速で便利です。

加速度センサーやジャイロスコープの生の値はノイズ込みで揺れまくります。それをおとなしくさせて傾向だけを取り出すのに使えました。また、[「OpenCVやDlibの使い方で失敗した諸点」](https://qiita.com/satoyoshiharu/items/dbc401640f75a2ed16f9)に書いたように、DlibのFace Landmarkの特徴点位置が揺れるのをおとなしくさせるのに使えました。

ただの移動平均ですと、異常値に左右されます。異常値に左右されにくくするために、移動平均のスパンを大きくとると、今度は反応が遅くなります。カルマンフィルターですと、反応の遅さを抑えながら異常値に左右されにくい落としどころを見つけられます。

以下にPythonでclass Kalmanのコードを載せておきます。最初、Kalmanインスタンスを作るときに、パラメータを与えて、以降、観測値をguessメソッドに与え続けるだけです。最初のパラメータの値によって、ずいぶん挙動が変わります。そのためテストデータで、入力の観測値と出力の推定値をPlotして観察し、試行錯誤して適当なところにパラメータ値を設定する作業が必要となります。

```py
class Kalman():
    #
    # Reference: http://www.cs.unc.edu/~welch/media/pdf/kalman_intro.pdf
    #

    def __init__(self, procvar, measvar):
        self.ctr = 0
        self.Q = procvar  # process variance
        self.P_k_minus_1 = 0.0  # a posteri error estimate
        self.R = measvar  # estimate of measurement variance, change to see effect

    def guess(self, input):
        DEBUG = False
        if self.ctr == 0:
            self.xhat_k_minus_1 = input  # a posteri estimate of x
            self.K = 1.0  # Kalman gain
            self.ctr = self.ctr + 1
            return input
        else:
            # time update
            xhat_k = self.xhat_k_minus_1 # a prior estimate of x, transition matrix is identity, no control
            Phat_k = self.P_k_minus_1 + self.Q # a prior estimate of error
            # measurement update
            self.K = Phat_k / (Phat_k + self.R) # Kalman gain
            estimate = xhat_k + self.K * (input - xhat_k) # a posteri estimate of x
            self.xhat_k_minus_1 = estimate # a posteri estimate of x
            self.P_k_minus_1 = (1 - self.K) * Phat_k # a posteri error estimate
            # error variance and kalman gain should become stable soon
            if DEBUG: print("Kalman:","Input",input,"Estimate",int(estimate), "ErrorVar {:.2}".format(self.P_k_minus_1), "KalmanGain {:.2}".format(self.K))
            return estimate
```
Pythonで標準入力からデータを受け取る

fileinputモジュールを使います。

```python
import fileinput

for line in fileinput.input():
    print(line,end="")
```

以下のどの呼び出し方でも、使えます。ファイルの中身を表示するだけの例なので、あまり面白くはないですが(^^;

```
python3 test.py test.py 
python3 test.py < test.py
cat test.py | python3 test.py
```
インフラ & Docker　いろいろ雑記

## インフラ & Docker　いろいろ雑記

```shell
$ docker --version
Docker version 18.06.1-ce, build e68fc7a

$ docker-compose --version
docker-compose version 1.22.0, build f46880f

$ docker-machine --version
docker-machine version 0.15.0, build b48dc28d

$ which docker
/usr/local/bin/docker

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS
```

---

### REF DOC

- docker for mac DL
http://otiai10.hatenablog.com/entry/2017/05/23/111157

---

- docker for mac と docker toolbox  は別物らしい

- docker toolbox DL
https://qiita.com/hshimo/items/e24b1fbfbf775ec7c941

- docker toolbox contents
	- docker client
	- docker machine
	- docker coopse (Mac Only)
	- VirtualBox

### REF FORUM

複数のVMを持つことについて

- stackshare
https://stackshare.io/

- docker hub
https://hub.docker.com/
jsdoでblockly その5

#概要
jsdoでblocklyやってみた。
ThreeXやってみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/7727d9aa-0062-8041-b4d3-d1e46a17aea4.png)

#成果物

http://jsdo.it/ohisama1/8ruT/fullscreen

以上。
jsdoでblockly その4

#概要
jsdoでblocklyやってみた。
グラフやってみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/E/x/m/Exmd.jpg?t=1538911518)

#成果物

http://jsdo.it/ohisama1/Exmd

以上。
LOLIPOPマネージドクラウドで、Laravel環境を構築する

![スクリーンショット 2018-10-08 7.39.48.png](https://qiita-image-store.s3.amazonaws.com/0/165099/9a7dd871-c482-e83c-92ee-614aca5c82b2.png)
2018年12月31日まで無料！
らしいので試しに触ってみました。

##0. 事前準備
###カスタムドメイン
マネージドクラウド ヘルプセンター、下記リンクより
[カスタムドメインの設定方法](https://mclolipop.zendesk.com/hc/ja/articles/360000831348-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95)

###プロジェクト作成
ダッシュボード 新しいプロジェクトの追加
https://mc.lolipop.jp/console/projects/new

###SSH接続
公開鍵を設定し、SSHコマンドを参考にSSHクライアントで接続(iTerm2, terminal, TeraTerm等)

##1. Check Path

```terminal:
$ cd ~
$ pwd
/var/www
```

##2. Composer Install

```terminal:
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar composer
$ alias composer='php /var/www/composer'
```

##3. Laravel Install

```terminal:
$ composer create-project --prefer-dist laravel/laravel laravel
```

##4. To make a Path

```terminal:
$ ln -s laravel/public/ html
```


##5. Set .env
データベースの設定は、
ダッシュボード・プロジェクトの一覧より
https://mc.lolipop.jp/console/projects

```terminal
$ vim /var/www/laravel/.env
```

## Check
プロジェクトURL or カスタムドメインで設定したドメインにアクセスして確認


##example
make:authコマンド実行

```terminal
$ cd /var/www/laravel
$ php artisan make:auth
$ php artisan migrate
```

![スクリーンショット 2018-10-08 7.53.04.png](https://qiita-image-store.s3.amazonaws.com/0/165099/f958f889-5676-e19c-be2f-8a1d2d37ff09.png)

みなさん試しに触ってみてはいかがでしょうか。
unityでファイルの保存、参照をする

Windows.System.Forms.dllを使います。

~\Unity\Editor\Data\Mono\lib\mono\2.0
にあるWindows.System.Forms.dllをコピーして、
~\Assets\Plugins
に貼り付けます。

ここからEditorの操作です
Build Settings\Player Settings\Other Settings\Configuration\api compatibility levelを.Net 2.0にします。

OpenFileDialogなどを使ってエクスプローラーを開いてファイルの参照をしたり、選択されたファイルのパスを取得できるようになります。
https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms?view=netframework-4.7.2