OmniAICreator/Qiita-1.07M huggingface dataset:
MySQLのファイル出力とファイルから流し込み

# はじめに
仕事でDBからｃｓｖファイルに出力、ｃｓｖファイルをDBに流し込む機会があったので
手順をメモします。

# MYSQLからファイル出力

```sql

mysql -u root -p user_db --execute="SELECT * from users;" > hoge.csv
```

`mysql -u ユーザー名 -p DB名 --execute="実行SQL" > 出力先ファイル`

mysql、dbに接続しexecute（準備したSQLを実行する）オプションにて出力したいSQL文を記述し、出力したいファイルにリダイレクトします。

MYSQLに接続
`mysql -u root -p user_db`

execute（準備したSQLを実行する）オプションに記載されたSQLを実行
`--execute="SELECT * from users;"`

実行結果を出力したいファイルにリダイレクト
`> hoge.csv`

###リダイレクトとは？？
ここでのリダイレクトの意味は出力先を変えてあげることです。
`> hoge.csv`
この部分は、SQL文の結果をMYSQLの中ではなくhoge.csvに出力することを
指示しています。

通常、webでは特定のページから別のページに転送することリダイレクトといいますが、
コマンドなどを使用する際は入力や出力の向きを変えることもリダイレクトといいます。


# CSVファイルをDBに流し込む
```sql
mysql -u root -p user_db
LOAD DATA LOCAL INFILE "hoge.csv" INTO TABLE users FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
```

CSVファイルのインポートはLOAD DATA INFILE構文を使用します。
mysql、dbに接続し以下のSQLを実行します。

`LOAD DATA LOCAL INFILE "ファイル名" INTO TABLE テーブル名 FIELDS TERMINATED BY '区切り文字' OPTIONALLY ENCLOSED BY '囲み文字';`

区切り文字はCSVファイルなのでカンマです。
囲み文字は""で囲んでいるフィールドがあれば記載します。
無ければOPTIONALLY ENCLOSED BYは記載しなくても大丈夫です。
ColaboratoryでRやSwiftを使う

GitHubにサンプルを置いてみたので、とりあえず試してみたいという方はこちらからどうぞ。

- R: [R Example - Colaboratory](https://colab.research.google.com/github/nozma/colab_kernel_examples/blob/master/R_Example.ipynb)
- Swift: [Swift Example - Colaboratory](https://colab.research.google.com/github/nozma/colab_kernel_examples/blob/master/Swift_Example.ipynb)

動作確認だけならそのまま動かしても良いですし、編集・保存したければコピーして使うこともできます。

以下説明。

[Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)はJupyter notebookを手軽に試せる非常に便利なサービスなんですが、新規作成時のカーネルにはPython3かPython2しか選べません。

ですが、`!jupyter-kernelspec list`を実行して利用可能なカーネルを確認してみると、`ir`（Rのカーネル）と`swift`が利用可能なことが分かります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109348/2a5755ee-84ed-b6bb-19f0-d95d96268455.png)

で、実は、カーネルに`ir`や`swift`を利用した.ipynbファイルをColaboratoryで開けば、これらのカーネルを普通に使えます。.ipynbファイルは実際にはただのテキストで、カーネルの情報も中に書いてあります。つまり、次のようにすれば簡単にRやSwiftをColaboratoryから使用できます。

1. Colaboratoryで新しくノートブックを作成する
2. Googleドライブに保存する（.ipynbファイルとして保存されます）
3. 適当なテキストエディタで開く
4. `"kernelspec":{"name":"python3","display_name":"Python 3"}`となっている部分を書き換えて保存（`display_name`は多分なんでも良いです）。
    - Rを使いたい場合: `"kernelspec":{"name":"ir","display_name":"R"}`
    - Swiftを使いたい場合: `"kernelspec":{"name":"swift","display_name":"Swift"}`
5. Colaboratoryで編集した.ipynbファイルを開く

これだけです。

Swiftを動かすとこんな感じで、シンタックスハイライトも効いています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109348/a896ad5c-c61c-e0f7-200c-19211e7baba7.png)

Rを動かすとこんな感じです。最初から`dplyr`などが入っているようです。シンタックスハイライトは無いようです。残念。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109348/388a02c9-b75d-be4c-56a2-e75c3a768bd8.png)


### 参考

- [jupyter notebook - How to use R with Google Colaboratory? - Stack Overflow](https://stackoverflow.com/questions/54595285/how-to-use-r-with-google-colaboratory)
AI EXPO 2019

AI EXPO 2019に行きました。
AI関連技術の、日本産業への最新の応用なのだと思い、備忘録を兼ねてメモを作りました。
自分の興味がある場所に行き、感想を書いたので、バイアスがかかっています。悪しからず。
感想は全て個人的な見解です（そして技術的な部分は正直あやふやです）。間違っていたらご指摘いただけると幸甚です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253276/82b2fb88-d3d9-0f3d-0a4b-94aab0cdc409.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253276/e2366497-6612-a0bf-ff6a-b9c04c87932c.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253276/6d4a2d82-0a6d-9c57-c64e-f44883484b8b.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253276/b5a667ba-91b3-8dfc-670a-d54b79fb2696.png)
エクセルVBAで不可視のunicode文字を除去

# Excel マクロがunicode文字で止まる

### 突如現れた、不可視の謎の文字
ある日、Excel VBAで、シート内の文字列を取得、加工してテキストファイルに出力するマクロが動かなくなった。

デバッグすると、なにやら怪しい文字が混入しているらしく。

イミディエイトウィンドウに出力してみると、見た目は『?』。
Asc関数でも63で、『?』だと言っている。

しかし、Chr(63)では該当セルから検知できず、除去もできず。。

### 正体はこれだった ⇒『ꜗ』
ワークシート関数『unicode』で、文字コードを調べたところ...
⇒ 8203

**『modifier letter dot vertical bar』**という名らしい。
どうしてこんなものが...?
(そのシートに入力していた人はもう異動していて、ご本人に確かめるすべはない...)

ともかくも、**ChrW (8203)** を使って、無事にVBAで検知、除去できた。

# VBAでunicode文字を扱う方法まとめ

- **対象の文字コードを特定する**(ワークシート関数『unicode』等を使う)
- **ChrW関数で扱う**(置換するなり除去するなり)
【React Native】AndroidのTextでlineHeight当ててるのにセンターにならない

## 何が起きたか
- `lineHeight`を当てた
- ios:green_apple:はlineHight内でcenterになる
- Android:robot:はcenterにならない・・・:anguished:

## どうしたか
- `textAlignVertical: 'center'`を当てれば同等のスタイルになる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103475/755fdfa9-fb34-30c6-68a6-38ff4884b029.png)


```jsx
<Text style={{textAlignVertical: 'center', textAlign:'center'}}>Horizontal and Vertical centerd text</Text>

```

[textAlignVertical](https://facebook.github.io/react-native/docs/text-style-props.html#textalignvertical)

## 参考
https://stackoverflow.com/questions/46328669/center-text-inside-text-component-react-native
#jq コマンドと #shell の組み合わせで、 JSON 配列が空かどうかを条件判定する例

# when Json array  is empty

```
$ if [ $(echo '[]' | jq '. | length') -eq 0 ]; then echo empty; else echo non empty; fi
empty
```
# when Json array  is not empty

```
$ if [ $(echo '[1]' | jq '. | length') -eq 0 ]; then echo empty; else echo non empty; fi
non empty
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1147








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
React_学習メモ_20190409

今日も勉強したのでoutput!٩( 'ω' )و 

# 現在勉強しているところ
[React公式チュートリアル](https://ja.reactjs.org/tutorial/tutorial.html#lifting-state-up-again)の`State のリフトアップ、再び`

# 関数コンポーネント

`reader()`メソッドだけを有して自分のstateを持たないクラスは関数にできる。
(受け取った処理を返すだけなので、クラスを継承して状態を持つ必要がない。)


# 凡ミスリスト
- オブジェクト内にプロパティ列挙する場合はセミコロン`;`は使わない！
- 
    class Board extends React.Component {
      constructor(props){
        super(props);
        this.state ={
          squares: Array(9).fill(null),
          xIsNext: true;
        };
      }

6行目がセミコロンになってたので動かなんだ(´・ω・`)




