wtorek, stycznia 31, 2017

Niecne wykorzystanie refleksji... czyli jak poszukać tekstu w drzewie obiektów? ;-)

Pomysł nie jest mój, a kolegi z pracy.
I jego pomysł jest zdecydowanie bardziej rozbudowany, ja tylko postanowiłem sprawdzić czy pomysł jest realizowalny ;-)
I chyba jest.

O co chodzi?

Często w trakcie debugowania kodu dochodzi się do momentu, że wiadomo że jakaś rzecz, zwykle tekst jest gdzieś tam w drzewie obiektów, ale może być tak głęboko, że nie ma szans tam dotrzeć...

Przydałby się automat, który potrafiłby to zrobić ;-)

To jest ten automat ;-)

package pl.przemelek.challenges;

import java.lang.reflect.Field;
import java.security.ProtectionDomain;
import java.util.*;

public class Inspector {
private Set visited = new HashSet();
private Inspector() {}

public static String inspect(Object root, String text) throws IllegalAccessException {
List<String> strings = new Inspector()._inspect(root, text);
StringBuilder sb = new StringBuilder();
for (String s:strings) {
sb.append("x"+s).append("\n");
}
return sb.toString();
}

private Object getValue(Field field, Object instance) throws IllegalAccessException {
boolean acc = field.isAccessible();
field.setAccessible(true);
Object obj = field.get(instance);
field.setAccessible(acc);
return obj;
}

private List<String> _inspect(Object root, String text) throws IllegalAccessException {
List<String> found = new ArrayList<>();
if (root!=null && !visited.contains(root) && (!ProtectionDomain.class.isAssignableFrom(root.getClass()))) {
visited.add(root);
if (root.getClass().equals(String.class)) {
String str = (String)root;
if (str.indexOf(text)!=-1) {
found.add("="+str);
}
} else {
Field[] _fields = root.getClass().getFields();
Field[] _declaredFields = root.getClass().getDeclaredFields();
Set<Field> fields = new HashSet<>();
fields.addAll(Arrays.asList(_fields));
fields.addAll(Arrays.asList(_declaredFields));
for (Field field:fields) {
Object val = getValue(field,root);
if (val==null) continue;
if (CharSequence.class.isAssignableFrom(val.getClass())) {
String str = ((CharSequence)getValue(field, root)).toString();
if (str!=null && str.indexOf(text)!=-1) {
found.add("."+field.getName()+"="+str);
}
} else if (Iterable.class.isAssignableFrom(val.getClass())) {
Iterable iterable = (Iterable)getValue(field, root);
List<String> l = new ArrayList<>();
iterable.forEach(x -> {
try {
l.addAll(_inspect(x, text));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
});
for (String s:l) {
found.add("."+field.getName()+" contains "+text);
}
} else if (Map.class.isAssignableFrom(val.getClass())) {
Map map = (Map)getValue(field, root);
List<String> l = new ArrayList<>();
map.entrySet().forEach(x -> {
try {
l.addAll(_inspect(x, text));
} catch (IllegalAccessException e) {
e.printStackTrace();
}

});
for (String s:l) {
found.add("."+field.getName()+" contains "+text);
}
} else {
Object obj = getValue(field,root);
List<String> l = _inspect(obj,text);
for (String s:l) {
found.add("."+field.getName()+s);
}
}
}
}
}
return found;
}
}

Jak to działa?

Klasa ta musi się znajdować na naszym classpath'cie.
Zakładamy break point w jakimś miejscu w kodzie.
Gdy kod się zatrzyma używamy w IntelliJ (w innych też musi być jakiś odpowiednik tego) Evaluate Expression i wpisujemy do ewaluacji wyrażenie Inspector.inspect(obiektKtóryChemyPrzeszukać,"tekst którego szukamy") (możliwe, że trzeba będzie pl.przemelek.challenges.Inspector.inspect(obiekt,"tekst")), tak jak na obrazku poniżej:


Rezultatem jest tekst, który wypisuje wszystkie "ścieżki" do String'ów (a dokładniej CharSequence'ów) zawierających szukane słowo.

Ja wszystko testowałem na:

package pl.przemelek.challenges;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class InspectorTest {

static class Wrapper {
private String test2 = "toster test tostowy";
}

private String test = "toster test tostowy";
private Wrapper wrapper = new Wrapper();
private Map<String, String> map = new HashMap<>();
private List<String> list = new ArrayList<>();


public static void main(String[] args) throws IllegalAccessException {
InspectorTest it = new InspectorTest();
it.map.put("test","toster");
it.map.put("toster","test");
it.list.add("Toster");
it.list.add("test");
System.out.println(it.test);
}
}

Zakładając breakpoint na ostatniej linii metody main.

Zobaczę czy to dołączy do mojego prywatnego zestawu sztuczek przy debugowaniu ;-)
Bo jak znam życie jest masa miejsc gdzie się wyłoży ;-)

Teraz o tym jak to ogólnie działa.
Wychodzi po pierwsze z założenia, że z obiektu wychodzi nam drzewo (OK, wychodzi graf, ale drzewo to taki specjalny rodzaj grafu i na wszystkich powinien działać DFS, BFS byłby bezpieczniejszy, ale chodziło o proof of concept ;-), by nie wpaść w pętle używamy Set'u do trzymania odwiedzonych już obiektów... tak naprawdę z dokładnością do hashCode i equals).
Zaczynamy od góry drzewa obiektu i przechodzimy przez jego wszystkie pola, jeśli są CharSequence'ami to sprawdzamy ich zawartość, jeśli nie są to idziemy głębiej.
W końcu zwracamy listę wszystkich znalezionych pól ;-)


