2021-01-20

Twitter APIのはまりどころ

 PythonのTweepyを利用して、Twitter APIを利用している。

その中で、ハマったポイントをメモしておく。

まず、Searchに関して。

Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。

一方で、APIを利用する際は、過去1週間しか閲覧することができない。

全期間を利用する場合は、Twitter Premium Search APIを利用しないといけない。

次に、Twitter Search APIでOperatorを利用する時の条件。

Operator、例えば(牛丼 OR 鶏そぼろ)みたいな条件で検索することが、API経由だとできない可能性がある。

Rules and filtering: Standard v1.1



2021-01-15

FirebaseのタイムスタンプをPythonで無理やり実装する

多分こんな感じになる。

import datetime

now = datetime.datetime.now()
year = str(now.year)
month = "{:02d}".format(now.month)
day = str(now.day)
hour = str(now.hour)
minute = str(now.minute)
timestamp = year + month + day + hour + minute
print(timestamp)

結果

$ python3 timestamp.py
202101151418

2019-01-15

Cubaseでやりたいこととかまとめてみた

DTMを始めたくなった。

やりたいこと

・Zedd, 中田ヤスタカあたりのヘビーなEDMサウンドを作れるようになりたい。
・Bonobos, Bathsのような、ちょっとおしゃれな感じのサウンドも作れるようになりたい

自分のレベル

・作曲は、過去にバンドをやっていて(ギター、ドラム、ピアノは全部行けます)、オリジナル作ったり、簡単な打ち込みはAbleton Liveで過去に試したことがあるレベル。なのでなんとなくは理解できている
・過去やってたバンド Untitled yoakemae
・個人で過去に作った曲。打ち込みではないけど、Audioから音取り入れてオリジナル作ったりしたことはある


課題感

・やりたいことをやるために、どういうプラグインや機材を変えばいいのかわからない
・systh1とかmassiveとか購入しようかと検討しているが、そもそもcubase AIでやっているのは正しいのか。もっとプラグインがあるバージョンを購入したほうがいいのか。


持っている機材

・UR12(オーディオインターフェイス)
・Cubase AI (UR12についてきた)
・Acoustic Guitar
・Mic


*******************************
以下調べたこと
*******************************

音の強弱


・ベロシティというらしい
・鉛筆マークから、ベロシティをクリックしてあげればよい



部分ループ再生

・編集するときに、ループしたいときはどうするかという話


スペースで再生・停止を押せるようにする方法

クリックしても音が出ない問題

アコースティックオーディオの編集はどうすればいい?


Audioの音量を上げるにはどうすればいい?


プリカウントの入れ方


拍数を短くする、8連ぷとかできるようにする

ギターにリバーブをいれる 


ドラム

1)電子ドラム
生ドラムではなく電子ドラムを使います。
一般的には「TR-808」「TR-909」というメジャーなキットが定番であり、HALion Sonicにも「T8」「T9」という名前が入っているプリセットがそれです。
またGroove Agentの、Dub(「ダブステップ」のダブですね)とかDanceとかElektroとかの系統のものもEDM向きです。
「かえるのうた」ではDubstep Kit01を使いました。
もっと凝るなら、後述のオーディオ素材を駆使して独自セットを作ることもできますが、ベーシックなものならプリセットでも十分かと思います。

シンセ

2)シンセ
ベース、コード楽器、メロディ楽器などありますが、全部Retrologueでいけます。
(Cubase標準にはPrologueもあるが、シンセ初心者にはRetrologueのほうが入りやすいと思います。まあこの辺は単に好みかもしれませんが。)

-> Cubase AIには入ってなかった。


Native Instruments(NIプラグイン)

Cubaseにおいて、Native InstrumentsソフトウェアはVSTプラグインインターフェースを経由して使用するものとなります。CubaseでNIプラグインを使用するには、NIプラグインが格納されているフォルダをCubaseにスキャンさせる必要があります。この記事ではMacとWindows、両方のシステムでこれを行う方法をご説明します。

Windows
NI VSTプラグインのインストール
Windowsコンピュータにおいて、VSTプラグインはハードディスク上のどこにでもインストールすることが可能ですが、Native Accessに表示されるデフォルトのインストールパスにインストールされることを強くお勧めします:

KompleteがCubaseに表示されない_Windows


Retrologue


・アナログシンセ
・オクターブ
・オシレーター

Retrologue Youtube


How to Use Retrologue (Cubase Tutorial)

LFOの基本と役割を把握する シンセサイザー 初心者講座


初心者が初心者に向けて書いた、Cubase標準でのEDMの作り方


Massive


・Instrumental Trackを追加
・スクリレックス ヤスタカ Bonobos さんが利用している
・普通に有料で使えない


最強シンセ!?中田ヤスタカ愛用MASSIVE紹介!【LIAR GAME】

