OmniAICreator/Qiita-1.07M huggingface dataset:
Docker環境でNodeJSのライブラリsharpを使用するときの darwin-x64 エラー

MacでNode.jsのライブラリsharpを使用するときに darwin-x64 エラーが発生しました。
Docker環境のため、sharpの公式ドキュメントで書いた対処方法ですぐ解決できなかったのではまりました。

```
/var/www/xxxxx/node_modules/sharp/lib/libvips.js:68
    throw new Error(`‘${vendorPlatformId}’ binaries cannot be used on the ‘${currentPlatformId}’ platform. Please remove the ‘node_modules/sharp/vendor’ directory and run ‘npm install’.`);

Error: ‘darwin-x64’ binaries cannot be used on the ‘linux-x64’ platform. Please remove the ‘node_modules/sharp/vendor’ directory and run ‘npm install’.
    at Object.hasVendoredLibvips (/var/www/xxxxx/node_modules/sharp/lib/libvips.js:68:13)
    at Object.<anonymous> (/var/www/xxxxx/node_modules/sharp/lib/constructor.js:7:22)
    at Module._compile (internal/modules/cjs/loader.js:1200:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1220:10)
    at Module.load (internal/modules/cjs/loader.js:1049:32)
    at Function.Module._load (internal/modules/cjs/loader.js:937:14)
    at Module.require (internal/modules/cjs/loader.js:1089:19)
    at require (internal/modules/cjs/helpers.js:73:18)
    at Object.<anonymous> (/var/www/xxxxx/node_modules/sharp/lib/index.js:3:15)
    at Module._compile (internal/modules/cjs/loader.js:1200:30)
```

下記のように解決しました。
検証環境：macOS Catalina

#### 1. nodeのバージョンを揃えます。
MacのnodeのバージョンとDocker環境のnodeバージョンとメジャーバージョンを揃えます。
例えば、
プロジェクトのnodeのバージョンが v14.xx.xx であれば、Dockerfileで`FROM node:14`を指定。
※nodeのバージョンの制御にプロジェクト単位で設定できるnodenvの利用がおすすめです。

#### 2. Dockerコンテナに入ってsharpを再インストール
```
$ docker ps
$ docker exec -it xxxxx bash
$ rm -rf node_modules/sharp
$ npm install --arch=x64 --platform=linux sharp
```
自分の環境では、targetの指定が不要でした。
`$ npm install --arch=x64 --platform=linux --target=xx.xx.x sharp`



参考：
https://github.com/lovell/sharp/blob/master/docs/install.md
https://sharp.pixelplumbing.com/install#common-problems
https://qiita.com/mame_daifuku/items/1dbdfbd4897b34df0d9f

2022.2.9 追記：
Dockerイメージ作成時にリビルドする方法あります。
Dockerfile に下記1行を追加：

```
RUN npm rebuild sharp
```
Client-goでLabelSelectorを使って指定したラベルのPodのみを抽出したい

## やりかた
- metav1.ListOptionsの中で定義する
- LabelSelector以外にもいろいろある

## 該当部分
```golang
    pods, err := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{
        LabelSelector: "app=vamdemic111aaa-app",
    })
```

## 全体
```golang
package main

import (
    "context"
    "encoding/json"
    "fmt"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
    "log"
    "os"
    "path/filepath"
)

func main() {
    // Kubeconfigのファイルパスを指定
    kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube", "config")
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    if err != nil {
        log.Fatal(err)
    }

    // Kubeconfigを読み込む
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        log.Fatal(err)
    }

    // Pod一覧を呼び出す
    namespace := "default"
    pods, err := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{
        LabelSelector: "app=vamdemic111aaa-app",
    })
    if err != nil {
        log.Fatalln("failed to get pods:", err)
    }

    m := map[string]string{}

    for _, pod := range pods.Items {
       m[pod.Name] = string(pod.Status.Phase)
    }

    data, _ := json.Marshal(m)
    fmt.Printf(string(data))
}

```


## 参考
https://blog.nnn.dev/entry/2019/12/21/144550
クラス、メソッド、インスタンス変数の関係と命名(オブジェクト指向)

## 前提
#### クラス
クラスはオブジェクトであり、概念。
#### メソッド
メソッドはクラス(オブジェクト)の振る舞い。
#### インスタンス変数
インスタンス変数はクラスの属性、性質、状態を表すもの。

## 良い命名とは
基本的には`「クラス名＋メソッド名」と並べた際に英語として適切であれば良い命名`だといえる。
つまり基本はクラスが主語、メソッドが述語の関係。
もしくはクラスを操作対象のオブジェクトとみなした際の、命令形にしたときの対象となる。

例えば「モンスター」クラスに「攻撃する」というメソッドがあれば

```ruby
class Monster
  def attack
  end
end

monster = Monster.new
monster.attack
# モンスターは攻撃する
# モンスターよ、攻撃しろ！
```

のように命名すると良い。


## 命名を考える際に気をつけること
#### 関係性を理解し言葉にできるか
あるオブジェクトの振る舞いがメソッドで、その構成要素/属性/性質がインスタンス変数。この関係性をまずは理解する。

そして対象のモノ（物事、概念、その他オブジェクト）がどんな物なのかを的確にイメージし、それを言葉にする。
そしてそれは「誰がみてもそう」という妥当性が重要となる。

つまり`クラス名を見たときに、このクラスの内容を想像することができるか`を常に想像すること。
この際、Informationやdataなどの抽象度の高い命名はできるだけ避けるようにする。

#### オブジェクト↔メソッドを互いに想像できるか
`「名前(クラス、オブジェクト)からその内容(メソッド、インスタンス変数)を想像できること」「内容からその名前を想像できること」どちらも考える必要がある。`
するとメソッドやインスタンス変数が適切であるかもそこから見えてくる。


よって`良い変数名、メソッド名、クラス名というのは名前がその中身を正しく表している`といえる。
そしてその内容こそがそのクラス（オブジェクト）の責務と呼ばれるものになりうる。
Java テキストファイル（.txt  .csv）への出力　java.io.FileWriter

#１，データを文字列としてテキストファイルへ保存する方法
>➊**FileWirter fw = new FileWirter("ファイル名");**

>➋**fw.write("出力文字列");**

>➌**fw.close();**

#２，ソースコード（テキストファイルへ出力）
>for文を使って文字列を作り、テキストファイルへ保存

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/75874eac-9efd-5725-363c-4261ef75addc.png)
>キー入力された１行分の文字列を１レコードとしてテキストファイルへ出力

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/14edb24e-d714-c85a-596c-b7bf595be6f5.png)
>csvファイルへの出力方法

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/3517e548-e6a5-a973-79a2-f10d9ec1fcea.png)

#Java チュートリアル:clipboard:
:coffee: Java テキストファイル（.txt .csv）への出力　java.io.FileWriter : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2a101f159b1d8447d2cc "here")
:coffee:  Java テキストファイル（.txt .csv）からの入力　java.io.FileReader : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/31c677bb619e73b717a9 "here")
:coffee:  Java モニターからの入力　java.util.Scanner : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ece84972a49544916cac "here")
:coffee:  Java GUIからの入力　javax.swing.JOptionPane : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/c0b9a2bd9018131b2a48 "here")
:coffee:  Java Mathクラス　Math.sqrt : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/fc5500308a58c3f75887 "here")
:coffee:  Java 乱数の生成　java.util.Random : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ac357d0fa5b4f70acb9a "here")
:coffee:  Java Stringクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/17b6ea08650d9c8ae072 "here")
:coffee:  Java Wrapperクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6d2a8480587e40fee90a "here")
:coffee:  Java ArrayListクラス　java.util.ArrayList : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6478e5851e9a30d0d65c "here")
:coffee:  Java メソッド（method）の作り方とオーバーロード : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2b132cb5298f9fc97730 "here")
:coffee:  Java printf()メソッド : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/3e471b8006f9500ef3e4 "here")
:coffee:  Java オブジェクト（Object Oriented Programming）とコンストラクタ、スコープ（local,global） : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/488d41a259aa5a43f921 "here")
JavaScript勉強日記＃１

①確認ダイアログボックスの表示

・目的：下記のダイアログボックスを表示する
https://gyazo.com/3da5a0c50544d85af25c1c7cd4adce3b
https://gyazo.com/f9808943633140799071c34fea626e74

```index.html
  <script>
   if(window.confirm('ゲームスタート！準備はいいかい？')) {
    console.log('ゲームを開始します！');
  } else {
    console.log('ゲームを終了します。');
  }  
  </script>
```
 `window.confirm('message')`で表示できた。
alertメソッドとの違いはT/Fでリターンを返してくる事。

②テキストを持ったダイアログを表示
・目的：下記のダイアログの表示
https://gyazo.com/c24d08dedc4a761b0f2faea00317ae3e
https://gyazo.com/67b10557bbb964c2fbcf729268dc9fb0

