OmniAICreator/Qiita-1.07M huggingface dataset:
Herokuでデプロイしても画像が表示されなかった場合の対処法

#1 はじめに
RubyonRailsで作成しているアプリでHerokuにデプロイしてもトップページ用の画像が表示されず少し時間を取られたので備忘録として残します。

#2 対処法
####config ファイルを書きかえたら表示されるようになります!
単純でした...

```ruby:config/environments/production.rb
config.assets.compile = false
```

config/environments/production.rbファイルの
config.assets.compile = false　を...

```ruby:config/environments/production.rb
config.assets.compile = true
```

trueに変えるだけですね。

最初原因が分からず何度もpushして確かめていました...


以上、お役に立てれば幸いです。
Vue.js　v-for　レンダリングの並び順を変える（昇順、降順）

#やりたいこと
Vue.js　v-for　レンダリングの並び順を変えたい（昇順、降順）

#実装（昇順）

まずは昇順。
こちらは普通にv-for を実装する。

```
<template>
  <div>
    <div v-for="item in items" :key="item.id">
      <p>名前：{{item.name}}さん</p>
      <p>会員番号：{{item.id}}番</p>
      <p>##########</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
        items:[
          {
            id: 1,
            name: '太郎',
          },
          {
            id: 2,
            name: '次郎',
          },
          {
            id: 3,
            name: '三郎',
          },
        ],
    }
  },
}
</script>
```

実行結果は以下のようになります

```
名前：太郎さん
会員番号：1番
##########
名前：次郎さん
会員番号：2番
##########
名前：三郎さん
会員番号：3番
##########
```
では、降順（順番を逆）にしたい場合はどうするか

#実装（降順）

降順にしたい場合は、***computedで配列の順番を入れ替えて、v-forに渡します。***

```
<template>
  <div>
    <div v-for="item in reverseItems" :key="item.id">
      <p>ニックネーム：{{item.name}}さん</p>
      <p>会員番号：{{item.id}}番</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
        items:[
          {
            id: 1,
            name: '太郎',
          },
          {
            id: 2,
            name: '次郎',
          },
          {
            id: 3,
            name: '三郎',
          },
        ],
    }
  },
  computed: {
    reverseItems() {
      return this.items.slice().reverse();
    },
  }
}
</script>
```

そうすると、実行結果は以下のようになります

```
名前：三郎さん
会員番号：3番
##########
名前：次郎さん
会員番号：2番
##########
名前：太郎さん
会員番号：1番
##########
```

以上です！
文字のバイト数を数える試み～その2 ｜Power Query

以前、ワークシート関数のLENBの再現に挑戦したけれど、まともそうな方法があることに気づいたので、改めて投稿します。
[文字のバイト数を数える試み ｜Power Query](https://qiita.com/tanuki_phoenix/items/b3a936ffc0c9557eadca)

##コード
たったこれだけです。:sweat:
コード中の932はエンコードの`Shift-JIS`を指しているので、これもまた日本語環境を前提にした関数ということになります。

```pq:fx_LENB
(TargetText as text)=>
let
    bin = Text.ToBinary(TargetText,932),
    length = Binary.Length(bin)
in
    length
```

##実験結果
ワークシート関数と結果が一致してますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/e8c30dca-1b75-2adf-07ae-7aa5506dadf5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/254fd24b-aefb-fc4d-1482-d20c87c22771.png)

##参考
[Binary.Length - PowerQuery M - Microsoft Docs](https://docs.microsoft.com/ja-jp/powerquery-m/binary-length)
[Text.ToBinary - PowerQuery M - Microsoft Docs](https://docs.microsoft.com/ja-jp/powerquery-m/text-tobinary)
【シストレ入門】株価予測；月曜日は軟調ですm(__)m

YahooFinance　USから株価も取得できるということで、月曜日の予測をやってみた。
結果を簡単に紹介します。

###日本株（銘柄は適当）は以下のとおり、
銘柄適当に選んでいるのにほとんどすべての銘柄が下げそう？？
![zm_T24.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/a1a20bb3-631b-c01f-d4d0-b330d846c743.gif)
###米国株（銘柄はほぼハイテク）は以下のとおり
予測は上げ予測が多く、下げの予測でも12日金曜日は上げているものがある。
![zm_US6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/e15eb1f1-07e3-a836-ba20-eb7a3adb811a.gif)

###株価個別銘柄取得は以下のコードで取得できました。
以下以外のコードは為替と同一です。
**YahooFinanceの方がstooqより、データ反映が1日早い**ようです。

```py
import pandas_datareader.data as DataReader
stock = '6758.T'
start = dt.date(2020,1,1)
end = dt.date(2020,6,11)
df=DataReader.get_data_yahoo("{}".format(stock),start,end)
```
###まとめ
・YahooFinanceから日本株の株価個別銘柄も取得できた

・**全体を眺めた印象として、Mu-Methodの予測とは異なる動きもしているので、今後は長期での予測精度を見ていく**必要がある。
pythonで緯度経度座標↔UTM座標変換


緯度経度座標からUTM (ユニバーサル横メルカトル) 座標への変換式はちょっと面倒．
任意の緯度が与えられた場合の赤道から子午線弧長を求めるためにちょっと面倒な計算が必要となる．
pythonならpyprojのモジュールを用いることで簡単に座標変換ができる．逆も可．
そのままでは使えないので少し手を加えてやる必要がある．

##EQA → UTM

```python:eqa2utm.py
from pyproj import Proj

#An arbitral point in EQA coordinate
lon=139.767120  #[deg.]
lat=35.681079  #[deg.]

##Compute UTM zone
#"int": Extract only integer value
#31: Offset for UTM zone definition
#6: Angle in a UTM zone for the longitude direction
e2u_zone=int(divmod(lon, 6)[0])+31

#Define EQA2UTM converter
e2u_conv=Proj(proj='utm', zone=e2u_zone, ellps='WGS84')
#Apply the converter
utmx, utmy=e2u_conv(lon, lat)
#Add offset if the point in the southern hemisphere
if lat<0:
    utmy=utmy+10000000
    
print(" UTM zone is ", e2u_zone, " \n", \
      "UTM Easting is", utmx, "[m]\n",\
      "UTM Northing is ", utmy, "[m]")

```
```
$python3 eqa2utm.py
#OUTPUT
 UTM zone is  54  
 UTM Easting is 388435.0160657919 [m]
 UTM Northing is  3949276.5698600397 [m]
```

確認
<img width="411" alt="test2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654731/2edb90aa-e936-63c9-a04d-c435d6e11254.png">
出典: https://www.latlong.net/lat-long-utm.html



##UTM → EQA
UTM座標からの変換にはUTM zoneと南北半球の指定が必要．

```python:utm2eqa.py
from pyproj import Proj

#Define UTM zone
e2u_zone=54
#Define the northern('N')/southern('S') hemisphere
hemi='N'
utmx=388435.0160657919 #[m]
utmy=4060202.406410741 #[m]

#Add offset if the point in the southern hemisphere
if hemi=='S':
    utmy=utmy-10000000
    
#Define coordinate converter
e2u_conv=Proj(proj='utm', zone=e2u_zone, ellps='WGS84')
#Convert UTM2EQA
lon, lat=e2u_conv(utmx, utmy, inverse=True)
    
print("Longitude is ",lon," [deg.] \n",\
      "Latitude is ", lat, "[deg.]")
```

```
#OUTPUT
Longitude is  139.75135058449402 [deg.]
 Latitude is  36.68091466691 [deg.]
```

##Mesh丸ごと変換 
- EQA2UTM

おおむね同じです．

```python:EQA2UTM_mesh.py
from pyproj import Proj
import numpy as np
import matplotlib.pyplot as plt

#np.linspace(start, end, number_of_data)
lon_1d=np.linspace(130.3, 131.05, 2701)
lat_1d=np.linspace(31.18333, 31.9333, 2701)
lon, lat=np.meshgrid(lon_1d, lat_1d)

e2u_zone=int(divmod(lon[0,0], 6)[0])+31
e2u_conv=Proj(proj='utm', zone=e2u_zone, ellps='WGS84')
utmx, utmy=e2u_conv(lon, lat)
if lat[0,0]<0:
    utmy=utmy+10000000

#Option:
#Display the UTM Easting grid
plt.pcolormesh(utmx/1000, utmy/1000, utmx, cmap='jet')
plt.colorbar() 
plt.xlabel('UTM Easting [km]')
plt.ylabel('UTM Northing [km]')
plt.show 

```

色はUTM Easting [m] のgrid
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654731/75d042ae-8297-e84d-2fdd-175f452e5fd9.png)
docker-compose の Volume で NFS を指定して MinIO を立ち上げる

docker-compose 上でオブジェクトの保存先を NFS サーバ上のディレクトリとした MinIO を構築します。

## 前提
* NAS:
    * OS: Arch Linux
    * IP: 192.168.11.1
* Docker Host PC:
    * OS: Ubuntu
    * IP: 192.168.11.2
    * docker, docker-compose をインストール済み

## MinIO とは？
MinIO は aws S3 互換のオブジェクトストレージです。
調べてもらうといろいろな記事で紹介されていると思います。

今回はこの MinIO を docker-compose を用いて docker で構築しつつ，MinIO のコンテナに NFS をマウントしてオブジェクト自体は NAS に保存されるようにします。

## NAS 側準備
今回，NAS には事前に NFS サーバのセットアップを済ませてあります。
詳細は [Arch Linux を NAS 用にセットアップ - YetAnother_yk's tech blog](https://alpaca.qrunch.io/entries/7WEzhQFu13Z8KRc3) を確認いただければ幸いです。

まずは，MinIO のオブジェクトの保存先ディレクトリ，NFS 共有のためのマウント先ディレクトリを作成します:

```console
$ mkdir /Volume1/MinIO
$ sudo mkdir -p /srv/nfs4/MinIO
```

次に `/etc/fstab` に次の内容を追記します（ZFS の場合）:

```diff:/etc/fstab
+ /Volume1/MinIO		/srv/nfs4/MinIO	none		bind,defaults,nofail,x-systemd.requires=zfs-mount.service							0 0
```

続いて NFS の設定します:

```diff:/etc/exports
+ /srv/nfs4/MinIO    192.168.11.2/24(rw,no_root_squash)
```

```console
$ sudo mount -a  # マウントする
$ sudo exportfs -arv  # NFS 設定を反映する
```

## ホストマシン側準備
続いて，Docker のホストマシン側の設定を行います。

NFS サーバとの通信には Tinc を使用しています。
導入方法などはこちらを確認してください →[お手軽に VPN 経由のノード間通信を実現する Tinc を使ってみる - Qiita](https://qiita.com/y_k/items/76625d1f97bc2a4a8530)

実際に使用した `docker-compose.yml` は下のものです:

```yaml:docker-compose.yml
version: '3.7'

services:
  minio:
    image: minio/minio
    restart: unless-stopped
    volumes:
      - ./config:/root/.minio
      - minio:/data
    ports:
      - "9000:9000"
    command: server /data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 60s
      timeout: 20s
      retries: 3
volumes:
  minio:
    driver_opts:
      type: nfs
      o: "addr=192.168.11.1,hard,rw,nfsvers=4"
      device: ":/srv/nfs4/MinIO"
```

この YAML ファイルは [MinIO | Deploy MinIO on Docker Compose](https://docs.min.io/docs/deploy-minio-on-docker-compose.html) をベースにしています。

NFS をマウントするメインの記述は以下の部分です:

```yaml:docker-compose.yml
volumes:
  minio:
    driver_opts:
      type: nfs
      o: "addr=192.168.11.1,hard,rw,nfsvers=4"
      device: ":/srv/nfs4/MinIO"
```

`o` は NFS のマウント時のオプションと同様になっています。

# 参考
- [MinIO | High Performance, Kubernetes Native Object Storage](https://min.io/)
- [Docker ComposeのVolumeにNFSを指定する - Qiita](https://qiita.com/mogamin3/items/5cb0797011d8e0670288)
Excel から LINE WORKS のメンバーを PowerAutomate で一括修正する

Excel の情報を基に PowerAutomate から LINE WORKS の API でメンバー修正を行ってみます。

##LINE WORKS のメンバー修正 API

https://developers.worksmobile.com/jp/document/100300502?lang=ja

##Excel ファイル
ここでは、所属組織の情報を更新する想定で、データを用意してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/ca24cc4b-b8c1-e932-0e62-41a32652f812.png)

##PowerAutomate のフロー作成

トリガーは手動にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/41e8620f-2e15-6517-2b2d-eec82e58fa6b.png)

Excel Online の "表内に存在する行を一覧表示" をアクションに指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/c5127cc5-4fec-7e02-0676-9e8a13273b66.png)

各パラメータを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/796f2407-955c-631f-708e-b4b7f82d52d8.png)

続けて、HTTP をアクションに指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/8cf269aa-55d0-1896-9d78-c509f3d69106.png)

メンバー追加 API の URL など、各種パラメータを指定します。URL に Excel ファイルの email を指定すると、自動で Apply to Each で処理されるよう制御がはいります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/677abca0-465b-059c-c450-a1ff7227c4cd.png)

