Co nowego na forum?

baant dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 05:39 @Silv: czy ty sypiasz po 2h dziennie?

baant dodał komentarz w Ile zarabiacie?

dziś, 05:36 Czy to jest oferta juz po całym procesie rekrutacyjnym i po dostaniu umowy do wglądu...

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 05:27 Chociaż może i da się wykorzystać...

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 05:18 Ha, żem zapomniał o destrukturyzacji. :) Dzięki. :) Ale chyba zostawię już, co jest....

Maciej Cąderek dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 04:10 Głowa węża jest znajdowana przez this.segments[0]. - albo jak w klasycznej liście co...

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:48 Nie będę podmieniać length, obiecuję. :P

Maciej Cąderek dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:47 Czym jest tablica w JSie i czym się różni od tablic w innych językach to można książ...

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:42 Dobra, zobaczymy, spróbuję usunąć to ID... mam poczucie, że tak zmieniając wciąż kon...

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:35 A jutro przyjdzie Fre i wszystkie moje inżynierskie rozważania podsumuje jednym opty...

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:32 W sumie – to tylko prosty Snake... jeśli będzie odpowiednie właśnie/tylko dla Snake'...

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:24 PS. Wtedy mógłbym spokojnie sprawdzać albo this instanceof SnakeHeadSegment, albo th...

Maciej Cąderek dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:20 Kolejność elementów w tablicy jest gwarantowana. Ba, od którejśtam wersji ES (6 boda...

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:19 Może w podejściu bardziej... – nie wiem, jak to nazwać – powinienem stworzyć dwie kl...

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:14 I tak na razie na nim polegam. Głowa węża jest znajdowana przez this.segments[0]. Al...

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:13 Tfu, "elementów" oczywiście, nie "segmentów".

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:12 W sumie nie ma sensu porównywać segmentów oddzielnie od węża... i tak porównuję tylk...

Maciej Cąderek dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:10 Wiesz, to jak zwykle zależy. Możesz napisać snake'a na milion sposobów. Pytanie tylk...

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:09 Jeśli usunę ID, nie wiem, czy będzie możliwe ewentualne porównywanie segmentów. Poza...

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:05 Hm. Mój komentarz dwa komentarze wyżej powinien trafić do Programistycznych WTF. :D

Silv dodał komentarz w Jak poprawnie zaprojektować wywołania zwrotne?

dziś, 03:02 Albo po prostu w podejściu @Freja Draco przestaje to być logiczne, i dlatego nie pow...

Popularne wpisy na mikroblogu

Haskell
2019-08-19 21:34

Interview

Byłem dziś na rozmowie w pewnej firmie. Niby międzynarodowa firma, ale na miejscu okazało się, że to tylko polski franczyzobiorca. Szukają programisty SQL ze znajomością języków programowania. Rozmowa w biurze pana Janusza:

  • Dlaczego pan tak często zmienia pracę? Około 10 firm w około 15 lat czy pan nie przesadza?
  • Nie uważam, że często zmieniam pracę. Obecnie specjalistów IT zatrudnia się na umowy na czas trwania projektu, a później praca zostaje tylko przy utrzymaniu. W kilku firmach pracowałem około 3 lat, a w innych kończyły się projekty lub decydowały sprawy będące poza moją kontrolą np. pracodawca nie wywiązywał się z umowy.
  • Dobra, mam dla pana trudne zadanie rekrutacyjne "na logikę", większość kandydatów nie potrafi rozwiązać: 1,5 kury, przez 1,5 dnia, składa 1,5 jajka. Ile jajek składa kura?
    Po rozpisaniu zadania na kartce podałem odpowiedź.
  • Jak pan to rozwiązał? - szok i niedowierzanie.
  • Zapisałem sobie wzór 1,5x * 1,5y = 1,5z i go przekształciłem. W sumie mogłem policzyć w pamięci.
  • Noooo, tak matematycznie też można, ale ja bym zrobił tabelkę "na logikę" (???). Oferujemy szeroki zakres benefitów: ubezpieczenie medyczne, owocowe środy i zniżki na nasze usługi. Jakie są pana wymagania finansowe?
  • XXXXX zł netto
  • Odezwiemy się do pana.
cmd

Około 10 firm w około 15 lat czy pan nie przesadza? Januszom to już się dupach poprzewracało. Może jeszcze od razu lojalki na 10 lat xD

Jasnowidz

@renderme to z niemcami to jest kwestia kulturowa podejścia do roli pracownik-pracodawca. Firma to twój drugi dom na lata, a praca w wielkim koncernie i podpiętym pod jakiś związek zawodowy to dla wielu tutaj marzenie. Problem w tym że w wielu branżach np. IT to nie jest optymalne podejście. Ja tam często zmieniającej osoby bym nie skreślał na pewno (oczywiście w jakiś granicach rozsądku). A tutaj ewidentnie firma szuka chyba kogoś od wszystkiego na lata, a niekoniecznie wyspecjalizowanego w jakiejś technologii programistę. A co do kury to ja bym powiedział że kura jest zmienną dyskretną, i nie może przyjmować wartości w takim zakresie :-)

