ツタンラーメンの忘備録

プログラミングや精神疾患、ラーメンについて書いていきます。たぶん。

Processing Osc 文字化け

PythonTwitter APIからデータ取得したのにProcessing にOSC通信したら文字化けしたので,解消したかったが思いのほか記事が少なかった.

http://mirror.boy.jp/?p=809
参考にしたのはここ↑

import oscP5.*;
import netP5.*;
import java.io.UnsupportedEncodingException; //ここ初めて使った.知らなかった.

OscP5 oscP5;
NetAddress myRemoteLocation;

int receivePort = ????;
String sendIP = "????";


String tweet = "";

void setup(){
  size(1000, 1000);
  background(255);
  oscP5 = new OscP5(this,receivePort);
  myRemoteLocation = new NetAddress(sendIP,sendPort);
}

void draw(){
  background(255);
  fill(0);
  text(tweet, 0, 50);
}

void oscEvent(OscMessage theOscMessage) {
  print("### received an osc message.");
  println(" addrpattern: "+theOscMessage.addrPattern());
  if(theOscMessage.checkAddrPattern("/tweet")==true) {
    byte[] bytes = theOscMessage.getBytes();
    try {
      tweet = new String(bytes, "UTF-8");
      String typeTagStr = theOscMessage.typetag();
      tweet = tweet.substring(tweet.indexOf(typeTagStr) + typeTagStr.length());
      println("Tweet:"+tweet);
   
    }
    catch(UnsupportedEncodingException e) {
        e.printStackTrace();  
    }
  }
}

Python Twitter Api RT 分ける

この記事には誤りがあります.この方法でもできますが….

qiita.com

上記記事でほぼ解決していたのですが,そのユーザが投稿したわけではない(そのユーザがRTした)ツイートがまざるのがいやだったので,少し調べました.
どうやら各ツイートのretweeted_statuの存在の有無を調べるらしいのですが,

tweet["retweeted_statu"] == {}
tweet["retweeted_statu"] is None

両方ダメだったので,少し悩みました.いや言われればそのまんまなんですけどね.
というわけで上記記事に完全にマウントして,streamからツイートを取得しましょう.ついでにハッシュタグとURLも消しました.すっきり!

import requests
import json
from requests_oauthlib import OAuth1

import re

consumer_key = "bokuha"
consumer_secret = "pikachu"
access_token = "ga"
access_secret = "daisuke!"

url = "https://stream.twitter.com/1.1/statuses/filter.json"

auth = OAuth1(consumer_key, consumer_secret, access_token, access_secret)
r = requests.post(url, auth=auth, stream=True, data={"track":"pokemon"})

if r.status_code == 200:
    print ("connect succeed!")
else:
    print ("Error: %d" % r.status_code)

for line in r.iter_lines():
    stream = line.decode("utf-8")
    try:
        find=json.loads(stream) #読み込み
        print("------------------------------")
        try: #ここでRTが判断している.関数化しようかとも思ったが,そこまで複雑じゃないので
            isRtweeted = not find["retweeted_status"] == {}
        except KeyError:
            isRtweeted = False
        if isRtweeted:
            print(find["user"]["name"] + "がRTしました")
        else:
            t1 = re.sub(r"(\s*https?|ftp)(:\/\/[-_\.!~*\'()a-zA-Z0-9;\/?:\@&=\+\$,%#]+)", "" ,find["text"]) #URLを削除
            t2 = re.sub(r"(\s*#\S+\s*)", "", t1) #ハッシュタグを削除
            print(find["user"]["name"], t2)
            print(find["entities"]["hashtags"])
    except json.decoder.JSONDecodeError:
        pass
    except:
        print ("unknown error!")
        pass #たまによくわからないエラーが出るらしいです.

Latex,Excelから表を生成(色を付ける),png画像

TeXを使っていた時にExcelから表を生成した.

ここで↓
www.tablesgenerator.com

かなり便利なんだけど,コンパイルしたら画像が全部表示されなくなった.xcolorとcolorの競合かなと思ったんだけど,理由を特定している暇がないので

\documentclass[uplatex,report]{jsbook}

\usepackage{thesis}
\usepackage[dvipdfmx]{color}
\usepackage[dvipdfmx]{graphicx}
\usepackage[table,xcdraw]{xcolor}

\usepackage[dvipdfmx]{hyperref}

\documentclass[uplatex,report,dvipdfmx]{jsbook}

\usepackage{thesis}
\usepackage{color}
\usepackage{graphicx}
\usepackage[table,xcdraw]{xcolor}

\usepackage{hyperref}

に直した.みんなに届けLaTex!

Chrome 開き続ける

また何の需要もないプログラムを書いてしまった.
Chromeを閉じても閉じても開き続けるプログラム.

既存のタブが開いていたりすると落ちる仕様なのは,解決したい.
あと.Ctrl + vは効く癖にCtrl + tが効かないのが納得いかない.これ解決策知っている人いたら教えてください

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import WebDriverException

import time

#起動
driver = webdriver.Chrome("path(ここ書き換えてね)\chromedriver.exe") #ここフォルダーまででいいと思ったのになあ

