niedziela, stycznia 31, 2016

A ja wybrałem Xbox One ;-)

Kupiłem ostatnio konsolę.
Przez jakiś czas rozważałem jaką kupić.
Byłem niemal pewien, że kupię PS4. Jest ładniejsza, mniejsza, ma mocniejszą grafikę i nie jest Microsoftu. Do tego prawie wszyscy, których znam i mają konsole mają PS4.
Jednak w końcu kupiłem Xbox One ;-)

Czemu?

Głównie przez to, że z tego co czytałem ktoś kupujący Xbox One teraz kupuje całkiem nową konsolę w porównaniu do tej sprzed roku. Znaczy to, że konsola się rozwija.

Nie zmienia to faktu, że wygląda niezbyt ładnie i zgrabnie, jest wolniejsza, a i z tego co widziałem w sklepie gry są droższe.
Do tego ma Microsoft w środku (co momentami boli, bo MS i interfejsy użytkownika, albo inaczej, interfejsy użytkownika od MS i ja nie możemy się odnaleźć).

Nie kryję, że powodem było też Halo ;-)

Chociaż ostatnio gram głównie w Fallout 4, ale muszę uważać bo zdecydowanie daję się porwać grze.

Nikogo nie zachęcam do pójścia w me ślady, ani do wyboru Xbox One.

Po prostu dzielę się swoim zdaniem w wojnie konsol ;-)

Jestem też już na 3 głównych platformach, w pracy na sprzęcie i sofcie od Apple, w domu na Linuksie i Androidzie, a w rozrywce na platformie Microsoftu ;-)


Podobne postybeta
Zaczął się nowy rok
A jednak Pythona warto ;-)
Mniej wredne Google Docs ;-) - zabawy z OCRem część 2
Amazon Prime Video na XBOX One w Polsce - how to ;-)
Reset

niedziela, stycznia 24, 2016

Jak walczyć z gigantycznym kodem w Java'ie, część 1.5 ;-) - czyli jak je się słonie ;-)

Poprzednio było o tym jak zacząć zabawę z kilkoma milionami linii kodu i jak zacząć je przygotowywać do analizy, o analizie jeszcze nie było, dziś będzie o organizacji.

Najpierw trzeba te parę milionów linii pociąć i dać im właścicieli.
Można zaproponować by zainteresowani sami powiedzieli czym się chcą zajmować (i rozwiązać ewentualne konflikty, tudzież przypisać komuś to czego nikt nie chciał), można też po prostu wylosować kto co weźmie.
Ale TRZEBA komuś dać własność kodu.
Czemu?
Bo jeśli kod ma właściciela, to ma kogoś kto ma bardziej długoterminową perspektywę dla tego kodu. Częściej w nim grzebie, widzi to co jest w tym kodzie najbardziej problematyczne i to co sprawia największe problemy w trakcie utrzymania.
Widzi też problemy w systemach na których ten kod działa.
Może wtedy zacząć zarządzać długiem technicznym. Może podejmować decyzje w dłuższej perspektywie czasowej.

Jeśli gdzieś w kodzie są "biblioteki" to trzeba się im przyjrzeć i stwierdzić czy są w ogóle bibliotekami.
Biblioteka to kod, który jest czyjąś własnością, do którego nowe ficzery wprowadzane są przez właściciela (nie musi być on autorem kodu, ten może przyjść od kogoś innego przez np. mechanizm pull request) i który to kod ma swój własny backlog zmian i własne priorytety (które są ustalane w odpowiedzi na requesty od klientów).
Biblioteką nie jest kod, którego używa N projektów w którym to kodzie grzebie kto chce z tych projektów gdy mu jest wygodnie.
Biblioteka nie istnieje po to "by nie robić copy & paste".

