sobota, kwietnia 29, 2017

Jak nauczyć się żonglować? ;-)

To proste, trzeba dzień w dzień próbować...

Ale żeby nie zapomnieć dobrze by coś o tym przypominało.

I tutaj przydaje się Kalendarz Google :-)


Jakiś czas temu do Google Calendar dodano funkcję pozwalającą na ustawianie celów, dodajemy cel i możemy wybrać jaki to cel, jak często powinien się pojawiać w naszym kalendarzu, o jakiej porze dnia ile powinien trwać.
Po tym Google Calendar bazując na tym co znajduje się w kalendarzu rozplanowuje nasze cele tak by ze sobą nie kolidowały i by rozkładały się mniej więcej tak jak chcieliśmy.
Później już tylko trzeba posłusznie odhaczać zrobione ćwiczenie, czy coś innego :-)


Chociaż przyznaję, że nie zawsze łatwo się wyrobić.... wtedy trzeba przycisnąć Later zamiast Did it....
Google Calendar zaplanuje nowy lepszy czas :-)

A mnie żonglowanie coraz lepiej wychodzi. Nadal góra 3 obroty zrobię, ale jeszcze kilka tygodni temu nie wychodziła mi 1/3 obrotu ;-)


Podobne postybeta
Motywy
Tym razem chcę bezszwowej TV ;-)
Postanowienia noworoczne ;-)
Najprostszy OCR ;-)
Wpisy z Bloggera jako eventy w Google Calendar, odsłona 3 - Aplikacja ;-)

niedziela, kwietnia 23, 2017

Airly + Python + Oczyszczacz Powietrza = lepsze oddychanie ;-)

W Krakowie powstaje genialny produkt zwany Airly, który pokazuje w real time poziom zanieczyszczenia powietrza.
Ostatnio szerzej otworzyli swoje API. Co mnie ucieszyło, bo chociaż mają genialną apkę na Androida to chciałem mieć możliwość napisania sobie skryptu, który w momencie osiągnięcia odpowiednio wysokiego poziomu zanieczyszczenia wysyłał by mi maila z sugestią włączenia oczyszczacza powietrza (najlepiej jakby go sam włączał, ale to jednak takie proste nie jest ;-)).

Chciałem, to mam ;-)

import urllib2
import json
import os
import string
import sendmail

ALERT_LEVEL = 40
MAIL_TO = "<MAIL>"
apikey = "<APIKEY from https://apiportal.airly.eu/>"
url = "https://airapi.airly.eu/v1/mapPoint/measurements?latitude=<yourLatitude>&longitude=<yourLongitude>"
prevCaqi = 0
if os.path.exists("prevCaqi.txt"):
prevCaqi = float("".join(open("prevCaqi.txt").readlines()))

req = urllib2.Request(url)
req.add_header('apikey', apikey)
resp = urllib2.urlopen(req)
content = resp.read()

data=json.loads(content)

caqi = float(data["currentMeasurements"]["airQualityIndex"])

open("prevCaqi.txt","w+").write(str(caqi))

if prevCaqi<ALERT_LEVEL and caqi>=ALERT_LEVEL:
content = string.Template("""Current CAQI: $airQualityIndex
pm25: $pm25
pm10: $pm10
pollution level: $pollutionLevel
pressure: $pressure
humidity: $humidity
temperature: $temperature""").safe_substitute(data["currentMeasurements"])
sendmail.sendEMail(MAIL_TO,"Turn on AirCleaner",content)


Żeby działał ten skrypt trzeba mieć swój klucz do API, który idzie pod apikey. Trzeba ustawić też maila w MAIL_TO i długość i szerokość geograficzną (które można sobie odczytać np. używając mojego toola do wyliczania czasu wschodu i zachodu słońca ;-)).
Jeszcze trzeba mieć moduł sendmail, który można znaleźć w moim wpisie o tym jak nie zapomnieć o kupnie biletu miesięcznego ;-)