#遷移
driver.get("https://www.google.co.jp")

#body要素を選択
element = driver.find_element_by_tag_name("body")
while True:
    try:
        element = driver.find_element_by_tag_name("body")
        print(driver.current_url)
        time.sleep(5)
    except WebDriverException:
        driver = webdriver.Chrome("path\chromedriver.exe")
        driver.get("https://www.google.co.jp")

Processing 文字 画像化

まったくなんの需要もない自己満足な記事

f:id:hungrykirby:20171128172254p:plain

f:id:hungrykirby:20171128172339p:plain

f:id:hungrykirby:20171128172331p:plain

こういう画像を作りたい.作ってどうするの?みたいなのは次回記事にします.

int w;
int h;

PGraphics[] pg;

int numArray;

void setup(){
  size(500, 500);
  w = width; h = height;
  PFont f = loadFont("RictyDiminishedDiscord-Regular-48.vlw");
  numArray = 127 - 32;
  pg = new PGraphics[numArray];
  background(255);
  for(int i = 0; i < numArray; i++){
    pg[i] = createGraphics(w, h);
    pg[i].beginDraw();
    pg[i].background(255);
    pg[i].fill(0);
    pg[i].textFont(f, 200);
    pg[i].textAlign(CENTER, CENTER);
    pg[i].text(str(char(i + 32)), w/2, h/2);
    String filename = str(i);
    if(filename.length() == 1) filename = "0" + filename;
    pg[i].save("images2/" + filename + ".png");
    pg[i].endDraw();
  }
}

画像の配列ができました.やったね!

python line bot imagemap 画像送信

pythonでLINE botを作っていますが,
github.com
ここでだいたいわかります.しかし画像の送信とimagemapはサンプルがないので実装してみます.

APIリファレンス


画像送信

from linebot.models import ImageSendMessage
def make_image_message():
    messages = ImageSendMessage(
        original_content_url="https://hogehoge.jpg", #JPEG 最大画像サイズ:240×240 最大ファイルサイズ:1MB(注意:仕様が変わっていた)
        preview_image_url="https://hogehoge-mini.jpg" #JPEG 最大画像サイズ:1024×1024 最大ファイルサイズ:1MB(注意:仕様が変わっていた)
    )
    return messages

これむっちゃ面白いんですけどプレビューとタップして表示される画像別になるんですよ!
注意:画像サイズの制限はもう少し大きく,jpgに限定されない.ただし.preview_image_urlにgifを指定しても,反映されない(正確にはアニメーションgifは動かない)ので注意

これを

messages = make_image_messages()
line_bot_api.reply_message(
    event.reply_token,
    messages)

的にすればリプライできます.


imagemap

画像をボタン化できます.(画像は用意できれば用意します.)
これの何がいいかというと

  • 画像を見れることによる直感的操作
  • 選択肢を増やせる(最大50)
from linebot.models import ImagemapSendMessage, BaseSize, ImagemapAction, URIImagemapAction, MessageImagemapAction, ImagemapArea
def make_imagemap():
    messages = ImagemapSendMessage(
        base_url='https://huhahaha/pikach/kawaii/',
        alt_text='this is an imagemap',
        base_size=BaseSize(width=1040, height=1040),
        actions=[
            URIImagemapAction(
                link_uri='https://example.com/',
                area=ImagemapArea(
                    x=0, y=0, width=520, height=1040
                )
            ),
            MessageImagemapAction(
                text='hello',
                area=ImagemapArea(
                    x=520, y=0, width=520, height=1040
                )
            )
        ]
    )
    return messages

画像の保存の仕方に一癖あってけっこう悩みました.

https://huhahaha/pikach/kawaii/

以下に
幅:240px、300px、460px、700px、1040px
の画像を配置します.(横幅が指定であれば,高さは関係ない.また高さに合わせて,heightも変える)

  • 画像フォーマット:JPEGまたはPNG
  • ファイルサイズ:最大1MB

なのですが,保存した画像の拡張子は**取ります**
(どっかで拡張子指定できるようにすればいいのに…)

qiita.com

参考にした

python win32client speak

python

import win32com.client as wincl

に関する記事が少なすぎるので,いくつかまとめます.
まず

speak.Speak("Hello World", i)

のiについてです

for n in range(2):
  speak.Speak("Hello World" + str(n), i)
  sleep(1)
  print(n)

で検証します.



  • i = 0,2

これは
読み上げ->1秒待つ->print出力->読み上げ->1秒待つ->print出力となります



  • i = 1

これは
読み上げと同時に一秒待ってprint出力(読み上げの途中で出力される)->出力から1秒後にprintされる.その間読み上げている(ただし,読み上げが重なることはない)



  • i = 3

最初の文章の読み上げを1秒間行う->print出力->二行目を読み上げ(一行目は最後まで読み上げない)->一秒後にprint出力



for n in range(2):
  speak.Speak("Hello World" + str(n), i)
  sleep(1)
  speak2.Speak("Wow!", i)
  print(n)
  • i = 1

Hello World 1->1->2->Hello World 2->Wow->Wow
になります.

どうなっているのかよくわからない.