niedziela, stycznia 25, 2015

niedziela, stycznia 18, 2015

Monitorujemy cenę IntelliJ'a ;-)

Używam w pracy IntelliJ, którego darzę silnym uczuciem.
Tak silnym, że w domu też używam IntelliJ'a, ale w wersji Community, która nie jest aż tak fajna jak wersja pełna.

Chciałbym kupić licencję IntelliJ'a, ale z racji wydatków mieszkaniowych obecne 207 euro wydaje się być chwilowo trochę zbyt duże...

Dlatego poluję na promocję, a do polowania na promocję (jeśli się zdarzy) dobrze użyć automatu ;-)

Tutaj takowy w node.js:

var http = require("https");
var nodemailer = require("nodemailer");
var fs = require("fs");

var TO_EMAIL = <your recipent address>;
var FROM_EMAIL = <your sender address>;
var PASS = <your server password>;

var url = "https://www.jetbrains.com/idea/buy/";

function sendEmailWithPrice(newPrice, oldPrice) {
console.log("Sending e-mail about new price "+newPrice);
if (oldPrice) console.log(oldPrice);
var transport = nodemailer.createTransport({
service : "Gmail",
auth : {
user : FROM_EMAIL,
pass : PASS
}
});
var mailOptions = {
from : FROM_EMAIL,
to : TO_EMAIL,
subject : "New price for IntelliJ "+newPrice,
text : "New price for IntelliJ is "+newPrice+(oldPrice?"\nOld price was "+oldPrice:"")
}
console.log(mailOptions);
transport.sendMail(mailOptions);
}

function gotPrice(price) {
var lastPrice;
try {
lastPrice = fs.readFileSync("price.dat");
} catch (e) {
console.log(e);
}
if (price!=lastPrice) {
console.log("Will send e-mail");
sendEmailWithPrice(price, lastPrice);
fs.writeFileSync("price.dat", ""+price);
}
}

http.get(url, function(response) {
var body = "";
response.on("data", function(chunk) {
body+=chunk;
});
response.on("end", function() {
var re = /\<script type=\"text\/javascript\"\>([^<]*)\<\/script\>/g; var tramsStops = [];
while ( res=re.exec(body) ) {
var str = res[1].trim();
if (str.indexOf("var links_json")!=-1) {
str = str.substring(str.indexOf("{"))
str = str.substring(0, str.indexOf("};")+1);
var obj = JSON.parse(str);
var personal = obj.PERSONAL.purchase;
for (var p in personal) {
var price = personal[p].new.regular.price;
console.log(price);
gotPrice(price);
break;
}
break;
}
}
});
}).on('error', function(e) {
console.log("Got error: " + e.message);
});

Biega sobie teraz na moim Raspberry Pi i obserwuje serwer... pewnie szybciej w nim jakiś błąd poleci (bo ich w ogóle nie obsługuję ;-)) niż cena spadnie, ale zawsze można mieć nadzieję ;-)



Podobne postybeta
"Kodowanie" na Chrome OS ;-)
Umiejętność programowania pomaga :-)
Pomnóżmy sobie duże liczby ;-)
Robimy krzywdę GWT ;-) czyli przekazujemy wartość z serwera do klienta, bez RPC ;-)
Kilka rzeczy, które chciałbym zobaczyć w produktach Google...

poniedziałek, stycznia 12, 2015

Polymeryzacja AngularJS ;-)

Polymer mi się bardziej podoba od AngularJS, ale w ramach zabawy spróbowałem dziś w jakiś sposób zasymulować data-binding Polymerowy między custom-elementami w AngularJS.

Ten z AngularJS jest niezły, ale nie działa do końca tak jak bym chciał.
Tzn. sam data-binding działa tak jak bym chciał, ale już w samych dyrektywach AngularJS informacje o zmianie wartości atrybutów nie są propagowane same z siebie, trzeba się na nie zarejestrować.

A chciałbym mieć w kodzie strony:

<geo-emiter lat="lat" lon="lon"></geo-emiter>
<today-temperature lat="lat" lon="lon"></today-temperature>


gdzie geo-emiter powinno wyemitować geolokalizację, a today-temperature powinno na tej podstawie wyświetlić temperaturę.

W Polymerze to by było proste, w AngularJS na razie udało mi się doprowadzić do czegoś takiego:

app.directive("geoEmiter",["geolocation", "$log", function(geolocation, $log) {
return {
scope: {
lat: "=",
lon: "="
},
controller: function($scope) {
geolocation.getLocation().then(function(data) {
var coords = {lat:data.coords.latitude, lon:data.coords.longitude};
$scope.lat = coords.lat;
$scope.lon = coords.lon;
});
}
}
}]);