Podobne postybeta
Raspberry Pi + no-ip.org ;-)
Moja własna akcja w Google Home ;-)
Jak nie zapomnieć kupić biletu miesięcznego - revised ;-)
Jak nie zapomnieć kupić biletu miesięcznego ;-)
Google Actions działają już w Google Assitant nie tylko na Google Home, ale i w innych jego inkarnacjach :-)

czwartek, kwietnia 20, 2017

Z Nexusów do Pixeli

Jakiś czas temu w tabletach przeszedłem z Nexusa 10 na Pixela C.
Wczoraj zaś zrobiłem to w telefonach. Z Nexusa 6 na Pixela XL.

Czuć różnicę.
Nexusy są fajne, ale tam celem było zrobienie dobrych urządzeń w rozsądnej cenie.
Pixele mają inny cel, to mają być pełnoprawne flagshipy w nierozsądnej cenie ;-)

I takie są ;-)

Jakość wykonania jest dużo wyższa niż w przypadku Nexusów.

Wszystko też jest straszliwie szybkie (chociaż to akurat wynik wieku urządzeń).

Jedyną wadą dla mnie Pixela XL w porównaniu do Nexus 6 jest to, że jednak telewizor w Pixelu XL to tylko 5.5 cala, a nie 5.96 z Nexusa 6.

Ale za to aparat i cała reszta są dużo lepsze.

posted from Bloggeroid




Podobne postybeta
Google Actions działają już w Google Assitant nie tylko na Google Home, ale i w innych jego inkarnacjach :-)
Uspokajacz
Przemek w krainie Stefanów ;-)
Pixel C - dobry
I znów widziałem The Internship :-)

środa, kwietnia 19, 2017

"Zestaw inspektora" się tworzy ;-)

Powoli, acz skutecznie, zaczynam wykorzystywać inspekcje w IntelliJ'u do pilnowania kodu przed różnymi dziwnymi błędami.
Dziś sobie dodałem taką inspekcję, która płacze gdy używamy gdzieś bezpośrednio liczb jako indeksów w tablicach, albo listach ;-)

Od teraz mi IntelliJ tak płacze jak coś takiego zobaczy:


Chodzi mi po głowie by sobie zrobić "zestaw inspektora", coś co by mi podkreślało wszystkie code smells'y z mojej "listy" inspekcyjnej.
Chociaż dobrze by było by takie coś działało w toolu do inspekcji, a nie w IDE, bo w IDE tylko ja z tego skorzystam, a mimo wszystko zwykle jak robię inspekcję to nie robię clone'a czy checkout'u kodu.
Niby tak, są jakieś toole do analizy kodu, ale one są zwykle do poprawy jakości kodu, a nie do np. wskazywania podejrzanie trefnych miejsc w trakcie inspekcji ;-)
Idealnie byłoby mieć skrypt, który tworzyłby listę komentarzy do inspekcji i sam mógłbym skupić się na podejrzanych miejscach ;-)
Chociaż nie ma pewności, że to by było dobre, mogłoby ukrywać bardziej subtelne problemy.


Podobne postybeta
Walka z null'em - pozwólmy działać IntelliJ'owi ;-)
Distinct (albo unique) w JavaScript
MS Nieszczęście 8 - psujemy...
Nie lubię oszustów.
Ewolucja Buzz Troll Remover'a ;-) - czyli nad czym teraz pracuję

wtorek, kwietnia 18, 2017

Rule w Outlook = ZUO

Mój stosunek do oprogramowania Microsoftu jest negatywny.
Poza Windowsem i MS Paintem nie udało im się w mojej ocenie nigdy wypuścić kawałka dobrego softu.

Każdy kontakt z ich softem utwierdza mnie tylko w tym przekonaniu ;-)

W firmie używamy Outlooka 365 i MS Office'a. Poczta jest przez Outlooka.