onemangamedev
2019-08-19 17:02

Sprawdzałem co się da wywalczyć używając tylko całkowicie darmowych opcji na AWS.
Niestety webówka nie wchodzi w grę: brak s3 i serwisów do api, ale obróbka danych, proste pipeliny i CI/CD jak najbardziej.

https://youtu.be/P86C3tN1PMw

Haskell

Świetnie, że ćwiczysz sobie angielski, świetnie, że robisz ciekawe filmy o nośnym temacie takim jak chmura publiczna. Jednak pominąłeś ważną informację tj. free tier to również m.in. 750h micro EC2, 5GB storage S3, 1mln calls API Gateway przez 12 miesięcy. Poza tym nie tak trudno jest wyłapać darmowe kupony z kasą do wykorzystania gdy robisz jakieś certyfikaty albo jesteś studentem. Nawet 100$ można spokojnie wyłapać, a nawet gdybyś miał płacić, to storage S3 kosztuje 9 polskich groszy za GB miesięcznie. Zabrakło tych informacji... Gdybym chciał obejrzeć na smartfonie to literek nie rozczytam, na lapku było ciężko bez fullscreena. A tak w ogóle to tylko moja opinia, bo to ty jesteś specjalistą od robienia vlogów, ja nie robię.

onemangamedev

Oryginalny plan był właśnie o stworzeniu czegoś prostego z użyciem ec2 i s3, jednak głównym założeniem było użycie całkowicie darmowych zasobów. Musiałem zrewidować plan do data pipelinu

Aryman1983
2019-08-19 12:15

Nowy system operacyjny Microsoftu
Jakby się uprzeć to skrót Windows Core OS można zapisać WC OS :-)

Aryman1983

@PerlMonk: tak trzymaj ;-) Nie ma co się męczyć w imię nie wiadomo czego :-) Jak kaska leci to korzystamy z tego co jest dla nas wygodne :-)

somekind

U mnie w pracy jakieś 99% serwerów jest na Win, na Linuksie jest tylko eksperymentalny soft w Node.js albo bazy danych od jedynego słusznego producenta. Więc owszem, są takie firmy, w których Linux na serwerach to margines.

GregoryI
2019-08-18 00:27

Odc 3. Apka w google play store

https://play.google.com/store[...]=com.grzegorziwanek.stopwatch

Znalazłem w końcu trochę czasu i zabrałem się za automatyczne zapisywanie stanu trwającej sesji przy ręcznym ubiciu aplikacji.Taki niby cache.

Sama apka zbudowana jest wokół pomysłu braku wykonywanych obliczeń będąc w background oraz obsłużenia wszystkich kombinacji przypadków wejścia w stan background ( liczniki w pauzie, liczniki działające, liczniki wyzerowane itp).

O ile ta implementacja sprawdzała się to bez zarzutów, o tyle nie załatwiała w żaden sposób przypadku, gdy niechący wciśniemy back telefonu ( i ubijemy Activity - co kończy się wyczyszczeniem danych), albo gdy ubije się apkę ręcznie.
Do obsłużenia takiego przypadku trzeba dodać obsługę zapisywania stanu sesji przy końcu lifecycle ekranu oraz odtworzenia z cache przy starcie.
Jak na razie tylko dla seksji "Stopwatch". Sekcja "Countdown" work-in-progress a'la refactor kodu.

Aplikację zbudowałem wokół patternu MVI oraz operowania jednym globalnym stanem ( dokładniej po jednym dla ekranu), co bardzo ułatwia dorobienie takiej funkcjonalności, ponieważ mamy gotowe obiekty ( XXXViewState) które są na bieżąco aktualizowane o zmiany w obrębie swoich ekranów, które posiadają wszystkie potrzebne nam dane na temat ekranu, i które musimy tylko serializaować do JSON i zapisać przed zamknięciem apki, oraz deserializować przy starcie aplikacji i wyrenderować z nich ekrany.
Serializacja oraz lokalne zapisywanie historii pomiarów do JSON było już w aplikacji od samego początku jako jedna z funkcjonalności. Zrobione za pomocą biblioteki moshi.
Dotychczas miałem do czynienia tylko z Gson oraz jackson, a informacja o kotlinx-serialization jakoś mnie ominęła, wybór padł więc na tę bibliotekę.