Podobne postybeta
Sztuczki tropiciela błędów, part 4
Sztuczki tropiciela błędów, part 2 ;-)
Sztuczki tropiciela błędów, part 3 - hackujemy klasy finalne ;-)
Monitorujemy cenę IntelliJ'a ;-)
Przepływ sterowany danymi - A takie Java'owe coś ;-)

Muzyka i czytanie ;-)

W dawnych czasach, jeszcze przed MP3 muzyki słuchałem głównie z kaset magnetofonowych.
I gdy czytałem wyglądało to zwykle tak, że gdy kończyła się jedna strona kasety to po prostu przekładałem kasetę na drugą stronę*. Jak ta się kończyła to znów na pierwszą i tak w kółko....

Przez do teraz Władca Pierścieni kojarzy mi się ze SNAPem, a Mówca Umarłych z Mikiem Oldfieldem.

Gdy słyszę Tubular Bells to przypomina mi się to takie lekkie obrzydzenie i lekki strach, który towarzyszył czytaniu tego jak Pequeninos aka Prosiaczki sadziły swoich zasłużonych*

Dziś mi się to przypomniało gdy zacząłem to oglądać:


Czyli właśnie Tubular Bells.

Fajne uczucie :-)


Podobne postybeta
Jeden kawałek za mną ostatnio łazi ;-)
Katowany "łomot" ;-)
"W przededniu" pierwsza książka Orsona Scott Carda, która jest SF ;-)
Zła TV ;-)
Kosmici i ich gospodarka ;-)

poniedziałek, stycznia 30, 2017

Usuń jedną aplikacje dziennie

Idąc tropem mojej akcji wyrzucania jednej rzeczy dziennie postanowiłem spróbować odinstalowywać codziennie jedną aplikacje z mojego telefonu.
Liczę, że w końcu zostaną tylko te których używam, a telefon nie będzie miewał niemiłych napadów szarpania... które to najbardziej uciążliwe są gdy słucham podcastu i próbuje jednocześnie coś zrobić.

Dziś do wyrzucenia poszło Allo, które miałem zainstalowane tylko po to by poznać Google Assistant.. a ten mieszka teraz u mnie w domu w Google Home.
posted from Bloggeroid



Podobne postybeta
Out of książka ;-)
Wernyhora mode 2 ;-)
Kontrrewolucja?
Tydzień z Google Home
Fing - poznaj swoją sieć ;-)

niedziela, stycznia 29, 2017

Metapost o tym co pisać jak nie mam pomysłów o czym pisać....

Zgodnie z planem* powinienem pisać na bloga jakieś 4 razy w tygodniu.
Czasem jest to proste, a czasem nie.
Czasem pomysły leją się strumieniami i z każdej strony atakują, innym czasem nie ma ich wcale, albo są, powstaje jakieś pół postu i koniec.

Rozwiązaniem są czasem metaposty, takie jak ten, czyli posty po postach ;-)

Ich głównym celem jest "uruchomienie", coś się pisze, coś co akurat w człowieku siedzi (czyli niemoc "twórcza") i przez to dawno nieużywane fragmenty mózgu, które mają coś tworzyć odpalają i zawsze jest szansa na to, że jakiś pomysł przyjdzie ;-) [przyszedł, chociaż nie wiem czy się nadaje ;-)]

Można też spróbować napisać np. o 2 losowych słowach... chociaż zwykle jak mi się losują są na tyle nudne, że nie mam ochoty iść tym tropem ;-)
Np. teraz mi się wylosowały "pride" i "lift".
Coś je łączy, dziś zwykle droższe mieszkania są na tyle wysoko, że trzeba tam jechać windą (lift), ba prywatna winda może być nawet powodem do dumy (pride)....
Teraz wyszło "rule" i "adult", znów proste. Zasadą (rule) jest to, że dorośli (adult) powinni się w miarę rozsądnie zachowywać, ba można nawet powiedzieć, że bycie dorosłym, aka dorosłość to nic innego jak życie wg. reguł....
Chociaż rule może też znaczyć rządzenie... i to jest wtedy marzenie, by rządzili nami w miarę dorośli ludzi, którzy przestrzegają reguł... nie rządzą tacy ;-)

Trzy słowa to też żadne wyzwanie, wyszły "study", "scene" i "winner".
Chociaż fakt jest więcej pomysłów ;-)
Może być np. taki, że studiując (study) można wygrać, trzeba tylko uważać by samo wyobrażenie sceny (scene) stawania się zwycięzcą (winner) nie przeszkodziła osiągnięciu celu...

OK, chyba się odkorkowałem ;-)
Stąd kończę tego metaposta ;-)

* plan - jest niewielki i wysłowiony ;-) po prostu Google Calendar ma taki ficzer, który pozwala na tworzenie celów. U mnie jednym z takich celów jest pisanie postów na blogu ;-)


