OmniAICreator/Qiita-1.07M huggingface dataset:
ネット画像の分類 をやってみた

##ネット画像の分類 をやってみた
###インターネット上の画像に関連する情報から、画像が広告かどうかを予測するモデルを作成にチャレンジしてみた。

##データ概要

課題種別：分類
データ種別：多変量
学習データサンプル数：1639
説明変数の数：1558
欠損値：あり

今回は特徴量が多いです。内容は省きます。1560の特徴量処理方法はどうなってしまうのか！
![特徴量.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/b226ce75-1dcb-a8bf-e964-5c791b0a0475.jpeg)

モデル作成はじめました。　現在は有効特徴量約64％で計算
![モデル作成.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/e09b3355-914c-c84a-f9f8-7996c3807f1d.jpeg)

分析項目が流石に多かったので冗長な特徴量の除外を行う。
特徴量2を作成　BEST20より

###備忘として　特徴量インパクトと特徴量ニューセット
モデルの特徴量のインパクトを実行する
冗長な特徴量が識別された後、冗長な特徴量を除外した新しい特徴量セットを作成できます。オプションとして、ユーザー指定のトップNの特徴量を含む新しい特徴量セットを作成する

![特徴量インパクト.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/99a13c32-2595-abab-df26-96d4f59c90c2.jpeg)

再計算中　06：30　20200723

##DataRobot 解説より引用　特徴量インパクトについて
特徴量のインパクトスコアを理解する
特徴量のインパクトを理解する方法の1つは、次のようなものです。任意列に対する特徴量のインパクトは、DataRobotがその列をランダムにシャッフルして（他の列は変更せずに）予測をした場合、モデルのパフォーマンスがどれだけ悪化するかの指標です。DataRobotは、スコアを正規化し、最重要列の値が1になるようにします。この手法は、Permutation Importance（置換重要性）と呼ばれることがあります。

特徴量のインパクトスコアを評価する際は、以下の点に注意してください。

特徴量のインパクトは、モデルのトレーニングデータの最大2500行を使用して計算されます。
時折、データに含まれるランダムノイズが原因で、負の特徴量のインパクトスコアを含む特徴量がある場合があります。極度にアンバランスなデータでは、大部分が負の値となる場合があります。
プロジェクト指標は計算で使用されるので、プロジェクト指標の選択によっては、 特徴量のインパクトの結果に大きな影響が生じることがあります。AUCなど、一部の指標はモデル出力において小さい変更に対する真陽性率が低いので、特徴量の変化がモデルの精度にどれだけ影響するかを評価するには最適ではありません。
いくつかの条件の下では、モデリングに使用するアルゴリズムの関数が原因で特徴量のインパクトの結果が変わることがあります。これは、例えば、類似する強力な信号が多く存在するデータの場合（同じケースと行に対して同じ予測値が提供される場合）などに発生します。そのような場合、L1ペナルティを使用するアルゴリズム（いくつかの線形モデルなど）の場合、インパクトは1つの信号に集中しますし、木の場合は相関する複数の信号にわたって均一に分散されます。
## --
--200723 06:41 オリンピックが本当なら--
【Android 9.0 Pie Java】RecyclerViewの余白部分にsetOnTouchListenerを実装してソフトキーボードを閉じる

## 初めに
リスト表示に便利なRecyclerViewですが、デフォルトのままだと余白部分をタッチした際にイベントを発火させることができません。
RecyclerViewの余白部分をタッチしてソフトキーボードを閉じる為に実装を模索したので共有したいと思います。

![32aeddc0c59703301a8fc30cf57374b6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285286/de7d7e98-d362-4cbd-5a27-140c68235beb.gif)

## 実装方法
まずRecyclerViewに

```
android:touchscreenBlocksFocus="true"
```

を追記します。

```xml:fragment.xml
<LinearLayout
    android:id="@+id/scrollView"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:isScrollContainer="false"
    app:layout_constraintBottom_toTopOf="@+id/footerBorder"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/headerBorder">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:touchscreenBlocksFocus="true"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</LinearLayout>
```

あとはonCreateViewやonCreatedViewでリスナーを実装するだけです。

```java:Fragment.java
RecyclerView recyclerView = view.findViewById(R.id.recyclerView);
recyclerView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // キーボードを隠す
        InputMethodManager inputMethodManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        // 背景にフォーカスを移す
        recyclerView.requestFocus();
        return false;
    }
});
```
以上です。

どなたかの参考になれたら幸いです。
vue-awesome-swiperが動かなくてハマった

Nuxt.jsでSwiperを使ってみたが、うまく動かなくてハマったけどなんとか解決。

# 環境
- Nuxt.js v2.4.0
- vue-awesome-swiper v4.1.1
- swiper v6.0.4

# 現象
配布サイトや他の記事参考にインストール・設置するも、スワイプやドラッグでのスライド以外できない。
autoplayやfade、pagenationなど動かず。

