年が明けました

気づいたら2019年新しい年が始まってました

 

去年は名取すきしか言ってなかったような気がしますが、今年も名取すきしか言わないつもりです

 

今年は1月に一回なにが作って出したいなぁと思ってます

 

fusion360でモデル作って出したり、変なアプリをたくさん作りたいと思ってます

 

昨日は大晦末だったので自分の中での毎年恒例なのですが、来年のこの日はなにしてるかなって考えました

 

今年はVがめちゃめちゃ流行ったけど引退、卒業イベントも流行った分だけありましたね

たまたま音声合成とか音声認識とか興味を持ってたのでVが近い未来、魂が引退したとしても音声認識音声合成の技術があるので、他の魂が入っても声、声色、仕草(似せれば)が見分けつかないくらい一緒になるシステムが出来上がって、「Vtuber」のキャラクター自体が引退することはなくなるのかなと(この議論は夏くらいに死ぬほどされた気はしますが)思ったり思わなかったり〜(完全にオタク特有の早口)

 

単に推しがいなくなって欲しくないだけなんですけど…こんな思いを抱くことすら押し付けがましい〜っておもって年末はうだうだ考えてました。あと、引退した魂が報われないとかね

 

いつもはPCで書いてるんですけど今日はPC開く気にならなかったのでiPhoneで…

 

新年早々がっつりオタクの記事から始まりました。今年もよろしくお願いします。

名取が声に反応してくれるアプリを作りました

名取が声に反応してくれるResponSa-naを作りました

なにこれ???

名取さなアドベントカレンダー22日の記事です

辛いことがあったり疲れたりするそんな日々を送っていたかもしれない・・・(いたかな?)(そうでもない)(多分割と楽しかった)

そこで推しと喋れたらめっちゃ人生楽しくなってそれだけでQoL爆上がりキター(^o^)/ってなると思ったのでつくりました

こちらがつくったものです このサイトファンサイトであり、ご本人様とは無関係です。

これ自分で作っておいて何ですがめっちゃ楽しいです

コードとかレポート買いている時に「疲れた〜」とかいうと「頑張れ、無理せずに」って返してくれるんですよ

こんなの頑張るしかないじゃないですか!!

レポートがガリガリかけるようになりました!!!(作ってよかった〜)

作ってしまったけど大丈夫だったのだろうかという気持ちはあります。まずかったらすぐ消します

さなボタン(2)様のサイトを反応ボイスを選択する時に使っています。さなボタンの製作者様に感謝・・・・!圧倒的感謝

どうやって使うの?

Chromeのみ使えます(Chrome以外のせんせえ方ごめんね・・・・・)(この期にChromeに乗り換えて・・)(ごめんそこまでしなくていいよ)

説明するやつやっていくぞ!

1. 音声認識開始ボタン

  • このボタンを押すと音声を認識してくれるよ(さあおしゃべり開始だ!)

2. 追加ボタン

  • もっと認識させる単語、言葉を増やしたいってなったら押してね③④⑤の入力フォームが出てくるよ
  • 20個まで登録できるよ〜

3. 単語、言葉入力

  • 反応させたい単語、言葉を入れてね。入力した言葉に反応して名取が喋ってくれるよ
  • ⑦に表示される言葉を全く同じものを入れてね例えば「楽しい」って⑦に出ているのに「たのしい」と入力していたら反応しないよ

4. 放送タイトル選択

  • さなボタン(2)にあるボタンカテゴリがここで選べるよ。僕のオススメはがんばれ♡がんばれ♡です(これもうたまんねぇな・・・・)

5. 反応ボイス選択

  • 再生したいさなボタンを選択してね③とうまく組み合わせると会話も可能かも!?

6. 削除ボタン

  • なんかこの設定違うな〜ってのがあればこのボタンを押せば一行全て消せます。割とお手軽にしたはず・・・・(いるこの機能????)

7. テキストエリア

  • 認識した言葉をここに表示するよ
  • ここに表示された単語、言葉と全く同じものを③に入れるようにしてね!じゃないと反応しないから・・・・(うまいことできなくてごめんなさい・・・・)

f:id:Naporitan:20181221201824p:plain
ResponSa-naの画面

一応一通り説明した(できてるのかこれ?)(わからん)(なにもわからん)のでつかってみてね〜〜〜

わからなかったり、こうしたらどうってのがあれば twitter.com ここまでどうぞ

作者の技術力は低いです。何とか完成までこぎついた感じです。なので本当にいろいろ教えて欲しい〜〜〜・・・・

最後に

マジで名取の配信のおかげで毎日生き生きできるようになっています。本当に励みになっています。名取はなんで?こんなに人気出てるのって言ってるけど間違いなく名取は一回の配信でみんなを確実に楽しませているし、1視聴者としてめっちゃ楽しんでる。これは間違いないと思う。僕はアーティストじゃないから絵とか可愛らしいものは全然作れないから、こう言った形で自分の気持ちを表現してみました。(作ってから気づいたけどこれかなりきもちわるくねーか???)