本文の JSON を記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/6291a7c4-7f6c-4e12-7036-b97e02bad9ce.png)


##動作確認
Excel に必要な情報を入力し、フローを実行します。
NuxtのパスパラメータありきのページがFirebase Hosting上で404になる問題を回避する

Nuxt.jsのSPAモードで作ったアプリケーションをFirebase Hostingにデプロイしたとき、パスパラメータのあるページでリロードをすると404になってしまう問題に遭遇したので、その回避方法を紹介します。

**※ 前提**
この記事のサンプルコードでは TypeScript + Composition API を使用しています。

# 原因

Nuxtでパスパラメータを表現したいときは、以下のようにディレクトリを切ることで動的ルーティングが実現できますよね。

```
pages
├── users
│ └── _id.vue
└── index.vue
```

このように定義することで`/users/{id}`というページが動的に生成されるようになります。
しかしSPAモードでbuildした場合、こういった動的ルーティングをしているページは静的ページとして生成されないため、リロードすると404になってしまうのです。

# 回避方法

Firebase Hostingの[カスタム404ページ](https://firebase.google.com/docs/hosting/url-redirects-rewrites?hl=ja#section-404)を使用し、404ページからもとのパスへリダイレクトさせることでリロードを実現することができます。

## カスタム404ページを用意する

pages配下に404ディレクトリを作成し、index.vueを作成します。

```
pages
├── 404
│ └── index.vue // 追加
├── users
│ └── _id.vue
└── index.vue
```

ビルド時、ルートディレクトリに404.htmlが生成されるようnuxt.config.jsにgenerateプロパティを追加します。

```js:nuxt.config.js
export default {
    generate: {
        routes: ['404']
    }   
}
```

`/404/index.vue`で現在のパスをクエリパラメータにセットし、リダイレクト用ページへリダイレクトさせます。

```vue:index.vue
<script lang="ts">
import { defineComponent, onMounted, SetupContext } from '@vue/composition-api'

export default defineComponent({
  setup(_props, context: SetupContext) {
    onMounted(() => {
      const pathName: string = window.location.pathname
      context.root.$nuxt.$router.push('/redirect?path=' + encodeURI(pathName))
    })
  }
})
</script>
```

## リダレクトページを用意する

pages配下に`redirect.vue`を作成します。

```
pages
├── 404
│ └── index.vue
├── users
│ └── _id.vue
├── redirect.vue // 追加
└── index.vue
```

クエリパラメータのパスを取得し、もとのページへリダイレクトさせます。
こうすることで動的にページ遷移をする要領でパスパラメータありきのページが表示できるようになり、404エラーを回避することできます。

```vue:redirect.vue
<script lang="ts">
import { defineComponent } from '@vue/composition-api'

export default defineComponent({
  layout: 'empty',
  asyncData({ base, redirect, query }) {
    const param: string | (string | null)[] = query.path
    if (param === undefined || typeof param !== 'string') {
      return redirect('/')
    }
    const redirectPath: string = '/' + param.replace(base, '')
    return redirect(redirectPath)
  }
})
</script>
```

これでNuxtのSPAモードでパスパラメータを使用していても、リロードができるようになりました！
同じ問題で困っている方のヒントになれば幸いです。

# 参考

- [Generate a static 404 page](https://github.com/nuxt/nuxt.js/issues/966)
- [Github Pagesに公開したNuxt.jsアプリがリロードで404になる問題に対応する](https://gist.github.com/orimajp/2541a8cde9abf3a925dffd052ced9008)
MY SQLでrootパスワードを強制的に変更する

MYSQLを初めて操作した時、パスワードを忘れてしまいました。
その時、パスワードを強制的に変更して解決しました。

備忘録です。

＜環境＞
MYSQL 5.6

# エラー内容

```
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```

こんなエラーに遭遇しました。

※MYSQLのバージョンを8以上にしたら以下のコマンドが効かなくなりました！
その場合はこちらで解決できました。
https://qiita.com/Yuki0531/items/5ce373a6ca3263f63133


# やったこと① - パスワードなしでログインする

以下コマンドで、MYSQLを一旦止めます。

```
$ mysql.server stop
```

下記コマンドで、セーフモードで起動させます。

```
$ mysqld_safe --skip-grant-tables &
```

rootでログイン

```
$ mysql -u root
```


# やったこと② - 新しいパスワードを設定する

以下、入力してパスワードを再設定する。

```
use mysql;
```
```
update user set password=PASSWORD("ここにパスワードを記載") where User='root';
```

```
flush privileges;
```

Query OK　と表示されれば成功です。

以下、入力してMYSQLからログアウトしましょう。

```
quit
```

# 最後に

セーフモードで起動しているMYSQLを停止し、通常モードで起動します

```
mysql.server stop
```
```
mysql.server start
```

SUCESSとでたら成功です。
AWS Linux 2でのdocker-nginx　ポートフォワード込み

# AWS Linux2 新規EC2インスタンス作成
[参考](https://qiita.com/TurkeyLeg0403/items/5f46c437c5eb74ef7517)

# Docker インストール
[AWS公式のDocker導入マニュアル](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html)

マニュアルにあるが一応コマンドだけ羅列。

```bash
$ sudo yum update -y
$ sudo amazon-linux-extras install docker
$ sudo service docker start
$ sudo usermod -a -G docker ec2-user
```

# nginxインストール・起動

```bash
$ docker pull nginx
$ docker run -d --name nginx-container -p 8080:80 nginx
```

# nginxへのブラウザ接続

## AWS上でのFirewall透過

セキュリティーグループに以下を設定

<img width="813" alt="out.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241421/a11e2e7d-c416-99f6-3fac-bdf37efd5251.png">
<img width="814" alt="in.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241421/c2aee899-a514-f056-2452-1d8438914c45.png">

何してるかというと、ポートフォワードを行なっているので、
そのポートを開通している。

## ブラウザでの接続
接続URLは`http://AWSインスタンスのIP:8080/`

<img width="901" alt="nginx.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241421/82aef632-1e71-200b-ea7e-9e2e5db31424.png">



# 補足-dockerの実行確認コマンド

```bash
$ docker ps -a
$ docker images
$ docker stop 接続ID
$ docker rm 接続ID
# dockerへの接続
$ docker exec -it 接続ID /bin/bash
# 接続したdockerのIP
$ root@接続ID:/# hostname -i
```
Androidアプリ個人開発キックオフ

# はじめに
学んだこと整理するためにもブログでまとめていこうと思います。
他の人の役に立てれば幸いです。間違いなどあれば指摘して頂ければと思います。
また、アドバイスなどもあればコメントいただけると助かります。

# 背景
残業禁止となり、副業を探していたが下記の理由から、個人開発で1個実績を作り副業につなげたいと思う

- C,C++(現保有スキル)で勤務日数が少ない案件がない
- アプリ開発の案件が多い
- 以前からAndroidアプリ開発に興味があった
- C以外の言語を学ぶいい機会である

# 目標
自作でアプリ開発を行い、GooglePlayストアで公開する。

- RA~ITを一通り自分で実施できること 
- アプリ開発に必要なjavaの知識を理解する

# 開発に使用する言語選定
下記候補から、将来的な汎用性を考慮してJavaで行うことに決定。(Koltinと迷いましたが。)

- C/C++  
  - 現業務のスキルアップにも使えるが、AndroidStudio(アプリ開発の環境)を使用するとjavaなどに比べて工数がかかりそう。
- Java  
  - Androidアプリ開発以外にも使用でき、需要も高い
- Koltin  
  - 2011年に登場し、2017年にAndroidの開発言語して使用されはじめた新言語。
  Javaよりも簡潔にコードを書ける点や、開発において安全性を担保しやすい。

# Google Play Developerに登録
自分を追い込むためにも、アプリをリリースするために必要なGoogle Play Developerに早速登録しました。
費用は一度きり$25(約2,700円)でした。(2020/6/14時点)
下記の記事を参考にさせて頂きました。
[登録方法]
("https://qiita.com/minuro/items/f1eba5b3a14fd3110085")


# 参考資料
2年ほど前に購入したものですが、本質的なところは変わっていないと思うので下記を使用します。(調べたら第4版まででていました。。。)
[はじめてのAndroidプログラミング 改定版]("https://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AEAndroid%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E6%94%B9%E8%A8%82%E7%89%88-%E9%87%91%E7%94%B0-%E6%B5%A9%E6%98%8E/dp/4797391669")

# 今後の予定
1. 準備
  1. テーマ決め
  1. 機能洗い出し
  1. 技術調査
1. UI設計
 1. 実装
 1. プロトタイプ作り
 1. 通信部分など実装
1. リリース
 1. アイコン作り
 1. ストア画像作り
 1. アプリ署名

# おわりに
これから、アプリ開発で行っていくノウハウをまとめていきたいと思います。
[Scratch3.0×WeDo2.0]   レゴのセンサーとキーボードで楽器演奏

この記事はパソコンで楽器を演奏してみたい人のための記事です。
今回はパソコンのキーボードとレゴのセンサーでを色々な楽器を演奏してみます。

#目次
1.センサー装置(そうち)をつくろう
2.パソコンとレゴをつなげよう
3.プログラムをつくろう

#1.センサー装置(そうち)をつくろう
◯チルトセンサー(傾きの状態を感知)
◯モーションセンサ(距離や動きを感知)
を使っています。

![スクリーンショット 2020-06-14 16.52.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/d3895aee-9d29-d550-1e1f-2a6a723d8b43.png)



#2.パソコンとレゴをつなげよう
####①サインインして"つくる"を押そう！
![スクリーンショット 2020-06-14 14.49.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/93461f74-4279-7f20-8953-d207b038189f.png)
####②スクラッチリンクを実行しよう！
####③bluetoothを有効にしよう！
####④タイトルを入力したら、拡張機能を選ぼう！
![スクリーンショット 2020-06-14 14.50.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/7c60ac5b-8ad6-012b-7979-6bfc02b3e215.png)
　　　↓ ("音楽"を選ぶ)
![スクリーンショット 2020-06-14 17.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/5b479752-00e8-55fc-d88a-738b88e484ba.png)

　　　↓ ("WeDo2.0"も選ぶ)
![スクリーンショット 2020-06-14 14.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/cdaa23d5-0ba7-2e0c-7b0a-42c43d507d7f.png)
####⑤"検索を開始"ボタンを押してWeDo2.0のハブのボタンを押そう！
![スクリーンショット 2020-06-14 14.50.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/0e483059-3508-3dea-3044-1f9616874a01.png)
![スクリーンショット 2020-06-14 14.50.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/0ade9f07-0d7c-b2be-9ea7-2790dccd1fc3.png)
####※もし下のようになったらスクラッチリンクとbluetoothを確認して"もう一度試す"を押そう！
![スクリーンショット 2020-06-14 14.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/c3ec7a5c-b217-9a06-6f01-e898c667610c.png)


#3.プログラムをつくろう
###◯チルトセンサーが上に傾いている時に "aキー" を押したら、ピアノの"ド"の音をならすプログラム
![スクリーンショット 2020-06-14 17.16.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/5aac90ec-c33d-c0aa-6799-34b4d35ec966.png)

　
###◯ピアノの音でドレミファソラを演奏できるようにしたプログラム
![スクリーンショット 2020-06-14 17.24.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/5a91e9a7-5933-b817-26b5-994c571ce102.png)

###◯傾きで楽器を変えて演奏できるようにしたプログラム
![スクリーンショット 2020-06-14 17.28.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/f0e98e85-2612-381f-a1a3-99f40b0e8748.png)
　
###◯モーションセンサで音量を調節できるようにしたプログラム
![スクリーンショット 2020-06-14 17.31.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/99e85a9d-b97e-a796-7fe4-4bdf21afb4cf.png)

　
　
#最後に
読んで頂きありがとうございました！　
ぜひ色々な操作をぜひやってみてください！！

より良い記事をつくっていきたいと思いますので
　◯こうした方がわかりやすい
　◯ここがわかりにくい
　◯ここが間違っている
　◯ここをもっと説明して欲しい
などの御意見、御指摘のほどよろしくお願い致します。
統計学入門 (確率変数・確率分布)

# 確率変数・確率分布を理解する
1. 確率変数とは？(簡易版)
2. 確率分布とは？(簡易版)

## 確率変数とは？(簡易版)
取り合えず、最初はWikipediaさんに聞いてみましょう。
### 確率変数
確率変数（かくりつへんすう、英: random variable, aleatory variable, stochastic variable）とは、確率論ならびに統計学において、起こりうることがらに割り当てている値（ふつうは実数や整数）を取る変数。各事象は確率をもち、その比重に応じて確率変数はランダムに値をとる。

・・・・

ふぁ？、、、


少し分かりやすくかみ砕くと、確率変数とは**「何らかの試行を行ったことにより、その値が定まり、かつ、その値をとる確率が決まっているもの」**のことです。

ごめん、まだ少し分かりづらい、、、


例えば、
**何らかの施行：**サイコロを一回投げる、トランプを一枚引くなど
**その値：**サイコロの値={1,2,3,4,5,6}、トランプの値={1 ~ K}
**その値をとる確率：**サイコロの確率(どの目が出ても1/6)、トランプの確率(どのカードを引いても1/13)
ここで、トランプにはジョーカーがあるじゃん！！とか屁理屈をいう人はブラウザバックしてください。

つまり、サイコロを例にすると(確率変数をサイコロの目と考えると)
**何らかの操作(サイコロを振る)**まで、出るサイコロの目とその確率は分からない。
しかし、サイコロを振ると何かしらの値(サイコロの目)が分かる。
同時にその確率も決定する(今回の例では、どんな目が出ても確率は1/6)

イメージ出来たでしょうか？


実は確率変数には下記の2パターンが存在します。
1. 離散型
2. 連続型
これらの内容は難しくないです。
### 離散型確率変数
まず、離散とは「ちりじりになること、とびとびの値をとる」という意味です。
実は、サイコロの目やトランプの数はこの離散型確率変数になります。
例外はありますが、基本的なサイコロやトランプはとる値(確率変数)が有限です。
**サイコロ：**{1,2,3,4,5,6}の6パターンのみ
**トランプ：**{1,2,3,4,5,6,7,8,9,10,J,Q,K}の13パターンのみ
ここで、トランプにはジョーカーがあるから有限じゃない！！などという人。まだいたのか、、おとなしくUNOやってろ。

### 連続型確率変数
連続とは「切れ目がなく続くこと、続けること」という意味。
例えば身長や体重、温度など、とる値が小数点以下などでいくらでも表現できるものです。(とる値が無限に存在する)

この、**連続型確率変数に関しては注意が必要**です。
連続型の場合、確率変数をある値で固定してしまうとその値をとる確率は**「0」**になってしまいます。

例えば、離散型確率変数において、確率変数を固定する(確率変数X=2)
すると、同時にその確率も求まります。サイコロの目(X=2)が出る確率は1/6です。
この確率はサイコロの目が2になる数をサイコロ全体の数で割って導出しています。

離散型の場合どうなるのか、、、
ある男子小学1年生の身長を計測することにしましょう(確率変数を身長にする)
2015年の平均身長は116.5cmだそうです。なので、とりあえず確率変数のとりうる範囲を110.0(cm) < 確率変数 < 120.0(cm)としておきます。

ここで、確率変数(身長)が116cmである確率を求めたい、、、

ん？確率変数(身長)がとる全体の数は115cmや113.001398271235cmなど無限にある。

つまり、1 / ∞(無限)　となるので、確率は限りなく**0**に近づく。
よって、確率変数を固定すると、その値をとる確率は0になります。

じゃあ、離散型に関しては確率を求められない！？

答えから先に言うと、区間を限定して積分しちゃえば求められます。
詳しい説明はまた後述するので少々お待ちを。

次は**「確率分布」**を理解していきます。

## 確率分布とは？(簡易版)
いつもお世話になっております。Wikipediaさんです。
### 確率分布
確率分布（かくりつぶんぷ、英: probability distribution）は、確率変数に対して、各々の値をとる確率を表したものである。日本工業規格では、「確率変数がある値となる確率，又はある集合に属する確率を与える関数」と定義している

・・・・

珍しく簡潔に書いとるやないかい。

つまり、確率変数とその値をとる確率を分かりやすいように表したってことだよね。
Ex)　サイコロの出る目(確率変数)の確率分布

|サイコロの出る目|1 |2 |3 |4 |5 |6 |
|---|---|---|---|---|---|---|
|確率|1/6　|1/6　|1/6　|1/6　|1/6　|1/6　|

まだ内容は近日追記します。
少々お待ちを、、、
【記録】RUNTEQでコードリーディング会(オンライン)をしてみた感想

## プログラミングスクールRUNTEQはイベントが盛り沢山

僕は現在、金融系の会社に勤めながら、スタートアップ特化型のプログラミングスクール**RUNTEQ**に通っています。([RUNTEQ 公式ページ](https://runteq.jp/))


RUNTEQでは、(株)スタートアップテクノロジーの現役エンジニアの方々による勉強会に参加させてもらえたり、RUNTEQ講師の方が勉強会を開催してくれたり、代表のひさじゅさんがエンジニアやスタートアップの文化について語ってくれたりと毎週イベントが盛り沢山です。

そしてこの前、RUNTEQ卒業生がポートフォリオの発表会を行ってくれ、サービスの説明やコードの説明を行いながら、「UIはこうした方がいいんじゃないか」「この機能のコードがどうなってるのか気になる」とか意見を交えながら夜中1時くらいまでワイガチャするイベントがありました（講師の方も参加してくれる豪華っぷり）。

その時に「RUNTEQの応用編課題のコードリーディングもしたいな〜」とRUNTEQのSlackで呟いてみたら、講師の方や受講生の方が「それいいね！やろう！」「楽しみ！」と言ってくれたので、コードリーディング会を開催することに。

そこで以下に備忘録として、**初学者がコードリーディング会(オンライン)をして感じたこと**を纏めておきます。

## 話した内容とイベントの流れ

イベントは平日夜10時からzoomで行って、受講生や卒業生、講師や運営の方も参加してくれました(20人くらい、感謝です)。

流れはよくある勉強会と同じような感じで、
**自分があるテーマについてコードを読みながら解説する
→講師の方が補足してくれる
→皆から質問受けたり、ちょっと話が逸れて違う技術の話をしたり(これが楽しい)**
みたいな感じです。

で、自分が話した内容はRailsのテーブル継承機能である**STI**についてです。
以下のブログに話した内容をザックリ纏めてみたので、ご興味があれば是非読んでみてください。

[クラスの継承（単一テーブル継承）/ryota21silvaのブログ](https://ryota21silva.hatenablog.com/entry/2020/06/09/184330)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576318/0789384a-a0e5-ae3a-0327-92bee33c19b2.png)
こんな図を用いたりしました！(ブログにも書いてます)

## コードリーディング会(オンライン)をして感じたこと

### 1. スピーカーONで反応してくれると嬉しい
これはオンラインで説明する側に立った人は、誰しも感じることではないでしょうか。
「うんうん」「次進んで大丈夫です」とか何か反応を貰えるとめっちゃ安心します。
自分も聞き手の立場であるときは、もっと反応することを心がけたいと思いました。

### 2. 聞き手の反応が分かり辛いから、説明のレベル、スピードの調整が難しい
1つ目と被りますが、聞き手の顔とか仕草が見えないので、「あ、今の話題はみんな付いていけてなさそうだな」「ここは手短に端折って良さそう」とか臨機応変に対応するのがオンラインは難しいと思います。
特に感情に訴えるようなスピーチをオンラインでする場合、難易度が上がると思います。

### 3. 体面より緊張しないかも
今回は20人くらいの前で会話するくらいだったので、ほぼ緊張はしなかったですが、心なしかオンラインの方が緊張しない気がしました(顔が見えないから？)
数百人の前で話す時って中々緊張するんですけど、そのようなケースだとかなり違う気がしました。

### 4. コードの説明って難しい

人に何かを説明する時って、
**その内容に対して相手はどれくらいの前提知識を持っているのか？**
**自分が理解している範囲内での説明をしていないか？**
などを意識する必要があると思います。

それを意識しながら、コードリーディングするのってこんなに難しいんだなと。(最早ちゃんと説明できていたのか...)
あと自分が解説をした後に講師の方に補足してもらったんですけど、その説明がなんと分かりやすいこと。。
RUNTEQの講師陣は神ですね。

### 5. 準備、説明、更に調べるという流れで、コードの理解が深まる

自分はコードリーディング会をしてみて、こんな良い学習サイクルに出会えました。

**1. 説明するテーマを解説するために色々調べる。
2. 解説しながら頭の中が整理される。
3. そのテーマについて意見や質問を貰えるから、更に調べる。またテーマ外の内容についても話題にあがるから、それも調べる。**

このように誰かにコードの解説をすることは、最高の学習方法になるのです。

### 6. 新しい機会があれば飛び込んでみるべき

コードの説明を多人数に対して行うことは、自分にとって初めての機会でした。
そのような初めての機会に勇気を出して飛び込んでみることは、自分の殻を破る良い機会だと思います。

自分は「うわ、ちょっと面倒だな…」「できるか不安だな…」と思うことにはなるべく挑戦するようにしていますが、今回の体験も自分を成長させる最高の機会になったと思います。



## おわりに

僕は、勉強熱心なエンジニアの文化が好きです。
勉強会を社内外で開催したり、自分の持っている知識をこれほどGiveする環境ってのは他の業界ではあまり見られないと思います。
なので、僕も仮にエンジニアに転職できた際には社内外で勉強会を行いたいと思いますし、今回のイベントがその第一歩になった気がします。

そのような貴重な機会を設けていただいたRUNTEQの皆さんには感謝です！

以上です、ありがとうございました。
【Scala】文字列(String)を数値(Int, Doubleなど)に変換する

#1. 基本の変換
Scalaで文字列(String)を数値(Int, Doubleなど)に変換するには`toInt`や`toDouble`といったメソッドを使います。

```scala:文字列を数値型に変換
scala> "10".toInt
val res0: Int = 10

scala> "3.14".toDouble
val res1: Double = 3.14
```

基本的に、数値として解釈できれば変換可能です。
また、`Int`や`Double`以外の数値型に変換するためのメソッドも用意されています。

```scala:その他のパターン・型
scala> "-100".toInt  // 負数も変換可能
val res2: Int = -100

scala> "3".toDouble  // 小数型に変換する場合は小数点がなくても可
val res3: Double = 3.0

scala> "12345678900".toLong  // Long
val res4: Long = 12345678900

scala> "1.234".toFloat       // Float
val res5: Float = 1.234

scala> "12345".toShort       // Short
val res6: Short = 12345

scala> "123".toByte          // Byte
val res7: Byte = 123
```

数値ではありませんが、真偽値の文字列を`Boolean`型に変換することも可能です。

```scala:真偽値型に変換
scala> "true".toBoolean
val res8: Boolean = true

scala> "false".toBoolean
val res9: Boolean = false
```

#2. より安全な変換
上記のメソッド群は、数値として解釈できない文字列の場合に`java.lang.NumberFormatException`を投げます。[^1]


```scala:数値として解釈できない文字列の場合
scala> "hello".toInt
java.lang.NumberFormatException: For input string: "hello"
  at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
  at java.base/java.lang.Integer.parseInt(Integer.java:652)
  at java.base/java.lang.Integer.parseInt(Integer.java:770)
  at scala.collection.StringOps$.toInt$extension(StringOps.scala:889)
  ... 32 elided

scala> "3.14".toInt // 小数をIntに変換しようとしてもエラー
java.lang.NumberFormatException: For input string: "3.14"
(略)
```

数値として解釈できない文字列を変換する場合、`toIntOption`や`toDoubleOption`を使うことで、安全に変換することができます。[^2]
これらのメソッドは与えられた文字列が数値に変換できれば変換結果を`Some`に包み、変換できなければ`None`を返します。

```scala:Optionを利用した安全な変換
scala> "100".toIntOption    // 変換に成功したら数値をSomeに包む
val res10: Option[Int] = Some(100)

scala> "hello".toIntOption  // 失敗はNone
val res11: Option[Int] = None

scala> "123.45".toDoubleOption     // Double(成功)
val res12: Option[Double] = Some(123.45)

scala> "foo123.45".toDoubleOption  // Double(失敗)
val res13: Option[Double] = None

scala> "".toIntOption // 空文字列もNone
val res14: Option[Int] = None
```

こちらも`Int`や`Double`に限らず、一通りの数値型(と`Boolean`型)で用意されています。

```scala:その他の数値型(Noneになるパターンは省略)
scala> "12345678900".toLongOption  // Long
val res15: Option[Long] = Some(12345678900)

scala> "1.234".toFloatOption       // Float
val res16: Option[Float] = Some(1.234)

scala> "12345".toShortOption       // Short
val res17: Option[Short] = Some(12345)

scala> "123".toByteOption          // Byte
val res18: Option[Byte] = Some(123)

scala> "false".toBooleanOption     // Boolean
val res19: Option[Boolean] = Some(false)
```

確実に目当ての型に変換できるとわかりきっているケースでない限りは、こちらを使った方が安全ですし、例外を補足する手間も減りますね。

#おまけ: Scala 2.12以前の場合
上記の`toXXXOption`系のメソッドは、Scala 2.13以上のバージョンでなければ使用できません。
Scala 2.12以前で同等の処理をしたい場合は、下記の@suinさんの記事などを参考にしていただければと思います。
[Scala: Stringを安全にIntに変換する](https://qiita.com/suin/items/61d121bef4d99a701543)

<br>
最後までお読み頂きありがとうございました｡
質問や不備についてはコメント欄か[Twitter](https://twitter.com/ka2_kamaboko)までお願いします。

[^1]: `toBoolean`の場合は`java.lang.IllegalArgumentException`を投げます。
[^2]: (Stringの)`toXXXOption`系のメソッドはScala 2.13.0で追加されました。
Railsで必須でないカラムのvalidationでハマった話

よっしゃー！正規表現バッチリ書いてRSpecでmodelのテスト通った！
ってなって喜んでしばらく放置してて久しぶりに人に見せるためにいじってみたら、あれ？新規登録できねえよってなってました。

#今回の対象のmodelのマイグレーションファイル
```ruby
class CreateClients < ActiveRecord::Migration[5.2]
  def change
    create_table :clients do |t|
      t.string :client_name1,null: false
      t.string :client_name2
      t.string :postcode
      t.string :add1
      t.string :add2
      t.string :add3
      t.string :tel
      t.string :fax
      t.string :client_person_in_charge
      t.string :mobile
      t.string :url
      t.string :email
      t.integer :client_rank_id
      t.integer :client_cat_id
      t.integer :closing_day_id
      t.integer :payment_day_id
      t.integer :payment_method_id
      t.references :user,foreign_key: true

      t.timestamps
    end
  end
end
```
mobileカラムとemailカラムに正規表現書いて達成感。

#しかし、新規登録してみても何も起こらない
rollbackされてる。

```sql
Started POST "/clients" for ::1 at 2020-06-14 16:09:13 +0900
Processing by ClientsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"gdB/FJWD/yQj2xDKXjlKhq2gdJM6iQ1c1D3Hkm1z4THd2/FNJGWXqX2E6Odg3GJnAToUsxY4rNa7WfzFnX5Krg==", "client"=>{"client_name1"=>"PHP株式会社", "client_name2"=>"", "postcode"=>"", "add1"=>"", "add2"=>"", "add3"=>"", "tel"=>"", "fax"=>"", "client_person_in_charge"=>"", "mobile"=>"", "url"=>"", "email"=>"", "client_rank_id"=>"", "client_cat_id"=>"", "closing_day_id"=>"", "payment_day_id"=>"", "payment_method_id"=>"", "user_id"=>"1"}, "commit"=>"登録"}
  User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1
  ↳ /Users/honda/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.4.2/lib/active_record/log_subscriber.rb:98
   (0.4ms)  BEGIN
  ↳ app/controllers/clients_controller.rb:11
  User Load (7.1ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
  ↳ app/controllers/clients_controller.rb:11
   (0.2ms)  ROLLBACK
  ↳ app/controllers/clients_controller.rb:11
```

ほへー。

#原因はmodel以外あり得ない

もう思い当たる節はvalidationしかないので、modelをみる。

```ruby:client.rb
  VALID_EMAIL_REGEX=/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  VALID_MOBILE_REGEX=/\A[0]+[789]+[0]\d{8}\z/
  validates :email,format: {with: VALID_EMAIL_REGEX,message: 'メールアドレスが正しくありません。'}
  validates :mobile,format: {with: VALID_MOBILE_REGEX,message: '携帯電話番号が正しくありません。'}
```

あ、validationで空文字許可がいるのか？

```ruby:client.rb(修正後)
  VALID_EMAIL_REGEX=/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  VALID_MOBILE_REGEX=/\A[0]+[789]+[0]\d{8}\z/
  validates :email,format: {with: VALID_EMAIL_REGEX,message: 'メールアドレスが正しくありません。'},allow_blank: true
  validates :mobile,format: {with: VALID_MOBILE_REGEX,message: '携帯電話番号が正しくありません。'},allow_blank: true
```

presence: trueはいらない！って気を抜いてました。。。
Excel から LINE WORKS のメンバーを PowerAutomate で一括登録する

LINE WORKS の管理画面から、Excel や CSV ファイルでメンバーを一括で追加できます。ただし、次の制限があります。

- メンバーの兼務設定に非対応
- 1 ファイルに 100 人まで

LINE WORKS の API でメンバー追加を行なうと、これらの制限を回避できます。

https://help.worksmobile.com/jp/administrator/member/how-to-add-members-collectively/
https://help.worksmobile.com/jp/administrator/member/assign-member-to-several-teams-concurrently/


ここでは、Excel の情報を基に PowerAutomate でメンバー追加を行ってみます。
##LINE WORKS のメンバー追加 API
https://developers.worksmobile.com/jp/document/100300501?lang=ja
各種の属性をパラメータで設定できます。
ここでは、必須である名前と ID を設定してみましょう。

##Excel ファイル
以下の情報を Excel のテーブルに整理します。
名、姓、ID
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/1f2de271-d68d-853b-9bbe-22032782f2b1.png)

Excel ファイルは OneDrive for Business に配置します。

##PowerAutomate のフロー作成
トリガーは手動にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/41e8620f-2e15-6517-2b2d-eec82e58fa6b.png)

Excel Online の "表内に存在する行を一覧表示" をアクションに指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/c5127cc5-4fec-7e02-0676-9e8a13273b66.png)

各パラメータを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/bfb22b47-a77d-9f6b-9cfb-5a2f9dbcb10b.png)

続けて、HTTP をアクションに指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/8cf269aa-55d0-1896-9d78-c509f3d69106.png)

メンバー追加 API の URL など、各種パラメータを指定します。URL に Excel ファイルの email を指定すると、自動で Apply to Each で処理されるよう制御がはいります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/0fd9f321-0759-4b55-9430-3ff3d773c325.png)

本文にメンバーの属性値を JSON で指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/b9f5def5-b798-66e6-5c8f-1b45f48fdb4d.png)


##動作確認
Excel に必要な情報を入力し、フローを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/e1c1b084-c427-5685-e559-b24d35547739.png)
プログラミングを本気で始めて１ヶ月＠テックキャンプ