app.directive("todayTemperature", ["geolocation", "$http", "$log", "$interval", function(geolocation, $http, $log, $interval) {
return {
restrict: "E",
template: "<h1>{{temperature}}</h1><h4>{{minTemp}}/{{maxTemp}}</h4>",
scope: {
lat: "=",
lon: "="
},
controller: function($scope) {
$scope.$watch(function() { return $scope.lat}, function(val) {
if (!val) return;
$scope.temperature = "";
var url = "http://api.openweathermap.org/data/2.5/weather?lat="+$scope.lat+"&lon="+$scope.lon;
$log.log(url);
var convert = function(x) {
return Math.round((x-273.15)*10)/10.0;
}
$http.get(url).success(function(data) {
$log.log(data);
$scope.temperature = convert(data.main.temp);
$scope.minTemp = convert(data.main.temp_min);
$scope.maxTemp = convert(data.main.temp_max);
});
});
}
}
}]);


Ten $watch jest trochę ohydny, bo tutaj to co dostajemy w Polymerze od strzału, tutaj trzeba udawać.

Pierwsza dyrektywa geo-emiter po prostu w momencie gdy otrzyma od geolocation lokalizację to emituje ją na zewnątrz, w today-temperature musi być $watch, który "słucha" czy aby wartość w lat się nie zmieniła, jeśli się zmieniła to odpala cały kod do pobrania pogody z OpenWeatherMap :-) [dzięki wspaniałemu nagłówkowi Access-Control-Allow-Origin:* można sobie pogadać z tymi serwerami z dowolnej strony z AJAXem :-)].


Podobne postybeta
Data binding w Polymerze jest oszukany ;-)
Najkrótsza droga do przyszłości - Polymer ;-)
Bayesian Inference Tool jako Chrome App ;-)
Magia CallBacka w JavaScript :-) - czyli jak przekazać dodatkowy parametr
Jak "okradłem" Google Readera ;-)

sobota, stycznia 10, 2015

Czy jest dziś sobota? ;-)

Sobie narzędzie napisałem do wnioskowania Bayesowskiego ;-) [mam hobby ostatnio jak widać ;-)]

Przetestujmy więc nim hipotezę, że dziś jest sobota ;-)

Na początku podajemy ile hipotez będziemy rozważać:

Później podajemy te hipotezy:

Następnie zaczynamy podawać dowody i ich prawdopodobieństwo w razie prawdziwości hipotezy:


Rezultaty odczytujemy u dołu ekranu ;-)

Jak ktoś się chce pobawić moim genialnym narzędziem to znajdzie je tutaj, a jego źródła można sobie obejrzeć na moim GitHubie.

Jak widać na podstawie tych dwóch dowodów, czyli tego, że nie byłem dziś w pracy i że długo spałem można wnosić, że na ~82% jest dziś sobota ;-)


Podobne postybeta
Bayesian Inference Tool jako Chrome App ;-)
Teoria ewolucji vs hipoteza kosmicznych siewców życia vs hipoteza kreatora vs hipoteza kreatora na młodej Ziemi - mecz przy pomocy Bayesa :-)
Smile Challenge ;-) - takie tam MVP
Sobota
Pogoń za sensacją to jednak przeginka....

wtorek, stycznia 06, 2015

Teoria ewolucji vs hipoteza kosmicznych siewców życia vs hipoteza kreatora vs hipoteza kreatora na młodej Ziemi - mecz przy pomocy Bayesa :-)

Ostatnio pod filmikiem WC odbyła się dyskusja o ewolucji.
Podejrzanie wiele osób uważa ewolucję za nieprawdziwą, chociaż jedynie kreacjoniści podają jakąś alternatywną "teorię".

Mam swoje poglądy (znaczy jestem ewolucjonistą :-)), ale spróbujmy spojrzeć na pewne obserwacje dotyczące istniejącego świata i spróbujmy użyć twierdzenia Bayesa (a jakże ;-)) do sprawdzenia kilku teorii.

Teorie te to:
- ewolucja (życie pochodzi od jednego praprzodka)
- kosmici jako "siewcy życia"
- kreator (który stworzył życie u początków życia na Ziemi)
- kreator "młodej Ziemi" (kreator jakieś 6 tysięcy lat temu stworzył Ziemię i wszystkie życie tutaj)

Rozpatrzymy 4 różnych obserwacji:
- wspólny kod genetyczny u różnych organizmów
- podobieństwo genetyczne
- materiał kopalny w którym znajdowane skamieliny są bardziej skomplikowane im młodsze osady
- istnienie "nieredukowalnych" organów, czyli takich które gdyby z nich wyjąć choć 1 część, czy choć 1 gen je kodujący to by po prostu przestały działać (nie działałyby gorzej, po prostu przestałyby działać)

Jak mówiłem użyjemy twierdzenia Bayesa i będziemy dla każdej z hipotez starali się ocenić jak prawdopodobna jest dana obserwacja jeśli dana hipoteza jest prawdziwa.

Na początek przyjmijmy, że każda z tych hipotez jest równie prawdopodobna i że na samym początku każda z nich ma 25% bycia prawdziwą.