Nie używam klienta desktopowego bo jest słaby, używam webowego. Który też jest słaby, ale chociaż nie robi mi "tadam" jak kalendarz ma na to ochotę.

Jak zacząłem pracę to zrobiłem sobie trochę reguł i zmniejszyła się liczba maili jakie musiałem czytać...
Niby fajnie, ale np. zniknęły zaproszenia na inspekcje kodu.
Nie widzę też maili, które zostały wysłane do kilku osób.

Nie wydaje się by maile te lądowały w jakimkolwiek katalogu, po prostu ich nie widać....

No to skasowałem wszystkie rule (pewnie okaże się, że jednak nie..) i zobaczymy czy zacznę odzyskiwać maile..

Outlook to ZUO!!!!


Podobne postybeta
Outlook zły
Metapost o tym co pisać jak nie mam pomysłów o czym pisać....
Deszczowy Niebieski Ząb ;-)
Jak Henryk VIII i Dynastia Tudorów uczy, że demokracja is the best! ;-)
CVS "złamany" :-)

niedziela, kwietnia 16, 2017

Walka z null'em - pozwólmy działać IntelliJ'owi ;-)

Jakiś czas temu pisałem o tym, że chciałbym stworzyć wtyczkę do IntelliJ, która pozwoliłaby mi unikać pisania kodu z null'ami.

Nie zacząłem jeszcze nawet, ale od paru dni stosuję coś co robi za MVP (Minimal Viable Product) takiej wtyczki ;-)

Stworzyłem sobie w IntelliJ inspekcję, która podkreśla mi na czerwono KAŻDE użycie null'a ;-)


Wydaje się, że spełnia swoje podstawowe zadanie, czyli zwraca moją uwagę na użycia null'a ;-)

Zaryzykuję stwierdzenie, że na razie działa to tak dobrze, że chyba porzucę plany pisania wtyczki.

Jak ktoś ma ochotę się pobawić to są dwa sposoby ;-)

Prostszy ;-) pobieramy ten plik, uruchamiamy IntelliJ Idea, w menu File wybieramy Import Settings (File -> Import Settings) i szukamy pliku stopNull.jar, który właśnie pobraliśmy.
Oczom naszym ukazuje się dialog:


 Klikamy OK, restartujemy IntelliJ i voilà od teraz IntelliJ nam będzie podkreślał na czerwono null'e ;-)

Trudniejsza droga, acz pozwalająca się więcej nauczyć wygląda zaś tak:
1) idź do ustawień IntelliJ (np. Shift-Shift i piszemy Settings)
2) idź do ustawień Inspekcji:

3) Wybierze General -> Structural Search Inspection:

4) w Options dodaj nową (zielony +, albo po prostu Alt-Insert (przynajmniej na Ubuntu), u Ciebie na razie nie będzie Used null ;-))

5) Add Search Template:

6) Wpisz template (u nas po prostu null jak na obrazku ;-)):

7) nazwij swój template:
8) OK
9) voilà masz nową inspekcję ;-)

Dobrze jeszcze zaznaczyć jej severity na Error by podkreślała się jako błąd.

W taki sposób można dodawać różne nowe inspekcje, które pozwolą poprawić jakość naszego kodu :-)

Testowane na IntelliJ Idea 2017.1 i IntelliJ 15.


Podobne postybeta
"Zestaw inspektora" się tworzy ;-)
SleepAdvisor - komórka pomaga w wyspaniu się ;-)
Walka z null'em ;-)
Selfhacking ;-)
Naprawdę nienawidzę...

wtorek, kwietnia 11, 2017

Sztuczki tropiciela błędów - breakpoint na sterydach ;-)

Breakpoint to dobry przyjaciel tropiciela błędów.

Zatrzymuje wykonanie kodu (zwykle danego wątku) gdy napotka zaznaczony kawałek kodu, albo gdy poleci Exception, albo gdy zostanie zawołana jakaś metoda (strasznie wolne!).

