Co nowego na forum?

PiDev dodał post w PHP operacje na dacie

28 minut temu Błąd 1. Brak parametrów dla funkcji whitchWeek ! Błąd 2. return zatrzymuje Ci funkcj...

somekind dodał komentarz w Ocado - Wrocław

28 minut temu Znam to doskonale. Z drugiej strony, czasem lepszy jest brak dokumentacji niż słaba...

Shalom dodał post w zapytanie do serwera SQL

46 minut temu Znaczy ze db albo db.statement jest nullem. Nie zgaduj tylko UŻYJ DEBUGERA. On nie g...

Maciej Cąderek dodał komentarz w Jak uczyć się JavaScript? - przeczytaj, zanim zadasz pytanie na temat materiałów do nauki.

50 minut temu document.writeln() dodaje nową linię (możesz sprawdzić w dev toolsach). To html tak...

LukeJL dodał komentarz w Jak uczyć się JavaScript? - przeczytaj, zanim zadasz pytanie na temat materiałów do nauki.

50 minut temu Zapewne dlatego, że nowa linia w kodzie źródłowym HTML a nowa linia, która będzie wi...

Spine dodał komentarz w Gra "Snake" – problem z dodaniem segmentu po zebraniu punktu

59 minut temu Tetris to też gra "klockowa". Napisałeś: Nie mógłbym przecież w instrukcji do gry na...

matmax dodał komentarz w Jak uczyć się JavaScript? - przeczytaj, zanim zadasz pytanie na temat materiałów do nauki.

wczoraj, 23:59 A dlaczego gdy mam kod document.write(i) w pętli for od 1 do 10 to pokazuje mi w prz...

Silv dodał komentarz w Gra "Snake" – problem z dodaniem segmentu po zebraniu punktu

wczoraj, 23:58 Ale jak to się odnosi do tego wątku, bo nie rozumiem? ;)

maciejmt dodał post w Aktualizacja biosu w starym IBM Thinkpad

wczoraj, 23:56 Dorwałem starego laptopa Thinkpad 755CX. Chciałbym zaktualizować w nim bios do ostat...

Spine dodał post w Gra "Snake" – problem z dodaniem segmentu po zebraniu punktu

wczoraj, 23:55 Zobacz: Obracanie klocków w Tetrisie też nie jest logiczne i nie jest zgodne z prawa...

Silv dodał komentarz w Gra "Snake" – problem z dodaniem segmentu po zebraniu punktu

wczoraj, 23:55 @furious programming: oglądając mój post z obrazkiem, czuję się trochę, jakbym ogląd...

Silv dodał komentarz w Gra "Snake" – problem z dodaniem segmentu po zebraniu punktu

wczoraj, 23:53 Widziałem co prawda na YouTube w Excelu chyba Quake'a czy coś podobnego... Ale nie z...

WeiXiao dodał post w Na co zwrócić uwagę w trakcie studiów

wczoraj, 23:51 w końcu ktoś nieoderwany od rzeczywistości

Silv dodał komentarz w Gra "Snake" – problem z dodaniem segmentu po zebraniu punktu

wczoraj, 23:50 Design z Excela? Nie myślałem nawet o czymś takim. Na razie mam design z terminala.....

Silv dodał post w Gra "Snake" – problem z dodaniem segmentu po zebraniu punktu

wczoraj, 23:49 @Spine: ja niedokładnie to samo wywnioskowałem, ale sądzę, że chyba rozwiązałem prob...

Spine dodał post w Gra "Snake" – problem z dodaniem segmentu po zebraniu punktu

wczoraj, 23:45 Twój problem jest banalny do rozwiązania... Pobierz jakiegoś dobrego snake'a i zobac...

kixe52 dodał komentarz w Problem Undefined offset: 1

wczoraj, 23:43 Co kierowało Tobą gdy tworzyłeś ten temat w "Java" ?

robertos7778 dodał post w Problem Undefined offset: 1

wczoraj, 23:37 Wygląda na skomplikowany problem, na pewno w internecie nic o nim nie piszą. https:/...

robertos7778 dodał post w Na co zwrócić uwagę w trakcie studiów

wczoraj, 23:34 Uwagi słuszne, tylko mi osobiście nie podoba się utożsamianie studiów informatycznyc...

Grzegorz Rozicki dodał post w Problem Undefined offset: 1

wczoraj, 23:26 Witam. Mam pewien problem. Po próbie zalogowania na stronę wyrzuca mi błąd ErrorExce...

Popularne wpisy na mikroblogu

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..

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ę.

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ść.