Podobne postybeta
U mechanika... czyli nudne pisanie o niczym dla zabicia nudy
Rule w Outlook = ZUO
Atlas zbuntowany, ale na odwrót ;-)
Prześladowcy ;-)
O Ruchu Poparcia Palikota, czyli RPP ;-)

piątek, stycznia 27, 2017

Logistic Regression wykrywa clickbaity lepiej od Bayesa ;-)

Kiedyś sprawdzając który język jest szybszy używałem całkowania numerycznego, innym razem porównując języki programowania pisałem sobie programiki do wyświetlania planu lekcji.

Bawiąc się teraz Machine Learning'iem używam szukania clickbaitów jako problemu, który atakuję różnymi sposobami.

Użyłem już naiwnego klasyfikatora Bayesa, ostatnio zaś spróbowałem użyć logistic regression.

Bayes dawał sobie radę z rozpoznaniem 94% clickbaitów ze zbioru uczącego i 97.4% poprawnych artykułów.

Logistic regression daje sobie radę lepiej ;-) bo ma wykrywalność równą 100% dla obu przypadków ;-)
Jest jednak możliwe, że cierpi na overfitt.

We wszystkim wykorzystałem kod, który napisałem w ramach zabaw z kursem z Machine Learningu na Coursera.
Kod ten działa w GNU Octave, czyli klonie MathLab'a.

Jest różnica ;-)

Policzenie czy dany artykuł jest clickbaitem czy nie w Octave to:

sigmoid(xi*Theta)

a w JavaScript'cie:

function classify(vec2Classify) {
  var sum = theta[0];
  for (var i=0; i<vec2Classify.length; i++) {
    sum+=vec2Classify[i]*theta[i+1];
  }
  return sigmoid(sum);
}

Oba te fragmenty kodu zwrócą liczbę, która w razie jest większa niż 0.5 znaczy, że rozpoznano wejście jako clickbaita.

Nauka klasyfikatora odbywała się w Octave, ale że Octave działa tylko na wektorach/macierzach/skalarach to musiałem popełnić kawałek dla NodeJS, który przekonwertował zbiór uczący w macierz i zapisał ją w formacie zrozumiałym dla Octave (dość powiedzieć, że to było ponad 64 miliony liczb 0 i 1 ;-)).
Później zaś musiałem przekonwertować wynik z Octave do JavaScripta (tablica z 10330 liczb zmiennoprzecinkowych).

Jak dobrze pójdzie za jakiś czas zrobię wersję, która będzie działa w oparciu o sieci neuronowe ;-)

Źródła rozszerzenia do Chrome, które rozpoznaje clickbaity (w wersji z Bayesem i z Logistic Regression) jak zwykle na moim GitHub'ie :-)


Podobne postybeta
ClickbaitDetector - to działa :-)
Clickbait detector ;-) - czyli próbujemy użyć naiwnego klasyfikatora Bayesowskiego do rozpoznawania clickbaitów ;-)
Naiwny klasyfikator bayesowski nie jest jednak dobry do rozpoznawania clickbaitów ;-)
Dwie książki komputerowe na długi weekend :-)
Raspberry Pi to nie jest demon prędkości ;-)

poniedziałek, stycznia 23, 2017

Skasuj konto w Facebooku - oni zdecydowanie za dużo o Tobie wiedzą.

Słowem wstępu, idź pod ten link https://applymagicsauce.com/.
I sprawdź ile wie o Tobie Facebook.

Później przeczytaj to, albo to.

To co wie o nas Google to przy tym co wie FB i ludzie, którzy mają dostęp do Twoich like'ów na FB to pikuś.

Mogą wpływać na Twoje decyzje wyborcze.
Mogą Cię zachęcić, albo zniechęcić do głosowania.
Mogą Ci podrzucać argumenty za i przeciw, które są najbardziej skuteczne dla osoby takiej jak Ty.

To, że Ci wcisną jakiś towar to pikuś, to nic nie znacząca sprawa, mogą Ci wcisnąć Prezydenta, albo parlament.

Dlatego pomyśl, czy aby nie skasować konta na Facebooku....

A jak nie jesteś na to gotowa lub gotowy, to może chociaż przestań używać Like i reakcji.


Podobne postybeta
Aż strach Like'ować ;-)
Deklaratywnie czy imperatywnie... oto jest pytanie ;-)
Dziwne linki w iGoogle ;-)
No i wzięło i dupło.....
EEE Storage - czyżby nie dla wszystkich?

niedziela, stycznia 22, 2017

Kontrrewolucja?

A może ten cały zryw prawicy i ksenofobii to wcale nie rewolucja i wynik zmiany postrzegania świata przez "zwykłych" ludzi, a właśnie kontrrewolucja? Paniczny atak "starego" by coś utrzymać?

W USA Donald Trump wygrał dzięki electoral college, przegrał w popular vote, do tego głosowało na niego dużo osób starszych i biednych białych jak na nadzieję przywrócenia "starego porządku".
W UK Brexit poparli głównie ludzie starsi, którzy tęsknią za "białą" Wielką Brytanią oraz ci którzy uwierzyli zapewnieniom brexiterów mówiących, że można mieć ciastko i zjeść ciastko.

Trump, Brexit czy PiS w Polsce wygrały dzięki zagospodarowaniu głosów ludzi, którzy nie nadążyli za zmianami.
Ale, ponieważ ci ludzie to ludzie starsi, którzy tęsknią za dawnymi czasami, albo ludzie którzy są "poszkodowani" przez doganianie ich przez innych to może znaczyć, że wcale ich nie będzie przybywać.