Zacznijmy więc :-)

Jak prawdopodobne jest to, że wszystkie organizmy na Ziemi mają wspólny kod DNA (zbudowany z tych samych zasad i który można skopiować z jednego organizmu do drugiego) jeśli prawdziwa jest teoria ewolucji?
Wg. teorii ewolucji całe obecne na Ziemi życie pochodzi od jednego praprzodka, przy takim założeniu możemy przypuszczać, że potomkowie tego praprzodka powinni mieć bardzo podobny, jeśli nie identyczny mechanizm kodowania.
Możemy więc przyjąć, że prawdopodobieństwo zaobserwowania wspólnego dla wszystkich organizmów kodu genetycznego pod warunkiem, że teoria ewolucji jest prawdziwa wynosi 1.

W przypadku hipotezy z "siewcami życia" z kosmosu, wspólny genotyp jest możliwy, ale nie jest konieczny. Takie życie byłoby produktem "inżynieryjnym", może mieć więc części wspólne, ale nie musi, chociaż możemy przyjąć, że kosmitom byłoby tak łatwiej, gdy teraz ludzie próbują budować życie to też starają się stosować jeden wspólny "kod genetyczny", stąd zakładamy, że prawdopodobieństwo zaobserwowania identycznego kodu genetycznego u wszystkich organizmów pod warunkiem, że są one produktem "siewców życia" wynosi 0.9.

W przypadku hipotezy kreatora, który stworzył wszystkie organizmy mógł użyć wspólnego kodu genetycznego, ale nie musiał. Nic go do tego nie zmuszało, ale też nic tego nie zabraniało.
Możemy szacować, że wspólny kod genetyczny moglibyśmy zaobserwować u wszystkich organizmów żywych pod warunkiem, że zostały stworzone przez nadnaturalnego kreatora z prawdopodobieństwem 0.5. To 0.5 oznacza, że kreator mógł skorzystać ze wspólnego kodu genetycznego, ale nie musiał.

Jeśli te liczby powyżej wrzucimy do twierdzenia Bayesa, a początkowe prawdopodobieństwa 0.25 wrzucimy jako prawdopodobieństwa prior, to po wzięciu pod uwagę naszych szacunków co do prawdopodobieństwa danego dowodu przy założeniu prawdziwości danej tezy mamy szacowane prawdopodobieństwo dla poszczególnych hipotez:
- teoria ewolucji ~0.345,
- hipoteza z kosmitami jako "siewcami życia" ~0.31,
- hipoteza z nadnaturalnym kreatorem, który stworzył wszystkie organizmy żywe na Ziemi ~0.173,
- hipoteza nadnaturalnego kreatora przy założeniu "młodej Ziemi" ~0.173.

To spójrzmy na kolejne obserwacje.
Tym razem na podobieństwo genetyczne.

Jak prawdopodobne jest by istniało podobieństwo genetyczne między różnymi organizmami na Ziemi, jeśli prawdziwa jest teoria ewolucji?
Wg. teorii ewolucji nowe gatunki "wyrastały" ze starych gatunków, czyli podobieństwo między gatunkami powinno występować, ba nawet się go oczekuje.
Czyli prawdopodobieństwo występowania podobieństwa genetycznego między organizmami różnych gatunków pod warunkiem, że teoria ewolucji jest prawdziwa wynosi 1.

Dla kosmitów jest tak, że może istnieć podobieństwo genetyczne między różnymi organizmami, możemy założyć, że tacy "inżynierowie" używaliby jakichś frameworków na których budowaliby organizmy, czyli mogliby użyć tego samego wzorca przy małpach i ludziach i wprowadzaliby tylko pewne zmiany dotyczące istotnych funkcji specyficznych dla danego gatunku. Nie byliby jednak do tego zmuszeni aż tak bardzo, czasem mogliby pójść na skróty.
Możemy szacować, że prawdopodobieństwo obserwacji podobieństwa genetycznego między różnymi gatunkami przy założeniu prawdziwości hipotezy o kosmicznych "siewcach życia" wynosi jakieś 0.75.

W przypadku nadnaturalnego kreatora podobieństwo może, ale nie musi występować. Nie znamy mechanizmów kreacji, bo z jednej strony kreator mógłby jak inżynier budować wszystko z klocków, ale mógłby też nadnaturalnie wszystko od razu zbudować.
Możemy szacować więc, że prawdopodobieństwo podobieństwa genetycznego między gatunkami przy złożeniu, że hipoteza z kreatorem jest prawdziwa wynosi 0.5.

Po wrzuceniu wszystkiego do wzorów i potraktowaniu poprzednich wyników jako priorów dla tej serii mamy prawdopodobieństwa poszczególnych hipotez:
- teoria ewolucji ~0.459,
- hipoteza kosmicznych "siewców życia" ~0.31,
- hipoteza kreatora ~0.115,
- hipoteza kreatora na młodej Ziemi ~0.115.