`window.confirm('message')`で表示できた。
これは変数を用いる事で保存が可能になる。
例えば`let answer(変数名) = window.confirm('message')`と書けばこれ以降answerと書く事でmessageを取得できる。

③入力内容で動作を変更する
・目的：動作を条件分岐させたい

```index.html
const answer = window.prompt('ヘルプを見ますか？');
if(answer === 'yes') {
  window.alert('タップでジャンプ、障害物をよけます。');
}
```

constで生成された変数は後から上書きできない。
自分で作成したRubyのアプリを指定した場所から始まるように設定するには

modelやcontrollerを作成しているとして、

例えば、app/views/tweets/indexを最初に表示させたいとして

config/routes.rbに

Rails.application.routes.draw do
　root to: 'tweets#index'
　resources :tweets
end

と記述すれば最初に表示できる。

「root to:」は最初に表示させたいview(今回の場合は、'tweets#index')を指定できる。

「resources :〜」はその後に記述するviewに向けてのルートを作成してくれる。

道路に例えると、「resources」で道を作り、「root to」でその道を選ぶという感じです。
IBM Cloud: VPC Custom Routesの切り替えスクリプト・サンプル

#はじめに
[IBM Cloud: VPC Custom Routesを利用したAZまたぎのHA環境の構成例(VPC内部からのアクセス）](https://qiita.com/testnin2/items/95d539f0e08a0f14788c)という記事を書いたが、この経路変更を障害時に手動で行うわけにはいかないので、自動実行できるように切り替えのスクリプトを書いてみた。

#スクリプトサンプル

`ibmcloud_apikey`というファイルにAPI Keyを記載しておく。

```shell:vpcrouteswitch.sh
#!/bin/sh
#Usage example: ./vpcrouteswitch.sh 10.1.0.7

#Environment
export LANG=C
VPC_ID=r022-85621b2c-a349-4ae6-87e3-767ddeac7298
ROUTING_TABLE_ID=r022-904f9ad6-86b7-42fc-959a-c17a80c60577
ZONE1=jp-tok-1
ZONE2=jp-tok-2
ZONE3=jp-tok-3
DELETE_NEXT_HOP1=10.0.0.7
DELETE_NEXT_HOP2=10.1.0.7
NEXT_HOP=$1
DESTINATION_CIDR=192.168.10.10/32

#Variables Check
if [ $# -ne 1 ]; then
  echo "Sorry, we had a problem there!"
  exit 1
fi

#Login
ibmcloud login -a cloud.ibm.com --apikey @ibmcloud_apikey -r jp-tok

#LIST EXISTING ROUTE
ROUTE_IDS=$(ibmcloud is vpc-routing-table-routes ${VPC_ID} ${ROUTING_TABLE_ID} | grep -e ${DELETE_NEXT_HOP1} -e ${DELETE_NEXT_HOP2} | awk '{print $1}')
echo ${ROUTE_IDS}

#DELETE ROUTES
ibmcloud is vpc-routing-table-route-delete ${VPC_ID} ${ROUTING_TABLE_ID} $(echo ${ROUTE_IDS}) -f


#CREATE NEW ROUTES
ibmcloud is vpc-routing-table-route-create ${VPC_ID} ${ROUTING_TABLE_ID} --zone ${ZONE1} --destination ${DESTINATION_CIDR} --next-hop ${NEXT_HOP} --action deliver
ibmcloud is vpc-routing-table-route-create ${VPC_ID} ${ROUTING_TABLE_ID} --zone ${ZONE2} --destination ${DESTINATION_CIDR} --next-hop ${NEXT_HOP} --action deliver
ibmcloud is vpc-routing-table-route-create ${VPC_ID} ${ROUTING_TABLE_ID} --zone ${ZONE3} --destination ${DESTINATION_CIDR} --next-hop ${NEXT_HOP} --action deliver

```

# 実行例

```txt:10.1.0.7に切り替えたい時。
# ./vpcrouteswitch.sh 10.1.0.7
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/b7ec5839-e590-8458-2eea-1b9f37e11eaa.png)
Rubyで文字列を反転させる方法はreverse

ruby 2.7.0についての記事です

- reverse 文字列を文字単位で左右逆転した文字列を返す<br>
<a href="https://docs.ruby-lang.org/ja/latest/method/String/i/reverse.html">公式ドキュメントStringクラスreverse</a>
- revers 配列でも使える　<br>
<a href="https://docs.ruby-lang.org/ja/latest/method/Array/i/reverse.html">公式ドキュメントArryクラスreverse</a>

```ruby
s = "string".reverse # stringクラスで使う場合
puts s # => gnirts

arry = ["a","b","c"]　# arryクラスで使う場合
print arry.reverse # => ["c","b","a"]
```
ドラクエ５の結婚イベントを考える

結婚する相手毎にメッセージを変更する。

```ruby:index.html.rb
<script>
  'use strict';
  if(window.confirm('ビアンカと結婚しますか？')) {
    window.alert('偽善者が！！！');
  } else {
    if(window.confirm('フローラと結婚しますか？')) {
    window.alert('金の亡者が！！！！');
  } else {
    if(window.confirm('デボラと結婚しますか？')) {
    window.alert('性欲猿が！！！');
  } else {
    window.alert('一生独身決定！！！');
  }}}
</script>  
```

コードの内容は`window.confirm()とwindow.alert()、条件式if(){}`だけなのでとてもシンプルです。
ドラ○エらしくYes/Noで作りたかったのでこの形を取りました。
`windows.prompt()`を使えばもっと短く表現できるのであとで追記しようかと思っています。

ちなみに私はフローラを選びました（笑）
M5StickC PlusのArduino開発環境構築メモ

# はじめに
* 2020/11/24現在、M5StickC PlusについてはArduinoのライブラリマネージャからインストールできない。
* 以下のinclude文をコンパイルすると``M5StickCPlus.h: No such file or directory``になってしまうため、自分でGitHubからダウンロードしたものをインストールする必要がある。
* 公式で対応されるのをしばらく待ってたが、全然対応しそうに無いのでやり方をまとめておく。

```
#include "M5StickCPlus.h"
```

# インストール手順

## ライブラリの入手
* [https://github.com/m5stack/M5StickC-Plus](https://github.com/m5stack/M5StickC-Plus) からZipファイルをローカルにダウンロード。
 * 「Code」のリンクから「Download ZIP」を選択。
 * 任意のディレクトリに保存。

![スクリーンショット 2020-11-24 22.22.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/f7da0bb7-776f-fac8-c220-5ef4953afe89.png)


## Arduino IDEを起動

* 「スケッチ」--> 「ライブラリをインクルード」 --> 「.ZIP形式のライブラリをインストール」
 * 先ほどダウンロードしたディレクトリを選択。
 * Arduino IDEにライブラリが取り込まれる。

![スクリーンショット 2020-11-24 22.28.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/d9c0e2b9-6fa9-2779-7a39-d867656da8be.png)

* これで、ライブラリがインストールされる。

# サンプルコードのコンパイル＆実行
* 「ファイル」 --> 「スケッチ例」にM5StickCPlusが出てくるので、FactoryTestを開く。

![スクリーンショット 2020-11-24 22.32.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/e3c58c83-63a6-c894-3813-b86e9822775f.png)

* 普通にコンパイルできる。
【CentOS8】ConoHa登録からVPSにログイン

初投稿です。よろしくお願い致します。
新卒入社して半年、「エンジニアなら自分のプロダクトを公開したい！」という思いから、学生自体にお世話になったバイト先のWEBサイトを公開することにしました。

その際のVPSログインまでの作業ログを共有いたします。

# 環境
PC: MacBookPro
VPS: ConoHa
CentOS: 8.2.2004
docker-compose: 1.27.4
Docker: 19.03.13
nginx: 1.19.4
vue-cli: 4.5.8
npm: latest(作業時:15.2.0)

#ConoHa登録
https://www.conoha.jp/vps/
![_2020-10-25_15.23.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613007/9235ab65-4d85-1ff8-ffc6-0f964ed8a187.png)
###新規登録
![signup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613007/9e697f2d-d321-3c7a-58c4-5a46e2e7b15b.png)

###登録後
私は下から二番目のグレードの「memory:1GB」を選択
OSはCentOS8にしました。
右側の値段は、デフォルトでは、三ヶ月分まとめ払いが選択されていますが、
一ヶ月ごとの支払いに変更することもできます。
しかし、まとめ払いがお得みたいです。
ここで、rootパスワードとネームタグを入力しましょう。
※rootパスワードはVPSに接続するために必要です。必ずメモしましょう！
※また、この時SSH Keyを作成できるはずだったのですが、私は作成し損ねてしまったので、自力で作成していきます。
![screencapture-manage-conoha-jp-Wizard-Create-2020-10-25-05_49_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613007/92af7e5e-6596-e216-c129-cd4084a25b2e.png)

###コントロールパネル
コントロールパネルはこんな感じです。
自分が作成したVPSが一覧で確認できます。
![スクリーンショット 2020-11-19 22.31.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613007/60c0fc4a-8fe6-9fb4-37ac-9e15db642a67.png)

ネームタグをクリックすると、サーバの詳細が確認できます。
ここで、VPSのIPアドレスを確認しておきましょう。
![スクリーンショット 2020-11-19 22.34.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613007/18bdf9af-e219-44ae-1948-80911a6a60eb.png)

#VPSにリモートアクセス
rootでSSH接続していきます。
今回はMacのTerminalでの接続を想定しております。
Windowsの方は、Teratermなどで接続されることをお勧めします。

```
ssh root@ipアドレス

The authenticity of host '(IPAddress) ((IPAddress))' can't be established.
ECDSA key fingerprint is (...).
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '(IPAddress)' (ECDSA) to the list of known hosts.
root@(IPAddress)'s password: #初めに設定したrootパスワードを入力
```

※基本的に、パスワード入力をしても、画面上に表示されません。
しかし、文字は見えないだけで入力されています。
注意して入力しましょう。

このように表示されれば、リモートアクセス成功です。

```
[root@(IPアドレス) ~]# 
```

#次回：セキュリティ対策
Vue CLIで作成したSPAをConoHaで公開するまで②(セキュリティ対策編)
https://qiita.com/kkabosu386/items/42b55c55e94027d53674
サーバに接続して、早速アプリケーションの環境を立ち上げたいところですが、
まずはセキュリティ対策をします。

とはいえ、新卒研修でも行うぐらい作業自体は難しいものではありません。
(法人レベルになると、もっと高度な対策が求められると思われますが…)

地道に進めていきます。

#参考・引用
https://qiita.com/mkoku/items/ea107a29fd925081ebcf
vscodeでRをいい感じで使えるようにする

Windows 10上のvscodeでRをいい感じに使うための設定メモ．

(1) Rで`languageserver`をインストール

```R
install.packages("languageserver")
```
(2) vscodeでRエクステンションをインストール
(3) vscodeでR LSP Clientをインストール
(4) pythonでradianをインストール

```py
pip install -U radian
```
(5) vscodeの`settings.json`に以下を追加．

```json
    "r.bracketedPaste": true,
    "r.rterm.windows": "*Path to radian.exe*",
    "r.lsp.path": "*Path to R.exe*",
    "r.lsp.debug": true,
    "r.lsp.diagnostics": true,
    "r.rterm.option": [""],
    "r.sessionWatcher": true,
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629005/de95cebf-ef15-c240-0f23-6514258006cd.png)





【参考】
- [vscode R extension by Yuki Ueda](https://marketplace.visualstudio.com/items?itemName=Ikuyadeu.r)
- [R LSP Client](https://marketplace.visualstudio.com/items?itemName=REditorSupport.r-lsp)
- [randy3k/radian](https://github.com/randy3k/radian)
- [A fresh start for R in VSCode](https://medium.com/analytics-vidhya/a-fresh-start-for-r-in-vscode-ec61ed108cf6)
コンピュータやWEBについて一から学んでみる試み

## はじめに
Qiita初投稿です！はるあきと言います！
高校卒業が近づくにあたり就職活動を本格化させているのですが、この際基礎的な知識を一から学んでみたい考え自分なりに調べてここにまとめようと思います
もし間違っている箇所などあればご指摘頂けると幸いです

## コンピュータ
コンピュータとは、ユーザーの指示に従って複雑な計算を自動的に行う機械
デジタルデータの入出力、演算、制御などを行う
コンピュータを動作させるのに必要となるソフトウェアをオペレーティングシステム(OS)と呼び
特定の作業を行うために必要なソフトウェアを、アプリケーションソフトウェアと呼ぶ

## ホームページ
本来の意味はウェブブラウザを起動した時に表示されるウェブページなどの画面(ページ)
ウェブサイトのメインページ(トップページ)のことを指す場合もある

## ウェブページ
ウェブ上にあり、ウェブブラウザで閲覧可能なページ単位の文書のこと

## ハイパーテキスト (hypertext)
複数の文書(テキスト)を相互に結びつける仕組みである
テキストを超えるという意味からハイパーテキストを名付けられた
テキスト間を結びつけるリンクのことをハイパーリンクと言う

## HTML(Hyper Text Markup Language)
ハイパーテキストを記述するためのマークアップ言語
CSSなどのスタイルシートで見た目を装飾することができる

## インターネット
複数のコンピュータを相互接続した、グローバルなネットワーク(地球規模の情報通信網)

## WEB
インターネット上で提供されているハイパーテキストシステム
相互リンクされたウェブページはインターネットの力によって世界中を駆け巡った
文書間のつながり方がくもの巣を連想させることから、世界に広がるくもの巣を意味する「World Wide Web」と名付けられた
World Wide Webの最後の文字を取って「WEB」と呼ばれる

## 最後に
基礎的と言ってもどの辺を学んでおけばいいのかまだ分かりませんが、必要そうな知識をまとめました！
お役に立てれば幸いです

追記
Qiitaの使い方がまだよく分かっておらず、教えて下さった方には本当に感謝致します！
(編集リクエスト画面でそのまま送ってしまったのでこちらでコメントさせて頂きます…！)
LaravelにVuetifyを追加したらChromeでDevTools failed to load SourceMap

###LaravelにVuetifyを追加してChromeで表示したら下記のようなエラーが。
![vutifyのmapが見つからない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632987/132a59b4-3077-6bd3-7ad4-6a0b2a7baa34.png)
.mapファイルが見つからないっていうことみたいです。

```
npm install vuetify
```
でインストールした時に、
node_modules\vuetify\dist\vuetify.js.map
というファイルが出来ているので、このファイルを
/public/js
の下に配置してあげて解消。
Udemy フルスタック・Webエンジニア講座　セクション5.jQuery

<html lang="ja">
<body>
<h1>jQueryとは</h1>
jQueryとは、JavaScriptで作成されたライブラリで、JavaScriptの書き方などを簡単にすることが出来る。実際、私がJavascriptを勉強した後にjQueryを学習してみると、Javascriptよりコードを書く量が少なく、簡単に書くことが出来た。

<h1>clickの使い方</h1>


**click**のメソッドは、要素をクリックすることでイベントを呼び出すことが出来る。

```javascript:test.js
$("#circle").click(function(){
    alert("円がクリックされました！");
});
```
上のようなコードを書くと、円("#circle")をクリックすることで『円がクリックされました！』というアラート(alert)を呼び出すことが出来る。

```javascript:test.js
$("#circle").click(function(){
    $("#circle").fadeOut("slow");
});
```
上のようなコードを書くと、円が徐々に消えていくイベントをつくることが出来る。"slow"の他に"nomal"や"fast"を使うことで文字の消えていく速さを変えることが出来る。

<h1>jQuery UI</h1>
**jQuery UI**では、ユーザーインターフェイスの相互作用、効果、ウィジェット、およびテーマのセット参考にできる。起こしたいイベントをjQuery UIから探して参考にすれば、効率的にコードを書くことが出来るだろう。
[jQuery UIのページ](https://jqueryui.com/)

他にも、jQuery日本語リファレンスというページもjQueryの構文が書いてあるので参考にしてみよう。
[jQuery日本語リファレンスのページ](http://semooh.jp/jquery/api/events/click/_/)

<h1>よく出たエラー</h1>
要素の中身を()や{}で囲い忘れてしまい、エラーがよく出た。しかし、前回の反省でインテンドをそろえていたのですぐに修正することが可能であった。やはりコードを書く際は綺麗さを重視することが大事なのだと再認識した。

<h1>最後に</h1>
プログラミングの勉強をしていく中で、これから自分は将来どうしていくかどうかのキャリアを考えてみた。私は現在大学三年生であり、周りの同年代の友人はインターンシップなどの就職活動を本格的に始めている。とりあえず私は現在のインターン先で提示されている課題を取り組み、プログラミング技術の向上を図りたい。そして、大学四年生でWeb系企業に内定をもらえるよう努力する。そして就職した後、そこの企業で実務を経験し、より自らのスキルを強化する。これを実現。
また、どのプログラミング言語を中心にやっていくかどうかは、まだ、プログラミングを深く学んでいないので、現時点でははっきりとは言えない。なのでこれから勉強を進めていく中で自分がなにがしたいのか決定できるようにしたい。

今回の講座はフルスタック・Webエンジニア講座セクション5.jQueryです。
[フルスタック・Webエンジニア講座](https://www.udemy.com/course/completeweb2_jp/learn/lecture/4969902#overview)
jQueryを使うことでJavascriptをそのまま使うより簡単にコードを書けるようになりました。

最後に
現在ここでインターンしています。
まだまだ駆け出しですが頑張ります！やる気は人一倍です！
https://senren.work/

</body>
Shellコマンド一発で線形回帰

# モチベーション
データ解析をしていると、ちょっとしたタイミングで回帰分析をしたくなると思います。バイオや経済などの分野を専攻している人なら特にそうでしょう。そんな時にいちいちRstudioやPycharmなどの統合開発環境を開くのは少々骨が折れます。そこで、そんな面倒くさがりな人向けに、コマンド一発で回帰分析ができるスクリプトを用意しました。

忙しい研究者の皆様の一助になれば幸いです。

# CSVをRに読み込ませ、lm関数を適用
処理の内容は、タイトルの通りです。メインの部分はRが動いています。重回帰分析にも対応するために、3番目以降の引数を読み込ませるところが少し難しかったです。それ以外は普通のshell scriptとRのscriptです。

```{lm.sh}
#! /bin/bash 

csv_path=$1
Y_col=$2
X_cols=(${@:3:($#-2)})

echo Target Variables : $Y_col

X_cols_quoted=()
for ((i=0 ; i < ${#X_cols[*]} ; i++)) ; do
		X_cols_quoted+=(\'${X_cols[i]}\')
done

X_cols_quoted=`echo ${X_cols_quoted[@]} | tr " " ","`

echo Explanatory Variables : $X_cols_quoted

Rscript -e "\
df <- read.csv('$csv_path', row.names=1);\
X <- df[, c($X_cols_quoted)];\
y <- df[, '$Y_col'];\
analyze_df <- data.frame(cbind(y, X));\
colnames(analyze_df) <- c('$Y_col', $X_cols_quoted);\
res <- lm($Y_col~., data=analyze_df);\
summary(res);\
"


```

# 準備
コマンドラインを開き、下記。

```
vim /usr/local/bin/lm
```
`lm.sh`の内容をコピペしましょう。コピペし終わったら、`Escキー+wq:`

`chmod`も忘れずに。


```
chmod 700 /usr/local/bin/lm
```

# 使い方
これだけです。`y-name`は目的変数の名前、`X-name1`,`X-name2`,...,は、説明変数の名前を入れてください。

```
lm [path-to-csv] [y-name] [X-name1] [X_name2] ・・・
```

Bashで叩く必要があります。Zshの場合はインクリメントの部分や配列のインデックス関係で修正が必要です。
動かない等あったらコメントください。
また、もっと効率的な処理等思いつく人は教えていただけると幸いです。
Rails 掃除提案アプリのアルゴリズム

#はじめに
オリジナルアプリとして掃除提案アプリを開発しました。その際、苦労したところを忘れずに書き記します。

#目次
1.掃除提案機能の説明
2.必要なカラムとその型
3.Rubyのコード

#1.掃除提案機能の説明
予め掃除箇所の情報を登録する。登録情報に応じて、毎日どこを掃除すれば良いか提案する機能である。なお登録情報は下記3つ。
・掃除箇所名
・掃除頻度(○日に一回掃除する)
・最後に掃除した日付

提案のアルゴリズムとしては下記の通り。
①最後に掃除した日付と今日の日付から経過日数を算出する
②経過日数と掃除頻度を比較する
③結果に応じてtrueもしくはfalesを返す。
④falseとなった場合、提案(画面に表示)する。

#2.必要なカラムとその型
必要なカラムと型を下記に示す。状態は上記のtrueもしくはfalseが入るboolean型のカラムである。

|登録情報        |カラム名            |   型   |
|---------------|------------------|-------|
|掃除箇所        |place             | string|
|清掃期間        |period_cleaning   |integer|
|最後に清掃した日付|last_cleaned_date |date   |
|状態           |status            |boolean|

マイグレーションファイルの記述も下記に示す。

```ruby:2020***********_create_suggestions.rb
class CreateSuggestions < ActiveRecord::Migration[6.0]
  def change
    create_table :suggestions do |t|
      t.string :place, null: false
      t.integer :period_cleaning, null: false
      t.date :last_cleaned_date, null: false
      t.boolean :status, null: false
      t.timestamps
    end
  end
end
```

#3.Rubyのコード
改めて提案のアルゴリズムを下記に示す。
①最後に掃除した日付と今日の日付から経過日数を算出する
②経過日数と掃除頻度を比較する
③結果に応じてtrueもしくはfalesを返す。
④falseとなった場合、提案(画面に表示)する。


①〜④までのコードを下記のようにした。はじめにフォームから送られた掃除箇所の情報をインスタンス変数に代入する。次に変数this_dayに今日の日付を代入する。ここから①の経過日数を算出する(3行目：this_day - @suggestion.last_cleaned_date)。最後に掃除頻度(@suggestion.period_cleaning)to
経過日数(num_days)を比較し、trueもしくはfalseを状態(status)に代入する。

```ruby
def create
  @suggestion = Suggestion.new(suggestion_params) #suggestion_paramsはストロングパラメータ
  this_day = Date.today
  num_days = (this_day - @suggestion.last_cleaned_date).to_i
  @suggestion.status = !(@suggestion.period_cleaning <= num_days)
end
```

以上
VSCode(Visual Studio Code)をターミナルから起動しよう！


# はじめに
以前から毎回VScodeをDock（Macの下のアプリ一覧）から選択するのって面倒だなぁと思ってたんですよ。そこでターミナルから開くやり方が他のエディタだとあることを知ってVScodeにもあるんじゃないかと思って調べたらすぐに見つかりました（笑）
なので今回はその方法をご紹介したいと思います。

# やり方
1.まずはVScodeを開いてください。
2.command(⌘) + shift + P を押してください。
3.するとコマンドパレットが出るので（画像参照）`Shell`と入れてください。
<a href="https://gyazo.com/e6a97bd74bfe4a3f76aaf1a71a1c02fe"><img src="https://i.gyazo.com/e6a97bd74bfe4a3f76aaf1a71a1c02fe.png" alt="Image from Gyazo" width="634"/></a>
4.すると<font color=blue>「シェルコマンド：PATH内に'code'コマンドをインストールします」</font color>という項目があるので選択します。（画像参照）
<a href="https://gyazo.com/a1ea5ef5a444842da65aafee3c42829c"><img src="https://i.gyazo.com/a1ea5ef5a444842da65aafee3c42829c.png" alt="Image from Gyazo" width="602"/></a>

5.インストール完了メッセージが出れば完了です。（画像参照）
<a href="https://gyazo.com/a02896ce695724d2a6644bfe4fdb937b"><img src="https://i.gyazo.com/a02896ce695724d2a6644bfe4fdb937b.png" alt="Image from Gyazo" width="493"/></a>

6.あとはターミナル上で`code`と入力するとVScodeが起動します。
（下記参照）

```zsh

code
>【VScodeが普通に起動する】

code .
>【VScodeが今いるカレントディレクトリの内容で起動する】

code <ディレクトリ>/<ファイル名>
>【VScodeが指定したファイルで起動する】
```

# おわり
以上になります。
本当に簡単に導入出来て作業効率アップするので知らなかった人は是非ともやってみて下さい:blush:

# 参考にさせて頂いたサイト
- [ターミナルからVisual Studio Codeを起動する方法【公式の方法】](https://qiita.com/naru0504/items/c2ed8869ffbf7682cf5c)
- [ターミナルからVisual Studio Code を起動](https://techblog.recochoku.jp/5939)
f文字列内部にDict形式を挿入できなかった

##f文字列内部にDict形式を挿入できなかった
```python
in_folder=r"C:\Test"
name={
    "OK":r"OK.csv",
    "NG":r"NG.csv",
}
#NG
print(f"{in_folder}\{name["NG"]}"))#シンタックスエラー
print(f"{in_folder}\{name[`NG`]}"))#シンタックスエラー

#OK
OK_file="OK"
print(f"{in_folder}\{name[OK_file]}"))#"C:\Test\OK.csv"
print("{}\{}".format(in_folder,name["OK"]))#"C:\Test\OK.csv"

```

文字列はだめだったりするのかもしれない
【AWS】SysOpsアドミニストレーター-アソシエイト(SOA)合格記

#はじめに
AWS認定試験-SysOpsアドミニストレーター-アソシエイト(SOA)に合格した(2020-08-10)ので、合格までの道のりを残しておこうと思います。
CLF合格記は以下をご覧ください。
[【AWS】クラウドプラクティショナー(CLF)合格記](https://qiita.com/nnydtmg157/items/6c66a23d6b4c544cfcb2)

SAA合格記は以下をご覧ください。
[【AWS】ソリューションアーキテクト-アソシエイト(SAA)合格記](https://qiita.com/nnydtmg157/items/5705410a0b31f1d5a89d)

SOAはSAA合格後すぐに勉強を始めました。

#What's SOA?
まずは、SOA試験について
[AWS 認定 SysOps アドミニストレーター – アソシエイト](https://aws.amazon.com/jp/certification/certified-sysops-admin-associate/)

上記サイトによると、認定によって検証される能力は以下のようです。

* スケーラブルで、高可用性および高耐障害性を備えたシステムを AWS でデプロイ、管理、運用する
* AWS との間のデータフローを実装および制御する
* コンピューティング、データ、セキュリティ要件に基づく適切な AWS のサービスを選択する
* AWS 運用のベストプラクティスの適切な使用方法を識別する
* AWS の使用コストを予測し、運用コストコントロールメカニズムを識別する
* オンプレミスワークロードを AWS に移行する

SOAはSAAよりも運用を重視した問題が多かった印象です。
ログ監視や、移行設計(snowballかDirectconnectか等)が問題としては出ました。
難易度的にはSAAよりも簡単だった印象があります。

#試験に向けて
基本的にはSAAと同じ手法をとっていきました。(研修への参加はしていません。)
#試験に向けて
###公式サンプル問題
これはCLFと変わらず事前に受けて現状のレベルの確認をします。
私は60％ほどの出来でした。

###ホワイトペーパーを読む
CLFと同じくホワイトペーパーを読みました。

###Black Beltを読む
こちらもCLFと同じくBlack Beltを読みました。

###問題を解く
[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)

こちらのサイトは一問ごとに解説が表示され、都度確認ができ、BlackBeltやホワイトペーパーへのリンクもあるので、勉強しやすかったです。

#試験当日
上記対策を計2週間(延べ20時間程度)行い、試験に臨みました。

結果は、731点(720点以上で合格)で合格でした。


#感想
SAAよりも移行関係や、データセンターとの接続方法、コストに関する問題が多めでした。
基本的に出題されるサービスに関して、SAAから新しいものがあるとは言えませんので、SAAの勉強の流れで運用に重点を置いた解答を選べるようになればいいと思います。

問題集などで試験に応じた解答を選択できるようになれば良いかと思います。
cx_Freezeでjanomeを使ったプログラムをエグゼ化する。

昔、仕事中楽したいことがあってjanomeをインストールし、exe化しようとしてハマったところを思い出しながら書いた記事です。
そのためやや古い情報になっているかもしれません。
# 環境
+ Windows10 pro
+ python 3.8.5
+ Cx-Freeze 6.2
+ janome 0.4.0

#pyinstallerではだめだったのか。
調べてみると pyinstaller を使ってエグゼ化するものはあったものの Cx-Freeze はなかった、しかしGUIを入れる必要があったのでそれを搭載した状態でpyinstallerにてビルドしようとしたところ、なぜかまともにできなかったのでCx-Freezeを使うことにした次第です。

## 普通にsetup.pyを書いてビルドに成功、かと思いきや。
何やらエラーが発生、なぜならば
**Cx-Freezeがjanome の中のsysdicを引き出さずにビルドしたからです。**
しょうがないのでjanome のsysdicを手動で

exe.win-amd64-3.8/lib/janome/

にコピーして解決しました。

# 参考にさせてもらった記事

[パワポエンジニアの憂鬱を軽減する誤字/表記揺れ検出ツールを作った物語](https://qiita.com/youwht/items/062c41c88829fcf25107)
[Janome を Pyinstaller で exe 化するときのエラー(外部サイト)](https://haruka0000.hatenablog.com/entry/2018/12/30/173953)
正直彼らがいなければ詰んでいました。
Rubyの演算優先順位

Rubyでの演算処理は、以下の優先順位に従って実行される。

```
優先順位：高

::
[]
+(単項),　!,  ~
**
-(単項)
*,  /,  %
+,  -
<<,  >>
&
|,  ^
\>,  >=,  <,  <=
<=>,  ==,  ===,  !=,  =~,  !~
&&
||
..,  ...
?:(条件演算子)
= (+=,  -=,  ...等も含む)
not
and,  or

優先順位：低
```
配列内の文字列を置換する

#配列内の文字列を置換したい

userNameをたけしくんにする覚えがきです


```index.js
const array = ["userNameくんかっこいいよね","userNameくんどこに住んでるの" ,"userNameくん乳首透けてるよ"]
```

``` index.js
  //配列を展開
  array.forEach((text) => {
    //指定した文字列が入っているか判断する(userName)
      const stringInUserName = text.includes("userName");
      if (stringInUserName) {
　　//tureならuserNameをたけしくんにする
        text = text.replace("userName", "たけし");
      }
      return text;
    });
```

```index.js
  たけしんくんかっこいいよね　たけしくんどこにすんでるの　たけしくん乳首透けてるよ
```


以上
requestspecでlet!を使用する

requestspecを使ってコントローラーテストを行っていたのですが、let!の使い方に関して不明点があったため、記録として残しておきます。
letを始めRSpecに関する基礎的な文法についてはこちらの記事を参考にさせていただきました。
[使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」](https://qiita.com/jnchito/items/42193d066bd61c740612)

##開発環境
rails (6.0.3.3)
rspec-rails (4.0.1)

## 疑問内容
####なぜletではなくlet!なのか。

destroy以外では``:laundry``に対してletで通ったのですがdestroyアクションの時だけテストが通らずlet!にするとテストが通ります。
挙動としては以下を想定しています。

- 管理者(admin: true) → 削除を実行
- 管理者以外(admin: false) → 削除は行われずトップページにリダイレクトする

コードは以下のとおりです。(該当箇所のみ抜粋しています。)



```ruby:requestspec

describe '#destroy' do
    let(:admin_user) { FactoryBot.create(:user, admin: true) }
    let(:user) { FactoryBot.create(:user, admin: false) }
    #この部分がなぜlet!になるのか
    let!(:laundry) { FactoryBot.create(:laundry) }

    context '管理者の場合' do
      it '店舗情報を削除できること' do
        sign_in admin_user
        expect {
          delete laundry_path(laundry)
      }.to change { Laundry.count }.by(-1)
      end
    end

    context '認可されていないユーザーの場合' do
      it '店舗情報を削除できないこと' do
        sign_in user
        expect {
          delete laundry_path(laundry)
        }.to_not change { Laundry.count }
      end
    end
  end
```

##結論
###deleteアクションを実行する前にデータをセットしておくため。

処理実行の流れとしては以下のとおりです。
1.``Laundry.count``が実行される(処理実行前のデータの数を確認)
2.expect { ... }が実行される(削除の実行)
3.Laundry.countが実行される(削除実行後のデータの数を確認)

先ほどのコードと処理実行の流れを照らし合わせながらみていきます。

- let(遅延評価)にした場合

```ruby
　　 let(:admin_user) { FactoryBot.create(:user, admin: true) }
    let(:user) { FactoryBot.create(:user, admin: false) }
    let(:laundry) { FactoryBot.create(:laundry) }

　　　context '管理者の場合' do
      it '店舗情報を削除できること' do
        sign_in admin_user
        expect {
          delete laundry_path(laundry)
      }.to change { Laundry.count }.by(-1)
     end
    end
```


1.``Laundry.count``が実行される(処理実行前のデータの数を確認)
　→ ``FactoryBot.create(:laundry)``は実行されていないため``Laundry.count``は０
2.expect { ... }が実行される(削除の実行)
　→ ``delete laundry_path(laundry)``でデータは作成されるが削除されるためこちらも``Laundry.count``は０
3.Laundry.countが実行される(削除実行後のデータの数を確認)
　→ 予想は１つデータが減っているはず``（to change { Laundry.count }.by(-1)）``だが、上記１．２からデータ数に変化はないためエラーが発生する。

エラー内容 

```
 expected `Laundry.count` to have changed by -1, but was changed by 0
```

削除できないことを確認したい場合も同様の流れでエラーが発生します。

```ruby

it '店舗情報を削除できないこと' do
   sign_in user
   expect {
     delete laundry_path(laundry)
   }.to_not change { Laundry.count }
end
```

1.データは作成されていないため``Laundry.count``は０
2.expext{}で削除を行うが管理者ではないため削除は実行されない``（Laundry.countは1）``
3.``to_not change { Laundry.count }``でデータ数は変わっていないことを確認したいが０から１に変更しているためエラーが発生する。

```
expected `Laundry.count` not to have changed, but did change from 0 to 1
```

以上からletで遅延評価にすることによりエラーが発生してしまいます。
これをlet!にして事前評価(各itが実行される直前にデータを作成)にすることで``Laundry.count``が１からスタートし、テストがパスします。


##まとめ
createアクションの場合はデータが増えることを確認したいため前もってデータを用意する必要はないですが、destroyアクションの場合はデータが減ることを確認する必要があるためlet!を使う必要があります。

以上です。ありがとうございました！
Rails on Dockerのgemの永続化について

<h2>背景</h2>
Dockerを利用したアプリ開発を行っていて、ログイン機能を搭載したくbcryptをGemfileに追加したが以下のエラーが出続け解決不能に。

```
22: from /usr/local/bundle/gems/spring-2.1.1/bin/spring:49:in `<main>'
        21: from /usr/local/bundle/gems/spring-2.1.1/lib/spring/client.rb:30:in `run'
        20: from /usr/local/bundle/gems/spring-2.1.1/lib/spring/client/command.rb:7:in `call'
        19: from /usr/local/bundle/gems/spring-2.1.1/lib/spring/client/server.rb:9:in `call'
        18: from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        17: from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        16: from /usr/local/bundle/gems/spring-2.1.1/lib/spring/server.rb:9:in `<top (required)>'
        15: from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        14: from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        13: from /usr/local/bundle/gems/spring-2.1.1/lib/spring/commands.rb:4:in `<top (required)>'
        12: from /usr/local/bundle/gems/spring-2.1.1/lib/spring/commands.rb:33:in `<module:Spring>'
        11: from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        10: from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
         9: from /usr/local/lib/ruby/2.6.0/bundler/setup.rb:20:in `<top (required)>'
         8: from /usr/local/lib/ruby/2.6.0/bundler.rb:107:in `setup'
         7: from /usr/local/lib/ruby/2.6.0/bundler/runtime.rb:20:in `setup'
         6: from /usr/local/lib/ruby/2.6.0/bundler/runtime.rb:108:in `block in definition_method'
         5: from /usr/local/lib/ruby/2.6.0/bundler/definition.rb:226:in `requested_specs'
         4: from /usr/local/lib/ruby/2.6.0/bundler/definition.rb:237:in `specs_for'
         3: from /usr/local/lib/ruby/2.6.0/bundler/definition.rb:170:in `specs'
         2: from /usr/local/lib/ruby/2.6.0/bundler/spec_set.rb:85:in `materialize'
         1: from /usr/local/lib/ruby/2.6.0/bundler/spec_set.rb:85:in `map!'
/usr/local/lib/ruby/2.6.0/bundler/spec_set.rb:91:in `block in materialize': Could not find bcrypt-3.1.16 in any of the sources (Bundler::GemNotFound)
```

<r>
<h2>解決方法</h2>
こちらのサイトの方法を試したが、一向に解決せず。。。
https://qiita.com/totto357/items/1741da83bf642dab99df

<br>

問題は実はDockerのgem一覧が永続化されていなかったからということが発覚。
https://nishinatoshiharu.com/datavolume-for-gem/

gemの永続化を行なっていないとコンテナ上でbundle installを実行してもDockerイメージにはgemが保存されないためエラーが発生していたようです。

gemを永続化していないと新しいgemを入れるたびに、ビルドを実行しコンテナを起動しなければならないというわけです。

しかし、永続化を行えばコンテナ上でgemをインストールした際にイメージの再ビルドを行わなくて済むということのようです。


永続化の方法については上記のサイトがわかりやすいため参照ください。
VB6(Console)で湯婆婆を実装してみる

## まえがき

もうだいぶ乗り遅れた感ありますけど誰もVB6でやってなさそうなので。ただ単にVB6で書いてみるだけでは面白くもないのでVB6でもコンソールアプリが作れるのも絡めて書いてみます。

## 開発環境

- VB6 : SP6
- MicrosoftScriptingRuntimeの参照設定が必要

## 実装

```vb:Yubaba.bas
Option Explicit

Private Enum StandardStreamTypes
    StdIn = 0
    StdOut = 1
    StdErr = 2
End Enum

Public Sub Main()
    Dim fs As FileSystemObject
    Dim outss As TextStream
    Dim inss As TextStream
    Dim index As Integer
    Dim originalName As String
    Dim newName As String

    Set fs = CreateObject("FileSystemObject")
    Set outss = fs.GetStandardStream(StdOut)
    Set inss = fs.GetStandardStream(StdIn)

    Call outss.WriteLine("契約書だよ。そこに名前を書きな。")
    originalName = inss.ReadLine()
    Call Outss.WriteLine("フン。" & originalName & "というのかい。贅沢な名だねぇ。")

    Randomize
    index = Int((Len(originalName) * Rnd()) + 1)
    newName = Mid$(originalName, index, 1)
    Call outss.WriteLine("今からお前の名前は" & newName & "だ。いいかい、" & newName & "だよ。分かったら返事をするんだ、" & newName & "!!")
End Sub
```

## コンソールアプリに仕立て上げるには

上記コードをYubaba.vbpとかで保存していつも通りコンパイルするとYubaba.exeが生成されますが、このままではコンソールアプリとして機能しません。いまごろVB6でコンソールアプリを書くという酔狂な人もいないとは思いますがちょっと前に[How to Create a VB6 Console Program](https://www.xaprb.com/blog/2005/10/14/how-to-create-a-vb6-console-program/)という2005年の記事に辿り着いたのでそれを使わせていただくと

```Console
> "C:\Program Files\Microsoft Visual Studio\vb98\LINK.EXE" /EDIT /SUBSYSTEM:CONSOLE Yubaba.exe
```

と、Re-linkしてやるとコンソールアプリになります(LINK.EXEのフルパスはお使いの環境により異なる場合もあります)
***
ちなみに名前を尋ねられて何も入力しないで[Enter]でも落ちたりはしなかったです。メッセージが「今からお前の名前はだ。いいかい、だよ。分かったら返事をするんだ、!!」みたいになります(というのを再確認したいが手元に開発環境なし・・・)
[Rails]exists?メソッド、present?メソッド、presenceメソッドについて勉強してみた！[初心者]

#それぞれの違い
``exists?メソッド``
指定した条件のレコードがデータベースに存在するかどうか、真偽値で返すメソッド
``present?メソッド``
レコードの存在確認を行った後に、インスタンスを使って何か処理をしたい時に使用するメソッド
``presenceメソッド``
オブジェクトが存在すればそのオブジェクトを返し、オブジェクトが存在しなければnilを返すメソッド

#exists?メソッド

```ruby:基本構文
オブジェクト.exists?(条件)
```

``exists?メソッド``の引数に条件を指定すると、条件にマッチするレコードがあれば``true``を返し、レコードがなければ``false``を返します。

###指定したidのレコードを確認する方法
```ruby:
pry(main)> User.exists?(1)
=> true
```

###指定した条件のレコードを確認する方法
exists?メソッドの引数にハッシュ(カラム名: '値')を渡します。

```ruby:
pry(main)> User.exists?(name: '田中')
=> true
```

###whereメソッドと併用する方法

```ruby:
pry(main)> User.where(name: '田中').exists?
=> true
```

#present?メソッド

```ruby:基本構文
オブジェクト.present?
```

present?メソッドを使用したオブジェクトが存在すればtrueを返し、存在しなければfalseを返すメソッドです。
非常に``exists?メソッド``と似通っていて、混乱しそうですね。
使い分けとしては、if文など条件分岐をプログラムで書くときには使われることが多いです。

###使用例

```ruby:app/views/users/index.html.erb
<% if  @users.present? %>
  <%  @users.each do |user| %>
    <%= user.name %>
<% else %>
    <div>ユーザーなし</div>
  <% end %>
<% end %>
```

#presenceメソッド

```ruby:基本構文
オブジェクト.presence
```

presenceメソッドを使用したオブジェクトが存在すればそのオブジェクト自身を返し、存在しなければnilを返すメソッドです。
presenceメソッドはRailsのメソッドなので、Rubyで使おうとすると、エラーが出ます。

###使用例

```ruby:app/model/user.rb
class User < ApplicationRecord
  def call
    name.presence || 'No Name'
  end
end
```

```ruby:app/controller/users_controller.rb
class UsersController < ApplicationController
  def show
    @user = User.call
  end
end
```

```ruby:app/views/users/show.html.erb
<%= @user %>
```

このように記載すると、@userのnameに値があればその値が表示され、なければ “No Name” と表示されます。

#おわりに
とてもややこしいですね。
自分でまとめておきながら、混乱しています。
徐々に使っていって、手で覚えるしかないですね。
〔備忘録〕四則演算に関する演算子

#Pythonで利用可能な四則演算一覧
数値型で使用可能な四則演算の一覧まとめです。数値型と言って急に出てきました。もう急に難しい感じです。要は「各データは型に分類されるよ、データ取り扱いの際は注意してね」ってことで納得しました。詳しくは下記を参照してください。最初の数行で挫折しそうですが目を通しました。脳みそをすべっていく感じがします。
[データ型とは](http://e-words.jp/w/%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B.html#:~:text=%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B%E3%81%A8%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0,%E8%A6%8F%E7%B4%84%E3%82%92%E5%AE%9A%E3%82%81%E3%81%9F%E3%82%82%E3%81%AE%E3%80%82"データ型とは")

#ためしに
足し算のことです。これを記載する前にtest.pyにひたすら足し算の式を記入しターミナルで実行してもなにも表示されなくて途方にくれましたが、きちんとprintでくくらないとターミナルに表示されないんですね。もしくはターミナルに「python」て入力してインタラクティブモードで行う必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890398/a5fb367b-ac6c-9d4b-af9f-e0de66d779c1.png)
#一覧
出力しないのでprintは記載しません。ターミナルに出力した場合はprintで囲ってください。普通の四則演算はできます。

```test.py
x + y #xとyの和
x - y #xとyの差
x * y #xとyの積
x / y #xとyの商
x % y #xをyで割った余り
x ** y #xのy乗
```

#型の異なる演算
これらは何も数値型だけのものではなく、文字列型でも適用可能です。ためしに"apple"と"banana"を足してみるとターミナルにはapplebananaと結果が表示されます。
しかし数値型と文字列型はそのままでは演算できません。
試しに文字列型appleと数値型2をそのまま足し算するとエラーがでました。
数値型の2を文字列型の"2"とするとapple2とエラーなく計算されました。pythonのような動的型付け言語の場合はそこまで意識することはありませんが、意識して考えていくとその他の言語を勉強する際にも役に立つかもしれません。
Javaの本とかを読んでいると「そんなのみればわかるだろうよ！！」という部分にも型を指定しなければならないので大変そうでした。
*nixのcp（コピーコマンド）のスラッシュ有無で意味が違ってくる件【よくある質問】

Linux, Unix, MacOSのターミナルで、ディレクトリまるごとコピーできるコマンドがあります。

```zsh
cp -r 元のディレクトリ/ コピー先のディレクトリ
```

こんな感じのフォルダがあるとします。

![folder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145550/0d7a8367-44d4-b6fa-14ff-25b404d04a17.png)

### スラッシュが無い場合はフォルダ丸ごとコピーされる

```
cp -r 原本 写し
```

![Screen Shot 2020-11-24 at 11.43.56 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145550/7f2bde73-910b-fece-b194-b98621185fd3.png)

### スラッシュがある場合はフォルダの中身だけコピーされる

```
cp -r 原本/* 写し/
```

![Screen Shot 2020-11-24 at 11.44.38 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145550/0d1bd61d-a5b9-37a8-1161-f72a25cc3472.png)

* なお、MacOSとLinuxで挙動が違うらしいです：[cp -R コマンドがMacOSとLinuxで動作が異なる みーのページ](https://pc.atsuhiro-me.net/entry/2019/09/11/060915)

`元のディレクトリ/`の最後のスラッシュ(`/`)有り無しで結果が変わってくるのは常識みたいですが、どうも物覚えが悪くて、どちらがどっちか分からなくなる事が多いのでメモしました。
初心者だからわかること　ファイルの作り方（初投稿）

ファイルの作り方　（始めたて向けの記事です）

１　ターミナルを起動する
２　```cd deskTop ☜Tは大文字にしてください
```
３　```mkdir 付けたいファイル名
```
４これでデスクトップにファイルが出来上がりました！！



初投稿なので至らない部分があると思いますがそこは注意してくださったら幸いです！
Vueでタブに表示されているタイトルをデフォルトから変更する

## やりたいこと
chromeの上部に表示されているタイトルを変更したい
![スクリーンショット 2020-11-23 10.34.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168995/c04bc64d-54f3-1947-fcac-cc3edd47ca52.png)


### 環境情報
- vue
    - 2.6.12

## index.htmlを確認
index.htmlに定義があるので確認してみる
titleタブで表示されている内容が `htmlWebpackPlugin.options.title` となっている

`htmlWebpackPlugin.options.title` の値を定義するには、 `vue.config.js` を編集したら良い
※ vue cliでプロジェクトを作成

## vue.config.jsを編集
以下の様に編集

```
module.exports = {
  pages: {
    index: {
      entry: "src/main.js",
      title: "ああああ"
    }
  }
}
```

無事変わりました
![スクリーンショット 2020-11-24 20.40.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168995/be781fd8-f489-0f08-261e-5d2b1657cc4b.png)



## 参考
- htmlWebpackPlugin.options.title を設定する方法
    - https://suzuki-navi.hatenablog.com/entry/2020/11/23/215712
WEBサイトで「乗算」を再現？IE非対応でいいならCSSできるよ

# どうも7noteです。忌々しい乗算に悩まされない日が近づいています。

WEBデザインで一番困るといっても過言ではない「乗算」。
現状全てのブラウザに対応するための一般的な方法は存在しません。

そのためコーダーは透明度や色合いなどで微調整するしかなかったのですが、
**実はIEを無視すれば乗算に対応することができます！**

**見本**（右のみCSSで乗算にした結果）
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/68da1e60-2bdd-9a41-f20a-53fae3350cd0.png)



このように、薄い背景であれば白背景付きのロゴ画像でも色付きの場所になじませて配置することが可能なんです。

## ソース

```index.html
<div class="bg">
  <img src="logo.png">
  <img src="logo.png" class="mbm">
</div>
```

```style.css
.bg {
  background: #fdd;
  padding: 10px;
}

.bg .mbm {
  mix-blend-mode: multiply;      /* 「乗算」する */
}
```

## 解説

本日の主役「`mix-blend-mode: multiply;`」です。
何度も言いますが`mix-blend-mode`はIEに非対応です。

https://developer.mozilla.org/ja/docs/Web/CSS/mix-blend-mode#Browser_compatibility

ですがそれさえ無視すれば、乗算にしたい要素に`mix-blend-mode: multiply;`を記述するだけなので非常に簡単に実装することができます。
`mix-blend-mode`は他にもさまざまな加工ができるので使ってみてください。

あぁ。IEさえいなければ・・・

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】HTML・CSSのちょいテク詰め合わせ](https://qiita.com/7note)
Rcoilつかってみたったった

#はじめに

ReactとReduxを勉強し始めて3ヶ月ほどの私ですが

Redux以外の状態管理ライブラリーを使ってみたい！！

とのことで今回Recoilを学習してみました

#Recoilとは

![Recoil.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669792/121aa647-94d7-730d-89e5-01ccfd97a0dc.png)



faceBookさんが作ったReactの状態管理ライブラリー。その名の通り真ん中にコイルみたいなのあるね


さっそく使ってみよう

#Atoms



```index.js
import { atom } from "recoil";

export const textState = atom({
  key: "textState",
  default: "",
});
```

atomsは一意とkeyとdefaultのStateを設定する

その名の通りdefaultはReactのHooksのuseStateの初期値みたいな感じです

このatomのStateにdataが入ってきます


```App.jsx
import { RecoilRoot } from "recoil";
import Router from "./Router";

const App = () => {
  return (
    <RecoilRoot>
      <Router /> 
    </RecoilRoot>
  );
};
```
atomsのStateはRecoilRootでラップしたコンポーネントは参照できます


# selector
```selector.js
import { selector } from "recoil";
import { textState } from "../index";

export const textCountState = selector({
  key: "textCountState",
  get: ({ get }) => {
    const text = get(textState);

    return text.length;
  },
});
```

atomsのstate(textState)を受け取って別の処理をした値を返すことができる

```selector.js
import { selector } from "recoil";
import { userNamesList } from "../index";
import api from "../../../services/api";

export const userToFollowerMap = selector({
  key: "userToFollowerMap",
  get: async ({ get }) => {
    const _userNamesList = get(userNamesList);

    const responses = await Promise.all(
      _userNamesList.map((userName) => api.get(`/users/${userName}`))
    );
    const followerMap = {};
    responses.forEach((response) => {
      const { data: user } = response;

      followerMap[user.login] = user.followers;
    });
    return followerMap;
  },
});
```

こんな感じに非同期処理のQueryとしてStateを受けとり、取得した値を返すこともできる


ではComponentごとにatomsやselectorのStateを追加したり参照する方法

#useRecoilState

```Textinpu.jsx
import React from "react";
import { useRecoilState } from "recoil";
import { textState } from "../atoms/text/index";

const TextInput = () => {
  const [text, setText] = useRecoilState(textState);

  const onChange = (e) => {
    setText(e.target.value);
  };

  return (
    <div>
      <input type="text" value={text} onChange={onChange} />
      <br />
      Echo:{text}
    </div>
  );
};
```

ReactのHoosのグローバルState版みたいな感じに使える

textで値を参照できて,setTextでatomsに値を追加できるuseRecoilStateにはatomsのStateを渡す

#useSetRecoilState

```Textinput.jsx
  const setText = useSetRecoilState(textState);
```
useRecoilStateのatomsに追加できるだけ版setTextで追加できます。

参照もするのであればuseRecoilStateをつかえばいいかな

#useRecoilValue


```textLengthCount.jsx
import { useRecoilValue } from "recoil";
import { textCountState } from "../atoms/text/selectors/charCount";

const  textLengthCount = () => {
  const count = useRecoilValue(textCountState);

  return <div>text length Count: {count}</div>;
};
```

逆に参照だけできる版

atomsやSelectorの値をComponenごとで参照できる

#まとめ

Reduxより簡単にかける反面atoms内のオブジェクトに再代入しようとしたらReadOnlyですっておこられた

もうちょっと使ってみてReduxとRecoil両方つかって挙あげれるようになりたい
AccessのVBAでフォルダー内ハウスキープ（古いファイルを自動削除）関数

# ハウスキープってなんぞ？

* ログファイル
* バックアップとして自動で出力したPDFやCSVファイル

なんかがずーっと貯まり続けてストレージを圧迫しないように、古いやつを消す処理のこと。


# 参照設定

この記事の例は FileSystemObject クラスを使うので、VBEの参照設定で **Microsoft Scripting Runtime** にチェックを入れる必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/212897bd-75b0-99ac-b1bf-ba50d0f44c8f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0fa30964-01bd-d9c9-4b1b-02483ab6d39e.png)


# 指定フォルダー内の古いファイルは全て削除、サブフォルダーは即削除

『フォルダーパス』と『ファイルは何日間保存するか』を引数としてもらいます。

```vb
Public Function Housekeep(ByVal folder_path As String, ByVal save_days As Long)
    
    Dim fso_ As New FileSystemObject
    Dim file_ As file
    
    For Each file_ In fso_.GetFolder(folder_path).Files
        
        If file_.DateCreated < DateAdd("d", -1 * save_days, Now()) Then
            fso_.DeleteFile (file_.Path)
        End If
        
    Next
    
    Dim folder_ As Folder
    For Each folder_ In fso_.GetFolder(folder_path).SubFolders
        fso_.DeleteFolder (folder_.Path)
    Next

End Function
```

* 拡張子は考慮しません。
* サブフォルダーはイレギュラーとし、作成日に寄らず即削除します。（サブフォルダー内にさらにサブフォルダーやファイルがある場合は再帰的に削除されます）
* 削除判定の閾値はそこまで厳密にしていません。（コードの読みやすさ優先）


# 蛇足

『指定拡張子のみ削除』『サブフォルダー内のファイルについても再帰的に作成日をチェックして…』
などなど、細かく指定しようと思えばいくらでもできます。
けど、**引数が多くなるし処理も複雑になってコードを理解するのに時間がかかる…** 。

CSVならCSV用のフォルダに出力！
ログならログ用のフォルダに出力！

そして、出力先フォルダ内のファイルはとにかく一定期間過ぎたら消す！
…というように **仕様はできる限りシンプルに** した方がいいと思います。

# バージョン

Windows10 Pro バージョン1909 OSビルド19042.630
Access for Microsoft 365 MSO（16.0.13328.20334）32ビット
シフト勤務の職場で明日誰が出社するのかがわかるSlack用BotをGAS（GoogleAppsScript）で実装した

現在リモート勤務になっていますが、フルリモートではなくシフト制です。
時々出社日を忘れる人が出てくるようになったので、上司がスプレッドシートで作るシフトデータをベースに、夕方ごろ自動的に翌日の出社メンバーをSlackに投稿するBotを作りました。

# 元にするデータと最終出力

## Slackへの投稿例
夕方5時～6時の間に翌営業日のシフトが投稿されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180861/047f7775-7b6d-8bed-1b7a-6d1d00976837.png)

## 元となるデータ例
上司がExcelで作るものをGoogleSpreadSheetにコピペしています（「シフト表」シート）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180861/e15dbdbe-7e0c-d9ba-2d09-f70756295186.png)


# 実装方法
## 翌営業日のシフト用のシートを作る
シフト表が入ったシートと同じスプレッドシートに新規にシートを作成し、「翌営業日の出社予定」と名前をつけて、A1セルに以下の関数をコピーします。
`=query('シフト表'!A:D,"WHERE A= date '"&TEXT(WORKDAY(TODAY(),1),"YYYY-MM-DD")&"'",-1)`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180861/5f58b369-c2ad-6715-1207-2b2dfcef3c40.png)


## 翌営業日の予定からテキストを組み立て、Slackに投稿するコードを書く
Spreadsheetのスクリプトエディタを起動し、以下のソースをコピペして、`(1)スプレッドシートのID`、`(2)Slack通知用のWebhook URL`の部分を埋めます。
この2つの取得方法については、参考にさせていただいた別の記事が詳しいので末尾にURLを付記してあります。そちらを参照してください

```js
function doPostSlack() {
  //土日の場合は実行しない
  var today_week = new Date().getDay();
  if (today_week == 0 || today_week == 6) { return true; }
  
  // 平日の場合のみ実行
  postSlack();
}

function postSlack() {
  // スプレッドシートを取得
  var obj = SpreadsheetApp.openById('(1)スプレッドシートのID'); 
  // 対象のシートを取得
  var sheet = obj.getSheetByName("翌営業日の出社予定"); 
  
  // 予定の日付を取得し、フォーマットして曜日をつける
  var date = sheet.getRange("A2").getValue()
  var week_ary = ['日', '月', '火', '水', '木', '金', '土'];
  var week_num = date.getDay();
  var week = '('+week_ary[week_num]+')';
  date = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd');
  date = date + week;
  
  // 出力する情報をフォーマット
  // 出力例： 2020/11/24(火)---羽川:出社 /
  var values = sheet.getRange("B1:E2").getValues()
  var output = "";
  for (var j = 0; j < values[0].length; j++) {
    if (values[1][j] !== "") {
      output = output + values[0][j] + ":" + values[1][j] + "　/　";
    }
  }
  output = date + "---" + output;
  Logger.log(output);

  // payload=データ本体のこと　　Slackに送信(post)する内容
  var payload  = {
    'text'      :  output,
    'username'  : '出社予定',      //botの名前
    'channel'   : 'remote',   //投稿するチャンネル名
    'icon_emoji': ':hedgehog:',   //botのアイコン 
  };

  // Slackに送信
  var options = {
    'method'      : 'post',
    'contentType' : 'application/json',
    'payload'     : JSON.stringify(payload), // jsの値をJSON文字列に変換
  };

  var url = '(2)Slack通知用のWebhook URL';
  UrlFetchApp.fetch(url, options);
}
```
## 毎日の自動投稿を設定する
「編集」「現在のプロジェクトのトリガー」から「トリガーの追加」を押し、毎日17時～18時の間に動かすようにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180861/6d3e7d2f-59f2-fad7-9cf7-34ca6672991b.png)

## 完成！
あとは指定した時間まで待って実際に動くことを確認して完了です。


# 参考＆謝辞
以下の記事を主に参考にさせていただきました。良い記事を公開してくださりありがとうございます。
`(1)スプレッドシートのID`、`(2)Slack通知用のWebhook URL`の取得方法 についてもこちらが詳しいです。

【初心者向け】GASを使ったスプレッドシートとSlackの連携（bot制作）<br>https://qiita.com/unadesuga/items/971c5f7587a7bf8d076d
【Mac】Android studioのAVD Managerからエミュレーターを起動すると「unable locate to abd」となる

## 環境
macOS Catalina 10.15.7
Android studio 4.1.1

## 発生している事
AVD Managerからエミュレーターから`Pixel 2 API 28` を起動すると下記のような警告が出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414558/cfc1e2fd-d041-8dfd-a9b5-f91611efaa62.png)

エミュレーター自体はその後起動するのだが、Debugしてもアプリが動かない。

## 試した事
`/Users/ユーザ名/Library/Android/sdk/platform-tools` 配下にあるadbへのパスを通した後、以下コマンドを叩いてみたところデバイスは表示されるようになる。
※ない場合はDownloadして設置
[SDK Platform-Tools リリースノート](https://developer.android.com/studio/releases/platform-tools)

```
$ adb devices
```

Android Studioを再起動して再チャレンジしたが、解消されず。

よく見るとDebugした時のConsoleに以下のエラーが出ている。
当初のエラーとは因果関係はないかもしれないが、デバッグできない理由はこっちかもしれないのでこちらも合わせて要調査

```
FAILURE: Build failed with an exception.

* What went wrong:
Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'.
> Failed to install the following Android SDK packages as some licences have not been accepted.
     build-tools;28.0.3 Android SDK Build-Tools 28.0.3
     platforms;android-29 Android SDK Platform 29
  To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager.
  Alternatively, to transfer the license agreements from one workstation to another, see http://d.android.com/r/studio-ui/export-licenses.html

  Using Android SDK: /Users/onsiter/Library/Android/sdk

* 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 5s
Exception: Gradle task assembleDebug failed with exit code 1
```

- Flutterのエラーで良くつまずく所で、以下を実行して確認するとよいらしい。
`flutter doctor`

以下のように表示があった。

```
略
[!] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
    ! Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses
略
```

表示されてる通り、以下を実行。
`flutter doctor --android-licenses`

所々YesとNoを求められるので、全部「Y」で次へ進める。

「unable locate to abd」のエラーは解決しませんでしたが、デバッグはできるようになりました。

## 結果
まだ未解決
解決次第アップします。

## 参考URL
[AndroidStudid での “Unable to locate adb” の対処法](https://pisuke-code.com/android-unable-to-locate-adb/)
[ターミナルにadbのパスを通す(Mac)](https://qiita.com/piyonakajima/items/32cbd82f4b3c7e30e6ae)