Co robić gdy masz "biblioteki", które istnieją "by nie robić copy & paste"?
Wydaje mi się, że trzeba wybrać jedną z czterech opcji.
Split - jeśli widać w "bibliotece" i projektach, które jej używają jakiś porządek, polegający na tym, że projekty będące własnością jednego zespołu/osoby używają tylko poszczególnych klas, a inne klasy są używane przez projekty używane przez kogoś innego, to najzdrowiej wydzielić z tej "biblioteki" kilka i oddać je zainteresowanym (obecnie próbuję stworzyć narzędzie do tego)
"Libarise" - ;-) ubibliotecz ;-) jeśli, kod jest używany przez wiele projektów ale jest niezbyt często zmieniany i ma ściśle określony zakres działań (to może wymagać najpierw zrobienia split) to może warto z niego uczynić prawdziwą bibliotekę, która będzie miała właściciela i zmiany do niej będą wprowadzane przez tego właściciela. Tutaj sugeruję dodanie całej masy UT, które pozwolą na załatwianie dodawania nowego kodu przez pull requesty. Wydaje mi się, że na początku UT powinny niemal betonować zastany kod.
Fork - jeśli wszyscy czegoś używają, ale nie da się tego ubibliotecznić to wydaje się, że zdrowsze będzie zrobienie forków kodu. Niech każda zainteresowana strona zmienia go sobie jak chce.
Można tu spróbować zrobić coś a'la Spotify'iowe chaptery (czyli każdy zespół który zrobił swojego forka będzie miał kogoś w chapterze i ten chapter będzie starał się by taki zforkowany kod szedł w kierunku biblioteki, albo by chociaż ciekawe zmiany, które będą przydatne dla innych się propagowały (z czasem będzie coraz trudniej)).
Forget - pewnie gdzieś jest kod, którego NIKT nie używa (tutaj przydatne będzie coś co podziała na wynikach z "lekcji 1" ;-)), wtedy najlepsze co z nim można zrobić to go SKASOWAĆ (usunąć pliki, zrobić commit).

Walka z wielkim codebasem to ćwiczenie w jedzeniu słoni.
Jeśli masz stado 100 słoni, i z każdego zjesz po 10% (bo będziesz zjadać tylko kawałki które wystają ze stada), to zjesz 10 słoni, ale nadal będzie ich 100.
Jeśli jednak podzielisz stado na 10 mniejszych stad to jest szansa, że w każdym z nich uda Ci się zjeść po 1 słoniu i będziesz mieć tych słoni 90 sztuk.
[analogia może być chybiona i bez sensu, ale mi się podoba ;-)]


Podobne postybeta
Drugi klasyfikator jako "sanity check"
Twitter
Notka miraż
Jak się topologicznie wprowadzać ;-)
A różne takie...... czyli Fork-Join w JDK7, Azule i podobne :-)

sobota, stycznia 09, 2016

2016 będzie rokiem "nietypowym"

W odróżnieniu do swoich sąsiadów nie pozwala na stworzenie równania:
10_9_8_7_6_5_4_3_2_1=2016
Za to już taki rok poprzedni, pozwala na powstanie równania:
10*9*8*7/6/5*4*3-2+1=2015
Także, kolejny rok na to pozwoli:
10*9*8*7/6/5*4*3+2-1=2017

Okazuje się, że od 1970 roku do 2100 będzie łącznie 12 lat, które pozwolą na zapisanie się równaniami (takimi na liczbach całkowitych).

Oto one:
10*9*8+7*6*5*4*3/2-1=1979
10*9*8+7*6*5*4*3/2*1=1980
10*9*8+7*6*5*4*3/2+1=1981
10*9*8*7/6/5*4*3-2-1=2013
10*9*8*7/6/5*4*3-2*1=2014
10*9*8*7/6/5*4*3-2+1=2015
10*9*8*7/6/5*4*3+2-1=2017
10*9*8*7/6/5*4*3+2*1=2018
10*9*8*7/6/5*4*3+2+1=2019
10*9*8/7/6*5*4*3*2-1=2039
10*9*8/7/6*5*4*3*2*1=2040
10*9*8/7/6*5*4*3*2+1=2041

2016 jest tutaj jeszcze o tyle nietypowy, że jest jedynym rokiem w tym okresie, który jest otoczony z obu stron blokami lat równaniowalnych ;-)

A skąd to wiem?
Bo policzyłem* tym oto programikiem w Scala'i ;-)

