OmniAICreator/Qiita-1.07M huggingface dataset:
nested attributes 使用時に毎回新規登録が行われてしまう

## 概要
[***accepts_nested_attributes_for***](https://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html#method-i-accepts_nested_attributes_for) を使って、とあるレコードの編集時に、関連レコードの新規作成/更新 を行うようにしたつもりだったのですが、なぜか常に新規登録扱いになってしまい、SQL発行時に Duplicate entry でエラーになる、という事象がおこっていました。

原因は大したことなかったのですが、これにハマったのが2度目だったので自戒のため記事に残しておくことにした次第です。よろしければお付き合いください。

## 環境
- Ruby 2.5.1
- Rails 5.2.2.1

## 結論
先に結論を書いておきます。
<font color="tomato">**`id` を permit メソッド内で許可していなかったから。**</font> です。

ハマるときに限って、意外と原因は大したことなかったりします。

## 舞台設定
順に説明していきます。まず今回の Model と Controller について記載します。

### Model
`Parent` が親で、`Child` が関連モデルです。名前がいまいちですがご容赦ください:sweat_smile:

```rb:parent.rb
class Parent < ApplicationRecord
  has_one :child
  accepts_nested_attributes_for :child, allow_destroy: true
end
```

```rb:child.rb
class Child < ApplicationRecord
  belongs_to :parent
  self.primary_key = :parent_id
end
```

### Controller
**問題の原因はここにあります。**ここではあえて問題が再現する状態のままにしています。

```rb:child_controller.rb
class ChildController
  def update
    if @parent.update(child_params)
      # リダイレクト先は適当に書いたただの例なので気にしないでください
      redirect_to detail_page_path(@parent)
    else
      render :edit
    end
  end

  def child_params
    params.require(:parent).permit(
      # parent側もいろいろ指定がありますがここでは省略してます
      child_attributes: %i[title _destroy]
    )
  end
end
```


## 問題の解消方法

前述コントローラの `child_params` メソッド内を下記のように変更すると解消します。結論で書いたとおりですが、`id` を permit メソッド内で許可するキーに追加しています。

```diff
- child_attributes: %i[title _destroy]
+ child_attributes: %i[id title _destroy]
```

## そもそもこの `id` って？

まずはこちらをご覧ください。これは child_controller に対応したビューの一部です。このようなフォームを作成しています。

```erb:child.html.erb
<%= form_with(model: @parent, local: true) do |form_parent| %>
  <!-- parent のフォームは省略 -->
  <%= form_parent.fields_for :child, @parent.child.build do |form_child|%>
    <%= form_child.text_field :title, placeholder: 'なんか入力してくれ' %>
  <%end%>
<%end%>
```

そして、実際に生成される child 分のフォームは以下のような html になります。

```html:item.html
<input placeholder="なんか入力してくれ" type="text" value="" name="parent[child_attributes][title]" id="parent_child_attributes_title">
<input type="hidden" value="2" name="parent[child_attributes][id]" id="parent_child_attributes_id">
```

**おや？**
`parent[child_attributes][id]` という、自分では作成した覚えのない input hidden のフォームが生成されています。これが `id` パラメータの正体のようです。value 属性に入っているのは `childs` の主キーである `parent_id` の値でした。

どうやらこの値を見て、新規登録か、既存レコードの更新かを区別しているようです。新規登録の際は value に何も入っていません。そのため、コントローラ側の処理で `id` を permit メソッド内で許可しておかないと、常に新規登録として扱われてしまう、ということです。

ここで注意が必要なのが、**<font color="tomato">主キーのカラム名は parent_id であるにも関わらず、input タグの name 属性には必ず id という名前が使用される</font>** という点です。DBのカラム名でそのまま考えると permit には `parent_id` を書いてしまいがちなんですが、主キーが送信されているパラメータの名前は常に `id` という名前であるため間違えないように気をつけましょう。でないと僕の二の舞になります。~~こんなミスする人は僕だけかもしれませんが~~

## 参考
- [Action Controller Overview — Ruby on Rails Guides](https://guides.rubyonrails.org/action_controller_overview.html#nested-parameters)
- [ActiveRecord::NestedAttributes::ClassMethods](https://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html)


## 余談
とはいえ、Rails はほんとにDB保存系の処理を書くのが楽ですね。そもそも最近の ORM ってみんなこんなかんじなんでしょうか？Laravel の ORM とかどうなんだろう、ということをふと考えました。
PHPでシステム時刻と違う結果が出るとき

PHPをタイマー系の自分用バッチで使っていて、システムロケールと違う結果が出ると困りますよね。

タイムゾーンを設定したい場合は、以下を変更します。

```
date_default_timezone_set('Asia/Tokyo');
```

- (タイムゾーンの値の変更) https://www.php.net/manual/ja/timezones.php

ロケール設定を変更する場合は、以下を変更します。

```
setlocale(LC_ALL, ''); // システム環境設定を読む
```
OpenCVのMat型オブジェクトどうしをテストコードで比較する

OpenCVで`cv2.imread()`などを行うと、`Mat`型のオブジェクトが返ります。
[cv::Mat Class Reference](https://docs.opencv.org/3.4.3/d3/d63/classcv_1_1Mat.html)

二つのMatオブジェクトをPythonの`unittest`のテストコードで単純に比較しようとしたらエラーが出てしまいました。

```動作確認してません.py
from unittest import TestCase
import cv2

class hogehoge(TestCase):
  def hoge(self):
    mat1 = cv2.imread('hoge1.jpg')
    # mat1を何か処理

    mat2 = cv2.imread('hoge2.jpg')
    # mat2を何か処理

    # mat1とmat2が同じになってるか確かめたい
    self.assertEqual(mat1, mat2)

# ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
```

エラーメッセージに書いてある通り、Mat型のような中身がたくさんあるオブジェクト（曖昧）は単純な比較ができないようです。
`Use a.any() or a.all()`と書いてあるように、素直にそれらを使いましょう。

次のようにテストコードを修正することで、いい感じにテストを実行できるようになりました。

```動作確認してません.py
from unittest import TestCase
import cv2

class hogehoge(TestCase):
  def hoge(self):
    mat1 = cv2.imread('hoge1.jpg')
    # mat1を何か処理

    mat2 = cv2.imread('hoge2.jpg')
    # mat2を何か処理

    # mat1とmat2が同じになってるか確かめたい
    self.assertTrue((mat1 == mat2).all())

# Ran 1 tests in 0.037s
#
# OK
```

参考
[Python で配列の一致比較 (list, ndarray)](https://qiita.com/kattoyoshi/items/2168bc923b1852779a87)
Ruby基礎知識

2019/7/10

#Ruby学習


```
puts "Hello World"
```

出力結果がコンソールに表示される

◎**数値の出力と足し算/引き算**

```
puts　数字の出力
puts 1 + 1　足し算
puts 1 - 1　引き算
puts 1 * 1　掛け算
puts 1 / 1　割り算
puts 9 % 2　余り算
puts "1 + 1"　文字列として表示される
```

#変数とは

※イメージ
→変数=値を入れておく箱
![スクリーンショット 2019-07-10 9.00.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435981/493c6d24-a53e-7747-2cef-618f1d146a85.png)

###変数の定義

**※重要※**

**プログラミングの「=」は「左の変数に右の値を入れる」という意味で、これを代入**
Sed で文字列置換をするときはリダイレクトではなく -i オプションを使う

久々に sed を使ったらハマったので備忘録としてメモ。

## やりたかったこと
以下のようなファイルがありました。

```bash
$ cat sample.txt
password=secret_password
```

この `secret_password` を `dummy_password` に書き換えたいと思いました。

sed だと次のようにすれば書けます。

```bash
$ sed -e 's/secret_password/dummy_password/' sample.txt
password=dummy_password   
```

出力を見る限り問題なさそうなので、これを元ファイルにリダイレクトしましょう。

```bash

$ sed -e 's/secret_password/dummy_password/' sample.txt > sample.txt
$ cat sample.txt
$ wc sample.txt
0 0 0 sample.txt      
```

…あれ？

## なぜファイルが空になるのか

結論から言うと、リダイレクトの仕様によるものです。
UNIX 系のシェルでは `>` でリダイレクトを行うと、__まずリダイレクト先のファイルを空で初期化します。__
つまり、 sed が実行される時点で __sample.txtの中身は空になっているのです。__
空のファイルに対して置換を実行しても、結果が空文字になるのは当たり前で、それを書き込んでも当然空のファイルになります。

これは sed に限らず、 `cat` なんかでも同じ事が起こせます。

```bash
$ touch sample.txt
$ echo "abc" > sample.txt
$ cat sample.txt
abc
$ cat sample.txt > sample.txt
$ cat sample.txt
$ 
```

同じファイルに対してリダイレクトする、というのは危険です。

ちなみに、一次ソースを探して [Bash のドキュメント](https://www.tldp.org/LDP/abs/html/io-redirection.html) も見てみたのですが
>    \> filename    
      # The > truncates file "filename" to zero length.
      # If file not present, creates zero-length file (same effect as 'touch').
      # (Same result as ": >", above, but this does not work with some shells.)

と書かれているだけで、コマンドを実行した場合の実行順序までは書かれていませんでした。
が、実行してみたら確かにファイルが空になるので、そうなんだろうと納得するしかないのですが、イマイチ釈然としません…

## Sed で置換を行う場合は -i オプションを使う

じゃあ、どうすればいいのかという話です。

Sed は `-i` (または `--in-place`) というオプションをつけることで、実行結果にファイルを置換することができます。
なので、最初の例の正解はこうなります。

```bash
$ cat sample.txt
password=secret_password
$ sed -i -e 's/secret_password/dummy_password/' sample.txt
$ cat sample.txt
password=dummy_password
```

無事置換ができました。Sed の使い方が間違っているのかと思ったら、そもそも UNIX シェルの仕様を理解していなかったという話でした。

なお、上記は Linux 等で使われる GNU Sed の話です。 macOS や FreeBSD などに入っている BSD Sed については微妙にコマンドが違います。[こちらの記事](https://qiita.com/catfist/items/1156ae0c7875f61417ee)がとても分かりやすく説明しています。

## 参考
- [sed(1) - Linux man page](https://linux.die.net/man/1/sed)
- [Advanced Bash-Scripting Guide:Chapter 20. I/O Redirection](https://www.tldp.org/LDP/abs/html/io-redirection.html)
- [sedで置換がうまくいかなかった話](https://qiita.com/sublimer/items/b1f58ca60e69233d3602)
- [Macの（BSD版）sed での上書き保存](https://qiita.com/catfist/items/1156ae0c7875f61417ee)
- [Sed で文字列置換をするときはリダイレクトではなく -i オプションを使う(ブログで書いた元記事)](https://at-428.blogspot.com/2019/07/sed-i.html)
コンフリクトの発生原因について(merge)

rubyでコードを書く時みなさん基本的には作業用ブランチを作成して、主にそこでコード書く。完了したらcommitして、masterブランチにmergeする。
しかし初学者にありがちなmergeをしたら、(master|MERGEING)になってそこからgitコマンドが使えなくなった経験はございませんか？？
そんな初学者向けに陥りやすい原因と解決策について一つのやり方(正しいかは別)として参考程度に考えていただけたらなともいます。

#コンフリクトとは
相反する意見、態度、要求などが存在し、互いに譲らずに緊張状態が生じること。 対立、軋轢。プログラミング(ruby)に関しては主に現場ではgit cloneした時なんかに生じるエラーになるかと思われます。しかし、今回はbranch作成してmasterブランチでのmergeに起きるエラーについてかいていきます。

#発生原因
基本的にはコンフリクトは「衝突」のような意味合いもあるので、mergeする際の衝突をイメージできるかと思います。
では、mergeの衝突を具体例を持って説明したいと思います。

１、1つのmergeしてないブランチを作成する
` git checkout -b Test1`

２、ここではREADME.mdファイルでのコンフリクトをさせるための文を書きます
```ruby:README.md
  'コンフリクト１を作成しました。'
```

３、保存が終わったらcommitまでしていきます。
`git add -A`
`git commit -m Test1`
`git checkout master`

4、mergeをせずに手順１にもどり同じことをする(TestとREADMEの数だけ変えています)

５、手順３まで終わったら今masterブランチにいる状態だと思います。ここでまず最初にコミットしたTest1をmergeします。
`git merge Test1`
```ruby:README.md
  'コンフリクト１を作成しました。'
```
空白だったとこに無事反映されています。

６、では次に２つ目に作ったTest2をmergeします。
`git merge Test2`
<img width="493" alt="スクリーンショット 2019-07-10 7.55.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429158/c020b37b-470f-ae07-e94c-d159893b25f5.png">
すると次はエラーがでてしまいました。

７、ここの文だけでもREADMEファイルに問題があるのは明白なのですが、一応ステータスの方でも確認をしておきましょう。
`git status`
<img width="535" alt="スクリーンショット 2019-07-10 7.58.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429158/8e4fda78-f357-5156-4466-4268d24720e5.png">

赤文字で`modified`とかかれファイル名も`README.md`と書かれてますね。

8、次は問題のREADMEファイルをみてみましょう。
<img width="285" alt="スクリーンショット 2019-07-10 8.03.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429158/2fb03378-c118-e311-d8b2-9a384968ebe7.png">
先ほど文が2個表示されていますが、なにやらいらないものがついてきちゃってますね。
 HEAD ...　最後にmergeしたもの
Test2 ...　2個めにmergeしたもの

#まとめ
このように1つ目のブランチを`merge`せずに2つ目のブランチ作成して作業するとこのように食い違いが起きるわけです。`Test2`を`merge`しようとしてもブランチには`コンフリクト1を作成しました。`という文は含まれていないのですから、ここで`コンフリクト`という現象が発生します。特に初心者のかたはmergeをうっかり忘れて次のブランチを作成していまい、コンフリクトが発生する（私も何回かやっていました。笑)ので落ち着いて`git log`等も確認しながら作業進めていきましょう！


すこしでも初学者のかたの役にたてたらなと思います
また、何か間違っているところ、こうした方がいい等のご意見いただましたらよろしくお願いします。
ReactNativeでの開発に向けたロードマップ

現在フリーランスとして活動している大学生のものです。

WP案件やLP案件で普通のバイトくらいは稼いでいます。
できることはHTMLcssでのコーディング、及びJSで少々アニメーションを付けられる程度です。

このたび諸事情でReactNativeでの開発に向けて勉強することになりました。
時間がありません。

僕の現状からReactNativeで開発できるようになるための、ロードマップを教えてください。

心より、よろしくお願いいたします！！
Java メソッド

##学習ログ

###メソッドとは
複数の処理をまとめ、それを一つの処理として名前をつけたもの。

####メソッドを利用するメリット
・機能単位に記述するため、修正範囲を限定できる。
・プログラムの見通しがよくなり、全体を把握しやすくなる。
・同じ処理を一つのメソッドにまとめることで、作業効率が上がる。

####メソッドの定義

```java:
public static 戻り値の型 メソッド名(引数){
  メソッドが呼び出された時に実行される具体的な処理
}
//戻り値の型はメソッド内の処理の結果の値のデータ型を記述。処理結果が数値であればint,文字列であればStringになる。

//メソッドの呼び出し
メソッド名(引数); //戻り値を利用できない。

```

####引数とは
メソッドを呼び出す際に呼び出し元から値を渡すことができる。

```java:
public static void main(String[] arg) {
  hello("山本"); //helloメソッドを呼び出している。山本という文字列のデータを(実引数)をhelloメソッドに渡している。
  hello("鈴木");
  hello("北村");
}

public static void hello(String name) { //メソッド呼び出しの際、仮引数として山本がSring型の変数nameに代入
  System.out.println(name + "さん、こんにちは");　//変数nameに代入されているデータをここで出力する。
}
//実行結果
  山本さん、こんにちは
  鈴木さん、こんにちは
  北村さん、こんにちは //となる


//引数が複数の場合
public static void main(String[] args) {
  add(100,20); //実行結果 x + y = 120
  add(200,50); //実行結果 x + y = 250
}
//複数の値を受け取るaddメソッド
public static void add(int x, int y) {
  int ans = x + y;
  System.out.println(x + "+" + y + "=" + ans);
}
```

####戻り値とは
呼び出されたメソッドから、呼び出し元のメソッドへ返す値(データ)のことを戻り値または返り値という。

```java:
return 戻り値; //こうすることで呼び出し元のメソッドに値を返すことができる。
//この戻り値がそのメソッドの実行結果となる。
```
wemosでeigen その3

#概要

wemosでeigenやってみた。
カルマンフィルターしてみた。

#結果

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c31ddebd-3638-c771-0796-22885765675c.png)



#サンプルコード

```
#include <Eigen.h>
#include <Eigen/LU>
#include <Eigen/Dense>
#include <math.h>
#include "kalman_filter.h"

#define PI					3.14159265

using namespace Eigen;
int i;
KalmanFilter kf;
MatrixXd R_laser_;
MatrixXd H_laser_;
MatrixXd Hj_;

void setup()
{
	Serial.begin(9600);
	Serial.println("start");
	kf = KalmanFilter();
	R_laser_ = MatrixXd(2, 2);
	H_laser_ = MatrixXd(2, 4);
	Hj_ = MatrixXd(3, 4);
	R_laser_ << 0.0225, 0, 0, 0.0225;
	Hj_ << 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1;
	kf.F_ = MatrixXd(4, 4);
	kf.F_ << 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1;
	H_laser_ << 1, 0, 0, 0, 0, 1, 0, 0;
	kf.x_ = VectorXd(4);
	kf.x_ << 1, 1, 1, 1;
	kf.P_ = MatrixXd(4, 4);
	kf.P_ << 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0;
	kf.H_ = H_laser_;
	kf.R_ = R_laser_;
	double dt = 0.01;
	float noise_ax = 9.0;
	float noise_ay = 9.0;
	double dt2 = dt * dt;
	double dt3 = dt2 * dt;
	double dt4 = dt2 * dt2;
	kf.Q_ = MatrixXd(4, 4);
	kf.Q_ << dt4 / 4 * noise_ax, 0, dt3 / 2 * noise_ax, 0, 0, dt4 / 4 * noise_ay, 0, dt3 / 2 * noise_ay, dt3 / 2 * noise_ax, 0, dt2 * noise_ax, 0, 0, dt3 / 2 * noise_ay, 0, dt2 * noise_ay;
	kf.F_(0, 2) = dt;
	kf.F_(1, 3) = dt;
}
void loop()
{
	i++;
	float d = sin(2 * PI * 50 * i / 20000) + 0.3 * sin(2 * PI * 4010 * i / 20000);
	Serial.print(d);
	VectorXd x = VectorXd(2);
	x << d, d;
	kf.Update(x);
	kf.Predict();
	double p_x = kf.x_(0);
	double p_y = kf.x_(1);
	double v1 = kf.x_(2);
	double v2 = kf.x_(3);
	Serial.print(",");
	Serial.println(p_x);
	delay(300);
}


```


以上。
Glideをさわってみた

## 概要

- Glideという、スプレッドシートに定義したデータを綺麗なUIでWebアプリ化してくれるツールを試してみた
    - https://www.glideapps.com/

## やったこと

### スプレッドシートを作る

- プロ野球の順位表をコピペしてきてスプレッドシートに貼り付けてみた
    - シート名は画面に表示されるので変えておく
    - 一行目はヘッダーとして解釈されるので注意

<img width="603" alt="スクリーンショット 2019-07-10 7.56.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/e902d6ba-9003-5c1b-e8a4-1eb7a8999116.png">

### アプリを新規作成する

- GlideにGoogleアカウントでログインして「New App」から新規アプリを作成する
- 先程作成したスプレッドシートを選択する

<img width="863" alt="スクリーンショット 2019-07-10 8.05.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/4b15ccf7-b331-cc6c-476d-8fcd0c5834e6.png">

- 雛形生成が完了すると以下のような画面が表示される
- もうすでにそれっぽいアプリができてる！

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/23a71aa0-7d75-7dc9-57df-7a279d279a0c.gif)

### 雛形に手を加える

- 一覧の表示形式は右側のタブで選択することができる
    - 今回の例ではデフォルトで選択されていたListがよさそう

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/ce38f220-bb22-aab2-c27d-992bd3eb1343.gif)

- リストに表示する内容も右側のメニューで変更できる
    - スプレッドシートに定義した列が選択肢として表示される
    - TitleとDetailの2項目しか選択できないという制約っぽい
    - 検索窓やアイコンの表示切り替えもできる

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/8faabfe1-8c22-191f-10ab-d94c514c0386.gif)

- 詳細画面はスプレッドシートの全ての列の情報が表示されている
    - 表示する列を変更したりラベルを変えたりできた

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/9285609f-1b44-c25b-fc79-408169602417.gif)

### アプリを公開する

- 「Open App」を押すとQRコードが表示される
    - URLは自動で生成された文字列が含まれるがxxxの部分はカスタマイズもできる
    - https://xxxxx.glideapp.io/

<img width="306" alt="スクリーンショット 2019-07-10 8.29.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/ab593205-075e-8a96-a01f-45c6c41ef849.png">

<img width="658" alt="スクリーンショット 2019-07-10 8.29.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/71b0aeef-3af1-c4a4-2c20-65637f5d3a30.png">

## 感想

- 想像以上に簡単に作ることができた
- レイアウトはGlideの仕様に乗っかるしかないのでそこは制約として受け入れる必要があった
    - 一覧画面に表示できる情報が限られてる
    - パーツの配置の方法に制約がある等
- プロトタイプを素早く作るのには有用
Arduinoでカメラのタイムラプス/インターバル撮影用赤外線リモコンをつくる

一眼レフカメラって最近はタイムラプス撮影に対応してるけど、ちょっと前の型だと対応してなかったりする。

そんな時に、タイムラプスを作るためのインターバル撮影をする赤外線リモコンを自作したのでメモ。



## 用意するもの

- Arduino(GingerBread)
...Uno、Pro mini、Micro、ESP、なんでもよいですが、ここではPro Mini互換でリチウムイオン充電池を直接つなげるGinger Bread（ http://ginger-you.com/bread/ ）を使います。

- FTDI USBシリアルアダプタ/ USBケーブル
...GingerBreadをPCと接続するためのアダプタとケーブルです。おすすめはこちら（ https://www.switch-science.com/catalog/343/ ）
※他のarduinoを利用する場合は不要です。

- 赤外線LED(OSI5LA5113A)
...1A程度流せるものを使いましょう。ここではOSI5LA5113Aを使います。

- トランジスタ(2sc2655)
...1A程度流せるものを使いましょう。ここでは2sc2655を使います。

- カーボン抵抗(680Ω)
...トランジスタに適量の電流を流すために必要です。

- 半固定抵抗(1kΩ)　※オプション
...赤外線LEDの出力を調整したい方はこれをはさみます。


## ハードウェア（回路）

回路はこちらを参考ににさせていただきました。
https://macsbug.wordpress.com/2015/11/29/赤外線ledリモコンの制作/
![アートボード 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/fcb27fa9-89dc-d6cd-3cd0-98f347acb215.png)

ポイント
・赤外線LEDのアノードはVCC、カソードはトランジスタのコレクタへ
・マイコンの13番ピンは、680Ωを挟んでトランジスタのベースへ
・トランジスタのエミッタはGNDへ
・出力を調整したい場合は、1kΩの半固定抵抗を13番ピンと680Ω抵抗の間に挟みます。


## ソフトウェア

各カメラメーカーの赤外線リモコン信号を出力するためのライブラリがあります。

multiCameraIrControl
https://github.com/dharmapurikar/Arduino/tree/master/libraries/multiCameraIrControl

このライブラリをArduino IDEへインストールして使います。
ソースコードは非常にシンプル。こちらはNikonのカメラで5秒に1回撮影するサンプルです。
他メーカーのカメラを使いたい方は、サンプルスケッチ->multicameracontrolから、該当するメーカーのサンプルを選んでください。

```Nikon.ino

#include <multiCameraIrControl.h>

Nikon D5000(13); //ここで信号出力ピンを指定

void setup(){
}

void loop(){
  D5000.shotNow();
  delay(5000);
}
```
python+sympyで機械系設計計算書ネタを作成する


# モチベーション
私は通常、jupyterを使って仕事をしている機械系エンジニアなのですが、現在所属している会社では紙でのアウトプットが求められており、これの対応に苦慮しています。
jupyterで会社指定のフォーマットに紙で出力するのは難しいので、現在は、MS　officeにjupyterでの検討結果を貼り付けて対応しているのですが、設計計算書の数式系がメンドくさかったので、pythonのsympyでやってみました。

# 環境
- windows10
- anaconda
- python 3.7.1

# つまづきポイント
1. ギリシャ文字をjupyrerの中で使う  
   jupyterのcode上で、”\sigma + tab”で、σが使えるようになる。便利!
2. 単位をsympyでつける  
   ググれば直ぐに見つかると思いきや、なかなか見つからなかった。。。  
   結果的には、単位用のSymbolを作って、それを*で繋げればOK
3. sympyでの上付き表示などの方法がわからなかった。  
   LaTexのコマンドがだいたい使えることが分かった。下記サイトがよくまとっていてGOOD！  
　　http://www1.kiy.jp/~yoka/LaTeX/latex.html

# やったこと
集中荷重片持ち梁の計算をやってみました。荷重、長さ、断面係数をインプットすると、計算書で使えるアウトプットを出力しています。jupyterにインポートして使うことを想定しています。

```python:beam.py
from sympy import Symbol,pi,Eq
from IPython.display import display
from sympy.interactive import printing
printing.init_printing(use_latex=True)

#使用するシンボルはグローバルで定義
σmax= Symbol('σ_max')
eσmax= Symbol('σ_max')
MPa= Symbol('(MPa)')
Mmax= Symbol('M_max')
eMmax= Symbol('M_max')
N_mm= Symbol('(N \cdot mm)')
Z= Symbol('Z')
eZ= Symbol('Z')
mm3= Symbol('({mm^3})')
F= Symbol('F')
eF= Symbol('F')
N= Symbol('(N)')
L= Symbol('L')
eL= Symbol('L')
mm= Symbol('(mm)')

paramater_dict= {
    "σmax":["曲げ応力","MPa"],
    "Mmax":["曲げモーメント","N_mm"],
    "Z":["断面係数","mm3"],
    "F":["荷重","N"],
    "L":["梁の長さ","mm"]
    }

def siki_hyoji(atai,unit_opp = True):
    """sympyで式を表示する関数です
    　　（ a = b [mm]　の形で返す）
    Arguments:
        atai {str} -- パラメータ名
    
    Keyword Arguments:
        unit_opp {bool} -- 単位の表示有無 (default: {True}単位を表示する)
    
    Returns:
        [sympy] -- sympyの式をかえします
    """
    ns = globals()
    hidari = ns["e"+atai]
    migi = ns[atai]
    unit = ns[paramater_dict[atai][1]]
    if unit_opp == True:
        siki = Eq(hidari,migi*unit)
    else:
        siki = Eq(hidari,migi)
    return siki

def katamochi_bari(paramater):
    """片持ち梁の計算書ネタを作成します[荷重,長さ,断面係数]
    
    Arguments:
        paramater {list} -- [荷重,長さ,断面係数]
    """
    
    global σmax,Mmax,Z,F,L #global変数を編集可能にする
    print("曲げ応力は以下の式で表される")
    σmax = Mmax/Z
    Mmax = F*L
    display(siki_hyoji("σmax",False),siki_hyoji("Mmax",False))

    print("各パラメータの値を以下に示す")
    F = paramater[0]
    L = paramater[1]
    Z = paramater[2]
    display(siki_hyoji("F"),siki_hyoji("L"),siki_hyoji("Z"))

    print("以上より")
    Mmax = F*L
    σmax = Mmax/Z
    σmax = round(σmax)
    display(siki_hyoji("Mmax"),siki_hyoji("σmax"))

```

# 実行方法
jupyterファイルを同じフォルダにbeam.pyを置きます。
以下の通り実行すると、計算書のネタが完成！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274127/a145464c-7fc9-dc74-5bac-17a39856f3a5.png)

## ソースコード
https://github.com/myao9494/sympy_calculation_sheet

sympy用のsymbolを作るのが、めんどくさかったので、utility.pyで、パラメータの辞書からsymbolを作成できるようにしています。


# ひとりごと
今後、拡張していくと、作業が楽になりそう。
日本語変数、イケてない。。。けど使ってしまう
今回が、初投稿です！
PythonでGUI画面とリアルタイムグラフ表示する

## 前提

急にGUIを作れと言われた。ボタンとかでいろいろ制御できるリアルタイムグラフ描画をしたいが、性能は問われない。
gnuplot触ったことないし、C#もよくわからんが、Pythonは触ったことあるのでmatplotlibを使ってみる。

難しいこととか変な(?)ライブラリへの依存はしたくないのでPython3系のtkinterを使う。

表示したいのは以下。

* 折れ線グラフ複数
* カラーマップと対応するカラーバー
* 制御用のボタンとか


事前に`pip install numpy matplotlib`しておく必要がある。
(Ubuntuの場合はその前に`sudo apt install python3-pip python3-tk`しておく)


## 詳細

### 最初の一歩

ボタンとグラフを同時に表示する必要があるので、[matplotlib.org](https://matplotlib.org)の検索窓にで`tkinter`と入れてみる。
すると[Embedding in Tk](https://matplotlib.org/gallery/user_interfaces/embedding_in_tk_sgskip.html)が一番上にある。

それから、リアルタイム描画ということでアニメーションする必要があるので、同様に`animation`と入れてみる。
すると、今度は少し下のほうに[Animated line plot](https://matplotlib.org/gallery/animation/simple_anim.html)が見つかる。

今回はボタンなどを配置しつつアニメーションしたいので上記二つを組み合わせる必要がある。


### Animated plot in Tk

[Embedding in Tk](https://matplotlib.org/gallery/user_interfaces/embedding_in_tk_sgskip.html)と[Animated line plot](https://matplotlib.org/gallery/animation/simple_anim.html)を合体して、少し整理した。

```python
#!/usr/bin/env python3


# https://matplotlib.org/gallery/user_interfaces/embedding_in_tk_sgskip.html
# https://matplotlib.org/gallery/animation/simple_anim.html


import tkinter

from matplotlib.backends.backend_tkagg import (
	FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure
import matplotlib.animation as animation

import numpy as np


def _quit():
	root.quit()     # stops mainloop
	root.destroy()  # this is necessary on Windows to prevent
					# Fatal Python Error: PyEval_RestoreThread: NULL tstate


def init():  # only required for blitting to give a clean slate.
	line.set_ydata(np.sin(x))
	return line,


def animate(i):
	line.set_ydata(np.sin(x + i))  # update the data.
	return line,


root = tkinter.Tk()
root.wm_title("Embedding in Tk anim")

fig = Figure()
# FuncAnimationより前に呼ぶ必要がある
canvas = FigureCanvasTkAgg(fig, master=root)  # A tk.DrawingArea.

x = np.arange(0, 3, 0.01)  # x軸(固定の値)
l = np.arange(0, 8, 0.01)  # 表示期間(FuncAnimationで指定する関数の引数になる)
plt = fig.add_subplot(111)
plt.set_ylim([-1.1, 1.1])
line, = plt.plot(x, np.sin(x))

ani = animation.FuncAnimation(fig, animate, l,
	init_func=init, interval=10, blit=True,
	)

toolbar = NavigationToolbar2Tk(canvas, root)
canvas.get_tk_widget().pack()

button = tkinter.Button(master=root, text="Quit", command=_quit)
button.pack()

tkinter.mainloop()
```

ボタンとかは、普通にtkinterで配置できる。


### 見た目

![Embedding_in_Tk_anim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139130/478c0a73-e853-4f51-d938-060635b22cf1.gif)


### 注意点

* `animation.FuncAnimation()`で返ってくるオブジェクト(上記コードでは`ani`)の参照がない(?)とグラフが更新されないことがある。  
	クラスにした場合は、`self.ani`とかに格納して大事に持っておく必要がある。  
	(上記コードでは、`ani = ...`がないとだめかもしれない。)
* `set_ydata()`とか`set_data()`では、データ以外の表示は更新されない。  
	Y軸範囲を自動追従したい場合とかは、自前で`set_ylim()`する必要がある。
* `blit=True`だとグラフが更新されない(軸ラベルだけの更新とかが反映されない)ことがある。  
	ボタンでX軸表示モード変えたいのに変わらない時は`blit=False`にしてみるといいかもしれない。

## 応用(？)例

[PythonでI2Cセンサ(CCS811/BME280)を読んで色々表示してみた](https://qiita.com/nv-h/items/85283db9de73cd320bb6)で、今回の成果を使った。
matplotlibでの表示は、[このコード(example.py)](https://github.com/nv-h/i2c_env_sensors/blob/master/example_gui.py)。センサで値を取得する関係でクラスを使ってごにょごにょした。
DockerでGitLabとDB2のコンテナを起動するコマンド覚書

# GitLabを起動する
```docker-compose.yml
web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'localhost'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://localhost:9010'
        gitlab_rails['gitlab_shell_ssh_port'] = 2022
    ports:
      - '9010:9010'
      - '2022:22'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab'
```

# DB2を起動する

## ディレクトリ構成
/docker-compose.yml
/db/Dockerfile

#### Dockerfile
```Dockerfile
FROM ibmcom/db2express-c:latest
```


```docker-compose.yml
db2:
    container_name: mydb2
    ports:
        - '50000:50000'
    environment:
        - LICENSE=accept
        - DB2INST1_PASSWORD=password
        - DBNAME=testdb
    volumes:
        - '/db2:/database'
    image: ibmcom/db2
```

# 起動コマンド
`docker-compose up`

※微調整が必要な可能性あり
WordPressでファイルアップロードができない(m4b、m4a、vtt、key）

# 概要

- WordPressで特定のファイルがアップロードできない
- 「セキュリティ上の理由で」と表示される
- ある時からアップロードできない

# 原因

## WordPress 5.0.1以上

ファイルチェックが厳格になったらしい。以下のようなコードを通じて得られた「正しいmime type」と比較して、アップロードを制御するようになった。その結果、拡張子はあっていても、本当のファイル形式？が違うとアップロードさせない。

```php
$finfo = finfo_open( FILEINFO_MIME_TYPE );
$real_mime = finfo_file( $finfo, $file );
```

## ファイル形式が複数存在する

上記の問題を解決するには、シンプルに以下のように書く（functions.phpとかに）。例えば、mp3, m4a, m4b が mpeg だけど、ちょっと違うことがある。AudioBook Binder (Mac)で作成したファイルは、 video/mp4 となってしまう。

```php
add_filter( 'upload_mimes', function ( $mime_types ) {
	unset( $mime_types[ 'mp3|m4a|m4b' ] );

	$mime_types[ 'mp3' ] = 'audio/mpeg';
	$mime_types[ 'm4a' ] = 'audio/mpeg';
	$mime_types[ 'm4b' ] = 'video/mp4';

	return $mime_types;
} );

```

一見解決したように見えるが、 AudioBook Builder (Mac) で m4b を作成すると、`audio/x-m4a` という形式になってしまう。つまり、同じ拡張子で複数のmime type が存在する。

このような状況に対して、WordPressでは簡単に解決する方法は用意されていないらしい。wp_check_filetype_and_ext でごちゃごちゃすると良いらしい。

- [Multiple mime types for a given file extension](https://wordpress.stackexchange.com/questions/323750/how-to-assign-multiple-file-mime-types-to-extension/323757#323757)
レイアウトの作り方

#まずはじめに
未来電子テクノロジーでインターンをしている＠reies1204です。
まだProgeteを触り始めて1週間と経っていない超初心者ですが、その中で学んだことを少しでもまとめてみようと思います。
ただし、プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。





#現状
Progateの学習も中級編が終わり、道場編に入りましたが、早速つまづいています。
最初は何から書けばいいのかわからないといった状態です。
でも逆に何から書けばいいのかを考えたときに、自分はレイアウトについて理解が甘かったなと思いました。
そこで今回は自分のレイアウトの知識を整理してみようと思います。
あくまで今回は初級編でのレイアウトに関してのみまとめます。



#レイアウトの作り方
まずは`<html>要素`の中に`<head>要素`と`<body>要素`を入れます。
　`<head>要素`の中には文字コード、ページタイトル、CSSの読み込みを書きます。


　`<body>要素`はヘッダー（header)、メイン（main)、フッター（footer）を`<div>要素`で
　それぞれ分割します。

####ヘッダーの枠組み
ヘッダー部分は「header-logo」と「header-list」の二つの`<div>要素`で構成します。
####メインの枠組み
メイン部分は「copy-container」、「contents」、「contact-form」の三つの`<div>要素`で構成します。
####フッターの枠組み
フッター部分は「footer-logo」と「footer-list」の二つの`<div>要素`で構成します。





以上実際に書いてみると

```html;レイアウト
<html>

 <head>
  1,文字コード
  2,ページタイトル
  3,CSSの読み込み
 </head>

 <body>
   <div class="header">
      <div class="header-logo">あいうえお</div>
      <div class="header-list"> </div>
   </div> 

   <div class="main">
      <div class="copy-container"> </div>
      <div class="contents"> </div>
      <div class="contact-form"> </div>
   </div>

   <div class="footer">
      <div class="footer-logo">かきくけこ</div>
　　 　<div class="footer-list"> </div>
   </div>
 </body>

</html>

```

大まかにこんな感じになります。

#まとめ
自力でやってみるということに対して、思った以上になにもできない部分に割と萎えますが、一方で楽しさも感じているので頑張って続けていこうと思います。
Quiitaの書き方もまだまだ下手なので要勉強ですね。
Django マイグレーションについて

# マイグレーションについて
少しづつ更新。
あくまで、マイグレーション機能を扱えるようになる事を目的に。

手順が抜けていたりして、少々理解し辛い事が多いので、整理目的でひとつひとつ丁寧に。
実際に手を動かして流れを把握。

##  前提条件
以下の環境で動作させる。
- Django 2
- python 3
- mysql 8

## マイグレーションの初歩
マイグレーションを行うにあたっての取っ掛かり。
チュートリアル。
[**こちら**](https://qiita.com/yohei-29/items/93bcdd3e3bcc0f795d53)

## テーブル削除
テーブル削除
[**こちら**](https://qiita.com/yohei-29/items/792c7a6b644cd36144fd)

## 外部キーリレーショナル
RDBを作るにあたって
[**こちら**](https://qiita.com/yohei-29/items/f3627483f852a6d7fa05)
DjangoMigration - マイグレーションの初歩

# マイグレーションの初歩
とっかかり。

##  前提条件
- [**こちら**](https://qiita.com/yohei-29/items/00496c8252014c7c0aad)の環境が前提。
- Djangoが正しく動作していること
- MySQLとの連携が取れていること
- django admin コマンドより、正しくプロジェクトが生成されていること

## マイグレーションの準備
マイグレーション事前準備、基本的なテーブル生成は以下コマンドで行う。
事前に、以下の３つの作業が必要。

```shell
# マイグレーションに必要なテーブル生成
python manage.py migrate

# マイグレションファイルの生成
python manage.py makemigrations web

# 実行するSQLを確認する場合
python manage.py sqlmigrate web 0001

# 生成したマイグレーションファイル(クエリ)を実行
python manage.py migrate

# DBへ、モデルを元にてテーブルが生成されている
```

### １．アプリケーション追加
Djangoコマンドで、以下アプリを生成。

```shell
python manage.py startapp web
```

### ２．インストールアプリの設定
*setting.py*へ、アプリケーションの*models.py* のclassを追記。

```
INSTALLED_APPS = [
    ...
    'web.apps.WebConfig',
]
```

### ３．モデルへ追記
必要な情報を、*model.py*へ追記。

```python:example
from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
```

その他については、[**こちら**](https://qiita.com/yohei-29/items/00496c8252014c7c0aad)。
Laravel carbon,csvインポート

ブラック企業で働いている副業ぴーです。

めちゃくちゃプログラミングが未熟ですが、1日平均4時間のプログラミング学習を習慣化しようと奮闘中
（とりあえず夜の2時くらいになると眠いよね。。）

現在、Laravelで自社の新規事業のwebアプリを開発中！
週末には新大久保のオフィスハウスで開発しとります♪
connpassイベント＝<a href="https://7chord.connpass.com/event/138635/">Laravelで営業ツール開発</a>

それ以外は、自宅で開発♪

開発中に役に立った記事やブログ、開発したソースコードを備忘録として、記載していこうと思います！


#日付取得方法

@yudsuzukさんがqiitaにあげている下記が最高&最高に助かりました。
<a href="https://qiita.com/yudsuzuk/items/ff894bd0b76d4657741d">PHPで日付時刻処理を書くならCarbonを使うべき</a>

@yudsuzukさんのわかりやすい書き方が更に最高&最高ですね！


#CSVインポート方法
世界のアオキさんのブログに記載されている方法が最高&最高なのではないかと思い参考にしようと思います。
参照URL：https://coinbaby8.com/php-csv-import-bulk-insert-laravel.html

バルクインサートの事も記載されており最高&最高です。

#明日の予定
明日7月10日は上記CSVインポートの実装をする予定
フロントエンドの設計のメモ

メモ程度に残しておきます。あくまでも現時点の個人的な意見なので悪しからず。

呼び方はいろいろあるので違うかも。チームのメンバーで認識合わせができていればOKだと思います。

---

#住み分け

- ドメイン
  - システムの登場人物の型とかここでまとめておくと楽かも。data transfer objectみたいな感じで使う。
  - `domain/`とか`model/`とかでいいかなと。`model/`だったらなんかメソッドが生えてそうだけど実際はただの型で、ロジックや状態で使われる感じ。
- ロジック
  - ドメインを使った計算や、ビジネスロジックを書く場所。
  - 他の人がなんて言ってるかわからないけど、`logic/`,`service/`とかでいいかな。
  - ここにロジックを固めて、ブラウザの処理や、UIの情報はいれないようにする。
  - 非ブラウザ環境でも動くべき。単体テスト必須。
- UI
 - `components`って名前のディレクトリがほとんど。Atomic Designっぽくするならここで`atoms`とかを展開する。
 - なるべくロジックのディレクトリ以下にビジネスロジックを入れるように努力すれば、ここではUI関連の処理しか出てこないはず。
 - これは決めだと思うけど、`atoms`や`molecules`はドメインを知らないほうが再利用がしやすい。あくまでのUIパーツとして振舞ってほしい。
- 状態
  - 状態置き場。UIにデータやコールバックを供給するやつ。`containers`とか、`store`って呼ばれたりしてる。
  - 一般的なCRUDの処理は`container`コンポーネントで通信してもいいかな？とも思う。APIのテストもしたいならロジックの部分でやってもいいけど、チーム次第かなと。reduxなら、`action`でやる。
  - 他のコンポーネントと同期するために必要なこともあるけど、選択状態とかUIの状態は極力いれない。

あとは必要に応じて、どこでも使える関数だったりドメインが関係ない処理なら、`lib`とか`util`とか作る。


ECサイトとかイメージすると、ディレクトリにするとこんな感じ?

```
src/
  domain/
    user
    order
    product
  logic/
    user
    order
    product    
  components/
    atoms/
      button
      input
      avatar
    molecules/
      itemList
      searchInput
    organisms/
      globalMenu
      shoppingItemList
    templates/
      Home
      Login
  container/
    Home
    Login
  util/
    string
    url
```

ドメインの部分とロジックの部分は一緒になってもいいかもしれない。

---

# 所感

多くのWebアプリは

- フォーム要素に入力してその内容をjsonにして送信してレコードを作成
- サーバーにリクエストして、データ表示したり
- 表示したものを編集して、jsonでまた送ったり
- 削除したり

だと思うのですが、基本的にUIにロジックを持たせると再利用しにくくなったり、テストがしんどいので、
ビジネスロジックや、ドメインを扱う処理の境界線を意識して、極力UIからUI以外の部分を切り離してロジック側に処理を書いて、そっちをしっかりテスト。

UIをなるべくステートレス(関数コンポーネント)に作るように工夫すれば意識すれば、in-outが明確になり複雑性(テストパターン)は減る。
。いろいろな要望があって、状態をいれないといけない時も、hooks使えばあとから、関数コンポーネントに状態を導入するのも楽なので、開発体験は結構いい。

UI(ブラウザやDOMの処理やreactの処理)とドメインの処理がコンポーネント内でごっちゃ混ぜになっていると結構しんどくなる。

正直Reduxをちゃんと使ったことがないけど、本当に必要になってから必要なものを入れるみたいなスタンスの導入でもOKだと思う。containerでやったほうが概念理解やボイラープレートの多さによって戸惑うことが少ないと思っています。(少なくとも自分が携わったやつでは問題がなかった。)参考: [You Might Not Need Redux
](https://medium.com/@dan_abramov/you-might-not-need-redux-be46360cf367)
「おしらせ、通知」などの処理は別画面に遷移したり、他のコンポーネントから変更されたものを反映させるのが難易度高いので、有効だと思う。
あとは多言語情報とか全部のコンポーネントで共有されてて、propsのバケツリレーが辛いとかだったら、[コンテクスト](https://ja.reactjs.org/docs/context.html)でもいいと思う。
お知らせもコンテクストAPIで実装できるならそれでもOKだと思う。

---

# 再確認

- 登場人物は整理しておくと、ロジックや状態で使える。
- UIはUIに徹した方がいい。
  - UIは変更される可能性が高いので、ドメインを加工する処理がちらばってると邪魔だし、反映漏れとかありそう。
  - ドメインをいじるような処理をUIで書くと開発効率悪い。
- ロジックは切り出す
  - UI情報と隔離するのがポイントで切り出して関数テストをしっかり。
  - ここの関数とかは積極的に組み合わせて書いていくと短くできる。
  - 結局関数のまとまりなので、副作用無しで参照透過性の高いものが好まれる。
  - 再利用性も高まるし、UIの変更にも強くなる。
- 状態はなるべくコンパクトに(無駄なUIの情報は持たせない)
  - 公開範囲も最小限にしておいた方がいい。選択状態はUIが持つべき。無駄に親に持たせないようにする。子だけで完結する状態は子に持たせるべき。
  - `store`で持つ情報は本当にそこじゃないとダメなのか考える。
omxplayer の全画面表示を阻止する

# 全画面を阻止したい

動画再生支援機能をサポートしているおかげで、VLC media playerではコマ飛び・音飛びが発生する動画でもスムーズに再生できます。しかし、再生するときに全画面で表示されてしまいます。

全画面で再生したくないときもあるので、全画面表示を阻止する方法です。

まず、通常の起動方法

```powershell
$ omxplayer ファイル名
```

全画面表示を阻止

```powershell
$ omxplayer --win 'x1 y1 x2 y2' ファイル名
```

``x1``と``x2``には、それぞれ表示させたいウィンドウの左端のX座標と右端のX座標、``y1``と``y2``には、それぞれ表示させたいウィンドウの最上部のY座標と最下部のY座標を入力します。

例えば、画面の左上に480×270のウィンドウで表示させたい場合は

```powershell
$ omxplayer --win '0 0 480 270' ファイル名
```

となります。また、ループ再生をするなら

```powershell
$ omxplayer --loop --win '0 0 480 270' ファイル名
```

となります。

ただし、ウィンドウの移動はできません。ウィンドウを動かしたい場合は、他のソフトを使いましょう。
vue.jsのディレクティブをまとめてみました。part1

#v-if

```html:qiita.html
<div id="app">
        <p v-if="error">エラーです</p>
    </div>
 <script src="https://cdn.jsdelivr.net/npm/vue"></script>
 <script>
let app=new Vue({
    el:"#app",
    data:{
        error:true//falseにすると画面に'エラーです'が表示されなくなる
    }
});
</script>
```


#v-bind
### {{}}マスタッシュ記号を、html属性の中に出力できないために使われる。
```html:index.html
<div id="app">
        <p class="{{error_class}}">{{error_class}}</p>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
 <script>
   let app=new Vue({
  el:"#app",
  data:{
      error_class:"error"
  }
});
```
この状態だと出力されない<img width="960" alt="2019-07-10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439295/462551dc-88d6-cea5-f23d-21312a1477a9.png">
##そこでv-bindをつかう
```html:index.html
 <div id="app">
        <p v-bind:class="error_class">エラーです</p>
        <img v-bind:src="img_src">
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
 <script>
   let app=new Vue({
  el:"#app",
  data:{
      error_class:"abc",
      img_src:"img01.png"
  }
});
    </script>
```
うまく出力されました
<img width="960" alt="2019-07-10 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439295/fa355cb7-1123-3b38-deae-56d184891690.png">
参考url
[Vue.js入門 #03：if構文とディレクティブ](https://www.youtube.com/watch?v=MYhgkaCEdYo&list=PLh6V6_7fbbo-SZYHHBVFstU2tp0dDZMAW&index=3)
[Vue.js入門 #04：Vue.jsによる属性の書き換え](https://www.youtube.com/watch?v=qzFJfekigY8&list=PLh6V6_7fbbo-SZYHHBVFstU2tp0dDZMAW&index=5&t=0s)
Homebrewを使ってSassのコンパイルをやったので備忘録

### Xcodeのinstall

```sh
xcode-select --install
```

### Homebrewのinstall
公式：https://brew.sh/index_ja.html

```sh
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

↑ここまでは、記憶で書いているので、動かなかったら別の記事でご確認ください。多分動くはず。。。

### Homebrewでsassがあるかどうか調べる
```sh
brew search sass
libsass                                              sassc
```

ない。。

早いと噂のC++libSassを導入する。
sassの仕様に準拠しているらしいです。
コマンドラインから利用できるsasscを導入する。

```sh
brew install libsass
brew install sassc
```

### sasscの保存先と、versionの確認
```sh
which sassc
/usr/local/bin/sassc
```

```sh
sassc -v
sassc: 3.6.1
libsass: 3.6.1
sass2scss: 1.1.1
sass: 3.5
```

### 実行確認

##### SASS構文で書いてみる
```css:sample.sass
#main
  width: 600px;
  p
    margin: 0 0 1em;
    em
      color: #f00;
```

##### SCSS構文で書いてみる
```css:sample2.scss
scss
#main {
  width: 600px;
  p {
    margin: 0 0 1em;
    em {
      color: #f00;
    }
  }
}
```

##### コンパイル
```sh
sassc sample.sass sample.css
sassc sample2.scss sample2.css
```

問題なくコンパイルできた後に同じ階層に
sample.css,sample2.cssが作成されていればOKです。

見ていただき、ありがとうございました。

SASSはは拡張子が.sass
SCSSは拡張子が.scss
となるようですね。

参考文献：
爆速のlibsassをインストールしてcompassも使える様にする方法
https://www.kalium.net/image/2017/04/24/%E7%88%86%E9%80%9F%E3%81%AElibsass%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6compass%E3%82%82%E4%BD%BF%E3%81%88%E3%82%8B%E6%A7%98%E3%81%AB%E3%81%99%E3%82%8B/
速いsass、libsassについて超簡単な説明
https://qiita.com/tkosuga@github/items/46094b630f57594e86f0
5W1Hで一つだけ選ぶなら？(勇者編)

##はじめに
IT業界で仕事をする上で「確認すること」って避けては通れなくないですか？
むしろ確認が仕事の大半を占めると言っても、過言ではないと思います。
QAシート運用、口頭での仕様確認、客先との納期調整…etc
色々ありますよね。
しかし、どんな確認の時でも神器扱いされる「5W1H」
これさえ押さえておけば致命的なエラーは防げるという噂です。
そんな「5W1H」もちろん場合によりけりなのは重々承知なんですが、
結局のところ一番重要なのはどれなんだろー？
と疑問が湧いてきたわけです。
そして難しいことを考えるときはドラクエの世界に置き換えるのです。

####■When勇者の場合
王様「魔王を倒してこい」
When「いつまでに倒せばいいですか？」
王様「この城も持ってあと一月といったところじゃ、それまでに何とかならんかのう」
When「分かりました」

・・一月後・・
When「やはり一月では無理です。カンタダを倒すので精一杯でした」
王様「言い訳は無用じゃ、見てみろこの城を・・早々に立ち去るがよい」

####■Where勇者の場合
王様「魔王を倒してこい」
Where「魔王ってどこにいるんですか？」
王様「城の外から北西の方角に100km程行った山の中じゃ」
Where「分かりました」
王様「よかろう、行ってくるがよい」

・・数日後・・
Where「北西の山着いたけど、登るの無理だろこれ。もう勇者辞めよ。」

####■What勇者の場合
王様「魔王を倒してこい」
What「何を使えば倒せますか？」
王様「勇者の剣なくして魔王と対等に戦うことはできん」
What「分かりました」

・・数日後・・
What「ようやく勇者の剣、見つかったぞ！」
What「ついでに不死鳥もいたし、これで魔王のとこいくぞー！」
魔王「ぐぬぬ勇者め、来おったか。小賢しい。魔王の攻撃！」
What「うあぁぁ。皮の盾が真っ二つに。ぐふっ。。」
What勇者は息絶えた

####■How勇者の場合
王様「魔王を倒してこい」
How「どのようにしたら倒せるようになりますか？」
王様「コツコツとレベルをあげるのじゃ。それが一番の近道じゃ。」
How「わかりました」

・・数日後・・
How「ふぅ・・。この辺りの魔物も軽く倒せるようになったし」
How「体を鍛えて、こつこつレベルを上げるのって楽しいな」

・・数年後・・
How「よし、80レベルになったぞ！いい汗かいた！」
How「あれ、何か忘れてるような、まぁいっか」

####■Who勇者の場合
王様「魔王を倒してこい」
Who「魔王って誰ですか？」
王様「人々を苦しめる悪の権化よ」
Who「わかりました」
Who「王様、ここのところの度重なる増税、その他傍若無人な振る舞い。」
Who「民を苦しめてるのに気が付いていないわけではあるまい。」
王様「な、なにを・・　ぐ、ぐあぁぁ。」
Who「ふ・・一生牢屋か。それも悪くない」

####■Why勇者の場合
王様「魔王を倒してこい」
Why「なぜ魔王を倒すのですか？」
王様「城下町で魔王の手下に襲われたという噂が流れておるのじゃ」
Why「だから、なぜ魔王を倒すのですか？」
王様「だって、民が襲われたんだよ？」
Why「あくまで噂ですよね？裏はとったのですか？」
王様「ぐぅ・・　兵士にもう一度調べさせて来い！」
Why「じゃあとりあえず家帰りますんで　( ˘ω˘)ｽﾔｧ」
phpmyadminからherokuのcleardbへ移行

#phpmyadminからインポート
phpmyadminから、移行したいテーブルを選択して、**エクスポート > 実行**をすると.sqlファイルがダウンロードできる。
#ターミナルでコマンド入力
ターミナルで、```mysql --host=HOST --user=USER_NAME --password=PASSWORD --reconnect DB_NAME < ＊＊＊＊.sql```
で終了
[SwiftUI]ButtonやNavigationLinkで囲んだ画像や文字が青色に塗りつぶされてしまったらrenderingModeを指定しよう

SwiftUI以前の開発環境でも同じような現象ありますね。一度や二度首を捻ったこともあるのではないでしょうか？

そう、画像なら、レンダリングモードを指定しないといけないやつですね。

## 青くなるコード例
```swift
NavigationLink(destination: Text("NextView")) {
    Image("imageString") // 青く塗りつぶされる
    Text("To Next") // 青色文字になる
}
```

という感じでNavigationLinkで囲むと、それまで通常通り表示されていた画像が青一色に、文字色も青色になってしまいます。
SwiftUIの場合は画像に`.renderingMode(.original)`を指定すればOKです。
文字も色を指定しましょう。

## 改善策
```swift
NavigationLink(destination: Text("NextView")) {
    Image("imageString")
        .renderingMode(.original) // templateではなくoriginalを指定
    Text("To Next")
        .color(.primary) // 好きな色を指定
}
```

現場からは以上です！
swaggerhubを使ってAPI作成後、公開まで

#概要

swaggerhubを使ってAPI設計しつつ実装し、公開までが非常に便利だったので、少しはまった点など忘れないように一通り記載しておきます。

使用したツールはswaggerhubとswagger inspectorの二つです。swaggerhubでyaml形式もしくはjson形式でAPIの設計が可能です。swagger inspectorはAPIのテストに利用しました。swaggerhubでもテストは可能ですが、より詳細にパラメーターを操作したり、ログが記録されるので、何回も同様のクエリを送信する場合などにはswagger inspectorの方が便利です。

https://swagger.io/tools/swaggerhub/
![a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426480/e6e553af-b13e-b654-cc86-708c5c740bf0.jpeg)

https://inspector.swagger.io/builder
![b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426480/5f075e8c-f031-aefd-429e-fe8b120cc5bc.jpeg)

#OpenAPI
swaggerhubではswagger2.0とswagger3.0(OpenAPI 3.0)で記述することが可能で、新規で作成する場合はswagger3.0を選択しましょう。記述の仕方が少し違うようです。

API仕様書書くならswagger v2.0からv3.0に変更する際のポイント
https://qiita.com/shunichi_com/items/e63114f8d67beba14bfd

#githubと連携
swaggerhubで編集ボタンを押すと自動でgithubにプッシュすることができます。編集ログとして後程確認するなど便利なことが多いので連携することをお勧めします。

githubで先にリポジトリを作成、https://github.com/settings/tokensのPersonal access tokensでaccesstokenを作成します。（作成時、repo関係の権限は有効にしておきます。）

その後、swaggerhubで右上の設定ボタンをクリック→「Edit Github Push」をクリック、access token及びリポジトリなどの項目を入力し、「SAVE」を押します。
![d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426480/ee7f9626-fe44-7144-16f5-a8830554ba3c.jpeg)

その後、ファイルを編集後、上部にある「SAVE」ボタンを押すと自動でプッシュされます！

#componentsを使おう
components機能を使い回すことが可能です。componentsを使うと記述量が減りますし、APIのSchemaとして登録されるのでAPI利用者によりわかりやすく表記されます。

```yaml:api.yaml

components:
  schemas:
    Messages:
      type: object
      properties:
        messages:
          type: array
          items:
            type: string
          example:
            - "success"
```

#allOfとOneof
allOfとOneofという記述の仕方があり、使用すると大変便利です。componentsを作成し、それを合わせたり、選択肢を表記する時に使用します。

allOfはスキーマを合わせるときに使用します。下記の例はMessagesのcomponentとWebhooksのcomponentを合わせるという意味になります。

```
allOf:
    - $ref: '#/components/schemas/Messages'
    - $ref: '#/components/schemas/Webhooks'
```

oneOfはどちらかが適用されるという意味で、選択肢を表したい時に便利です。

```
oneOf:
    - $ref: '#/components/schemas/Cat'
    - $ref: '#/components/schemas/Dog'
```

公式に詳しい説明が載っています！
https://swagger.io/docs/specification/data-models/oneof-anyof-allof-not/

#API公開
APIを公開する時は、自サービスにそのAPIドキュメントを載せたりすると思いますが、swaggerhubで自動でドキュメントを作成され、そのまま自サービスのホームページにhtmlを張り付けることが可能です。また、右上の「View Documentation」をクリックすると、いい感じのAPIドキュメントページを閲覧することができます。
![p.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426480/8be2b2c5-0ca2-274d-cd50-e6aad0448975.jpeg)



「try it out」の機能を使うとそのAPIのテスト送信をすることもできます！
railsのcontrollerからjavascriptに対して変数を渡す

###About
railsからjavascriptに対して変数を渡します。
html.erbファイル内にscriptタグでjavascriptを書いた場合に変数を渡せる方法です。

今回は、controllerで、モデルのレコードを数行取り出し、それをそのままJSに渡す方法を記載しています。

###Environment
この記事ではmacbook(unix)にインストールしたruby 2.5.1p57, Rails 5.2.3を使用しています。

#変数の渡し方
## controller内での変数の定義
まずは変数をcontroller内で定義します。
今回は配列を渡してみます。

```ruby:users_controller.rb
class UsersController < ApplicationController

  def show
    @user = User.find(params[:id])
    @sleeps = @user.sleeps.order('date DESC').includes(:user).limit(14).reverse
  end
end
```

##html.erbで変数を受け取る
ここからは力技です。参考までにamchartsのスクリプトを拝借しています。
他に良い方法があると思いますので、最終手段くらいに思っていただければと思います。
また、良い方法がある方、コメントいただけると幸いです。

```html:show.html.erb
<!-- Chart code -->
<script>
    //略
    // Add data
    // 推奨(ムダなスペースなどが含まれません。)
    var sleepings = '<%== JSON.dump(@sleeps) %>';
    // 次点(スペースなど余計なものが入る可能性がありますが、渡せる事には渡せます。)
    var sleepings = '<%= @sleeps %>';
    // 以下略
</script>
```
      
この様にすることで、javascriptの変数として、文字列を渡すことができます。
ただし、ここで注意しなくてはいけないのが、あくまで　javascript側には文字列が渡されるだけ、ということです。

（また、今回はモデルの中身を渡しているため、カラムごとの値を抽出してJavaScriptに渡したい！という場合は、コントローラやhtml.erb内で変換してあげてください。)
<details><summary>html.erb内での変換</summary><div>
筆者はこの様に変換しています。

```ruby:show.html.erb
@sleeps = @sleeps.map {|sleep| sleep.id}
```
</div></details>

そのため、以下の様に文字列を分解して、配列に変換しています。
文字列の[]をそれぞれ置換の要領で削除し、カンマでsplitし、配列化します。

```html:show.html.erb
<!-- Chart code -->
<script>
    //略
    // Add data
    var sleepings = '<%== JSON.dump(@sleeps) %>'.replace(/\[/g, "").replace(/\]/g, "").split(',');
    // 以下略
</script>
```

これでjavascriptにrailsのcontrollerから値を渡す事ができます。
...ゴリ押し感が否めないですが。

##最後に
ここまでゴリ押し感が強いものを共有するべきか悩みましたが、同じ様な悩みを抱えている方が少しでもいらっしゃれば、その方の助けになるかもと思い書きました。
さらに良い方法がありましたら、是非教えてください！

###筆者について
TECH::EXPERTにて4月よりruby, railsを学習している未経験エンジニアです。
記載内容に不備・不足があればご指摘いただけると幸いです。
至らぬ点ばかりですので、改善点がありましたらどんどんご指摘下さい！
超絶かんたんなMakefile

Makefileの書き方はすぐ忘れる。でもソース1本ならこれだけでいいと思っている。


適当なサンプル。

```console
$ ls
Makefile  test001.c
$ cat test001.c
#include <stdio.h>
int main(void)
{
  printf("hello world.\n");
  return 0;
}
```

ソース名と同じターゲットを書けばいい。

```console
$ cat Makefile
test001:

$ make
cc     test001.c   -o test001

$ ls
Makefile  test001  test001.c
$ ./test001
hello world.
```

さすがに``test001:``だけでは悲しいので、オプションとcleanぐらいは書いておく。

```Makefile
CFLAGS=-Wall -Wextra
test001:
all: test001
clean:
        rm -fv test001
```
PHPでオブジェクトをシリアライズする

[serialize](https://www.php.net/manual/ja/function.serialize.php)を使って`Serialization of 'Closure' is not allowed`になった場合は[Opis Closure](https://opis.io/closure)を使ってみると良さそう。
[super_closure](https://github.com/jeremeamia/super_closure/blob/master/README.md)というのもある。

# [Opis Closure](https://opis.io/closure)

```
composer require --dev opis/closure
```

```php
use function Opis\Closure\{serialize as opisSerialize, unserialize as opisUnserialize};
```

```php
$path = 'tests/fixtures/serialize/objectName';

// 保存
$file = new \SplFileObject(base_path($path), 'w');
$file->fwrite(encrypt(opisSerialize($objectName))));// encrypt、base_pathはlaravelのもの
```

```php
// 復元
$object = opisUnserialize(decrypt(file_get_contents(base_path($path))));// decrypt、base_pathはlaravelのもの
```

シリアライズされた文字列はセキュリティ的な意味で気を付けたいので、ものによっては暗号化


**使いどころの例**

* 複雑なオブジェクトを返すメソッドを持つ外部APIの公式ライブラリがある。
* このオブジェクトを引数とするアプリ内のメソッドを作ってみたのでテストをしたい。
* テストではテストのAPIでも叩きたくないが、ライブラリ使用しないで自力でオブジェクトを作るのが難しい。

上記のとき、開発用のAPIを叩いた際に取得できたオブジェクトをシリアライズしてテスト時にデシリアライズして使うようにしてみたり。
SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table definitionの解消

###タイトルのエラーについて
docker上でテーブルを作成しようとphp artisan migrateをかけたら初めてこのエラーに遭遇
解消法はいたって簡単
最初に書いていたmigrationファイル

```php5:migration.php
Schema::create('questions', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id');
            $table->increments('tag_category_id');
            $table->string('title');
            $table->text('content');
            $table->timestamps();
            $table->softDeletes();
        });
```
これだとタイトルのエラーが出た。
立てた仮説は主キーがふたつできてしまっているからエラーになっているのではないかと予想。
なので、こう変更して再びマイグレーション。

```php5:migration.php
Schema::create('questions', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id');
            $table->integer('tag_category_id'); //変更
            $table->string('title');
            $table->text('content');
            $table->timestamps();
            $table->softDeletes();
        });

```

###結果
無事マイグレーションが成功
L2なVPNでMacで学内から自宅のホームシェアリングにアクセスしてみた。

# なぜこんなことをしたの
私の使っているSynology NASには、iTunes server機能（ホームシェアリング）がありまして、**iTunesがインストールされているマシンへとDLNAのようにストリーミング配信**してくれるんです。
これが本当に便利で、私の128GBストレージのMBAでは容量を食わず、使い勝手が最高です。
→__追記:2020-04-07__
Synology含めQNAPなど多くのメーカのNASのiTunes Server機能がmacOS Catalinaのミュージック.appだと使い物にならなくなっています．この前書いた記事では対応策を載せております．ぜひ参考にして対策して下さい．もちろん本記事の方法はこの記事の対応策を利用しても使えます．→https://qiita.com/Miutaku/items/e24d15fe157dc16ef860
__--追記終わり--__


しかし、決して家の外からはそのままではアクセスできません。
# そこでVPNですよ〜〜〜〜
日本人は賢くて，**SoftetherVPN**という大変素晴らしいものが開発されています。詳しいことはSoftheterのHPを見ていただきたいのですが、Etherフレームごとカプセル化してくれるVPNなのです。だから、WindowsではVPNクライアントアプリをSoftetherから拾ってきてGUIでそのまま設定すればいいんです。しかし、**MacやLinuxではそうはいきません**。CUIアプリで接続を行い、うまく全通信をVPNサーバ宛にルーティングしてやる必要があります。
また、私の学校ではプロキシサーバが上流にあり、TCP443ポートしか空いていません。そこで次のように通します。

***Mac*→*Wi-Fi*→*ゲートウェイ*→*プロキシサーバ*→*インターネット*→*私のおうち*→NAS**

#じゃあどうすんだ
単刀直入に言うとOpenVPNを使いました。CUIでルーティングするのはスクリプト書いたりと面倒なので…
MacではTunnelBlickを使います。インストールしておきましょう。
https://www.tunnelblick.net/
#今回のケースでの設定の仕方
では，早速やっていきましょう．
##1.OpenVPNの設定画面を開く
MacでVPN Server Managerを立ち上げ、OpenVPN/MS-SSTP Settingを開きます。
##2.設定ファイルの生成
真ん中のGenerate a Sampleうんたらを押します。設定ファイルを保存する場所を選択する画面が出ると思います。/Desktopなど適当なところに保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/8d84ea57-f644-f9a9-3a2d-6372f38e295b.png)
##3.設定ファイルの書き換え
保存したOpenVPN~.zipを解凍し、中のフォルダにある「〜l2.ovpn」をテキストエディタで開き、環境に合わせて書き換えます。

```l2.ovpn
dev tap
proto tcp #学内がudpプロトコルを弾くのでtcpにした
remote XXXX.v4.softether.net 443
http-proxy proxy.xxx.yyy 8080 ~/yourdirectory/user_auth.txt basic #学内プロキシ経由接続(ユーザ認証あり)
cipher AES-256-CBC
auth SHA1
resolv-retry infinite
nobind
persist-key
persist-tun
client
verb 3
auth-user-pass
<ca>
.
.
.
```

# TunnelBlickで設定、接続、確認までする
##1.個人用でインストール
先程のovpnファイルをTunnelBlickで開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/b139162c-b5f0-79ff-a022-3043042a0a8d.png)
##2.OpenVPN設定画面で、次のようにする。
下のウィンドウは「詳細設定」を押すと出ます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/92c68c9f-8b51-c05b-96e3-4431d411598b.png)
##3.接続ボタンを押す。パスワードが求められたりしたら認証する。
自分のユーザ名、パスワードを入力する。
##4.接続完了すると次のような画面が出るかもしれない。
無視していいです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/ecb5ab16-fb30-7af0-a4a2-daef0544cc20.png)

##5.iTunesからNASがみえたよ！
やったね！再生もできるよ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/a2db0e11-63bb-5655-e489-1132332939d0.png)
とほほ、、、numpyの初歩を理解していなかったでござる

## 背景
* つまらない間違えで躓き、１時間近く悩んでしまった
* 画像をPillowで読み込み、色々処理を行った経験があったので、ノリでできるだろうと思っていた。

## 目的
* つまらない間違えを公衆の面前にさらし赤っ恥を書くことで、二度と間違えないように自らを戒める。
* numpyで画像を取り扱う際のポイントを把握する

## 何を間違えていたか
### やりたかったこと
* 100×100の画像を作り、色を指定する

### こう考えた
* 画像だから２次元配列でしょ～```np.zeros((100,100))```を作って、ここの要素にRGB値入れればいいじゃん
* スライスで全要素指定して、RGB値ぶっこめばべた塗できるはず！

```python

im = np.zeros((100,100)) #間違えポイント1
im[:,:] = (255, 128, 54)
```

* 怒られた

```
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in 
      1 im = np.zeros((100,100))
----> 2 im[:,:] = (255, 128, 54)

ValueError: could not broadcast input array from shape (3) into shape (100,100)
```

* なんかよくわからん。
* そうか、きっと要素にタプルを入れようとしたので怒られたんだ（間違えポイント２）

* よし、タプルはオブジェクトだから....ググるググる
* ```np.full((100,100), object)```で100×100のオブジェクトを用意してここにタプルを・・・・

:skull::skull::skull::skull::skull::skull::skull::skull::skull::skull::skull::skull:

だめだぁああああああ
奥の手を使うか・・・
100×100サイズの画像```'img001.png'```を用意してっと（某pなんとかラーニング風）

```python
import cv2
im = cv2.imread('img001.png')
im[:,:] = (255, 128, 54)
print(im[50,50])
```

```
 (255, 128, 54)
```
* ふ、思い通りだ・・・

### 何がいけなかったか
* 間違えポイント1

カラー画像は３次元のデータです。位置情報2Dと色情報1D。
しかし、私が定義したのは```np.zeros((100,100))```2次元の配列でした。
ここに、要素数3のタプルをネジ込もうとしていたのです。

* 間違えポイント2

エラーメッセージを読んでいない
メッセージはちゃんと親切に教えてくれているジャマイカ
>ValueError: could not broadcast input array from shape (3) into shape (100,100)

値が間違ってるよ。要素数3の配列は、100×100にブロードキャストできないよ。

優しい。

その優しさを無視してあらぬ方向にさまよい続けた私。
まるで　さまようよろい　のようだ

### なぜ間違えに気が付かなかったか

このコードが正しく動作するのを知っていたが、中で何がなされているのか理解していなかったからである。

```python
import cv2
im = cv2.imread('img001.png')
im[:,:] = (255, 128, 54)
```

```im[:,:] ```を見て2次元☆彡って思ってしまっていた。この早とちりがすべての元凶だった。


まず、imはshape(n,m,3)のndarrayである。次元数は3である。だってカラー画像だもん。
im[:,:]は要素数3である。nとmの全てを取得し残りの次元の配列を表していたのであった。
そして、タプルでそれぞれの要素に値を代入していたのだった。

### どうすべきだったか

もはや言うまでもありませんが・・・
い、一行・・・

```python
im = np.full((100,100,3), (255, 128, 54), dtype='uint8')
```
opencvで処理をすることを考慮するとuint8形式が良いでしょう