Ale czasem chcielibyśmy mieć jakąś kontrolę nad tym zatrzymywaniem, bo np. nie chcemy by nam się kod zatrzymywał przy każdym wejściu do metody, ale tylko w pewnych warunkach.

Do tego mamy w InteliJ Idea i w Eclipse (a i w innych też) warunki aka conditiony dla breakpointów.
Zwykle są w stylu:

param==1
"specialCase".equals(text)

i podobne.
Czasem chcielibyśmy jednak czegoś lepszego ;-)

Ja ostatnio zapragnąłem by mi się zatrzymywał kod tylko gdy na stosie wywołań nie ma pewnej metody.
Chodziło o to, że już wiedziałem co przychodzi z tego miejsca, chciałem zobaczyć inne przypadki bez trzymania F9.

Najpierw spróbowałem użyć strumieni i lambd:

java.util.Arrays.stream(new Throwable().fillInStackTrace().stackTrace)
     .noneMatch(x -> "getWorker".equals(x.getMethodName()))

Czyli chciałem by warunek wystąpił gdy na StackTrace'ie nie będzie żadnej metody o nazwie getWorker.

Niestety IntelliJ poinformował mnie, że sorry Winnetou, ale lambd się nie da używać w warunkach breakpointa...

To stworzyłem sobie taką klasę ;-)

import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;

public class Terminator {

  public static boolean terminateIfNotCalledFrom(String... methodsNames) {
    Throwable t = new Throwable();
    t.fillInStackTrace();
    Set<String> methods = Arrays.stream(methodsNames).collect(Collectors.toSet());
    return Arrays.stream(t.getStackTrace()).noneMatch(x -> methods.contains(x.getMethodName()));
  }

  public static boolean terminateIfCalledFrom(String... methodsNames) {
    Throwable t = new Throwable();
    t.fillInStackTrace();
Set<String> methods = Arrays.stream(methodsNames).collect(Collectors.toSet()); return Arrays.stream(t.getStackTrace()).anyMatch(x -> methods.contains(x.getMethodName())); } }

Która to klasa dostarcza 2 metody statyczne, których możemy użyć w warunku:


I teraz kod zatrzymuje mi się tylko gdy osiągnęliśmy dany breakpoint nie przechodząc przez metody o nazwach, które przekazujemy w parametrze ;-)

Tropienie błędów staje się w takim przypadku dużo ciekawsze ;-)


Podobne postybeta
Sztuczki tropiciela błędów ;-)
Sztuczki tropiciela błędów, part 2 ;-)
Niecne wykorzystanie refleksji... czyli jak poszukać tekstu w drzewie obiektów? ;-)
Sztuczek Java'owy
Deklaratywnie czy imperatywnie... oto jest pytanie ;-)

sobota, kwietnia 08, 2017

Journaling

W końcu przeczytałem Search Inside Yourself.
Zajęło mi to tylko 4.5 roku ;-) z tym, że 4.5 roku temu doczytałem do 1/3, a ostatnio od początku do końca.

I opisano tam journaling. Chytrą technikę do odczytywania własnych stanów, myśli i marzeń.
Dopiero po takim journalingu do mnie dotarło, że mój ulubiony dowcip "Co znaczy wegetarianin po indiańsku? Za głupi by polować" nie jest aż taki zabawny (tzn. nadal mnie bawi, ale bezpiecznie może powiedzieć ten dowcip tylko ktoś kto nie uważa wegetarian za szaleńców, a raczej ktoś kto ich prawie podziwia i to w sytuacji gdy odbiorcy znają poglądy tego mówiącego... ogólnie powinni mówić ten dowcip tylko wegetarianie :-)).

A już wersja journalingu w którym piszemy z pozycji "za 5 lat" jest w ogóle potężna... i trudna.