# わからないこと

    class Game extends React.Component {
      constructor(props){
        super(props);
        this.state = {
          history: [{
            squares: Array(9).fill(null),
          }],
          xIsNext: true,
        };
      }

9行目のセミコロンが何故必要なのか？
Scaffolding機能(編集中)

# Scaffolding機能によるアプリケーション開発
**定型的なCRUD機能を持ったアプリの構築する為の機能(Scaffolding→足場という意味)**
**booksテーブルを操作する関連ファイルをまとめて作成**

```ruby
# ターミナルにおいて実行
# bookはモデル名
rails generate scaffold book isbn:string title:string price:integer publish:string published:date dl:boolean
#book以下は、booksテーブルのカラム名と、その型を示す(自分の実装に合わせて)
```
**新規アプリケーションと、DBはまず自分で作成しておく必要がある**
**ただし、マイグレーションファイルだけは自分で実行する必要**
#自動生成される主なファイル
**ルーティング**
**コントローラークラス**
**ビュー(テンプレートファイル)**
**モデルクラス**
**マイグレーションファイル**


```ruby
class BooksController < ApplicationController
  before_action :set_book, only: [:show, :edit, :update, :destroy]

  def index
    @books = Book.all
  end

  def show
  end

  def new
    @book = Book.new
  end

  def edit
  end

  def create
    @book = Book.new(book_params)

    respond_to do |format|
    #formatは、html形式、json形式を指す。
    #rake routesで確認できるURLパターンの、(.:format)部分。省略可能なので、あまり表示されない。
      if @book.save
        format.html { redirect_to @book, notice: 'Book was successfully created.' }
#@bookは、set_bookで生成されたオブジェクト。引数にオブジェクトが渡された時は、「@book.id」を示す。
        format.json { render :show, status: :created, location: @book }
      else
        format.html { render :new }
        format.json { render json: @book.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @book.update(book_params)
        format.html { redirect_to @book, notice: 'Book was successfully updated.' }
        format.json { render :show, status: :ok, location: @book }
      else
        format.html { render :edit }
        format.json { render json: @book.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @book.destroy
    respond_to do |format|
      format.html { redirect_to books_url, notice: 'Book was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    def set_book
      @book = Book.find(params[:id])
    end

    def book_params
      params.require(:book).permit(:isbn, :title, :price, :publish, :published, :dl)
    end
end

```
データサイエンスの書籍体系

初心者がデータサイエンスに関する機械学習を習得するまでの道筋として、書籍リストを作成中。
※書籍の選定は著者の趣味です。
※難易度は著者の一存です。もっと難しい本もあるでしょう。

#統計学
|書籍名|難易度|おすすめ|
|:--------|-----------------:|:---:|
|完全独習　統計学入門|TBD|
|統計学図鑑|★★☆|

#データサイエンス
|書籍名|難易度|おすすめ|
|:--------|-----------------:|:---:|
|データサイエンス「超」入門|★☆☆|〇
|ゼロから始めるデータサイエンス|TBD|
|Pythonデータサイエンスハンドブック|TBD|
|データサイエンティスト養成読本　R活用編|TBD|
|データサイエンティスト養成読本　機械学習入門編|TBD|
|データサイエンティスト養成読本　登竜門編|★★☆|
|データサイエンティスト養成読本　ビジネス活用編|TBD|

#AI全般
|書籍名|難易度|  おすすめ|
|:--------|-----------------:|:---:|
|AI(人工知能)まるわかり|★☆☆|〇
|人工知能は人を超えるか|★☆☆|〇
|誤解だらけの人工知能|★☆☆|〇
|人工知能はどのようにして「名人を超えたか」|★☆☆|
|ディープラーニング革命|★★★|

#プログラミング言語
|書籍名|難易度| おすすめ|
|:--------|-----------------:|:---:|
|みんなのPython|★★☆|〇
|Python機械学習プログラミング|TBD|
|PythonユーザーのためのJupyter[実践]入門|★★☆|〇
|Python機械学習ライブラリScikit-lean活用レシピ＋80|TBD
|Pythonデータ分析/機械学習のための基本コーディング！pandasライブラリ活用入門|TBD|
|Matplotlib & Seaborn実装ハンドブック|TBD|
|独学プログラマー|★★☆|〇

#機械学習
|書籍名|難易度|おすすめ|
|:--------|-----------------:|:---:|
|機械学習＆ディープラーニング超入門|★☆☆|
|機械学習エンジニアになりたい人のための本|★☆☆|〇
|Interface 2018年5月号|★★☆|〇
|ニューラルネットワーク自作入門|★★☆|
|詳解ディープラーニング|★★☆|
|仕事で始める機械学習|TBD|
|ゼロから作るDeepLearning|★★☆|〇
|Pythonで始める機械学習|★★★|〇
|Scikit-learnとTensorFlowによる実践機械学習|★★★|〇
|初めてのパターン認識|TBD|

#ベイズ統計・ベイズ推論
|書籍名|難易度|  おすすめ|
|:--------|-----------------:|:---:|
|図解・ベイズ統計「超」入門|★☆☆|
|楽しいベイズモデリング|TBD|
|ビジネスマンがはじめて学ぶベイズ統計学|TBD|
|ビジネスマンが一歩先をめざすベイズ統計学|TBD|
|ベイズモデリングの世界|TBD|
|ベイズ推論による機械学習入門|TBD|
|Pythonによるベイズ統計モデリング|★★★|

#アルゴリズム
|書籍名|難易度|  おすすめ|
|:--------|-----------------:|:---:|
|見て試してわかる機械学習アルゴリズムの仕組み|TBD|
|Pythonで体験してわかるアルゴリズムとデータ構造|★★★|
|進化計算アルゴリズム入門|TBD|

#数学
|書籍名|難易度|  おすすめ|
|:--------|-----------------:|:---:|
|優しく学ぶ機械学習を理解するための数学のきほん|TBD|
|人工知能プログラミングのための数学がわかる本|★★☆|〇
|線形代数キャンパス・ゼミ|TBD|

#検定試験
|書籍名|難易度| おすすめ|
|:--------|-----------------:|:---:|
|統計検定１級・準１級公式問題集|TBD|
|統計検定２級公式問題集|TBD|
|統計検定３級・４級公式問題集|TBD|
|ディープラーニングG検定ジェネラリスト問題集|TBD|
Kotlinでデータクラスを継承したいができないので他のやり方

# data classとは

KotlinにはJavaと違い、data classというものが存在する。
通常のクラスと違い、getter/setterが自動で生成されるようなイメージのもの
以下のように定義する。

```
data class Person(
  val name: String,
  val age: Int,
  var address: String
)
```
利用するときは以下のようなイメージ

```
class main(){
  val myPerson = Person("hogehoge", 20, "東京都fugafuga") //  Person(name = "hogehoge", age = 20, address = "東京都fugafuga")という書き方も可
  val tmpName = myPerson.name 
  myPerson.address = "神奈川県piyopiyo"
}

```
尚上の例の場合は、name,ageはvalで定義しているため値の代入ができない。（Setterもない）
addressはvarで定義しているためSetterがあり、値の代入が可能。

# data classの制限

Kotlinのdata classは他のクラスを継承することができない仕様になっている。
そのため、data classを継承して項目を追加するようなことができない。

# 解決方法（？）

data classは継承ができないため以下のような方法で解決する。

```
interface Person{
  val name: String
  val age: Int
  var address: String
}
```
```
data class ExtendPerson(
  override val name: String,
  override val age: Int,
  override var address: String = "",
  var tel: String? = null
):Person
```

若干不格好だけど、こんな感じで継承してプロパティの追加が可能。
（備忘録）Ubuntu 18.04 LTS で Jupyter Notebook 環境構築

# 1. はじめに
[Python + openCV を用いたハンズオン](https://to-kei.connpass.com/event/125557/)への参加条件を満たすために、Ubuntu18.04LTSにJupyter Notebook 環境を構築した際のメモを、自分への備忘録としてまとめてみました。ご参考になれば幸いです。

# 2. 学べる内容

- Python2系のインストール
- Python3系のインストール
- Jupyter Notebookのインストール
- chainerとTendsorFlowのインストール
- opencvとnumpyのインストール
- Jupyter Notebookの起動

# 3. インストール

```shell:Ubuntuプロンプト
# Python2系のインストール
$ sudo apt install python-pip python-pandas python-sklearn

# Python3系のインストール
$ sudo apt install python3-pip python3-pandas python3-sklearn

# Jupyter Notebookのインストール
$ sudo apt install jupyter-notebook

# chainerとTendsorFlowのインストール（Python2系）
$ sudo pip install chainer tensorflow pandas-ml

# chainerとTendsorFlowのインストール（Python3系）
$ sudo pip3 install chainer tensorflow pandas-ml

# opencvとnumpyのインストール（Python2系）
$ pip install opencv-python

# opencvとnumpyのインストール（Python3系）
$ pip3 install opencv-python

```

# 4. Jupyter Notebookの起動

```shell:Ubuntuプロンプト
# Jupyter Notebookの起動（自動的にブラウザが立ち上がりJupyter Notebookが起動する）
$ jupyter-notebook

```

![Jupter.PNG](https://qiita-image-store.s3.amazonaws.com/0/240522/a34271c7-9f52-0bb9-ad0b-999f68a49e86.png)

- Jupyter Notebookの起動後は、「New」のドロップダウンリストから「Python3」を選択すれば見慣れた画面が表示されると思います。
- ブラウザのアクセスURLは、[http://localhost:8888/tree](http://localhost:8888/tree) となるようです。

# 5. 動作確認用コード

```python
# ライブラリのインポート
import sys
import pprint

// パス確認
pprint.pprint(sys.path)

# ライブラリのインポート
import cv2                       # OpenCV
import numpy as np               # numpy
import matplotlib.pyplot as plt  # 画像表示ライブラリ

# jupyter notebook 上で画像を確認できるようにする
%matplotlib inline

# cv2バージョン確認
cv2.__version__

# 表示画像の作成
img2 = np.array([[[  0,  0,  0],[  0,  0,255],[  0,255,  0],[255,  0,  0]],
                 [[  0,255,255],[255,  0,255],[255,255,  0],[255,255,255]]])
img2 = img2.astype(np.uint8) # 値を読み込む方法を指定
print(type(img2))

# 画像表示
plt.imshow(img2)
```
![コメント 2019-04-13 005036.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/c92888ce-fe21-b052-650b-5ff4008d708f.jpeg)

# 6. 補足
- Jupyter Notebook の実行環境にはこだわりがなく、とにかく Jupyter Notebook をさわってみたいという方には、[Google Colaboratory](https://colab.research.google.com/?hl=ja) をおすすめします。
- [Google Colaboratory](https://colab.research.google.com/?hl=ja) なら環境構築不要で Jupyter Notebook が使えます。しかもちょこっと設定をするとGPUもつかえますので、Pythonのお勉強環境にもってこいです。

# 7. おわりに
PythonおよびJupyter Notebook学習の参考になれば幸いです。

2019/04/09 TAKAHIRO NISHIZONO
【PHP】数字の文字列に対する総和を計算して文字列にして返す


# 数字の文字列に対する総和を計算して文字列にして返す

んー`return (string)$res;`の型変換が蛇足感

```php
// 数字の文字列に対する総和を計算する
function calculateSum(string $param) : string
{
    $su = (int)$param;
    $res = 0;
    for ($i = 1; $i <= $su; $i++) {
        $res += $i;
    }
    
    if ($su <= 0) {
        return "ERROR";
    }
    
    return (string)$res;
}
```

※0以下はエラーを返す

# ソース
https://3v4l.org/sphFb
地味なpipですみません。(訳:kerasがinstallできないのでなんとかした話)

#前書き
こちら[【iOS11】CoreMLを試してみた【深層学習】](https://ch.nicovideo.jp/akiba-cyberspacecowboys/blomaga/ar1302164)の記事を参考にYoloをiPhoneにインストールしようとしたらエラーが出たので、忘備録として記載しておきます。

#開発環境
機種名 : MacBook Pro
OS : Mojave 10.14.4
プロセッサ名 : Intel Core i5 2.6 GHz
メモリ : 16 GB
グラフィック : Intel Iris 1536MB

iOS 12.2

#本題
## pip3 install keras==1.2.2ができない

普段使いのiTerm2でpipコマンドを叩いたのがこちら。

```zsh
# zsh
% sudo pip3 install keras==1.2.2
zsh: 1.2.2 not found
```

## zshだからだめ？
bashに切り替えて、installしてみる

```zsh
% cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh

% chsh -s /etc/bash

% sudo pip3 install keras==1.2.2
Collecting keras==1.2.2
  Downloading https://files.pythonhosted.org/packages/75/3e/9926ce5c678b7a7978724a2ecf24857d89a415d152b8d3443e6d45c228b2/Keras-1.2.2.tar.gz (175kB)
    100% |████████████████████████████████| 184kB 6.8MB/s 
Collecting theano (from keras==1.2.2)
・・・・
Successfully installed keras-1.2.2 numpy-1.16.2 pyyaml-5.1 scipy-1.2.1 theano-1.0.4
```

#感想
bashに切り替えたらうまくいった。
shellが原因というより、おそらく.zshrcとかに設定しているaliasが悪いのかもしれない。

時間があれば、深く調べてみます。

#関連URL
[コピーメカ](http://www.copymecha.com/index.php)
MacのPCにJDKを入れたい

こんばんは。
windowsでは何も考えずインストールしてましたがMACだとどうなんだ？？っと
きになったので実践します。
そもそもJavaがすでに何かの拍子でいれてないか確認ターミナルを開きます。
⌘＋spaceのSpotlight検索で"ターミナル"と検索するか、
Launchpadのユーティリティからも開けます。
開くと真っ黒な文字だけのCUI画面が出ます。出ればあってます。
こんなのです<img width="653" alt="スクリーンショット 2019-04-09 21.51.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/395371/58bfac1e-59b6-21b3-d14a-0bb3238cf4d1.png">
ここにJava □ -version
※□は半角space
と入力すると、入っていればバージョンが、入ってなければエラーが、、、、
如何せんmacに慣れてないせいか画像一つ作るのに四苦八苦なので今回はこの辺で。。。。
Android のプロジェクトがビルドできなかったメモ (Android Studio 3.3.2 の実験的機能と Gradle 4.7 と Oracle JDK 12 の相性)

# Android Studio 3.3.2 で Gradle Sync できない

```
ERROR: Unsupported method: AndroidProject.getVariantNames().
The version of Gradle you connect to does not support that method.
To resolve the problem you can change/upgrade the target version of Gradle you connect to.
Alternatively, you can ignore this exception and read other information from the model.
```

Android Studio でビルドできないのは Android Studio の experimental feature が原因ぽい。 Preferences > Experimental > Only sync active variant をオフにしたらエラーが出てたところは回避できた。

参考 : https://stackoverflow.com/questions/53498161/unsupported-method-androidproject-getvariantnames

# Oracle JDK 12 環境でコマンドラインビルドできない

```
Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details

FAILURE: Build failed with an exception.

* What went wrong:
Could not create service of type ScriptPluginFactory using BuildScopeServices.createScriptPluginFactory().
> Could not create service of type PluginResolutionStrategyInternal using BuildScopeServices.createPluginResolutionStrategy().

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 33s
```

`--stacktrace` オプションをつけてログを見た感じ、Gradle 4.7 が Oracle JDK 12 に対応しておらずビルドに失敗するっぽい。 Gradle 5.1 にしてみたら通った。
見出しを表示する。uGUI。文字の長さに合わせて背景のサイズ変更したい。


こういうの。

<img width="205" alt="スクリーンショット 2019-04-10 10.22.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/365269/56abb93c-8007-121d-b54a-23d97bce7ef1.png">
![0409.gif](https://qiita-image-store.s3.amazonaws.com/0/365269/47167647-57c1-45fd-87bd-a2f82c3849aa.gif)



最初思いついたのは、
1.  Image を Text の子に設定する。
2.  Text に、Content Size Fitter  を追加する。
3.  すると、Imageがテキストより前に描画されて、テキストが見えない・・・。

ダメだったので
他の方法を探しました。

### 1. Text を Image の子に設定する。

<img width="252" alt="スクリーンショット 2019-04-09 21.23.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/365269/d674b97a-9e0d-83f4-fd71-2efc01204d20.png">

### 2. Image に、Horizontal Layout Group を追加する。

##### 「Child Controls Size」　 の、　「Width」　をオンにする。　他はオフ。

<img width="514" alt="スクリーンショット 2019-04-09 21.28.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/365269/c80b7a78-d22e-3001-7642-02fa0fcff537.png">


### 3. Image に、Content Size Fitter  を追加する。

##### 「Horizontal Fit」　を　「Preferred Size」　にする。

<img width="517" alt="スクリーンショット 2019-04-09 21.28.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/365269/60061fb0-9fb5-8b27-0a47-5b043a5be718.png">


設定は以上です。
あとは、

#### テキストを中央揃えにして

<img width="508" alt="スクリーンショット 2019-04-09 21.29.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/365269/4f483a84-653c-275c-fe71-17a6fb7198c9.png">


#### padding とか設定すると良いと思います。

<img width="511" alt="スクリーンショット 2019-04-09 21.38.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/365269/cb849bdc-7e11-ce0c-f8e3-7a08faec5af2.png">




### 参考

[Unity - Manual: Making UI elements fit the size of their content](https://docs.unity3d.com/Manual/HOWTO-UIFitContentSize.html)
[UI 要素をコンテンツサイズに合わせる - Unity マニュアル](https://docs.unity3d.com/ja/current/Manual/HOWTO-UIFitContentSize.html)
[Best way to make a background panel for a Text that has a ContentSizeFitter - Unity Forum](https://forum.unity.com/threads/best-way-to-make-a-background-panel-for-a-text-that-has-a-contentsizefitter.286487/)
[Scaling background with text: Detecting horizontal overflow? - Unity Forum](https://forum.unity.com/threads/scaling-background-with-text-detecting-horizontal-overflow.264936/)
Windows Server 2016 Install

# 環境
vmware　ESXiゲスト
OSは試用版

# 画面
1.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/70c2d220-c90b-b34d-6819-715d182e2b34.png)
2.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/a6419ad0-ef0c-d365-c501-ad79ec9f7de7.png)
3.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/94a6b599-3258-acdd-98f3-e4af61233c97.png)
4.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/7797e3bf-6304-d105-6a59-8c63b243be04.png)
5.デスクトップエクスペリエンスを選ばないとGUIが使えない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/7ec81206-14a6-67fb-e59d-a8959487feac.png)
6.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/2dbc648d-b076-5cbd-296c-9d860ff38dca.png)
7.カスタムを選ぶ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/20497726-6a5b-ea81-8c53-3080c709337a.png)
8.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/5717de08-6050-90b9-153e-3f824eac9095.png)

9.終わるのを待つ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/2fbc1fb2-b17a-8dde-be82-fe23987b4ddf.png)


10.administratorのパスワードを入れて完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/a78fe324-267e-8761-7682-2446a195a72a.png)

簡単すぎるとエラーになる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/b61ea0fc-3982-9c09-d8d5-b61fe206fa66.png)


11.おわり
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/8699f6b2-31f4-748a-acef-d1a4601c2657.png)
Windows Server 2012R2 Install

# 環境
vmware　ESXiゲスト
OSは試用版

# 画面
1.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/7430386a-9c02-1b7b-351e-06cbd25d0669.png)

