wtorek, sierpnia 02, 2022

Żenienie Todoist z Obsidian przy pomocy Pythona ;-)

Zawsze brakowało mi połączenia ToDo z miejscem gdzie mógłbym mieć notatki i żeby to było jeszcze przeszukiwalne ;-)

No JIRA tak prawie działa, ale przecież nie będę trzymał JIRAy na swoim komputerze, a do tego ile by mnie to w ogóle kosztowało.

Stąd spróbowałem pożenić prostym skryptem w Pythonie Todoista z Obsidianem :-)

Działa to tak, że jak uruchamia się skrypt to pobiera moje aktualne taski z Todoista, i jeśli są w odpowiednim projekcie to tworzy w odpowiednim katalogu Obsidiana pliki z danym taskiem, do tego dodaje do Obsidiana dokument ToDo z listą rzeczy do zrobienia.

Na razie używałem tego dziś i wydaje się pomagać :-)

Skrypt wygląda tak:

import urllib
import urllib.request
import json
import os.path

projectFilter = <ID PROJECT WORK>

token = "<TOKEN FOR TODOIST API>"

headers = {"Authorization":"Bearer "+token}

url = "https://api.todoist.com/rest/v1/tasks"

req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
jsonResponse = response.read()

tasks = json.loads(jsonResponse)

# print(json.dumps(tasks, indent=4, sort_keys=True))

pathToObsidian="<Obsidian Vault Location>"
path=pathToObsidian+"<Subfolder to keep tasks>"

content="# ToDo #\n-----\n"
for task in tasks:
projectId=task["project_id"]
if projectId!=projectFilter:
continue
title=task["content"]
# OK, for me it works in this way that when I'm adding stuff to Todoist using Python and Alfred my work tasks have [Work] in front, so I want to remove it
fName=title.replace("[Work]","").replace("/"," or ").strip()
desc=task["description"]
url=task["url"]
print(title)
print(json.dumps(task, indent=4, sort_keys=True))
try:
fName=path+"/"+fName+".md"
titleStr=title.replace("[Work]","").strip()
content=content+"* [["+titleStr+"]]\n"
if os.path.exists(fName):
continue
outF=open(fName,"w+")
outF.write("# "+titleStr+" #\n"+desc+"\n[In Todoist]("+url+")")
outF.close()
print("Success with "+title)
except:
print("Problem.....")
print("Problem with "+title)
outF=open(pathToObsidian+"/ToDo.md","w+")
outF.write(content)
outF.close()

Teraz wystarczy to dodać np. do crontaba i uruchamiać co np. 15 minut i mamy magię ;p
Brakuje tutaj dużo, np. zamiast używać nazwy pliku lepiej by było używać ID taska i tak dalej, ale to popełniłem wczoraj koło 2 w nocy ;p
A używałem dziś "w pracy" i działa ;-)



Podobne postybeta
Jak nie zapomnieć kupić biletu miesięcznego - revised ;-)
Python z urllib = najlepszy menadżer pobierania ;-)
Alfred + Todoist i wysyłanie tasków do projektu, a nie tylko do Inbox'a ;-)
Jak nie zapomnieć kupić biletu miesięcznego ;-)
Airly + Python + Oczyszczacz Powietrza = lepsze oddychanie ;-)

niedziela, lipca 10, 2022

Bookmarklet do robienia CSV z obligacjami i ich oprocentowaniem ;-)

[Update]
Niestety złe ludzie od strony z obligacjami mieszkają z IDkami, więc mój piękny skrypt na jakiś czas przestał działać ;-) Najpierw go zupdatowałem przez poprawienie po prostu ręcznie na nowe IDki, teraz dodałem "mechanizm" do znajdowania IDików ;-)
Do tego dodałem nowy bookmarklet do pobierania ważonego oprocentowania ;-) [czyli zbieramy procent ze wszystkich emisji, później liczymy średnią ważoną oprocentowania, gdzie wagą jest kwota zakupu, dzięki temu mamy takie pi razy oko pojęcie ile w roku zarobimy]
[Koniec update]

Jeśli ktoś kupuje polskie obligacje to wie, że strona do tego ssie od strony usability ;-)
Jest tam np. możliwość pobrania pliku Excela, ale po pierwsze to Excel ;-) po drugie, nie ma tam w ogóle informacji o oprocentowaniu.
Żeby zobaczyć oprocentowanie trzeba zaś wykonywać karkołomne operacje i próbować najeżdżać na nazwę emisji by może zobaczyć oprocentowanie:


I normalnie chcąc zobaczyć jakie mam "średnie" oprocentowanie, najpierw pobierałem plik Excela, później przechodziłem przez kolejne emisje i sobie przepisywałem ostatni numerek...
Strasznie to było męczące.