Przejdźmy do kolejnej obserwacji, czyli tego, że w materiale kopalnym widzimy iż bardziej skomplikowane formy są widoczne w młodszych osadach.

Wg. teorii ewolucji organizmy w ramach doboru naturalnego nabywały nowych cech (albo je traciły jak nie były przydatne), bardziej skomplikowane organizmy mogły powstać wg. teorii ewolucji tylko z mniej skomplikowanych, stąd prawdopodobieństwo tego, że zobaczymy taki obraz w materiale kopalnym pod warunkiem, że teoria ewolucji jest prawdziwa wynosi 1.

W przypadku kosmitów siewców życia jest inaczej. Tutaj organizmy zostały skonstruowane przez inżynierów, powinno być więc widać albo małą komplikację, później skok i już ciągle taką samą komplikację. Stąd możemy szacować, że prawdopodobieństwo obserwacji stopniowej komplikacji w materiale kopalnym przy założeniu prawdziwości hipotezy o kosmicznych siewcach życia wynosi 0.1.

W przypadku kreatora gdy stworzył on wszystkie gatunki wtedy gdy żyły jest taka obserwacja możliwa, ale jest mało prawdopodobna, w końcu nic go do tego nie zmuszało, a jeśli stworzył tak skomplikowane jak i proste organizmy to w podobnych ilościach powinny być widoczne w starym i nowym materiale kopalnym. Szacujemy więc, że dla kreatora, który stworzył wszystkie organizmy (ale nie na młodej Ziemi) prawdopodobieństwo obserwacji stopniowej komplikacji organizmów w materiale kopalnym pod warunkiem, że hipoteza kreatora jest prawdziwa wynosi 0.1.
W przypadku kreatora na młodej Ziemi większość skamielin musiałaby zostać tam włożona przez kreatora od razu w postaci skamielin. Jest to możliwe, ale dużo mniej.
Stąd szacujemy, że prawdopodobieństwo zaobserwowania stopniowej komplikacji organizmów w materiale kopalnym przy kreatorze na młodej Ziemi wynosi 0.01.

Po wrzuceniu tego do wzorów i wzięciu poprzednich prawdopodobieństw jako priorów mamy prawdopodobieństwo dla poszczególnych hipotez:
- teoria ewolucji ~0.91,
- hipoteza kosmicznych siewców życia ~0.06,
- hipoteza nadnaturalnego kreatora ~0.023,
- hipoteza nadnaturalnego kreatora na młodej Ziemi ~0.0023.

Przejdźmy teraz do tego, że znaleziono organy (u bakterii), które wydają się być tak zoptymalizowane, że gdyby zniknął choć jeden ich element, choć jeden gen, który je koduje to cały organ do niczego by się nie nadawał.

W przypadku teorii ewolucji naturalnym kierunkiem jest rośnięcie złożoności, jednak złożoność jest kosztowna i dobór naturalny może promować "tańsze" sposoby na osiągnięcie tego samego.
Tutaj może być tak, że kiedyś, u przodków bakterii które maja takie "nieredukowalne" organelle istniały ich bardziej skomplikowane wersje, które powstały na drodze doboru naturalnego przez powstanie pierw paranarządu, który jeśli był przydatny to przechodził do kolejnych pokoleń, w których czasem mutacje sprawiały, że stawał się lepszy, a czasem gorszy, te lepsze dawały większą szansę na przetrwanie stąd kolejne pokolenia je miały. W pewnym jednak momencie pojawiła się mutacja, która upraszczała budowę narządu, nie upośledzając jego funkcji, a zmniejszając ilość energii potrzebnej do jego budowy. Tu dobór naturalny też to promował, choć wystąpienie takiej mutacji jest trudniejsze.
Stąd szacujemy, że prawdopodobieństwo zaobserwowania kilku takich organów przy założeniu, że teoria ewolucji jest prawdziwa wynosi 0.5. Są one możliwe przy prawdziwości teorii ewolucji, ale teoria ewolucji uznała by je raczej za rzadkie.

W przypadku hipotezy kosmicznych siewców życia możemy przyjąć, że to byli inżynierowie, więc byli spokojnie w stanie zaprojektować takie rzeczy.
Stąd szacujemy, że prawdopodobieństwo istnienia takich organów przy założeniu hipotezy kosmicznych siewców życia wynosi jakieś 0.9.

W przypadku kreatora trudno to ocenić, powinniśmy przyjąć więc 0.5, ale przyjmijmy 1, bo kreator mógł tak zrobić.

Stąd mamy prawdopodobieństwa hipotez:
- teoria ewolucji ~0.85,
- hipoteza kosmicznych siewców życia ~0.10
- hipoteza kreatora ~0.042,
- hipoteza kreatora na młodej Ziemi ~0.0042.

Jakie z tego wnioski?

