OmniAICreator/Qiita-1.07M huggingface dataset:
【Nginx】400・500番系のレスポンスに対してもヘッダーを挿入する方法

WEBサービスを開発する際に、バックエンドはAPIサーバーとして稼働させてフロントエンドと分ける下記のようなアーキテクチャを採用した時にハマったことについて書いていきます。（二度と同じ轍を踏まないように！）

```
 ----------                 -----------                 ------------
|          |               |           |               |            |
|          |-------------->|   Nginx   |-------------->|            |
|  Client  |               |  Reverse  |               | API Server |
|          |<--------------|   Proxy   |<--------------|            |
|          |               |           |               |            |
 ----------                 -----------                 ------------
```

# ハマったこと
CORS(Cross-Origin Resource Sharing)を許可するためにNginxでヘッダーを挿入するように設定をしていました。

```
 add_header Access-Control-Allow-Origin https://trouble.example.jp;
```

APIサーバーから正常系(HTTPステータスコード200・300番系)のレスポンスが返された時はクライアント側と正常に通信していました。
しかし、APIサーバーから異常系(HTTPステータスコード400・500番系)のレスポンスが返された時にクライアント側でCORSエラーが発生しました。

当初は、正常系の通信はできていたのでフロントエンドを疑っていました。
しかし、調査していくと異常系のレスポンス時にはCORSを許可するための`Access-Control-Allow-Origin`がHTTPヘッダーに挿入されていなことが分かり、バックエンドに原因があると判断しました。


# 解決方法
`Access-Control-Allow-Origin`の設定行に`always`というキーワードを追記するだけで解決しました。

```
 add_header Access-Control-Allow-Origin https://trouble.example.jp always;
```

