ツタンラーメンの忘備録

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

python salesforce einstein 始める language 使い方

pythonsalesforceのeinstein apiを使おうとしたんだけど、絶妙に情報が少ない上に、絶妙にわかりづらい…。
Salesforce Einstein は、ビジネステクノロジーにおける AI です。 - セールスフォース・ドットコム

というわけでpythonでデータセットを持ち上げるサンプルファイルを公式に基づいて書いた。公式だと複数ファイルに分割していたが、その書き方がわかりづらいので…。

EINSTEIN_BASE_URL = 'https://api.einstein.ai/v2'
LANG_BASE_URL = EINSTEIN_BASE_URL + '/language'
LANG_DATASETS_URL = LANG_BASE_URL + '/datasets'
ACCESS_TOKEN = '***'

import requests
import json
from requests_toolbelt.multipart.encoder import MultipartEncoder

class DataSet():
    def __init__(self, access_token):
        self.access_token = access_token

    def create_intent_dataset(self, path):
        type = 'text-intent'
        return self._create_dataset(path, type)

    def _create_dataset(self, path, type):
        multipart_data = MultipartEncoder(
            fields={
                'path': path,
                'type': type
            }
        )
        headers = {'Authorization': 'Bearer ' + self.access_token,
                'Content-Type': multipart_data.content_type}
        res = requests.post(LANG_DATASETS_URL + '/upload',
                            headers=headers, data=multipart_data)
        json_response = json.loads(res.text)
        return json_response

def main():
    access_token = ACCESS_TOKEN
    dataset = DataSet(access_token=access_token)
    path = 'http://einstein.ai/text/weather.csv'
    response = dataset.create_intent_dataset(path)
    print(json.dumps(response, indent=4, sort_keys=True))

if __name__ == "__main__":
    main()

Processing いい感じに改行 文字枠

Processingでhtml的に幅を指定していい感じに改行した上で,その文字に背景色をつけたかった.
というわけでそういうことができる感じのclassを作った.なんか汚いけど….

setup(文字の上から枠の外までの余白,左,下,左)
update(テキストボックスの最大幅)
draw(文字開始の左, 文字開始の上) -> 枠の下のy座標を返す

ちなみにtabは消えちゃう(´・ω・`)

f:id:hungrykirby:20180208185434g:plain

RectText tb;

void setup(){
  size(1920, 1024);
  background(255);
  String sampleText = "abcdefghijklmnopqrstuvw\nxyz'012345\t67890@[]ああああああああいうえおかきくけこ劉備早々無限大";
  tb = new RectText(sampleText);
  tb.setup(200, 50, 10, 120); /*top, right, buttom, left*/
}

void draw(){
  background(255);
  tb.update(1000.0);
  float y = tb.draw(mouseX, mouseY);
  ellipse(mouseX, y, 20, 20);
}

class RectText {
  String t;
  String textModified;
  StringList sl;
  float xPos, yPos;
  
  float paddingLeft, paddingRight, paddingButtom, paddingTop;
  
  PFont pF;
  
  float th; //text height
  float le; //leading
  
  int numLines;
  float maxWidth; //max width of text
  
  RectText(String _t){
    pF = loadFont("RictyDiminished-Regular-48.vlw");
    t = _t;
  }
  
  void setup(float pT, float pR, float pB, float pL){
    textFont(pF, 48);
    textAlign( LEFT, TOP );    
    th = textAscent() + textDescent();
    le = 2.0;
    textLeading(th+le);
    noStroke();
    
    paddingTop = pT; paddingRight = pR; paddingButtom = pB; paddingLeft = pL;
  }
  
  void update(float w){
    maxWidth = calcMaxW(t, w);
    sl = wordWrap(t, maxWidth);
    numLines = sl.size();
    textModified = "";
    for(int i = 0; i < numLines; i++){
      textModified += (sl.get(i) + "\n");
    }
  }
  float draw(float x, float y){ /*xとyを開始点として文字を書く*/
    xPos = x; yPos = y;
    fill(0);
    rect(xPos - paddingRight, yPos - paddingTop, maxWidth + paddingRight + paddingLeft, (th+le)*(numLines+0) + paddingTop + paddingButtom);
    fill(255, 0, 0);
    text(textModified, xPos, yPos);
    
    return (th+le)*(numLines+0) + paddingButtom + yPos; //Buttom
  }
  
  StringList wordWrap(String s, float mW) {
    StringList a = new StringList();
    float w = 0;
    int i = 0;
    while (i < s.length()) {
      char c = s.charAt(i);
      String cc = "" + c;
      w += textWidth(cc);
      if(c == '\n'){
        String sub = s.substring(0, i);
        a.append(sub);
        s = s.substring(i + 1, s.length());
        i = 1;
        w = 0;
      }else{
        if (w > mW) {
          String sub = s.substring(0, i);
          a.append(sub);
          s = s.substring(i ,s.length());
          i = 0;
          w = 0;
        } else {
          i++;
        }
      }
    }
    a.append(s);
    return a;
  }
  
  float calcMaxW(String _t, float mW){
    float f = 0;
    if(textWidth(_t) > mW) f = mW;
    else f = textWidth(_t);
    return f;
  }
  
}

Python LINE bot imagemap 画像作成 自動化

以前の記事でLINE bot + flask + imagemapをやりました.画像準備するのがクソだるかったので,自動的に画像を作成するやつ作りました.

import glob

files = glob.glob('C:\work\python_data\\resizeImg\data\*')

import cv2
import numpy as np

import sys
import os

sizes = [240, 300, 460, 700, 1040] #imagemapで必要な横幅

for f in files:
    img = cv2.imread(f, cv2.IMREAD_COLOR)
    imgH, imgW = img.shape[:2]
    name,ext = os.path.splitext( os.path.basename(f) )
    index = int(name[1])
    for s in sizes:
        cv2.imwrite("C:\work\python_data\\resizeImg\\3" + str(index) + "\\" + str(s) + ".jpg", cv2.resize(img, (s, int(s*imgH/imgW)))) #拡張子がないとエラーした
        os.rename("C:\work\python_data\\resizeImg\\3" + str(index) + "\\" + str(s) + ".jpg", "C:\work\python_data\\resizeImg\\3" + str(index) + "\\" + str(s))

大きさを変えたい画像(縦長を想定)をX0.jpg,X1.jpgみたいに保存する.(本来はint(name[-1]がいい気がする))
フォルダは30,31みたいなのを作って(これも自動化できるけどそこまでコード書くのはだるかったからやらなかった).

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")