これからも名取がんばってくれよな!!!!

チャンネル登録者12万人おめでとーーー!!!

以上です

Colaboratoryを初めて知りました

jupyter notebookをずっとローカルで動かして使ってたんですけど、外出先で使うとノートPCのバッテリーゴリゴリ減るしリモート環境使いたいなぁとか思ってました。

Raspberrypiにjupyterサーバ立ててあーだこーだやってたけどやっぱり所詮らずぴっぴちゃんって感じでなかなか処理が終わらない・・・・

そこでColaboratoryってやつですよ!!!

これGoogleが出してるやつでまぁすごいの。

  • 無料
  • n1-highmem-2 instance
  • Ubuntu 18.04
  • 2vCPU @ 2.2GHz
  • 13GB RAM
  • (GPUなし/ TPU)40GB, (GPUあり)360GB Storage
  • GPU NVIDIA Tesla K80 12GB
  • アイドル状態が90分続くと停止
  • 連続使用は最大12時間
  • Notebookサイズは最大20MB

こんなかんじでメモリいっぱいあってさくっと使える・・・

今日初めてしって驚いたので記事にしました。

この書くやつも長く続けばいいなぁ・・・・

最後に

声に反応して返答をしてくれるサイトを今製作中です。名取さなアドベントカレンダーに乗っける予定なので頑張ります!

ディスプレイを片方縦置きにしたらすごいはかどる

全然ブログを更新してない

はやり3日坊主になってしまった・・・・・

なんか日記帳的なものを1日1回つけれたらなぁと思ってます

ディスプレイを片方縦置きにしたんですけど,めっちゃ見やすいですねこれ

横のほうは動画とかコード書くのに使って,縦置きのほうはwebページとかPDFとかまじでみやすいのでめっちゃいいなっておもいました

ぜひアームとか使ってる人は1回やってみて!!!

今日いいなって思ったことでした

Vue.jsでHighLowゲームをつくったよ

Vue.jsとは

Vueの公式ページからのコピペ

Vue (発音は / v j u ː / 、 view と同様)はユーザーインターフェイスを構築するためのプログレッシブフレームワークです。他の一枚板(モノリシック: monolithic)なフレームワークとは異なり、Vue は少しずつ適用していけるように設計されています。中核となるライブラリは view 層だけに焦点を当てています。そのため、使い始めるのも、他のライブラリや既存のプロジェクトに統合するのも、とても簡単です。また、モダンなツールやサポートライブラリと併用することで、洗練されたシングルページアプリケーションの開発も可能です。

リアクティブなことを使って何かをしたい

たまたまハイローゲームの話が友達との間で出たのでそれを実装してみました。

コード

Flaskをサーバに使っているためデリミターを変更しています。npmしろってはなしなんですけどCDNの書き方しかわからんのだわこれが・・・・

作ったゲームのページですHighLow

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>HighLow</title>
    <!-- 開発バージョン、便利なコンソールの警告が含まれています -->
    <script src="../static/js/Vue/vue.js"></script>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/siimple@3.1.1/dist/siimple.min.css">
</head>

<body>
    <h1>ハイローゲーム</h1>
    <div id="app">
        <h2>残りのカード</h2>
        <div class="siimple-grid-row">
            <div class="siimple-grid-col siimple-grid-col--0" v-for="card in cards" v-bind:key="card">
                [[card]]
            </div>
        </div>
        <h2>現在のカード</h2>
        <div>[[nowcard]]</div>
        <div class="siimple-tag siimple-tag--success" v-show="judge">Success!!</div><br>
        <div class="siimple-btn siimple-btn--red" v-show="!start" v-on:click="Start">Game Start</div>
        <div class="siimple-btn siimple-btn--red" v-show="start" v-on:click="High">High</div>
        <div class="siimple-btn siimple-btn--blue" v-show="start" v-on:click="Low">Low</div>
    </div>
</body>

</html>

<script>
    var vm = new Vue({
        el: "#app",
        delimiters: ['[[', ']]'], // Flaskのdelimiterとの重複を回避
        data: {
            cards: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
            nowcard: null,
            start: false,
            judge: false,
            message: null
        },
        methods: {
            draw: function() {
                var random = Math.floor(Math.random() * this.cards.length);
                this.nowcard = this.cards[random]
                this.cards.splice(random, 1)
            },
            High: function() {
                var before_card = this.nowcard
                this.draw()
                if (this.nowcard >= before_card) {
                    this.judge = true
                } else {
                    this.loseprocess()
                }
                this.winCheck()
            },
            Low: function() {
                var before_card = this.nowcard
                this.draw()
                if (this.nowcard <= before_card) {
                    this.judge = true
                } else {
                    this.loseprocess()
                }
                this.winCheck()
            },
            winCheck: function() {
                if (this.cards.length == 0) {
                    alert("よううぃn!")
                    this.judge = false
                    this.start = false
                    this.cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
                    this.nowcard = null
                }
            },
            loseprocess: function() {
                this.judge = false
                this.start = false
                this.cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
                alert("ゲームオーバー" + this.nowcard)
                this.nowcard = null
            },
            Start: function() {
                this.draw()
                this.start = true
            }
        }
    })