こんにちは。駆け出しエンジニア歴１ヶ月のカトです。Qiita初投稿です。

Qiitaは、情報集めだけかなぁとは思っていたのですが、学習のアウトプットの場として、投稿することにしました。間違いだらけかもしれませんが、ご容赦ください。

初めての投稿なので、簡単にこれまでの経緯と学習を初めて1ヶ月の感想を綴ります。

# 学習までの経緯
2020年7月までラオスでJICA協力隊として活動の予定でしたが、いろいろあってコロナ帰国で2020年3月に日本に戻り、そのまま任期終了となりました。元々関心を持っていたプログラミング。ある意味、学習するのに良い期間となったので、本気でプログラミングを始めました。

# 学習方法
元々独学で学習を進めていましたが、自分に甘い人間なので、中途半端に学習したくないと思い、ほぼ「ノータイムポチり」で、学習サポートが充実している『TECH::CAMP』エンジニア転職コースで学習を始めました。

# 1ヶ月の感想
### 「学びに対する姿勢が変わりました」
##### 何が良いのか？
* メリハリのある学習スタイル
* アウトプット重視
* 共に頑張る仲間
* 質問時の仮説・検証

メリハリ、アウトプットの重要性や考える質問の仕方など、プログラミング以外にも通じる学びの姿勢を再認識させてくれます。

