Haskell
wczoraj, 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.
Silv

PS. Może lepiej... nie pisać go z imienia. Żeby nie został odebrany jako janusz (nawet jeśli jest).

Azarien

@czysteskarpety: do towarzyszy zwraca się per wy: "czy nie przesadzacie, towarzyszu?" :D

onemangamedev
wczoraj, 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ę.

micfil94
wczoraj, 16:45

Ponad połowa roku za nami:
🔸 Python na czele,
🔸 Ruby wyżej niż niż JS,
🔸 Java z dużą stratą do lidera.

Ciekawe co przyniesie druga część roku. Jakie macie typy?
https://aprogrammerlife.com/t[...]CyCLIhwAxzns7lVkpELW-F-heh2Bg

czysteskarpety

przecież to zestawienie to science fiction, tym bardziej w PL

several

C# mniej niż C++ ? Cmon, na podstawie czego to zestawienie?

Aryman1983
wczoraj, 12:15

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

WeiXiao

no tak, ja wszystkim niezgadzającym się przypisuje łatki windowsiarzy i antylinuxiarzy :D jak odwiedzisz te 50 firm to daj znać jakie rezultaty :P

somedev

Linux zawsze sprawiał mi problem a maca też nie lubię więc piszę na Windowsie na VS Pro i czasami z konieczności VSC. Za to wszystkie usługi działają produkcyjnie na linuksie. Używajcie systemu a nie wyznawajcie..

leggo
wczoraj, 11:19

Po moim przejściu do innego projektu, nowe życiowe wnioski:
"You don't need DTOs' when you have Tuples"
¯\_(ツ)_/¯

Shalom

Nie nie nie. Tragiczny pomysł. W ogóle używanie standardowych typów danych bez opakowania ich "domenowo" to proszenie się o problemy z utrzymaniem. Bo nagle patrzysz a metoda zwraca ci Map<String, Map<String,Tuple<Integer,String>>> i w sumie nie wiadomo WTF. A jakby to wszystko ładnie aliasować sensownymi nazwami to dałoby sie z tego korzystać.

leggo

tak, dzięki mnie wylecą wszystko konstrukty typu:
Dictionary<Tuple<bool, int, string, string, int>, RowOfData> :D :O :X

InterruptedException
2019-08-18 12:47
InterruptedException

Zdecydowanie Amazon już poleciał w kosmos z ilością pytań LP.
Info jak wyglądają rozmowy biorę z np https://leetcode.com/discuss/[...]-sde1-seattle-july-2019-offer

grzzpo

Też to czytałem, ale czekam na info z wyzej wymienionych oddzialow. Na LT niektórzy piszą, że pytań algorytmicznych mieli bardzo mało na stanowiska programistyczne...

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.

WeiXiao
2019-08-17 23:15

Może komuś to kiedyś uratuje tyłek

W HTTP/2 Content-Length jest opcjonalny, więc takie coś może nie przejść var buffer = new byte[Convert.ToInt32(request.ContentLength)]; - będzie 0 ;)

Szybki myk (C#) (request.ContentLength ?? (request.Body?.Length ?? 0)) i "u mnie działa", ale radzę zapytać experta / sprawdzić doca libki od obsługi HTTP :D

https://svn.tools.ietf.org/sv[...]30.html#header.content-length

https://tools.ietf.org/html/rfc7540#section-8.1.2.6

edit

W HTTP/1.1 też jest opcjonalny, więc nvm.

Wibowit

Content-Length zawsze był opcjonalny i to świetna sprawa jeśli chce się przestrumieniować dane. Mogę mieć np 2 GiB RAMu na serwerze, a przestrumieniować 100 GiB danych z bazy jednym żądaniem HTTP. Albo np mogę zrobić endpoint HTTP który generuje losowe dane w nieskończoność.