Na podstawie tylko 4 obserwacji możemy szacować, że teoria ewolucji jest najbardziej prawdopodobna z tych 4 hipotez, kolejna jest teoria kosmicznych siewców, która teraz jest jednak ponad 8 razy mniej prawdopodobna od teorii ewolucji, hipoteza kreatora jest ponad 20 razy mniej prawdopodobna od teorii ewolucji, a hipoteza kreatora na młodej Ziemi jest ponad 200 razy mniej prawdopodobna.
Co ważne w przypadku prawdopodobieństwa dla 4 obserwacji przyjąłem bardzo niekorzystną dla teorii ewolucji wartość prawdopodobieństwa takiej obserwacji przy prawdziwości teorii ewolucji i najbardziej korzystną dla kreatora.
Zrobiłem tak by uniknąć oskarżeń o faworyzowanie teorii ewolucji.

Jeśli uważacie, że moje szacunki prawdopodobieństwa różnych obserwacji pod warunkiem prawdziwości danej hipotezy są nieprawidłowe to zapraszam do zabawy w swoje ustalenia :-)
W tym arkuszu (trzeba zrobić kopię) są moje wyniki.
Bawiąc się trzeba zmieniać wartości w likelihood i wartości te to prawdopodobieństwo dokonania danej obserwacji przy prawdziwości danej hipotezy. Ponieważ to prawdopodobieństwa to muszą być między 0 a 1.
Nic nie stoi na przeszkodzie dodania sobie własnych obserwacji, w tym celu najlepiej skopiować ostatnią linijkę, zmienić jej opis i powpisywać likelihood dla tej nowej obserwacji dla każdej hipotezy.


Podobne postybeta
Nieuki
Dobór naturalny, albo my
A może z pochodzenia jesteśmy kosmitami? ;-)
Początki życia wg. Shapiro ;-)
Czy jest dziś sobota? ;-)

sobota, stycznia 03, 2015

Potfór ;-) czyli generator z yield w Java'ie

Poczytałem sobie wczoraj o generatorach, które mają się pojawić w ECMAScript6 i mi się spodobały.
Co prawda można zrobić generatory na wiele sposobów i wcale użycie yield nie jest wymagane, ale chciałem zobaczyć czy uda mi się takie coś popełnić w Java'ie ;-)

Idea jest taka by pisać tylko generator (który będzie w klasie niestety). Np. generator liczb od 0 do ilości wywołań (zakładając, że jest ich mniej niż maksymalna wartość int'a) może wyglądać tak:

public class Counter extends Generator<Integer> {
@Override public void generate() {
int i=0;
while (true) {
yield(i++);
}
}
}

znów generator, który będzie generował ciąg 1,2,3,1,2,3,1,2,3 i tak dalej z powtarzaniem się 1,2,3 będzie wyglądał tak:


public class Counter123 extends Generator<Integer> {
@Override public void generate() {
while (true) {
yield(1);
yield(2);
yield(3);
}
}
}
A generator, który będzie generował poszczególne znaki ze Stringa tak:

public class LettersFromString extends Generator<String> {

private String str;

public LettersFromString(String str) {
this.str = str;
}

@Override public void generate() {
int idx = 0;
while (idx<str.length()) yield(""+str.charAt(idx++));
}
}
Użycie generatora zaś będzie wyglądało tak, że najpierw go stworzymy, a później będziemy dostawać wartości przezeń generowane po zawołaniu next(). Jeśli wartości nie będzie to dostaniemy null.
Czyli przy generatorze:
public class OnceGenerator extends Generator<String> {
@Override public void generate() {
yield("Test");
}
}
Przy pierwszym zawołaniu next() dostaniemy "Test", a przy drugim null.
Ogólna idea jest taka by pisząc generator myśleć tylko o generowaniu kolejnej wartości, a nie o całym cięciu naszego algorytmu generowania na jakieś kawałki. 
Ludzie myślą jednowątkowo i generator powinien być pisany tak jakby to był jeden wątek.
No i stworzyłem portfora ;-) który pozwala na tworzenie takich generatorów ;-)

public abstract class Generator<T> {

private T value;
private Object lock = new Object();
boolean available = false;

public Generator() {
this(null);
}

public Generator(T val) {
this.value = val;
new Thread(new Runnable() {
@Override public void run() {
synchronized (lock) {
generate();
available = true;
}
}
}).start();
}

public abstract void generate();

public void yield(T val) {
this.value = val;
this.available = true;
try {
lock.notify();
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public T next() {
synchronized (lock) {
while (!available) {
try {
lock.wait();
} catch (InterruptedException ie) {

}
}
T val = this.value;
this.value = null;
this.available = false;
lock.notify();
return val;
}
}
}

Który to potfór pozwala na tworzenie generatorów jak w ECMAScript6 ;-)
Teraz się zastanawiam czy można by było stworzyć takie generatory bez wątków i na razie nie wiem.



Podobne postybeta
Przepływ sterowany danymi - A takie Java'owe coś ;-)
Sztuczki tropiciela błędów ;-)
Modale dobre - confirm dla Androida :-)
wait() i notify()/notifyAll() - najbardziej nierozumiane metody klasy Object ;-)
Generator programów