No i nawet jeśliby ich przybyło to czy ci, którzy ich zagospodarowali potrafią rozwiązać problemy, które tych ludzi dotykają. Czy raczej będą robili pokazówki i wprowadzali "stare rozwiązania"?
A jeśli to drugie to pytanie ilu z tych którzy ich poparli będzie dalej ich popierać?

Średnia życia nadal rośnie, przestępczość spada, nawet tolerancja rośnie.
Mimo tego, że w Polsce czy UK pojawia się wiele "przestępstw nienawiści" w postaci napadów na osoby o innym kolorze skóry to jednak nie koniecznie musi to być wzrost bezwzględny. W końcu tak w Polsce jak i UK nadal rośnie liczba imigrantów/obcokrajowców i może rosnąć szybciej niż wzrost liczby przestępstw.

To wszystko to takie sobie spojrzenie na sytuację z drugiej strony. Może być błędne, ale wydaje mi się, że postęp nadal jest wielki i chyba większy niż opór przeciwko niemu.


Podobne postybeta
Wybory w USA a fake news - IMHO nie ma związku
Zawiść
Prawicowa logika ;-)
Dobrze, że Tusk wygrał
Rycerz na białym koniu? ;-)

sobota, stycznia 21, 2017

Nie inicjalizuj rozmiaru kolekcji...

Jednym z code smellsów na które zawsze źle reaguję jest deklarowanie rozmiaru kolekcji takiej jak lista czy mapa w trakcie tworzenia obiektu...

Czemu?

Bo wkład na wydajność takich zmian jest mniej niż nikły, a zaciemnia kod.

Spójrzmy na sytuację z ArrayLista'ą.

Teoretycznie sama praca z ArrayList powinno wykonać do 4 razy szybciej w momencie gdy zadeklarujemy capacity ArrayList.
W najgorszym przypadku przy rozszerzaniu listy (startujemy od 10 elementów i za każdym razem rośniemy do 1.5 rozmiaru) możemy mieć srednio do 4 operacje zapisu na każdy element.
Przy ustawieniu capacity tych operacji powinno być dokładnie 1 na element.

W rzeczywistości okazuje się, że i tak więcej czasu spędzimy na przygotowywaniu elementów, które włożymy do listy i na operacjach w samej liście.
Gdy testowałem wkładanie kolejnych liczb różnica wynosiła około 25% na korzyść listy ze znanym capacity.

Nadal można twierdzić, że to jakiś zysk, jednak jeśli spojrzymy na kod to zwykle okazuje się, że taka operacja na liście jest tylko przygrywką do jakichś bardziej skomplikowanych operacji, a sama metoda nie jest wykorzystywana non-stop.
Przez co nikły zysk i tak maleje.

Z mapami jest jeszcze gorzej.

Po pierwsze w razie tworzenia HashMap z podaniem jej capacity rzadko kto podaje ułamek używany do wyliczenia progu po którym następuje zwiększenie liczby kubełków.
Przez to przy domyślnym ułamku wynoszącym 0.75 i tak mamy gwarantowane 1 rozszerzenie HashMap, co sprawia, że mamy przeciętnie 1.75 zapisu na element.

W przypadku tworzenia HashMap bez capacity zaczynamy od 16 kubełków, a po przekroczeniu thresholdu (czyli 12 elementów) zwiększamy rozmiar o 2 razy i tak dalej.

Teoretycznie liczba zapisów na 1 element w takim przypadku waha się od 2 do 3 na element, średnio to jakieś 2.4-2.5 zapisu na element.

I znów zwykle stworzenie klucza może trwać więcej niż te kilkukrotne zapisy.

Moje testy gdy kluczem są kolejne Integer'y pokazują, że w przypadku HashMap'y stworzonej bez capacity w wkładaniu elementów potrzebna góra 5% więcej czasu.

Tutaj czasem ktoś może się bronić, że jednak za każdym razem w momencie rozszerzania trzeba liczyć hashCode, a to jest dość czasochłonna operacja... co jest prawdą przy źle zaimplementowanych metodach hashCode, szybkie zajrzenie do JDK wskazuje, że dobrym zwyczajem w przypadku kosztownych hashCode'ów jest liczenie hashCode tylko raz, a później używanie zakitranej wartości.
Zresztą w przypadku elementów trzymanych w HashMap i tak musimy mieć niezmienny hashCode...

Czyli znów teoretycznie powinno być tak na oko 2 razy szybciej, a zwykle jest tylko o parę procent szybciej.

Które to parę procent rozpłynie się w reszcie operacji, które wykonujemy w okolicach prac z mapą.

Można w tym momencie bronić użycia rozmiarów jako czegoś co nie szkodzi, a może pomóc.
Niby tak, ale jednak gdy czytamy kod chwilę trzeba spędzić nad zastanowieniem się co to za wartość jest przekazywana do konstruktora i po co, oraz sprawdzić czy np. nie będzie ujemna, albo null'em.
Dodatkowo może się zdarzyć, że ta liczba rzeczywiście będzie ujemna i może pojawić się ciekawa klasa problemów ;-)