package pl.przemelek.equation

import scala.annotation.tailrec

object ResolveFor2016 {

  def increase(operators: Array[Int]) {
    @tailrec    
    def inc(idx:Int, operators:Array[Int]) {
      operators(idx)=operators(idx)+1      if (operators(idx) > 3) {
        operators(idx) = 0        inc(idx + 1, operators)
      }
    }
    inc(0,operators)
  }

  def testFor(year:Int,operators: Array[Int]): Boolean = {
    val numbers = Array(10,9,8,7,6,5,4,3,2,1)

    def mul(list:List[Int]):List[Int] = list match {
      case h :: Nil => h::Nil      
      case a :: 2 :: b :: tail => mul((a*b)::tail)
      case a :: 3 :: b :: tail => mul((a/b)::tail)
      case a :: 0 :: b :: tail => a::0::mul(b::tail)
      case a :: 1 :: b :: tail => a::1::mul(b::tail)
    }

    @tailrec
    def sum(list:List[Int]):Int = list match {
      case a :: Nil => a
      case a :: 0 :: b :: tail => sum(a+b::tail)
      case a :: 1 :: b :: tail => sum(a-b::tail)
    }

    var list = List[Int]()
    for (i <- 0 to 18) {
      list=list++List(if (i%2==1) operators(i/2) else numbers(i/2))
    }
    list = mul(list)
    val s = sum(list)
    s==year
  }

  def check(year:Int) {
    def show(operators:Array[Int]): Unit = {
      val numbers = Array(10,9,8,7,6,5,4,3,2,1)
      val opers = "+,-,*,/".split(",")
      for (i <- 0 to 18) {
        print(if (i%2==1) opers(operators(i/2)) else numbers(i/2))
      }
    }
    val operators = Array.fill(10){0};

    var finish = false;

    while (!finish && operators(9)==0) {
      finish = testFor(year,operators)
      if (finish) {
        show(operators)
        println("="+year)
      }
      increase(operators)
    }
  }

  def main(args: Array[String]) {
    // 10 _ 9 _ 8 _ 7 _ 6 _ 5 _ 4 _ 3 _ 2 _ 1 = 2016    
    for (year <- 1970 to 2100) {
      check(year)
    }
  }
}

Całkiem miła zabawka na "po chorobie" ;-)
Pozwoliła mi na przetestowanie pewnych mechanizmów ze Scala'i.

Ten program nie jest napisany po bożemu, bo używam var'ów i side-efectów, nie wszędzie robię tail recursion, ale już coś robi.
Chętnie przyjmę krytykę :-)

Podoba mi się możliwość zrobienia takich strasznych rzeczy jak to co robią mul i sum z pattern matchingiem.

Program też poważny problem algorytmiczny ;-) bo zamiast w testFor sprawdzać wszystkie lata od razu, dla każdego układu operatorów, to ja sprawdzam każdy układ operatorów dla każdego roku. Głównie przez to, że najpierw sprawdzałem czy da się takie równanie zbudować dla 2016, a później zaciekawiły mnie lata w około ;-)

Chytrze uniknąłem zabawy w budowanie drzewa przez ohydny manewr z budowaniem równania jako listy.... 

Scala to nadal nie jest mój język, ale nauczę się go, bo wroga trzeba poznać ;-)

Inspiracją do całego programu był tytuł postu Petera Norviga.


* - komputer policzył.



Podobne postybeta
Potworność ;-) czyli mnożenie w 90 liniach ;-)
Motanie kodu - czyli co wynika z chęci zarządzania zadaniami
Plus dla Scala, minus dla Groovy ;-)
SleepAdvisor - komórka pomaga w wyspaniu się ;-)
Go dla Java'owca ;-) odcinek 2 "kontenery dwa ;-)"

poniedziałek, stycznia 04, 2016

Zaczął się nowy rok

Zaczął się nowy rok.

Zacząłem go od stworzenia (przy pomocy Pythona i kilku godzin kodowania ;-)) playlisty z piosenkami z Buffy the Vampire Slayer dla Spotify (link http i Spotify).