Stąd dziś prezentuję ten oto bookmarklet ;-)
(przeciągnij go do bookmarków, wejdź na stronę od obligacji, zaloguj się, zmień może liczbę wyświetlanych obligacji i kliknij na ten bookmark, powinna Ci przeglądarka zaproponować pobranie pliku CSV z nazwą obligacje.csv, aha w tym CSV za separator dziesiętny robi kropka, nie przecinek, więc niektóre programy mogą mieć problem, np. Numbers na macOS upiera się, że ponieważ to Polska to ma być przecinek... więc zmieniłem sobie w całym systemie bo ja uznaję tylko kropkę ;-))

Którego kod wygląda mniej więcej tak:

// sadly this part is only for hacky way of finding what are Ids
function findIdLambda(elem,list,func) {
var id = elem.id;
if (id && func(id)) {
list.push(id);
}
for (var i=0; i<elem.childNodes.length; i++) {
var child = elem.childNodes[i];
findIdLambda(child,list,func);
}
}

function findId(elem,idStart,list) {
findIdLambda(elem,list,x => x.startsWith(idStart));
}

var list = [];
findId(document,"stanRachunku",list);
var id = list.filter(x => x.endsWith("data")).filter(x => x.indexOf("idt")!=-1)[0];
var no = id.split("idt")[1].split("_")[0]*1;
var idxNo = no;

function findQtipId(pattern) {
var list = [];
findIdLambda(document,list,x => x.startsWith(pattern));
return list[0];
}
//end of hacky way for finding proper Ids

const mouseoverEvent = new Event('mouseover');
function amount2number(s) {
var nbrsp=String.fromCharCode(160);
return s.replace(nbrsp,"").replace(',',".").replace(nbrsp+"PLN","");
}
function getPercents(idx) {
var id = findQtipId("qtip-stanRachunku:j_idt"+idxNo+":"+idx+":j_idt");
console.log(id);
var element=document.getElementById(id);
var data=element.innerText.split("%");
var res = [];
for (var i=0; i<data.length; i++) {
var line=data[i];
line=line.trim();
if (line.length==0) continue;
var l=line.split(" ");
res.push(l[l.length-1]);
}
return res;
}
var table=document.getElementById("stanRachunku:j_idt"+idxNo+"_data");
var data=table.childNodes;
var content="id,number,value,actual value,cycle,%,redemption date\n";
for (var i=0; i<data.length; i++) {
var line = data[i].childNodes;
// ugly hack... but without this it will not be visible, and we would not be able to get percents
line[0].firstChild.dispatchEvent(mouseoverEvent);
var emId=line[0].innerText;
var number=line[1].innerText;
var value=line[3].innerText;
var actual=line[4].innerText;
var redemption=line[5].innerText;
var percents=getPercents(i);
var cycle = percents.length;
var percentage = percents[percents.length-1];
var l=[emId,number,amount2number(value),amount2number(actual),cycle,percentage,redemption];
var cl = "";
for (var j=0; j<l.length; j++) cl+=l[j]+",";
cl=cl.substring(0,cl.length-1);
content+=cl+"\n";
}
console.log(content);
var blob = new Blob([[content]],{type: "text/csv"});
console.log(blob);
var downloadObj = window.URL.createObjectURL(blob);
console.log(downloadObj);
var a = window.document.createElement('a');
a.href = downloadObj;
a.text = "obligacje.csv";
a.download = "obligacje.csv";
a.click();

Jak działa? ;-)
Prosto ;-)
Najpierw szuka tabelki z danymi, dziwnie na wszystkich kontach na jakich sprawdzałem (dokładnie 2 ;-)) tabelka zawsze nazywa się "stanRachunku:j_idt138_data". Później idzie przez jej linie i zbiera dane, czyli nazwę emisji, liczbę obligacji, ich wartość nominalną, wartość w chwili obecnej, datę wykupu i numer roku, oraz oprocentowanie.
Te dwie ostatnie wartości bierze hackiem ;-) okazuje się, że trzeba najechać na nazwę emisji by w ogóle pojawił się tooltip który pokaże interesujące nas wartości, po to jest linia:
  line[0].firstChild.dispatchEvent(mouseoverEvent);
która to linia wysyła event mouseover do elementu i wtedy pojawia się odpowiedni tooltip, który sobie pobieramy w getPercents ;-) 
Na końcu tworzony jest plik CSV i link do jego pobrania, który się sam z siebie klika ;-)
Wtedy przeglądarka proponuje nam pobranie danych :-)
Jedna uwaga, to są zawsze dane z aktualnej strony... więc jak ktoś ma więcej niż 20 emisji to dobrze zmienić liczbę widocznych na danej stronie na 50, a jak ktoś ma więcej niż 50 to trzeba niestety się bawić w klikanie bookmarkletu na każdej podstronie.
Nadal to jednak prostsze niż "stara" metoda ;-)