社会人になって「継続して勉強をする」という姿勢を忘れていました。そして効率よく学習するにはどのように学習すれば良いかという姿勢を鍛えてくれます。

元々、そういう姿勢が備わっている人にとっては物足りない部分も多いかもしれませんが、私のように「継続して勉強をする」という姿勢を取り戻したいという方にはオススメのスクールです。

# 最後に
まだまだ4週間／10週間と半分に達していませんが、自分自身の生活週間や学習スタイルが少しずつ確立できてきたので、少しずつ再アウトプットの場としてQiitaを活用していければと思います。
ImageMagickで画像を"イイ感じ"にリサイズする

# "イイ感じ"とは

https://twitter.com/kotauchisunsun/status/1272078639547334656

機械学習のモデルが特定の画像のサイズにしか対応していないことがよくある。そのため、下処理として、画像を縮小する下処理を行うが、このコマンドを何回もググるのがダルく、いつも探すのに時間がかかるのでメモっとく。

"イイ感じ"とは

1. 特定の画像サイズにはまるように縮小
2. 元の画像の縦横比を保持
3. 空いた場所は適当な色に塗る

```bash
convert -resize 512x512 input.jpg -background none -gravity center -extent 512x512 output.jpg
```

今回の例だと、512x512の画像に収まるように調整されている。