Postanowienia noworoczne programisty ;-)

1) napiszę codziennie co najmniej 1 test[1],
2) napisze codziennie co najmniej 50 linii kodu[2],
3) jeśli jest jakiś nieotestowany kod napiszę codziennie chociaż 1 test do tego kodu.

Ja co prawda nie robię postanowień noworocznych, ale od blisko dwóch miesięcy niemal codziennie wstawiam sobie dwa pierwsze a czasem i trzecie na swoje ToDo prywatne i pracowe ;-)

Nie zawsze udaje się spełnić, czasem trzeba kombinować z liczeniem, ale staram się.

Pierwsze staram się robić, bo dzięki temu kod powinien być łatwiejszy w użyciu, a z czasem powinienem się nauczyć pisać bardziej testowalny kod. Do tego łatwiej wtedy algorytmy konstruować, bo jeśli piszesz najpierw test (na razie potrafię to tylko robić gdy piszę kod do różnych "zadanek") to naturalnie zwracasz uwagę na corner cases :-)
Drugie staram się robić, bo dzięki temu nie traci się zdolności do zmiany algorytmu na kod.
Trzecie staram się robić, bo dzięki temu jest szansa, że lepiej poznam kod, a sam kod będzie bardziej testowalny.

Czemu tylko 1 test i aż 50 linii kodu?
1 test bo to jest Kaizen, małe kroki. Może udałoby mi się napisać testy od razu do całego istniejącego kodu, ale byłoby to tak trudne, że później bym tego unikał. A tak jest szansa, że wejdzie mi to w krew.
50 linii kodu bo po pierwsze liczymy w nich testy, po drugie im więcej kodu napiszesz tym robisz to pewniej, to jak z kaligrafią ;-)



[1] - najmniej chodzi o 1 unit test, najlepiej zestaw unit testów w pliku ;-)
[2] - wraz z testami


Podobne postybeta
Postanowienia noworoczne ;-)
Do chudości przez szantaż
Hackowanie organizacyjno-projektowe ;-)
Dobrze wykorzystany programista
Tnę i przerabiam na mniejsze, czyli nieprzewidziane skutki refactoringu

piątek, stycznia 02, 2015

Randki w ujęciu Bayesowskim ;-)

Po co się randkuje?

Odpowiedzi może być wiele i różnych. Można powiedzieć, że się randkuje bo to fajne, można powiedzieć, że to przez to, że inni to robią, można też robić to po to by znaleźć tą jedyną/tego jedynego.

Jeśli przyjmiemy, że chodzi o to ostatnie to możemy zadać sobie pytanie "ale o co chodzi?", lub je rozwijając "czemu niby randki mają w tym pomóc?".

Tu pomocne okaże się twierdzenie Bayesa i prawdopodobieństwo a posteriori.

Bez zanurzania się w teorię możemy powiedzieć, że prawdopodobieństwo czegoś "pod wpływem dowodów" jest opisane przez zależność:

prawdopodobieństwo czegoś "pod wpływem dowodów" ∝ nasza wiara co do prawdziwości czegoś na podstawie obecnej wiedzy * prawdopodobieństwo wystąpienia dowodu jeśli coś jest prawdziwe

Do tego dochodzi jeszcze to, że proporcjonalność fajnie by było przerobić w końcu na równość, wtedy się wynik mnożenia dzieli przez ogóle prawdopodobieństwo czegoś, ten moment nazywamy normalizacją.

Jeśli przyjmiemy, że tym czymś jest "to jest ta jedyna" (lub jak kto woli "ten jedyny") to możemy się zacząć zastanawiać do czego służą randki ;-)

Np. pierwsze pytanie może być takie, skoro ktoś poszedł z nami na randkę to jaka jest szansa, że to jest "ta jedyna"?

Mamy 2 możliwe hipotezy:
A - to jest ta jedyna
B - to nie jest ta jedyna

Najpierw nasza wiara co do tego, że to jest ta jedyna, albo nie jest ta jedyna.
Coś o świecie wiemy i możemy powiedzieć, że "ta jedyna" jest raczej rzadkim zjawiskiem. Powiedzmy, prawdopodobieństwo tego, że to jest ta jedyna "na wiarę" wynosi 1%.
Mamy więc:
P(to jest ta jedyna) = 0.01
P(to nie jest ta jedyna) = 0.99

Na początek nie wygląda to zbyt dobrze.

Teraz pytanie, jakie jest prawdopodobieństwo tego, że ktoś z nami poszedł na randkę gdy jest "tą jedyną", a jakie gdy nie jest?
Możemy przyjąć, że jeśli to jest ta jedyna to raczej na pewno z nami pójdzie na randkę, czyli niech to będzie 1.
Nie jesteśmy też tak znów straszni, można więc powiedzieć, że możemy być w typie powiedzmy 20% kobiet w odpowiednim wieku, czyli prawdopodobieństwo, że ktoś z nami pójdzie na randkę nawet jak nie jest "tą jedyną" wynosi te 0.2.

