OmniAICreator/Qiita-1.07M huggingface dataset:
rspecで標準エラーをチェックするときの注意点

# 結論

rspecの `output` と `to_stderr` の組み合わせでは、 `$stderr` はテストできるが、 `STDERR` はテストできない。
`to_stderr` の代わりに、 `to_stderr_from_any_process` を使えば `STDERR` もテストできる。ただし、 `to_stderr` に比べてとっても遅いらしい。

# 経緯

rspecにて、標準エラーに出力しているコードのテストを書こうとしたところ、`to_stderr` では `STDERR.puts` の出力が拾えなかった。

# 調査

いろいろ試したところ、 `$stderr.puts` や `warn` の出力は `to_stderr` で拾うことができた。

## 調査結果

https://www.rubydoc.info/github/rspec/rspec-expectations/RSpec%2FMatchers:output

こちらによれば、 `to_stdout` や `to_stderr` は `$stdout` や `$stderr` を一時的に置き換える働きをするので、 `STDOUT` や `STDERR` に対しては利用できない、とのこと。
`to_stdout_from_any_process` や `to_stderr_from_any_process` であれば、 `STDOUT` や `STDERR` に対しても利用できる模様。ただし、 `to_stdout` や `to_stderr` に比べてとても遅いらしい。

### サンプルコード

``` ruby
# coding: utf-8
describe '標準エラーへの出力' do
  context '$stderr(to_stderr)'do
    it do
      expect { $stderr.print 'error via $stderr' }.to output('error via $stderr').to_stderr
    end
  end
  context 'STDERR(to_stderr)' do
    it do
      expect { STDERR.print 'error via STDERR' }.to output('error via STDERR').to_stderr
    end
  end
  context '$stderr(to_stderr_from_any_process)'do
    it do
      expect { $stderr.print 'error via $stderr' }.to output('error via $stderr').to_stderr_from_any_process
    end
  end
  context 'STDERR(to_stderr_from_any_process)' do
    it do
      expect { STDERR.print 'error via STDERR' }.to output('error via STDERR').to_stderr_from_any_process
    end
  end
end
```

### サンプルコードの実行結果

``` bash
% bundle exec rspec
.error via STDERRF..

Failures:

  1) 標準エラーへの出力 STDERR(to_stderr) should output "error via STDERR" to stderr
     Failure/Error: expect { STDERR.print 'error via STDERR' }.to output('error via STDERR').to_stderr
       expected block to output "error via STDERR" to stderr, but output nothing
     # ./spec/stderr_spec.rb:10:in `block (3 levels) in <top (required)>'

Finished in 0.03459 seconds (files took 0.11677 seconds to load)
4 examples, 1 failure

Failed examples:

rspec ./spec/stderr_spec.rb:9 # 標準エラーへの出力 STDERR(to_stderr) should output "error via STDERR" to stderr

```

サンプルコードの実行結果より、 `STDERR` と `to_stderr` の組み合わせのとき、標準エラーが拾えていないことがわかる。
【Vue.js】単一ファイルコンポーネント〜機能解説からビルド〜

##コンポーネントと単一ファイルコンポーネント
**【コンポーネント】**
コンポーネントとはそれ自体がインスタンスで再利用可能という性質を持っています。
javascriptのtemplateオプションなどを利用してHTMLのデータを作り、それを部品化できます。

**【単一ファイルコンポーネント】**
コンポーネントが上記のように主にHTMLのデータを一括りにしたものに対し、単一ファイルコンポーネントはHTMLに加えjavascript、cssも一括りに設定したファイルごと部品化できます。

コードを修正するために、関連したファイル間を行ったり来たりする必要が少なくなるので、保守性に優れ、グローバル変数による名前空間の汚染問題を解消できたりします。
（拡張子：`ファイル名.vue`）
###単一ファイルコンポーネントの仕様
`template`、`script`、`style`の３つのブロックから構成されています。

```vue
<template>
  <!-- 主にhtmlで記述 -->
</template>

<script>
export default {
  // 主にjavascriptで記述
}
</script>

<style>
/* 主にcssで記述 */
</style>
```
####template
templateオプションに対応するブロック

【主な仕様言語】
`HTML`


コンポーネントのtemplateオプションと同様、マスタッシュ記法やディレクティブなどの文法がそのまま使えます。

####script
UIの振る舞いを制御するブロック
【主な仕様言語】
`script`

scriptタグはファイル内に最大で１つです。
他のコンポーネントをインポートするには`import`構文を利用できます。

```vue
<script>
import MyModal from 'my-modal'
export default {
  ...
}
</script>
```
####css
UIの見た目を制御するブロック
【主な仕様言語】
`css`

１つのファイルに複数のタグを仕様でき、ファイル毎にスタイルをカプセル化できます。
これによりスタイル定義の干渉を回避できます。

```vue
<!-- カプセル化 -->
<style scoped>
  .message {
    color: red;
  }
</style>

<!-- グローバル化 -->
<style>
  .theme {
    color: blue;
  }
</style>
```
##単一ファイルコンポーネントのビルド

例として下記のコードをビルドします。

```vue:sample.vue
<template>
  <div class="theme">
    <h1>グローバル</h1>
    <h2 class="message">{{ message }}</h2>
    <p>グローバル</p>
  </div>
</template>

<script>
export default {
  // dataは関数で定義
  data() {
    return {
      message: 'カプセル'
    }
  }
}
</script>

<!-- カプセル化 -->
<style scoped>
  .message {
    color: red;
  }
</style>

<!-- グローバル化 -->
<style>
  .theme {
    color: blue;
    text-align: center;
  }
</style>
```
適当なディレクトリに保存し、ターミナルで保存した場所に移動。
ビルドして表示するコマンドを入力します。

```terminal
$ cd ディレクトリの場所
$ vue serve sample.vue --open
```
`Local:   http://localhost:8080/ `が表示されるのでブラウザに立ち上げます。
下の画面になっていれば成功です。

<img width="577" alt="スクリーンショット 2019-07-13 11.13.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429297/2bdba39b-8694-a9d1-2cdd-8e0c1fafbca7.png">

##外部ファイルのインポート
単一ファイルコンポーネントでは、各ブロックに置いてscr属性でファイルをインポートできます。
既存のアプリケーションのファイルを流用できるので便利です。
先ほど例に出したコードは、このように書き換えられます。

```vue
<!-- template部分をtemplate.htmlに記述し読み込み -->
<template src="./template.html"></template>

<!-- script部分をscript.jsに記述し読み込み -->
<script src="./script.js"></script>

<!-- style部分をstyle.cssに記述し読み込み -->
<style src="./style.css"></style>
```
---
今回は以上です。
まだ紹介できていない機能などあるので、今度また書こうと思います。
ここまでで補足や訂正などありましたら是非ご教授いただけると嬉しいです。
最後まで読んでいただきありがとうございます。
iTerm2のプロファイルをコマンドで切り替える

# 概要

iTerm2 でプロファイルをコマンドで切り替える方法です。
ターミナルは黒がいいとか白がいいとかいろいろあると思いますが、iTerm2にはいろいろなカラースキームが用意されています。自分好みに変えたい、眼のステータスによって切り替えたいとか、複数ウインドウを開いたときに環境ごとに切り替えたいとかいろいろあるので、変更方法を調べました。
MacBook Pro のタッチバーを使える場合はタッチバーから切り替えできるのですが、タッチバーなしのキーボードを使っている場合はコマンド切り替えの方が一番楽な方法だと思います。

# 環境

macOS Mojave 10.14.5
iTerm2

# 手順

### カラースキームのダウンロード

iTerm2 のカラースキームはこちらからダウンロードできます。また、どのスキームがいいのかも一覧化されているのでここで確認するとよいです。
https://iterm2colorschemes.com/

### カラースキームのインポート

ファイルを解凍するといろいろファイルがあるのですが、schemesしか使いません。
このディレクトリにカラースキームが入っているので、このファイルをiTerm2 にインポートします。

1. iTerm2 のメニューから Preferences -> Profilesタブ を開き、新しいプロファイルを作成してください
2. 変更したいプロファイルを選択し、colorタブに移動します
3. 右下のColor Presets... と書かれているドロップダウンメニューを押します
4. Import... を押し、ダウンロードしたカラースキームを選択します
5. このままだとインポートしただけで変更されていないのでもう一度Color Presets...を押し、インポートしたカラースキームを選択します

