ひとメモ

当ページのリンクには広告が含まれています

犬が怖いので、ChatGPT AstraとVR暴露療法アプリを作り始めた

犬が怖い。

小さい犬なら比較的大丈夫なのだけど、大きい犬はかなり怖い。特に突然吠えられるのが苦手で、散歩中の犬とすれ違うだけでもちょっと緊張する。

どうにかならないものかな、と以前から思っていた。

そんな中で知ったのが「VRを使った暴露療法」。

恐怖症に対して、いきなり本物の対象と対面するのではなく、VRの中で段階的に慣れていく方法が研究されているらしい。

それを知って最初に思った。

犬でもできるんじゃない?

犬恐怖症向けのVRアプリが欲しい

VRなら、現実では難しいことができる。

最初は遠くに犬がいるだけ。

慣れたら少し近くへ。

次は犬がこちらを見る。

さらに慣れたら歩いたり、近づいてきたり、最後には吠えたり。

怖さを少しずつ調整できるし、本当に無理ならゴーグルを外せば終わる。

これなら私でも犬に慣れる練習ができるかもしれない。

問題は、そんな都合のいいVRアプリを私は持っていないことだった。

じゃあ作るか。

……となったのは、たぶんAIがあるからだと思う。

VR開発未経験だけど、AIに作ってもらう

私はVRアプリを作ったことがない。

Unityにも詳しくないし、3Dモデルを作れるわけでもない。

少し前なら、この時点で「こんなアプリあったらいいのにな」で終了していたと思う。

でも今はChatGPTがいる。

やりたいことを相談して、開発の進め方を考えてもらって、実際の作業もかなりAIに任せてみることにした。

作っているアプリには、とりあえず 「CalmDog」 という名前をつけた。

目標はシンプル。

犬が怖い人が、VRの中で少しずつ犬に慣れるためのアプリを作る。

そして自分で使う。

思ったより早く「犬がいる」ところまで来た

開発を始めて、現在はMeta Quest 2で実際に動かせるところまで来ている。

舞台は日本の住宅街。

そこにジャーマン・シェパードがいる。

まだできることは少ない。

住宅街を移動できて、犬の表示・非表示を切り替えられて、犬には呼吸しているような軽い動きがついている程度。

吠えない。

追いかけてこない。

襲ってこない。

ただ立っているだけ。

なので、実際にQuest 2をかぶって試してみた。

犬に近づいてみる。

……。

普通にちょっと怖い。

まだ何もされてないのに。

VRになるだけで印象が全然違う

PCの画面で見ると、普通の3Dモデルに見える。

ところがVRの中に入ると、ちゃんと犬の大きさがある。

距離がある。

自分が近づいていくと、当然ながら犬がどんどん大きくなる。

「この犬は絶対に何もしてこない」と頭では分かっているのに、近づくにつれて少し身体が警戒する感じがある。

これは面白かった。

正直、最初はもっとフォトリアルに作らないと恐怖を感じないんじゃないかと思っていた。

でも、どうもそうでもないらしい。

背景も犬もまだ完璧なリアルさではないのに、VR空間で目の前にいるだけで結構違う。

だったら住宅街をひたすら綺麗にするより、犬の存在感を作り込む方が大事なんじゃないかと思い始めた。

次は「生きてる犬」にしていく

ということで、今は犬の動きを作っている。

ずっと同じ場所で同じ姿勢をしていると、さすがに置物っぽい。

自然に周囲を見たり、こちらを見たり、少し姿勢を変えたり。

そういう自発的な行動を入れて、「そこに犬がいる」感じを強くしていきたい。

その先では、歩く、近づく、吠える、といった行動も追加したい。

最終的には、

遠くに静かな犬がいる ↓ 近くに犬がいる ↓ 犬がこちらを見る ↓ 犬が動く ↓ 犬が近づいてくる ↓ 犬が吠える

というように、少しずつ難易度を上げられるようにするつもり。

どこまで作れば実際に「犬への恐怖に慣れる練習」として使えるのかも、自分で試してみたい。