Stąd:

P(to jest ta jedyna)*P(poszła z nami na randkę|to jest ta jedyna) = 0.01 * 1 = 0.01
P(to nie jest ta jedyna)*P(poszła z nami na randkę|to nie jest ta jedyna) = 0.99 * 0.2 = 0.198

Teraz użyjemy sztuczki ;-) i znormalizujemy nasze wyniki, czyli zsumujemy wyniki tych mnożeń i podzielimy je przez sumę, wtedy mamy:

P(to jest ta jedyna|poszła z nami na randkę) = 0.048
P(to nie jest ta jedyna|poszła z nami na randkę) = 0.95

Niby wiele z tego nie wiemy, ale jakbyśmy tak "na wyrost" stwierdzili, że nadal "ta jedyna" zawsze z nami na randkę pójdzie (już drugą), a nie ta jedyna pójdzie z nami z prawdopodobieństwem 0.2 to możemy trochę więcej policzyć.
Po pierwsze nasze prawdopodobieństwo a priori się zmieniło, teraz nasza randka jest tą jedyną już z prawdopodobieństwem 0.048, a nie jest już tylko z prawdopodobieństwem 0.95.
Dlatego teraz mamy takie wyniki:

P(to jest ta jedyna)*P(poszła z nami na randkę|to jest ta jedyna) = 0.048 * 1 = 0.048
P(to nie jest ta jedyna)*P(poszła z nami na randkę|to nie jest ta jedyna) = 0.95 * 0.2 = 0.190

Po znormalizowaniu:
P(to jest ta jedyna|poszła z nami na randkę) = 0.2
P(to nie jest ta jedyna|poszła z nami na randkę) = 0.8

No jest lepiej  ;-)

Jeśli przy trzeciej randce przyjmiemy, że nadal "ta jedyna" umówi się z nami na 3 randkę z prawdopodobieństwem 1, a nie "ta jedyna" z prawdopodobieństwem 0.2 to mamy na początku:

P(to jest ta jedyna) = 0.2
P(to nie jest ta jedyna) = 0.8

Stąd:

P(to jest ta jedyna)*P(poszła z nami na randkę|to jest ta jedyna) = 0.2 * 1 = 0.2
P(to nie jest ta jedyna)*P(poszła z nami na randkę|to nie jest ta jedyna) = 0.8 * 0.2 = 0.16

Po znormalizowaniu:

P(to jest ta jedyna|poszła z nami na randkę) = 0.56
P(to nie jest ta jedyna|poszła z nami na randkę) = 0.44

No proszę! :-)

Już po 3 randce mamy już większe szanse, że to ta jedyna niż taką, że to nie ona.

Oczywiście to przy założeniu, że nasze liczby mają jakiś sens. Jeśli "nie te jedyne" umówią się z nami na kolejną randkę nie z prawdopodobieństwem 0.2, ale 0.3 to trzeba 4 randek.
Jeśli to prawdopodobieństwo wynosi 0.5 to trzeba 7 randek.

Ale OK, teraz jakieś wnioski z tego.

Widzimy, że pewność co do tego, że to "ta jedyna" rośnie wraz z liczbą randek...
Widzimy też, że liczba randek nie jest jedyną ważną wielkością, ważna jest też liczba opisująca jak wiele kobiet, które "nie są tą jedyną" pójdzie z nami na randkę...
Widzimy też, że w moich obliczeniach założyłem, że "ta jedyna" zawsze pójdzie z nami na randkę... co nie musi być prawdą.

No to wyciągajmy z tego powyżej wnioski.
Wiemy, że liczba randek jest ważna. Im ich więcej tym prawdopodobieństwo tego, że to jest "ta jedyna" rośnie.
Ale to mało, możemy też stwierdzić, że proces szukania tej jedynej możemy skrócić tak by wybierać "tematy" randek tak by "ta jedyna" chętnie w nich brała udział, a inne kobiety by odpadały.
Nie można tu jednak przesadzić ;-)

Można by było przyjąć, że powiedzmy 98% kobiet nie będzie z nami uprawiało seksu jeśli nie są tą jedyną, można by więc próbować po prostu proponować wszystkim kobietom seks i problem z głowy... ale "ta jedyna" też prowadzi swoje badania i na początku jej chęć uprawiania z nami seksu jest mniej więcej taka sama jak dla całej populacji, nie jest to więc dobry pomysł na pierwszą randkę bo mamy zbyt dużą szansę na stracenie "tej jedynej" już na początku.

Czyli dobrą strategią będzie taka, która będzie "stopniowała" randki.
Na początku powinny być takie, które zainteresują wiele kobiet i co ważne, nie mogą odrzucić "tej jedynej".
Później należy stopniowo wybierać coraz bardziej "selektywne" tematy randek.