Synth レシピ Perfume チョコレイトディスコ ① イントロ《Massive 使い方》(Sleepfreaks DTMスクール)

Massive

Sylenth1


・Zeddの音色を作れる
・もちろん有料

zedd(ゼッド)の曲の作り方とか機材とか[エレクトロ、EDM系]


そのほかの無料のEDMに向いているプラグイン

5).Aalto
 http://madronalabs.com/products/aalto
4).BRZOZA
 http://www.vst4free.com/free_vst.php?...
3).  Venom VB-303
http://antonsavov.net/cms/projects/ve...
2). Dreamkiller
http://www.freedrumkits.net/browse-vs...
1). T-Force Alpha Plus
http://www.mastrcode-music-vst.com/ma...

Our top 5 Free VST synths for EDM and Hip-hop

Firebaseについて調べたことまとめ

Firebaseについてまとめる。

・BaaSで、Google製
・フロントエンドエンジニアがバックエンド任せちゃうみたいなときに使える

≫フロントエンジニアが今話題のFirebaseについて語りたい

Firebase Auth


Firebase が提供するサービスのうち、認証に関する機能を提供するものが Firebase Authentication です。

* GitHub や Twitter などの SNS を使った OAuth 認証機能を簡単に用意できる [1]
* パスワード認証機能も用意されており、パスワード認証に関する機能を自前で実装しなくて済む。またパスワード情報を自社が管理するデータベースに保存しなくて済む。


≫Firebase Authentication を使って得られた知見まとめ - トークンの仕様や注意点など

Firebase UI 


Firebase UI is basically a drop in library that does all the UI (buttons, etc) and redirect logic for you automatically for all supported Firebase OAuth providers (Google, Facebook, GitHub, etc).

Firebase x Flask


≫Firebase Authentication with Python including Flask API


≫Firebase Real Time Database using Python and Flask Web Application

≫Firebase: Developing a Web Service with Admin SDK, Flask and Google Cloud

2018-12-24

PandasでUnicodeDecodeError: 'shift_jis' codec can't decode byte 0xff in position 0: illegal multibyte sequenceが起こった時の対処法

状況


- 読み込もうとしているCSVファイルが、unicode形式になっている
- 文字コードの確認方法はこちら。

CSVファイルが文字化けしてExcelで見れない時の対処法について|Excel実務のノウハウのお勉強


- pandasのread_csvメソッドで。以下のようにCSVを読み込もうとする

stop_words = pd.read_csv(stop_words_filename, encoding="shift-jis")

問題


- 以下のエラーが発生した

UnicodeDecodeError: 'shift_jis' codec can't decode byte 0xff in position 0: illegal multibyte sequence

原因


- Pandasは、基本的にurf-8で文字コードを読み込もうとしている。utf-8以外の場合、encoding指定をしてあげる必要がある。
- 上のコードでは、shift-jisで読み込もうとしている
- しかし、元のファイルがunicodeなので読み込めていない。

対策


- 元のファイルをutf-8でencoding指定なし、もしくはshift-jis形式に変換をおこなう必要がある。
- どちらにせよ、ファイルの形式をunicodeから何等かの値に変更する必要がある

Excelの場合はこちらをutf-8形式に保存する
ExcelファイルをUTF-8のCSV形式で保存する方法(Excel 2016最新機能)40,710

libreofficeで修整する場合はこう。

https://help.libreoffice.org/Common/Export_text_files/ja




2018-12-20

Flaskを利用した並列処理をThreadを利用する際の忘備録

# スレッド(thread)とは

> プログラムの処理の実行単位
引用:スレッド (thread)とは

# スレッドを複数利用するタイミング


・並列処理を行う必要がある場合

# Pythonで複数Threadを利用する場合



  • Celery
    • ジョブキューを使う
    • redisなど使うため準備が少し必要
  • Thread

import time
import threading

def func1():
    while True:
        print("func1")
        time.sleep(1)


def func2():
    while True:
        print("func2")
        time.sleep(1)


if __name__ == "__main__":
    thread_1 = threading.Thread(target=func1)
    thread_2 = threading.Thread(target=func2)

    thread_1.start()
    thread_2.start()

引用:Pythonの並列・並行処理サンプルコードまとめ


# Flaskで利用する場合



from datetime import datetime
from flask import Flask, make_response
from time import sleep
import threading

app = Flask(__name__)

class MyThread(threading.Thread):
    def __init__(self):
        super(MyThread, self).__init__()
        self.stop_event = threading.Event()

    def stop(self):
        self.stop_event.set()

    def run(self):
        try:
            for _ in range(1000):
                print(f'{datetime.now():%H:%M:%S}')
                sleep(1)

                # 定期的にフラグを確認して停止させる
                if self.stop_event.is_set():
                    break
        finally:
            print('時間のかかる処理が終わりました\n')

jobs = {}