「欲しいものがないから作る」が簡単になった

今回、VR暴露療法そのものと同じくらい面白いと思っているのがAIでの開発だ。

私はVR開発者ではない。

それでも、

「こういうものが欲しい」

とAIに説明して、

作ってもらって、

自分でVRゴーグルをかぶって確認して、

「ここをこうしてほしい」

とまたAIに伝える。

これを繰り返すだけで、少なくとも「住宅街に犬がいて、自分がその犬に近づけるVRアプリ」まではできてしまった。

数年前なら「こんなのあったらいいのにな」で終わっていたものを、今は自分で作り始められる。

この変化はかなり面白い。

まだCalmDogは開発の序盤。

本当に犬への恐怖を和らげる練習として使えるものになるのかも分からない。

でも少なくとも、VRの犬に近づいただけでちょっと怖かった。

第一段階としては、むしろ成功なのでは?

ということで、しばらく開発を続けてみる。

次はもう少し犬らしく動いてもらう予定。

そしてそのうち、吠えてもらう。

そこまで作ったときに、開発者本人がテストを嫌がり始めないことを祈る。

放送大学とUoPeopleで迷ってUoPeopleに出願しました

放送大学

卒業までの費用: 約70万円
言語: 日本語
学習方法: テキストと動画
学費支払い時期 履修登録時

UoPeople

卒業までの費用: 約60万円(2022年4月1日現在の為替レート)
言語: 英語
学習方法: テキスト
assessment fee支払い時期: コースの終了時

UoPeopleでhealth scienceのBachelor's degreeを目指す

放送大学も資料取り寄せて読んだらとても面白そうでしたが、動画を見るのが性に合わない…。
UoPeopleは低速なネット環境しかない地域に暮らしている人にも幅広く学びの機会を持ってほしいという理念から、動画ではなくテキストベースの学習になるというのが大きなメリットでした。

学位を取りたい気持ちが一番にあるけれど、ついでに英語の勉強にもなるというのも良い点です。

誰でもスカラーシップに申し込めるので、お金が足りなくてもなぜ払えないかを500字以上で説明して承認されれば、自分が決めた払える金額を分割してコース終わりごとにassessment feeとして払うことになるようです。

まずは英語が問題なく使えることを証明するために、English composition のコースからスタートします。

42 Tokyoに合格しました(そして休学しています)

42 Tokyoを知らない人は以下公式サイト参照。 42tokyo.jp

表題にもある通り、一ヶ月に渡る入学試験を受け無事42Tokyoに合格し、今年4月に入学しました。
そしてまもなく休学しました…。

これから42Tokyoを受ける人に私から言えることがあるとすれば、出願時の写真は入学後も使われるし、割と人目に触れるのでそのつもりで撮ろうということくらいですね。(めんどくさくてノーメイクで撮って後悔した)

なぜ入学早々に休学したか

一言で言えばやる気がなくなったからですが、なぜやる気がなくなったのか考えてみました。

42では課題のレビューを頻繁に行います。
人の課題をレビューし、自分の課題をレビューしてもらう。

そこで思ったのは「みんな人と話しながら考え事できるんだなぁ…」ということ。
私はコミュ障だったので、人と会話する時には脳のリソースが全て会話に持っていかれます。なので並行して考え事ができない。

自分の課題をレビューしてもらう分には、自分の書いたコードなのでまだ何が書いてあるかわかるので説明できるんですが、人の課題のレビューが難しい。
自分よりずっと先に課題を進めてる人のレビューをすることも多いので、コードを見ても全く頭に入ってこなかったです。

それでも入学試験の間は一ヶ月という短い期間だし、課題もボリュームが大きくないので何とか頑張れましたが、入学してみてやる気が…消えてしまった…。

でも42自体はおすすめです

やる気のある人が集まってて刺激を受けるし、Piscine(入学試験)を受けるだけでも知らないことをたくさん学べました。