Stąd lepiej unikać przekazywania rozmiaru kolekcji i robić to tylko wtedy gdy mamy za sobą już inne optymalizacje i da nam to coś więcej niż zaciemnienie kodu.


Podobne postybeta
Java 32 bit vs. Java 64 bit
Pythonowe formatowanie kodu ma jednak swoje zalety ;-)
Algorytm ;-)
Lecę do Stanów... i co z tego? ;-)
Transhumanizm [długo i nudno ;-)]

środa, stycznia 18, 2017

Strategiczny wybór miejsca w tramwaju - poradnik ;-)

Wszystko przy założeniu, że możemy wybrać dowolne miejsce na początku (poza miejscem motorniczego ;-)).
Czyli wsiadamy do prawie pustego tramwaju na pętli.

Rozpoczynamy od identyfikacji "złych" miejsc.

Złe miejsca to takie gdzie łatwo dopadnie nas starsza osoba, której trzeba będzie ustąpić i takie gdzie będzie obok duży tłok, do tego takie gdzie będzie przeciąg.

Odpadają wszystkie miejsca blisko wejść, szczególnie te na przeciwko wejścia i przed/za wejściem.
Ogólnie zasada jest taka, że im bliżej wejścia tym gorzej.
Później eliminujemy wszystkie miejsca gdzie są kasowniki, najlepiej nie mieć kasownika ani obok siebie, ani za/przed sobą.
Odrzucamy też wszystkie miejsca oznaczone jako miejsca z pierwszeństwem zajmowania przez jakieś grupy.
Odrzucamy wszystkie gdzie ktoś będzie koło nas siedział*, a jak się nie da to te gdzie ludzie będą chętnie siadali.

Teraz z tego co zostało wybieramy miejsca, które są blisko jakichś łatwo dostępnych miejsc, które nie są zbyt atrakcyjne, a to np. niedaleko "kanapy" (w niektórych tramwajach są takie siedzenia "w bok"), albo takie, które są skierowane tyłem do kierunku jazdy, lub gdy 2 siedzenia są naprzeciwko siebie**.

Dzięki temu małemu intelektualnemu wysiłkowi na początku jazdy mamy do naszego końcowego przystanku praktycznie pewną wygodną jazdę ;-)


* - nie kładziemy plecaka czy innej torby na siedzeniu od strony okna i nie siadamy na miejscu "od korytarza", chcemy mieć dobre miejsce, a nie być draniem w stosunku do innych jadących.
** - ludzie są stadni, ale nie lubią obcych, więc miejsca gdzie kilka obcych osób będzie musiało koło siebie siedzieć są zawsze mniej atrakcyjne dla ludzi i mniej chętnie tam siadają, przez co nawet w zatłoczonym tramwaju są często wolne... a jak są w koło nas wolne miejsca to nie musimy oddawać naszego :-)


Podobne postybeta
Chrome, Firefox, IE9 preview i cieniowanie Gouraud'em w JavaScript
Pogoda emigracyjna ;-)
Lubię tramwaje :-)
Ingress i moje portale... ;-)
Historia czy Histeria? ;-)

wtorek, stycznia 17, 2017

"Fizyczny" projekt, jak zacząć?

Łazi za mną zrobienie czegoś "fizycznego".
Wszystkie moje projekty są software'owe, sam kod, zero elektrycznych kawałków.

Stąd chodzi za mną pomysł zbudowania w oparciu o Raspberry Pi i 2 czujniki ultradźwiękowe czegoś co monitorowałoby stan mojego biurka i to czy przy nim stoję ;-)
Mógłbym wtedy mierzyć jak często korzystam z biurka na stojąco, a jak często na siedząco.

Jeden czujnik "patrzałby" w kierunku podłogi i można by na nim odczytać wysokość biurka, drugi spoglądałby w kierunku przodu biurka i sprawdzał czy w miejscu gdzie zwykle przebywam coś jest.

Bawiłem się takim przetwornikiem w robocie i widzę, że można z niego w końcu odczytać odległość od obiektu w cm.

Jedyne czego się obawiam to trwałość czegoś takiego, ale mogę sobie wyobrazić umieszczenie tego w jakimś pudełku i przyklejeniu tego pudełka do spodu biurka.

Ktoś ma jakieś rady? ;-)


Podobne postybeta
Praca na stojąco - wersja pro ;-)
Papier nad e-booki :-)
Smok...
Mysaifu JVM - czytamy sobie kod :-) [i klniemy na C++]
Kalkulator marzeń ;-)

niedziela, stycznia 15, 2017

Wtyczka na pamięć ;-)

Pamięć mam dość dobrą, ale zapominam wiele rzeczy, które mają labelkę "pierdoła".

Dużo rzeczy ma taką labelkę.
Praktycznie wszystkie, które nie siedzą non-stop w mojej głowie.

Są rzeczy, które można załatwić kartką, ale nie wszędzie się da.
Trudno przykleić kartkę do strony WWW.

Przez to trudno mi zmienić nawyki, albo pamiętać, że jak będę coś np. kupował na Amazonie UK to nie mam się godzić na zmianę kwoty na PLN i trzymać się GBP (bo konwersja GBP->Euro->PLN na mojej karcie i tak ma lepszy exchange rate niż ten, który proponuje Amazon UK ;-)).
Albo, że jak wchodzę na jakąś stronę to mam coś tam zrobić.