[Nginxの公式ドキュメント](https://nginx.org/en/docs/http/ngx_http_headers_module.html)でしっかり説明されていました。
>Adds the specified field to a response header provided that the response code equals 200, 201 (1.3.10), 204, 206, 301, 302, 303, 304, 307 (1.1.16, 1.0.13), or 308 (1.13.0). Parameter value can contain variables.
If the always parameter is specified (1.7.5), the header field will be added regardless of the response code.

正常系(HTTPステータスコード200・300番系)のレスポンスの場合は指定されたヘッダーが挿入されますが、それ以外のステータスコードでは挿入されません。
なので、ステータスコードに関わらずヘッダーを挿入したい場合は***always***を指定する必要があるようでした。

「公式ドキュメントはちゃんと読みましょう」ということですね

# Reference
- [Module ngx_http_headers_module](https://nginx.org/en/docs/http/ngx_http_headers_module.html)
Jetson Nanoでpyenv

# はじめに

Jetson Nanoにインストールされているpython3は3.6.7である。pipenvでディレクトリごとに環境を構築していると、異なるバージョンのPythonを使いたくなることがある。こんなときに使用するのがpyenvである。

pipenvはpyenvと連携するため、pipenv + pyenvの組み合わせでディレクトリごとに異なるPythonバージョンを伴う環境を構築することができる。

# パッケージのインストール

aptコマンドを使ってPythonをソースコードからコンパイルする上で必要なパッケージ群をインストールする。

```bash:ターミナル
sudo apt install libssl-dev libffi-dev libbz2-dev libncurses5-dev libdb-dev libgdbm-dev liblzma-dev libsqlite3-dev tk-dev uuid-dev libreadline-dev
```

# pyenvのインストール

pyenvはaptやpipではインストールできないのでgitを使ってインストールする。

```bash:ターミナル
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

~/.bashrcの最後に下記を追加。

```:~/.bashrcの最後
# pyenv settings
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
```

設定の読み込みを行う。

```bash:ターミナル
source ~/.bashrc
```

インストールの確認は`pyenv -h`で行う。

```bash:ターミナル
yamamo-to@jetson-nano:~$ pyenv -h
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   install     Install a Python version using python-build
   uninstall   Uninstall a specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme
```


# 異なるPythonのバージョンをインストール

試しに$HOME/Documents/Python3.5以下に、python 3.5の環境を構築する。

```bash:ターミナル
yamamo-to@jetson-nano:~$ mkdir ~/Documents/Python3.5
yamamo-to@jetson-nano:~$ cd ~/Documents/Python3.5
yamamo-to@jetson-nano:~/Documents/Python3.5$ pipenv --python 3.5
```
「システムにPython 3.5が見つからないのでpyenvを使ってCPythonをインストールして良いか?」のようなメッセージが表示されるので「y」と答える。これでしばらく待つとPython 3.5が利用可能となる。

```bash:ターミナル
yamamo-to@jetson-nano:~/Documents/Python3.5$ pipenv run python -V
Python 3.5.7
```


実行時のイメージは下記の画像の通り。

![python3.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252224/34eefae3-aff4-4ee4-f8db-63513fdee10b.png)
Bash で四則演算と剰余

株式会社オズビジョンのユッコ (@terra_yucco) です。
知り合いのツイートみて AtCoder こっそりはじめてみましたが、まだ「初心者はまずはここから」の問題をちょっと眺めた程度。
自宅 PC で IDE がない環境だと、最初に自分が選ぶ言語は Bash なのだということに気づかされました。

# 単純な数値計算

以前にいた現場では計算するときには `expr` が必要でしたが、今の環境及び AtCoder の Bash 環境では以下のようにすることで計算が行えます。

```bash
$ echo $(( 1 + 2 ))
3
```

なお、変数を使う場合などはこんな感じで。

```bash
$ a=1; b=2; echo $(( a + b ))
3
```

`$(( ... ))` の中に書く変数は `$` が付いていなくても、付いていても、動きは変わりません。

```bash
$ a=1; b=2; echo $(( $a + $b ))
3
```

## 四則演算

```bash
$(( a + b ))
$(( a - b ))
$(( a * b ))
$(( a / b ))
```

割り算の結果は切り捨てです。

## 剰余

Bash で使えるの知りませんでしたが、普通に `%` が使えました。

```bash
$ a=5; b=2; echo $(( a % b ))
1
```

### 剰余が使えるの知らなかったので

奇数偶数を判定せよという問題で、こんなコードを書いていました、反省。

```bash
#!/bin/bash
read a b
res=$(( a * b ))
if [ $(( ( res / 2 ) * 2 )) -eq ${res} ]; then
    echo "Even"
else
    echo "Odd"
fi
```

### 改善後コード

```bash
#!/bin/bash
read a b
if [ $(( a * b % 2 )) -eq 0 ]; then
    echo "Even"
else
    echo "Odd"
fi
```

### 前後での改善

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/69dace2a-9fdb-8892-a6c0-05d0a703b2d9.png)

誤差レベルですが、実行は速くなった！

## Conclusion

Bash は普段知っていることの延長でしか使わないので、より効率のいい方法とかを学ぶきっかけになればと思いました。ただ、リアルタイムに人と競うのは苦手なので、過去問をのんびり解いているかも…。
直交する２直線の交点の軌跡

軌跡の十分性の証明を省略しないシリーズの第３弾です。直交する２直線の交点の軌跡です。

## 問題

$m$の値が変化するとき，次の2直線の交点$\text{P}$の軌跡を求めます。
$mx−y+5m=0\cdots\text{①},\,x+my−5=0\cdots\text{②}$


## 解答

$\text{①}\times m+\text{②}$より，
$(m^2+1)x+5m^2-5=0$
$\displaystyle \therefore x=\frac{5-5m^2}{1+m^2}$
①に代入して，
$\displaystyle\therefore y=\frac{5m-5m^3}{1+m^2}+\frac{5m+5m^3}{1+m^2}=\frac{10m}{1+m^2}$
$\text{P}(x,y)$とおくと，
$\displaystyle x=\frac{5-5m^2}{1+m^2}\cdots\text{③},\,y=\frac{10m}{1+m^2}\cdots\text{④}$
③，④より，$m$を消去して，
$\begin{aligned}[t]
\displaystyle \left(\frac x 5\right)^2+\left(\frac y 5\right)^2
&=\left(\frac{1-m^2}{1+m^2}\right)^2+\left(\frac{2m}{1+m^2}\right)^2\\\
&=\frac{(1-m^2)^2-4m^2}{(1+m^2)^2}\\\
&=\frac{(1+m^2)^2}{(1+m^2)^2}\\\
&=1
\end{aligned}$
$\therefore x^2+y^2=25$
点$\text{P}$は原点中心，半径5の円周上であることがわかりました。
しかし，この円周上全体を動けるかどうかはわかりません。
そこで，点$\text{P}$が円$x^2+y^2=25$上の点であるとすると，
$\text{P}(5\cos\theta,\,5\sin\theta)\quad(-\pi<\theta\leqq\pi)$
とおくことができます。このとき，①より，
$5m\cos\theta−5\sin\theta+5m=0$
$m(1+\cos\theta)=\sin\theta$
$1+\cos\theta\neq0$，すなわち，$\theta\neq\pi$として，
$\begin{aligned}[t]
\displaystyle m&=\frac{\sin\theta}{1+\cos\theta}\\\
&=\frac{2\sin\frac{\theta}2\cos\frac{\theta}2}{2\cos^2\frac{\theta}2}\\\
&=\frac{\sin\frac{\theta}2}{\cos\frac{\theta}2}\\\
&=\tan\frac{\theta}2
\end{aligned}$
$\therefore m=\tan\frac{\theta}2\quad (-\pi<\theta<\pi)$
となり，$\theta=\pi$のときを除いて，実数$m$は存在することがわかりました。

$\theta=\pi$，すなわち，$\text{P}(-5,\,0)$のときは
①で$m$を考えると，$m$は任意の実数で成り立ちます。
②で考えると，満たす実数$m$は存在しません。
①と②の両方を満たす必要があるので，この場合の実数$m$は存在しないことなります。
よって，点Pの軌跡としては$(-5,\,0)$は除かれます。

以上より、点$\text{P}$の軌跡は原点中心，半径5の円で，点$(-5,\,0)$は除いたものとなります。
QGISのデータテーブル編集のつまづき

#  属性テーブルの数値が"NULL"で、フィールド計算機などでうまく計算できない​とき

QGISの属性テーブルではNULL値があると、足し算や掛け算などの演算ができなくなってしまいます。

**解決策1：既存フィールドの更新**
・.dbfファイルをLibreで編集する


**解決策2：新しいフィールドの作成**
1. フィールド計算機を開く
2. 新しいフィールドを作る
3. 以下の式を入力して、新しいフィールドを作成(*対象フィールドを「フィールドA」と定義する)

```ruby:qiita.rb
CASE WHEN "フィールドA" IS NULL 
     THEN 0 ELSE "フィールドA" 
 END
```




# 土地利用カテゴリなどのテキスト形式を、数値に変換して新規フィールドを作成

1. フィールド計算機を開く
2. 新しいフィールドを作る
3. 以下の式を入力して、新しいフィールドを作成(*対象フィールドを「フィールドA」と定義する)

```ruby:qiita.rb
CASE WHEN "フィールドA" IS '湿原' THEN 1
     WHEN "フィールドA" IS '荒れ地' THEN 1
     WHEN "フィールドA" IS '竹林・しの地' THEN 1
     ELSE 0
END
```

​ほかにも詰まったら更新します。
QGISまだまだ全然使いこなせてないので、他にももっと良い手法がきっとあると思います。もし何かありましたら教えてください。。。
MacのAtomでPython3.x.xを適用する方法

## Python2系と3系の確認
- コンソールで、「python -V」を実行します。
- 結果が「2.x.x」の場合、「python3 -V」を実行します。
- 「python3.x.x」と出力されていればOKです。
    - もし、python3コマンドが実行できない場合、python3系がインストールされていないので、以下のURLをクリックしてインストールしてください。
    - https://qiita.com/ms-rock/items/72b8f1abc661c539bb09

## Atomに導入するパッケージの取得
- 「Welcome Guide」の「Install a Package」をクリックします。
- 「atom-runner」「script」の２種類をインストールします。

## Atomで使っているPythonの確認
- Atom上でpythonファイルを作成します。
```import sys
print(sys.version)```を実行(alt + R)し、2系か3系か確認します。
2系の場合、以下の手順を行います。

- 「Install a Package」の「設定フォルダを開く」をクリックします。
- 「./atom/packages/lib/atom-runner.coffee」ファイルの「defaultScopeMap」を探します。
- 「python：'python'」の値を'python3'に変更します。
- Atomを再起動します。
```import sys
print(sys.version)```を実行して結果が「3.x.x」と出力されたら完了です。

## お詫び
本記事では、「Python3.x.x」の日本語エラーを掲載しようと思っていましたが、上記の手順を踏んだところ解決してしまいました。
ある日突然、日本語エラーになってしまったら再度、Qiitaにてまとめようと思います。

# 修正 [2019/06/22]
パッケージ「script」の実行キーは'''com+i'''です。
こちらを実行するとなぜか2系で実行されることを確認しました。
パッケージ「atom-runner」の実行キーは'''ctrl+r'''なので、こちらをご使用ください。
* これで小一時間かかってしまいました...。
phpstorm 環境 laravel　PHPストームをコマンドラインから実行する　ショートカット作成

#PHPストームをコマンドラインから実行する場合　ショートカットを作成すると楽になる

開発環境の設定の時に同時に設定すると便利になる

（コマンドラインからの実行は次の場所にある）

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420934/ce4450ba-2d87-9d6c-9f54-e64cdf8a6513.png)


手順に写真

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420934/77094a7b-9c2e-3a49-12b2-6711ca951505.png)


![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420934/cca34dca-7be9-c3e8-6c56-9b5059cd8960.png)


![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420934/39bef6f8-d87f-29c9-2d0d-77bb76a3a26b.png)

composerならグローバル設定

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420934/cebb7c82-c86c-a9cb-e48f-8a98f1312d79.png)

composerのディレクトリの場所は、コマンドプロンプトで検索する

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420934/b7b8d154-72cf-90b1-d95e-8bbe6cc3b014.png)

同じディレクトリない,フォルダー内ににPhar拡張子のファイルがあるので、それを選択する。


artisanの設定をする場合、ツールをtoolbasedon~~に、
設定はLaravelの本体ごとに設定する。
ラジオをボタンはプロジェクトを選択。

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420934/06f023f6-2b15-4821-a445-76ff883f26bb.png)


Pathをプロジェクトのartisanに設定

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420934/81e15bda-c381-3a3f-1093-8c9561de45d1.png)
【mac】BashからZshに変えてみた

[未来電子テクノロジー株式会社](https://www.miraidenshi-tech.jp)でインターンをしている文系大学一回生です。
macでBashからZshに変えてみてのでアウトプットします。


#shellとは
BashとZshは、shellの一種です。
shellとは、人間の命令をコンピュータに伝えるプログラムのことです。
では、なぜshellが必要なのでしょうか。
コンピュータの中にはOSがあります。
OSとは、コンピュータの基本的なソフトのことです。
そのOSの中に、色々なソフトウェアが組み合わさっていることにより、OSは成立しています。
OSの中のソフトウェアで核となっているのが、カーネルです。
このカーネルは、人間の命令を聞いてくれません。
そのため、人間はshellに命令を仲介してもらう必要があるのです。

#Bashとは
Bashは多くのUNIX/Linux系OSで標準的に利用されているshellです。
shellとしての基本的機能を備えており、標準としてどこでも使えるという強みがあります。
そのため、カスタマイズをあまりせず、標準で使うユーザーが多いです。

#Zshとは
Zshは、Bash,ksh,tcshなどのシェル機能を取り込み、多数の改良が加えられたshellです。
bashの基本的機能に加え、軽量で強力な補完機能があるという強みがあります。
そのため、いろいろなカスタマイズをするユーザーが多いです。

#Zshでやったこと

##1.プロンプト等の変更
vimで.zshrcを編集しました。

```
$ vim ~/.zshrc
```

```
# 補完機能
autoload -U compinit
compinit

# 色設定
autoload -U colors; colors

# もしかして機能
setopt correct

# PCRE 互換の正規表現を使う
setopt re_match_pcre

# プロンプトが表示されるたびにプロンプト文字列を評価、置換する
setopt prompt_subst

# プロンプト指定
PROMPT=" %{${fg[yellow]}%}%~%{${reset_color}%}
%(?.%{$fg[green]%}.%{$fg[blue]%})%(?!(^)(^) <!(;%)(;%) <)%{${reset_color}%} "

# プロンプト指定(コマンドの続き)
PROMPT2='[%c]彡(^%)(^%)'

# もしかして時のプロンプト指定
SPROMPT="%{$fg[red]%}%{$suggest%}(●%)(●%) < もしかして %B%r%b %{$fg[red]%}かな? [そう!(y), 違う!(n)]:${reset_color} "

# コマンド履歴
HISTFILE=~/.zsh_history
HISTSIZE=6000000

# コマンド履歴検索
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end

# alias
alias diff="coloddiff"

export PATH="/usr/local/sbin:$PATH"
export PATH="/usr/local/sbin:$PATH"
export PATH=$HOME/.nodebrew/current/bin:$PATH
export PATH=$HOME/.nodebrew/current/bin:$PATH

alias python="python3"

export PATH="$HOME/.pyenv/shims:$PATH"
```
こうすると、

```
(^)(^) < cd web
 ~/web
(^)(^) < cd aaa
cd: no such file or directory: aaa
 ~/web
(;)(;) < fd -
(●)(●) < もしかして df かな? [そう!(y), 違う!(n)]: 
```
こんな感じになります。

##2.tumxのインストール
tmuxとは、端末多重化ソフトウェアのことです。
1 つのターミナルで操作しているシェルから実行した tmux 上で複数の仮想端末を操作できます。
画面を分割できて、サーバのログを見ながらシェルを操作できるのが良い点です。

#まとめ
プログラミング初心者なので、正直zshやtmuxのすごさがいまいち掴めていません。。。
まだまだ勉強不足なので間違いがあればどうぞご指摘ください。
【Swift】Info.plist文字数制限の罠

初投稿です。

Health Kitで睡眠時間を習得する機能を実装していた際にエラーに見舞われて散々な目に遭ったので、備忘録を残しておきます。

# はじめに + Health Kitの導入方法
本記事はPPT Developers' Blog様の[HealthKitアプリを作る（その１）](https://persol-pt.github.io/posts/healthkit-app-part1/)を参考に作成しています。
詳細はこちらを参照にしてください。

要は、
>1.プロジェクトを作る
>2.Capabilities→HealthKitをオンにする
>3.General→Linked Frameworks and Librariesに「HealthKit.framework」と>「HealthKitUI.framework」を設定
>4.Info.plistで「Privacy - Health Update Usage Description」と「Privacy - Health Share Usage Description」を追加

すれば導入ができます。
データにアクセスする許可云々は参考記事をご確認ください。

# 環境
- MacOS Mojave Ver. 10.14.5
- Xcode Ver. 10.2.1

#エラーが出てしまった！
`4.次に体重データを取得してみる`までコードを書いてみていざ実機で起動じゃい！と思ったその時こんなエラーが

```
'NSInvalidArgumentException', reason: 'NSHealthUpdateUsageDescription must be set in the app's Info.plist in order to request write authorization for the following types: HKQuantityTypeIdentifierBodyMass'
```

よくわからずGoogle先生に聞いたところ[stackoverflow](https://stackoverflow.com/questions/37863093/exception-nsinvalidargumentexception-nshealthupdateusagedescritption/42519744)にこのような記事が

>If you already added NSHealthShareUsageDescription but still get the exception.
>It may be due to that the description is too short.
>Make sure the description is longer than **12 characters** for all locales.

なんとエラーの正体は許可を求めるのに必要な理由の記述が短かったということでした。
ちなみにこのエラーがでた時には[please arrow]と書いていました。

12文字より短い文章では理由が足りん。さすがAppleさん、見極めの基準がユニークです。



以上、HealthKit導入の際に悩まされたエラーとその解決策でした。
簡単なエラーでしたがどなたかの役に立ててば幸いです。
Python 自分で関数を作ってみた : 階乗

# 目的
Pythonの基本文法を得ること(初心者向け)

# 内容
関数の概要を学ぶ。自分で関数を作って動かしてみる。

# def文で関数を作る
- 今回は「**階乗**」を目的とした関数を作成することにします。

```python:
def kaijo(n):
    if n == 1:
        return n
    return n * kaijo(n-1)
```
- 関数**kaijo**を作りました。

```python:
num = int(input("階乗したい数字 : "))
print(num,"の階乗は",kaijo(num))
```
- numに階乗したい数字を入力し、print文の中で関数呼び出しをします。
- 関数**kaijo**の引数に入力した数値を渡します。

```
階乗したい数字 : 5
5 の階乗は 120
```

- ちゃんと表示されました。階乗って普通にコード書くときにどうやるんだっけ。。。
NVIDIA JetBot の日本版BOM（部品リスト）ローテーションサーボ編

元のオリジナルは、以下です。

NVIDIA JetBot の日本版BOM（部品リスト）
https://qiita.com/lekto/items/39d7de950ce1083a1774

本家 GitHub レポジトリ；　https://github.com/NVIDIA-AI-IOT/jetbot
本家 GitHub の Wiki ； https://github.com/NVIDIA-AI-IOT/jetbot/wiki
本家 Wiki の BOM（部品表）； https://github.com/NVIDIA-AI-IOT/jetbot/wiki/Bill-of-Materials


ロボット部品

| アイテム       |       仕様 |    数    |   価格    |   リンク    |  補足　|
|:-----------------|------------------:|:------------------:|:------------------:|:------------------:|:------------------:|
| カメラ             |              Raspberry Pi Camera Module V2-8 Megapixel (IMX219) |        1        | 4,150 円　| [アマゾン](https://www.amazon.co.jp/dp/B01ER2SKFS/)  |
| 広角レンズ           |            160-degree FoV lens |       1      | 2,198 円　| [アマゾン](https://www.amazon.co.jp/dp/B07JKXSBL7/) | 
| Wi-Fi USB ドングル            |              TP-link TL-WN725N |        1 | 700円 | [アマゾン](https://www.amazon.co.jp/TP-Link-WIFI-無線LAN-デュアルモード対応モデル-TL-WN725N/dp/B008IFXQFU/)       
| servo               |                GWS S35 |         2         | 900円| [秋月電子](http://akizukidenshi.com/catalog/g/gM-08305/)|
| Motor driver             |             PCA9685 |       1       | 680円|[アマゾン](https://www.amazon.co.jp/HiLetgo-PCA9685-16チャンネル-12-ビット-Arduinoに対応/dp/B01D1D0CX2/) |
| 筐体          |           2.5mmMDF レーザーカット用データ |      1    |  ー |[レーザーのデータ](https://github.com/anthrax007/jetbot/blob/master/assets/sumbotjr-2_5mm-custom_for_jetson.pdf)
| ボール          |           鋼球(精密ボール) SUJ2 ミリサイズ |      1    |  118円 |[モノタロウ](https://ihc.monotaro.com/item/C38448155/)
| ボールキャスター          |           ３Dプリンタ出力 |      1    |  ー |[STLデータ](https://github.com/FabLabKannai/SumobotJr/tree/master/3d_printer/ball_caster)
| バッテリー          |           2x output, 10000mAh |      1    |  1,999円 |[アマゾン](https://www.amazon.co.jp/dp/B07MGRQDZF/)
| OLED display          |           128x32 OLED |      1    |  720円 |[アマゾン](https://www.amazon.co.jp/HiLetgo®-シリアルOLED液晶ディスプレイモジュール-128x32-Arduino-Arduinoに対応/dp/B01M8JV310/)
| SD CARD          |           128GB |      1    |  1999円 |[アマゾン](https://www.amazon.co.jp/gp/product/B07HHD7C7T/)
PowerQueryで政府統計ポータルサイトe-Statにアクセスする

#はじめに
e-StatのデータにPowerQueryで直接アクセスしてデータを取得する方法を試してみた。

#e-Statとは
>日本の政府統計に関する情報のワンストップサービスを実現することを目指した政府統計ポータルサイトです。これまで各府省等が独自に運用するＷｅｂサイトに散在していた統計関係情報を本サイトに集約、社会の情報基盤たる統計結果を誰でも利用しやすいかたちで提供することを目指し、各府省等が登録した統計表ファイル、統計データ、公表予定、新着情報、調査票項目情報、統計分類等の各種統計関係情報を提供していきます。

様々なデータをサイト上で表示したり、CSV、XLSX形式でダウンロードしたりすることができる。けど今回はダウンロードはせずにPowerQueryのWEBコネクタで直接つないでみる。


#e-StatのAPI機能を利用する準備
[e-Stat API機能利用ガイド](https://www.e-stat.go.jp/api/api-info/api-guide)に従って、マイページ > API機能(アプリケーションID発行)から「アプリケーションID」を発行する。
名称と概要は自分で適当に決めて入力。URLはガイドのとおり「`http://localhost/`」とした。発行ボタンを押すとappIdが表示される。
![PQ_appid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/7f0c5a3c-ae5a-41f9-ecbc-49d5589f3423.png)

#読み込むデータのAPIリクエストURLを取得
今回は「社会・人口統計体系 都道府県データ 基礎データ」の中の「B4106_降水日数（年間）」を読み込むことにする。
https://www.e-stat.go.jp/dbview?sid=0000010102
上記のページで表示項目選択メニューから「B4106_降水日数（年間）」を選んで表示を絞り込んだらAPIボタンを押して「API リクエスト URL」を取得する。
![API_REQ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/9179775d-16fd-3596-1890-ea3f9dc1a3fc.png)
このURL内の「appId=」の後にアプリケーションIDを挿入して使用する。
`http://api.e-stat.go.jp/rest/2.1/app/getStatsData?cdCat01=B4106&appId=<アプリケーションID>&lang=J&statsDataId=0000010102&metaGetFlg=Y&cntGetFlg=N&sectionHeaderFlg=1`

#PowerQueryで読み込む
webコネクタで先ほどのURL（アプリケーションIDを挿入したもの）を入力。

「CLASS_OBJ」と「VALUE」にチェックを入れて「編集」を押す。
![PQ_navi.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/8c98a3fb-ade0-178e-36b8-19146f1d9d69.png)

VALUEの中身はこんな感じ。
![PQ_VALUE.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/51b8b0d3-0da0-34e3-8a85-e0c033722ca8.png)
Element:Text　降水日数、　Attribute:area　地域名、　Attribute:time　調査年
のデータを利用する。その他は今回は使わないので気にしない。
地域を示す「AREA」が数値コードで書かれていてどこだかわかりにくい。「CLASS_OBJ」に地域名とコードとの対応が書かれているのでのぞいてみる。


「CLASS_OBJ」の「CLASS」列を展開する。「Attribute:code」「Attribute:name」にチェックを入れてOKを押す。
![PQ_expand.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/b109a0f7-c93e-13ec-b2b6-52f7862b66aa.png)

するとこんな感じになる。
![PQ_CLASSOBJ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/c7457736-c2cb-57db-c26a-f2e9eae1f27b.png)

あとは「VALUE」の「AREA」と「CLASS_OBJ」の「CLASS.AttributeCode」とでマージしてごにょごにょすればこんな感じになって・・・
![PQ_merge.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/b65fdfdb-a634-8ac3-9bae-6b9d5a457543.png)
PowerBiで仕上げるとこうなる。
![PBI_map.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/942a2f73-df55-71e1-a3f9-e2c0d91ad157.png)
日本海側が降水日数が多いことが一目瞭然！

#参考
政府統計の総合窓口(e-Stat)のAPIを使ってみよう
https://qiita.com/mima_ita/items/44f358dc1bc4000d365d
Formの中にFormを仕込んで、post送信を別々に飛ばす。(Laravel HTML)

必要なものを用意します。

###ボタン用のルート

```:web.php
Route::post('/post1', 'TestController@post1')->name('post1');
Route::post('/post2', 'TestController@post2')->name('post2');
```

###コントローラーのメソッド

```:TestController.php
public function post1()
{
    dd('post1');
}

public function post2()
{
    dd('post2');
}
```
###普段のViewでの使い方

```:test.blade.php
@extends('layouts.app')

@section('content')
    {{Form::open(['route' => 'post1', 'method' => 'post'])}}
    {{Form::submit()}}
    {{Form::close()}}
@endsection
```

<img width="336" alt="Screenshot_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325600/d6351452-4328-6247-7c72-1496c04c22db.png">
ボタンを押すと、ちゃんと飛びました。

###単純にやってみる

```:test.blade.php
@extends('layouts.app')

@section('content')
    {{Form::open(['route' => 'post1', 'method' => 'post'])}}
    {{Form::submit()}}
    {{Form::open(['route' => 'post2', 'method' => 'post'])}}
    {{Form::submit()}}
    {{Form::close()}}
    {{Form::close()}}
@endsection
```

<img width="233" alt="Screenshot_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325600/83e6fe1a-460f-06a8-337a-0a8675e0a619.png">
<img width="336" alt="Screenshot_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325600/92eedfc7-5c1e-9fa7-187a-8baa554c1aa0.png">
どっちのボタンを押しても、post1に飛んでしまいます。
<img width="560" alt="Screenshot_3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325600/bc0eca53-8828-5bd2-c19e-17bc1177ee08.png">
二つ目のFormタグが消えてしまってます。
<b>理由としましては、HTMLの使用として、Formを入れ子にするのは、禁止されており、\<form>の中の\<form>は認識しないで、余計な\</form>は無視します。</b>

そのため、Viewを修正します。

```:test.blade.php
@extends('layouts.app')

@section('content')
    {{Form::open(['route' => 'post1', 'method' => 'post'])}}
    {{Form::submit()}}
    {{Form::open()}}
    {{Form::close()}}
    {{Form::open(['route' => 'post2', 'method' => 'post'])}}
    {{Form::submit()}}
    {{Form::close()}}
    {{Form::close()}}
@endsection
```

<img width="540" alt="Screenshot_5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325600/cdbf8b3e-b584-110e-f761-db79c2de2aa7.png">
ちゃんとFormタグが二つあります。
<img width="336" alt="Screenshot_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325600/2ee179b8-c748-dda5-b73f-30ab166ca90e.png">
<img width="343" alt="Screenshot_4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325600/e653f8fc-cef9-8a40-4ec0-626324b1f0f0.png">
ちゃんと飛びました。[参考にさせていただいた記事](https://ja.stackoverflow.com/questions/30651/form%E3%82%BF%E3%82%B0%E3%81%AE%E5%85%A5%E3%82%8C%E5%AD%90%E3%81%A8%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E8%A7%A3%E9%87%88)
Git Github ブランチ作成

ブランチ作成のコマンドをメモ｡

いま自分がmasterにいるか以下のコマンドで確認してください｡
```$git branch -a```または```$git branch```
```*master``` となっていればOKです｡(*が今いるところです｡)
`$git branch ブランチ名`
`$git push -u origin ブランチ名` 


masterにチェックアウトもする場合は
```$git checkout master```
 の後に
```$git branch -a```または```$git branch```
してmasterにいることを確認してください｡

```$git checkout -b 作成するブランチ名```
```$git push -u origin 作成したブランチ名```
これでブランチ作成できました｡

ブランチができたことを確認｡
```$git branch -a```または```$git branch```
して完了｡




---
以下ブランチの必要性について｡

Githubの使い方について､私は未経験ですが聞いた話を元にメモです｡
初心者の頃はgithubを使うのにmasterにpushばかりしていましたが､
本来はmasterに直でpushすることはないです｡
githubの使い方の流れを簡単に説明すると､
ブランチを作成して､作業はブランチにpushして､プルリクして､mergeして
という流れで､masterを作り上げていきます｡

(もっと詳しくいうと､masterの手前にもう1つブランチがあって､そのブランチにmergeしていき試作品を完成させて､問題がなければその完成品をmasterにあげる流れになります｡masterには完成品しかmergeさせないようです｡学び始めた当初はmasterにばかりpushしていたので気づきませんでしたが､masterは本来超神聖な場所というイメージになりました｡)

---
動画編集を簡単にするソフトを作りたい


旅行で取りためている動画のファイルを、簡単に編集できるソフトを作りたいと考えています。

それを考えるに至った背景としては、数々動画編集ソフトはあるのですが、
結局フォーマットやプロジェクトは統一されておらず、流用が難しいというのが難点です。

動画の編集で一番、めんどうな作業は、いわゆる荒編集というもので、
それは、取ってきた素材の中身について

・撮影ミスなどの明らかな不要フレームの除去
・撮影した素材の中から、使えるシーンの抽出
・素材の簡単なタグ付け（何が移っているのか？）

この段階で、ビデオエディタを使ってしまうと、マウス操作やＪＯＧ操作なども含めて
かなり体力を使います。

そこで、いま考えているコンセプト

手順）

１）動画ファイルの保存フォルダを指定
２）すべての動画、写真を時系列でソート
３）ファイルを順番に再生（再生の場所は、任意に変更可能）
４）再生中に、素材で使えそうなカットが出てきたら、その時点でマーキングを実施
→ このマーキングと言うのは、あくまで人力の作業にはなりますが。ビデオを見ながら、スペースキーをポンポンと叩くようなイメージ
５）マーキングされた、タイムレコードから、その前後 ±数秒からIN,OUTのタイムを記録
６）抽出した再生リスト（ファイル名、INタイム、OUTタイム）を作成
７）プレビューで内容をチェックする。
８）INタイム、OUTタイムは、数値で微調整を行う。
９）全体の流れが確認できたら、最後にファイルへ出力

という感じです

具体的なアーキテクチャについて

アーキテクチャとしては、もっとも直感的に分かりやすいのは、
表計算ソフトＥＸＣＥＬを使います。

データベースのカラムとしては
ファイル名（フルPATH名）、タイムフレーム（スタート）、タイムフレーム（エンド）、タイムフレーム（ＩＮ）、タイムフレーム（ＯＵＴ）
で考えています。

ＶＢＡで直接、動画再生できる方法を探していても見つからなかったので、
現時点では、Ｃ＃でアプリを作り、Ｃ＃→EXCELを参照しながら、
再生させることを考えています。

実装について
・C#を使って書き始めようとしています。
・動画の再生には、VLCの中にC#のライブラリがあるというので、これを参考にしようと思います。
・カット出力は、FFMPEGを使うことを考えています。

ひとまず、このようなコンセプトで書き始めてみようと思います。
結局は、万人が理解できる、慣れたＵＩというのは、ＥＸＣＥＬだという事でしょうか・・・
適当に何秒かで切るような、カットのシークエンスなど関数でできそうですし
@Component.Builderの代わりに@Component.Factoryを使う

# 概要

ApplicationのContextをインジェクトしたい場合、Moduleのコンストラクタの引数にとるか、Component.Builderを定義していましたが、Dagger2.22から ~~`@Component.Builder`~~ `AndroidInjector.Builder`がdeprecatedになったので対応メモ。

# @Component.Factory

`@Component.Builder`に加えて`@Component.Factory`が追加されました。

今までは

```kotlin
@Component(...)
interface ApplicationComponent {
    
   @Component.Builder
   interface Builder {
        @BindsInstance
        fun context(context: Context): Builder

        fun build(): ApplicationComponent
   }
}
```

あるいはdagger-androidを使っている場合は

```kotlin
@Component(...)
interface ApplicationComponent : AndroidInjector<MyApp> {
    
   @Component.Builder
   abstract class Builder : AndroidInjector.Builder<MyApp>
}
```

の様に書いていました。
`@Component.Factory`を使った場合は`create`メソッドを一つだけ定義するようにします。
そのため、`@BindsInstance`アノテーションがメソッドの引数に指定できるようになりました。

```kotlin
@Component(...)
interface ApplicationComponent {
    
   @Component.Factory
   interface Factory {
        fun create(@BindsInstance context: Context): ApplicationComponent
   }
}
```

dagger-androidを使う場合は

```kotlin
@Component(...)
interface ApplicationComponent : AndroidInjector<MyApp> {
    
   @Component.Factory
   interface Factory : AndroidInjector.Factory<MyApp>
}
```

のようになります。
他にもBindsInstanceしたいものがあった場合などにはcreateの引数に取れば良さそう。
なので、Builderと比べて、オブジェクトの渡し忘れがコンパイルで検知されるので、ミスが減りそうです。

以上！
osmc on raspi-zeroW にopenvpnを入れる(#2)

- vpn経由で、自宅NW(192.168.0.0/24)にアクセスを可能とする
- 内部DNS(192.168.0.1)を通知する

過去からの変更箇所のみ記載

[過去例](https://qiita.com/harasakih/items/4c0e4fe24b144e178b46)


# /etc/openvpn/server.conf
- ipv6化して、外部解放できるポートが限られているので、Listenするポート番号はHomeGWでポートフォワードしたポートに合わせる。

```/etc/openvpn/server.conf
# cat /etc/openvpn/server.conf  | grep -v '^[#;]' | grep -v '^\s*$' 

port xxxx                                # HomeGWでフォワードしたポート
proto udp
dev tun
ca   /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key  /etc/openvpn/server.key
dh   /etc/openvpn/dh2048.pem
server 10.8.0.0 255.255.255.0            # serverのアドレス
push "route 192.168.0.0 255.255.255.0"   # serverのバックのNW ＊追加
push "redirect-gateway def1 bypass-dhcp" # clientの通信は全て、VPNへ
push "dhcp-option DNS 192.168.0.1"       # clientに通知するDNS
keepalive 10 120
tls-auth /etc/openvpn/ta.key 0
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log /var/run/openvpn.log
explicit-exit-notify 1
```

# systemctlで起動
```
systemctl restart openvpn
systemctl enable  openvpn
```

# iptablesのポートを開放 ---> やらない ---> やはり必要
exit 0 の前に2行追加。xxxxは server.conf で指定したポート。
wlan0は、物理IF名 

```/etc/rc.local
iptables -A INPUT -p udp -m state --state NEW -m udp --dport xxxx -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o wlan0 -j MASQUERADE
```

# VPNサーバにするためIPフォワードを有効にします。 ---> 必要　
```/etc/sysctl.conf
net.ipv4.ip_forward=1
```

## reboot＆NW構成図
<PRE>
      Inter-net
        ||
        ||  Global-address
    [ www.xxx.yyy.zzz ] IPoE-router
    [   192.168.1.1   ]
        ||
        ||
    [  192.168.1.254  ] Home-router
    [  192.168.0.1    ] 
        ||  内部DNS
        ||               192.168.0.0/24
++=======================(Home-NW)=========++
            ||             
 wlan0   [  192.168.0.102  ] VPN-Server 
 tun0    [  10.8.0.1       ] 
            ||
            ||               10.8.0.0/24
++=======================(VPN-NW)==========++
      ||             
      ||
  [ 10.8.0.2 - ** ] VPN-Clients

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
  inet 127.0.0.1  netmask 255.0.0.0
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
  inet 10.8.0.1  netmask 255.255.255.255  destination 10.8.0.2
wlan0: flags=-28605<UP,BROADCAST,RUNNING,MULTICAST,DYNAMIC>  mtu 1500
  inet 192.168.0.102  netmask 255.255.255.0  broadcast 192.168.0.255

受信先サイト ゲートウェイ  ネットマスク   フラグ Metric Ref 使用数 インタフェース
0.0.0.0      192.168.0.1   0.0.0.0         UG    0      0        0 wlan0
10.8.0.0     10.8.0.2      255.255.255.0   UG    0      0        0 tun0
10.8.0.2     0.0.0.0       255.255.255.255 UH    0      0        0 tun0
192.168.0.0  0.0.0.0       255.255.255.0   U     0      0        0 wlan0
192.168.0.1  0.0.0.0       255.255.255.255 UH    0      0        0 wlan0

</PRE>
expoでdefaultの画面の向きを設定する。

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)

Expoには、ScreenOrientation Apiが存在し、このAPIを使って、スマホアプリの画面の向きを変えることが出来る。

しかし、もっと簡単な方法を見つけたので、共有する。

以下のように、app.jsonにアプリのデフォルトのランドスケープを記述出来た！

コード量が減るのが大きいし、パフォーマンスも良い！
ScreenOrientationよりこっちの方がスマートだねー

```json
// app.json
{
  "expo": {
    ...
    "orientation": "landscape"
  }
}
```
Debian系でMySQLに接続できない時のエラー解決方法

#環境
- OS：Kali Linux 2019.2
- MySQL：Ver 15.1 Distrib 10.3.15-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

#問題
以下のように、
MySQLに接続しようとするとエラーが発生する。

```
# mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```

#原因
MySQLクライアントが呼び出す
UNIXドメインソケットと、
MySQLサーバーが呼び出す
UNIXドメインソケットが異なるため。

※ UNIXドメインソケットとは、
　 同一ホスト内で通信を行うためのソケット。
　 実態はファイル。

#解決方法
サーバーが呼び出す
UNIXドメインソケットのファイルパス名を、
クライアントに合わせて変更する。

####変更前
```/opt/lampp/etc/my.cnf（一部抜粋）
# The following options will be passed to all MySQL clients
[client]
socket		= /opt/lampp/var/mysql/mysql.sock

# The MySQL server
[mysqld]
socket		= /opt/lampp/var/mysql/mysql.sock
```
####変更後
```/opt/lampp/etc/my.cnf（一部抜粋）
# The following options will be passed to all MySQL clients
[client]
#socket		= /opt/lampp/var/mysql/mysql.sock
socket		= /var/run/mysqld/mysqld.sock

# The MySQL server
[mysqld]
#socket		= /opt/lampp/var/mysql/mysql.sock
socket		= /var/run/mysqld/mysqld.sock
```
プログラミング講習（仮）04

#プログラミング講習（仮）04

#目的
勉強したい人の支援

#内容
ポインタ
動的配列

C++使う人はあまり気にしないほうがいいかもしれない

#例1
```prex04a.c

#include <stdio.h>

void main()
{
	int* p;

	printf("%%p : %p\n", p);
	printf("%%d : %d\n", p);
	printf("%%d : %d\n", *p);
}
```
##コンパイル結果
```
prex04a.c:8:17: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
  printf("%%d : %d\n", p);
                ~^
                %ls
```
エラーじゃないけど
ポインタと通常変数を間違えてるぞっていうお叱り

##実行結果
```
%p : (nil)
%d : 0
Segmentation fault (コアダンプ)
```
nil -> メモリ確保してないし
コアダンプ -> 確保してない変数触ったし

#例2
``` prex04b.c
#include <stdio.h>
#include <stdlib.h>

void main()
{
	int* p;
	p = (int*)malloc(sizeof(int) * 1);

	*p = 42;

	printf("%%p : %p\n", p);
	printf("%%d : %d\n", *p);
}
```
2行目 : malloc 使うために include
malloc : メモリ確保　ここでは１つのint

##実行結果
```
%p : 0x5621df8cd260
%d : 42
```
0x562(ry
番地にメモリ確保した
その値に42にを格納している

#例3
``` prex04c.c
#include <stdio.h>
#include <stdlib.h>

void main()
{
	int* arr = (int*)malloc(sizeof(int) * 4);

	arr[0] = 11;
	arr[1] = 31;

	arr[2] = arr[0] + arr[1];
	arr[3] = arr[1] + arr[2];

	printf("%d, %d\n", arr[2], arr[3]);
}
```

##実行結果
```
42, 73
```
#例4
```prex04d.c
#include <stdio.h>
#include <stdlib.h>

void main()
{
	int* arr = (int*)malloc(sizeof(int) * 4);

	*arr = 11;
	arr++;

	*arr = 31;
	arr++;
	
	*arr = *(arr - 1) + *(arr - 2);
	arr++;
	
	*arr = *(arr - 1) + *(arr - 2);

	arr -= 3;

	printf("%d, %d\n", arr[2], arr[3]);
}
```
ブログ記事もメモもgitで管理しちゃえ

![IMG_1956.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403350/756bd0c9-d6bb-4841-1928-055eaa5308f8.jpeg)


むぎゅとスタバ。カフェラテですら苦くて飲めないみやゆーです。

先日会社のOJTでgit研修があったのですが、先輩がgitを意外な目的で利用していました。

それは、**ブログの下書きをgitで管理する**というもの。

![img_01896a73e353198bb4403229798c4b716b73317b_detail.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403350/3508fcc3-5d35-5cd6-d3bd-92b2bf468ee4.jpeg)
(**えっ...それQiitaの下書きに入れればよくない...?**)

と思ったのは私だけでしょうか。gitって、基本的に"プログラムを管理するツールというイメージ"だったので、目から鱗でした。

とりあえず、メモとかも含めてmdファイルをgit上で管理すればそれなりに利点もあると考え、私も実践してみることにしました。

# メモをgitで管理するメリット

- ネットワーク上であればどこでもプルできる
- 間違えてファイルを削除してしまったとき、復元できる
- 変更箇所が分かりやすい
- 共有リポジトリにしておけばメモの公開も可能

書き出してみると、Qiitaの下書きやストックに貯めるよりもいろいろメリットある。**先輩すみませんでした。**

# やってみた⊂(^ω^ )⊃
**<font color="Red">注意⚠<br>この記事はgitの知見がある程度ある人向けです。gitの導入方法などわかんないよ!って人は静かに、ゆっくりブラウザバックしてください。そう...ゆっくり...</font>**<br>

<img width="775" alt="スクリーンショット (15).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403350/e11f1191-fc56-c2bc-e65f-d65ae9e90016.png">


とりあえずプライベートリポジトリを作ってみました。

```
├── README.md
├── .vscode
│   └── settings.json   
├── <会社用メモ>
│   ├── <会社用メモ1.md>
│   ├── <会社用メモ2.md>
│   ├── <会社用メモ3.md>
│   └── ...
├── まとめ
│   ├── <○○について.md>
│   ├── <○○について.md>
│   ├── <○○について.md>
│   └── ...
├── レポート
│   ├── <レポート1.md>
│   ├── <レポート2.md>
│   ├── <レポート3.md>
│   └── ...
├── 日報
│   ├── <○月○日の日報.md>
│   ├── <○月○日の日報.md>
│   ├── <○月○日の日報.md>
│   └── ...
└── ブログ
    ├── <ブログ記事1.md>
    ├── <ブログ記事2.md>
    ├── <ブログ記事3.md>
    └── ...
```

だいたい会社用のメモ、技術的なメモ等、メモも用途によってファイル分けしています。

# さらにやってみた⊂(^ω^ )⊃

試しに、メモを一つ追加してみます。vscodeでプルしてきたファイルを開きます。

<img width="960" alt="スクリーンショット (17).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403350/29c9fbb6-c6a4-5efd-f6bf-3ae8681458dd.png">

新しくtestファイルを作ります。

<img width="960" alt="スクリーンショット (21).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403350/f9fe8f22-6a11-ffe9-515f-dd2aef2974ef.png">


適当に中身を書きます。

<img width="960" alt="スクリーンショット (22).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403350/368ad23b-7ccb-7a86-5b05-ac958bc1c6a3.png">


**mdファイルでAAを書くアホは私です。**

Ctrl + K → V でプレビューを表示できます。

<img width="960" alt="スクリーンショット (23).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403350/1f7132ea-3907-d892-b617-e1797c383aa1.png">

案の定崩れる。

それでは早速gitにpushしましょう。Ctrl + Shift + @ でターミナルを開きます。

```console
#ステージング
$ git add .
#コミット
$ git push -m 'testの追加'
#プッシュ
$ git push
```

ブランチも特に切る必要はないので、これだけです。GitHubで確認してみましょう。

<img width="762" alt="スクリーンショット (30).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403350/80edc6dd-90a6-9c7d-1aa0-5c392af8cbf2.png">
<img width="758" alt="スクリーンショット (31).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403350/835bfe8f-0b19-1b39-c400-528fe9dfe1ba.png">


ちゃんと保存されてる!**やったぜ。**

<img width="763" alt="スクリーンショット (32).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403350/7d8e0adc-d603-08ef-9832-138a555b9b6d.png">


ここでも崩れる。やはりAAは廃れる運命なのね...

皆さんもブログやメモをgitで管理してみてはいかがでしょうか。みやゆーでした。
Python3 エンジニア認定基礎試験の勉強方法について

# Pythonエンジニア基礎認定試験について
２０１７年度から始まった民間資格です。

問題数は４０問。
CBT式の選択式で合格ラインは７割。
結果はすぐその場で出るタイプの試験。
ExcelとかWordのMOS試験を実施している試験会場で受けられます。

# 試験を受けた背景
Python暦は一年くらい。
でも実はあまり業務で使っていなくて、時々Pythonのセミナーなんかに出る程度。

受けた理由としては、自分にとって一つ強い言語を作りたくて取ってみました。



# 勉強方法
実は一度落ちてます。二度目の受験で受かりました。
というのも、Web上で公開されている模擬試験で合格ラインに達していたので
つい油断してしまいました。あと公式本を買わずに勉強しなかったのが敗因かな？

模擬試験サイト（メールアドレスの登録が必要）
https://diver.diveintocode.jp/exam

要した勉強期間としては、GW期間にやった１０日間くらい。


使った参考書は、

[Pythonチュートリアル　/ 著作:Guido van Rossum](https://books.rakuten.co.jp/rb/16554148/)
[みんなのPython/ 著作：柴田淳](https://books.rakuten.co.jp/rb/14583659/?l-id=search-c-item-text-01)
[文系プログラマーのためのPythonで学び直す高校数学 /著作：谷尻かおり](https://books.rakuten.co.jp/rb/15761722/?l-id=search-c-item-text-01)



初心者は公式本だけではなかなか合格しにくいと思うので、
別の本で確認しながら勉強するのがおすすめ。
あとは発表されている試験範囲をみながら、出やすいところをチェックするのもいいかも。
lengthの使い方

#lengthの使い方
以下のケースだと、登録した商品個数を素数として出力できます。（登録までのソースは省略しています）

```
cart = []        

while true do
  puts "商品数: #{cart.length}"
  puts "[0]商品をカートに入れる"
  unless cart.empty?
    puts "[1]カートを確認する"
  end
  puts "[2]アプリを終了する"

```
git mergeでnot something we can mergeエラー

git mergeでマージをしようとしたら、not something we can mergeというエラーが出てマージできなかった。

# タイプミスが原因？
調べてみると、ブランチ名のタイプミスが原因という記事を見つけた。

[git mergeでnot something we can mergが出来ない時の対処法](https://qiita.com/somarihair/items/8580e9964099e6923bde)

しかし、このときタイプミスはしていなかった。

# 本当の原因は？
マージされる側のブランチがリモートにあり、ローカルにはなかったのでマージできなかっただけだった。
ハッシュは使い分け必要なのか？

#ハッシュの使い分けに関して

```
post = {}

post[:name]
post[:name]  = gets.chomp  
post[:price]  = gets.to_i
post[:count] = gets.to_i
```

```
name = gets.chomp
price = gets.to_i
count = gets.to_i

post = {name: name,price: price,count: count}
```

#結論どちらも一緒みたいです

***一緒なら文字数が少なく、先にハッシュだとわかる１つ目がおすすめだと思います！***
nuxtでSNSボタンを自分で実装した

twtitter, facebook, lineのsnsボタンを実装した。
ogpの設定できていればページで使われてる画像がタイムライン上に表示されます。
`hoge.com`部分を書き換えればそのまま使えると思います。

```vue:components/Sns.vue
<style scoped>
ul.sns {
  display: flex;
  flex-wrap: wrap;
}

ul.sns li {
  list-style-type: none;
  padding: 0.5em 0.5em 0 0;
}
</style>

<template>
  <div>
    <ul class="sns">
      <li>
        <a :href="twitterURL" target="_blank" rel="nofollow">
          <img
            alt="twitter"
            src="~assets/images/twitter.svg"
            :width="size"
            :height="size"
          />
        </a>
      </li>
      <li>
        <a :href="facebookURL" target="_blank" rel="nofollow">
          <img
            alt="facebook"
            src="~assets/images/facebook.svg"
            :width="size"
            :height="size"
          />
        </a>
      </li>
      <li>
        <a :href="lineURL" target="_blank" rel="nofollow">
          <img
            alt="line"
            src="~assets/images/line.svg"
            :width="size"
            :height="size"
          />
        </a>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  props: {
    title: {
      type: String,
      default: '',
      required: true
    }
  },
  computed: {
    size() {
      return 36
    },
    url() {
      return `https://hoge.com${this.$route.path}`
    },
    fixedTitle() {
      return encodeURIComponent(this.title)
    },
    fixedContent() {
      return encodeURIComponent(`${this.title} ${this.url}`)
    },
    twitterURL() {
      return `https://twitter.com/intent/tweet?url=${this.url}&text=${
        this.fixedTitle
      }`
    },
    facebookURL() {
      return `https://www.facebook.com/sharer/sharer.php?u=${this.url}&t=${
        this.fixedTitle
      }`
    },
    lineURL() {
      return `http://line.me/R/msg/text/?${this.fixedContent}`
    }
  }
}
</script>
```
virtualenvwrapper.hook_loaderのエラーの時

## 必要なパッケージ
virtualenv
virtualenvwrapper
どちらもpipからのインストール

### どうしてこんなのを出したか
エラーの時，　だいたいNoNameだと思う．

virtualenvwrapper.hook_loaderがないとか

# コード
そんな時は，
```bash
$ python -V
Python *.*.*
```

これで，出てきたバージョン(`*.*.*`)を，`bashrc`に入れる
最初の`*.*`まで
```bash
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
        export WORKON_HOME=$HOME/.virtualenvs
        export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python*.* # <-ここに入れる
        export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
        source /usr/local/bin/virtualenvwrapper.sh
fi
```
Atomのテーマを変更

## 使用しているテーマの確認
- Atomを開きます。
- 「Welcome」の「Install a Package」をクリックします。
- 「テーマ」をクリックします。
- 初期状態は以下の画像と同じだと思います。
<img width="1440" alt="スクリーンショット 2019-06-08 18.53.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403944/59941ef5-0816-c087-8fc2-b3f9a6de89dd.png">
- 「インターフェーステーマ」は、タブやステータスバーなどの見た目が変更されます。
- 「シンタックステーマ」は、テキストエディタの内部が変更されます。

## テーマの選択
ここから、テーマの選択をしていきたいと思います。
テーマの数は膨大なので、以下のサイトを参考に選択したいと思います。
http://niisi.hatenablog.jp/entry/2016/08/21/183000
今回、僕が選択したテーマは「pen-paper-coffee-syntax」を選択しました。
明るい色でプログラミングをするのは目に悪いですが、やっぱり見た目が好きだったので、こちらを選択しました。

- テーマが決まったら、「Install a Package」の右側に「テーマ」が存在するのでクリック。
- インストールしたいテーマ名を入力し、「install」をクリック。

## テーマの反映をする
テーマを選択できたら、反映をしていきます。
- 「テーマ」を選択し、「シンタックステーマ」のプルダウンメニューをクリックします。
- 先ほどインストールしたテーマを選択します。
<img width="1440" alt="スクリーンショット 2019-06-08 19.22.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403944/359dcd07-efa8-0b3c-1986-2b8de458e527.png">
- 僕の場合、色合いを考え、「インターフェーステーマ」も変更しました。

以上でテーマの変更が完了です。
Terraform dynamic blockの書き方


# Summary
Terraform 0.12 新機能の Dynamic configuration blocks.
List と Map　の２種類書き方を記載します。

## List
```
locals {
  empty_array = []

  environment = "${var.variables != null ? list(var.variables) : local.empty_array}"
}

resource "aws_lambda_function" "this" {
...
  dynamic "environment" {
    for_each = "${local.environment}"

    content {
      variables = "${environment.value}"
    }
  }
...
}
```

## Map
```
locals {
  empty_map   = {}
　vpc_config_map = "${map(
    "subnet_ids", var.subnet_ids,
    "security_group_ids", var.security_group_ids
  )}"

  vpc_config = "${var.subnet_ids != null ? local.vpc_config_map : local.empty_map}"
}

resource "aws_lambda_function" "this" {
...
  dynamic "vpc_config" {
    for_each = "${local.vpc_config}"

    content {
      subnet_ids         = "${vpc_config.subnet_ids}"
      security_group_ids = "${vpc_config.security_group_ids}"
    }
  }
...
}
```
仮想環境のVagrantでPHP環境を整える

## 目的
業務で仮想環境作成の際の調査等を省くための効率化を図る

## 対象
・業務で仮想環境を必要としている方
・仮想環境を試してみたい方

## 準備
・以下の公式サイトからCentOSのboxファイル（[リンク] (https://blog.centos.org/2019/01/updated-centos-vagrant-images-available-v1812-01/)）を利用

・オラクルのVirtualBoxを事前にパソコンに入れておきましょう 

・[Vagrant](https://www.vagrantup.com/)をインストール

## boxファイル指定してvagrant初期化～起動、終了まで
1. vagrant init centos7 https://～.box  
    ⇒  直接URL指定またはboxファイルをダウンロードしたものを指定
2. vagrant up  仮想環境(VM)起動
3. vagrant ssh
4. yumコマンドでPHPインストール等  ⇒  sudo yum install -y php  
5. vagrant package でローカルにboxファイルが作成される
6. vagrant halt 仮想環境(VM)を終了  

## その他  
PCスペックはある程度良いパソコンで試すこと
nuxt + Firebaseで動的にサイトマップを作成する方法

少し手こずったのでメモ

まずは yarn or npmでインストール
`yarn add @nuxtjs/sitemap`

次にnuxt.config.jsを編集

```js:nuxt.config.js
const pkg = require('./package')
+ const axios = require('axios')

module.exports = {

  ...

  modules: [
+    '@nuxtjs/sitemap'
  ],

  ...

+  sitemap: {
+    path: '/sitemap.xml',
+    hostname: 'https://hoge.firebaseapp.com/',
+    generate: true,
+    exclude: ['/admin/**'],
+    async routes() {
+      const fuga = await axios.get('https://hoge.firebaseio.com/fuga.json')
+      const arr = []
+      const obj = fuga.data
+      for (const key in obj) {
+        arr.push({
+          url: `/fuga/${obj[key].id}`,
+          changefreq: 'daily',
+          priority: 1
+        })
+      }
+      return arr
+    }
+  }
}

```
1. axiosをrequire or import
2. modulesに@nuxtjs/sitemapを追加
3. sitemapを追加する。FirebaseのREST APIを`axios.get`してPATHの元になるIDなどを取得。urlリストを作成し返す
capisranoでwheneverの設定を更新

# 結論
Capfile に以下の設定を追加するのみでよかったです。
deploy.rb で設定を上書きするような記事もありましたが、
普通の使い方をするのであれば上書きしなくて ok な気がします。

```Capfile
# 以下を追加
require 'whenever/capistrano'
```

```config/deploy.rb
# ここでは何も指定しない
```

# 実行されるコマンド
dryrun で実行確認したところ、コマンドは以下のように出ていました。
migration した後のタイミングで、 crontab の更新がくるようです。
`application = fetch(:application)` 
`environment = fetch(:rails_env)`

```
00:00 deploy:migrating
      01 RBENV_ROOT=/usr/local/rbenv RBENV_VERSION=2.6.3 /usr/local/rbenv/bin/rbenv exec bundle exec rake db:migrate
00:00 whenever:update_crontab
      01 RBENV_ROOT=/usr/local/rbenv RBENV_VERSION=2.6.3 /usr/local/rbenv/bin/rbenv exec bundle exec whenever --update-crontab {application} --set environment={ENV} --roles=app,db

```

#実装を確認
特殊なことをしたい時は、以下の値を set しておけば上書きできるようになっていましたが、余計なことはしなくてもやりたいことができたのでそのままにしました。

```recipes.rb
# whenever-0.11.0/lib/whenever/capistrano/v2/recipes.rb

Whenever::CapistranoSupport.load_into(self)

_cset(:whenever_roles)        { :db }
_cset(:whenever_options)      { {:roles => fetch(:whenever_roles)} }
_cset(:whenever_command)      { "whenever" }
_cset(:whenever_identifier)   { fetch :application }
_cset(:whenever_environment)  { fetch :rails_env, fetch(:stage, "production") }
_cset(:whenever_variables)    { "environment=#{fetch :whenever_environment}" }
_cset(:whenever_update_flags) { "--update-crontab #{fetch :whenever_identifier} --set #{fetch :whenever_variables}" }
_cset(:whenever_clear_flags)  { "--clear-crontab #{fetch :whenever_identifier}" }
_cset(:whenever_path)         { fetch :latest_release }

( 省略 )
```
アポロニウスの円

軌跡の十分性の証明を省略しないシリーズの第２弾です。軌跡が円になる場合です。

## 問題
2点$\text{A}(-3,\,0)$，$\text{B}(1,\,0)$からの距離の比が$3:1$である点$\text{P}$の軌跡を求めます。

## 解答
$\text{P}(x,y)$とおくと，$\text{AP}:\text{BP}=3:1$より，$$\text{AP}=3\text{BP}$$$$\therefore \text{AP}^2=9\text{BP}^2$$$$\therefore (x+3)^2+(y-0)^2=9(x-1)^2+9(y-0)^2$$$$\therefore x^2+6x+9+y^2=9x^2-18x+9+9y^2$$$$\therefore 8x^2+8y^2-24x=0$$$$\therefore x^2-3x+y^2=0$$$$\therefore \left(x-\frac32\right)^2+y^2=\frac94$$よって，点$\text{P}$は中心$\left(\frac32,\,0\right)$，半径$\frac32$の円周上にあることがわかりました。しかし、円周上全体を動くかどうかはわかりません。
そこで，点$\text{P}(a,b)$が円$x^2-3x+y^2=0$上の点であるとすると，$$a^2-3a+b^2=0\cdots\text{①}$$が成り立ちます。このとき，
$$\begin{aligned}[t]
\text{AP}^2-9\text{BP}^2
&=(a+3)^2+b^2-9(a-1)^2-9b^2\\\
&=a^2+6a+9-9a^2+18a-9-9b^2\\\
&=-8a^2-8b^2+24a\\\
&=-8(a^2-3a+b^2)\\\
&=0\quad(\therefore\text{①})
\end{aligned}$$$$\therefore \text{AP}^2=9\text{BP}^2$$$$\therefore \text{AP}=3\text{BP}$$$$\therefore \text{AP}:\text{BP}=3:1$$
となるので、円$x^2-3x+y^2=0$上どこに点$\text{P}$をとっても$\text{AP}:\text{BP}=3:1$となります。
以上より、点$\text{P}$の軌跡は中心$\left(\frac32,\,0\right)$，半径$\frac32$の円全体を表します。除かれる点などはありません。
MACを使ったRasphery pi 3イメージの焼き込み

#OSの焼き込み
OSイメージをサイトよりダウンロード

#microSDカードを、MACのDISKユーティリティを使いフォーマット（消去）

MSDOS互換として「消去」

#unmountの実行

MACのDISKユーティリティにて操作。

#dd コマンドを使いイメージを焼き込む

sudo dd bs=1m if=2019-04-08-raspbian-stretch-full.img of=/dev/rdisk2 conv=sync

　※conv=syncを追記(2021/7/27)

Deviceは「r」をつけると早く終わるという記事を発見し検証したところ再現。
かえってこれをしないと数時間経っても終わらない。（16GBで数分で終了）
Ctl+cで止めてしまうとブートしない起動ディスクが出来上がる。
HW故障と思って１台購入したけど・・・

#取り出し操作

MACのDISKユーティリティにて操作。
python itertool

#itertools.product()
この関数は[デカルト積](https://ja.wikipedia.org/wiki/%E7%9B%B4%E7%A9%8D%E9%9B%86%E5%90%88)を出力してくれる

```py
>>> from itertools import product
>>>
>>> print list(product([1,2,3],repeat = 2))
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
>>>
>>> print list(product([1,2,3],[3,4]))
[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]
>>>
>>> A = [[1,2,3],[3,4,5]]
>>> print list(product(*A))
[(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 3), (3, 4), (3, 5)]

```

#itertools.permutations（iterable [、r]）
イテラブル内の要素で、長さrの重複を許さない順列を出力する

```py

>>> from itertools import permutations
>>> print permutations(['1','2','3'])
<itertools.permutations object at 0x02A45210>
>>> 
>>> print list(permutations(['1','2','3']))
[('1', '2', '3'), ('1', '3', '2'), ('2', '1', '3'), ('2', '3', '1'), ('3', '1', '2'), ('3', '2', '1')]
>>> 
>>> print list(permutations(['1','2','3'],2))
[('1', '2'), ('1', '3'), ('2', '1'), ('2', '3'), ('3', '1'), ('3', '2')]
>>>
>>> print list(permutations('abc',3))
[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]
```

#itertools.combinations(iterable, r) 
長さrのタプル列をソートされた順で重複なしで出力する

```py
>>> from itertools import combinations
>>> 
>>> print list(combinations('12345',2))
[('1', '2'), ('1', '3'), ('1', '4'), ('1', '5'), ('2', '3'), ('2', '4'), ('2', '5'), ('3', '4'), ('3', '5'), ('4', '5')]
>>> 
>>> A = [1,1,3,3,3]
>>> print list(combinations(A,4))
[(1, 1, 3, 3), (1, 1, 3, 3), (1, 1, 3, 3), (1, 3, 3, 3), (1, 3, 3, 3)]
```

#itertools.combinations_with_replacement()
長さrのタプル列をソートされた順で重複ありで出力する

```py
>>> from itertools import combinations_with_replacement
>>> 
>>> print list(combinations_with_replacement('12345',2))
[('1', '1'), ('1', '2'), ('1', '3'), ('1', '4'), ('1', '5'), ('2', '2'), ('2', '3'), ('2', '4'), ('2', '5'), ('3', '3'), ('3', '4'), ('3', '5'), ('4', '4'), ('4', '5'), ('5', '5')]
>>> 
>>> A = [1,1,3,3,3]
>>> print list(combinations(A,2))
[(1, 1), (1, 3), (1, 3), (1, 3), (1, 3), (1, 3), (1, 3), (3, 3), (3, 3), (3, 3)]
```