レビューは全てDiscordを使って行われますが、それ以外の時間もみんなボイスチャットで集まって課題を解いたりしてるみたいでした。前述の通り、人と会話しながら考え事できない私は一人黙々とやってましたが、ボイスチャットに抵抗のない人は仲間もいっぱいできて楽しいと思います。

今後

どうしよっかな?
まだ休学を続けようと思えば続けられるけど、やる気が戻ることはあるのか?

入学決まった時点で「42受かりましたー!」ってポテンシャルだけを前面に押し出して就活でもすれば良かったのか?(無職)

お仕事と彼氏募集中です!(雑な締め)

ツイート履歴をpandasでcsvファイルに書き出し→読み込みするとズレる問題

www.hitowaft.work

上の記事に関連して小ネタを一つ。

ツイート履歴(tweet.jsから読み込んだもの)を編集した後に、再度csvファイルに書き出し(pandasのto_csv)、その後pd.read_csv()で読み込んだデータで、以下写真のようにnaが増えてしまうことがありました。

print(original_data.isnull().sum())
print(reloaded_data.isnull().sum())
f:id:hwhw:20200512132305p:plainf:id:hwhw:20200512132311p:plain

その場合は書き出す際にline_terminatorを以下のように指定すればOK。

df.to_csv('tweet_data.csv', index=False, line_terminator='\r\n')

twitterのデータをダウンロードしてpandasで読み込みたい

ツイート履歴をpandasで扱いたい

以前はcsv形式でツイートデータがダウンロードできていましたが、今はjsファイル等で提供されています。(2020年5月11日現在)

pd.read_jsonで読み込むだけではネストされた内容がひと塊りになってしまうので、一工夫する必要がありました。

なお以下のコードでも、まだ一部ネストされたままデータフレームに読み込まれますが、その辺は自力で何とかしてください。

前処理

tweet.jsファイルを開き、冒頭のwindow.YTD.tweet.part0 = [ という部分とファイル最下部の]を消しておきます。

コード

import pandas as pd
from pandas.io.json import json_normalize

tweet_data = pd.read_json('/tweet.js')

df = json_normalize(tweet_data.to_dict('records'))

df.head()

GitHubにnotebookを置いておきます。

github.com

参考

https://oku.edu.mie-u.ac.jp/~okumura/python/tweetdata.html

呼吸が浅くなりがちなのでMi Band3に深呼吸を促すリマインダが来るようにした

先日XiaomiのMi Band3を買いました。

www.hitowaft.work
スマホとBluetoothで接続して、LINEやTwitter、その他様々なアプリからの通知を確認することができます。

1時間座りっぱなしでいると「動きましょう」と通知してくれる機能は元々あるのですが、せっかくなのでもっと自分向けの通知を作って受け取ってみたいと思います。

使ったもの

手順

  1. LINE Notifyに登録してアクセストークンを取得する
  2. GASに後ほど記載のコードを貼り付けて、文言を好きに編集する
  3. GASでスクリプトのプロパティにACCESS_TOKENを登録する(省略可・後述)
  4. GASのトリガーをセットして、お好みの間隔で通知を受け取る

LINE Notifyのアクセストークン取得時の注意事項

LINE Notifyのアクセストークンを取得する際は、トークン名を一文字にしておきます。名前が長くなると、その分文言が入るスペースがなくなってしまうので…。

また、LINEのグループを作成してそこにLINE Notifyを招待し通知を受け取るやり方もあるのですが、そうすると[グループ名][LINE Notify]文言という形で通知が来て、ほぼ画面が埋まってしまうため1:1でLINE Notifyから通知を受け取るを選択します。

コード

function myFunction() {
  var messages = ["深呼吸しよう", "背筋を伸ばそう", "hoge", "fuga", "foo", "bar"];
  var random_num = Math.floor( Math.random() * messages.length );
  sendHttpPost(messages[random_num])
}


function sendHttpPost(message){
  token = PropertiesService.getScriptProperties().getProperty("ACCESS_TOKEN")

  var options =
   {
     "method"  : "post",
     "payload" : "message=" + message,
     "headers" : {"Authorization" : "Bearer "+ token}

   };

   UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}