O ile do tego momentu nie miałem żadnych problemów z serializacją danych ( dodanie wyjątków obfuskacji w Proguard, płaskie struktury danych, bez polimorfiii, zagnieżdżeń oraz kotlinowych obiektów singletonów) o tyle w tym przypadku natrafiłem na ścianę w postaci polimorficznej kotlinowej Sealed Class której serializację musiałem przeprowadzić.

EDIT po komentarzu @Michał Sikora
Da się serializować object z sealed class jako jej supertypem, jednak jest to wiedza bardzo niepowszechna i trzeba dopisać sporo kodu do serializacji.
EDIT end

Spędzenie 3 wieczorów nad tą ścianą, sprawdzenie innych bibliotek oraz przeczytania mnóstwa tematów dotyczących serializacji kotlinowych sealed class, albo inaczej, klas polimorficznych, zaowocowało sieczka w głowie oraz nową wiedzą:

  • jeśli potencjalnie będziemy potrzebowali serializować/deserializować obiekty danej klasy, idealnie byłoby nie używać obiektów polimorficznych
  • broń boże używać kotlinowych object ( na zasadzie object ObjectSubclass : SealedSuperClass()) - można próbować jakiejkolwiek z bibliotek do serializacji a i tak nie zadziała nam próba odtworzenia typu ObjectSubclass ( nie ma tam informacji identyfikującej oraz jest to singleton) - najlepiej sobie odpuścić i już lepiej mieć zamiast tego pustą klasę class ObjectSubclass() : SealedSuperClass() - z tym po kombinacjach poniżej można działać
  • dla sealed class rodzic możemy użyć class albo data class jako dziedziczące, jednak żeby nasze czary zadziałały musimy w przypadku Moshi dodać identyfikator w postacji enuma ( lub jakiegoś stringa) dla każdego podtypu superklasy ( dodać to pole w superklasie oraz w definicji podklas) oraz spiąć to z PolymorphicJsonAdapter; dla bibliotek kotlinx oraz jackson też trzeba było dorabiać dodatkowe struktury danych żeby można było przeprowadzić "identyfikację" typu danego obiektu do i z JSON.
  • a już najlepiej byłoby nie mieć polimorfii i posiadać płaską strukturę danych bo strasznie to brzydkie :)

.Dodatkowo poprawiłem w końcu ikonę aplikacji oraz dodałem Changelog.
W tym tygodniu jeśli będę mieć czas, cache dla sekcji Countdown ( które w zasadzie jest już gotowe, ale potrzbuje refactoringu).

Tak na marginesie: zauważył ktoś, że proces akceptacji zmian ( czy to zmiany grafik sklepowych, czy to nowe wersje apki) baaardzo się wydłużył w google play store?
Natknąłem się na kilka tematów na reddit, zarówno od developerów jak i ogłoszeń od googla, ale dotychczas nie dotknęło mnie to w ogóle.
A teraz ni z gruchy, ni z pietruchy, akceptacja update ikony aplikacji ( wyświetlanej w sklepie!) trwała gdzieś prawie 3 dni.

Zauważyłem też, że po ustawieniu tagów ( od kilku dni w konsoli deweloperskiej aplikacji można przypisać jej do 5 kategorii/tagów) oraz ostatniej aktualizacji apka skoczyła do pierwszej dziesiątki wyników dla "stopwatch timer", mimo mniej niż 50 instalacji, hehe.

GregoryI

@Michał Sikora: Ty, wiesz ile ja szukałem czegoś takiego? :) Używam moshi.
Z tego co rzuciłem okiem, to na serio sporo trzeba dopisać, tylko że moshi dobrze rozumiem, że dla każdego object trzeba dodać osobny adapter (w tym przykładzie jest jeden object) ? Na wklejonym przykładzie QuxJsonAdapter.
Dziękuję bardzo za podesłane sample. Nawet nie wiesz ile spędziłem na stronie bugów moshi/kotlinx/gson żeby znaleźć dokładnie to co wstawiłeś. Jakby nikomu nie była potrzebna serializacja object, wszędzie, we wszystkich samplach mamy class, data class, a jak widać sam object przychodzi z nowymi problemami.
Na pewno użyję w następnym update, żeby przeczyścić trochę tamto miejsce.
Może trochę zredaguję ten wpis, bo chciało mi się spać jak pisałem:)

Michał Sikora

Tak, dla każdego object musisz napisać osobny adapter. Procesor adnotacyjny nie jest w stanie go wygenerować, a refleksja sobie z tym nie radzi. No i o ile serializacja object ma jakiś sens, bo nie wiemy co i jak to skonsumuje, to deserializacja jest trochę dziwna. Niby nie ma czego tu deserializować, bo i tak istnieje tylko jeden object, więc fromJson w adapterze bardziej służy do sprawdzenia poprawności danych niż do ich faktycznego wyciągnięcia.