</script>

まとめ

さくっとできた

SQLiteを個人的にいじりやすくしてみました

SQLite3を簡単に使いたい

SQLite3を使ってうーんとなった

めちゃめちゃいいライブラリだと思います。簡単にデータベースっぽいことできるのがよい・・・よい

でもなんかSQLiteのコマンドは忘れるわ、接続いちいちしないといけないわで調べるのに時間かかるし(メモとっとけって話だけど)、なにより接続の部分ががががって感じだった

デコレータ使うとどうやらその辺が改善されるとのことでやってみることにした〜ん。プログラムとかオブジェクト指向とか5ヶ月前に知ったばっかりで赤ちゃんだからなんでこんなことしてるの?とか変数の名前わかりにくすぎwwwwってのがあれば切実に教えて欲しいです。

肝心のプログラム

こんな感じです

import sqlite3
import time
from datetime import datetime, timedelta, timezone
from typing import Dict, List, Tuple

import pandas as pd


class Handle:
    def __init__(self, db: str):
        self.dbpath = db

    # 1つのレコードを挿入する命令を作るメソッド
    def __MakeOneInsertOrder(self, table: str, data: List):
        """
        1つのレコードを挿入する
        data: 時間は自動でセットされる
        return: 1レコードのinsert文
        """
        print("MakeOneInsertOrder start")
        insert = "INSERT INTO {} VALUES ".format(table)
        s = self.__TupleMake(data)
        insert += s
        print(insert)
        print("MakeOneInsertOrder finish")
        return insert

    # 複数のレコードを挿入する命令を作るメソッド
    def __MakeSomeInsertOrder(self, table: str, datas: List[List]):
        """
        複数レコードを挿入する
        data: 挿入したいデータを入れ子にすること
              時間は自動でセットされる
        return: 複数レコードのinsert文 
        """
        print("MakeSomeInsertOrder start")
        insert = "INSERT INTO {} VALUES ".format(table)
        s = [self.__TupleMake(data) for data in datas]
        s = ", ".join(s)
        insert += s
        print(insert)
        print("MakeSomeInsertOrder finsish")
        return insert

    # テーブルを作成する命令を作るメソッド
    def __MakeTableOrder(self, table: str, columns: List):
        """
        テーブルを新しく作る命令文を作るメソッド
        columns: 設定したいカラム, dateは自動でつけられる
        return: create文
        """
        print("MaleTableOrder start")
        create = "CREATE TABLE IF NOT EXISTS {} ".format(table)
        record = "(date DATE PRIMARY KEY"
        for col in columns:
            record += ", "+col+" TEXT"
        record += ")"
        create += record
        print(create)
        print("MaleTableOrder finish")
        return create

    def __MakeSelectOrder(self, table: str, hour: int):
        """
        select文を作るメソッド
        return select文
        """
        print("MakeSelectOrder start")
        if hour > 0:
            hour = self.__CreateTimeStamp() - 3600*hour
            select = "SELECT * from {} WHERE date > {}".format(table, hour)
        else:
            select = "SELECT * from {}".format(table)
        return select

    # レコードに挿入するデータ形式に変換するメソッド
    def __TupleMake(self, data: List):
        """
        リスト形式のデータを()の入れ子に変換する
        """
        print("TupleMake start")
        time = self.__CreateTimeStamp()
        s = "({}".format(time)
        for item in data:
            s += ", '{}'".format(item)
        s += ")"
        print("Tuple finish")
        return s

    # タイムスタンプを返す
    def __CreateTimeStamp(self):
        """
        タイムスタンプを作る
        """
        print("CreateTimeStamp start")
        now = time.time()
        JST = timezone(timedelta(hours=+9), 'JST')
        loc = datetime.fromtimestamp(now, JST).timestamp()
        print("CreateTimeStamp finish")
        return loc

    # sqlite3のコネクションを司るデコレータ
    # わかっていない部分もあるので今後バシバシ使っていくこと
    def connectdb(func):
        from functools import wraps

        @wraps(func)
        def _connectdb(self, *args, **kwargs):
            print("connection start")
            con = sqlite3.connect(self.dbpath)
            cur = con.cursor()
            try:
                result = func(self, *args, **kwargs, con=con, cur=cur)
            except sqlite3.Error as e:
                print('sqlite3.Error occurred:', e.args[0])
                result = None
            finally:
                con.commit()
                con.close()
                print("connection finish")
            return result
        return _connectdb

    @connectdb
    def MakeTable(self, table: str, columns: List, con=None, cur=None):
        """
        テーブルを実際に作るメソッド
        """
        print("MakeTable start")
        order = self.__MakeTableOrder(table, columns)
        cur.execute(order)
        print("MakeTable finish")

    @connectdb
    def InsertRecord(self, table: str, data: List, con=None, cur=None):
        print("InsertRecord start")
        if isinstance(data[0], list):
            order = self.__MakeSomeInsertOrder(table, data)
        else:
            order = self.__MakeOneInsertOrder(table, data)
        cur.execute(order)
        print("InsertRecord finish")

    @connectdb
    def GetData(self, table: str, hour=1, con=None, cur=None):
        """
        データを指定した時間分取得するメソッド
        hour=0の時は全てのデータを取ってくる
        return: pandasデータフレーム
        """
        print("GetData start")
        if table not in self.GetTableList():
            print("!!!Error!!! {} is not exist!!!".format(table))
            print("GetData finish")
            return pd.DataFrame()
        else:
            order = self.__MakeSelectOrder(table, hour)
            df = pd.read_sql(order, con)
            print("GetData finish")
            return df

    @connectdb
    def GetTableList(self, con=None, cur=None):
        """
        作られているテーブル一覧を返すメソッド
        """
        print("GetTableList start")
        select = "SELECT * FROM sqlite_master WHERE TYPE = 'table'"
        cur.execute(select)
        print("GetTableList finish")
        return [x[1] for x in cur.fetchall()]

    @connectdb
    def UpdateRecord(self, table: str, record: dict, update_data: dict, con=None, cur=None):
        """
        table: テーブル名
        record: {"カラム名": "指定するレコードを示すデータ"}
        update_data: {"カラム名": 変更する内容} 
        """
        print("UpdateRecord start")
        rec_key, rec_val = list(record.items())[0]
        update_key, update_val = list(update_data.items())[0]
        order = "update {} set {} = '{}' where {} = {}".format(
            table, update_key, update_val, rec_key, rec_val)
        cur.execute(order)
        print("UpdateRecord finish")

    @connectdb
    def DeleteTable(self, table: str, con=None, cur=None):
        """
        table: 削除したいテーブル名
        """
        print("DeleteTable start")
        # テーブルの削除
        cur.execute("DROP TABLE {}".format(table))
        # 空き容量の解放
        cur.execute("VACUUM")
        print("DeleteTable finish")

    @connectdb
    def DeleteRecord(self, table: str):
        pass