Chodzi o to, że mamy przez jakiś czas (u mnie 5 minut) pisać tak jakbyśmy byli 5 lat od teraz i mamy opisać nasze życie, czym się zajmujemy, gdzie mieszkamy, jak wygląda nasza rodzina i tak dalej.

To mi uświadomiło, że właściwie nie wiem co chcę robić ;-)

Robię to co robię, ale głównie radochę mam w momentach gdy tak trochę obok swojej pracy robię jakieś dziwne narzędzia czy usprawnienia.
Radość sprawia mi nie tyle kodowanie, a nietypowe rozwiązywanie problemów ;-)

Stąd jak masz 5 minut, to wylosuj sobie liczbę od 1 do 11, otwórz notatnik i zależnie która liczba wypadła napisz:
1) czuję teraz...
2) jestem świadom(a)...
3) tym co mnie motywuje jest...
4) dziś pragnę/dążę do....
5) boli mnie...
6) chciałbym/chciałabym...
7) inni są...
8) wbrew temu co chciałem/chciałam, szczęśliwie stało się że...
9) moje wartości to...
10) popieram...
11) przy założeniu, że wszystko się udaje za 5 lat będę... (pisać jakby się pisało za te 5 lat, czyli w czasie teraźniejszym)

Teraz przez 5 minut pisz kontynuację tych pierwszych słów :-)

Jak nic nie przychodzi do głowy to pisz o tym, że nic do głowy nie przychodzi, a jak się coś pojawi, to niezależnie czy ma związek z pytaniem pisz. Czasem trzeba przetestować pomysły, a ich napisanie to dobry test.

Wychodzi na to, że konieczność napisania przepuszcza myśli przez te części umysłu, które muszą to ubrać w słowa i nazwać uczucia, pragnienia czy pomysły.
A jak coś umiemy nazwać to mamy metody do wpływania na to.

Przynajmniej u mnie to działa :-)


Podobne postybeta
Wegetarianizm kaizen - czyli ja bywać wegetarianinem bez zbytniego wysiłku ;-)
Samochód jako zmniejszacz temperatury.... GC i jak to możliwe, że Young Generation może być zbyt duże, strzeż się finalize() i muzyczka :-) Czyli potok świadomości....
Journaling pt2 ;-)
Śmierdząca ryba wolności ;-)
Google Talk i herbata... eksperyment ;-)

czwartek, kwietnia 06, 2017

Z jednej strony ludzie żyją dłużej i lepiej, z drugiej "upadek moralny"... to co w tym "upadku" złego?

Politycy PiS oderwali się już od rzeczywistości.
Posłanka PiS Anna Sobecka wygłosiła w Sejmie słowa o upadku moralnym Europy przez "porzucanie chrześcijaństwa".

OK...
Oczekiwana długość życia mieszkańców Europy rosła przez cały XX wieku i wszystkie lata XXI wieku.
Nawet I i II Wojna Światowa w których zginęło kilkadziesiąt milionów ludzi były tylko chwilowymi spadkami na krzywej.
W całym XX wieku średnia oczekiwana długość życia wzrosła o jakieś 30 lat.
Umieralność noworodków spada.
Szanse na śmierć lub rany w wyniku przemocy ze strony innych ludzi spadają.
Szanse na śmierć lub rany w wyniku działań wojennych spadają.

Dziś mieszkaniec Europy ma kilkadziesiąt większe szanse umrzeć z powodu otyłości niż przez to, że go ktoś zabije.

To jeśli mamy upadek moralny Europy i pewnie świata jak twierdzi Pani poseł Anna Sobecka, który jest spowodowany odwrotem od wartości chrześcijańskich... to mam pytanie...
Co w tym do k... nędzy złego? Skoro ludzkość jako taka zyskuje?


Podobne postybeta
Historia +1
Full Screen w Chrome :-)
"Cywlizacja białego człowieka" - WTF?
HP7 bez manifestu ;-)
Nie czaję... ;-)