元ネタ：
[Resize to a fixed geometry but maintain aspect ratio](https://www.imagemagick.org/discourse-server/viewtopic.php?t=12560)
【Rails】ExecJS::RuntimeUnavailableの解決方法

# 解決策→mini_racerをインストールしよう

MacのOSアップデート後に`rails s`でサーバーを立ち上げようとしたところ、エラーが発生。

```:ターミナル
Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. 
(ExecJS::RuntimeUnavailable)
```
調べてみると、JavaScriptを実行するために必要なランタイムが無いぞ！と言っているらしい。

解決策を調べていると、どうやらエラー文にある`https://github.com/rails/execjs`に利用可能なランタイムの一覧のリンクが表示されているらしい。

その中にある、`gem 'mini_racer'`が良さそうという情報があったので、bundle installすることに。
結果、無事にサーバーを立ち上げることができるようになりました！

# 結論
```:Gemfile
# 最下部に追加
gem 'mini_racer'
```
をbundle installしよう。
Sass(SCSS)でflexboxのComponentをつくる


Sassでflexboxを使う際はMixinで一括設定するのが王道かと思いますが，個人的にはclassとして直接書きたいのでcomponentとしてまとめました．

#SCSS

各クラスの命名規則はEmmetに基づいています．
また，ベンダープレフィックスに関してはコンパイル時に付与するものとし，省略をしています．

```scss:_c-flex.scss
@charset 'UTF-8';
/*
  Flex
-----------------------------------------------------*/

.c-flex {
  display: flex;

  &.-fxd {
    &-c {
      flex-direction: column;
    }
    &-cr {
      flex-direction: column-reverse;
    }
    &-r {
      flex-direction: row;
    }
    &-rr {
      flex-direction: row-reverse;
    }
  }

  &.-fxw {
    &-n {
      flex-wrap: nowrap;
    }
    &-w {
      flex-wrap: wrap;
    }
    &-wr {
      flex-wrap: wrap-reverse;
    }
  }

  &.-jc {
    &-c {
      justify-content: center;
    }
    &-fe {
      justify-content: flex-end;
    }
    &-fs {
      justify-content: flex-start;
    }
    &-sa {
      justify-content: space-around;
    }
    &-sb {
      justify-content: space-between;
    }
  }

  &.-ai {
    &-b {
      align-items: baseline;
    }
    &-c {
      align-items: center;
    }
    &-fe {
      align-items: flex-end;
    }
    &-fs {
      align-items: flex-start;
    }
    &-s {
      align-items: stretch;
    }
  }

  &.-ac {
    &-c {
      align-content: center;
    }
    &-fe {
      align-content: flex-end;
    }
    &-fs {
      align-content: flex-start;
    }
    &-s {
      align-content: stretch;
    }
    &-sa {
      align-content: space-around;
    }
    &-sb {
      align-content: space-between;
    }
  }
}

.c-flex__item {
  &.-ord {
    @for $i from 1 through 10 {
      &-#{$i} {
        order: $i;
      }
    }
  }
}

```

#記入例
```html:index.html
<div class="c-flex -fxd-c -jc-c">
  ...
</div>
```
コンパイル後，このように適用されます．

```css:common.css
.c-flex {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
}

.c-flex.-fxd-c {
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
      -ms-flex-direction: column;
          flex-direction: column;
}

.c-flex.-jc-c {
  -webkit-box-pack: center;
      -ms-flex-pack: center;
          justify-content: center;
}
```

#flex item

子要素のプロパティはorder以外ほとんど使わない気がするので
orderのみ1-10まで指定できるようにしています．

```html:index.html
<div class="c-flex">
  <div class="c-flex__item -ord-2">
  <div class="c-flex__item -ord-1">
  <div class="c-flex__item -ord-3">
</div>
```
[JQuery]　ファイル選択した画像を即時プレビュー表示する方法 +画像投稿gem追加

#完成イメージ
![ezgif.com-optimize.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654313/c0ddc308-9053-dc53-4e01-7b97a360ceda.gif)
- 画像を選択する。
- 画像をDBに登録する前にプレビュー表示。
**プレビュー機能だけ見たい方は下ののJQueryを設定だけ読んでください**

####環境
ruby 2.5.7
rails 5.2.4.3
jQueryを設定できるようにしてある。

##画像投稿用gem
今回は「Refile：リファイル」を使用します。Refileは、アプリケーション向けのファイル・アップロードのライブラリです。
**Refileには、以下のような特徴があります。**

   ・画像を簡単に組み込むことができる。
   ・サムネイルを生成できる。
   ・ファイルのアップロード先を設定できる。

さらに今回は、サイズ調整など画像加工を行うgem（MiniMagick）も追加もしています。

```ruby:Gemfile
...
 
# 画像投稿用gem
gem "refile", require: "refile/rails", github: 'manfe/refile'
# 画像加工用（サイズ調整など）gem
gem "refile-mini_magick"
```
gemを追加したときは、bundle installコマンドを実行しましょう。

##画像用のカラムを追加しましょう！
画像を保存するためのカラムを追加します。
カラム名は、「image_id」のようにidを付けて設定します。（データ型はstringです）
以下のコマンドで、データーベースに反映しましょう

```ruby:
$ rails db:migrate
```

##attachmentメソッドを追加する
Refileを使うには、attachmentメソッドをモデルに追加する必要があります。
attachment（アタッチメント）メソッドとは、refileが指定のカラムにアクセスするために必要です。これによりDBに存在する画像を取得したりアップロードが可能となります。
カラム名はimage_idですが、ここでは_idをつけません。

```ruby:モデルに記述しましょう
attachment :image
```

##Strong Parametersに追加する
imageを追加してください。
>private の下に
def 任意の名前
  params.require(:モデル名).permit(:カラム名)
>end
今回はカラム名に **image**　が入ります

##ビューファイル設定
```ruby:new.html.rb
 <%= form_for(モデル,url:　url又はpathが入ります) do |f| %>

      <div class="item-image">
        <%= attachment_image_tag from_forで使用しているモデルが入ります, :image, class: "img-square", fallback: "no_image.jpg", size:"300x300" %>
      </div>

      <%= f.attachment_field :image, placeholder: "画像" %>
    </div>
　　<%= f.submit "登録"%>

```
##JQueryを設定
・今回はnew.htmlの下に<script></script>で書いて行きたいと思います。(ブレビューしたいhtmlに書いていただければ大丈夫です）
・app/assets/javascripts/application.jsに記述してもらってもできます。
その場合はscriptタグは消してください。
**・＄('#item_image')　$(".image")は対応するid　か　class名に変えてください**
**・＄('#item_image')はファイルを選択のid、を$(".image")は画像が表示される部分のclass名かid名**

```ruby:new.html.erb
<%= form_for(モデル,url:　url又はpathが入ります) do |f| %>

      <div class="item-image">
        <%= attachment_image_tag from_forで使用しているモデルが入ります, :image, class: "img-square", fallback: "no_image.jpg", size:"300x300" %>
      </div>

      <%= f.attachment_field :image, placeholder: "画像" %>
    </div>
　　<%= f.submit "登録"%>

---------ここから下追加--------------------------------------

<script>
$(function(){
    // inputのidから情報の取得
    $('#item_image').on('change', function (e) {
// ここから既存の画像のurlの取得
    var reader = new FileReader();
    reader.onload = function (e) {
        $(".image").attr('src', e.target.result);
    }
// ここまで
    reader.readAsDataURL(e.target.files[0]); //取得したurlにアップロード画像のurlを挿入
});
});

</script>


```
**ファイル選択のinputタグ内のidを指定、ファイル選択をクリックすると動作をする**
$('#item_image').on('change', function (e) {

**現在表示しているプレビュー画像のimgタグのclass指定、imgタグ内のscrをアップロード予定の画像に置き換える。**
    var reader = new FileReader();
    reader.onload = function (e) {
        $(".image").attr('src', e.target.result);
    }
    reader.readAsDataURL(e.target.files[0]);

###用語
**FileReader**： オブジェクトを使うと、ユーザーのコンピューター内にあるファイル (もしくはバッファ上の生データ) をウェブアプリケーションから非同期的に読み込むことが出来ます。

**attr**：　キーと値の組み合わせからなるハッシュオブジェクトを引数に渡し、全ての要素に複数の属性を同時に設定する。
uPD8279を使ってみた（LED編)

結局秋月の通販でカソードコモンの7セグとソースドライバーを手に入れて、作ってみました。

![写真（2020-06-14 15.02）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/2f0070c5-59b2-296e-262c-cbe3939b8996.jpeg)

138側は手持ちのトランジスタ(2SA)を使いました。コレクタ電流がちょっと小さいのですが、最近のLEDはカレント少ないので大丈夫でしょう。

この作業で2SAを画像検索したところ以下のような間違えた図が一番最初に出てきます。

![006_01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f7517e61-b8a5-e845-6619-405ac1a8e1ab.gif)

左の図のエミッタとコレクタが逆です。連絡したいのですが、連絡先がありません。誰か知ってる人いたら伝えてください。

あと8279の使い方でClearを1100CCFAと書いているページがあるのですが、正しくは110CCCFAです。

ネットって信用できないもんですね。

テストプログラムはこんな感じです。

```
;

TVCLR	EQU	036CH
TVDSP	EQU	02DEH

; 8279 ports

DAT	EQU	0EEH
CTL	EQU	0EFH

	ORG	8200H

	CALL	TVCLR
	MVI	A, 00H
	OUT	CTL
	MVI	A, 0A0H
	OUT	CTL
	MVI	A, 32H
	OUT	CTL
	MVI	A, 50H
	OUT	CTL
	MVI	A, 0D0H
	OUT	CTL
	MVI	A, 90H
	OUT	CTL

	IN	CTL
	STA	LAST
	CALL	DEBUG
	MVI	B, 08H
	CALL	PAD

LOOP
	LDA	LAST
	MOV	B, A
	IN	CTL
	CMP	B
	JZ	LOOP
	STA	LAST
	CALL	DEBUG
	LDA	LAST
	MVI	B, 07H
	ANA	B
	MVI	B, 00H
	CMP	B
	JNZ	DATIN
	MVI	B, 08H
	CALL	PAD
	JMP	LOOP

DATIN
	IN	DAT
	CALL	DEBUG
	MVI	B, 06H
	CALL	PAD
	LXI	H,SEG
	MVI	B, 00H
	LDA	COUNT
	MOV	C,A
	DAD	B
	INR	A
	MVI	B, 10H
	CMP	B
	JNZ	STCOUNT
	MVI	A, 00H
STCOUNT
	STA	COUNT
	MOV	A,M
	OUT	DAT
	JMP	LOOP

PAD
	PUSH	B
	MVI	A, 20H
	CALL	TVDSP
	POP	B
	DCR	B
	JNZ	PAD
	RET
	
DEBUG
	STA	VAL
	RRC
	RRC
	RRC
	RRC
	CALL	WRITE
	LDA	VAL
	CALL	WRITE
	RET

WRITE
	MOV	C, A
	MVI	B, 0FH
	ANA	B
	MVI	B, 0AH
	CMP	B
	JNC	ALPH
	ADI	30H
	CALL	TVDSP
	RET
ALPH
	SUI	0AH
	ADI	01H
	CALL	TVDSP
	RET

VAL	DB	0
LAST	DB	0

COUNT	DB	0
SEG	DB	3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 27H
	DB	7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
```

表示位置は90Hで設定していて、0番目でインクリメントありの設定です。

モニターでは使えませんが、任意のパターンが表示できるので、なにか面白い使い方を考えてみたいと思います。

40年らいのLED増設計画の夢が叶いました。

RESETはEX-80のバスは負論理で8279は正論理なのでGAL6001で反転して入れてみました。7404の1回路分です。RESETしても表示は残るようです。

```verilog
module ex80(
input i1,
output o1
);


assign o1 = ~i1;

endmodule
```
FlutterのTextFieldの入力値を外から取得する(GlobalKey)

毎度`onChanged`や`TextEditingController`を指定する(ひとつ親をStatefulにする)のもたるいので、何かないかと思って試してみました。

## 結論

GlobalKeyを使って取得する。

## 調査1: 離れた親に保存先を用意する(？)

`InheritedWidget`を使えばできそう。

参考: [InheritedWidget を完全に理解する 🎯](https://medium.com/flutter-jp/inherited-widget-37495200d965)

でも`StatefulWidget`も使うしコレはコレでたるい。

ただ、本文中に、下位ツリーへのアクセスはGlobalKeyを使うとよいとの記載があった。

## 調査2: GlobalKeyを使う

`abstract class GlobalKey<T extends State<StatefulWidget>> extends Key`
ということで、`TextField`をラップした`StatefulWidget`をまず準備する。
ついでなので、初期値も設定できるようにしておく。

```dart
class EasyTextField extends StatefulWidget {
  final String initialText; // 初期入力値

  EasyTextField({
    Key key,
    this.initialText,
    }) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return EasyTextFieldState();
  }
}

class EasyTextFieldState extends State<EasyTextField> {
  TextEditingController _controller;

  @override
  void initState() {
    super.initState();

    _controller = TextEditingController(text: widget.initialText);
  }

  @override
  void dispose() {
    _controller.dispose();

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: _controller,
    );
  }
}
```

つくったWidgetを使って画面をつくる。コチラはStatelessWidget。

```dart
class TextFieldTest extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final key = GlobalKey<EasyTextFieldState>();

    return Scaffold(
      appBar: AppBar(title: Text('TextFieldTest')),
      body: Center(
        child: EasyTextField(
          key: key,
          initialText: 'hoge',
          ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => print(key.currentState._controller.text),
      ),
    );
  }
}
```

コレで、`FloatingActionButton`を押した時点での入力値がログに出る。

## 調査3: GlobalKeyを派生する

もうちょっと短く書けないかやってみる。

```dart
class EasyTextFieldKey extends GlobalKey<EasyTextFieldState>{
  // デフォルトコンストラクタがfactoryコンストラクタで利用できないので
  // 名前コンストラクタ`constructor`を使う
  EasyTextFieldKey() : super.constructor();

  String get text => currentState._controller.text;
}
```

コレをうけて、`EasyTextField`も修正。

```dart
class EasyTextField extends StatefulWidget {
  final String initialText; // 初期入力値

  EasyTextField({
    @required EasyTextFieldKey key,
    this.initialText,
    }) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return EasyTextFieldState();
  }
}
```

最後に、画面全体。

```dart
class TextFieldTest extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final key = EasyTextFieldKey();

    return Scaffold(
      appBar: AppBar(title: Text('TextFieldTest')),
      body: Center(
        child: EasyTextField(
          key: key,
          initialText: 'hoge',
          ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => print(key.text),
      ),
    );
  }
}
```

なるほど、階層が深くないなら`GlobalKey`でいろいろできそう。
socketry/asyncめも

[puppeteer-ruby](https://github.com/YusukeIwaki/puppeteer-ruby)っていうライブラリを作っているときに、WebSocketのコールバック順序がぐちゃぐちゃになる事象に嫌気がさして、WebSocketの代替実装を探していたところ、
（ぜんぜんWebSocketではないがw）[async](https://github.com/socketry/async)という面白そうなライブラリを見つけたのでメモ。

## 複数のタスクを待ち合わせる

```rb
require 'async'

def do_task(name)
  Async do |task|
    puts "start task - #{name}"
    task.sleep(name.to_i)
    puts "end task - #{name}"
    name
  end
end

def all_task(*args)
  Async do |task|
    puts "start tasks - #{args}"
    values = args.map do |arg|
      do_task(arg)
    end
    puts "wait for tasks....."
    result = values.map(&:wait)
    puts "end tasks - #{result}"
    result
  end
end
```

all_task(1,2,3,4,5) を実行すると

```
start tasks - [1, 2, 3, 4, 5]
start task - 1
start task - 2
start task - 3
start task - 4
start task - 5
wait for tasks.....     # ここまで一瞬
end task - 1
end task - 2
end task - 3
end task - 4
end task - 5            # ここまで、1秒毎に
end tasks - [1, 2, 3, 4, 5] # ↑と同時
```

JSでいうところの `Promise.all` (せんぶまつ)はできるが、
`Promise.race` （どれか1つが終わるまで待つ）ができるかはまだ確かめていない。

あと、トップレベルでの実行（Async do ... endをしない状態）では、並列実行にならずタスクは直列実行された。
`Async do ... end` 内に限り並列実行されるようだ。

## Async::Queue

Promiseのように、誰かがresolveしてくれるまで待ち受けるようにしたいときは、Queueを使うとよさそう？

```
require 'async'
require 'async/queue'

def resolvable
  Async do |task|
    q = Async::LimitedQueue.new
    Async do
      puts "q start"
      result = q.dequeue
      puts "q end - #{result}"
    end
    task.sleep 3
    q << 3
  end
end
```

これも、外側の `Async ... end` を忘れると、内側の `Async...do` を待ち受けようとするため、このブロックが抜けられず、task.sleepまでたどり着かない。



　

ドキュメンテーションが若干弱いいけど、重厚なconcurrent-rubyに比べると単機能で手軽に使えて良さそう。
テキストエディタ関係webAPIリンク集


すべてmdnのリンクです
テキスト編集関係の挙動をいじろうとすると、かなりトリッキーなことになります。
このリンク集は選択範囲についての扱いが中心です。
これのほかにw3cとかも参考になる。

- Text
  - https://developer.mozilla.org/ja/docs/Web/API/Text
- Selection.extend()
  - https://developer.mozilla.org/ja/docs/Web/API/Selection/extend
- Selection.setBaseAndExtent()
  - https://developer.mozilla.org/en-US/docs/Web/API/Selection/setBaseAndExtent
- Range
  - https://developer.mozilla.org/en-US/docs/Web/API/Range
- DocumentOrShadowRoot.caretPositionFromPoint()
  - https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/caretPositionFromPoint
- HTMLElement
  - https://developer.mozilla.org/ja/docs/Web/API/HTMLElement
- Element
  - https://developer.mozilla.org/ja/docs/Web/API/Element
- フォーカスと選択
  - https://developer.mozilla.org/ja/docs/Archive/Mozilla/XUL/Tutorial/Focus_and_Selection
ガウス型基底関数（正則化項付きGIC)

```{r}

library(dplyr)

data=data.frame(y=c(0.20, 0.10, 0.49, 0.26, 0.92, 0.95, 0.18, 0.19, 0.44, 0.79, 0.61, 0.41, 0.49, 0.34, 0.62, 0.99, 0.38, 0.22,0.71,0.40),x1=c(84,87,86,85,82,87,92,94,88,84.9,78,90,88,87,82,84,86,83,85.2,82),x2=c(61,55.5,57,57,50,50,66.5,65,60.5,49.5,49.5,61,59.5,58.4,53.5,54,60,58.8,54,56),x3=c(24.5,24,23,22.5,22,24,25,26,25,24,23,21,26,25.5,24,23,24,24,24,22))

data[,colnames(data) %in% c("x1","x2")]=data[,colnames(data) %in% c("x1","x2")]/10

clusters=3;X=as.matrix(data[,colnames(data) %in% c("x1","x2")]);Y=data$y

data=data%>%mutate(clusters=kmeans(data,clusters)$cluster)

params=data%>%group_by(clusters)%>%summarise(x1=mean(x1),x2=mean(x2))

hs=data%>%group_by(clusters)%>%summarise(x1=sum((x1-mean(x1))^2),x2=sum((x2-mean(x2))^2),n=n())

hs=hs%>%mutate(h=(x1+x2)/n)

n=nrow(data)

B=array(0,dim=c(nrow(X),clusters))

for(j in 1:clusters){

vec=params%>%filter(clusters==j)%>%select(-clusters)

vec=as.numeric(vec)

pthi_vec=exp(-apply((t(X)-vec)^2,2,sum)/(2*hs$h[hs$clusters==j]))

B[,j]=pthi_vec

}

B=cbind(rep(1,nrow(B)),B)



GIC=function(ws,sig,lam){

K=diag(1,ncol(B));lam_mat=diag(c(Y-B%*%ws));sig=sig^2

R=cbind(t(B)%*%B+n*lam*sig*K,t(B)%*%lam_mat%*%rep(1,nrow(B)))

R=rbind(R,cbind((t(rep(1,nrow(B)))%*%lam_mat%*%B/sig),n/(2*sig)))

Q11=t(B)%*%(lam_mat^2)%*%B/sig-lam*K%*%ws%*%t(rep(1,nrow(B)))%*%lam_mat%*%B

Q12=t(B)%*%(lam_mat^3)%*%rep(1,nrow(B))/(2*sig^2)-t(B)%*%lam_mat%*%rep(1,nrow(B))/(2*sig)

Q21=t(rep(1,nrow(B)))%*%(lam_mat^3)%*%B/(2*sig^2)-t(rep(1,nrow(B)))%*%lam_mat%*%B/(2*sig^2)

Q22=t(rep(1,nrow(B)))%*%(lam_mat^4)%*%rep(1,nrow(B))/(4*sig^3)-n/(4*sig)

Q=rbind(cbind(Q11,Q12),cbind(Q21,Q22))

value=n*(log(2*pi)+1)+n*log(sig)+2*sum(diag(solve(R)%*%Q))

return(value)

}



w=rep(1,ncol(B))

lambda=1;sigma=1

ite=10^9

h=0.01;eta=10^(-4)

for(l in 1:ite){

vec=w

for(j in 1:length(w)){

vec_sub=vec;vec_sub[j]=vec_sub[j]+h

w[j]=w[j]-eta*(GIC(vec_sub,sigma,lambda)-GIC(vec,sigma,lambda))/h

}

lambda=lambda-eta*(GIC(w,sigma,lambda+h)-GIC(w,sigma,lambda))/h

sigma=sigma-eta*(GIC(w,sigma+h,lambda)-GIC(w,sigma,lambda))/h

#print(GIC(w,sigma,lambda))

}


plot(c(1:length(Y)),Y,xlab="index",ylab="values",xlim=c(1,length(Y)),ylim=c(min(c(Y,B%*%w)),max(c(Y,B%*%w))),col=2,type="o")

par(new=T)

plot(c(1:length(Y)),B%*%w,xlab="index",ylab="values",xlim=c(1,length(Y)),ylim=c(min(c(Y,B%*%w)),max(c(Y,B%*%w))),col=3,type="o")



```