Przydałaby się możliwość przyklejenia karteczki...

Ale przecież takie rzeczy jak wizyty na stronach WWW odbywają się na komputerze.... a komputer może robić rzeczy, które mu się każe...

To od paru dni chodził za mną pomysł kazania komputerowi by pozwolił mi dodawać komentarze/notatki do stron.

Dziś to zakodziłem, nie jest to coś szczególnie ładnego:

Ale działa ;-)

Gdy wchodzimy na stronę i do tej strony (URLa) albo domeny jest jakiś komentarz to ikonka pokazuje nam na czerwono ile jest komentarzy.
Gdy klikniemy w ikonkę to możemy istniejące komentarze zobaczyć i w razie potrzeby dodać nowy.

Wszystko jest dostępne w wersji źródłowej na moim GitHub'ie.

Na razie całe trzymanie notatek/komentarzy odbywa się w localStorage, ale to jest taki proof of concept.


Podobne postybeta
Projekty ;-)
Nienawiść
Chrome2ChromeV2 na GitHub :-)
ToDo od Trello jako "oddzielna aplikacja"
Światełko w tunelu :-)

Bez cukierków i Coli

Tak mnie jakiś czas temu naszło pytanie, jak długo wytrzymam bez cukierków i Coli.

Na początku miał być tydzień żeby sprawdzić czy dam radę, teraz leci już 3 i jak na razie nie jest źle.

Potrzebny był tylko sposób na to żebym o tym nie zapomniał.
Żeby nie było tak, że koduję w nocy i nagle mam ochotę na coś słodkiego i idę do lodówki.

Stąd pojawiło się w mojej lodówce to:


Jako przypominajka.

Na razie działa.

Chociaż wieczorem czasem mam nieodpartą ochotę by jednak zjeść ciasteczko, albo napić się Coli ;-)
Wtedy rozważam to i jak nie umiem zwalczyć chęci sięgnięcia po słodycza to piję kakao. Chociaż nie oszczędzam, na szklankę idzie 6 łyżeczek Kubusia ;-)

Okazuje się, że to ma też ciekawy efekt. Waga mi się zmieniła o jakieś 5% w dół ;-)

A, że nie piję Coli to zdecydowanie rzadziej mnie brzuch boli ;-)

Gdy nawet kakao nie pomaga to obiecuję sobie, że jak będę miał nadal ochotę na ciasteczko i czy innego słodycza to w weekend będę mógł zjeść.
Ale jak na razie nie złamałem się ani razu ;-)


Podobne postybeta
Co to jest to ciasteczko, czyli czemu web cookies nie są złe ;-)
Złudne poczucie bezpieczeństwa...
Czemu od 30 godzin nie piję Coli - Eksperyment ;-)
Mgła
Złe i dobre cosie....

czwartek, stycznia 12, 2017

Jest coraz gorzej i będzie jeszcze gorzej  Wasza nadzieja - ona znikąd pochodzi 

To mógłby być cytat do tego co się dzieje w politycznym świecie w Polsce i na świecie, ale nie, tym razem chodzi o zakupy w Internecie ;-)

Jest np taki sklep z nazwą europejskiej waluty w nazwie, który ma też sprzedaż online.
Praktycznie za każdym razem gdy u nich coś kupowałem przez internet to coś było nieteges.

Wczoraj zamówiłem coś na dziś... Koło 12 dostałem radosne info, że pragną mnie poinformować, że przesyłka będzie jutro...
A skasowali ekstra kasę za dostawę na dziś.

Ale zostawmy ten sklep i spójrzmy na inne przypadki.

Kupujemy coś i gdy mieszkamy gdzieś poza dużym miastem to mamy przewalone.
Kurier często w ogóle nie pojedzie i zgłosi, że nie było odbiorcy...
Albo przywiezie 3 dni później jak mu się uzbiera parę paczek w daną okolicę.

Jeszcze lepiej jak nas nie zastanie i zostawi paczkę.
Jak u sąsiada to tyle super, ale gorzej jak na wycieraczce.

Albo w "punkcie odbioru". Co jest szczególnie zabawne gdy rzecz jest w cholerę ciężka.

A zakupy spożywcze do domu?
Super, cool i w ogóle czadzior, ale takie Tesco prawie zawsze przywiezie zamienniki.
Powinni swoją usługę zamiast ezakupami nazywać loterią spożywczą.
Wrzucasz los i coś Ci przywiozą... Albo nie, bo komuś się godziny pomylą.

Każda z tych rzeczy wynika z cięcia kosztów.
Kurierzy optymalizują dostawy bo często są to prywatne osoby, które dostają po parę PLN za transport i gdyby zawsze jechali do każdego odbiorcy to by zbankrutowali.
Obsługa sklepu idzie po linii najmniejszego oporu bo nie oceniają ich na podstawie uwagi poświęconej zamówieniu, ale na podstawie ilość zamówień.

A, że klienci chcą coraz taniej, a konkurencja rośnie to będą te koszty jeszcze bardziej cięte...
I tym optymistycznym akcentem kończę ;-)

posted from Bloggeroid




Podobne postybeta
Marudzenie nocne ;-)
Błeee
Gdy Kindle choruje...
Eyjafjallajökull w kodowaniu, czyli rozplątujemy kilometry sznurka ;-)
Wszyscy jesteśmy małpami