Jak się okazuje, podejście zdroworozsądkowe ma sens ;-)

A ja mam pierwszy post na blogu w tym roku ;-)



Podobne postybeta
"Promocja homoseksualizmu" co to niby ma być?
Symulacja zamiast kartki i ołówka ;-)
Dziwne wykorzystanie twierdzenia Bayesa :-)
Reality Check
Taki lekko oszukany się czuję...

środa, grudnia 31, 2014

Do chudości przez szantaż

Pamiętajcie, że przeczytaliście to u mnie[1] i jak już Edomondo czy inny Apple to opatentuje to pamiętajcie, że byłem pierwszy[1].

Idzie Nowy Rok, czyli czas postanowień noworocznych.

Jednym z wielu będzie - w tym roku będę o siebie dbać, schudnę, będę ćwiczyć.

Wiele osób wierząc różnym poradnikom opublikuje to postanowienie na Facebooku, Twitterze, Google+, albo po prostu powie znajomym by poczucie wstydu pchało ich w kierunku dotrzymania obietnicy.

I za parę tygodni[2] zapomną.

Jest jednak na to sposób.

I ten sposób jest moim pomysłem na start-up ;-)

Trzeba połączyć krokomierz ze starym, dobrym szantażem ;-)

Najpierw taki obiecant musi zrobić sobie np. nagie zdjęcia, do tego z jakimiś dziwnymi akcesoriami i wykonując jakiś obsceniczny taniec.
Później wrzuca te fotki na stronę WWW, na której wpisuje mierzalne postanowienie noworoczne.
Np. codziennie przebiegnę 10 km, albo codziennie spalę 3000 kalorii ćwicząc.

Tu wchodzi krokomierz, czy inne Android Wear, które będzie monitorowało postępy obiecanta.
Jeśli obiecant nie spełni wymagań, dostanie ostrzeżenie, jeśli złamie po raz drugi to opublikowana zostanie ścieżka dźwiękowa, przy trzeciej obsuwie nastąpi publikacja całego materiału.

Do tego wszystkiego trzeba by przyjąć, że obiecanta i gwaranta obietnicy, czyli mój start-up wiąże kontrakt. Obiecant mógłby się zeń w każdej chwili wycofać, płacąc karę umowną w wysokości np. 5000 PLN (zmniejszaną proporcjonalnie w ciągu roku).

Przy 1000 klientów, dochód z przedwczesnego zerwania kontraktu to byłoby pewnie z 4 mln złotych ;-), ile start-up'ów[3] może się pochwalić takim dochodem w pierwszym roku działalności? ;-)



[1] - w myśl zasady "great minds think alike" już nie jedna osoba to zaproponowała, ale ja jestem pierwszy na moim blogu ;-)
[2] - zwykle po paru dniach
[3] - a podobno słowa składają się li tylko z liter...


Podobne postybeta
Postanowienia noworoczne programisty ;-)
Iran coraz bliżej....
Postanowienia noworoczne ;-)
Kupowanie mieszkania - szukać perfekcyjnego czy pierwszego spełniające wymagania?
My = Bogacze.

niedziela, grudnia 28, 2014

A może zarwać noc?

Jak to zwykle bywa w trakcie urlopu mój czas wstawania przesunął się na 12-13...
Ma to swoje konsekwencje. Nawet nie takie, że nie widzę wschodu słońca, ani takie że śniadanie jadam w porze obiadu.
Nie chodzi nawet o oglądanie wschód słońca jakoby od tyłu ;-) Bo o tej porze roku to wschód słońca będzie za 3 godziny 30 minut.
Głównym skutkiem takiego późnego wstawania jest jeszcze późniejsze chodzenie spać... Mamy 4:30, ja usypiam od 2 godzin i 20 minut...
W tym czasie zaplanowałem co jutro będę robić, przemyślałem kilka rozwiązań dla niektórych aplikacji, przejrzałem kilkadziesiąt artykułów w Pocket (polowałem na te poniżej 1 minuty (znalazłem dzięki TimeToRead)), przeprowadziłem kilka poważnych i szczerych rozmów i nic... Nadal mi się zbytnio spać nie chce...
Oczywiście problem powiększam tym, że biorę tablet i świece sobie po oczach oszukując mózg, że jest dzień...
Stąd zaczynam rozważać eksperyment w olanie dziś spania. W końcu raz na jakiś czas można zarwać noc ;-)
Nie wiem. Chyba się muszę z tym pomysłem przespać ;-)
posted from Bloggeroid



Podobne postybeta
Budzenie kaskadowe...
Walka z VacLagiem - start ;-)
Zegarek trudny
Sprawdź godzinę wschodu i zachodu Słońca na komórce ;-)
Chrome2ChromeV2, TabCast czy może TabHermes albo Tabcury? ;-)