デコレータを使ったところ

# sqlite3のコネクションを司るデコレータ
    # わかっていない部分もあるので今後バシバシ使っていくこと
    def connectdb(func):
        from functools import wraps

        @wraps(func)
        def _connectdb(self, *args, **kwargs):
            print("connection start")
            con = sqlite3.connect(self.dbpath)
            cur = con.cursor()
            try:
                result = func(self, *args, **kwargs, con=con, cur=cur)
            except sqlite3.Error as e:
                print('sqlite3.Error occurred:', e.args[0])
                result = None
            finally:
                con.commit()
                con.close()
                print("connection finish")
            return result
        return _connectdb

wrapsを使うとどうなるのかよくわかってない・・・データを保持できるとかなんとか書いてあったけどいまいち現象が掴めないって感じです

_connectidb(self, *args, **kwargs)にself入れ込んだことでself使えるようになってはっぴーって感じ!

デコレータ自体を書ける気がしない・・・・この書き方なんかこんがらがりませんか????

これ以外のメソッドは大したことしていないので見たらすぐわかると思います。

まとめ

いい感じで動いているので嬉しい

自動でHTMLを生成してくれるサイトがでました

なんかMicrosoftがすごいものを出しました

 

Sketch2Code(https://sketch2code.azurewebsites.net/)です

 

こんなページを作りたい!っていうページの構成を紙に書いて写真をこのサイトにアップロードするだけでソースが出来上がるとのこと…

jsと一体型になってるvue.jsとかだと使えないとは思うけど雛形つくって修正って形を取ればだいぶぽいものを作れる気がします。HTMLでうんうん悩んでる時間を削減できることはいいこと?だと思います?いいのかな?自分はHTML全然わからないのでいいと思います

使って何か作れたらいいな〜とか思ってます

簡単な作ったもののまとめサイトとか…?

 

最近fusion360入れて遊んでるので3Dモデル置くところにしてもいいかも…?

そろそろ3Dプリンターで遊んでいる様子の記事を書きたいですね…って事で今日はおわりです