wtorek, stycznia 10, 2017

Im gęściej dobrych programistów, tym gęściej Linuksa

Czego by nie mówić moją poprzednią i obecną pracę łączy to, że zatrudniają obie przeciętnie lepszych programistów niż to było w poprzedniej-poprzedniej firmie.
Chodzi o przeciętną, tam też byli wybitni, ale byli też przeciętni.

I zauważyłem, że jakoś w firmach z lepszymi programistami jakoś łatwiej znaleźć ludzi, którzy w domu używają Linuksa.

Nie jest tak, że jak używa Linuksa to lepszy, a jak używa Windows to słabszy, ale jakoś wśród lepszych większa liczba tego Linuksa używa niż wśród tych przeciętnych.

To samo dotyczy OS X (czy teraz macOs).

Ot, takie spostrzeżenie...

posted from Bloggeroid




Podobne postybeta
Duży telewizor w telefonie to jest to!
Pokusa, problem, zaskoczenie i spostrzeżenie ;-)
Programiści są nieważni...
Dziwne wykorzystanie twierdzenia Bayesa :-)
Cieszę się, że autorzy których czytują są lepszymi psiarzami niż ja czytelnikiem :-)

poniedziałek, stycznia 09, 2017

Linia poleceń rządzi!

W weekendy mój komputer zwykle nie śpi, jest włączany po pracy w ostatni dzień pracy w tygodniu i działa do późnej nocy przed dniem pracy*.

Dziś było tak samo.
Gdy w końcu kazałem Ubuntu się wyłączyć to jakoś nie chciał się pokazać dialog z pytaniem czy wyłączyć czy zrobić reboot.
Spróbowałem jeszcze raz z tym samym rezultatem..
Wtedy zrobiłem ctrl-alt-t, czyli otwarłem terminal i wpisałem po prostu:
sudo shutdown -h now
Wpisałem hasło i komputer od razu poszedł spać :-)

* - tu widoczny jest problem definicji jutra, jutro wg definicji, którą wyrobiłem sobie jeszcze w LO, albo na studiach brzmi "jutro to wtedy kiedy się budzę i zaczyna się kolejny okres mojej aktywności"... Zresztą nie ja jeden mam taką definicję ;-)

posted from Bloggeroid




Podobne postybeta
Działamy
Logika w rozwiązywaniu problemów NP-zupełnych.
Zwłoki na plakatach... brrr...
N niefartów ;-)
Hack Day i zapomniana buła

niedziela, stycznia 08, 2017

Przeprowadzka - "optymalizator" posiadania

Jeśli się przeprowadzaliście, to pewnie zauważyliście, że wtedy o wiele łatwiej wyrzuca się pewne rzeczy.

Przez lata coś leży nieużywane i ma taką mentalną naklejkę "może się kiedyś przydać".
Aż przychodzi przeprowadzka i jako pierwsze ląduje na śmietniku.

Dotyczy to szczególnie rzeczy dużych, delikatnych i o nietypowym kształcie, a potęguje się przy odległości/koszcie transportu.

Nagle włącza nam się racjonalna część umysłu i jak trzeba rozważyć jak drania przewieźć nagle się okazuje, że prościej wyrzucić.

Zwykle trzymamy rzecz "bo się kiedyś przyda" dlatego, że jej wartość jest trudna do oszacowania. Kiedyś włożyliśmy jakiś wysiłek w jej zdobycie i potrafimy ją tak naprawdę wycenić dopiero wtedy gdy musimy porównać tą wartość z kosztem przewiezienia.

Stąd pytanie, może warto się co jakiś czas przeprowadzić tylko po to żeby nie trzymać zbędnych rzeczy? ;-)


Podobne postybeta
Wyrzuć 1 rzecz dziennie
Największy przekręt w Polsce?
Ile wart jest Księżyc? ;-)
50:50... czyli geolokalizacja działa, ale tak sobie ;-)
Carpooling

piątek, stycznia 06, 2017

IT - Jaka kasa w zależności od skilla? ;-)

W branży IT pieniądze nie powinny być głównym motorem działania, ale czasem są.

Wiele osób zadaje sobie jednak pytanie czy ich zarobki są wyższe, niższe czy też takie jak przeciętna.

Ogólna zasada jest taka, że im ktoś jest lepszy tym większą ma szansę na lepsze pieniądze (w IT wszystkie pensje są dobre w porównaniu do przeciętnej, stąd celowo nie napisałem "dobre pieniądze").

Do tego dochodzi to, że zwykle korporacje płacą lepiej, w tym zagraniczne najlepiej.

Zwykle też w dużych miastach, a szczególnie Warszawie pensje są najwyższe.
Głównie przez to, że tam siedzą duże zagraniczne korporacje ;-)

Tutaj uproszczony flowchart pozwalający ustalić na podstawie posiadanego skilla to jakie pieniądze można dostać ;-)

Kwoty są na podstawie tego co słyszałem od ludzi, mogą być więc niektóre kwoty podniesione inne obniżone.
To są szacunki średnich miesięcznych wpływów brutto jak ktoś pracuje na umowę o pracę.

Jakieś komentarze?
Zawyżyłem?
Zaniżyłem?