Bookmarklet by policzyć Procent z obligacji, zrobiony przy pomocy Bookmarklet Makera


Podobne postybeta
[Updated] Czytanie Pocketa ;-)
Ściana, czyli rozbijam się na onclick ;-)
Go dla Java'owca ;-) odcinek 2 "kontenery dwa ;-)"
Ile Ci brakuje by zostać kapitalistą? ;-)
AppInventor - pierwsze wrażenia i pierwsze programy :-)

niedziela, czerwca 26, 2022

Java szybsza na M1 jako X86 niż jako ARM ;-)

I okazuje się, że przynajmniej w pewnych sprawach, np. w całkowaniu numerycznym ;-) Java na M1 jest szybsza gdy działa w trybie emulacji x86-64, niż gdy działa w trybie aarch64 (czyli "natywnym" ARMowym dla M1).

Odpaliłem na laptopie z M1 programik do całkowania numerycznego (w obszarze od -10 do 10, w prawie 21.5 mln kroków, w pętli która sprawia, że wykonuje się to 10 razy).

Na Macbooku 16 z M1 z 2021 roku.

No i dla Java 11 (od Azul) wyniki są takie:

x86-64: 5611 ms
aarch64: 7528 ms

Podobne wyniki są dla Java 18.

Ciekawiej się robi dla Oracle'owej Java 18 ;-)

x86-64: 5811 ms
aarch64: 31340 ms

Czyli w przypadku JVM od Oracle'a jest wersja dla ARMa o 5.4 raza wolniejsza ;-)

Nie umiem powiedzieć czy chodzi o różnice w implementacji HostSpota czy może o jakiś kod natywny.

Ale i tak intrygujące :-)





Podobne postybeta
W końcu dane z M1, które w Java'ie mówią, że to jest ARM :-)
Dla Java'y Apple Silicon M1 to jednak nadal x86 ;-)
Wszędobylska Java :-)
"os.arch", "os.name", "sun.arch.data.model" co to jest i co pokazuje na jakiej maszynie i OSie? ;-)
JNA, czyli w Java'ie też można :-)

sobota, czerwca 25, 2022

DevoXX 2022

No i był DevoXX :-)

Było całkiem fajnie, znów spotkałem ludzi z którymi pracowałem w innych firmach, albo takich którzy pracują już w innych firmach ;-)

Spotkałem też ludzi z mojej przyszłej firmy ;-)

Tak patrząc na konferencje stwierdzam, że jak człowiek zaczyna to chodzi głównie na prezentacje i one są bardzo ciekawe bo wszystko jest nowe.

Z czasem więcej czasu spędza na spotykaniu ludzi, których zna z innych firm ;-)

W końcu prezentacje są tylko dodatkami do spotykania ludzi ;-)

Ale i tak nic nie pobije DevoXX 2019 i towarzystwa ;-)




Podobne postybeta
Konferencje są przereklamowane
OOo2GD 1.8.1 - i znów poprawki
Rant śmietnikowy ;-)
Po Devoxx'ie
Chce komputerów, które będą "seamless"

piątek, czerwca 10, 2022

Telefon jako repeater WiFi ;-)

Właśnie dokonałem odkrycia ;-)

Można używać telefonu jako repeatera WiFi ;p

Android od pewnej wersji (w tym telefonie jest Android 13 w wersji tej testowej, ale na 100% działa to też na Androidzie 12, a wydaje mi się, że jeszcze wcześniej na wcześniejszych też to miałem) pozwala na dzielenie się Internetem nie tylko z sieci komórkowej, ale też z sieci WiFi ;-)

No i w miejscu gdzie teraz jestem Internet jest taki sobie.... w moim pokoju go praktycznie nie ma, więc przez ostatnie parę godzin używałem telefonu jako HotSpota i dzieliłem się moim Internetem z NJU...

Ale coś mnie naszło i włączyłem HotSpot w drugim telefonie, zaniosłem go do przedpokoju w którym spokojnie łapie "miejscowy" Internet, podłączyłem do tego lokalnego... i nagle mam Internet w komputerze podpiętym do mojego HotSpota, ale to nie jest ten Internet z NJU, a "miejscowy" dla którego telefon robi za swoisty repeater ;-)




Podobne postybeta
Migracja
Kolejny "projekt" na GitHub ;-) LocaleSSID
Praca z komputerem na stojąco...
SwiftKey Flow wrażenia
Dobrze wykorzystany programista

środa, czerwca 08, 2022

Ostatni on-call ;-)

Ponieważ zmieniam wkrótce pracę to zaczynam wypadać z różnych dodatkowych rozrywek, np. od niedzieli z on-call'a i przez to dziś miałem od 1:00 do 13:00 ostatni dyżur na on-call'u ;-)

