OmniAICreator/Qiita-1.07M huggingface dataset:
Herokuでマイグレーションできなかった時の解決方法。

### 前提
mySQLからHerokuでデプロイしたけど、マイグレーションエラーが出てしまった人に自身が解決した方法を参考までに発信します。

ちなみにHerokuでエラーになりがちなのは
①データベースをSQLite3からPostgreSQLに変更していない。
②heroku run rake db:migrate を実行していない。
この２つが当てはまることが多いみたいです。


僕は当初、デプロイはできたのですが、
リンクに飛ぶと          

```
We're sorry, but something went wrong.
```
と出てしまいました。


```

heroku logs
``` 
で状況を確認すると、500エラーが出ています。

デプロイ中の挙動を確認したところ、

```
PG::UndefinedTable: ERROR:  relation "shops" does not exist
```
といったエラーが発生。
ローカル環境では、間違いなくshopsテーブルはあったのに。
存在がなかったことになっています:(；ﾞﾟ'ωﾟ'):
migrationができていないのではないかと思い、本番環境のマイグレーションを確認しました。

```
heroku run rails db:migrate:status


  down    20200707102907  Devise create shops
  down    20200707103416  Create items
  down    20200707103432  Create messages
  down    20200707103449  Create shop items
  down    20200714031558  Create likes
  down    20200716002749  Add image to shops
```
やっぱり全部downしてしまっています。
これだと、マイグレーションできていないです（ちなみに、ローカルでは全部upになってました）。
マイグレーションでのエラーを解決する為に１日悩んでいました。




翌日、エラー文の中に

```
ActiveRecord::NoDatabaseError: 
FATAL: permission denied for database "postgres" 
DETAIL: User does not have CONNECT privilege. 
/app/vendor/bundle/ruby/2.6.0/gems/〜
```
と書かれていて、マイグレーション以前にPostgreSQLが反映していないから
マイグレーションできていないのではないか？と思い始めました。

そこで、Gemファイルを確認したところ問題なし。↓

```

gem 'sqlite3', group: :development

gem 'pg', group: :production

```

もう１つ怪しいところが、database.yml　↓↓

```
production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5
```
この記載が漏れていました！


このあと再度、


```
cd yourapp  #デプロイしたいアプリに移動
git add .　＃addして
git commit -m "Add pg gem for Heroku"　＃コミット
git push heroku master
heroku run rake db:migrate

```

リンクへ飛んだら、無事デプロイできました！！
migrate:statusも全部upになってました。
migrateに引っ張られすぎてましたが、migrateできない理由は
PostgreSQLがうまく機能していなかったことが原因でした。

migrateでエラーになってしまっている人の参考の１つになれば嬉しいです。
Qiita organizationページの更新をSlackで通知させる

# 経緯
organization内でQiita更新の周知を手動で行っているので、自動化してみた。  

# Qiita organization
[こちらの記事](https://blog.qiita.com/165064370664-2/)によると、一応RSSフィールドは存在しているようです。
URLはこのようになります。
`http://qiita.com/organizations/<organization名>/activities.atom`

# SlackのRSSアプリ
Slackにはすでに[RSSアプリ](https://slack.com/intl/ja-jp/help/articles/218688467-Slack-%E3%81%AB-RSS-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)が用意されています。
`/feed subscribe http://qiita.com/organizations/<organization名>/activities.atom`
を実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/d8f12f47-4141-6caa-1a00-d1d1f41f1e54.png)
「\<organization名\>の記事」と最近の記事が表示されます。
証明書がかくかくしかじか...と出たら、URLを`https`にすると成功しました。
（再現できなくなったので、原因がわからないです）

`/feed list`で登録したRSSフィールドを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/8a12b142-92e9-2496-bdc4-2b2ad1e07974.png)

# 取得してみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/e7402bfb-9881-70ef-6345-d3e5caae7873.png)
確かに取得はできているのですが、**著者が誰か全くわかりません！！！**

# 今後やってみたいこと
atomファイルを見てみると、著者の情報は持っているです。
これをパースして、Slackへ投げられたら良いなと思っています。
Rails Tutorial　第7章完了

#2020/7/4 2時間

#2020/7/5 2時間
土日は時間が取れるので進められました。
#2020/7/6 0.5時間
#2020/7/7 0.5時間
#2020/7/8 0.5時間
#2020/7/9 0.5時間
朝に30分できました。
#2020/7/11 1.5時間 
朝にやったのですが、1時間ほどで眠ってしまいました。休憩をとった後、続きをやりました。
7/10は朝から出社する用件があり、夜にやろうと思ったのですが、疲れてできませんでした。
#2020/7/12 2時間 
#2020/7/13 1時間 
30分で7章まで完了しました。残り30分は8章です。

これで7章を完了しました。
所要時間は10時間です。

感想ですが、難易度が高くなってきたと感じました。

#演習7.4.4.1が分からず、ネットで答えを見て解決した

```ruby:users_signup_test.rb
     assert_not flash.empty?
```

 が分からなかったです。emptyメソッドを思いつきませんでした。
【Mac】Magnetアプリを使ってウィンドウを管理する-ショートカットキー-

#Magnetショートカットキー
以下の**5つ**のコマンドを使えるようになるだけで、効率上がります。
慣れたら他のコマンドを覚えるぐらいで良いと思います。
###1.ウィンドウを画面の上半分に表示する
###control + option + ↑
###2.ウィンドウを画面の右半分に表示する
###control + option + →
###3.ウィンドウを画面の右半分に表示する
###control + option + ↓
###4.ウィンドウを画面の右半分に表示する
###control + option + ←
###5.ウィンドウをフルスクリーンにする
###control + option + return
GitHub Secret をアンロックしよう： Profile Bio Readme

# 概要
最近 GitHub の個人ページの頭部分にプロフィールを表示できるようになったらしいです.

# やり方
![スクリーンショット 2020-07-19 11.40.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/9e9ef511-876b-ec09-96af-698f9486a546.png)

ユーザ名と同じレポジトリを作成し、README を追加・書き換えるだけで反映されます.
You found a secret! の文章が可愛いですね！！！

# 完成イメージ
![スクリーンショット 2020-07-19 11.34.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/9b160d9c-9b99-8f82-38b6-493ea12ef693.png)

LINK TO OTHER SNS の文章が無事画面上部に出力されました！
一旦リンクだけ貼ってますが、開発したサービスの概要を貼ったりするのも良さそうですね！