Podobne postybeta
Wyrzuć 1 rzecz dziennie
Inwestycja w przyszłość
Studia wyższe
Ciekawe czy ktoś zajmuje się "testowaniem" czy może "próbkowaniem" rynku nieruchomości? :-)
Człowiek to dziwne zwierze....

czwartek, stycznia 05, 2017

Paragon - zostawić czy wyrzucić?

Wiele osób traktuje paragony, te które mogą być podstawą reklamacji, jak coś świętego.
Nie wyrzucają, trzymają i chronią jak oka w głowie.
Niektórzy skanują, inni trzymają w wersji papierowej.
Są też tacy, którzy wyrzucają i nie zwracają na nie uwagi.

Sam jestem po środku.
Trzymam paragony do rzeczy, w przypadku których biorę pod uwagę użycie ich w razie reklamacji.

Bądźmy szczerzy, nie wszystko warto reklamować.
Kupiłem ostatnio zasilacz do laptopa, kosztował jakieś 50 PLN, jeśli się popsuje bardziej prawdopodobne jest, że po prostu kupię nowy niż to, że będę reklamował. Jeśli popsuje się w ciągu roku to po prostu zapamiętam by nie kupować produktów tej firmy.

Okazuje się też, że wiele sklepów idzie na rękę klientom i w razie potrzeby jest w stanie wydać kopię paragonu gdy płaciło się kartą.
Tak zrobiło Ecco gdy popsuł mi się but i 4F.
Chociaż sam nie miałem tu zamiaru samemu reklamować, ktoś za mnie robotę odwalił.
Samemu by mi się nie chciało.

Inna sprawa jak chodzi o coś co trudno po prostu kupić drugi raz. Wtedy paragon zachowuje i walczę jak lew... Chociaż nie miałem okazji sprawdzić bo z droższych rzeczy na razie nic mi się nie popsuło.
Ale zrobiony niezgodnie z normami kontakt w łazience reklamowałem i naprawili ;-)

Ktoś ma podobne podejście do paragonów?
posted from Bloggeroid



Podobne postybeta
"i ma Office'a...."
Nie kłóć się z użytkownikiem! ;-)
A takie tam ;-)
"Dziennikarze"
Zlikwidowali mi tramwaj :-(

wtorek, stycznia 03, 2017

Wybór laptopa jest trudny....

Od dłuższego czasu chcę sobie kupić laptopa "do pociągu" tudzież "na kanapę".
Takiego, który będzie miał odpowiednio dużo mocy, ale będzie wygodny w noszeniu.

Specjalnie czekałem na nowe Macbooki Pro, ale to co pokazało Apple okazuje się być zaprzeczeniem tego czego szukam.
Szybsze dyski SSD mi pasują, ale to, że nie ma modelu z 32 GB RAM i psucie klawiatury przez touch bar* to dla mnie showstopery.

No to mój łakomy wzrok pada też na Dell XPS13/15, które są sprzedawane z Ubuntu...
Ale niestety te XPSy z Ubuntu, które są dostępne w Polsce mają tylko 8 GB RAM....
A Windows 10 nie chcę i nie wiem czy chcę się bawić z instalowaniem Ubuntu na XPSie, który przyjdzie z Windows 10.

I teraz się waham między nowym MBP13 bez touch bara, starym MBP13 i starym MBP15, albo XPSami....
Wiem, że chcę 16 GB RAM (chciałbym więcej, ale się nie da ;-)), i7 i 512 GB SSD, MacOS albo Ubuntu.

Łatwo wybrać nie jest ;-)


* - bawiłem się touch barem w MBP13 w sklepie i to jedna nie dla mnie, jednak chciałbym móc robić debuga przy użyciu klawiatury i skrótów jak najbardziej podobnych do PC.


Podobne postybeta
Złośliwe pytania
Wolne komputery nie pozwalają się skupić....
Gningerbread 2.3.3 - duży postęp :-)
Macbook PRO Retina i OS X po 2* tygodniach
OS X po tygodniu - tak sobie

niedziela, stycznia 01, 2017

Drugi klasyfikator jako "sanity check"

Zapewne już na to ktoś wpadł lata temu ;-)
Ja wpadłem na to niedawno ;-)

Chodzi o to by zamiast 1 klasyfikatora (czy też bandy klasyfikatorów, które polują na różne klasy obiektów) użyć jeszcze dodatkowego klasyfikatora, który stwierdza tylko czy rzecz która ma być sklasyfikowana należy w ogóle do ogólnej "nadklasy" klasyfikowanych obiektów.

Wyobraźmy sobie klasyfikator, który dostaje zdjęcie słonia i określa czy to samiec czy samica.
Ma blisko 100% skuteczność.
I dajemy mu zdjęcie nosorożca.

Jest duża szansa, że rozpozna go jako należącego do którejś ze znanych klas.

Ale jakby przed tym odpalił się klasyfikator, który sprawdzi czy nosorożec w ogóle należy do klasy słoni?

Aż sobie tego użyję w clickbait detectorze ;p

[nie śmiać się, że to jest od dawna znane, ważne że mi samo przyszło do głowy ;-)]


Podobne postybeta
Konstruktory
Naiwny klasyfikator bayesowski nie jest jednak dobry do rozpoznawania clickbaitów ;-)
Planning poker w komórce ;-)
Notka miraż
ClickbaitDetector - to działa :-)