2.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/77fb1ea2-b3fb-c48a-247f-61c379831e80.png)

3.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/cd35d66c-23bc-3cd1-5821-9172138ab798.png)

4.GUI使用サーバーを選ぶことでGUIが使える
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/c7fec9cb-aa31-a746-cf60-40a338bb6e19.png)

5.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/bc294d67-8bdc-c9fd-49b2-71869e4e4006.png)

6.カスタムを選ぶ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/a237c3a4-27f4-fc06-51a2-7af038b1b5f2.png)


7.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/668582a3-6d2a-d99d-9a3b-447cf04423f9.png)


8.終わるのをまつ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/7dd2b9be-91f4-74ce-f6bb-cd17b4848e8f.png)



9.administratorのパスワードを入れて完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/b192a4e5-b052-4dfb-c95c-48c58608f0ad.png)

簡単すぎるとエラーになる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/9434bd6d-2190-421a-59ee-49e0d758a8cc.png)

10.おわり
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315938/ed72c864-7ac6-64ce-ec07-84ecb026185b.png)
ABC - 101- A&B&C

#AtCoder ABC 101 A&B&C
[AtCoder - 101](https://atcoder.jp/contests/abc101)

#A問題

 - 文字列読み込んで1文字ずつ $\pm$ を判定する

```java
	private void solveA() {
		Scanner scanner = null;
		String[] stringS = new String[4];

		try {
			scanner = new Scanner(System.in);
			stringS = scanner.next().split("");

			int res = 0;
			for (int i = 0; i < stringS.length; i++) {
				if (stringS[i].equals("+")) {
					res++;
				} else if (stringS[i].equals("-")) {
					res--;
				}
			}

			System.out.println(res);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

 - 数値を分解して桁を足して割る

```java
	private void solveB() {
		Scanner scanner = null;
		int numN = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();

			int wkN = 0;
			int tmp = numN;
			while (tmp != 0) {
				wkN += tmp % 10;
				tmp /= 10;
			}

			System.out.println(numN % wkN == 0 ? "Yes" : "No");

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#C問題：問題文通りに実装

 - 1回目は3種類の数値を一斉に変えられるけど、2回目以降は変えるための数値をKの中に含めないといけないので、K-1かまでしか変更できない

```java
	private void solveC() {
		Scanner scanner = null;
		int numN = 0;
		int numK = 0;
		int[] wk;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();
			numK = scanner.nextInt();
			wk = new int[numN];

			for (int i = 0; i < wk.length; i++) {
				wk[i] = scanner.nextInt();
			}

			Arrays.sort(wk);

			int res = 0;
			int wkN = numN;
			while (wkN > 0) {
				if (res == 0) {
					wkN = wkN - numK;
					res++;
				} else {
					wkN = wkN - (numK - 1);
					res++;
				}
			}
			System.out.println(res);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#C問題：計算量削減

 - 数列NはKよりも大きい
    - 数列NがKで割り切れるのであれば、操作回数は $1+(N-K)/(K-1)$
    - 割り切れないのであれば、操作回数は $1+(N-K)/(K-1)+1$
 - 最初の1は、(N-K)をする回数

```java
	private void solveC2() {
		Scanner scanner = null;
		int numN = 0;
		int numK = 0;
		int[] wk;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();
			numK = scanner.nextInt();
			wk = new int[numN];

			int wkN = numN - numK;
			int wkK = numK - 1;
			int res = 1 + (wkN % wkK == 0 ? (wkN / wkK) : (wkN / wkK) + 1);
			System.out.println(res);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```
パターソン&ヘネシー本を読んでいく（２）

パターソン&ヘネシー本を読んでいきます。

以下から購入できます。この記事を読んだ人はぜひ買ってください（ステマ）

https://www.amazon.co.jp/dp/B00UJ42A0K/

##1.2 コンピュータ・アーキテクチャにおける８つの主要なアイディア

#Mooreの法則の設計
せっかく設計を開始しても、それが生産される頃にはトランジスタの集積度は向上している。なので、Mooreの法則に従って、生産される時点においてのトランジスタの集積度を予測した上で設計を行う必要がある。

#設計を単純化するための、抽象化
トランジスタの数はMooreの法則によりどんどん増えていく。層別して設計を行い、上位レベルにおいては下位レベルの詳細を隠蔽することにより、モデルが単純化される

#一般的な場合を高速化する
よく実行されるコードをあんまり実行されないコードより高速化する

#並列処理による性能向上
並列して開発を進めることにより性能を高める

#パイプライン処理による性能向上
バケツリレーのごとく、並列処理により処理を高速化する

#予測による性能向上
投機的実行という、予測に基づいて作業を開始するもの。

#記憶階層
最高速で、ビット当たりのコストが最も高価な最小容量のメモリを記憶階層の最上部に位置し、最低速でビット当たりのコストが最も安価な大量のメモリを記憶階層の最下部に配置。

#冗長化による信頼性設計
冗長なコンポーネントを含めることにより、システムの「信頼性」を高める

##1.3 プログラムの裏側

*  コンピュータ内のハードウェアは、非常に単純な低水準の命令を実行できるだけ
*  高水準の処理を単純なコンピュータ命令に順次変換または翻訳する必要がある
*  オペレーティングシステムは、以下の重要な機能を持つ
　　基本的な入出力処理を行う
　　外部記憶およびメモリを割り当てる
　　複数のアプリケーションの間で、コンピュータ資源の共有を図る
*  コンパイラはオペレーティングシステムとは別の機能を果たす

##高水準言語からハードウェアの言語へ
*  コンピュータは二進数である
*  二進数では読むのも書くのも難しいので、アセンブラを考えた
*  ２進数の言語を機械語、機械語と一対一対応するシンボル形式の言語をアセンブラという
*  アセンブラで高度なアプリケーションを作るのは困難であるため、高水準プログラミング言語が開発された

*  ソフトウェア開発について、広く意見の一致が得られている事柄に、処理内容を示すのに必要な行数が少ないプログラミング言語ほど、プログラム開発にかかる時間が少なくて済む。→高水準言語はアセンブリ言語より明らかに優れている

##1.4コンピュータの内部
*  データの入力、出力、処理、記憶のタスクを遂行するコンピュータの５つの構成要素
*  入力装置と出力装置

LCD、CRT、描画、タッチスクリーンについては、僕は関係ないので触れないです。

*  集積回路、プロセッサ、中央演算装置（CPU)
*  プロセッサは大別して２つの要素で構成される。データパス（datapath)と制御（control)である
*  メモリはDRAMチップで構成されている。DRAMはダイナミックRAM(dynamic random access memory)
*  プロセッサ内には、メモリの一種であるキャッシュメモリなどもある。キャッシュはDRAMにとってのバッファの働きをするメモリ。
*  キャッシュはスタティックRAM(SRAM)を使用して作られる。
*  抽象化の一つとして、命令セット・アーキテクチャ(instructive set architecture)がある
*  基本命令セットとオペレーティング・システム・インターフェースの組み合わせをアプリケーション・バイナリ・インターフェースという
*  命令セットアーキテクチャによって、コンピュータの機能をそれを実装しているハードウェアから独立して論じることができる。

次は２３ページ、やっていきます。
ChocolateyでWindows開発環境構築

# 概要
ChocolateyでWindows開発環境を構築します。

# Chocolateyインストール
[Installing Chocolatey](https://chocolatey.org/install#installing-chocolatey)のコマンドを実行。

```shell:コマンドプロンプト(管理者権限)で実行
> @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
```

# 各種ソフトインストール

## Google Chrome
```shell:コマンドプロンプト(管理者権限)で実行
> choco install GoogleChrome -y
```

## Visual Studio Code
```shell:コマンドプロンプト(管理者権限)で実行
> choco install VisualStudioCode -y
```

## Git
```shell:コマンドプロンプト(管理者権限)で実行
> choco install git -y
```

## Node.js
```shell:コマンドプロンプト(管理者権限)で実行
> choco install nodejs -y
```

## 7zip
```shell:コマンドプロンプト(管理者権限)で実行
> choco install 7zip -y
```

## 上記まとめてインストール
```shell:コマンドプロンプト(管理者権限)で実行
> choco install GoogleChrome VisualStudioCode git nodejs 7zip -y
```

# おまけ
```shell:git初期設定
> git config --global user.email "you@example.com"
> git config --global user.name "Your Name"
```

以上
[備忘録]AngularでDrau&Dropやってみた

# AngularでDrau&Dropやってみた

AngularでDrau&Dropやってみたよ

# 手順
material関連モジュールをinstallする([公式サイトより](https://material.angular.io/guide/getting-started))

```
npm install --save @angular/material @angular/cdk @angular/animations
```

`src/app/app.module.ts`にimportする

```
import {DragDropModule} from '@angular/cdk/drag-drop';
```
```
imports: [BrowserModule, DragDropModule],
```

これで使えるようになった


# 結果

[GitHub](https://github.com/MakiMatsu/ngDragDrop)

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.amazonaws.com/0/331389/3312a0a4-c69e-9a4b-8791-55840ad9fde0.gif)
ABC - 100- A&B&C

#AtCoder ABC 100 A&B&C
[AtCoder - 100](https://atcoder.jp/contests/abc100)

#A問題

 - 隣り合うケーキを食べてはいけないという制約上、一人が半分以上ケーキを食べることは出来ない

```java
	private void solveA() {
		Scanner scanner = null;
		int numA = 0;
		int numB = 0;

		try {
			scanner = new Scanner(System.in);
			numA = scanner.nextInt();
			numB = scanner.nextInt();

			if (numA > 16 / 2 || numB > 16 / 2) {
				System.out.println(":(");
				return;
			}

			System.out.println("Yay!");

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題：ずる解法っぽい・・・

 - ポイントは`100で割り切れる`
    - そのため、N=100の時に特殊処理が必要
    - 
    -  $ ・・・98, 99 , 100 , 101 , 102・・・ $ とあった場合
        -  $mod \quad 100$ => $ ・・・98, 99 , 0 , 1 , 2・・・ $ となる
        - 　たとえば、入力値が **「0 100」** だった場合、結果は **「101」** である

 - D=0 : 100でちょうど0回割り切れる=100で割り切れない。
    - 100は割り切れてしまうのに注意
    - そのため、$1,2,3,4,5 - 99, 101,102$が答えを求める際の数列になる

 - D=1 : 100でちょうど1回割り切れる=100の倍数。
    - たとえば、入力値が $1 100$ だった場合
        -  対象の数値は右のように思えるが　$100,200,300,400,500 - 9900, 10000, 10100,10200$ 
        -  実際のところは$10000$は除外となる　$1,2,3,4,5 - 99, 1(100*100で2回割れてしまう), 101,102$

 - D=2 : D=0/1と同様のことが言える


```java
	private void solveB() {
		Scanner scanner = null;
		int numD = 0;
		int numN = 0;

		try {
			scanner = new Scanner(System.in);
			numD = scanner.nextInt();
			numN = scanner.nextInt();
			if (numN == 100) {
				numN++;
			}
			switch (numD) {
			case 0:
				System.out.println(numN);
				break;
			case 1:
				System.out.println(numN * 100);
				break;
			case 2:
				System.out.println(numN * 10000);
				break;
			default:
				break;
			}

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```
#B問題：問題通りにとくとこっちかな？

 - こっちだと100は割り切れる。。。とか考えなくてよい
 - 普通に1-Nまで100で割る回数を数えていく

```java
	private void solveB2() {
		Scanner scanner = null;
		int numD = 0;
		int numN = 0;

		try {
			scanner = new Scanner(System.in);
			numD = scanner.nextInt();
			numN = scanner.nextInt();

			int count = 0;
			int val = 0;

			while (count != numN) {
				val++;
				if (getFunc(val) == numD) {
					count++;
				}
			}
			System.out.println(val);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
	
	private int getFunc(int x) {
		int res = 0;
		while (x % 100 == 0) {
			x = x / 100;
			res++;
		}
		return res;
	}
```

#C問題

 - 偶数の特性と奇数の特性の話
 - 偶数を奇数倍しても2で割れる数が増えるわけではない。。。

```java
	/**
	 * a[i]の操作終了条件は「2で割れなくなったとき」
	 * a[i]を3倍しても「2で割る事の出来る回数は増えない」
	 * そのため、a[i]を2で割れる回数の総計が操作可能回数。
	 */
	private void solveC() {
		Scanner scanner = null;
		int numN = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();
			long[] wk = new long[numN];

			for (int i = 0; i < wk.length; i++) {
				wk[i] = scanner.nextLong();
			}

			System.out.println(dpSolveC(wk));

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}

	private long dpSolveC(long[] wk) {
		int cnt = 0;
		for (int i = 0; i < wk.length; i++) {
			long wkNum = wk[i];
			while (wkNum % 2 == 0) {
				wkNum /= 2;
				cnt++;
			}
		}
		return cnt;

	}
```
【IBM Cloudメモ】IBMクラウドで管理者でないユーザーにチケット作成権を与える

# はじめに
表記の件に関して、問い合わせを受けた手順のメモです。


# 具体的手順
下の図のように、ダッシュボードから「Manage」->「Access(IAM)」を選択します。

![スクリーンショット 2019-04-09 20.49.28.png](https://qiita-image-store.s3.amazonaws.com/0/206130/3707a5ce-01a6-e766-6553-a8f0e5ed795a.png)

下の画面で
(1) メニューから「ユーザー」を選択
(2) 一覧からアクセス権を追加したいユーザーを選択

![スクリーンショット 2019-04-09 20.49.58.png](https://qiita-image-store.s3.amazonaws.com/0/206130/3a8ba79e-89af-3d08-c4a9-e1d552ac3787.png)

ユーザー管理画面で
(1) 「アクセス・ポリシー」タブを選択
(2) 「アクセス権の割り当て」リンクをクリック

![スクリーンショット 2019-04-09 20.50.24.png](https://qiita-image-store.s3.amazonaws.com/0/206130/82649873-c93f-5803-494d-ca4f0ceb45de.png)

「アカウント管理サービスへのアクセス権限の割り当て」を選択します。

![スクリーンショット 2019-04-09 20.50.44.png](https://qiita-image-store.s3.amazonaws.com/0/206130/b5193c53-5dae-2001-e482-c192a78581c8.png)

「サービス」のドロップダウンから「サポートセンター」を選択

![スクリーンショット 2019-04-09 20.51.05.png](https://qiita-image-store.s3.amazonaws.com/0/206130/31c3774c-b03e-3809-0ee2-544f490bfa74.png)

「役割の選択」では「エディター」を選択して決定します。
![スクリーンショット 2019-04-09 20.55.29.png](https://qiita-image-store.s3.amazonaws.com/0/206130/de78099b-075a-986e-68eb-b06acb921f01.png)
muiのサンプルで点灯イベントを取得する

#この記事について
muiを入手したので、その開発情報を自分用にまとめたものです。

[mui Developer Editionで遊んでみる（準備編）](https://qiita.com/kobayuta/items/9a78b923648a2478604d)
[mui Developer Editionで遊んでみる（HOME画面のカスタマイズ）](https://qiita.com/kobayuta/items/76cd0d2483e42ae6e34d)
[mui Developer EditionでSORACOMを使ってみる](https://qiita.com/kobayuta/items/b8b15639be6c866641e1)

# 点灯イベントを取得したい
muiのサンプルアプリケーションは、点灯してしばらくすると自動で消灯します。その状態でタッチすることで表示が復帰します。自分でアプリを作る場合、点灯復帰時に何か処理をしたくなることがあるかと思います。（例えば、センサーの値を最新に更新するとか）
サンプルアプリでは、消灯時のイベントは取れるのですが、タッチしての点灯復帰時のイベントが取れません。
そこで、サンプルを少し改造して点灯復帰時のイベントを取得できるようにしてみます。

# 対応方法
muiのサンプルでは各画面の表示状態を``AbsApp``クラスを継承して作っています。そこで、まずは点灯イベントのメソッドを追加した派生クラスを作成します。

```Python
class MyMUIApp(AbsApp):
    def __init__(self, appEventListener: AppEventListener):
        super().__init__(appEventListener)
        
    def onTurnOnDisplay(self):
        raise NotImplementedError
```
次に、各アプリケーションの定義を``AbsApp``ではなく、ここで定義した``MyMUIApp``を継承するように修正します。

```Python
class DummyWeatherApp(MyMUIApp):
```
```Python
class DummyThermoApp(MyMUIApp):
```
```Python
class HomeApp(MyMUIApp, OnUpdateRequestListener, OnTouchEventListener):
```

修正をしたら各クラスの中で``onTurnOnDisplay()``メソッドを実装します。

次に、実際の呼び出し処理を追加します。点灯復帰処理は``MuiMain``クラスの``onInputEvent()``で処理が行われています。ここで、点灯復帰する際に先に定義したメソッドを呼び出すようにします。

```Python
    def onInputEvent(self, e: MotionEvent):
        if self.display_manager.on is False:
            self.app.onTurnOnDisplay()
            self.display_manager.on = True
            self.updateUI(fade=3, turn_on=True)

        # dispath touch event to current application
        self.app.dispatchTouchEvent(e)

        # pass to gesture detector
        self.gesture_detector.onTouchEvent(e)

        # reset display turn off timer
        self.display_manager.startDismissTimer()
```

これらの修正で点灯復帰時に処理を行うことが出来るようになりました。
SQL Server で性能不足で新しくインデックスを作ることを検討する

# SQL Server で性能不足で新しくインデックスを作ることを検討する

備忘録として.

まずは現状の実行プランを確認する.
SQL Server Management Studio (SSMS) で「実際の実行プランを含める」をオンにして、対象のクエリを実行する.
そうすると実行プランと不足しているインデックスがサジェストされる.

サジェストを参考にインデックスを作成.

```sql
CREATE INDEX IDX_COL1 ON TBL1(COL1)
```

インデックスが出来たら性能変化の確認.

```sql
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
```

でキャッシュを飛ばし、WITH 句で元のクエリで使われていたインデックスを指定して、クエリを実行.

```sql
SELECT ... FROM TBL1 WITH (INDEX(PK_...)) WHERE ...
```

再度キャッシュを飛ばし、WITH 句で新しく作ったインデックスを指定して、クエリを実行.

```sql
SELECT ... FROM TBL1 WITH (INDEX(IDX_COL1)) WHERE ...
```

それぞれの実行時間と読み取り行数を比較して、性能が向上したかを確認.

メールにコピペするために実行計画をテキストで欲しい場合は以下.

```sql
SET SHOWPLAN_TEXT ON
GO

SELECT ... FROM TBL1 WHERE ...
GO

SET SHOWPLAN_TEXT OFF
GO
```
最近発売されたHerobook@CHUWIのBIOS画面の立ち上げ方に関するメモ

非常に簡潔なメモでしかないです


BIOS画面の立ち上げキーはESCキーになっておりこれを連打する必要があります。
UEFIベースの結構カッコイイ画面なのでいい感じ。。
EC2上にFTPサーバを立てるときの備忘録

# EC2上にFTPサーバを立てる
vsftpdを使うのが一般的な様子。
https://security.appspot.com/vsftpd.html

## rootになる
```bash
sudo su
```

## FTP用ユーザ設定

### FTP用ユーザ作成(ホームディレクトリ付き)
```bash
useradd USER_FOR_FTP -m
```

### パスワード設定
```bash
passwd USER_FOR_FTP
```

## vsftpd設定

### vsftpdインストール
```bash
yum install vsftpd -y
```

### 設定ファイル(vsftpd.conf)のバックアップを残しておく
```bash
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org
```

### 設定ファイル(vsftpd.conf)を編集する
```bash
vi /etc/vsftpd/vsftpd.conf
```

```bash
# 匿名ユーザのログインを許可しない
anonymous_enable=NO

# メッセージファイルの内容を表示しない
dirmessage_enable=NO

# サーバー側ポートを20番に固定しない
connect_from_port_20=NO

# vsftpd 形式とする
xferlog_std_format=NO

# ASCII モードアップロード許可
ascii_upload_enable=YES

# ASCII モードダウンロード許可
ascii_download_enable=YES

# vsftpd をスタンドアロンで起動
listen=YES
#listen=NO

# vsftpd をスタンドアロンで起動(ipv6)
listen_ipv6=NO
#listen_ipv6=YES

# EC2のセキュリティグループで設定するため ホストアクセスファイルをアクセス制御に利用しない
tcp_wrappers=NO

# パッシブモード接続許可
pasv_enable=YES

# パッシブモード接続先IPアドレスをホスト名から取得
pasv_addr_resolve=YES

# 固定IP
pasv_address=[固定IP]

# ポート番号範囲制限
pasv_min_port=60001
pasv_max_port=60010

# ファイル/ディレクトリ タイムスタンプ表示をローカルタイムで行う
use_localtime=YES

# ドットファイルを含めない
force_dot_files=NO

# ユーザルートディレクトリにログインさせ 上に行かせない
chroot_local_user=YES

# chrootエラー対策
allow_writeable_chroot=YES
```
【C言語】GCC拡張によるNested Function(関数内関数)

#はじめに

以下のGCCマニュアルに書かれていることを~~暇つぶしに~~書き連ねただけです
https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html#Nested-Functions
詳しく知りたい方はそちらを読んでいただいた方が早いかもしれません

# 概要
C言語では関数内で関数の定義をすることは出来ません

```c
#include <stdio.h>
void func(){
    void test(){    //エラー
       puts("hoge");
    }
    test();    //エラー
}
```

しかし、GCC拡張を使うと上記のような記述が可能になります

※この機能はC言語でのみ利用可能です、C++では使用できません
大人しくclassやstd::functionやlambdaを使いましょう

# ルール

## スコープ
基本的なスコープのルールと殆ど同じです

```c
int sp = 10;		//グローバル変数
static int sp2 = 20;	//static変数
extern int sp3;		//extern宣言

int sum(int v1,int v2){return v1 + v2;}

void func(int value){
    int value2 = 0;

    void test(){
        int ex = 10;
        value = sum(value,value2);  //OK:value,value2,sumはスコープ範囲内
        value2 += sp + sp2 + sp3;   //OK:sp,sp2,sp3はスコープ範囲内
        value2 += ex;
    }
    test();
    value2 += ex;		    //エラー:exはスコープ範囲外
}

int sp3 = 30;

void hoge(){
	func(100);
}
```

また、宣言された関数を外で使用する事はできません

```c
void func(){
    void hoge(){puts("(´・ω・｀)");}
}
int main(){
    hoge();    //エラー:hogeはスコープ範囲外
}
```

## 関数ポインタ
ネストされた関数からは関数ポインタを得ることが出来ます

```c
void (*func(void)){
    void test(){puts("（´・ω...:.;::..");}
    return test;
}
void hoge(){
    void(*f)() = func();
    f();
}
```

以下のようにスコープ外の変数を参照する関数ポインタも取得できますが、
生存期間が終了する変数を参照する関数の呼び出しは危険です(曰く「all hell breaks loose」)

```c
int (*func())(){
    int value = 100;
    int value2 = 39;
    int test(){return value + value2;}
    return test;
}
void hoge(){
    int (*f)() = func();
    int result = f();
    printf("%d\n",result);    //可能だけど危険
}
```

ただし、スコープ外ではあるものの、生存期間が継続している変数を参照する物に関しては大丈夫(だろう)との事

```func.c
static int value = 100;
static int value2 = 39;

int (*func())(){
	int test(){return value + value2;}
	return test;
}
```

```call.c
int (*func())();

void hoge(){
	int (*test)() = func();
	printf("%d\n",test());	//大丈夫なはず
}
```

## リンケージ
ネストされた関数はリンケージを持ちません

```c
extern int test();
//static int test();

void func(){
    int test(){puts("( ´･ω・)y━。o ○");}    // リンケージを持たないので、externやstaticで宣言された識別子との結合は行われない
}
void hoge(){
    test();    //エラー testの実体が存在しない
}
```

## 宣言
関数内で関数の前方宣言をする事は出来ません
またリンケージを持たないので、externで代用する事も不可能です(そんな事をする人は居ないかもしれませんが…)

```c
void func(){
	int test(); //単純にエラー
	extern int test();
	test();
	int test(){puts("Hoge");} //エラー リンケージを持たない宣言とexternが同居してる
}
```


関数内でどうしても前方宣言が必要な場合は、autoを使用します

```c
void func(){
    auto int test();
    test();
    int test(){puts("Hage");}
}
```

## goto
ネストされた関数は、GCCの[ローカルラベル](https://gcc.gnu.org/onlinedocs/gcc/Local-Labels.html#Local-Labels)を使用してブロック外のラベルにジャンプできます

```c
void func(){
	__label__ label;
	int test(){goto label;}
	test();
        return;
	label:
	puts("Jump!");
}
```


# 記事内サンプルソースコードの確認環境
OS：Windows10 Pro(64bit)
GCC：7.3.0(MSYS2)
コンパイル時オプション：特になし
Pythonを使ってsortを用いずリスト内の数を並べ替える。

##リスト内の数を並べ替えたい。

Pythonを使ってリスト内の数を並べ替えるのは、sortを使えば簡単です。しかしここではsortを使わない方法も併せて紹介します。

---
#### まずは sortを使って並べ替えてみる。

sortを使えば、簡単にできます。

```python:
#適当に数のリストを作る。
T = [3,8,6,1,2,5,5,10,9,7]
print(T)

#昇べきの順に並べ替える。
T.sort()
print(T)

#降べきの順に並べ替える。
T.sort(reverse=True)
print(T)
```
####sort を使わないで並べ替える。

ではsortを使わないで並べ替えるコードを書いていきます。

```python:昇べきの順

T = [3,8,6,1,2,5,5,10,9,7]

#昇べきの順に並べ替えるときは、まずリスト内のどの数よりも大きい数を後ろに加える。
T.append(100)

i = 0
while i < 10:
    j = 1
    while j < 10-i:
        if T[i] > T[i+j]:
            T[10] = T[i]
            T[i]=T[i+j]
            T[i+j]=T[10]
            T[10]=100
            j = j+1
        else:
            j=j+1
    i = i+1

#加えた数を最後に取り除く。
T.remove(100)
print(T)
```



降べきの順にするときも同じようなコードです。

```python:降べきの順
#降べきの順に並べ替えるときは、まずリスト内のどの数よりも小さい数を後ろに加える。
T.append(-1)

i = 0
while i < 10:
    j = 1
    while j < 10-i:
        if T[i] < T[i+j]:
            T[10] = T[i]
            T[i]=T[i+j]
            T[i+j]=T[10]
            T[10]=100
            j = j+1
        else:
            j=j+1
    i = i+1

#加えた数を最後に取り除く。
T.remove(-1)
print(T)
```
Azure Pipelinesでrust-musl-builderを使う

# はじめに
Rustでスタティックリンクなバイナリ（いわゆるシングルバイナリ）を作るときはlibcとしてmuslを使うことができます。
しかしmuslはlibcでしかないので、それ以外のライブラリ（opensslなど）を使っている場合はそれ用のスタティックリンクライブラリをそれぞれ用意しないといけません。

これは結構面倒なので、よく使いそうなライブラリをまとめてDockerコンテナにしたものが[rust-musl-builder](https://github.com/emk/rust-musl-builder)です。

今回はこれをAzure Pipelinesで使ってみました。

# 最終結果

いろいろ試行錯誤した結果、以下でOKでした。


```azure-pipelines.yml
jobs:
    - job: musl
      pool:
          vmImage: 'ubuntu-16.04'
      steps:
          - script: |
              chmod 777 .
              docker run --rm -v "$(pwd)":/home/rust/src ekidd/rust-musl-builder cargo build --release --target=x86_64-unknown-linux-musl
```

`chmod 777 .`はDockerコンテナ内のUIDとAzureのUIDが異なるので、Docker内から`target`ディレクトリを作成できるようにするためです。
また、Dockerコマンドはrust-musl-builderのREADMEなどでは`-it`オプションがついていますが、これをつけてはいけません。
Azure Pipelinesではscriptは一旦テンポラリのファイルに書かれて`/bin/bash --noprofile --norc xxx.sh`という感じで実行されるため、`-it`オプションがあるとDockerがttyに接続できずエラーとなります。


# コンテナ内ビルド

Azure Pipelinesには以下のようにDockerコンテナ内でビルドする方法もあり、いろいろと試したのですが、これは罠でした。

```azure-pipelines.yml
resources:
    containers:
        - container: musl
            image: ekidd/rust-musl-builder:latest

jobs:
    - job: musl
      pool:
          vmImage: 'ubuntu-16.04'
      container: musl
      steps:
          - script:
              cargo build --release --target=x86_64-unknown-linux-musl
```

まずrust-musl-builderはRustのツールチェインを一般ユーザ`rust`でインストールして実行もそのユーザで行います。
しかしAzure PipelinesのDockerコンテナ実行スクリプトは`vsts_azpcontainer`というようなユーザを新規作成して、その権限で動こうとします。このあたりの挙動はAzure Pipelines組み込みであり、ymlで制御することはできません。
そのためrust-musl-builderのDockerfileをいじって通るようにするしかないのですが、大変な割に大したメリットもないです。
（scriptのコマンドが短いくらい？）
素直にdockerコマンドを使うのがいいと思います。
SORACOM Button のボタンをソレノイドで押してみた。（はじめてのブログ）

上田で行われた[ SORACON UG 信州 #6 JAWS-UG/TwilioJP-UG共催 ](https://soracomug-tokyo.connpass.com/event/118913/) のハンズオンで学んだ事を元にやってみました。

#やってみた事
市販のCPUボードのスイッチが押下されたらソレノイドに通電してSORACOM BUTTANのボタンを押す。

1.使用ボード　[基板付きキット 絵解き マイコンCプログラミング教科書](https://shop.cqpub.co.jp/hanbai/books/45/45271.htm)に付いていたボード
2,ソレノイド　[CBS0830/CBS08300120（12Ω)](http://www.takaha.co.jp/SHOP/cbs0830.html)

を使用して基板上のSW1を押下するとソレノイドが動作してSORACOM BUTTONをダブルクリック。SW2を押下すると長押し。基板上の温度計が30℃以上になるとシングルクリックを行う様にしました。(SORACOM BUTTONは三種類の押し方に対応しています。）

#動作概略
CPUボードのOUTピンを5V駆動のリレーに接続。リレーがONするとDC 18Vで駆動するソレノイドが動作してSORACOM BUTTONのボタンを押下する。

![回路.jpg](https://qiita-image-store.s3.amazonaws.com/0/395286/6e673531-0828-2ce5-a187-5b55dbd4847e.jpeg)

![ソレノイド.jpg](https://qiita-image-store.s3.amazonaws.com/0/395286/00d0ab28-d2e0-7808-51e5-57486467e11b.jpeg)


#基板側プログラム(マイコンプログラム) (抜粋)

```
        if( SW1 == SW_ON )
		{
			LED1 = LED_ON;
			ButtanDoubleClck();
			LED1 = LED_OFF;
		}
		
		if( SW2 == SW_ON )
		{
			LED2 = LED_ON;
			ButtonLongPush();
			LED2 = LED_OFF;
		}
		
		if( !ChkTimer( TEMPRATER_CHK_TIMER ) )
		{
			if( Temperature >= 30.0 )
			{
				LED1 = LED2 = LED_ON;
				ButtanSingleClck();
				LED1 = LED2 = LED_OFF;
				SetTimer(  TEMPRATER_CHK_TIMER , 10*T_1MIN );
			}
		}

```

#AWS Lambda　修正した部分の抜粋
 
```
    if click_type == "LONG" :
        msg = "長押し\nSW2が押されました。\n"
    elif click_type == "DOUBLE" :
        msg = "ダブルクリック\nSW1が押下されました。\n"
    else :
        msg = "シングルクリック\n30℃以上になりました。\n"
```

#送られて来たメール

基板上の温度計が30℃以上になった時に送信して来た物。

![メール.jpg](https://qiita-image-store.s3.amazonaws.com/0/395286/e0620352-53e1-39cb-204a-07e9846007bd.jpeg)

#今後の事

[ SORACON UG 信州 #6 JAWS-UG/TwilioJP-UG共催 ](https://soracomug-tokyo.connpass.com/event/118913/) のハンズオンではSORACOM BUTTONが押されると[ Twillio ](https://twilio.kddi-web.com/)を使って電話が掛かり音声が流れるハンズオンも行いました。このハンズオンのサンプルを修正して電話の音声を　SW1が押されましたとか　とか　３０℃以上になりました　とかの音声が出る様に修正を行いたい。

#問題点

1. ソレノイドを駆動するのにCPUボードとは別な電源がいる。( 今回は6P乾電池直列で18V )
   ソレノイドは電流を食うのでソレノイドは使いたくない。
2. 送信時のエラーが分からない。SORACOM BUTTONは人が使う事を前提で作られているので。送信エラーの時に赤いLEDが点灯する。だが認識用の機材を使わないとエラーの認識が出来ない。

（SORACOM BUTTONを分解してボタンの接触をマイコンで行える様に改造したり。LEDの信号を検知して送信OK NGの判定を判別出来る様にする事も出来るが。技適上（法律上）行って良いものか判断出来なかったので今回は行いませんでした）
3. 今回の回路はイマイチ。改良の余地あり。

#ソラコムサンタ へのお願い

1. 5Vまたは3.5V信号でSORACOM BUTTONの動作を行える様にして頂きたい。
2. 送信成功、失敗が5V または 3.5V の信号で分かる様にして頂きたい。

上記が出来ると安価(100円以下)なマイコンの簡単なプログラムだけでインターネットに情報が送れます。凄く安く簡単にIotが実現します　（激安　Iot )。
マイコンなしでも自分で好きなスイッチを付けてるだけでドアの開け閉め。物が置かれたなど。
物の側にはマイコンやプログラムなしでIotが実現しちゃいます。

2019-04-10　追記
[ソラコムより出ていました。] (https://blog.soracom.jp/blog/2019/04/10/soracom-lte-m-button-for-enterprise-and-plus/)  自分が考える様な物はさすがにありますね。
次はこれを買ってやってみよう。


#最後に

本内容は、[E2F 組込みエンジニアフォーラム 第9回交流会](https://e2f.connpass.com/event/119445/)で発表させて頂きました。

[ SORACON UG 信州 #6 JAWS-UG/TwilioJP-UG共催 ](https://soracomug-tokyo.connpass.com/event/118913/) のハンズオンでご指導して頂いた方々。ありがとうございました。





　　　　　　　　　　　　　　　　　　　　　　　　　　　　以上
Go言語で困ったこと解決法まとめ

#Go言語、始めました
Go言語を勉強し始めて早速躓いたりして日本語での情報が見当たらなかったので書きます。
環境はMacと言いたいところだけどお金がないのでWindowsです。情報のほとんどはMacでした。
##学習サイト
http://gihyo.jp/dev/feature/01/go_4beginners
##export GOPATH=pwdをwindowsで実行する方法
学習サイトの第一章の最後のほうでこちらのコマンドを実行するんですが、linuxコマンドなので使えません。
export = set、pwd = dir に変えたりして試していたんですがうまくいかず公式ドキュメントを見るとユーザー環境変数に直接プロジェクトディレクトリを打ち込めということなので打ち込み実行するとうまくいきました
(めんどくさ...)
あとは
`$ cd $GOPATH/src/main`
を
`$ cd %GOPATH%/src/main`
に変えたりして実行したぐらいです。


##参考サイト
公式
https://github.com/golang/go/wiki/SettingGOPATH#windows
システム戦略 応用情報技術者試験 対策日記@20

##統合化システム
###ERP(Enterprise Resource Planning)
企業全体の経営資源を統合的に管理して経営の効率化を図る。これを実現するパッケージをERPパッケージという。
###SCM(Supply Chain Management)
サプライチェーンに属する企業全体をマネジメントするシステムのこと。
###CRM(Customer Relationship Management)
顧客との関係を構築することで顧客満足度を向上させる経営手法。
###SFM(Sales Force Management)
営業支援のためのシステム。CRMの一環として行うことも多い。
###KMS(Knowledge Management System)
個人の持つ暗黙知を形式知に変換することによって知識の共有を図る。
SECIモデルがあり、共同化、表出化、結合化、内面化の手順で行う。

##EA(エンタープライズアーキテクチャ)
組織全体の業務とシステムを統一的な手法でモデル化し、改善することを目的とした組織の設計・管理手法。
現状を**As-Isモデル**としてまとめ、あるべき姿を**To-Beモデル**とし、ギャップを分析する。そして、より現実的な**次期モデル**を作成し、それを構築する。以下の四つのアーキテクチャモデルからなる。
**ビジネスアーキテクチャ**　組織の目標や業務を体系化したもの。機能構成図や業務流れ図を使う。
**データアーキテクチャ** 組織の目標に必要なデータの構成を体系化したもの。ER図を作成する。
**アプリケーションアーキテクチャ** アプリケーションと業務の関係を体系化したもの。情報システム関連図などを作成する。
**テクノロジアーキテクチャ** ハードウェア・ソフトウェア・ネットワークなどの技術を体系化したアーキテクチャ。

##クラウドサービス
クラウドに対し、自社でサーバを立ててサービスを構築することを**オンプレミス**という。
サービスをネットワーク上で連携させてシステムを構築する手法を**SOA(Service Oriented Architecture)**という。
**SaaS** ソフトウェアをサービスとして提供するもの
**PaaS** OSやミドルウェアなどのプラットフォームを提供するもの
**IaaS** ハードウェアやネットワークなどのインフラを提供するもの

##調達計画
外部委託などで調達を行うとき、まずベンダ企業に情報の提供を依頼するために**RFI(情報提供依頼書)**を作成する。最終的には**RFP(提案依頼書)**を提出する。
**請負契約**では依頼を完成させる責任があるのに対し、**準委任契約**では完成責任は発注者にあり、業務の実施が求められる。

------
[ホームへ](https://qiita.com/k-y/items/dc2c9a3a8425712253e8)
データ可視化・3Dプロット

#3Dplotについてメモ

・データがあっても二次元のデータでない場合や, データのばらつき方を見るためにも3Dプロットが便利.
・使い方を忘れないためにメモしておく.

仮にこんなデータがあったとする. 

```R

bind_X <- NULL
bind_Y <- NULL
bind_Z <- NULL

X <- rnorm(30, 10, 0)
Y <- rnorm(30, 10, 0.1)
Z <- c(rnorm(10, 1, 0),
       rnorm(10, 2, 0),
       rnorm(10, 3, 0))

bind_X <- c(bind_X, X)
bind_Y <- c(bind_Y, Y)
bind_Z <- c(bind_Z, Z)

X <- rnorm(30, 20, 0)
Y <- rnorm(30, 20, 0.1)
Z <- c(rnorm(10, 1, 0),
       rnorm(10, 2, 0),
       rnorm(10, 3, 0))

bind_X <- c(bind_X, X)
bind_Y <- c(bind_Y, Y)
bind_Z <- c(bind_Z, Z)

X <- rnorm(30, 30, 0)
Y <- c(rnorm(20, 30, 0.1),rnorm(10, 35, 1))
Z <- c(rnorm(10, 1, 0),
       rnorm(10, 2, 0),
       rnorm(10, 3, 0))

bind_X <- c(bind_X, X)
bind_Y <- c(bind_Y, Y)
bind_Z <- c(bind_Z, Z)

df=data.frame(X=bind_X,Y=bind_Y,Z=bind_Z)

```

仮にある機械があったとする. 
機械は設定値[X]と出力[Y]がある.
機械はいろいろな環境で使用されるので, どんな環境でも出力値に変化がないか検証したい.
環境は[Z]として3水準を割り振った.

```R
plot(df)
```
![plot.png](https://qiita-image-store.s3.amazonaws.com/0/275572/95ad19f7-f936-93f9-b28c-f25fc3561c9c.png)


[X]と[Y]の関係性は3種類のデータが直線的に比例しているように見える.
[Z]は3種類存在していることがわかり, 合計9個のデータのあつまりがある.

Rのplotに慣れてない人からすると大変理解が難しいし, 直感的にわからないので3Dplotの出番. 

```R
library("scatterplot3d")
scatterplot3d(df, xlab="x",ylab="y",zlab="condition",xlim=c(0,40),ylim=c(0,40),zlim=c(0,4))
legend("topright", legend="scatterplot", bg="white")
```
![scat.png](https://qiita-image-store.s3.amazonaws.com/0/275572/ae5e2b7b-b9af-a5d4-dffc-f55b38b75a14.png)

Xが30, Yが30, Zが3の時に変なデータができていることが分かった.

もう少し直感的に理解するためにはrglというパッケージもある.

```R

library("rgl")

plot3d(x=1, pch="",xlim=c(0,40),ylim=c(0,40), zlim=c(0,4),xlab="x",ylab="y",zlab="condition")
plot3d(bind_X[1:10],bind_Y[1:10], bind_Z[1:10],add=T,col="red")
plot3d(bind_X[10:20],bind_Y[10:20], bind_Z[10:20],add=T,col="blue")
plot3d(bind_X[20:30],bind_Y[20:30], bind_Z[20:30],add=T,col="green")

plot3d(bind_X[30:40],bind_Y[30:40], bind_Z[30:40],add=T,col="red")
plot3d(bind_X[40:50],bind_Y[40:50], bind_Z[40:50],add=T,col="blue")
plot3d(bind_X[50:60],bind_Y[50:60], bind_Z[50:60],add=T,col="green")

plot3d(bind_X[60:70],bind_Y[60:70], bind_Z[60:70],add=T,col="red")
plot3d(bind_X[70:80],bind_Y[70:80], bind_Z[70:80],add=T,col="blue")
plot3d(bind_X[80:90],bind_Y[80:90], bind_Z[80:90],add=T,col="green")

```

パッケージを使うとグリグリ動かせる3Dが出来上がる.

![rgl1.png](https://qiita-image-store.s3.amazonaws.com/0/275572/181427e7-2d04-0659-20ad-0ba17a9e2aac.png)

回転させたり, 

![rgl2.png](https://qiita-image-store.s3.amazonaws.com/0/275572/7fc4df4d-b93a-2624-cd99-13f7a7d40a1f.png)

拡大したりしてデータについて議論できるようになる.

planes3dのような関数も入っていて, 普段lmで求めた回帰式を三次元(面)にして出力することもできる.
per3dでも可.

![menmm.png](https://qiita-image-store.s3.amazonaws.com/0/275572/65024229-208e-78a0-5540-4926d3d22cdb.png)