コード解説

特に難しいことはしてませんが、JSやGASに不慣れな人に向けて少し解説します。
messages変数に通知したい文言を配列として入れています。
この配列の中から、実行ごとにランダムで一つ選ばれた文言がトリガーで決めた間隔で通知されます。

各文言を、全角なら13文字・半角なら34文字までに抑えると画面からはみ出しません。

token = PropertiesService.getScriptProperties().getProperty("ACCESS_TOKEN")の部分では、GASでスクリプトのプロパティに登録した値を取りにいってます。
どこにも公開しないならtoken = "LINE Notifyで取得したトークン"みたいにベタ書きでもいいかな。

動かないなと思ったら上部にある関数を選択からmyFunctionを選んで実行してください。


こんな感じで通知が来ます。
[良]となってるのが、トークン取得時につけた名前です。何かいい意味の漢字が良いなと思ったけど、特に思いつかなったのでそのまま良にしました。

参考リンク

Google Apps ScriptからLINE NotifyでLINEにメッセージを送る - Qiita

【超便利&お手軽】Python + LINE NotifyでLINEメッセージ送信 – Blue-black.ink

Xiaomi Mi Band3を買ったのでレビュー

安価なスマートウォッチ Mi Band3を買いました

Amazonで3700円で買いましたが、今見たら3100円になっていた…。
(2020年1月30日追記:3000円切る値段になってました。Mi Band4も出てるみたい )

写真はちょっと着ける位置が間違っていて、本当は手首の出っ張った骨より腕側に着けます。

良かったところ

通知を逃す心配がない

スマホとBluetoothで接続していて、通知が来ると振動します。
スマホをポケットに入れてても歩いてると振動がわからなかったりしますが、腕だととてもわかりやすいです。
何かの連絡を待つような時でも、スマホ本体はカバンにしまって安心していられます。

特に良いのがロック画面に出してない通知も、ちゃんと届くというところです。
Twitterの通知とか、人に見られたくないので通知センターのみの通知にしてるんですよね。それが腕に届くので、便利。

電池の持ち

睡眠時に心拍数を測る設定(睡眠ログの精度が良くなるらしい)にすると電池のもちが悪くなるということでしたが、約2週間もちました。
あんまり充電のこと気にしなくて良いのは素敵。
なおスマホの方がBluetoothをつけておく分電池の減りが少し速くなりました…。

Slackの通知が見れて嬉しい

仕事中非常に単純な作業ばかりしているので、脳のリソースが余っています。
そこにSlack(チャットツール)の通知が来ると、みんななんか話してるなーとちょっと楽しい気持ちになります。(画面が小さいので話してる内容はほぼわからない)

常に腕に時計が着いてると便利

腕時計は良い。

期待したほどでもなかったところ

まとまったデータの取得が面倒

そもそも睡眠のトラッキングをしたくて買ったのですが、そのデータをまとめて取得するのが面倒でした。
ログ取得のリクエストを送信→メールで用意できた旨の通知が来る→ダウンロードページにログインしてデータを取得という形。
毎日のデータはアプリ内で見られるので、自分でデータを弄りたい人以外には十分だと思います。

睡眠ログはまあまあ

私は早朝覚醒が多いのですが、目が覚めてもそんなに動いたりするわけではないのでその時間は中途覚醒として拾えていないことが多いです。
それ以外はスマホの睡眠トラッキングアプリよりは正確かなぁという気もしますが、正直よくわかりません。

座りすぎ通知の精度が低い?

1時間座りっぱなしでいると振動でお知らせしてくれる機能がありますが、役立つこともあればしばらく座っていた後立ち上がって動いてるのに「動きましょう」と知らせてくれることもあります。
「もう動いとるでw」と思うだけですが。

まとめ

この値段だし、時計も欲しかったので「買って良かったなー」という感じ。

hwhw.hatenablog.com