Obejrzałem film "Barany. Islandzka opowieść" - inny, ale jakoś do mnie nie trafił, głównie przez to, że najważniejsza intryga bazuje na tym, że scenarzyści chyba nie do końca rozumieli jak działa system ewidencji zwierząt hodowlanych (OK, jeden hint możliwe, że film dzieje się przed jego wprowadzeniem, bo jest gdzieś kalendarz z 1978 roku, ale za to samochody i quady wyglądają na współczesne). Ciekawe było za to to, że w jednej z pierwszych scen jest tak, że jeden z bohaterów, chyba Gummi jedzie quadem i wiezie barana, przejeżdża drogą i po obu stronach drogi są owce, które najwyraźniej boją się quada. Zaczynają uciekać i tu jest ciekawe, z jednej strony są 4 owce i te uciekają tak dosyć wolno, bez pośpiechy, z drugiej strony jest tylko 1 owca i ta ucieka tak na oko z 2 razy szybciej. Przypadek? Pewnie tak, ale chciałbym przetestować czy tak nie jest czasem zawsze, bo może to coś co wytworzyła u owiec ewolucja? W końcu jak uciekasz stadem, to musisz być szybszy tylko od najwolniejszego, ale jak uciekasz sam to musisz uciekać jak najszybciej bo goniący nie może wybrać innego celu.
Chociaż ten film może też wskazywać na to, że mam deficyt w odbiorze. W filmach lubię historię i szczególnie gdy jest opowiadana z dwóch stron, tutaj gdzieś na dole tkwią pewnie ciekawe konflikty, a my widzimy tylko z boku ich skutki. Czyli film może być naprawdę dobry, ale ja jako odbiorca mogę być zbyt autyczny czy jako to nazwać by do mnie dotarł.
Bardzo fajnie wygląda też pies pasterski i to jak prowadzi owce, ta postawa, taka napięta i gotowa do skoku.

Zapowiada nam się smutna przyszłość.
Państwo PiS oznacza w mojej ocenie stagnację i brak rozwoju. Będziemy stać w miejscu, a może i się cofać gdy reszta świata biegnie do przodu.
Nie jesteśmy idealni, wiele rzeczy zrobiono w Polsce źle, ale chociaż w mniejszym lub większym stopniu goniliśmy zachód czy świat jako taki. Nauka nadal nam kulała, ale sztuka zaczynała powoli coś znaczyć.
Teraz będziemy mieli jedną wykładnię tego co dobre i słuszne. Trudno będzie proponować rewolucyjne pomysły, albo próbować prowadzić badania w kierunkach niepopularnych wśród rządzących.
I nie chodzi tu o gender, a o np. genetykę, neuronaukę czy kognitywistykę, że o embriologii nie wspomnę.
To będzie znaczyło, że najzdolniejsi będą wyjeżdżać. Już to robią, ale to przyśpieszy.

Chodzi za mną konsola. Zaczynałem od tego, że chcę kupić PS4, teraz coraz częściej myślę, że jednak XBOX One. PS4 wydaje mi się ładniejsza, szybsza, ale jednak za XBOX One stoi Microsoft i chociaż już nigdzie nie używam Windowsa, to z tego co się czyta, ludzie zauważają, że XBOX One teraz to inna konsola niż rok temu, a PS4 to ciągle to samo co rok temu.
No i na XBOX One jest Halo, a jak pooglądałem na YouTube to fajnie wygląda.
Jest jeszcze szansa, że się wyleczę ;-)

Scala.... fajny język, którym można zrobić dużo złego, ale pozwala sobie połechtać ego jak człowiek napisze jakąś fikuśną rzecz bazującą na tail recursion ;-)
Niestety jak na razie nie udało mi się w IntelliJ Idea włączyć testów dla Scali.... co mi przeszkadza i mnie smuci.


Podobne postybeta
A ja wybrałem Xbox One ;-)
2016 będzie rokiem "nietypowym"
PRISMochoza....
Tresura owiec ;-)
Przesyłanie "obcych" na odległość, albo uniwersalny format danych ;-)