この要領でプロファイルを作成します。

### プロファイルの切り替え

作成したプロファイルをコマンドで切り替えるには下記を実行すればよいです。
プロファイル名のところにはプロファイル名を入力してください。カラースキームの名前ではないので注意。

```
$ echo -e "\033]1337;SetProfile=プロファイル名\a"
```

ただ、これを入力するのは面倒なので、使用しているシェルにエイリアスを登録します。
下記一行を追加します。（エイリアス名は任意です）

```
alias chpf='(){echo -e "\033]1337;SetProfile=$1\a"}'
```

エイリアス登録後は下記のコマンドで切り替えることができるようになります。（変更した後はsource コマンドでシェルの設定を読み込んでください。もしくは新規ウインドウ開くでもよい）

```
$ chpf プロファイル名
```

以上〜

本番環境や検証、開発環境で使い分けるといいですね。

# 参考

https://github.com/localstack/localstack/issues/480
ページ翻訳使用時 DOMが更新されにゃあああい

こんにちは、六坂です。
今回はブラウザのページ丸ごと翻訳してくれる機能を使用したときDOMが更新されない現象の解決策をのこします
# 理想
[![理想](https://i.gyazo.com/bb8789083865d03c3b5ab85bed26431d.gif)](https://gyazo.com/bb8789083865d03c3b5ab85bed26431d)
textが変更されたとき
変更点にあった翻訳を出力させたい

# 現実
[![更新されません](https://i.gyazo.com/22773d669984e597beca8cca8bfec577.gif)](https://gyazo.com/22773d669984e597beca8cca8bfec577)

bikuともしません
なんで？:sob:

### 実装
```vuejs
<template>
  <div>
    <p>{{ text }}</p>
    <input type="text" v-model="text" />
  </div>
</template>
<script>
export default {
  data() {
    return {
      text: 'こんにちは'
    }
  }
}
</script>
```
[![ページ翻訳 未使用時](https://i.gyazo.com/5cf54f0450c7c52915136116a4f392e4.gif)](https://gyazo.com/5cf54f0450c7c52915136116a4f392e4)

もちろんページ翻訳を使ってないときは更新されます

# 解決しました
```vuejs
<p :key="text">{{ text }}</p>
```
keyを指定してあげるだけです。:relaxed:
[![key指定したらできた](https://i.gyazo.com/4e3ac98c9d472f2356989ffbf500b34b.gif)](https://gyazo.com/4e3ac98c9d472f2356989ffbf500b34b)
以上。それだけ

vueだけの話じゃなそうですね
仮想DOM全般で起こりそう
Anaconda環境でUMAPのインストール

# はじめに
Anacondaの環境で、次元圧縮のUMAPをインストールしたのでメモ

# 環境
- Windows10 
- Anaconda
- Python 3.7.3
- umap-learn-0.3.9

# 方法
以下一発で完了

```python
conda install umap-learn
```
ビュフォンの針をPythonで確かめてみる

#はじめに
[ビュフォンの針](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%A5%E3%83%95%E3%82%A9%E3%83%B3%E3%81%AE%E9%87%9D)という数学上の確率に関する問題があります。

>ビュフォンの針（ビュフォンのはり、英: Buffon's needle problem）は18世紀の博物学者ジョルジュ＝ルイ・ルクレール、コント・ド・ビュフォンが提起した数学上の問題である。
もし床に多数の平行線を引き、そこに針を落すならば、どれかの線と針が交差する確率はどのようになるかという問題である。

こちらの問題の詳細については、下記のサイト様でわかりやすく丁寧に解説されているので、ここでは詳しく書きませんが、
とにかく、針が線と交差する確率Pは下記になるそうです。

>P = 1/π

なんと確率に円周率πが出てくるんですね、びっくり。
でもなんとなく信じがたいので、pythonでコード書いて確認してみました。

★ビュフォンの針の詳しい解説をしてくださっているサイト様★
[高校数学の美しい物語](https://mathtrain.jp/buffon)

#実装
とりあえず、上記のサイト様の解説の通り、
平行線の幅をd / 針の長さをl= d/2
として針をばらまくコードを書いてみます。

```Python
import tkinter as tk
import random
import math

root = tk.Tk()

root.title("buffon")
root.geometry("900x900")

##描画領域
h = 900
w = 900

canvas = tk.Canvas(root, bg="white", height=h, width=w)

#平行線
d = 50##平行線の幅
for j in range(h//50):
   canvas.create_line(0,j*d,w,j*d)

#針が線にかかるかの判定
def CheckLine(y_1, y_2):
   if y_1 // d == y_2 // d:
       return 0 ##線にかからない
   else:
       return 1 ##線にかかる

n = int(input("input drop needle nubmer:")) ##針の数
l = d/2 ##針の長さ　簡単のため 2l=d
line_cross = [] ##針が線にかかるかからないの結果を格納

i=0
while i < n:
   x = random.uniform(d,w-d) ##針の片方の端点を落とす場所
   y = random.uniform(d,h-d) ##針の片方の端点を落とす場所
   theta = random.uniform(0, 2*math.pi) ##落とした針が倒れる方向
   line_cross.append(CheckLine(y, y + l*math.cos(theta)))
   if CheckLine(y, y + l*math.cos(theta)) == 0:
       canvas.create_line(x, y, x + l*math.sin(theta), y + l*math.cos(theta))
   else:#針が先にかかった場合針を赤く表示
       canvas.create_line(x, y, x + l*math.sin(theta), y + l*math.cos(theta), fill = 'red')
   i += 1

canvas.place(x=0, y=900-h)

m = sum(line_cross)##先にかかった針の数
print('cross line needle:' + str(m))
print('n/m :' + str(n/m))##piの近似値になるはず

root.mainloop()
```

とりあえず針の数を100本でやってみる。

```
input drop needle nubmer:100
cross line needle:28
n/m :3.5714285714285716
```
![2019-07-13 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438971/975d14a8-270d-9d4b-14f2-b10d3a203b1c.png)
んー、100本だとこんなもんか。。

1,000本

```
input drop needle nubmer:1000
cross line needle:312
n/m :3.2051282051282053
```
![2019-07-13 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438971/2f5f31d0-945b-f70a-c706-0f648381dea1.png)

10,000本

```
input drop needle nubmer:10000
cross line needle:3155
n/m :3.1695721077654517
```
![2019-07-13 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438971/7ec1944c-6f74-5cad-2de2-88b25760a40d.png)

100,000本

```
input drop needle nubmer:100000
cross line needle:31687
n/m :3.155868337172973
```
![2019-07-13 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438971/75d614f7-e356-0765-9638-42417e93ad5d.png)

10,000本くらいからいい感じに円周率によってく感じですかね。
たしかに、ビュフォンの針で円周率の近似が得られることが実感できました。

#まとめ
針を100000本ばらまくと、ホラー映画みたいになるからやめようね！！
MySQLの基本(データベースの操作)

前回に引き続きドットインストールで学んどことを復習がてらアウトプットしていきます。


<h1>データベースからの条件つきでデータ抽出</h1>

○　まず外部ファイルにテーブル作成＆レコード作成を記述したファイルを用意します。

```
myapp.sql:


drop table if exists users;    --　usersテーブルがすでにあれば消去
create table users (
 id int unsigned primary key auto_increment,
 name varchar(20),
 score float
);

insert into users (name, score) values ('taguchi', 5.8);
insert into users (name, score) values ('fkoji', 8.2);
insert into users (name, score) values ('dotinstall', 6.1);
insert into users (name, score) values ('Tanaka', 4.2);
insert into users (name, score) values ('yamada', null);
insert into users (name, score) values ('tashiro', 7.9);
```
<br>
次に上記ファイルにデーベース操作のコマンドを書いていきます。


○　usersテーブルの全てのデータを取得

```
select * from users;  
```

○　抽出するカラムを指定

```
select id, name from users;
```

○　条件付きで抽出  - where -

```
select * from users where score > 6;　　（scoreが６より大きいレコードを取得）

select * from users where score >= 3.0 and score <= 6.0; （scoreが６以下レ３以上のレコードを取得）

select * from users where score between 3 and 6;　　（指定条件の間は　between　で代用可能）

select * from users where name = 'taguchi' or name = 'fkoji';　（条件にした名前を含むレコードを取得）

select * from users where name in ('taguchi', 'fkoji');　（指定条件を含むは　in　で代用可能）
```

○　ワイルドカードを使用したデータ取得

```
select * from users where name like　't%';  (nameがtから始まるレコードを取得)

select * from users where name like　'%t%'  (nameにtを含むレコードを取得)

select * from users where name like　binary 'T%'  (binaryでより厳密に比較。nameが大文字のTで始まるレコードを取得)

select * from users where name like　'______'  (アンダーバーの数でnameが指定の文字数のレコード取得)

select * from users where name like　'_a%'  (名前の２文字目がaのレコードを取得)
```

○　データの並び替え

```
select * from users order by score;  (scoreの昇順で並び替え)

select * from users　order by score desc;  (scoreの降順で並び替え)

select * from users limit 3;  (limitで上から３つのレコードのみ取得)

select * from users　order by score desc limit 3;  (降順で上から３つのレコードのみ取得)
```

○　レコードの更新と削除

```
update users set score = 5.9 where id = 1;  (idが１のレコードのscoreを5.9に更新)

update users set name = 'sasaki' , score = 5.9 where id = 1;  (一度に複数のカラム更新も可能)

delete from users where score < 5;　（scoreが５未満のレコードを削除）
```

○　数値の計算

```
update users set score = score * 1.2;  (scoreの値を1.2倍する)

select round(5.355);　　(四捨五入)

select round(5.355,1);　　(小数点１以下で四捨五入)

select floor(5.833);　　(切り捨て)

select ceil(5.238);　　(切り上げ)

elect rand();　　(ランダムな値を返す)

select * from users order by rand() limit 1;　　（乱数で並び替え）
```

○　文字列の演算

```
select length('Hello');  (文字列の長さ)

select substr('Hello',2);  (２文字目から全て表示)

select substr('Hello',2,3);  (２文字目から３文字を抽出)

select upper('hello');  (大文字に変換)

select lower('HELLO');  (小文字に変換)

select concat('Hello','World');  (文字の連結)

select length(name), name from users order by length(name);  (名前の長さで並び替え)

select length(name) as len, name from users order by len;  (asでカラム名置き換え)
```


今日はこの辺で:writing_hand:
OCIでSQLに変数のバインドをする

# ociでsqlに値バインドする

## 概要
PHPのOCI APIを使って、OracleのDBに接続する時の話

## バインドとは
sqlの可変な部分の値をバインドという形で結びつけてあげる事で、DB側は、一部の値が以前実行したsqlと異なっていても、同じsqlだと判断してくれます。
これによって、実行回数の多いsqlに対しては、bindで可変部分を挿入してあげると、実行速度の向上が期待できます。


### PHPの変数をバインドする
例えば以下のようにWHERE句のidの値をバインドする場合、

```sql:
SELECT
  *
FROM
  hoge_table
WHERE
  id = 100
;
```
下のように書いてあげると、バインドしてくれます。

```php:
$sql = "
  SELECT
    *
  FROM
    hoge_table
  WHERE
    id = :id
  ";

$id = 200;
$conn = oci_connect('user', 'pass', 'tns');
$statementId = oci_parse($this->conn, $sql);
oci_bind_by_name($statementId, :id, $id); // バインド
oci_execute($statementId);  //実行

/**
SELECT * FROM hoge_table WHERE id = 200; というクエリが実行されます。
*/
```

### PHPの配列の値をバインドする
次に配列の値をバインドする時の方法をご紹介します。

```php:
$sql = "
  SELECT
    *
  FROM
    hoge_table
  WHERE
    id in (:ids)
  ";

$ids = array(0, 1, 2, 3, 4)
$conn = oci_connect('user', 'pass', 'tns');
$statementId = oci_parse($this->conn, $sql);

$ociCollection = oci_new_collection($conn, 'ODCINUMBERLIST', 'SYS');
foreach ($ids as $id) {
    $ociCollection->append($id);
}

oci_bind_by_name($statementId, ':ids', $ociCollection, -1, SQLT_INT);
oci_execute($statementId);
/**
SELECT * FROM hoge_table WHERE id in (0, 1, 2, 3, 4); というクエリが実行されます。
*/

```
配列の場合は、`oci_new_collection`という配列に一度移し替えてあげる事によって実現します。
また、18行目の`oci_bind_by_name`の、第五引数の`SQLT_INT`ですが、バインドしたい値の型によって変える必要があります。例えば、バインドする変数をVARCHARとして認識させたければ、`SQLT_CHR`に設定してあげる必要があります。


## 参考
https://www.php.net/manual/ja/function.oci-bind-by-name.php#119783
ラズパイにWindows IOT




# ラズパイ3



## Windows 10 IoT Core Dashboard

[Downloads - Windows IoT | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/iot-core/downloads)




![Kobito.lj7A7A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/36c5e991-20c6-81be-fa9e-fb7294e9f30e.png "Kobito.lj7A7A.png")


終わったら以下のようになります。


![Kobito.gC6ZW9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/828d8b01-7887-2b78-883f-939428e66993.png "Kobito.gC6ZW9.png")



# ラズパイ3B+


3B+の場合には、IoT Dashboard直でSDカードにイメージを焼いても起動しない

![Kobito.fbjxO0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/17d119fd-3c8d-db5e-c4df-47c88f1468ea.png "Kobito.fbjxO0.png")


[Download Windows 10 IoT](https://www.microsoft.com/en-us/software-download/windowsiot)


Additional Insider Preview downloads
![Kobito.LqXW80.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/3c962fbe-66ca-1fe9-426d-98c79cee5df4.png "Kobito.LqXW80.png")


![Kobito.oNWfW2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/7c4ad696-2385-e361-f4dc-a671e25dac48.png "Kobito.oNWfW2.png")



[RaspberryPi 3 B+ & Windows10 IoT CoreでONNXモデルを使う - Qiita](https://qiita.com/koppe/items/71328b67c5f63e45369c)





C:\Program Files (x86)\Microsoft IoT\FFU\RaspberryPi2




# 参考

![Kobito.0devtG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/23b399fb-2038-ea75-ec20-7aa68a483ff1.png "Kobito.0devtG.png")
Arduino Json


ArduinoでJsonを扱うとき（パースしたいとき）使うと幸せになれるライブラリ

![Kobito.qia0Lt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/bdeb46fa-5868-0cf0-8bc0-1b7473590c40.png "Kobito.qia0Lt.png")
RNFirebase > After installation you encounter



After installation you encounter an error like RNFirebase core module was not found natively on iOS.


![Kobito.dyBpaI.png](https://qiita-image-store.s3.amazonaws.com/0/49910/e1292b3d-f1e9-492e-b2ee-b0b119192750.png "Kobito.dyBpaI.png")


[React Native Firebase - Simple Firebase integration for React Native](https://rnfirebase.io/docs/v3.2.x/installation/ios)

## Troubleshooting

```
It's most likely you did not run pod update to get the latest pod versions
Run pod update
You should see updated versions of your pods installed
You may need to re-run pod install
```




react-native run-ios



[no visible @interface for 'FIRQuery' declares the selector 'addSnapshotListenerWithIncludeMetadataChanges:listener · Issue #1110 · invertase/react-native-firebase](https://github.com/invertase/react-native-firebase/issues/1110#issuecomment-390955982)


bundling failed: Error: jest-haste-map:





# 付録

### node_modulesのインストールやりなおし

```
rm -rf ./node_modules/
npm i

```


### podのインストールやりなおし

```
cd ios
rm -rf Pods/
pod install

```



npm start
npm run ios
Raspberry Pi にWindows




環境：Windows
日時：2019/4/14


# WIndows

↓からダウンロード用のコマンドを取得します。

[UUP (Unified Update Platform) Generation Project (v2.4.6) [by @rgadguard & mkuba50]](https://uup.rg-adguard.net/)



![スクリーンショット 2019-04-14 18.48.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/4776ba31-07ca-d8b6-cf1b-cdfdb4313eec.png "スクリーンショット 2019-04-14 18.48.10.png")


creatingISO_*************_ja-jp_arm64_Professional.cmdがダウンロードされるので実行します。
コマンドプロンプトが立ち上がり処理が進みます。


![Kobito.GClBvy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/49294654-e40c-d892-4e1c-a60f463d2654.png "Kobito.GClBvy.png")




# WOA の取得と起動

以下にアクセス

[WOA-Project/WOA-Deployer-Rpi: WOA Deployer for Raspberry Pi](https://github.com/WOA-Project/WOA-Deployer-Rpi)



このページのDownload the latest versionから[最新版をダウンロード](https://github.com/WOA-Project/WOA-Deployer-Rpi/releases/latest)する

![Kobito.UU2Db6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/eb93f3a6-f204-a3ec-3d1b-dc18003778e7.png "Kobito.UU2Db6.png")


解答してできたファイル群の中から、WoaDeployer.exeを起動します。



### install.wim 

install.wim が必要になりますが、install.wim は上記の操作で作成された、18362.30.190329-2159.19H1_RELEASE_SVC_PROD2_CLIENTPRO_OEMRET_A64FRE_JA-JP.ISOの中にあります。
をダブルクリックでCDドライブとしてマウントして、その中のsourcesフォルダにあります。


![Kobito.McmSgx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/f35023f9-d594-269f-3c01-3579bbbef720.png "Kobito.McmSgx.png")



![Kobito.GLe4Oq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/83b0591b-9032-813e-6736-0ca779472256.png "Kobito.GLe4Oq.png")


けっこう時間がかかります。


終わったら以下の画面が出ます。

![Kobito.nPtgUh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/156ad92a-6102-092b-1cda-c5058b9cb8bf.png "Kobito.nPtgUh.png")


# Windows
WPF App (.Net Core)をやってみる



WPFは.Net Coreでは動作しませんでしたが、Core3からWPFが使えるようになるので、試してみます。

執筆時2019/3/17時点で v3.0.0-preview3 です。
 

![Kobito.AGyp7R.png](https://qiita-image-store.s3.amazonaws.com/0/49910/1d00f64e-d0c5-ef93-abd9-043d8a5fd54e.png "Kobito.AGyp7R.png")



以下からSDKをダウンロードしてインストールします。

[.NET Core 3.0 downloads for Linux, macOS, and Windows](https://dotnet.microsoft.com/download/dotnet-core/3.0)


新しいプロジェクトの作成で、WPF App (.Net Core) が追加されました。

![Kobito.DHs38u.png](https://qiita-image-store.s3.amazonaws.com/0/49910/ddfb529f-d1d5-2280-073a-6e1a72e31a50.png "Kobito.DHs38u.png")



なんて難しいことなく、普通にWPFが動きました。

![Kobito.86I10r.png](https://qiita-image-store.s3.amazonaws.com/0/49910/51cfd6ce-662d-4bf2-c692-edfbacd782a4.png "Kobito.86I10r.png")
gcsfuse



[gcsfuse/installing\.md at master · GoogleCloudPlatform/gcsfuse](https://github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/installing.md)


Install osxfuse.

[Home \- FUSE for macOS](https://osxfuse.github.io/)


homeblewが入っていなければ入れる。

ターミナルで以下を実行

```
brew install gcsfuse

sudo ln -s /usr/local/sbin/mount_gcsfuse /sbin
```
ERROR ITMS-90717



## Android


permission


```
"android": {
  "package": "com.domain.appName",
  "permissions": [
    "android.permission.CAMERA",
    "android.permission.READ_EXTERNAL_STORAGE",
    "android.permission.WRITE_EXTERNAL_STORAGE",
    "android.permission.READ_INTERNAL_STORAGE",
    "android.permission.WRITE_INTERNAL_STORAGE",
    "android.permission.MANAGED_DOCUMENTS",
    "android.permission.CHANGE_CONFIGURATION",
    "com.google.android.c2dm.permission.RECEIVE",
    "com.android.launcher.permission.INSTALL_SHORTCUT",
    "com.htc.launcher.permission.UPDATE_SHORTCUT"
  ]      
}
```
      



バージョン コード 1 の APK または Android App Bundle がすでに存在するため


exp build:android
create-react-native-app


2018/9/3

久々に`create-react-native-app`
[Expo — Learn how](https://expo.io/learn)


簡単なものはCRNAでやるのも手だと思ったしだい。


## CLI Toolのインストール

`npm install expo-cli --global`


## 初期化

```
expo init my-new-project
cd my-new-project
expo start
```
AVD Manager起動




```
cd $ANDROID_HOME/tools
```



## 名前確認

```
android list avd
```

```
    Name: galaxy_feel_SC-04_API_23
  Device: galaxy feel SC-04 (User)
    Path: /Users/atsu/.android/avd/galaxy_feel_SC-04_API_23.avd
  Target: Google APIs (Google Inc.)
          Based on: Android 6.0 (Marshmallow) Tag/ABI: google_apis/x86_64
    Skin: 720x1280
  Sdcard: 100M
```


起動
```
$ANDROID_HOME/toolstools/
emulator -avd "galaxy_feel_SC-04_API_23"
```
golangでc言語のライブラリを使おうと思ったらつまずいた件

# 概要

golangでc言語のライブラリ、具体的には、videoやaudioの変換するコード書きたいと思った
そしたら、こんな問題にぶち当たった話

該当プログラム -> https://github.com/taktod/ttLibGo

別のttLibCをcgo経由で利用する形

# 1stライブラリ

c言語のライブラリをあらかじめインストールしてもらって
それを利用したcgoのコードを含んだライブラリを書いた

## いいところ

手順にしたがって処理したら、ちゃんと動作できる。

## わるいところ

依存先のttLibCが変更になったら取得し直ししなければならない。
ttLibCが古いままということもある。
go getで取得したときに、あらかじめライブラリをインストールしてなかったらbuildがこける。
あと、log出力をいじってgoのloggerにデータを渡してやろうとすると、cのライブラリから書き直す必要がでてくる。
(submoduleだと、そのあたり回避できる)

# 2ndライブラリ

ちょうどこのライブラリを書いてたころ、gitsubmoduleをつかった開発が僕の中でブームになってたので
submoduleつかって処理を書いてみた

具体的にはこんなやつ。
https://github.com/taktod/ttLibGo/tree/9a8bd258e52597412d40127713a3e1e7a3ef8038

## いいところ

go getで取得したら利用可能なsubpackageが有効になる
使えないやつは、buildがこけてinstallされない

## わるいところ

いつのまにかbuildできなくなってた。orz

# 3rdライブラリ

現行のやつ
https://github.com/taktod/ttLibGo
2ndでは、ライブラリが分割してたけど、それを１つにまとめてbuildが通るようにした。

## いいところ

go getで取得したらbuildして使えるようになる。

## わるいところ

使えないやつがあるとbuild成功しない(pkg-configがこけるとそこで止まる)

と、こんな具合になってます。
システムにインストールされているライブラリの部分だけ有効になってbuildできるようにしたいんですけどね・・・

# 努力したところ

## ライブラリのコードを全部buildさせたい

includeを利用して、ソースコードを別のソースコードにはりつけてしまえばいい。
というわけで、こうなった。
https://github.com/taktod/ttLibGo/blob/dce70c0c181ab8a7042fe8fc893e6bff3ed72e96/ttLibC.c

## goのpackage別で同じ関数を定義できないんだけど・・・

2ndのころにあった問題。
https://github.com/taktod/ttLibGo/tree/9a8bd258e52597412d40127713a3e1e7a3ef8038/ttLibGoOpenh264
https://github.com/taktod/ttLibGo/tree/9a8bd258e52597412d40127713a3e1e7a3ef8038/ttLibGoLibyuv

それぞれを別でbuildして、ライブラリを結合するため、同じ定義の関数が存在するとduplicate objectと怒られる
関数のattributeでhiddenを設定してやると、互いに見えなくなってエラーを回避することができた・・・・が
最近buildしなおしてみたら、いつのまにかattributeを設定してもダメになってた。orz

## ライブラリのあるなしを判定する

3rdでの話
ライブラリの有無をなんとかしたかったので、includeパスの順番をうまく調整してやって
headerがみつからなかった場合にdummyにあるheaderを代わりに読み込ませ
そこで定義したNO_xxxのマクロを判定に使う

ということをやってみた。
https://github.com/taktod/ttLibGo/tree/dce70c0c181ab8a7042fe8fc893e6bff3ed72e96/dummy

ところが、pkg-configで該当ライブラリの定義がない場合はそもそもbuildが止まるということが発覚し、頓挫した。

# これからどうしようか・・・

## PKG_CONFIG_PATHをいじる件
PATHに独自のpathを設定してやって、ライブラリがなかったら自分で書いたdummyに飛ぶpcファイルを読ませて動作させる。 -> やってみたけど、うまくいかなさそう

## Makefileとか入れる方法

go getでhookさせるいい方法がなさそう、submoduleの動作はgit hookでなんとかできそうではあるけど・・・
go自体にhookはなさげ。

## dlopenとかつかってなんとかする。

goを実行したときに、ライブラリがなかったらその場でbuildさせてglopenで作ったライブラリを開く
で、利用する
これが一番いいかな・・・と思ってる。
この方法だったら、windowsでも利用できるようになるかも・・・(pkg-configは基本windowsになさそうなので、windowsは諦めてた)

このあたりかなぁ・・・
うん、dlopenでちょっと攻めてみよう
久しぶりの3GIM




# 3GIM本体の設定

まずは、Arduino　UnoからMonitorプログラムで3GIM本体の設定を行います。（ここ忘れがちだけど、大事）


```c:monitor.ino
unsigned long Baudrate_serialMonitor = 115200; //シリアルモニタの通信速度

//通信ボーレートは、9600 bps, 19200 pbs、38400 bps、57600 bps、115200 pbsから選択できます。
//115200bpsは、ハードウェアシリアル通信時のみ正常に通信可能です。
//ソフトウェアシリアル通信時は、57600bpsでは文字化けが起きます。高速利用したい場合は38400bpsを推奨します。
unsigned long baudrate_3gim = 115200; //3GIMとの通信速度　　$YB 9600 等で設定,  $YB 115200


// Serialの設定
#if defined(__SAMD21G18A__) 
  //IoTab, Samd21 module
  #define ioSerial      SerialUSB // USB Serial port(not Serial)
  #define a3gSerial       Serial  // Use serial port
#else
  //Arduino UNO
  #define ioSerial      Serial
  #include <SoftwareSerial.h>
  #define IEM_RXD_PIN       4   // D4(For example,If you use Leonardo or Mega etc. then change to D10..)
  #define IEM_TXD_PIN       5   // D5(For example,If you use Leonardo or Mega etc. then change to D11..)
  SoftwareSerial a3gSerial(IEM_RXD_PIN, IEM_TXD_PIN);    // Serial for IEM Interface
#endif

//#define a3gSerial       Serial1  // Use serial port

const int powerPin = 7;     // 3gim power pin(If not using power control, 0 is set.)


void setup() {
  while(!ioSerial);
  ioSerial.begin(Baudrate_serialMonitor);
  a3gSerial.begin(baudrate_3gim);

  pinMode(powerPin,OUTPUT); digitalWrite(powerPin, LOW); delay(1000);

  ioSerial.println("Connected");
  ioSerial.println("please wait a moment...");
  pinMode(powerPin,OUTPUT); digitalWrite(powerPin, HIGH); delay(100);
  digitalWrite(powerPin, LOW);

 
  //Welcome to 3GIMが表示されるまで待機
  String str;
  do {
      while (!a3gSerial.available());
      str = a3gSerial.readStringUntil('\n');
      ioSerial.println(str);
  } while (str.indexOf("3GIM") < 0);
  ioSerial.println("Connected");

}

void loop() {
  String str;
  
  if (a3gSerial.available() > 0) {
    String str = a3gSerial.readStringUntil('\n');
    ioSerial.println(str);
  }

  //
  if (ioSerial.available() > 0) {
    char c = ioSerial.read();
    ioSerial.print(c);    // Echo back
    a3gSerial.print(c);
  }
}

```
DateFormatterのメモ

###DateFormatterの出力について、Pointのメモ：
今日は日付の出力フォーマットについて、出来た経験をシェアします。
まず@rinov さんがやり方を教えてくれて、感謝します！
DateFormatだけ設定する場合
-
```Swift
let formatter = DateFormatter()
formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "GyMMM", options: 0, locale: Locale(identifier: "ja_JP")) //和暦のStyle
let dateLocale = formatter.string(from: Date())
```
#####結果は：AD2019年7月

DateFormatとlocalを設定する場合
-
```Swift
let formatter = DateFormatter()
formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "GyMMM", options: 0, locale: Locale(identifier: "ja_JP")) //和暦のStyleに設定
formatter.locale = Locale(identifier: "ja_JP")
let dateLocale = formatter.string(from: Date())
```
#####結果は：西暦2019年7月

DateFormatとlocalを設定する場合
-
```Swift
let formatter = DateFormatter()
formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "GyMMM", options: 0, locale: Locale(identifier: "ja_JP")) //和暦のStyleに設定
formatter.calendar = Calendar(identifier: .japanese)
let dateLocale = formatter.string(from: Date())
```
#####結果は：Reiwa1年7月
DateFormat、local、Calendarを設定する場合
-

```Swift
let formatter = DateFormatter()
formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "GyMMM", options: 0, locale: Locale(identifier: "ja_JP")) //和暦のStyleに設定
formatter.locale = Locale(identifier: "ja_JP")
formatter.calendar = Calendar(identifier: .japanese)
let dateLocale = formatter.string(from: Date()) 
```
#####結果は：令和元年7月

#####参考
https://qiita.com/rinov/items/bff12e9ea1251e895306
OAuth 2.0 Security Best Current Practice (Draft 13)

ドラフト第13版が先日公開された [OAuth 2.0 Security Best Current Practice](https://tools.ietf.org/id/draft-ietf-oauth-security-topics-13.html) について、チェックリストとして使えるように推奨事項を整理した。

##### 3.1 Protecting Redirect-Based Flows

- 認可サーバーはリダイレクトURIを完全一致で検証しなければならない（MUST）
- クライアントはリダイレクト時のパラメータを使ったURIへのリダイレクトをすべきでない（SHOULD）
- クライアントはstateもしくはPKCEを使ってCSRFを防止しなければならない（MUST）
- クライアントは認可要求を送信したサーバーからのリダイレクトのみしか処理してはいけない（MUST）
- Authorization Code Grantでは、クライアントはPKCE（OpenID Connectではnouceでも可）を使わなければならない（MUST）
- クライアントはImplicit Grantなどのアクセストークンをリダイレクトで返却するフローを使うべきでない（SHOULD）

##### 3.2 Token Replay Prevention

- 認可サーバーはTLSベースの送信者を制限できるアクセストークンを使うべきである（SHOULD）
- リフレッシュトークンは送信者を制限できるトークンとするか、トークンローテーションを使わなければならない（MUST）

##### 3.3 Access Token Privilege Restriction

- アクセストークンに関連付けられる権限は必要最小限とするべきである（SHOULD）
- アクセストークンを特定のリソースサーバー（理想は1つのリソースサーバー）のみで使えるように制限すべきである（SHOULD）
- アクセストークンを特定のリソースとアクションに対してのみ使えるように制限すべきである（SHOULD）

##### 3.4 Resource Owner Password Credentials Grant

- Resource Owner Password Credentials Grantは使用してはならない（MUST）

##### 3.5 Client Authentication

- 認可サーバーは可能であればクライアント認証を実施すべき（SHOULD）
- クライアント認証には公開鍵ベースの非対称な方式を使うことが推奨される（RECOMMENDED）

##### 3.6 Other Recommendations

- サーバーはclient_idもしくはsubの値をクライアントが指定できるようにすべきでない（SHOULD）
JFreeChart-レーダーチャート/SpiderWebChart-特定データの強調


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import java.awt.BasicStroke;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.SpiderWebPlot;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

import jp.avaj.lib.algo.ArMatrix;
import jp.avaj.lib.algo.ArUtil;

/**
■ JFreeChart-レーダーチャート/SpiderWebChart-特定データの強調

 */
public class Chart06_02 {
  // 目次-レーダーチャート(SpiderWebChart)
  A_Chart06 a_Chart06;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  /** 成績のレーダーチャートを作成する */
  public static void main(String[] args) {
    // レーダーチャート(SpiderWebChart)にはCategoryDatasetを使用する
	// CategoryDatasetの作成方法は、以下を参照
    Chart01_CategoryDataset_2 categoryDataSetSample;
    // ここではArMatrixからCategoryDatasetを作成する
    DefaultCategoryDataset dataset;
    {
      ArMatrix<String,String,Integer> mat = new ArMatrix();
      // Aの成績⇒理系が得意
      mat.put("A","英語",70);
      mat.put("A","数学",90);
      mat.put("A","国語",55);
      mat.put("A","理科",95);
      mat.put("A","社会",45);
      // Bの成績⇒文系が得意
      mat.put("B","英語",100);
      mat.put("B","数学",60);
      mat.put("B","国語",80);
      mat.put("B","理科",55);
      mat.put("B","社会",70);
      // Cの成績
      mat.put("C","英語",70);
      mat.put("C","数学",70);
      mat.put("C","国語",70);
      mat.put("C","理科",70);
      mat.put("C","社会",70);
      //
      dataset = ArcDefaultCategoryDataset.create(mat,null,null);
    }
    // SpiderWebPlotはRendererやRendererは指定する必要がない
    SpiderWebPlot plot = new SpiderWebPlot((CategoryDataset)dataset);
    JFreeChart jfreeChart = new JFreeChart("成績レーダーチャート",(Plot)plot);
    // チャートを表示する
    ChartFrame cFrame = new ChartFrame("RadarChartFrame",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
    // 特定データ(B)を強調する
    {
      // 目で確認するために少し休む
      ArUtil.sleep(2000);
      // Bデータのインデックスを取得する
      // Datasetに挿入した順番でよいが、インデックスを改めて取得する方がよい
      int index = dataset.getRowIndex("B");
      // 線幅を太くする
      plot.setSeriesOutlineStroke(index,new BasicStroke(((BasicStroke)plot.getBaseSeriesOutlineStroke()).getLineWidth()*3));
      //
      // 目で確認するために少し休む
      ArUtil.sleep(12000);
      // 元に戻す
      plot.setSeriesOutlineStroke(index,null);
    }
  }
}



```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/3a5d8274-1492-a6d4-e2c7-ebf03e864bca.png)
JFreeChart-レーダーチャート(SpiderWebChart)-ArMatrixからCategoryDatasetを作成


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.SpiderWebPlot;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

import jp.avaj.lib.algo.ArMatrix;

/**
■ JFreeChart-レーダーチャート(SpiderWebChart)-ArMatrixからCategoryDatasetを作成

 */
public class Chart06_01 {
  // 目次-レーダーチャート(SpiderWebChart)
  A_Chart06 a_Chart06;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  /** 成績のレーダーチャートを作成する */
  public static void main(String[] args) {
    // レーダーチャート(SpiderWebChart)にはCategoryDatasetを使用する
	// CategoryDatasetの作成方法は、以下を参照
    Chart01_CategoryDataset_2 categoryDataSetSample;
    // ここではArMatrixからCategoryDatasetを作成する
    DefaultCategoryDataset dataset;
    {
      ArMatrix<String,String,Integer> mat = new ArMatrix();
      // Aの成績⇒理系が得意
      mat.put("A","英語",70);
      mat.put("A","数学",90);
      mat.put("A","国語",55);
      mat.put("A","理科",95);
      mat.put("A","社会",45);
      // Bの成績⇒文系が得意
      mat.put("B","英語",100);
      mat.put("B","数学",60);
      mat.put("B","国語",80);
      mat.put("B","理科",55);
      mat.put("B","社会",70);
      // Cの成績
      mat.put("C","英語",70);
      mat.put("C","数学",70);
      mat.put("C","国語",70);
      mat.put("C","理科",70);
      mat.put("C","社会",70);
      //
      dataset = ArcDefaultCategoryDataset.create(mat,null,null);
    }
    // SpiderWebPlotはRenderer,Axisは指定する必要がない
    SpiderWebPlot spiderWebPlot = new SpiderWebPlot((CategoryDataset)dataset);
    // チャートを表示する
    JFreeChart jfreeChart = new JFreeChart("成績レーダーチャート",(Plot)spiderWebPlot);
    ChartFrame cFrame = new ChartFrame("RadarChartFrame",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }
}

```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/03bb08da-c64b-d51b-2217-4b355bbffd35.png)
poetry shellしたはずなのに、.venv内のpythonが実行されない

**環境**

```sh
> sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14
BuildVersion:	18A391

> pyenv --version
pyenv 1.2.9

> pyenv which python
/Users/username/.pyenv/versions/3.7.1/bin/python
```

## 問題

`poetry shell`したはずなのに、`.venv`内の`python`が実行されない

```sh
> poetry shell

> which python
/Users/username/.pyenv/shims/python
```


## 原因

printenvの結果を見てみると以下のようになっていた

```sh
...
/Users/username/.pyenv/shims
/Users/username/.ghq/github.com/username/sample/.venv/bin
...
```

あれ...`.venv`よりも前に`.pyenv`が来てる...なんでだ...


* **`~/.bashrc`に書かれている`eval $(pyenv init -)`が悪さをしているのかも？**


「そういえば、`~/.bashrc`に`eval $(pyenv init -)`って記述してるんだった」  
「そもそも、`pyenv init -`ってなんだ！？」  
「とりあえず、実行してみるか」

```sh
> pyenv init -
export PATH="/Users/username/.pyenv/shims:${PATH}"
export PYENV_SHELL=bash
source '/usr/local/Cellar/pyenv/1.2.9/libexec/../completions/pyenv.bash'
command pyenv rehash 2>/dev/null
pyenv() {
  local command
  command="${1:-}"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  activate|deactivate|rehash|shell)
    eval "$(pyenv "sh-$command" "$@")";;
  *)
    command pyenv "$command" "$@";;
  esac
}
```

「`/Users/username/.pyenv/shims`を前に持ってきてる！？」  
「これのせいか！」


## 解決方法

`eval $(pyenv init -)`は`~/.bashrc`ではなく、`~/.bash_profile`に書く

それぞれのファイルは以下のように読み込むタイミングが異なる

* `~/.bash_profile`はログイン毎に読み込まれる
* `~/.bashrc`はbashを起動する毎に読み込まれる


PoetryのIssuesに`eval $(pyenv init -)`は`~/.bashrc`ではなく、`~/.bash_profile`に書けばいいんじゃない？って[コメントがあった](https://github.com/sdispater/poetry/issues/571#issuecomment-470734363)

なるほど！`~/.bashrc`に書いていたから、`poetry shell`したときに`eval $(pyenv init -)`が実行されてしまい、うまく`.venv`内の`python`が実行されなかったのかも！

`eval $(pyenv init -)`を`~/.bash_profile`に書き写して、`poetry shell`を実行


```sh
> poetry shell

> which python
/Users/username/.ghq/github.com/username/sample/.venv/bin/python
```

ちゃんと`.venv`の中の`python`を見に行ってる！！！  
めでたしめでたし！

## まとめ

`~/.bashrc`と`~/.bash_profile`の違いをちゃんと理解しないと痛い目にあう


## 参考文献

* [本当に正しい .bashrc と .bash_profile の使ひ分け - Qiita](https://qiita.com/magicant/items/d3bb7ea1192e63fba850)
* [poetry shell does not activate virtualenv · Issue #571 · sdispater/poetry](https://github.com/sdispater/poetry/issues/571)
gunicornをバックグラウンドで実行する方法

個人開発として作成している[Owntime](https://onwtime.io)のCD(継続的デリバリー)を実装する際に、 **gunicornをバックグラウンドで起動する** 必要がありました。

gunicornのバックグラウンド実行に関する記事が少なかったですが、やり方は簡単です。

```bash
# 「-D」のオプションを付けるだけ！
$ gunicorn owntime.wsgi -D
```

これで無事、バックグラウンドで実行されます！


プロセスをkillするときは、

```bash
$ ps aux | grep gunicorn
# => プロセスidを調べる

$ kill {プロセスid}
```

これで、バックグラウンド実行したプロセスを停止することができます。


### おまけ
今回紹介したgunicornを使って開発しているのが、[Owntime](https://owntime.io)です
毎日の時間の使い方を記録して、分析して、理想な時間の使い方に近づけるサポートをするサービスです。

ぜひ、一度使ってみてください！
JFreeChart-複数値チャート-DefaultMultiValueCategoryDataset-特定データの強調


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.renderer.category.ScatterRenderer;
import org.jfree.data.statistics.DefaultMultiValueCategoryDataset;

import jp.avaj.lib.algo.ArUtil;

/**
■ JFreeChart-複数値チャート-DefaultMultiValueCategoryDataset-特定データの強調
・同一キーに複数の値があるDataset.
・ScatterRendererで表示する

 */
public class Chart13_01 {
  // 目次-DefaultMultiValueCategoryDatasetを利用したチャート
  A_Chart13 a_Chart13;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) {
    // 表示データの作成
    DefaultMultiValueCategoryDataset dataSet = null;
    {
      final int ROW = 3;
      final int COL = 4;
      Random ran = new Random();
      dataSet = new DefaultMultiValueCategoryDataset();
      List<Double> list;
      for (int row=0; row<ROW; row++) {
        for (int col=0; col<COL; col++) {
          list = new ArrayList<Double>();
          for (int i=0; i<3; i++) {
            list.add((double)ran.nextInt(100));
          }
          dataSet.add(list,"ROW"+row,"COL"+col);
        }
      }
    }
    // 軸の設定
    CategoryAxis xAxis = new CategoryAxis("商品");
    NumberAxis yAxis = new NumberAxis("売上");
    // レンダラの設定
    ScatterRenderer renderer = new ScatterRenderer();
    // Plotの作成
    CategoryPlot plot = new CategoryPlot(dataSet,xAxis,yAxis,renderer);
    //
    JFreeChart jfreeChart = new JFreeChart("ScatterRenderer",(Plot)plot);
    ChartFrame cFrame = new ChartFrame("ScatterRenderer",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
    /*
    特定データの強調、レンダラを個別設定する
    レンダラはplotからキー指定で取得できる.
    なのでインデックスとキーを自分で管理するか、キー⇒インデックスの関係をdatasetから取得する.
    ここではdatesetから取得する方法で行う.
    */
    {
      // 目で確認するために、少し休む
      ArUtil.sleep(2000);
      // ROW1データを強調したい.
      int index = dataSet.getRowIndex("ROW1");
      // Plotのレンダラを取得する
      ScatterRenderer ren = (ScatterRenderer)plot.getRenderer();
      // Shapeを取得する　本当は元の大きさを正確に取得して二倍すべき
//      Shape shape = ren.getBaseShape();
//      Rectangle rec = shape.getBounds();
      // 大きさを二倍にする
      Rectangle newRec = new Rectangle();
      newRec.setRect(-6,-6,12,12); // 本当は元の大きさを正確に取得して二倍すべき
      // 二倍にしたShapeをindexを指定して設定する
   	  ren.setSeriesShape(index,newRec);

      // 目で確認するために、少し休む
   	  ArUtil.sleep(12000);
   	  // 元の大きさに戻す
   	  ren.setSeriesShape(index,null);
    }
  }
}

```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/543cef8f-193f-2262-739f-fc0f5627d156.png)
MacでIntelliJ使っている時にバックスラッシュ"\"が入力できない時の対処法



IntelliJのLive Templateの機能を使う。

<img width="400" alt="gif.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285861/fdda11be-3627-68b8-13ea-42a8d5e5a933.gif">

設定は以下の記事を参照しました。

* [チーム開発のためのIntelliJ設定#スニペット登録live-templates](https://qiita.com/suzuki-hoge/items/98df92eb44eb131de6eb#スニペット登録live-templates)

`Abbreviation:`は`¥`を登録。`Template text:`には`\`を設定。`Define`には`Everywhere`を設定。

エディタで`¥`を押して`Tab`キーを押せば変換される。
Android プラットフォームについて

Monaca が Cordova 9.0 に対応しました。

Cordova では、ビルド時に各プラットフォームに対応したプロジェクトを使用します。
Monaca の Cordova 9.0 で使用される Android プラットフォームのバージョンは、`8.0.0` が使用されています。

Android プラットフォームは、 `7.0.0` から Android Studio 用プロジェクトと同じフォルダー構成に仕様が変更されました。

そのため、Monaca で提供している Cordova 9.0 と Cordova 9.0 未満では、Android プラットフォームのフォルダー構成に違いが発生します。

# resource-file タグ

この Android プラットフォームの仕様変更によって注意する設定があります。

config.xml を使用して、ビルド時にリソースファイルを設定するような場合に `resource-file` タグを使用します。

Cordova 9.0 未満の Monaca プロジェクトで resource-file タグを使用している場合、Cordova 9.0 へアップグレードすると、ビルド時に resource-file タグの設定が反映されなくなります。

# Android Studio プロジェクトのフォルダー構成

Android Studio で使用するプロジェクトのフォルダー構成は、以下のようになっています。

`ルート/app/src/main/res/`

# resource-file の変更方法

Cordova 9.0 未満の Monaca プロジェクトの場合、sample.png を Android プラットフォームの drawable フォルダーに配置したい場合は、以下のように設定します。

```xml:config.xml
<platform name="android">
  <!-- Monacaプロジェクトの res フォルダーに sample.png を配置した場合 -->
  <resource-file src="/res/sample.png" target="/res/drawable/sample.png" />
</platform>
```

これを、Cordova 9.0 の Monaca プロジェクト用に変更する場合は、以下のようにします。

```xml:config.xml
<platform name="android">
  <!-- Monacaプロジェクトの res フォルダーに sample.png を配置した場合 -->
  <resource-file src="/res/sample.png" target="app/src/main/res/drawable/sample.png" />
</platform>
```

# おわりに

Monaca プロジェクトを Cordova 9.0 へアップグレードした際に、resource-file タグの設定が反映されない場合は、target の設定を確認してみてください。

今回は、drawable フォルダーを対象にしましたが、Android Studio 用のプロジェクト構成が分かれば、他のフォルダーへもファイルを設定することができます。

また、現在よく利用されるサードパーティー製 Cordova プラグインでは、この Android プラットフォームの仕様変更に対応しているものが多いので、Monaca プロジェクトを Cordova 9.0 へアップグレードしても利用可能な場合が多くなっています。

Cordova 9.0 へアップグレードした際に、サードパーティー製 Cordova プラグインのビルドが失敗する場合は、一度、最新版で対応していないか確認してみてください。
XamppにLaravelを導入し、さらにそこへPHPMailerを導入してMailtrapを使用するまで

#この記事の目的

https://www.youtube.com/playlist?list=PLgt-G5tEOlKX4LKrBCYfjcyrp7wmnRdAL
サイトコーディングの勉強をしているのですが、現在実践的かつ体系的なコーディングの訓練に移りたいと考えていて、それにはサイトにフォームを実装したものまで含めなければいけないかなという結論に達したので上記のチュートリアルから始めようと思ったところ、Mailtrapを使用したPHPMailerの導入に散々苦労したので、PHPに慣れていない人と私のために覚え書きとして残しておきます。

##0.前提条件

・Xamppが何かを簡単に理解し、導入する
・composerの導入のやりかた、役割を簡単に理解する。

この2つについて調べて、理解ができてから先に進めてください。
もっと言うと、この2つがわからないまま進めると沼にハマります。
私はcomposerの役割を理解しないまま進めてしまったところドツボにはまりました。

##1.Laravelを導入する

参考：[XAMPP環境にLaravelを導入する](https://qiita.com/minuro/items/58ef8241e978862d1218)

私は　

```
composer create-project --prefer-dist laravel/laravel Laravel
```

で導入しました。
最後は自分がアクセスしやすい名前で良いかと思います。

##2.導入したLaravelにPHPMailerを入れてMailtrapの設定をする

参考:[PHPMailerでMailTrapを利用する](https://qiita.com/zaburo/items/2f01cfdf8f9bbd225691)
参考:[Mailtrapを使ってPHPで開発時にメール送信のテストを行う](https://qiita.com/arm_band/items/58ed0ea279561e640d23)

必ず入れたいディレクトリに移動してから、実行してください。
常識なんだと思いますが、私のように1から独学だと適当に入れてあとで後悔する羽目になりがちなので。
どうしてもできない場合はGithub経由でも良いと思いますがcomposerで導入した方が面倒が無いのと沼にハマる確率が少ないので、頑張ってください。

導入及び、設定については上記2つの記事が非常にわかりやすく、躓くことはあまりないとは思いますが一応補足しておくと

・config.php等外部から設定を読み込む場合にはパスを正しく書くこと
・auto-load.phpのパスが正しいか確認すること

この2つは念入りにしてください。
特に2つ目は導入のやり方によっては変な位置に入っていたりするので必ず確認してください。

##3.phpファイルを実行してメールが送信できているか確認する。

私はズブの素人なので知らなかったのですが、常識なためかphpファイルをローカルから実行させる方法がググってもでてこなくて苦労したので、自戒の意味を込めて最後に書いておきます。

コマンドプロンプトなどで実行したいphpファイル(ex.index.php）があるディレクトリに移動し、そこで

```
php　index.php
```
と打ち込めば実行できます。
ここまでの流れだと、実行してMailtrapのダミーのメールBOXにメールが送られていれば導入は完了です、お疲れ様でした。
コマンドプロンプトにエラーが出たり、うまく実行できなかった場合はもう一度2に戻って確認して見てください。
Teamviewerを使ってRaspberry Pi 3にMacから接続する

# 概要
MacからRaspberry Pi(以降RPi)にアクセスして操作したい、でもコマンドラインだけでやるのは、、、という方（自分）はTeamviewerがおすすめです。このセットアップ方法をここに記しておきます。初心者向けです。

# 環境
機体：Raspberry Pi 3 Model B
どの機種のRPiを使っているのかは、cat /proc/cpuinfo | grep Revisionで出てきた値（例：Revision : a32082）を検索するとどのモデルかがわかる。

OS: Debian 9.9
バージョンのチェックはcat /etc/debian_version。

# やり方
###1. apt更新

```
sudo apt-get update
sudo apt-get upgrade
```

###2. Raspbian用のパッケージ（armv7 32bit）をダウンロードする。

```
wget https://download.teamviewer.com/download/linux/teamviewer-host_armhf.deb
```

###3. ダウンロードしたパッケージをインストール

```
sudo apt install ./teamviewer-host_armhf.deb
```

###4. RPiのTeamviewer設定
RPiデスクトップ上で画面右上のTeamviewerのアイコンをクリックして、Teamviewerを起動し、設定アイコンを開いてパスワードを設定。
<img width="1112" alt="スクリーンショット 2019-07-13 6.06.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148842/375d3ba1-87ba-58b5-7be6-95a3f7720f0f.png">
<img width="1026" alt="スクリーンショット 2019-07-13 6.08.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148842/2d8e5917-01e7-cce3-2e2c-69d470935185.png">

###5. MacにTeamviewerをインストール
https://www.teamviewer.com/ja/download/mac-os/

###6. MacのTeamviewer設定
MacでTeamviewerを起動。IDを入力するフォームがあるので、RPi上のTeamviewerに表示されているIDを入力。"接続"ボタンを押すとパスワードフォームが出てくるので、先ほど設定したパスワードを入力。
<img width="1167" alt="スクリーンショット 2019-07-13 6.14.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148842/0295f2a9-c997-f6a8-88a3-97f81a5d69b4.png">



以上
vueで作った部品を使いたい

vueのがまだ全然ですが、部品を使ってみたいので、ソースコードを張り付けておく

掲示板アプリ作るなら使えそうな部品

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My Vue App</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>

  <div id="app" class="container">
    <h1>My Todos</h1>
 <ul v-if="todos.length">

    <li  v-for="(todo, index) in todos">
      <input type="checkbox" v-model="todo.isDone">
   <span :class="{done:todo.isDone}">{{ todo.title }}</span> 
    <span @click="deleteItem(index)" class="command">[x]</span>
  </li>

</ul>
<ul v-else>
  <li>Nothing to do yay!</li>

</ul>

    <form @submit.prevent="addItem">
      <input type="text" v-model="newItem">
      <input type="submit" value="Add">
    </form>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>
```

```main.js
(function() {
  'use strict';

  var vm = new Vue({
    el: '#app',
    data: {
      newItem: '',
      todos:[]
    },
    methods: {
      addItem: function() {
        var item = {
          title: this.newItem,
          isDone: false
        };
        this.todos.push(item);
        this.newItem = '';
      },
      deleteItem: function(index) {
        if (confirm('are you sure?')) {
          this.todos.splice(index, 1);
        }
      }
    }
  });
})();
```
意識の整理③

意識をパソコンに移動する時の解析問題についで個人の探求心からの感想です

①https://qiita.com/nervebmd/items/687c214c4b420ce39181 意識は個人的にあって曖昧にいるものではなく死ぬとそれで終わる
②https://qiita.com/nervebmd/items/780a795c6d7cb7000efa 意識は相対的に死ぬよに見えて死んだかの定義がないため死んだとは言えない

#意識とは
意識とは何か、ここでの意味はなぜ人間はアルゴリズムにすぎないだろうになぜ死ぬのか
意識は個人的にいるものではない、でも相対的に他に自分が生きてたらその自信とは何か。
私は機械だから今を生きているけどそれは何か、脳を２つに分けて見てその感想を言うまでは
分からない気もする。でも脳を二つ分けて原理的に両方が分からない記憶を持つだけと予想が出る、私（の正体）はただのアルゴリズムなのか

①では相対的に死んだ人が存在してたのを否定できないことで人は相対的にいるもので死んだ人は死んで終わると
断言している
②はそれが曖昧であるため、例えば脳細胞は死もなにもないし記憶も作られた概念でアルゴリズムこそ本と同じようで
構造を変えて保存することと違さがあると今生きる自信は時間に過ぎただけで記憶から生きたと勘違いしてるだけで死んでいる。アルゴリズム、機械、構造ががなんらからの繋がりがあったり繋がって否定するにはほかに私があってその人たちは私と関わりがあり、今いる全人類と私もなんらかの関係があって可笑しい。ブラックホールに入れられたとしても、その基準が曖昧なことで可笑しいと見てる

個人の考えからでた結論：解析できない＋利用できるという状態であると見るべきだと思う

物理的には構造が理解できるが解析不可能というものだと思う
単純に数学に例えると数学的解析不可能ものみたいなものやことだと思う
大体解析自体が曖昧な存在かもと感じられるまであるがこの解析に欠点が哲学と解析的に可笑しいので断言できない

欠点：今の状況からみてただ存在する存在しないではなく幻が存在しているよなもので、それで言いにくいだけで
存在がかちんとあるが、なぜそうあるのかまったく分からない科学的システムによって人間が意識とはなんだ？
とあほみたいなことを考えていると感じるまである、要するに存在は分かったがそうある理由が全く分からず、古典的結論で終わる、とある意味キレイに見えてすっきりもするくらい。

結論：勉強すること（しないといけないことが）がいっぱいになった
Watch Super 30 (2019) Full Movie Online

Watch Now : http://blray.com/movie/534075/super-30.html

Roughly speaking, Anand in the film, like the real guy, is a mathematical genius whose academic brilliance gets him admission in Cambridge University. His impoverished family cannot raise the funds to send him there though. A chain of circumstances leads Anand to a coaching institute for IIT JEE aspirants where he becomes a star teacher and starts raking in good money. However, he decides one day to give up his increasingly comfortable life and set up a free coaching school for underpriviledged children where he will train 30 chosen ones for the IIT entrance exam each year, providing them with food and a house for an entire year as he trains them. He calls it Super 30. This leads to a clash between Anand and powerful players in the state's coaching institute racket.

With all its problems, there is a certain poignance to the account of Anand's early life as we witness the love within his family despite their financial struggles, the endearing flirtations between his father and mother, his father's wisdom and mother's joyousness, and the malice of those who claim to care about the downtrodden but in fact only care for their votes.
https://www.pinterest.com/MoviesNowPlaying/
https://www.instagram.com/blray_com/
https://twitter.com/Blray_com
VSCode で異なる言語やライブラリの開発環境を構築するメモ（拡張管理）

# 異なる言語で開発するとき、不要になる拡張がある

最近、いろいろな言語やライブラリを元に開発することが多いと思います。

私は、Python、Javascript（Vue、Electron）、Ruby(Rails）、Go、Rustなど複数の言語で開発をしています。

この場合、ある言語では必要だけど、ある言語では不要になる拡張があります。

当然ですが、拡張を有効にすれば起動時、実行中、その拡張が実行することになり無駄な動作になります。

# 異なる開発環境ごとにワークスペースを分ける

まず、前提として、異なる開発環境ごとにワークスペース（ディレクトリ）を分けます。
こうすることで、開発環境ごとに「.vscode」という設定ファイルが作成されます。

# ワークスペース別に拡張を無効にする

VSCodeの拡張タブを開き、拡張のプロパティ（歯車マーク）を押すと、「無効にする（ワークスペース）」が設定できます。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/e342c112-ba9c-b86b-922a-a843802e7899.png)



これで、異なる開発環境で無駄な拡張実行を抑制できます。