**参考にした記事等**
- [vue-awesome-swiper](https://github.com/surmon-china/vue-awesome-swiper)
- [Nuxt.jsで高機能スライダーSwiperを使ってみた](https://qiita.com/sauzar18/items/81ccfdb48c5e583ad027)
- [Nuxt.js + Swiper スライダーの作り方](https://mmtomitomimm.blogspot.com/2019/09/nuxtjs-swiper.html)


# 結論
Global Registrationの設定をいじったらできるようになった。

以下のページが解決のきっかけになった。
https://github.com/surmon-china/vue-awesome-swiper/issues/688

よくみたら配布サイトにも書いてった。（Custom Build with Swiperの項目）


## インストール
配布サイトと同様。
swiperとvue-awesome-swiperの両方必要。

```
npm install swiper vue-awesome-swiper --save
```

# pluginsの設定
ここの設定を調整した。
pluginsのディレクトリにvue-awesome-swiper.jsを新規作成。


```plugins/vue-awesome-swiper.js
import Vue from 'vue'
import Swiper from 'swiper/swiper-bundle.esm'
import getAwesomeSwiper from 'vue-awesome-swiper/dist/exporter'
Vue.use(getAwesomeSwiper(Swiper))
import 'swiper/swiper-bundle.css'
```

配布サイトでは`swiper/swiper.esm`を読み込んで、使うcomponentを指定していたが、
面倒なので`swiper/swiper-bundle.esm`を読み込んで指定なしで全component使えるようにした。

これがベストなのかは正直わからないが、必要な機能だけ読み込たい場合は配布サイトのCustom Build with Swiperの項目を参考にしてみたら良いだろう。

## nuxt.config.jsでの読み込み

```nuxt.config.js
plugins: [
    { src: '@/plugins/vue-awesome-swiper.js', ssr: false }
],

...

build{
    vendor: [
      'vue-awesome-swiper',
    ],
}
```


# Swiperの設定


```pages/index.vue

<div class="swiper-container" v-swiper="swiperOption">
  <div class="swiper-wrapper">
    <div class="swiper-slide">Slide1</div>
    <div class="swiper-slide">Slide2</div>
    <div class="swiper-slide">Slide3</div>
  </div>
  <div class="swiper-pagination"></div>
</div>

...

export default {
    data () {
        return {
            swiperOption: {
                effect: 'fade',
                loop: true,
                autoplay: {
                  delay: 5000,
                },
                pagination: {
                  el: '.swiper-pagination',
                  clickable: true
                },
            }
        }
    }
}

```

これで動くはず。
swiperは便利だけど、バージョンごとに若干使い方が変わってくるので毎回ハマってしまい苦手意識がある。。
python3をjuypyter labで触りたい環境のメモ

## この記事と書こうと思った理由
macでpythonを使っていた私がAIを学ぶ上でjuypternotebookを使いたいと思ったがjuypterlabがエディタっぽくて使いやすくね？って思った私用メモ

**利点**
・エディタを使ったりIDEで作成したことのある人が見た目的に入りやすいこと
・環境をファイル上で確認できること

## 環境
>- mac book
>- vscode
>- python3
>- pipenv
>- juypter lab

~~~markdown:環境イメージ
macbook
 • Linux brew
 ┗ • python３
   ┗ • pip
     ┗ • pipenv

 • プロジェクト
 ┣ • .venv → 仮想環境:jupyter lab, package(numpy,matplotlib等...)
 ┣ • .vscode
 ┃ ┗ • launch.json
 ┗ • app
~~~
注）違っている等の指摘どしどし待ってます。


## 目次

- 環境に沿って構築していく
 1. [macなのでbrewを使い構築していく](#Linuxbrew)
 2. [vscode -> brew cask](#vscode)
 3. [python3 最新をinstall] (#python3)
 4. [pipenv](#pipenv)
 5. [jupyterlab](#jupyterlab)

## 本題

###Linuxbrew

- Linuxbrewをインストールすること(Homebrewでも可)
- ターミナルを開き下記のURLから飛んでinstallのしたのコマンドを入力してEnterキーを押すとインストールが始まる

[Linuxbrew](https://docs.brew.sh/Homebrew-on-Linux)
[Homebrew](https://brew.sh/index_ja)

###vscode

- ファイル管理がlocalでも確認できる
- ターミナルとファイルが一括で確認、管理をすることができる
- 楽、すごい楽ww (これが一番の理由ww)
・brew caskをinstallしてその上にvscodeをinstallを行うことでbrew上で管理できる

* ~~~termnal
$ brew update
$ brew cask install visual-studio-code
~~~
###python3

- python３をbrewでinstallする。

> (注)Macbookで開発したことある人はマジでこれだけでほぼ主環境は完成であるww 
> (注)pyenvとは併用しないほうがいいと思われる(pipenvと併用できないためpyenvを使ってanacondaを使いたいならこの方法は正直使えない方法ではあるそれでも利点があると考えている私であった。下の方に書いておこうと思う)

~~~termnal 
brew install python3
# ↓確認方法
$ python -V or $ python3 -v
~~~

* これで完了してない場合はpathを設定してあげて欲しい。

###pipenv

- python3でpip3がインストールされているためそこからinstallしていく
- ここでは自分のプロジェクト内に仮想環境も作っていく
    - その方が管理しやすくね？

~~~
$ pip install pipenv
$ PIPENV_VENV_IN_PROJECT=true pipenv install
~~~

###vscodeでデバッグしたい人におすすめ
- jupyter labを使い人には必要ないかもしれないが、vscodeでpipenvの仮想環境にアクセスしてデバッグできる

手順
1. vscodeのアクティビティーバー(左のバー)からデバッグのボタンを押下
2. 車輪のマークを押下
3. pythonファイルを選択する
4. python:autoComplete.extraPathsを追記

~~~
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "justMyCode" : false
        }
    ],
    "python:autoComplete.extraPaths": [
        "[プロジェクトのpath].venv"
    ]
}
~~~


###jupyterlab

- pipenvのshellを起動してjupyter labをinsallするだけ!

~~~
$ pipenv shell
$ pipenv install jupyterlab
~~~

以上です。ここまでで環境はあらかたできたのでここからは欲しいライブラリがあれば
pipのようにpipenv install [ライブラリ名]でインストールしよう！

良いpython Lifeを!
【確率雨量】100年に1度の大雨ってどうやって計算しているの？　―第3回　岩井法―

# 移転のお知らせ

こちらの記事は下記のサイトに移転しました。

> [NNテックブログ](https://nnhiroba.xsrv.jp/nnTechBlog/Article/Article?ID=27)
Rust: Redis のデータを削除 (Delete)

フォルダー構造

```text
$ tree -L 2
.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target
    └── debug
```

```text:Cargo.toml
[package]
name = "redis_delete"
version = "0.1.0"
edition = "2018"

#

[dependencies.redis]
version = "*"

[dependencies]
tokio = { version = "0.2", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
```

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	redis_delete/src/main.rs

					Jul/22/2020
*/
// --------------------------------------------------------------------
use std::env;
extern crate redis;
use redis::{Commands};

// --------------------------------------------------------------------
fn main() -> Result<(), Box<dyn std::error::Error>>  {
	eprintln! ("*** 開始 ***");

	let args: Vec<_> = env::args().collect();
	let key_in = &args[1];
	eprintln! ("{}",key_in);

	let client = redis::Client::open("redis://localhost/").expect("url error");
	let mut conn = client.get_connection().expect("connect error");


//	let key_in = "t1853";

	let result: i32 = conn.del(key_in).unwrap();
	println!("削除結果: 1 => 成功, 0 => 失敗");
	println!("del result for myKey: {}", result);


	eprintln! ("*** 終了 ***");

	Ok(())
}

// --------------------------------------------------------------------
```

コンパイル

```bash
cargo build
```

実行

```bash
cargo run t1856
```
PowerBIにおけるPythonビジュアルの役割と注意点1

# 対象の人
PowerBIのビジュアル眺めてて「お、Py？」ってなった人
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/189c470b-34be-82ba-c6a2-4459f539c456.png" width=35%>

## PowerBIにおいてのPythonの使いどころ
- [取得] データ取得するところ
- [編集] クエリとしてPythonを実行したいとき
- [視覚化] PowerBI既定やカスタムビジュアルで実装していないとき

![20200722.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/65722ea5-7d23-172a-9a4b-cf7f38ab683f.png)


PowerBIではインタラクティブな可視化を得意としていますが、予測値などは表示できません。
データをもとに機械学習して予測値を出して視覚化したいときなど場合はPythonの出番になります。
ただし処理が遅いということもありますし、インタラクティブではない点を考えると、あらかじめ予測したデータソースをもって視覚化したほうが使い勝手が良いのかもしれません。（個人的な意見です）

となると、PowerBIにおけるPythonって、現時点においての私としてはやっぱりビジュアルなのかなーと思っています。
BI標準やカスタムで実装されていないグラフで視覚化したい、、とか。
seabornとか使うとキレイに表現できたりします。

## Pythonビジュアルとは
Pythonで作図したものです。
PowerBIの既定ビジュアルやカスタムビジュアルでは表現できないグラフは、Pythonビジュアルを使って表現することができます。
matplotlibやseabornなどのライブラリが代表的で、データ加工して作図なんてことも可能です。
ただし注意すべき点もあるようです。

### PowerBIサービスでは「Pro」ライセンスが必要
下図は単純な棒グラフです。（左側：Pythoビジュアル、右側：積み上げ横棒グラフ）
PowerBI Desktopで作成しています。
![コメント 2020-07-20 174845.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/80cba7aa-4ccd-0cb0-5b87-e97c2c2016bc.png)

PowerBI Desktopでは問題なく作成できて、表示もできています。
これをPowerBIサービスに発行する場合はライセンスに注意です。
Free版だと、Pythonビジュアルで作成したグラフはこのとおり。
![コメント 2020-07-20 180139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/e4768764-56ac-84d5-eb18-1ee768f21beb.png)


Pythonビジュアルで作成したグラフが表示されていません。
PowerBI DesktopではOKだが、PowerBIサービスはProライセンスが必要になります（$9.99/月）。

Proライセンスだと、PowerBIサービス上でも表示できます。
でも表示に時間がかかります。（単純なグラフでも）
![コメント 2020-07-22 135103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/5052000f-c7b8-a90b-ce70-56b28cac686b.png)


### 現状、Web公開には対応していない
Pythonビジュアルは現状、Web公開もサポートしていない様子です。
でもPowerBI DesktopからのPDFエクスポートはOKです。（表示だけになりますが）
![コメント 2020-07-20 180106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/ba9f7a34-3cdd-30b6-639a-80b320d865f2.png)

### Pythonビジュアル起点での絞り込みなどはできない
PowerBIといえば、相互作用が便利で、一方のビジュアルのあるデータをクリックすると、他のビジュアルも連動してデータを絞り込み表示したりできます。
これが、Pythonビジュアル起点だと無理なようです。
ただし、他のビジュアルやスライサーなどの起点の場合は、Pythonビジュアルも絞り込みなどが行われます。

現時点では、ProライセンスがあればPowerBIサービスでは利用できるし、Web公開さえ我慢すればPythonビジュアルならではの表現で相手に伝えることができます。

### 個人的見解
表示速度などを踏まえた場合、なるべくPowerBI標準ビジュアルやカスタムビジュアル優先で、どうしても表現できない場合にPythonビジュアルを使用するような順位付けになりそうです。

## Power BIでサポートされているPythonパッケージ
※投稿時点

|パッケージ|概要|
|---|---|
|matplotlib|Pythonで静的、アニメーション、インタラクティブな視覚化を作成するための包括的なライブラリ|
|numpy|Pythonを使用した配列計算の基本パッケージ|
|pandas|データ分析、時系列、統計のための強力なデータ構造|
|scikit-learn|機械学習とデータマイニング用のPythonモジュールのセット|
|scipy|Python用の科学ライブラリ|
|seaborn|統計データの視覚化、見た目はキレイ|
|stasmodels|Pythonの統計計算とモデル|
|xgboost|XGBoost Pythonパッケージ|

> 参考
https://docs.microsoft.com/ja-jp/power-bi/connect-data/service-python-packages-support
バッチファイルでy/nの分岐をつくる（備忘録）

この記事では、バッチでy/nの分岐を作成する方法を模索していきます。
お急ぎの方で「結論だけでいい！！」って方は　→→→　[ジャンプ](#まとめ)！

## IF文を使って分岐をする
まずは、簡単にIF文を使用して、y/nの分岐を作成しました。

```
set /p yn_check="Which do you like (y/n)"
IF %yn_check%==y (
  echo you selected " y "
) ELSE (
  echo you selected " n "
)
```
## yとnを大文字でも判定できるようにする
上記の判定法では、yとnが（大文字で）YやNと入力された際に正確に判定できません。
なので、下記コマンドを使用しました。

```
%yn_check:Y=Y%
```
上記コマンドの詳しい解説については下の@q1701様の記事が大変分かりやすかったので参考にしてください。→[参考記事](https://qiita.com/q1701/items/d81e51a64f41ca841da6#%E5%A4%A7%E6%96%87%E5%AD%97%E5%B0%8F%E6%96%87%E5%AD%97%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B "参考記事")
これを先ほどのIFの文に落とし込むと・・

```
set /p yn_check="Which do you like (y/n)"
IF %yn_check:Y=Y%==Y (
  echo you selected " y "
) ELSE (
  echo you selected " n "
)
```
これで、基本的なy/nの分岐ができるようになりました。

## y(Y)またはn(N)以外の文字では再入力を促す
ここまでの構文では、y(Y)以外の文を入力した際はnを入力したものを同じ結果になります。
しかし、このままでは、誤ったキーを押しただけでNと同じ結果が出てしまいます・・
そこで下記動きになるように分岐を作り直します。
yまたはY　→　"you selected y"と表示
nまたはN　→　"you selected n"と表示
それ以外　→　再入力

ここで、使用するのはGOTO構文ですね
作り直すとこんな感じです。

```
:RESTART
set /p yn_check="Which do you like (y/n)"
IF %yn_check:Y=Y%==Y (
  echo you selected " y "
) ELSE IF %yn_check:N=N%==N  (
  echo you selected " n "
) ELSE (
  echo " %yn_check% " is unavailable
GOTO RESTART
)
```

さらに、echo offと再入力の際に画面のクリアもプラスで加えちゃいましょう。

```
echo off
:RESTART
set /p yn_check="Which do you like (y/n) : "
IF %yn_check:Y=Y%==Y (
  echo you selected " y "
) ELSE IF %yn_check:N=N%==N  (
  echo you selected " n "
) ELSE (
cls
  echo " %yn_check% " is unavailable
GOTO RESTART
)
```

## まとめ
途中で作成した下記の構文を様々なバッチファイルに組み込んでいくことで、y/nの分岐を有効に使えそうです。

```
:RESTART
set /p yn_check="Which do you like (y/n)"
IF %yn_check:Y=Y%==Y (
--- y(Y)を入力した際の処理
) ELSE IF %yn_check:N=N%==N  (
--- n(N)を入力した際の処理
) ELSE (
  echo "もう一度入力してください"
GOTO RESTART
)
```

今回は、初めてのQIITA投稿です。
記事の内容についても、コマンドの書き方についてもこれはもっとこう書いたほうが良いとかコメントあればご助言ください。
今後ともよろしくお願いいたします。
buttonタグにリンクを貼る

#復習　buttonタグ


###新しタブへ

```index.html
<button class="btn" onclick="window.open('リンク先')">ボタン</button>
```


###同じタブ

```index.html
<button class="btn" onclick="window.location.href='リンク先'">ボタン</button>
```
C#のプロパティ初期化とGetter,Setterの書き方

```C#:samples.cs
//初期化
 public int Sum{ get; set; } = int.MinValue;
//Getter定義
 public int Sum2 =>  10 + int.MinValue;
 public string Str { get { return $"===={Sum2}===="; } set { } }
```

```C#:コード補完.cs
prop + tab
public int MyProperty { get; set; }

propg + tab
public int MyProperty { get; private set; }
```
vagrantで複数のbridgeネットワークがある場合

#はじめに
vagrantで複数のbridge(public)ネットワークがある場合、vagrantfileにbridgeを指定していないと、vagrant upの際、「youどっちにする？」って聞かれてうざいです。
その場合のvagrantfileの記述方法

#vagrantfile
ホストマシンに複数のNIC(LAN A,LAN B)があって、それぞれの仮想ネットワークにbridgeします。
ネットワークの設定にbridgeの指定が無いと、vagrant upの際、以下のように聞かれます。

```sh:
==> router: Available bridged network interfaces:
1) LAN A - 仮想ネットワーク
2) LAN B - 仮想ネットワーク
==> router: When choosing an interface, it is usually the one that is
==> router: being used to connect to the internet.
==> router:
    router: Which interface should the network bridge to?
```
起動時にvagrant upを自動起動させたい場合、途中で止まってしまいます。

#ではどうするか
以下のようにvagrantfileにネットワークアダプタ名をbridgeの引数として書けばOK。
※windowsのvagrantでハマったんですが、NICの名前に全角文字がある場合、vagrantfileがshift-jisだとエラーが出ます。文字コードを「UTF-8」にして保存。気をつけましょう。

```ruby:vagrantfile
config.vm.network "public_network", bridge: "LAN A - 仮想ネットワーク"
config.vm.network "public_network", bridge: "LAN B - 仮想ネットワーク"
```
React で Markdown を HTML に変換しつつ簡単に syntax highlight したい


## 使うもの

- [react-markdown](https://github.com/rexxars/react-markdown)
  - Markdown を HTML に変換してくれるライブラリ
- [React Syntax Highlighter](https://github.com/conorhastings/react-syntax-highlighter)
  - 受け取った文字列を syntax highlight してくれるライブラリ

## 実装例

```tsx:~/components/CodeBlock.tsx
import React from "react"
// syntax highlight の styleはお好み、自分は JetBrains 信者なので darcula 推し
import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"
import { darcula } from "react-syntax-highlighter/dist/cjs/styles/prism"

interface P {
  value: string
  language?: string
}

const CodeBlock: React.FC<P> = ({ language, value }) => {
  return (
    <SyntaxHighlighter language={language} style={darcula}>
      {value}
    </SyntaxHighlighter>
  )
}

export default CodeBlock
```

```tsx:~/pages/hoge
// 呼び出し側、どこかのページとか任意の場所で
import React from "react"
import ReactMarkdown from 'react-markdown'
import CodeBlock from "~/components/CodeBlock"

interface P {
  // マークダウンで記述された内容をstringとして受け取るとする
  markdown: string
}

const Page: React.FC = ({ markdown }) => {
  // 先に用意した CodeBlock コンポーネントを renderers に渡すと
  // md から html に変換する際、code タグになる部分だけ渡したコンポーネントを使って描画してくれるので
  // syntax highlight が簡単にできる
  return (
    <ReactMarkdown
      source={markdown}
      renderers={{ code: CodeBlock }}
    />
  )
}
```

## style の import 元は 2 種類あるので注意

```ts
// CommonJS 準拠
import { darcula } from "react-syntax-highlighter/dist/cjs/styles/prism"
// ECMAScript 準拠
import { darcula } from "react-syntax-highlighter/dist/esm/styles/prism"
```

ES6構文の`export`に対応してない環境だと `esm` から import してしまうとエラーとなるので、環境に合わせて `esm` か `cjs` か選択する。  
他に使えるオプションとかはそれぞれの README に書いてた。

---

[ブログ](https://www.ykicchan.dev/posts/2020-07-20)に書いたものコピペです
JSONデータをエンコード・デコードしたい

## jqコマンドをインストールする


**Macの場合**

```
brew install jq
```



## JSONデータが入ったファイルを整形する（エンコード）
sample.jsonファイル：JSONデータが入っているファイル

```
jq . sample.json > tmp && mv tmp sample.json 
```

## vimで編集

```
vim sample.json
```



## 戻す（デコード）

```
jq -c . sample.json > tmp && mv tmp sample.json
```

UTF-8の文字列が入ったJSONデータは自動的に日本語になる
そのままUTF-8で受け取りたい場合は `「-a」` をつけてASCIIにエンコードする

```
jq -ac . sample.json > tmp && mv tmp sample.json
```

以下の記事を参考にしました
https://takuya-1st.hatenablog.jp/entry/2019/07/09/174427


## 整形したJSONデータのみを確認したい場合
`echo`を使う

```
$ echo '{"items":[{"item_id":1,"name":"すてきな雑貨","price":2500},{"item_id":2,"name":"格好いい置物","price":4500}]}' \
| jq .
{
  "items": [
    {
      "item_id": 1,
      "name": "すてきな雑貨",
      "price": 2500
    },
    {
      "item_id": 2,
      "name": "格好いい置物",
      "price": 4500
    }
  ]
}
```

以下の記事を参考にしました
https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af
docker-compose [ コマンド集 ]

自分用メモです。

#開発環境を立ち上げる

```text:起動
docker-compose up
```

```text:ビルドして起動
docker-compose up --build
```

```text:起動コンテナに入る
docker-compose exec [container-name] bash
```

```text:起動コンテナに入る。出ると自動で削除
docker-compose exec --rm [container-name] bash
```

```text:コンテナを起動。コンテナに入って、コマンドを入力。
docker-compose run --rm [container-name] {command}
```

```text:起動済のコンテナに入って、コマンドを入力。自動でコンテナを削除
docker-compose run --rm [container-name] {command}
```

```text:
```

```text:
```

```text:
```

```text:
```

```text:
```
ページ遷移をすると、jQueryが動かなくなる問題解決大臣

#jQueryは問題なく発動するけど、ページを遷移すると発動しなくなる。しかしページの再読み込みをするとちゃんと動いてくれる問題

『環境』
- ruby：2.6.6
- rails：6.0.3.2


##今回の悪の根源
それは**turbolinks**

##turbolinksって美味しいの？？
なんとなくは聞いたことがあったけど理解してなくて調べてみた。
どうやら**turbolinksはページの遷移を早くしてくれる**便利なヤツらしい

##なんで早くなるん？？
なぜ早いかと言うと、ページを遷移するときに全部のファイルを読み込んで遷移するわけじゃなくて、HTMLのbody要素だけを取っ替えて読み込んでくれているから早くなってくれているみたい。

##つまり
ページを遷移するときにjavascriptファイルは読み込んでおらず、ページ遷移するとjQueryが発動しなくなっていたようだ。そこからページの再読み込みをすると、ようやくjavascriptファイルを読み込んでjQueryが発動したという流れ。


##とりあえず**turbolinks**には休んでもらいましょう
```ruby:qiita.rb
require("@rails/ujs").start()
#require("turbolinks").start()   ←　コメントアウト
require("@rails/activestorage").start()
require("channels")
require('jquery')
```
指定範囲内のアルファベットの出力

記録用

入力された文字列の最初と最後のアルファベットの範囲内のアルファベットを出力

chr()は整数値を文字に変換する関数。
ord()は文字を整数値に変換する関数。

65～90まで大文字、97～122まで小文字。

ex：ord('A') =65 ,chr(65) ='A'  

入力例
GINO

出力例
G
H
I
J
K
L
M
N
O

コード
```
line = input()
n = len(line)

for i in range(ord(line[0]),ord(line[n-1]) + 1):
    print(chr(i))
```
git リモートとローカルから、ブランチを削除する

自分メモです。

#ローカルブランチを削除する

```text:ローカルブランチ削除(マージ済ver)
git branch -d [branch-name]
```

```text:ローカルブランチ削除(強制ver)
git branch -D [branch-name]
```

#リモートブランチを削除する

```text:リモートブランチ削除
git push --delete origin [branch-name]
```

#知っ得。コマンド

```text:ブランチ詳細(ローカルver)
git branch
```

```text:ブランチ詳細(リモートver)
git branch --remote
```

```text:１つ前のcommitメッセージを変種
git commit --amend
```
Rubyでちょっとずつポーカーを実装する その5

#前回の記事
[その1](https://qiita.com/paraizo2424/items/23f5ab031dbda184ce9d)→[その2](https://qiita.com/paraizo2424/items/10c4a2576a53e655aef9)→[その3](https://qiita.com/paraizo2424/items/6187b5b6cd7c7ebc6eca)→[その4](https://qiita.com/paraizo2424/items/4806a724879b0cc8d6c5)

#その5のゴール
その1で@r12tkmtさんから受けた[アドバイス](https://qiita.com/paraizo2424/items/23f5ab031dbda184ce9d#comment-869ec4939a927b872635)を元にリファクタリングする。

#カードの情報をクラスを切ってもよいかも
###Cardクラスを切って、suitとnumberをinitializeで受け取るようにする
カード一枚一枚を連想配列{suit: suit, num: num}で管理していたのを、以下のようなCardクラスに変更しました。

```card.rb
class Card
  SUITS = [:♠︎, :♣︎, :❤, :♦︎]

  def initialize(suit, num)
    @num = num
    @suit = suit
  end
end
```

コミット履歴が[こちら](https://github.com/paraizo2424/poker_game/commit/1f43eb01315f365d4d7f33782b07c85cf7cc2905)

###suitはSymbolとし、画面表示用に記号を返却するメソッド
suitのSymbolを表す定数の配列と、それを画面表示用に戻すMARKという定数の連想配列を作りました。ついでに、11はJ（ジャック）、12はQ（クイーン）、13はK（キング）と表示されるようにするようにしました。

```card.rb
class Card
  SUITS = [:spade, :heart, :diamond, :clover]

  MARK = {
    spade: "♠",
    heart: "♡",
    diamond: "♢",
    clover: "♣",
    1 => "A",
    11 => "J",
    12 => "Q",
    13 => "K"
  }

~省略~

  def show
    corresponding_mark(@suit) + corresponding_mark(@num)
  end

  def corresponding_mark(sym)
    if MARK[sym]
      return MARK[sym]
    else
      return sym.to_s
    end
  end
end
```

コミット履歴は[こちら](https://github.com/paraizo2424/poker_game/commit/a60a041b839c3d8b224661bbfe6a6d21826a7fe1#diff-f3335208b7514f34438fef5e5505ca71R9)

#playerが役の判定までがっつり持ちすぎでは?
###役の判定を別のmoduleなどに切り出す
役の判定をするplayer.judgeメソッドを、JudgeHandというmoduleを作って分けました。手札を引数として渡すと役が文字列で返ってきます。
結局、このmoduleはplayerクラスがincludeするので、playerが役割持ちすぎ問題は解決していないです💦理由はplayerのインスタンス変数のhands配列（手札）の受け渡しが楽なので。どう書いたら良かったのか…

コミット履歴は[こちら](https://github.com/paraizo2424/poker_game/commit/d3844fe26e7bc807417bd8562a289af69c8f5348)

###symbolで役名を返すようにし勝敗判定を数値の比較する
どう書いていいか思い浮かばなかったので、一旦放置としました💦

#その5のコード
https://github.com/paraizo2424/poker_game/commit/7fc417a84faac4b68a70743b2751fa19d1229340

#次回
[その6]()製作中
Firebase（1度デプロイ済みで、更新デプロイを行いたいときのコマンド）

##更新（デプロイ）のコマンド
:writing_hand_tone1:初回のデプロイが済んでいることが前提

デプロイが簡単だったので、ポートフォリのデプロイにFirebaseを使用しました。
が、
更新作業後、再度デプロイをしようとしたところコマンドをど忘れしていたので、備忘録として残すことにしました。

####Firebaseの下記フォルダへのデプロイ（更新）にします
<img width="670" alt="スクリーンショット 2020-07-22 13.04.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540209/19c678bc-df7c-7924-44a1-0882072d4d40.png">

`cd`で該当ディレクトリへ移動しておく

```ruby:ターミナル
MacBook-Air:ディレクトリ名$ firebase login
Already logged in as #Firebaseにログインしたときのアドレス
#自分はすでにログイン済みだったようです。
MacBook-Air:ディレクトリ名$ firebase deploy

=== Deploying to 'pf'...
#⬆︎の'pf'はFirebase上でデプロイ済みのフォルダ名

i  deploying hosting
i  hosting[pf]: beginning deploy...
i  hosting[pf]: found 34 files in #デプロイを行うディレクトリ名
✔  hosting[pf]: file upload complete
i  hosting[pf]: finalizing version...
✔  hosting[pf]: version finalized
i  hosting[pf]: releasing new version...
✔  hosting[pf]: release complete

✔  Deploy complete!

Project Console: 
#URL

Hosting URL: #URLが吐き出されます
```
これでデプロイ（更新）は完了です。
ポートフォリオ作成なら、git reset が便利でした

ポートフォリオ作成中、rubocopを導入してみたところ
エラーがすごい多くて、`rubocop -a`をして修正したところ
レイアウトが崩れ、ajaxで動いていたイイネやフォローやコメント投稿削除機能が動かなくなりました。

#git revertかresetどっちで戻る？
rubocop -aで修正したコミットを遡ることにしました。
そこで、`git revert`か`git reset`を使用するか迷いました。

#複数コミット戻すなら、git resetが簡単
私は気づかず作業を続けていたので、10コミットほど遡らなければならなかったです。
`git revert`だと履歴が全部戻ることと、いちいち`git revert [コミットID]`を10回打たねばならなかったので
今回は、`git reset --hard HEAD~[戻るコミット数]`で一気に戻ることにしました。

#作業

```戻るコミット数を確認
git log
```

```
git reset --hard HEAD~10
```

修正する

#プッシュ

```変更内容を適用
git add .
```

```
git commit -m "git reset で修正を入れた"
```

```強制プッシュ（普通にpushするとconflictが発生するため）
git push -f origin HEAD
```

#マージ
```
git checkout [マージしたいブランチへ]
```

```
git merge [修正ブランチ] -m "他ブランチへとマージする"
```

```強制プッシュ
git push -f origin HEAD
```

修正が適用される。
AWS EC2内、Railsアプリケーションの起動、停止コマンド　深堀

#####環境
言語：Rails 5.2.4.2
サーバー：AWS EC2
ターミナル：TeraTerm

##結論
####サーバー起動
プロジェクトのルートディレクトリにて

```
rails s -e production
```
####サーバー停止
プロジェクトのルートディレクトリにて

```
kill $(cat tmp/pids/puma.pid)
```

##解説
#####サーバー起動

```
rails s -e production
```
・-e は -environmentの略
　production環境でサーバーを起動しますよという意味になる。
・Gemfile内にて、group :production do内のGemを読み込んで実行する。
・-environmentを指定しない場合、デフォルトでdevelopmentになっている。
　その為、Gemfile内group :development do中のGemが読み込まれ、本番環境ではエラーを起こす。


#####サーバー停止

```
kill $(cat tmp/pids/puma.pid)
```
・Railsアプリケーション起動中(サーバを立てている状態)、tmp/pids/下にpuma.pidというファイルが作成される。(Railsアプリケーション停止中は存在しない。)
・puma.pidには、起動中RailsアプリケーションのプロセスIDが記入されている。(ex. 1234)
・catコマンドを実行すると、指定したファイル内の内容(プロセスID)を出力する。
　(実際にcat tmp/pids/puma.pidで確認できる。→「1234」が出力される)
・$kill プロセスID コマンドで、指定したプロセスIDのプロセスを終了する。
・つまり、上記コマンドを入力すると
　$kill 1234
　となり、プロセスID：1234(起動中Railsアプリケーション)を終了することができる。

#####最後に
個人で調査した結果ですので、間違っておりましたら申し訳ございません。
Docker 上の Redash のログのサイズを調べる

Redash を動かしているサーバのディスクが枯渇してきたので、ログが圧迫している可能性を考えたが、Docker で動かしていたので、どこにログがあるのか不明だった。
`docker inspect` を使うと、ログの場所がわかる、ということなので、作ったワンライナーが下記。
調べても意外と出てこなかったので、備忘録として残す。

```
docker container ls --format "{{.Names}}" | xargs -tn1 -I{} sh -c "sudo ls -lh \$(docker inspect --format='{{.LogPath}}' {})"
```
Laravel カスタムバリデーション追加

Laravel5.5
PHP7

入力フォームにバリデーションを設定するとき、
laravelのバリデーションルールでは、うまく設定できない。
そんな時、独自のバリデーションを作成して適用させようと思いました。

その時に構築した方法を以下に記載します。

下記は、
フォームで役職を設定し、そのバリデーションするためのコードです。
下記のバリデーションを設定しようとしています。
①入力必須、数値
②数値はconfig.positionに設定されている値のみ

①は、rulesにバリデーションを設定するだけです。

②には、laravelのバリデーションルールでは設定できないので独自のバリデーションを設定します。



```PositionRequest.php
<?php

namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;

class PositionRequest extends FormRequest
{
	/**
	 * Determine if the user is authorized to make this request.
	 *
	 * @return bool
	 */
	public function authorize()
	{
		return true;
	}

	/**
	 * Get the validation rules that apply to the request.
	 *
	 * @return array
	 */
	public function rules()
	{
		return [
			'postion' => 'required|integer',
		];
	}

	// 役職のバリデーション
	public function withValidator($validator) {
		$validator->after(function ($validator) {
			if (!in_array($this->position, config('common.position'))) {
				$validator->errors()->add('position', '役職を正しく選択してください。');
			}
		});
	}
}
```


```config/common.php
'position' => [
    '社員' => 10,
    '係長' => 20,
    '課長' => 30,
    '部長' => 40,
    '社長' => 50,
],
```

公式に記載されている方法でコードを書きます。
https://readouble.com/laravel/5.5/ja/validation.html

```.php
public function withValidator($validator) {
	$validator->after(function ($validator) {
		//ここに処理を記載する。
	});
}
```

今回は、config/common.php内のpositionに設定している値以外は、
エラー表示を行うバリデーションを設定します。

```.php
if (!in_array($this->position, config('common.position'))) {
    $validator->errors()->add('position', '役職を正しく選択してください。');
}
```
ローカル開発環境でLaravelのmigrateができない場合の解決方法

php artisan migrateが実行できない場合の解決方法

##環境
MacBookPro 2020
Homebrew　　2.4.8
MySQL　　　　 Ver 8.0.21 for osx10.15 on x86_64 (Homebrew)
PHP　　　　　7.3.11 (cli) (built: Jul  5 2020 03:23:39) ( NTS )


##原因
configのキャッシュが残っている
MySQLのversionが８．０以降の場合、envファイルへの追記が必要。
##解決方法
下記コマンドでconfigのキャッシュを消去後、再度migrate実行

```
php artisan config:clear
```





#別のエラーが出ている場合　エラーコード
```
　Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (SQL: select * from information_schema.tables where table_schema = laravel-course and table_name = migrations and table_type = 'BASE TABLE')

  at /Applications/MAMP/htdocs/laravel-course/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673| 

  Exception trace:

  1   PDOException::("SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)")
      /Applications/MAMP/htdocs/laravel-course/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=laravel-course", "root", "root", [])
      /Applications/MAMP/htdocs/laravel-course/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.　
```

##エラー解決方法
1 MySQLに'データベース'を作成
2 作業用ユーザーの作成 
3 env .database.phpの情報を合わせる

.envの情報を以下にする
DB_CONNECTION=mysql
DB_HOST=localhost
DB_DATABASE='データベース'
DB_USERNAME=root
DB_PASSWORD=root
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

4　
``` php artisan config:clear
```
 ```php artisan migrate```
 で完了
Ubuntu Server 20.x をインストールした後のホスト名やnetplanなどの設定

Raspberry Pi 3 で Ubuntu Server 20.x を起動した際に諸々の設定が必要になったのでメモとしてまとめてみました。



##ホスト名の設定
```
$ sudo hostnamectl set-hostname <HOSTNAME>
```
##ネットワーク周りの設定(netplan)
/etc/netplan/*.yaml がファイル名順に処理され、重複する設定項目は後から処理されるファイルで上書きされる。
なので、一番最後に処理されるようなファイル名で作成する

```
$ sudo vi /etc/netplan/99-manual-config.yaml 
```

設定反映

```
$ sudo netplan apply
```

##DNSリゾルバ設定
```
$ sudo vi /etc/systemd/resolved.conf
```

`DNS= ` 行にネームサーバのIPアドレスを指定する
複数サーバを指定する場合は空白で区切って指定する

設定反映

```
$ sudo systemctl restart systemd-resolved.service
```

設定状況確認

```
$ resolvectl status
```
##タイムゾーンの設定
```
$ sudo timedatectl set-timezone Asia/Tokyo
```

##時刻同期設定
```
$ sudo vi /etc/systemd/timesyncd.conf
```
`NTP=` 行に NTP サーバを指定する
複数サーバを指定する場合には空白で区切って指定する

設定反映

```
$ sudo systemctl restart systemd-timesyncd
```
##パッケージマネージャの更新とアップグレード
```
$ sudo apt -y update
$ sudo apt -y upgrade
```

##ロケールの設定
```
$ sudo apt -y install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
```
【cygwin】cvs環境を作る

- ```2020-07-28```　更新。Subversion環境に移行。

# 1. 背景

RCSを使ってスクリプトをバージョン管理していたけど、ファイルも増えて来たのでCVS環境に切り替える。作業メモを記す。

# 2. 状況

- リポジトリのパスはローカルになるが、実態は```MEGA```というフリーのストレージサービス。OneDriveもあるけど、利用頻度にしばりのあるMEGAを使う。
- 登録対象のディレクトリ配下には管理対象とならないテキストファイルがある。

# 3. 参考ページ

- http://www.gfd-dennou.org/arch/cc-env/cvs/old_2005-11-08/basic/cvs-usage1.htm
- https://www.ne.jp/asahi/hishidama/home/tech/cvs/command.html
- https://nxmnpg.lemoda.net/ja/5/cvs
- https://nxmnpg.lemoda.net/ja/1/cvs#11

# 4. 管理対象のディレクトリ

- tools/ 諸々のスクリプトを置く．今回の管理対象．
    - cron/ 自動実行のスクリプトを置く．
        - TASK_NAME/ 関連スクリプトが複数ある場合に作成する
            - .temp/ 実行時の中間ファイルを置く．ファイルは管理対象外．
            - .data/ 実行後のファイルを置く．ファイルは管理対象外．
- logs/ ログファイルを置く．管理対象外．

# 5. 手順

## リポジトリ初期化

```
$ export CVSROOT="/cygdrive/c/Users/USERNAME/MEGA/MACHINE_NAME/cvs_repository"
$ cvs init
```
## IMPORT前の準備

管理対象外にするファイルのために.cvsignoreを作成する。

## IMPORT

```
$ cd tools
$ cvs import -m "My Script Files" tools BRANCH_1 RELEAS_1_1
```

- カレントディレクト以下にあるファイルが登録される．
    - ```.cvsignore```で指定されているファイルは無私される．
- オプションについて
    - ```tools``` ${CVSROOT}以下に作成されるディレクトリ名
    - ```BRANCH_1``` ベンダータグと説明されているけど、最初のブランチタグっぽい
    - ```RELEAS_1_1``` リリースタグ

## CHECKOUT
※```tools```はホームディレクト直下にある

```
$ cd
$ cvs checkout tools
$ cvs checkout tools/cron
$ cvs checkout tools/cron/TASK_NAME
$ cvs checkout tools/cron/TASK_NAME/.data
$ cvs checkout tools/cron/TASK_NAME/.temp
```

- 既にディレクトリがある場所に重ねるように```cvs checkout```を実行
- 何もなければ一回で全てcheckoutされる

# 6. 日常的に使うコマンド
## 先ずは設定(~/.cvsrc)

```
cvs -q
```

## 作業状況の確認、他所で登録された更新の反映

``` cvs update```

- subversionから見ると、cvsは「他所の更新を確認する」「他所の更新を反映する」がコマンドとして分かれていない。

## 変更内容の登録

``` cvs commit -m "コメント"```

# 7. 雑記
## importのベンタータグについて

そういえば「import」で使う各引数の説明を見つけた
https://nxmnpg.lemoda.net/ja/1/cvs


> `cvs import' を使うことで外部の供給元 (例えばソースベンダ) からのソース配布物 全体をあなたのソースリポジトリのディレクトリへ取り込めます。 最初のリポジトリの作成と、外部の供給元からのモジュールへの 大規模な更新の両方にこのコマンドを使うことができます。

ここまでの説明ではよく分からなかった。

> 外部からのソースは第一レベルの ブランチ、デフォルトでは 1.1.1に保存されます。 以降の更新は このブランチのリーフになります。 例えば、最初に import したソース集合からのファイルはリビジョン 1.1.1.1になり、 次の import による更新でファイルはリビジョン 1.1.1.2になり、以下同様に続きます。

ここまで読んで、改めて ```import``` の説明を読んでやっと分かった。

## import が想定している状況

1. 他社製のソースコードをもらってcvs importで登録
2. 自社で開発を進める
3. その後、他社から更新版をもらう
4. ベンダータグを使って ```cvs checkout -r VENDOR_TAG``` を実行
5. この環境で更新版を受け入れ、cvs commitを実行する
6. CURRENTブランチでVENDOR_TAGとの差分を確認して適宜判断
7. …

通常は「他社製＝自分」なのでピンと来なかったというわけです。
SceneKit用にモデルを３Dスキャンする

ARKitを使って何か物体を検知させるには、事前に3Dスキャンしたデータを用意する必要があるのですが、アップルが、ScanningAppというスキャンアプリを用意してくれているのでそれを使ってスキャンデータを作成していきます。

## ScanningAppプロジェクトのダウンロード

https://developer.apple.com/documentation/arkit/scanning_and_detecting_3d_objects
アップル公式からScanningAppのXcodeプロジェクトをダウンロードして、解凍したファイルの中から `ScanningApp.xcodeproj` をダブルクリックして開きます。

## ScanningAppプロジェクト設定

プロジェクトをXcodeで開くと左側に表示されるのファイルリストの一番上(root)を選択するとプロジェクト全体の設定画面が表示されます。
`Signing & Capabilities` タブを選択して、Teamセレクターにて自分のアカウントを選択します。

<img width="900" alt="スクリーンショット 2020-07-22 11.05.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248346/9dadb17d-4a2e-5a23-f7b5-a40549453785.png">

## ScanningAppインストール

3Dスキャンに使いたいiPhone実機をUSBでMacに繋ぐと、左上にある実行環境を選択できるセレクターのなかに接続したiPhoneが表示されるのでそれを選択します。
一番左上にある `▶︎` マークのビルドボタンをクリックしてビルド・アプリのインストールをします。

<img width="900" alt="スクリーンショット 2020-07-22 11.14.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248346/70fcd533-bbd9-5001-2df3-f5679a1483c3.png">

## ScanningAppの認証設定

ScanningAppがインストールされたら、アプリが起動できるように設定していきます。
「設定」アプリの一般→デバイス管理ページへと進みます。
表示された一覧から「デベロッパAPP」をタップ

<img width="300" alt="IMG_0019.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248346/2e9c4731-8287-c06a-2b30-e794c162461d.png">

`Apple Development:` の欄をタップ

<img width="300" alt="IMG_0020.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248346/29c6f67f-de18-e1c7-f0e3-437c4ccbb182.png">

「信頼」を選択して完了です。

<img width="300" alt="IMG_0021.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248346/14e96ecf-fb38-1364-2781-370d919d6e9d.png">

## スキャンした3Dデータを共有

アプリを立ち上げて指示に従ってモデルをスキャンしていくと3Dデータが作成されるので、お好きな方法でMacにデータを送信してください。（AirDropがおすすめ）
`Scan_**.arobject` のようなファイルがMacに送信されればOKです。

## Xcodeに読み込ませる

用意した3Dスキャンデータを任意のARアプリのXcodeプロジェクトに読み込ませていきます。
Xcodeプロジェクトの `Assets.xcassets` ディレクトリの `3D assets` ディレクトリに `Scan_**.arobject` ファイルをドラッグ＆ドロップすれば3Dスキャンデータの用意は完了です。
インデックスとは①

#レスポンスってなんだ

実務でプログラミングをはじめ、実際に自分が組んだものが客先に納品される。
しっかりテストされている環境ならば、客先にいってバグってたなんてことは少ないだろう。

しかし、レスポンスまではなかなか確認できない。

データが増えた、数ヶ月後「なんか処理遅いんだけど・・・」
なんてよくある話ですよね。


正直、調査がめんどくて時間がかかるし、なんだか難しい用語がたくさん出てきて、逃げがち。
でもこの仕事に携わる以上、避けては通れない。
じゃあ立ち向かうしかないじゃないか。

詳しい人はよく言う「SQLの気持ちになれば、簡単」

最初聞いた時はなんやねんそれという感じでしたが、実際に立ち向かうには本当にそれしかない。
じゃぁどうしたらオプティマイザの気持ちになれるか。

相手を知るしかない。
じゃぁ初級からでも勉強しよう。

ちょいちょいパフォーマンスチューニングをしてきた経験はあれど、
先輩方の教えと曖昧な知識しかないことがオプティマイザとお友達になれない原因！
ということで初歩の初歩から確認していきます。

##インデックスってなんだ
インデックスを知らない人は多分いない。
でもどういう役割で、なにを、どこまでできるかってたぶん自分も理解していない。

###インデックスとは
「検索のパフォーマンスを向上させる」ための機能。
インデックスが存在しない場合は、どんなデータを検索する場合でも、必ずテーブルの先頭から最後まで探し続けなければならない。

###実際に作ってみよう
Shainテーブル

| NO               |       Name        |             Age    |
|:-----------------|-------------------|-------------------:|
| 1                |             Ooi   |           48        |
| 2                |            Ubukata|       35       |
| 3                |              Kato |        20        |
| 4                |             Mano |         28         |
| 5                |             Endou  |       38       |
| 6            |           Wtarai    |      40       |
|・・・        |               |     　　　       |

```sql
CREATE INDEX TR_Name
ON Shain(Name)
```

この社員テーブルに対して、インデックスを作成し、Endouで検索した場合の処理イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260891/cead1e8d-a9de-98cc-3a87-d11abf5db512.png)

実際にインデックスを使ってみる。

```SQL
SELECT Name
FROM Shain
WHERE Name = 'Endou'
```
実行プラン
![uploading-0]()
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260891/18daf65b-8de3-1afb-f859-2fd24c0cccf6.png)

実際に作成したインデックスを利用して、Index Seek出来ているのがわかります。
ここで上げているのは最も簡単な非クラスタ化インデックスの例です。
ここまでは理解するの簡単。

でもこうしてみると・・・

```sql
SELECT *
FROM Shain
WHERE Name = 'Endou'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260891/fb7d4edc-206b-e166-5b9c-5ee64ceff866.png)


先程のインデックスが利用されず、クラスタ化インデックスのIndex Scanになってしまっていることがわかります。（データ件数を増やすとまた別の実行プランが採用されます）

この辺の対応を複合インデックスや、負荷列インデックスでか行けるする必要がある。
そこが結構難しい。複雑だし。
この辺の設定方法を今後も記事にしていきたいと思います。

##おわりに
記事を作成していて思いましたが、正直データベースの構造やらオプティマイザの仕組みもまとめないと最終的にお友達になれそうもないです。
インデックスから取り上げたのは微妙だった気がしてきた。。。。
zsh: command not found: mysql が出た際にmysqlのパスを通す方法

####mysqlコマンドを使用する為に行ったことを備忘録として残させていただきます。

####環境

```
MacOS
mysql5.7
```

####状況

mysqlコマンドでデータベースに接続しようとしたところ、

```
-> % mysql -u root
zsh: command not found: mysql
```
と表示されてしまった。

####行ったこと

#####①mysqlがインストールされているかどうかを確認

```
-> % brew list| grep mysql
mysql@5.7
```
私の場合はmysql5.7を指定していたので、
任意のバージョンがインストールされていることを確認。

mysqlは入っているので、パスが通っていないのではないかと推測。

#####②mysqlのパスを通す

```
echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
```
#####③反映させる

```
-> % source ~/.bash_profile
```

これで無事、

```
-> % mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for osx10.15 
(x86_64) using  EditLine wrapper
```
mysqlコマンドを使用することができました！
Rust: Redis のデータを更新 (Update)

フォルダー構造

```text
$ tree -L 2
.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target
    └── debug
```

```text:Cargo.toml
[package]
name = "redis_update"
version = "0.1.0"
edition = "2018"

#

[dependencies.redis]
version = "*"

[dependencies]
tokio = { version = "0.2", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
chrono = "0.4"
```

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	redis_update/src/main.rs

					Jul/22/2020
*/
// --------------------------------------------------------------------
use std::env;
extern crate redis;
use redis::{Commands};
use chrono::{Local, Date};
use serde_json::json;

// --------------------------------------------------------------------
fn main() -> Result<(), Box<dyn std::error::Error>>  {
	eprintln! ("*** 開始 ***");

	let args: Vec<_> = env::args().collect();
	let key_in = &args[1];
	let population_in = &args[2];
	println! ("{}\t{}",key_in,population_in);

	let client = redis::Client::open("redis://localhost/").expect("url error");
	let mut conn = client.get_connection().expect("connect error");

	let res = conn.get(key_in.to_string());

	let answer: String = res.unwrap();

	let json: serde_json::Value = serde_json::from_str(&answer)?;

	let obj = json.as_object().unwrap();

	println! ("{}",obj["name"].to_string());
	println! ("{}",obj["population"].to_string());
	println! ("{}",obj["date_mod"].to_string());

	let date_mod: Date<Local> = Local::today();
	println!("{}", date_mod);

	let pp_in : i32 = population_in.parse().unwrap();
	let obj_new = json!({
		"name": obj["name"],
		"population": pp_in,
		"date_mod": date_mod.to_string()
		});

	let json_str = obj_new.to_string();
	println!("{}",json_str);

	let _: ()  = conn.set(key_in.to_string(), json_str).unwrap();

	eprintln! ("*** 終了 ***");

	Ok(())
}

// --------------------------------------------------------------------
```

コンパイル

```bash
cargo build
```

実行

```bash
cargo run t1857 5128900
```
4連休でRPAの勉強をしよう! RPAの最新情報が学べるサイトを紹介！

こんにちは！
Peaceful morning社でインターンをしている高橋です！

今回は、たくさんの人にRPAについて知ってもらいたい、さらに詳しくなってもらいたいという思いから今回は**RPA専門メディアサイト4つ**を紹介していきたいと思います。

###1. RPA BANK
https://rpa-bank.com/
RPA BANKはRPAのツール・ベンダーを探したりRPA BANKに会員登録することでRPAの最新情報を入手できたりセミナーの一部分の動画を視聴することが出来ます。

###2. RPATIMES
https://rpatimes.jp/
RPATIMESは基礎から応用までのRPA情報を取り扱っていて「面白く伝える」をテーマにしているメディアです。

###3. RPA総研
https://rpasouken.com/
RPA総研は導入事例やイベント・セミナーを中心に紹介しています。イベントやセミナーに参加したいよという方にお勧めです。

###4. RPA HACK
https://rpahack.com/
自社のサイトを紹介するか迷いましたが紹介させていただかせていただきます。RPA HACKは最新かつ旬な情報を提供してます。またUiPathの使い方、Power Automateの使い方も実際の画面を使いながら紹介しています。RPAについて知りたい方は是非読んで頂きたいです。


RPAの関連サイトを4つ紹介させていただきましたが参考になっていただければ嬉しいです。RPAについて質問等ございましたら連絡してもらえると幸いです。
Rust: Redis のデータを読む (Read)

フォルダー構造

```text
$ tree -L 2
.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target
    └── debug
```

```text:Cargo.toml
[package]
name = "redis_read"
version = "0.1.0"
edition = "2018"

#

[dependencies.redis]
version = "*"

[dependencies]
tokio = { version = "0.2", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
```

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	redis_read/src/main.rs

					Jul/22/2020
*/
// --------------------------------------------------------------------
extern crate redis;
use redis::{Commands};

fn main() -> Result<(), Box<dyn std::error::Error>>  {
	eprintln! ("*** 開始 ***");

	let client = redis::Client::open("redis://localhost/").expect("url error");
	let mut conn = client.get_connection().expect("connect error");

	let mut keys : Vec<String> = conn.keys("t*")?;

	println!("{}",keys.len());

	keys.sort();

	for it in &keys{
		let res = conn.get(it.to_string());

		let answer: String = res.unwrap();

		let json: serde_json::Value = serde_json::from_str(&answer)?;

		let obj = json.as_object().unwrap();

		let str_out = it.to_string() + "\t"
			+ &obj["name"].to_string() + "\t"
			+ &obj["population"].to_string() + "\t"
			+ &obj["date_mod"].to_string();

		println!("{}",str_out);
		}


	eprintln! ("*** 終了 ***");

	Ok(())
}

// --------------------------------------------------------------------
```

コンパイル

```bash
cargo build
```

実行

```bash
cargo run
```
Rust: Redis のデータを作成 (Create)

フォルダー構造

```text
$ tree -L 2
.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target
    └── debug
```

```text:Cargo.toml
[package]
name = "redis_create"
version = "0.1.0"
edition = "2018"

#

[dependencies.redis]
version = "*"

[dependencies]
tokio = { version = "0.2", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
chrono = "0.4"
```

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	redis_create/src/main.rs

					Jul/22/2020
*/
// --------------------------------------------------------------------
extern crate redis;
use redis::{Commands};
use serde_json::json;
use std::collections::HashMap;

// --------------------------------------------------------------------
fn unit_prepare_proc (name:&'static str,population: i32,date_mod:&'static str) -> String {
	let obj_new = json!({
		"name": name,
		"population": population,
		"date_mod": date_mod
		});

	let json_str = obj_new.to_string();

	return json_str.to_string();
}

// --------------------------------------------------------------------
fn main() -> Result<(), Box<dyn std::error::Error>>  {
	eprintln! ("*** 開始 ***");


	let client = redis::Client::open("redis://localhost/").expect("url error");
	let mut conn = client.get_connection().expect("connect error");

	let mut dict_aa:HashMap<String,String> = HashMap::new();

	let mut json_str = unit_prepare_proc ("福井",53921,"1956-6-9");
	dict_aa.insert("t1851".to_string(),json_str);

	json_str = unit_prepare_proc ("敦賀",82154,"1956-3-4");
	dict_aa.insert("t1852".to_string(),json_str);

	json_str = unit_prepare_proc ("小浜",82157,"1956-10-17");
	dict_aa.insert("t1853".to_string(),json_str);

	json_str = unit_prepare_proc ("大野",13594,"1956-2-21");
	dict_aa.insert("t1854".to_string(),json_str);

	json_str = unit_prepare_proc ("勝山",52836,"1956-12-7");
	dict_aa.insert("t1855".to_string(),json_str);

	json_str = unit_prepare_proc ("鯖江",89132,"1956-10-17");
	dict_aa.insert("t1856".to_string(),json_str);

	json_str = unit_prepare_proc ("あわら",35126,"1956-8-25");
	dict_aa.insert("t1857".to_string(),json_str);

	json_str = unit_prepare_proc ("越前",56923,"1956-4-8");
	dict_aa.insert("t1858".to_string(),json_str);

	json_str = unit_prepare_proc ("坂井",18274,"1956-7-10");
	dict_aa.insert("t1859".to_string(),json_str);

	for (key,value) in &dict_aa {
		let _: ()  = conn.set(key.to_string(), value).unwrap();
		}

	eprintln! ("*** 終了 ***");

	Ok(())
}

// --------------------------------------------------------------------
```

コンパイル

```bash
cargo build
```

実行

```bash
cargo run
```
RiderにUnity Log Windowが出なくなった

## 概要
Riderのこのウィンドウです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350704/2b6fc108-21a1-e870-e02a-f82dcbf37415.png)

Unityのコンソールと連動して表示してくれます
Unityみればいいじゃん、と思っていたのですが　いなくなって大切さに気付きました…😥

## でなくなった原因

別バージョンのRiderをいれたりしたのが原因だと思っています

## 修復方法

Unity上、Preferences > External Toolsで設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350704/fa9891d2-bc6f-0941-56b6-b86181a80f3f.png)

Preferences > Riderを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350704/64d92e7a-8a6d-8ed8-a765-ae3caa85cab5.png)

以上です
Turtlebot3(ROS1)をAR Markerでナビゲーションしてみた2

## 続き
[前回](https://qiita.com/kazuharayama/items/c025d51289894a2787e4)からマニピュレーターを動かす部分について解説します。
* 下記をしたらサブディレクトリにmoveit_configパッケージが含まれています。

```
$ git clone https://github.com/ROBOTIS-GIT/turtlebot3_manipulation.git
```

## Manipulatorを動かす
[Moveit Python Tutorial](http://docs.ros.org/kinetic/api/moveit_tutorials/html/doc/move_group_python_interface/move_group_python_interface_tutorial.html)の**Planning to a Joint Goal**を参考にします。

#### スクリプト書く

* manipulator_controllerパッケージを作成する

```
$ cd ~/catkin_ws/src
$ catkin_create_pkg manipulator_controller std_msgs rospy
```

* パッケージの中に移動してscriptsってフォルダ作る

```
$ makdir scripts
```

* manipulation_controller.pyの実行スクリプト作成

```
$ touch manipulation_controller.py
```


#### manipulation_controller.py作成して、やってること

* group_nameからmove group objectを取得する

```python

group_name = "panda_arm"
group = moveit_commander.MoveGroupCommander(group_name)
```

* Jointの現在のポジションを取得

```python

# We can get the joint values from the group and adjust some of the values:
joint_goal = group.get_current_joint_values()
```

* こんな感じでとれます

```
[-0.002, -1.011, 0.311, 0.699] 
```
4つのJointのマニプレーターなので。4つ取れる。

* Homeポジション: [-0.002, -1.011, 0.311, 0.699] 

```python

joint_goal[0] = -0.002
joint_goal[1] = -1.011
joint_goal[2] = 0.311
joint_goal[3] = 0.699
```

* 指定のポジションへの実行、終了を伝える

```python

self.group.go(joint_goal, wait=True)

group.stop()
```

#### 実行

* そのまえにビルドしておく

```
$ cd ~/catkin_ws/
$ catkin build
```

* 実行

```
rosrun manipulator_controller manipulation_controller.py
```

## DEMO結果

* DEMOの様子がYoutubeに公開されるはずです。。。ARMarkerを使用して巡回しながら、マニュピレーターでメータをチェックすることができました。

![Screenshot from 2020-07-21 11-24-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24466/d09b99be-0b2c-3ae1-b6c2-515a6464efbf.png)



## 終わりに
* ROSの基礎知識は基本的に[Robot Ignite Academy](https://www.theconstructsim.com/robotigniteacademy_learnros/ros-courses-library/)からでサブスクリプションもあります。

* トラブルシューティングなど
    * タイヤのモーターが回らなくなる問題が結構発生する
下記の方法で解決しました。マニュアルはしっかり見るべきという。自戒。<br>
[Setup DYNAMIXEL’s for TurtleBot3](https://emanual.robotis.com/docs/en/platform/turtlebot3/faq/#setup-dynamixels-for-turtlebot3)



    * タイヤの大きさを変更したらプログラムも変更しないと行けない話 <br> [Turtlebot3とrealsenseで作るお手軽移動ロボットros japan ug #23 関西勉強会](https://www.slideshare.net/hiroakikaneda/turtlebot3realsenseros-japan-ug-23)参考にしました。<br>
タイヤの値を変更してArduinoIDEでOpenCRにアップロードしないといけません。

# 参考
 [Robotis](http://www.robotis.us/)
#### Webの人がROSを勉強するには

* オンライン
    * [The Construct/Robot Ignite Academy](https://www.robotigniteacademy.com/)でオンライン学習
    * [The Construct Youtube](https://www.youtube.com/channel/UCt6Lag-vv25fTX3e11mVY1Q)
    
    * [project_srs](https://qiita.com/srs)
    * [ROS.org](http://wiki.ros.org/Documentation)
* 書籍
    * [ROS Robot Programming](http://wiki.ros.org/Books/ROS_Robot_Programming_English) : Englishは[free](https://community.robotsource.org/t/download-the-ros-robot-programming-book-for-free/51)
    * [ROS2](https://www.amazon.co.jp/-/ja/%E8%BF%91%E8%97%A4-%E8%B1%8A/dp/4297107422)