# 参考リンク
- [Unlock a GitHub Secret: Profile Bio Readme](https://medium.com/better-programming/unlock-a-github-secret-profile-bio-readme-8035dec3b3bb)
fastlaneの環境構築で詰まった

## 発生した問題
```
$ sudo gem install fastlane
```

でpermission error

```
$ sudo gem install -n /usr/local/bin/fastlane
```

上コマンドでgem自体はインストールできたが

```
$ fastlane init
$ fastlane beta
```

の結果、fatlane実行中に`xpretty command not found`のエラー

## 解決した方法
[gem installでpermissionエラーになった時の対応方法](https://qiita.com/nishina555/items/63ebd4a508a09c481150
)を参考にrbenvで管理するようにした

```
$ which ruby
/Users/naginx/.rbenv/shims/ruby
$ which gem
/Users/naginx/.rbenv/shims/gem
```

rubyとgemをrbenvで管理できてるのが確認できたら

```
$ gem install fastlane
```

最終的にはこうなってるはず

```
$ which fastlane
/Users/naginx/.rbenv/shims/fastlane
```
Nuxt.jsでScssを使いたい

##モジュール導入
NuxtJsでSCSSを使用するためのモジュールを導入します

`npm install node-sass sass-loader @nuxtjs/style-resources --save-dev`

・node-sass
・sass-loader
・@nuxtjs/style-resources

`package.json`に追加されます

```package.json
 "devDependencies": {
   "@nuxtjs/style-resources": "^1.0.0", <--これ
   "node-sass": "^4.14.1",　<--これ
   "pug": "^3.0.0",
   "pug-plain-loader": "^1.0.0",
   "sass-loader": "^9.0.2"　<--これ
  }
```

##nuxt.config.js編集
`nuxt.config.js`内の`modules`に下記を追記する

```nuxt.config.js
  modules: [
    '@nuxtjs/style-resources'
  ],
```

##SCSSファイルの作成、配置
Nuxt.jsでは静的ファイル(CSS,image,SASS)を`assets`フォルダ内に配置します

例 `assets/css/style.scss`を作成

##Vueファイルにscssを適用
Vueファイルの`<script></script>`内にscssファイルをインポートする

```sample.vue
<template>
　<h1>Hello World !</h1>
</template>
<script>
// import css files.
import "~/assets/css/style.scss";
</script>
```

サーバをリロードすると適用されています。

###ファイル名
scssファイル名はvueファイル名と合わせると分かりやすいかも

##資料
[参考資料](https://sysrigar.com/2019/12/31/nuxt-js%E3%81%A7%E3%81%AEscss%E4%BD%BF%E7%94%A8%E6%89%8B%E9%A0%86/)
1ヶ月でG検定 2020#2に合格した話

「これからはAI・データサイエンスの時代だ！」と今更思い、調べたところG検定というものの存在を知り、受験しようと思いました。
4月には勉強を始めようと思っていたのですが、なんやかんやあり本格的に勉強を始めたのは6月に入ってからでした。
今後G検定を受ける人のためになれば良いなと思い、受験するまでの1ヶ月間に行った勉強と受験した感想をまとめました。

G検定の概要については[JDLA公式サイト](https://www.jdla.org/certificate/general/)を参照してください。

# 能力

- AI・機械学習のハンズオンに参加経験あり、基本的な部分を少し学んだ程度
- 自然言語処理について興味があった時期があり、そこで色々と調べたことがある
- 理系なので行列や微分の知識はある

# 勉強方法
JDLAの[シラバス](https://www.jdla.org/certificate/general/)に目を通す。

参考書として以下の2冊を購入。
[深層学習教科書 ディープラーニング G検定（ジェネラリスト） 公式テキスト Kindle版](https://www.amazon.co.jp/gp/product/B07H2ZR6M2)

[徹底攻略 ディープラーニングG検定 ジェネラリスト 問題集 徹底攻略シリーズ Kindle版](https://www.amazon.co.jp/gp/product/B07NDVCN99/)

まずは公式テキストを1回通しで読みました。
次にこの本の巻末に載っている約300個の用語をほぼすべて、意味と一緒にスプレッドシートに書き込みました。
本に載っていることだけではなく、調べてわかったことについても書き込んであります。

<img width="1439" alt="スクリーンショット 2020-07-18 15.53.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154305/cb7c2163-edeb-7bd7-a61d-5f29f9bdb5c5.png">

そして試験まで残り1週間ほどの所でようやく問題集に手を付け始めました。
問題集にあってスプレッドシートにない用語も追加していきました。

また、勉強と並行して[AINOW](https://ainow.ai/)の記事や[Youtubeチャンネル](https://www.youtube.com/channel/UC8xn54umDjvl-cCihhKPC7Q)の動画にも目を通しました。

# 受験！
問題集の問題をすべてできないまま受験時間が来てしまったので、そのまま本番を受験することに。
わからない問題を後回しにしたので、最後まで行って約50分ほど時間があまりました。
この時点で後回しにした問題は全体の約3割ほど。
序盤に法律関連の問題が多かったため、後ろから調べながら解いていきました。
解いていない問題が法律関連のみになったところで残り時間は10分ほど。
調べる時間もほとんどなかったので、残りはほぼカンで解きました。
問題は4択なので、カンでも4分の1で当たりますね。
所感としては、自信を持って正解を選べたのが約5割、自信があまりないのが約4割、カンが約1割。

# 結果
まだかまだかとヤキモキしていると木曜日に結果のメールが来ました。
なんと合格してました！
正直ビックリです。

今回は受験者数がかなり増えたこと、いつもより難しかった？ことにより
足切り点数が引き下げられたのでしょうか。

[【2020年 第2回 G検定】過去最高となる12,552人が受験し、AI活用の今後を担う 8,656人の合格者が誕生。](https://www.jdla.org/news/20200716001/)

とにもかくにも合格できたので良かったです。

# 今後G検定を受ける人へ
G検定は約200問の問題を120分で解かなければなりません。
1問あたり約30秒程度です。なので、**わからない問題は積極的に後回しにしましょう。**
問題にはチェックがつけられるので、どれが後回しにした問題かわからなくなることはありません。
後回しにした問題の基準は以下の3つです。

- 法律・時事問題
- 長い問題
- ぱっと見でわからない問題

スプレッドシートで作った用語集もある程度役に立ちました。問題全体の約1割ほどの答えはこれで調べたような気がします。
用語集を作っておくのは、調べる時間を短縮する意味でもアリだと思います。

時間があれば、AIやディープラーニングに関する他の本も読んでおくと良いかもしれません。
[ＡＩ白書　２０２０ (単行本) Kindle版](https://www.amazon.co.jp/gp/product/B085RKWNPB)
[人工知能は人間を超えるか ディープラーニングの先にあるもの](https://www.amazon.co.jp/gp/product/4040800206)
[これ1冊で合格！ スッキリわかるディープラーニングG検定（ジェネラリスト） テキスト＆問題演習](https://www.amazon.co.jp/%E3%81%93%E3%82%8C1%E5%86%8A%E3%81%A7%E5%90%88%E6%A0%BC%EF%BC%81-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0G%E6%A4%9C%E5%AE%9A%EF%BC%88%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88%EF%BC%89-%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%86%E5%95%8F%E9%A1%8C%E6%BC%94%E7%BF%92-TAC%E5%87%BA%E7%89%88-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%82%AF%E3%83%AD%E3%83%8E%E3%82%B9-ebook/dp/B0871Y41D2)
Cannot import name "Feature" from "setuptools" ってなったとき。

# Cannot import name "Feature" from "setuptools"ってなったとき。

```
ERROR: Command errored out with exit status 1:

【中略】

interface/
    Complete output (5 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/69/cj8h85bs7cvbxs4l0qqlwdxh0000gn/T/pip-install-nz65irhj/zope.interface/setup.py", line 26, in <module>
        from setuptools import setup, Extension, Feature
    ImportError: cannot import name 'Feature' from 'setuptools' 
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
```

ってな感じになったとき

```
pip3 install setuptools==45
```

して解消する。


Ref.

https://github.com/pypa/setuptools/issues/2017
【javascript】トランスパイル

この記事は以下の書籍を参考に執筆しました

- [入門JavaScriptプログラミング](https://www.amazon.co.jp/%E5%85%A5%E9%96%80JavaScript%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-JD-Isaacks/dp/479815864X/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1F76CKY9CIJ66&dchild=1&keywords=%E5%85%A5%E9%96%80javascript%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1595991879&s=books&sprefix=%E5%85%A5%E9%96%80javascript%2Cstripbooks%2C-1&sr=1-3)


書籍のアウトプットとして
#Babelを使ったトランスパイル
##トランスパイルとは
あるプログラミング言語のソースコードを別のそれに変換する。
###Babelの位置づけ
Babelはjavascriptの特定のバージョンをコンパイルする。
##BabelをNPMスクリプトとしてセットアップ
```json:package.json
     "scripts": {
       "test": "echo \"Error: no test specified\" && exit 1"
       "babel": "babel src -d dist"
     },
```
>出典：[入門JavaScriptプログラミング](https://www.amazon.co.jp/%E5%85%A5%E9%96%80JavaScript%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-JD-Isaacks/dp/479815864X/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1F76CKY9CIJ66&dchild=1&keywords=%E5%85%A5%E9%96%80javascript%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1595991879&s=books&sprefix=%E5%85%A5%E9%96%80javascript%2Cstripbooks%2C-1&sr=1-3)


こう書いておいて

```
npm run babel
```
と実行すれば以前よりは楽に実行できる。
MySQL server through socket '/tmp/mysql.sock'

# エラー内容
```bash
# ダンプの取り込み
$ pv your_data.dump | mysql -h dbserver -u user db_name

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

# 原因
dockerをmysqlで動かしていると、アクセスするときに挙動が異なるようです。

`localhost`アクセスするとunix socketで接続するためエラーが発生します。
1. `127.0.0.1`アクセスするか、
2. `~/.my.cnf`にtcp接続のオプションを追加すればエラーがなくなるようです。

```conf
[client]
protocol=TCP
```

## Special Thanks
以下を参考にさせていただきました

> [開発環境のMySQLをdockerで動かすようにしたときのメモ - takapiのブログ](https://takapi86.hatenablog.com/entry/2018/12/16/140314)
> mysql clientは localhost を指定するとunix socketで接続しようとするので、

> ```
mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
mysql -u root -h localhost
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```
vim ~/.my.cnf に以下を設定し、localhostを指定したときはtcpで接続するようにする。 （接続時、明示的に127.0.0.1を設定すれば問題ないので任意）
navigation間のパラメータの受け渡し　ReactNavigation V5 で画面遷移をクラスで行う方法

# 目的
- react navigation v5　をクラスで利用する場合に出てくる相違点の記録

> 以下の続き
> https://qiita.com/yukihigasi/items/e320a825e412e9d0b3d5

# やりたいこと
- パラメータをナビゲーション間で受け渡したい
- 公式ドキュメントは関数で行なっている
- これをクラスで行えるようにしたい

```
function HomeScreen({ navigation }) {
  return (
    <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
      <Text>Home Screen</Text>
      <Button
        title="Go to Details"
        onPress={() => {
          /* 1. Navigate to the Details route with params */
          navigation.navigate('Details', {
            itemId: 86,
            otherParam: 'anything you want here',
          });
        }}
      />
    </View>
  );
}

function DetailsScreen({ route, navigation }) {
  /* 2. Get the param */
  const { itemId } = route.params;
  const { otherParam } = route.params;
  return (
    <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
      <Text>Details Screen</Text>
      <Text>itemId: {JSON.stringify(itemId)}</Text>
      <Text>otherParam: {JSON.stringify(otherParam)}</Text>
      <Button
        title="Go to Details... again"
        onPress={() =>
          navigation.push('Details', {
            itemId: Math.floor(Math.random() * 100),
          })
        }
      />
      <Button title="Go to Home" onPress={() => navigation.navigate('Home')} />
      <Button title="Go back" onPress={() => navigation.goBack()} />
    </View>
  );
}
```

> https://reactnavigation.org/docs/params/

# 対策
- `useNavigation` の時と同じように、 `useRoute` Hocを利用する
- 届くオブジェクトの中身は以下のようになっている

```
Object {
  "key": "xxxx",
  "name": "xxxx",
  "params": Object {
    "渡した時のキー": "渡されたデータ（つまりitemId）",
  },
}
```

- だから取り出し方は `route.params.キー(itemId)`


```
import { NavigationContainer, useNavigation, useRoute } from '@react-navigation/native';　＜＝useRouteを取得する

export default function(props) {
  const navigation = useNavigation();
  const route = useRoute();                                      <=useRouteを取得する

  return <VID8 {...props} navigation={navigation} route={route} />;　＜＝usenavigationと同じようにrouteをクラスに渡す
}

class VID8 extends React.Component {

  render() {
    const { navigation } = this.props;
    const { route } = this.props;

    return(
      <View style={styles.window}>
        {route.params.group}                     <= routeから、前の画面でnavigation第２引数に渡されたプロパティを取得する

      </View>
    );
  }
}
```


# 資料
> https://reactnavigation.org/docs/use-route/
Data Robot 天気画像判別 やってみた　AIは空を認識できるのか

###天気画像判別をしてみました　データは約写真を300枚づつ　
![天気.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/4686898b-a012-769d-a4fb-23b48d682cc6.jpeg)
カテゴリー分けは4つ
![天気2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/0b4b49a1-5da5-2370-5de7-66e3bb564c01.jpeg)
![天気3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/4ecfee28-7718-4e2a-ac92-40075f549316.jpeg)
特徴はイメージ
![天気4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/0572f388-576c-fba4-cdfb-36927554a129.jpeg)
こんな感じに認識しました
![天気5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/17d66995-813d-5e27-309d-ec907cb4ec35.jpeg)
![天気6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/0a813d2c-9c81-eef4-5919-ca878e9f92a2.jpeg)
リフトチャート
![天気7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/95cbfdbe-2215-4841-f74a-941d90a517cc.jpeg)
予測結果分析
![天気8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/33203cb4-45a7-6e44-c1a8-771eb1d18aef.jpeg)
![天気9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/da660021-a7d4-0347-41fc-6dd0762ae91e.jpeg)

次回はいつかチューニングしたいと思います
共同開発中にCould not find coderay-1.1.3 in any of the sources (Bundler::GemNotFound)が出た

## どういうエラーなのか
coderay-1.1.3が見つからないというエラー。

## どんなときに起こるのか
Gemfileに　coderay(1.1.3) の記述がないとき。
記述はあるけどインストールされていないとき。

## 対処法
bundle installする。


coderay(1.1.3)の記述は他の開発メンバーがしてくれたものなのですが、その場合は、
リモートリポジトリからプルした後に自分でbundle installしないといけないのですね(汗)


かなり基本的なことですが、少し困ったので学習メモとして記録しました。
ディレクトリ内のファイル名の一覧を、サブディレクトリ含め文字列としてコピーする方法

* 配下のサブディレクトリ含めファイルの一覧を文字列としてコピーしたいディレクトリ（親ディレクトリ）に移動
* Windowsエクスプローラー右上にある検索ボックスに「*」と入力する（※下図参照）

![200714kensaku_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618171/801fedc0-9a3e-262a-3def-e4a2b4b2f8a2.png)


* 検索で表示されたサブディレクトリ、ファイルを全選択
* [Shift]を押しながら右クリックして、「パスとしてコピー」を選択（※下図参照）

![200714kensaku_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618171/5d9b8641-78aa-5c49-86d9-5cc9dc1c0822.png)

おしまい
Laravel Echo(BroadCasting)でPrivateChannelsにEventを送信できない場合

# Laravel EchoをDBにRedisを利用してPrivate ChannelsにBroardCastをしてもうまくいかない！

## 環境
・ PHP7.3
・ Laravel 6.8系
・ Redis / Socket.io利用

client側のjoinする処理

```js
window.Echo.private("messanger." + $("#room_id").val()).listen("PushEvent", e => {
```

という設定をしていた場合、チャンネルとの接続は

```bash
[12:53:40 AM] - 7mEjV4c00Cc9hVTHAAAA authenticated for: private-messanger.1
[12:53:40 AM] - 7mEjV4c00Cc9hVTHAAAA joined channel: private-messanger.1
```

という風にprivate-messanger.1にjoinedをします。この時 以下のようなphpでeventを発火させると

```php
    public function broadcastOn()
    {
        return new PrivateChannel('messanger.' . $this->talkRoom->id);
    }
```

consoleに次のようなログが出力されます。

```bash
Channel: xxxxx_database_private-messanger.1
Event: App\Events\PushEvent
```

ここで問題が、channel名に**xxxxx_database_が頭について**、先ほどjoinしたルームに届きません！！
ちなみに、window.Echo.privateの引数を変更しても、この名前を設定することはできません（自動的に頭にprivate-がついちゃうので、つけられないのです...）

## 回答

.envに
REDIS_PREFIX=null
を追加しましょう！　このPREFIXが自動的に頭についちゃいます。

(参考)[https://qiita.com/zaburo/items/34289d4573f39113b25a]

以上
Data Robot 海山判別やってみた　AIは海と山違いがわかるのか？

##Data Robot 海山判別
海と山の判別をしてみました　データ数約　5000
![風景　海山.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/a7dfaa11-1d66-2a1e-5113-88fb141330f3.jpeg)
CLASS　は　2
![風景　海山2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/b006cd10-d80b-e7d3-da13-1ce4e2acb23f.jpeg)
![風景　海山3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/5b83827e-9488-8330-c294-94bd02eb1860.jpeg)
![風景　海山4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/1b159265-700b-2777-62dc-5f54f9386bb5.jpeg)
![風景　海山5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/e777d2f2-34b5-26f9-b4a5-58de72c1db66.jpeg)
モデル概要
![風景　海山6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/973d8e79-0267-2be2-66af-29f7e48b0cd6.jpeg)
リフトチャート
![風景　海山7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/3467e71f-9319-e0ef-bd67-b6c61e7d2159.jpeg)
サマリー
![風景　海山8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/bd26d4dd-e998-2945-81f7-4113042ea23b.jpeg)
予想分布他　空と海が混同されることはあまりなさそうです
![風景　海山9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/856d3074-ea5b-dd31-634a-d1b3d6044849.jpeg)
![風景　海山10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/52fbe684-f7a6-3df8-51d6-5d43a901d41b.jpeg)

 Elastic-Net Classifier (L2 / Binomial Deviance)
Regularized Linear Model Preprocessing v2　　でも分析

どこを見ているのか

![風景　海山51.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/8f8a55a5-f60d-fb26-29a5-b748ebd76fb8.jpeg)
![風景　海山50.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/98e70f65-9fb1-27ea-bb7d-b23a1ba9b275.jpeg)
ピクセルマッピングでLEDテープライト制御　NeoPixel+ESP32＋TouchDesigner　

NeoPixelをesp32のボードを使って、artnet wifiにてtouch designerから制御し、ピクセルマッピングにて動作するように制作。
![ARTNET　DMX_ESP32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/dc326277-b632-4912-2e2e-3b953970e304.jpeg)


■準備
・LED  NEO Pixel ws2812b
http://akizukidenshi.com/catalog/g/gI-07915/

今回は60粒のws2812bを使用。

・ESP32ボード
HiLetgo ESP32 ESP-32S NodeMCU開発ボード2.4GHz WiFi + Bluetoothデュアルモード
https://www.amazon.co.jp/gp/product/B0718T232Z/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1

・Aruduinoをインストール
https://www.arduino.cc

・Touch desingnerをインストール
https://derivative.ca

■環境
macOS Catalina 10.15.5
MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
2 GHz クアッドコアIntel Core i5
6 GB 3733 MHz LPDDR4

■手順

esp32にarduino IDEにて書き込み

1・ESP32をAruduinoIDEでの開発するためのセットアップ
VOUT(5V)、GND、IO4(GPIO4) を使用。
![IMG_2736-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/5ca34fab-047b-6ef0-388c-573dfe111e01.jpeg)

2・arduino IDEからライブラリマネージャーでartnet wifiとfastledを検索し、ライブリをダウンロード。

3・ボードマネージャーでESP32 Dev Moduleをダウンロード。

4・USBドライバをインストール
USB – UART ブリッジ VCP ドライバ|Silicon Labs
https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers


5・arduinoのボードはESP32 Dev Moduleを選択し、シリアルポートは	USBUARTとする。

6・サンプルコードを編集
Aruduinoのスケッチ例　ArtnetWifiFastLEDを開く。
下記のssidとpasswordを使用するwifiのものに変更。

// Wifi settings
const char* ssid = "ssid";
const char* password = "pAsSwOrD";

LED settingsを変更。dataPinを4に変更。
numLedsを使用するLEDの粒数に変更。今回は60粒に変更。

// LED settings
const int numLeds = 60; // CHANGE FOR YOUR SETUP
const int numberOfChannels = numLeds * 3; // Total number of channels you want to receive (1 led = 3 channels)
const byte dataPin = 4;
CRGB leds[numLeds]; 

7・AruduinoIDEでESP３２に書き込み。
書き込みの際にはIODのボタンを押しENボタンを押して離す。転送始まったらIODのボタンを離す。
ここで、ハマった。。。これをやらないと書き込みエラー起こります。
参考：ESP32+Arduino 手動書き込み
http://systechw.com/blog_develop/blog_dev_20180415_1.html


８・touchdesigner のサンプルファイルを編集
下記からサンプルファイルを取得。

Intro to TouchDesigner for Pixel Mapping - Ben Voigt and Markus Heckmann
https://www.youtube.com/watch?v=ShYYcr30vJw
サンプルファイル
https://www.dropbox.com/sh/028zsv9zllj13oc/AACi0ZneUL42L8t99L1jkw_Sa?dl=0

DMXアウトをArtnetとし、マルチキャスト	255.255.255.255とする。

最終は下記のような構成にて再構築。
<img width="828" alt="スクリーンショット 2020-07-19 8.39.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/e3db8a8f-2434-7b38-120b-a270b034253a.png">


![IMG_3335.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/21c732b9-3f57-5933-9ce6-d36d542a510d.jpeg)

テレビの裏に間接照明と仕込んで映像と連動したり。
<img width="429" alt="スクリーンショット 2020-07-19 9.25.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/0509c630-9fa8-bde0-e9cc-11ff8e74a6c8.png">





参考；ArtNet DMX で Lチカしてみた。(ESP8266/ESP32 + NeoPixel LED)
https://qiita.com/kitazaki/items/fb3f6e6f5b007b8c3b54

参考；touchdesigner
Intro to TouchDesigner for Pixel Mapping - Ben Voigt and Markus Heckmann
https://www.youtube.com/watch?v=ShYYcr30vJw
サンプルファイル
https://www.dropbox.com/sh/028zsv9zllj13oc/AACi0ZneUL42L8t99L1jkw_Sa?dl=0
pipでdjangoをインストールに失敗したので解決策の備忘

# この記事の内容
djangoをインストールすると何やら怪しげなエラー```There was a problem confirming the ssl certificate```がでたので備忘として記載します。

### 目次
1.環境
2.エラー内容
3.解決方法


# 1.環境
Windows 10
Python 3.7.8

# 2.エラー内容
djangoをインストールしようとしたら下記のような怪しげなwarningが出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668985/8a60c52f-ed9d-0d71-e189-c3049d52c518.png)


```
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/django/    
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/django/    
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/django/    
Could not fetch URL https://pypi.org/simple/django/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/django/ (Caused by SSLErrERROR: Could not find a version that satisfies the requirement django (from versions: none)
ERROR: No matching distribution found for django

```

調べてみるといくつか解決方法が書かれていましたが、一番簡単そうな「Pythonのバージョンをアップデートする」という方法をとりあえず採用しました。

# 3.解決方法
Pythonサイトで最新の3.8.4 (https://www.python.org/downloads/release/python-384/) をインストールします。
すると、

```
Collecting django
  Downloading Django-3.0.8-py3-none-any.whl (7.5 MB)
     |████████████████████████████████| 7.5 MB ... 
Collecting pytz
  Downloading pytz-2020.1-py2.py3-none-any.whl (510 kB)
     |████████████████████████████████| 510 kB ... 
Collecting asgiref~=3.2
  Downloading asgiref-3.2.10-py3-none-any.whl (19 kB)
Collecting sqlparse>=0.2.2
  Downloading sqlparse-0.3.1-py2.py3-none-any.whl (40 kB)
     |████████████████████████████████| 40 kB ... 
Installing collected packages: pytz, asgiref, sqlparse, django
Successfully installed asgiref-3.2.10 django-3.0.8 pytz-2020.1 sqlparse-0.3.1

```

成功しました。
設定テーブルにPKを定義しなかったら本番バッチが死んだ話

システムの設定値をRDBに格納するため、1行しか登録されない設定テーブルを用いることは良くあることだと思います。

そういったテーブルを作る場合、これまで特に根拠なくPKを設定していたのですが（これもベストではない。詳細は後述）、あるとき私は思いました。

「無意味な値をオブジェクトに持たせるのは気持ち悪い（これが本音であとは自分への言い訳）。
1行しかないのにPKもインデックス必要ないし、インデックスがあることでインデックスのロックを考慮しないといけないの良く無くね？
そうだ。もう悪しき習慣はやめてPKは排除しよう！」

そしてその設定テーブルをリリースした**「半年後の完全に無関係なリリース」**の直後、夜間バッチが落ちました…

この仕事して20年経っても、こんな恥ずかしい失敗をやらかす自戒を込めて書き起こしておくこととしました。

# 落ちた原因

対象のテーブルは関連するマスターテーブルと一緒に、設定変更の際は全削除・全追加する設計になっていました。

しかし、「設計変更した対象のテーブルだけ」テーブル削除がなくてINSERTだけ書いてありました。結果

- 初回のリリースは成功した
- つぎのマスター更新のときに設定テーブルが2行になった
- 2行以上あったらエラーにするコードでバッチが死んだ（これは正）
- 私ではない担当者が夜間電話対応で寝不足になった。スマヌ・・・

これまで通り、自動発番されないPKが設定されていればINSERTでエラーとなって遅くても本番リリース時には気が付けたはずなのに、そうしなかったがために初回利用時まで不具合が隠蔽される形になってしまいました。

テスト環境では頻繁にDBごと作り直しているので気が付かなかったのです。

# じゃあ、やっぱりPKは設定すべきか

というと、よく考えるとそうではないですよね。

PKに異なる値をINSERTしてしまえば2行できてしまう訳で、ないよりマシですがベストでもありません。

# 設定テーブルのベストプラクティス

という訳で、まじめに考えつつ調べてみましたが、こちらの方式が良さそうです。

参考文献：
- [Using a Single Row configuration table in SQL Server database. Bad idea?](https://stackoverflow.com/questions/2300356/using-a-single-row-configuration-table-in-sql-server-database-bad-idea)


DB製品によって実現方法は変わりますが、つぎを満たす設計にします。

- 1行を保証するための列を用意する
- 該当列に1種類の値しか設定できない制約を付与する
- 該当列にユニーク制約を付与する

enumが利用できるデータベースでは値をひとつしか取らないenum列を作っても良いですし、SQL Serverのようにenumが無い場合はチェック制約とユニーク制約を併用しても良いでしょう。

```sql
create table CacheConfig (
	Size int not null,
	EffectivePeriod time(7) not null,
	SingleRowConstraint bit not null default 0,
	constraint CK_SingleRowConstraint check (SingleRowConstraint = 0 ),
	constraint AK_SingleRowConstraint unique(SingleRowConstraint)
)
```

こんな感じですかね。SingleRowConstraint列が1行に限定するための列です。

defaultを設定しておくことで、実質SingleRowConstraint列は無視して扱えるので悪くないと思います。

という訳で、自戒を込めて書き残しておきます。皆さんがこんなことでトラブらないことを祈っています。
LaserGRBLを使ってみた

#LaserGRBL

本来の目的である基板づくりの着手開始。
まずはテスト的にいろいろやってみた。

・付属のNEJEソフト
利点：簡単。前回のキーホルダーはこれ。
欠点：設定がなさ過ぎ。画像をGコードに変換する際の画像の調整が出来ないのでエッジが汚い。

・LaserGRBL
先人の方々が、「使いやすい」「高機能」とのことで使ってみた。
利点：取り込んだJPGやBMP等の画像のノイズ除去やコントラストなど非常に細かい設定が可能。
エッジを最後にルーティングしてくれるのではっきり綺麗
欠点：途中でエラーでしょっちゅう止まる（信号ノイズ）

ひどいときは5秒おきくらいに止まるのを手動でリセット・再開を繰り返してなんとかできたもの
（この後要エッチング）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/3015ee52-0adf-206c-0c63-8397b7ebde4e.png)
設定：　80mm/min　1mm当りのレーザー本数8　（6で充分）　出力30％

とまってしまう原因は電源ノイズかと思ったが、あまり関係ないみたい。
コントローラーがUSBインターフェースにCH340Gを使っている限りどうしようもない模様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/92a56f4e-3ae5-0a6a-207f-aeac2245c7d4.png)

コントローラーの換装を真剣に検討中。
特定IPからMySQLへのアクセスを許可する

# 環境

```
$ mysql --version
mysql  Ver 8.0.20-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))
```

# 手順

```
> create user 'username'@'192.168.1.1' identified by 'password';
> grant all privileges on dbname.* to 'username'@'192.168.1.1';
```
Vue(Nuxt.js) で親子コンポーネント間でイベント（メソッド）を呼び出す方法

Vue(Nuxt.js) で親子コンポーネント間でイベント（メソッド）の呼び出す方法です。

## まずは、親コンポーネントで子コンポーネントを読み込む

↓子コンポーネント↓

```vue:Child.vue
<template>
  <div class="child">
    <button @click="childEvent">親のイベントを呼び出す</button>
  </div>
</template>

<script lang="ts">
import Vue from 'vue'
export default Vue.extend({})
</script>

```
↓親コンポーネント↓

```vue:Parent.vue
<template>
  <div class="parent">
    <Child @parent-event="parentEvent" />
  </div>
</template>

<script lang="ts">
import Vue from 'vue'
import Child from '~/components/Child.vue'

export default Vue.extend({
  components: {
    Child
  }
})
</script>

```

## 子コンポーネントから親コンポーネントのイベント（メソッド）を呼び出す

```vue:Child.vue
<template>
  <div class="child">
    <button @click="childEvent">親のイベントを呼び出す</button>
  </div>
</template>

<script lang="ts">
import Vue from 'vue'

export default Vue.extend({
  methods: {
    childEvent() {
      this.$emit('parent-event')
    }
  }
})
</script>

```

```vue:Parent.vue
<template>
  <div class="parent">
    <Child @parent-event="parentEvent" />
  </div>
</template>

<script lang="ts">
import Vue from 'vue'
import Child from '~/components/Child.vue'

export default Vue.extend({
  components: {
    Child
  },
  methods: {
    parentEvent() {
      console.log('parentEvent')
    }
  }
})
</script>

```

`this.$emit('parent-event')`で親にイベントを伝えます。
`<Child @parent-event="parentEvent" />` で親は受け取ったイベントで、自身のイベント（メソッド）を呼び出します。

### イベントと共に引数を渡すこともできる

```vue:Child.vue
this.$emit('parent-event', '引数')
```

```vue:Parent.vue
<template>
  <div class="parent">
    <Child @parent-event="parentEvent($event, argument)" />
  </div>
</template>

<script lang="ts">
import Vue from 'vue'
import Child from '~/components/Child.vue'

export default Vue.extend({
  components: {
    Child
  },
  methods: {
    parentEvent(argument: string) {
      console.log(argument)
    }
  }
})
</script>

```

## 親コンポーネントから子コンポーネントのイベント（メソッド）を呼び出す方法

```vue:Parent.vue
<template>
  <div class="parent">
    <Child ref="child" />
    <button @click="parentEvent">子のイベントを呼び出す</button>
  </div>
</template>

<script lang="ts">
import Vue from 'vue'
import Child from '~/components/Child.vue'

export default Vue.extend({
  components: {
    Child
  },
  methods: {
    parentEvent() {
      this.$refs.child.childEvent()
    }
  }
})
</script>

```

```vue:Child.vue
<template>
  <div class="child"></div>
</template>

<script lang="ts">
import Vue from 'vue'

export default Vue.extend({
  methods: {
    childEvent() {
      console.log('childEvent')
    }
  }
})
</script>

<style scoped></style>

```

親コンポネートで`<Child ref="child" />` ref属性を指定して、`this.$refs.child.childEvent()`で子コンポーネントのイベントを呼び出すことができます。
[UE4] キャラクターをランダムな位置に生成させる

# はじめに
VRのアプリを作成した時に、キャラクターをランダムな位置に生成させる処理を作成したので、作り方の記事を書いてみます。UE4.25.1を使用しています。今回作成した処理については特にVRに依存する箇所はありません。完成イメージは以下動画のような感じです。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">大量のニワトリを錬成した <a href="https://t.co/40rj8CQRNm">pic.twitter.com/40rj8CQRNm</a></p>&mdash; 高浜 (@SatoshiTakahama) <a href="https://twitter.com/SatoshiTakahama/status/1282809735972966404?ref_src=twsrc%5Etfw">July 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
上記動画では100体のキャラクター生成を実施しているのですが、OulusQuestでは起動時処理が重すぎて固まっており、ちょっと処理能力の限界を超えていたようです(生成後は落ち着くのですが)。

# 概略仕様
・起動時に、箱型のエリア内のランダムな位置に指定した数のキャラクターを生成する
・エリアは複数配置でき、どのエリアに配置されるかもランダムに決定される

# 作り方
## 準備
・使用したいキャラクター(Characterクラスから派生させた、AIコントローラを使用するもの)がいるプロジェクトを用意します。

## GameModeのBP作成
今回、GameModeは、ミニマップへの参照を手のコントローラーに渡すために使用します。
・コンテンツブラウザ上で、新規追加=>ブループリントクラスを選択するとダイアログが表示されるので、親クラスとしてGameModeを選択しOKを押します。すでにプロジェクトにGameModeがあるならそちらを使用すればよいので、新規追加はしなくても問題ないです。
・生成されたBPの名前をBP_GameModeに変更し、編集画面を起動します。
・BP_GameModeにSpawnAreaRefArray、SpawnCountの２個の変数を追加します。SpawnCountにはキャラクターを生成する数を設定しておきます(最初は少ない数で試したほうが良いと思います)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/99e4752f-00a5-845e-d09c-a8c9865a68fb.png)
・ワールドセッティングでBP_GameModeを設定します。

## エリア指定のBP作成
・コンテンツブラウザ上で、新規追加=>ブループリントクラスを選択し、表示されるダイアログでActorを押します。
・生成されたBPの名前をBP_SpwanAreaSetに変更し、編集画面を起動します。
・BP_SpwanAreaSetに新規コンポーネント追加でBoxCollisionを追加します。
・BP_SpwanAreaSetのイベントグラフを開いて、以下のようにノードを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/69903fe6-29a6-fc1d-8530-76aa973c82b6.png)

## キャラクター生成処理を追加
・BP_GameModeの編集画面を起動し、イベントグラフを開いて、以下のようにノードを追加します。SpawnActorは、ノードを追加するときにSpawnActorで検索して"クラスからアクタをスポーンします"を選択すると、スポーンアクタNONEという名前のノードができるので、Classのところに生成したいキャラクターを指定すると下記画面のノードのように変化します。SpawnActorでキャラクターを生成するとそのままではAIコントローラーが付かないので、SpawnDefaultActorで付加するようにしています。また、キャラクターを生成するときに失敗するケースがあるので、成功したことを確認してから実行しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/7eb0fe41-a8ae-d7c6-58ba-ea06b4ca3c02.png)

## エリア指定のBPをマップ上に配置
・BP_SpwanAreaSetをいくつかマップ上に配置し、位置とサイズを適当に調整します。サイズが小さいと、キャラクターの生成に失敗する場合があるので、ある程度大きくしたほうが良いです。

## 完成
ここまで作成した状態で実行すると、起動時にキャラクターが生成されます。

## 追記
後で気が付いたのですが、GameModeに依存する処理(Cast)があると、GameModeを切り替えられないのでよくないですね。
GameModeにアクセスするためのインターフェースを定義してこれを経由するのがよさそうです。以下に実装例を示します。
・インターフェースIBP_Gamemodeを作成し、関数AddSpawnAreaを定義します。
・BP_SpwanAreaSetを以下のようにノードを修正します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/582ea92e-5fcd-ec2e-1a15-fa4904fb6afc.png)
・BP_GameModeにAddSpawnAreaの実装を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/fc4050ea-b1fe-b86b-f7a6-a764e3b9d8df.png)
もしもOCIのObject Storage を削除しようとして"Active Preauthenticated Requests still exist..."で失敗したら

# ObjectStorageの削除の失敗時
ObjectStorageを削除しようしても、"Active Preauthenticated Requests still exist for bucket 'バケット名'. Delete them first. "と表紙されて、削除が失敗することがあります。
![rapture_20200719080638.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/cddcced1-f4e9-0769-52c9-6667e479cad5.jpeg)

そのURIさえ知っていたらObjectStorageにアクセスできるアクセスポイントが公開されていて、削除できないという意味なので事前承認済みリクエストを削除する必要があります

https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/usingpreauthenticatedrequests.htm
のガイドに従い preauth-request がどうなっているかcliで調査します。
### oci cli コマンドで preauth-requestの取得

```powershell:　preauth-requestのlist取得例
$namespace = "iddktd4oigof"
$bucketname = "bucket-nemotech2"
oci os preauth-request list -ns $namespace -bn $bucketname
```

で Preauthenticated request を調査します、bucket名は ocid ではなく名前そのものを使います。
なお、ここでは --profile <自分の設定したprofile> というオプションが効かず、cliのconfigファイル内の [DEFAULT] が使われて　

```
FileNotFoundError: [Errno 2] No such file or directory: '.oci/key.pem'
```

といった感じのエラーが出ることがあります、この場合は
.oci/config のファイルを修正して [DEFAULT] のアカウントでcliが動くように書き換えて、 --profile のオプションを使わないようにします。
今度は動きます。

```
json:出力例
{
  "data": [
    {
      "access-type": "AnyObjectWrite",
      "id": "2Ai9lUumHSwQxUch5LI0+1AHM8OHChynqF7ft9FH7JY=",
      "name": "standardbucket-20191229-1554",
      "object-name": null,
      "time-created": "2019-12-29T06:55:02.270000+00:00",
      "time-expires": "2020-01-05T06:54:52.271000+00:00"
    },
    {
      "access-type": "ObjectReadWrite",
      "id": "H0WJO/lNLipod6wLY139Epiq/bKt/ppsxTTxGmcUPzc=:pre-auth-bucket1",
      "name": "\u6a19\u30af\u30c8-20191229-1551",
      "object-name": "pre-auth-bucket1",
      "time-created": "2019-12-29T06:51:54.695000+00:00",
      "time-expires": "2020-01-31T06:51:00+00:00"
    }
  ]
}
```

ここで、2つのidが見えるので、この2つの preauthenticated_request_id を削除します
この2つを削除を実行します
### oci cli コマンドで preauth-request の削除

```powershell:削除コマンドサンプル
$preauthenticated_request_id = "2Ai9lUumHSwQxUch4LI0+1AHM8OHChynqF7ft9FH7JY="
oci os preauth-request delete -ns $namespace -bn $bucketname --par-id $preauthenticated_request_id

$preauthenticated_request_id = "H0WJO/lNLipod6wLY1e9Epiq/bKt/ppsxTTxGmcUPzc=:pre-auth-bucket1"
oci os preauth-request delete -ns $namespace -bn $bucketname --par-id $preauthenticated_request_id
```
再び、コンソールからバケットを削除してみると、今度は消せると思います。
違うPCからGitでcommitしたい時の著者とアドレスの変更

違うPCで`clone`して作業後に、いつもの感じで`commit`すると「ローカルの別人からの`commit`」になってしまいます。草も生えません笑

そんな時は、`commit`する前に著者とメールアドレスの情報を変更する必要があります。

```terminal
git config --local user.name [username]
git config --local user.email [email]
```

私の場合は、このような形で設定します。

```terminal
git config --local user.name tetsu-upstr
git config --local user.email example@gmail.com
```

## 参考
[Git の Commit Author と Commiter を変更する](https://qiita.com/sea_mountain/items/d70216a5bc16a88ed932)
LET OVER LAMBDAをsbclで試しながら読んでいたらいきなりはまった

長らく積ん読状態だったLET OVER LAMBDAが出てきたのでコロナでやることもないからぽちぽちsbclで試しながら読んでいたのですが、2章の`defmacro/g!`が動かなくていきなりはまりました。

調べると0.3で作成した`flatten`の動作がquasiquoteと組み合わせて使ったときにおかしくて、

```console
* (flatten '`(,x ,y))
(SB-INT:QUASIQUOTE ,X ,Y)
```

となっています。ここは`,X`や`,Y`ではなくて`X`, `Y`になるはずなのですが。ということで`,X`のところを`describe`してみると

```console
* (describe (cadr (flatten '`(,x ,y))))
,X
  [structure-object]

Slots with :INSTANCE allocation:
  EXPR                           = X
  KIND                           = 0
```

などとなんだか構造体になっていまして、これはatom扱いですからうまくいかないわけですね。

この辺までしらべてgoogleさんにお伺いを立ててみると[#:g1: SBCL 1.2.2でのbackquoteの変更](https://g000001.cddddr.org/3615721500)というのが出てきましてよく知られた問題であるようで、適当に選んだ処理系のsbclがハマリポイントだったようです。読み込んだプログラムが古き良きS式じゃなくて構造体になるのはあまり良くないような気がするんだけど、こうすると何かが便利だったりするのでしょうか。

ここの少し先で`defmacro/g!`をさらに改良した`defmacro!`が作成されて、これが後の章でも便利に使われる道具になるようなのでどうしたものかなと思ったのですが、かなり古い問題なので既に対処方法も確立していて、原著の[Errata](https://letoverlambda.com/index.cl/errata)からリンクされている[let-over-lambda.lisp](https://github.com/thephoeron/let-over-lambda/blob/master/let-over-lambda.lisp)を使えばいいようでした。
PATHを通す意味

<h1>PATHを通す意義について</h1>
プログラミングでJAVAやC言語の環境構築をしていると、よく目にするのがPATHを通してください、というのがあります。
よく意味が分からずにやってしまっていたのですが、今回その意味についてまとめてみました。
<h2>PATHの通し方</h2>
①画面左下の虫眼鏡にcontを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/9d1c864b-bd4c-852b-0af5-0db507a093e5.png)
②青くなっているコントロールパネルをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/4070e7e9-adbc-1507-a2e7-ed6eb080ac43.png)
③左上部の緑字のシステムとセキュリティをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/bf59f266-06c6-a2c2-68a1-f5dc618963c4.png)
④上から三番目の緑字のシステムをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/a3de3f18-909b-3e75-641f-5d7fd247a139.png)
⑤左メニューのシステムの詳細設定をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/d9636c78-2b53-f71b-5165-ee060e9c98c2.png)
⑥この画面が表示されるので「環境変数(N)...」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/ac84c26f-1cf3-a831-cb43-a788f14c9472.png)
⑦ユーザーの環境変数のPathが薄い青になっている状態で編集をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/48058172-5a9a-a1e4-3890-f74ecf93b7fa.png)
⑧新規(N)ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/80016917-0773-08e1-86a8-a0b579a679ef.png)
⑨今回私の場合はC:\MinGW\binを追加してOKを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/0358e6f2-0f0a-91bc-13bd-13ace9cc7c38.png)
⑩後はすべてYESにしてPATHを通すが終了です
<h2>何故PATHを通すのか</h2>
PATHを通すのは、より簡略化するためである
例えばC:\Windows\System32\notepad.exeというメモ帳がある。
これだと、コンピュータ側でCドライブのwindowsフォルダの中のSystem32の中のnotepad.exeという探し方になる。
しかし、ここでC:\Windows\System32というPATHを通しておくと、すぐに見つけることができるし、書き方もC:\Windows\System32\notepad.exeではなくてnotepad.exeでだけでC:\Windows\System32\も補ってくれるようになる。
Ubuntuでトラックボールマウスのボタン割り当て

##### 目的：愛用しているELECOM社製のトラックボールマウスM-DT2DRBKの左側面ボタンに[戻る]/[進む]ボタンを割り当てる

**手順１：必要なパッケージをインストール**

```terminal
sudo apt-get install xev xvkbd xbindkeys
```

**手順２：ボタンのIDを確認**
まず、マウスのIDを確認する

```terminal
xinput list
```
id=12にELECOM TrackBall Mouseが割り振られている事が分かる

次に、ボタンのIDを確認する。機能を設定したいボタンを**押しながら**以下のコマンドを実行する

```terminal
xinput query-state 12
```
押していたボタンのみ**down**、それ以外は**up**と表示される
この方法で調べたところ、[戻る]ボタンはID=9、[進む]ボタンはID=8であることが分かった

※補足：ホイールクリックや右クリックなど、押下しながらコマンド実行できないボタンのIDを知りたい場合は、`xev`コマンドで確認すると良い

**手順２：ボタンに[戻る]/[進む]機能を割り振る**
~/.xbindkeysrcを作成し、機能を記述する

```terminal
nano ~/.xbindkeysrc
```

```~/.xbindkeysrc
"/usr/bin/xvkbd -xsendevent -text "\[Alt_L]\[Left]""    #[戻る]
   m:0x0 + b:9                                          #ボタンID:9

 "/usr/bin/xvkbd -xsendevent -text "\[Alt_L]\[Right]""  #[進む]
  m:0x0 + b:8                                           #ボタンID:8
```

　
参考URL：
How to assign “back” and “forward” actions to Logitech Anywhere Mouse MX' horizontal scroll wheel?
https://askubuntu.com/questions/101105/how-to-assign-back-and-forward-actions-to-logitech-anywhere-mouse-mx-horizo
Linuxでマウス/トラックボールのボタン割当て変更
https://gato.intaa.net/archives/15797
C言語でのWINDOWSの環境構築について

<h1>C言語の環境構築方法について忘備録</h1>

今回はvisual studio codeを使用します。

①まずは、こちらのURLでVSCODEをダウンロードします。
https://azure.microsoft.com/ja-jp/products/visual-studio-code/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/276e0f5a-ab58-90f9-f9e1-571e6932d2a6.png)
　　　　　　　　　　　　　　　　　**↑**
②上記、青く囲われている**「今すぐダウンロード」**クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/404de29b-a212-22c8-3c3c-bf067045dd63.png)
　　　　　　　　　　　　　　　　　**↑**
③今回私はWINDOWS環境なので、上記、青く囲われている左の**「Windows7,8,10」**クリックします。
④すると、画面左下にexeファイルが出てきます。vscodeUserSetUp.exeというものです。クリックして実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/17a6f66a-5cc1-86ed-b347-6151a057890e.png)
⑤次に、上記同意するにチェックして「次へ(N)」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/49ac4fb4-bfef-afea-075f-bc5e0854c8bb.png)

⑥追加タスクの選択画面で、チェックボックスを以下のようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/ad59fd51-341e-ee94-892f-8e3a5021d4b1.png)
「次へ(N)」を押下します。

⑦「インストール(I)」でインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/bd52e6f9-0bda-df99-2f8c-a35338728b3b.png)

⑧この画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/784b4367-8a9d-451d-2aaf-117671c5cb08.png)

⑨この画面で完了ボタン押下して終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/3b4bc899-0237-e668-2cf3-c6da6cd6a112.png)

⑩このような黒い画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133983/86bf76a8-4806-932c-287a-8ba2a47670b3.png)
(自分用)Flask_AWS_3(SQL動いてるか確認)

# 項目
1. dbとテーブルを作っておく
2. PyMySQLインストール
3. 動作確認

# 1.dbとテーブルを作っておく
- `http://前に設定したAWSのパブリックIP/phpmyadmin/`でphpMyAdminに接続
- `test`ってdbを作っておく
- `test`をクリックして、上の方の`SQL`を選択しこれを入力

```sql:SQL文
CREATE TABLE players (
  id INT NOT NULL PRIMARY KEY,
  name VARCHAR(32),
  level INT,
  job_id INT
);

CREATE TABLE jobs (
  id INT NOT NULL PRIMARY KEY,
  job_name VARCHAR(10),
  vitality INT,
  strength INT,
  agility INT,
  intelligence INT,
  luck INT
);

INSERT
  INTO players(id,name,level,job_id)
  VALUES
    (1,"タキ",12,6),
    (2,"ケン",7,2),
    (3,"リン",1,1),
    (4,"ユウ",3,3),
    (5,"クレア",10,4),
    (6,"ショウ",5,2),
    (7,"さくら",7,1),
    (8,"ジャック",5,4),
    (9,"ロック",12,6),
    (10,"じゅん",1,NULL);

INSERT
  INTO jobs(id, job_name, vitality, strength, agility, intelligence, luck)
  VALUES
    (1,"戦士",8,8,4,4,3),
    (2,"盗賊",3,3,8,5,7),
    (3,"狩人",5,5,7,5,4),
    (4,"魔法使い",3,2,6,8,6),
    (5,"僧侶",5,5,3,7,5),
    (6,"勇者",10,10,10,10,10);
```

- `構造`って所に`players`,`jobs`があれば成功

# 2.PyMySQLインストール
```bash:ターミナル
# まずAWSに接続
$ ssh -i ~/.ssh/FirstKey.pem ec2-user@(パブリックIP)

# モジュールを確認
$$ pip freeze

# PyMySQLインストール
$$ pip install PyMySQL
```
- AWSの接続はまだ切らないでね

# 3.動作確認
- まずpyファイルを作る

```bash:ターミナル
# pyファイル作成
$$ vi /var/www/html/db_test.py
```

```python:db_test.py
# iを押して書き込みモード、esc→:wqで保存終了
from flask import Flask, render_template
import pymysql
app = Flask(__name__)

def getConnection():
    return pymysql.connect(
        host='localhost',
        db='test',
        user='root',
        password='phpMySQLと同じパスワード',
        charset='utf8',
        cursorclass=pymysql.cursors.DictCursor
    )

@app.route('/')
def select_sql():
  
    connection = getConnection()
    message = "Hello world"

    sql = "SELECT * FROM players"
    cursor = connection.cursor()
    cursor.execute(sql)
    players = cursor.fetchall()

    cursor.close()
    connection.close()

    return render_template('view.html', message = message, players = players)
```

- このpy文は前回の[Flaskからdb](https://qiita.com/pokurin123/items/6ff09a1c6c590b5203a5)でやったのと同じもの
- 次はテンプレートファイルを作る

```bash:ターミナル
# まずテンプレートファイルを入れるtemplatesを作成
$$ mkdir /var/www/html/templates

## この中にテンプレートファイルを作る
$$ vi /var/www/html/templates/view.html
```

```html:view.html
<!--書き方は前と同じ-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Hello SQL</h1>
    <p>{{ message }}</p>

    {% for player in players %}
        <p>{{ player }}</p>
    {% endfor %}
</body>
</html>
```
- 準備完了

```bash:ターミナル
# pyファイルを動かす
$$ python3 /var/www/html/db_test.py
# 終わったらctrl+c
```
- `http://AWSで設定したパブリックIPアドレス:5000`に接続し、いい感じに表示されれば成功

# 4.終わりに
- ここまでいけばもうスクリプト書くだけ！
【RSpec】POSTリクエストパラメータの数値が文字列になってしまう

# 解決策

`as: :json` オプションをつける。

```rb
post '/posts', params: post_params, as: :json
```

# 解説

> rspecのデフォルトのCONTENT_TYPEはapplication/x-www-form-urlencoded なので、適切に文字列に変換してくれてます、jsonを送信する場合はapplication/jsonに書き換えるのが最良だと思います
https://sinshutu-kibotu.hatenablog.jp/entry/2018/07/06/202132

なるほど。

# サンプルコード

```rb
RSpec.describe 'post add', type: :request do
  describe 'POST /posts' do
    context '投稿記事作成' do
      let(:post_params) do
        {
          age: 2,
          sex: 'female',
          status: 0,
          answer: {
            text: '初の投稿です。',
            score: 1
          }
        }
      end

      it 'create posts' do
        expect do
          post '/posts', params: post_params, as: :json
        end.to change { Post.count }.by(1)
      end
    end
```

# 所感

ActiveModel::Attributesで型をcastする、というアプリケーション側での解決策も不可能ではない気がした（が、サンプルコードのようにパラメータがネストしていると大変だったため断念）。

- https://qiita.com/alpaca_taichou/items/bebace92f06af3f32898
- https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html


# 参考リンク

- https://stackoverflow.com/questions/36333434/rails-rspec-json-integers-being-converted-to-strings-when-testing-post-call
- https://qiita.com/kasei-san/items/05b146b0ebb529b318cd
- https://sinshutu-kibotu.hatenablog.jp/entry/2018/07/06/202132
- https://qiita.com/soutaro/items/b990dc9b0f9e46b0f4c2
フォルダにコピー制限がかかっている場合のフォルダコピーコマンド

copy_dir.bat コピー元パス コピー先パス

```copy_dir.bat
@echo off

if "%1"=="" (
 echo コピー元のフォルダを指定してください。
 exit /b 1
)

if "%2"=="" (
 echo コピー先のフォルダを指定してください。
 exit /b 1
)

pushd %1

echo フォルダ作成開始：%1 "->" %2
mkdir %2
forfiles /s /p %cd% /c "cmd /c if @isdir==TRUE mkdir %2@relpath"
echo フォルダ作成完了

echo ファイルコピー開始：%1 "->" %2
forfiles /s /p %cd% /c "cmd /c if @isdir==FALSE copy @path %2\@relpath"
echo ファイルコピー完了

popd

echo 正常終了
exit /b 0
```
ゴムのアヒルちゃん

# ゴムのアヒルちゃん
『達人プログラマー』を読んでいたら、噂に聞いたことがある<b>ラバーダックデバッグ</b>に出くわしました。

> 問題の原因を探し出すための非常に簡単で効果的なテクニックとして、「誰かに説明する」という手法があります。この場合の誰かは、あなたの肩越しにスクリーンを見ながら、（バスタブに浮いたゴムのアヒルちゃんのように）定期的にうなずくだけでよいのです。

言葉にして説明をすることで、内容が整理されて気づきを得ることができる、というものですね。

大事なことは言語化する作業であるため、その相手はゴムのアヒルちゃんで十分。もちろん、ゴムのアヒルちゃんでなく、観葉植物でも美少女フィギュアでも何でもOK。

# プログラマーのためだけのものじゃない
「問題の原因を探し出すための非常に簡単で効果的なテクニック」とあるように、コードのデバッグに限らず、課題解決のツールとして広く使えそうです。

他にも、物事の理解度を測る手助けにもなります。ゴムのアヒルちゃんに説明をすることで、理解の浅い部分が浮き彫りになります。

# リモートワークの今だからこそ
こんなに便利なラバーダックデバッグですが、職場で実践するのは中々難しいと思います。「バグっているのはコードではなくお前だ！」と突き放されそうです。

しかし、リモートワークの浸透した今なら、自宅でお手軽に実践することができます。

相談する前に、質問する前に、まずはゴムのアヒルちゃんに話しかけてみてはいかがでしょうか？

# 参考
- [『達人プログラマー』](https://shop.ohmsha.co.jp/shopdetail/000000004729/)
- [ラバーダック・デバッグ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%90%E3%83%BC%E3%83%80%E3%83%83%E3%82%AF%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0)
読み込んだVRMファイルがBlendShape.SurprisedやBlendShape.Extraを持っていたらtrueを返す関数を作ってみた

VRoid Studioで作ったモデルは、BlendShape.SurprisedとBlendShape.Extraという表情を持っています。VRMはFun、Angry、Sorrow、Joyの4つの表情を基本で持つことになっていますが、それ以外の表情も持つことが出来るからです。

VRoid Studio製モデルが持つこの二つの表情は使い勝手が良いので、できれば使いたい。

そこで、VRMアプリを作るときに、特定の名前の表情（BlendShapeProxy）を持っていたらtrue、持っていなかったらfalseを返す関数を作ってみました。


```C#:特定のBlendshapeProxyを持っているかのチェック
using VRM;

// 中略

    public bool DoesItHave(string bsname, GameObject vrm)
    {
        var prx = vrm.GetComponent<VRMBlendShapeProxy>();
        var clips = prx.BlendShapeAvatar.Clips;
        foreach(var c in clips)
        {
            if(c.name == bsname)
            {
                return true;
            }
        }
        return false;
    }
```

`DoesItHave("BlendShape.Surprised", VRM)`のように書くと、`VRM`に入っているGameObjectがその`"BlendShape.Surprised"`という名前のを持っていればtureを返します。

（※もっと良いやり方があればぜひ教えてください）