Który zakończyłem uroczystym odinstalowaniem PagerDuty ;-)


Później odinstalowałem moją aplikacyjkę do pokazywania ile mi zostało czasu do on-call'a i ile czasu na on-call'u ;-)

O tym odinstalowaniu to już miewałem fantazje ;-)




Podobne postybeta
On-call....
Kiedy następny on-call?
A może by tak nosić drugi telefon specjalnie do on-call'a?
On-call i sąsiedzi którzy robią remont się nie łączą zbyt dobrze :-)
9 miesięcy bez on-call'a - to jest super :-)

sobota, kwietnia 23, 2022

Uniwersalny zasilacz ;-)

W końcu znalazłem uniwersalny zasilacz ;-)


Ma 100W mocy wiec każdy z laptopów z niego mogę nakarmić :-) [MBP je 68 albo 62W, MBA je do 33W], do tego iPada i telefon, a jeszcze i zegarek ;-)

Jak się ma dwa takie to można jeszcze parę rzeczy ładować w tym samym czasie :-)

Akurat te moje zasilacze mają jeszcze to, że normalnie mają amerykańską wtyczkę, ale mają takie fikuśne nakładki, które zmieniają ją w europejską lub brytyjską.

Z europejską nakładką wygląda to tak:


A bez tak:

I po "wyjęciu" jest to amerykańska wtyczka. Chytre :-)

Moje zasilacze to MINIX NEO P3 100W i mają po 3 USB-C (z czego 2 górne mogą dać max do 100W,  trzeci daje max 20W i dolne USB-A daje do 18W) i jestem na razie dość zadowolony bo na wyjazdach się sprawdzają :-)




Podobne postybeta
Mój pierwszy polski Subway ;-)
Instrukcje obsługi do ludzi
Chcę MBP15, ale z klawiaturą ;-)
HD
Jak ogarnąć ładowanie kilku iPadów i Macbooków, tak by nie były non-stop na ładowarce, ale by zawsze w nich było na tyle prądu by się ich choć trochę dało poużywać? ;-)

wtorek, kwietnia 05, 2022

Szaleństwo scyzorykowe ;-)

Kupiłem sobie drugi scyzoryk od Victorinox i jednak chyba ten który kupiłem wcześniej jest bardziej praktyczny ;-)

Bo jak z góry wyglądają podobnie:

Jak się jednak spojrzy z boku zaczyna to troszkę przerażać ;-)

W tym czerwonym ciut przegięli ;-)

Ale jednak na wyjazdy dobra rzecz bo są w nim np. nożyczki :-)




Podobne postybeta
Chromebook i jego wady
Rząd wykonał swój plan aż w 17% ;-)
6:22 czyli środek nocy
Wartość...
Katowany "łomot" ;-)

niedziela, marca 13, 2022

Sieć w telefonie jest ważna

Dziś w ramach eksperymentu nie używałem Internetu do 15:00... i z nudów policzyłem np. ilość aplikacji/skrótów do aplikacji które mam na ekranie główny.

Wyszło mi 61 skrótów/aplikacji:


Tylko 21 jest w miarę użyteczne bez sieci ;-) i to w wielu przypadkach tylko jak się coś pobierze (nie liczyłem np. Netfliksa, bo niby można pobrać ale zjada dużo miejsca, ale liczyłem np. Spotify, PocketCast, Kindle czy Pocket'a bo tutaj te rzeczy się prawie zawsze same pobierają (no poza Spotify) i idea jest taka by dane synchronizowały się do urządzenia, a nie strumieniowały z sieci).

Trochę mnie to zaskoczyło ;-)




Podobne postybeta
"Odstawianie" telefonu ;-)
Robimy nową galerię ;-)
A może by tak zacząć zamykać przeglądarkę? ;-)
Się mnie poprzestawiało....
Piszę sobie...

poniedziałek, lutego 21, 2022

10 lat temu byłem u Buffy ;-)

Nie da się ukryć, że jestem fanem Buffy the Vampire Slayer ;-)

I 10 lat temu udało mi się odwiedzić miejsca gdzie kręcono serial :-)

Dom Buffy:


(tak wiem, ładnie widać mój brzuszek ;-))

Szkołę Buffy:


I parę innych miejsc ;-)

Mogłem tam być 3 lata wcześniej, ale wtedy jeszcze nie było Ubera ;-) [a te 10 lat temu nie wiem czy był, ale zawiozła mnie tam koleżanka z pracy, która też była fanką Buffy ;-)]

Ogólnie lubię odwiedzać miejsca, które znam z filmów i seriali ;-)




Podobne postybeta
Byłem u Buffy :-)
Me Borat ;-)
Buffy ma 40 lat....
TVP HD - najsmutniejszy program TV
Przenośna wikipedia