@app.route('/start/<id>/')
def root(id):
    t = MyThread()
    t.start()
    jobs[id] = t
    return make_response(f'{id}の処理を受け付けました\n'), 202

@app.route('/stop/<id>/')
def stop(id):
    jobs[id].stop()
    del jobs[id]
    return make_response(f'{id}の中止処理を受け付けました\n'), 202

@app.route('/status/<id>/')
def status(id):
    if id in jobs:
        return make_response(f'{id}は実行中です\n'), 200
    else:
        return make_response(f'{id}は実行していません\n'), 200


引用:PythonでThreadを使うflaskサンプルを作ってみた

# 並列処理の注意点



  • Flaskのデフォルトでは複数のリクエストを同時に処理することができません。
  • 並列処理を有効にして同時アクセスを可能にするにはthreaded=Trueパラメータを設定します。


引用) Flaskのデフォルトでは同時アクセスを処理できない





2018-12-07

Flaskで多対多のデータベース構成にするときにやるあれ

Flaskで簡単なWebアプリを作るときに、DBの持ち方をどうするか問題にぶち当たったので、忘備録。

* Flask-SQLAlchemy
* Flask-Migrate

を使って、DBを管理している。

モデルは

* User
* Followers

というテーブルを持っている。User間のフォロー機能を実装したい。


app/init.py
from flask import Flask
from config import Config, CONSUMER_KEY, CONSUMER_SECRET, CALLBACK_URL
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager


app = Flask(__name__)
db = SQLAlchemy(app)
migrate = Migrate(app, db)

app.config.from_object(Config)
login = LoginManager(app)

from app import routes, models
from app.models import User

でモデルが

models.py

from datetime import datetime
from app import db
from flask_login import UserMixin
from app import login

followers = db.Table('followers',
    db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
)

likers = db.Table('likers',
    db.Column('liker_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('liked_id', db.Integer, db.ForeignKey('user.id'))
)

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    registered_at = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    last_updated_at = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    last_logined_at = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    twitter_id = db.Column(db.String(64), index=True, unique=True) 
    screen_name = db.Column(db.String(64), index=True, unique=True)
    username = db.Column(db.String(64), index=True, unique=True)
    image_url = db.Column(db.String(128), index=True, unique=True)
    description = db.Column(db.String(300), index=True, unique=True)

    followed = db.relationship(
    'User', secondary=followers,
    primaryjoin=(followers.c.follower_id == twitter_id),
    secondaryjoin=(followers.c.followed_id == twitter_id),
    backref=db.backref('followers', lazy='dynamic'), lazy='dynamic')

    liked = db.relationship(
    'User', secondary=likers,
    primaryjoin=(likers.c.liker_id == twitter_id),
    secondaryjoin=(likers.c.liked_id == twitter_id),
    backref=db.backref('likers', lazy='dynamic'), lazy='dynamic')

    def follow(self, user):
        if not self.is_following(user):
            self.followed.append(user)

    def unfollow(self, user):
        if self.is_following(user):
            self.followed.remove(user)

    def is_following(self, user):
        return self.followed.filter(
            followers.c.followed_id == user.id).count() > 0

    def mutual_ids_list(self):
        print ("twitter_id".format(self.twitter_id))
        followed_ids = self.followed.filter(
            followers.c.followed_id == self.twitter_id)
        following_ids = self.followed.filter(
            followers.c.follower_id == self.twitter_id)
        print ("followed_ids:".format(followed_ids))
        print ("follower_ids:".format(following_ids))
        print (list(set(following_ids & set(followed_ids))))

    def like(self, user):
        if not self.is_liking(user):
            self.liked.append(user)

    def unlike(self, user):
        if self.is_liking(user):
            self.liked.remove(user)

    def is_likeing(self, user):
        return self.likeed.filter(
            likers.c.liked_id == user.id).count() > 0

    def __repr__(self):
        return '<User {}>'.format(self.twitter_id)

class Follower(db.Model):
    id = db.Column(db.Integer, primary_key=True)

class Liker(db.Model):
    id = db.Column(db.Integer, primary_key=True)

的な感じ。これで、pythonから多対多のモデルが作れるのか確認。

python3

>>> from app.models import User, Follower
>>> from app import db

>>> u1 = User(twitter_id=3)
>>> u2 = User(twitter_id=4)
>>> db.session.add(u1)
>>> db.session.add(u2)
>>> db.session.commit()
>>> u1.follow(u2)
>>> u2.follow(u1)
>>> db.session.commit()
>>> u1.followed.all()
[<User 4>]


できてる。sqlite3にアクセスして、followerのテーブルにデータがあるのか確認。

bash

$ sqlite3 app.db

SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
sqlite> select * from followers
   ...> ;
|
|
1|2
2|1
1|2
1|2
2|1
3|4
4|3

できているはず。
あとはこのfollowersテーブルにsqlalchemyからアクセスしたいんだけど、そこがようわからんので調査が必要。

注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...