Temp (Rozmowa z IRCA 02.04.2014) - TrapperTeam/Trapper GitHub Wiki

<Kiryx> ja zaniżam tutaj średnią

<kuba85> jeszcze się wyrobisz

<Kiryx> z tego co pamiętam to pawła interesują dalsze milestony w traperze

<Kiryx> tzn, co jest teraz kluczowe do zrobienia w najbliższych tygodniach/miesiacach

<kuba85> pytanie czy osiągnęlismy jakis pierwszy?

<Kiryx> btw, kuba wysłał abstrakt na djangocon, także jak rozumiem czekamy na odpowiedź ?

<Kiryx> kwestia definicji :)

<kuba85> w zasadzie nie musimy chyba czekać

<Kiryx> na chwile obecną projekt nie jest w użytku z powodu na pewnie braki

<kuba85> zgadza się trochę nad tym siedziałem ostatnio i jak dopnę parę rzeczy to wrzucę na gita

<kuba85> generalnie nie zmienia się wiele jeśli chodzi o modele

<kuba85> Paweł: znasz angulara?

<pablow91> nie znam. przejrzałem tylko materiały na ich stronie

<kuba85> nie jest jakieś skomplikowane do ogarnięcia na podstawowym poziomie

<pablow91> z tego co widziałem to na razie nie ma tego w gicie?

<kuba85> nie

<kuba85> na razie sprawdzam jak to działa z django

<kuba85> całkiem nieźle korzystając z django-angular

<kuba85> kombinując to z http://angular-ui.github.io/ng-grid/ dostajemy dynamiczna tabele dla resourcow

<kuba85> sortowanie, filtrowanie, server-side paging, zanaczanie resourcow itd

<kuba85> rozumiem, że kojarzysz mniej więcej strukturę Resource -> Collection etc.

<kuba85> dobra może na początku fajnie by było gdyby Krzysiek podsumował co zostało zrobione do tej pory i jakie sa najsłabsze punkty

<Kiryx> Ok, czyli generalnie jest dobra podstawa całej struktury

<Kiryx> nie wiem na ile Paweł sie zaczytywałeś w modele, może nie ma tego nigdzie jawnie ładnie przedstawionego

<Kiryx> Resource to jeden materiał video/zdjęcie/audio itd

<pablow91> no tak, to widać od razu

<Kiryx> Collection to zbiór Resource

<Kiryx> i teraz z całym tym angularem chodzi o to

<Kiryx> że tworzenie takich kolekcji, wyświetlanie itd, grupowanie w resource mogłoby być łatwiejsze frontendowo niż jest teraz

<Kiryx> teraz jest tragicznie w zasadzie, ale jak chcesz posklejać kolekcje ze 100 stron resourców to jest ciężko

<Kiryx> dlatego dobrze byłoby filtrować takie rzeczy we frontendize, co sprowadzi się do wykorzystania własnie tej biblioteki

<kuba85> dokladnie, o ile backend jest chyba solidny to frontend na razie prawie nie istnieje

<pablow91> ale ogólnie zostaje zachowana backendowa struktura resource i collection, a tylko po stronie frontendu trzeba zrobić bajery

<pablow91> ?

<Kiryx> backend po drodze na pewno sie zmieni

<Kiryx> jest kilka pomysłów na to aby zrobić to sprytniej, np. traktowac Collection jako folder

<Kiryx> i pozwolić na tworzenie takich struktur drzewiastych

<Kiryx> tzn Collection to directory a resource to file

<kuba85> takie hierarchiczne kolekcje

<Kiryx> byśmy wtedy pewnie wynaleźli jakieś koło od nowa

<Kiryx> albo i nie - tutaj jeszcze nie wiemy

<Kiryx> potem jest kwestia tego co z tymi kolekcjami się robi

<pablow91> pewnie ktoś już takie rzeczy robił

<Kiryx> pewnie tak, trzeba tylko zważyć co się nam bardziej opłaca, może dopasowanie jakiejś bibliteki do naszych potrzeb będzie podobnie trudne jak napisanie tego samemu

<Kiryx> kolekcje podporządkowuje się do ResourceProject

<kuba85> inna sprawa, że może przy dobrze rozwiązanym interfejsie mozna olac te hierarchie

<Kiryx> no tak, z tego co pamiętam, argumentem za tym było właśnie łatwiesze ogarnianie tego chaosu, byćmoże nie będzie to potrzebne

<Kiryx> przykład ResourceProject to np. doktorat kuby (albo jego część), albo np. czyjeś badania do publikacji

<Kiryx> ResourceProject -> ResearchProject

<Kiryx> sorry

<Kiryx> czyli w takim ResearchProject ucześniczą jacyśtam użytkownicy, którzy mogą widzieć te a nie inne kolekcje itd (w skrócie permissiony)

<pablow91> no tak

<Kiryx> teraz w ResearchProject mogą istnieć ClassificationProjects

<Kiryx> tutaj te przypisane kolekcje są wykorzystywane do tworzenia mniejszych podprojektów klasyfikacyjnych, wówczas zwyczajni użytkownicy mogą oglądać jakis podzbiór filmów i je klasyfikować

<Kiryx> coś co nie istnieje, a będzie najciekawszą rzeczą w tym projekcie

<pablow91> ale to o czym mówisz to na razie są plany na przyłośc?

<kuba85> czyli w pewnym sensie ResearchProject to juz w zasadzie jest

<kuba85> sorry: to juz w zasadzie jest

<kuba85> tylko trochę jest tam bałaganu

<Kiryx> w tej chwili isntieje RP, i można klasyfikować, aczkolwiek nie jest to jeszcze tak zrobione "dla ludzi"

<Kiryx> np. anonimowy koleś powinien wejść na strone i dostać losowy materiał

<Kiryx> narazie jest to taka ściema, że masz liste wszystkich classification projects i możesz wybierać co klasyfikujesz

<kuba85> no i dużo innych drobnych rzeczy zarówno po stronie backendowej jak i frontendu

<Kiryx> to będzie dla project managerów, ale zwyczajni userzy powinni mieć do bólu prosty przycisk "get random resource"

<Kiryx> itd

<Kiryx> inna rzecz to cała warstwa wizualizacyjna na mapie

<pablow91> no czyli tak jak zazwyczaj :D

<kuba85> zgadza sie

<Kiryx> na chwile obecną jest to tylko proste mapowanie Resource - Location

<Kiryx> czyli materiał wideo może mieć współrzędne gps

<Kiryx> nie ma ciekawych rzeczy w stylu: Widzisz liste Resourców, filtrujesz je po czymśtam i na tym widgecie do mapy tworzą się warstwy

<Kiryx> np. warstwa "żubry", "jelenie" itd

<Kiryx> to że to są żubry i jelenie otrzymujesz z danych klasyfikacyjnych

<Kiryx> ale to też w zasadzie na przyszłość

<kuba85> mozna sobie wyobrazic, że każda kolekcja (lub zbior kolekcji) ma też jakiś 'coverage' zarówno czasowy jak i przestrzenny

<kuba85> to jest przyszłość

<Kiryx> :)

<pablow91> patrzę dużo jest pomysłów co mozna zrobić w projekcie, ale ogólnie nie ma jakiejś listy zadań jaką trzeba by wykonać niedługo?

<Kiryx> na chwile obecną wazne jest sprawdzenie tego angulara i sprawdzenie czy to rozwiąże problem z definiowaniem kolekcji

<pablow91> bo chyba najprościej byłoby mi wdrożyć się w projekt jak bym musiał coś zrobić i trochę w nim pogrzebać

<kuba85> jasne

<kuba85> Kiryx: to juz prawie rozwiazałem ;)

<Kiryx> wrzuć na gita pierwszą rzecz ktora będzie już działać, łatwiej bedzie takiego patcha przejrzeć niż takiego 2 tygodniowego ;)

<kuba85> ale pewnie można to bardziej elegancko rozwiązać

<kuba85> ok jak ogarnę ten chaos to zaraz wrzucę

<Kiryx> pablow91: Jesli chodzi o liste rzeczy to jest bardzo skromna lista tutaj: https://github.com/TrapperTeam/Trapper/issues?state=open

<Kiryx> natomiast jeśli nie wiesz za co sie złapać to możesz np. przejrzeć tego taska: https://github.com/TrapperTeam/Trapper/issues/15

<kuba85> myśle, że dobrym wprowadzeniem w projekt może byc tez opracowanie widoku tworzenia nowego ClassifcationProejct

<kuba85> bo Resourcy i Collection to prosta sprawa, a tam dalej robi sie ciekawiej

<Kiryx> ten task powyżej to ten koszyk/raw_id_field o którym gadaliśmy

<kuba85> aha

<Kiryx> pablow91: W skrócie chodzi o to że dodawanie resource do kolekcji na chwile obecną jest tragicznie rozwiązane, dzięki mojej inwencji :)

<pablow91> :)

<Kiryx> tzn, wpisujesz jakiś napis i ajaxem on podpowiada ci z listy Resourców te które pasują (nazwa + nazwa typu itd)

<kuba85> ja mam juz rozwiązanie ale może sie okazac do dupy zobaczymy, wiec w sumie wdrożeniowo można sie tym taskiem pobawic

<Kiryx> oczywiście jest to tragiczne, trzeba by to zrobić jako raw_id_field

<Kiryx> tyle że jak pewnie zauważyłeś, bardzo oszczędnie korzystamy z django admina

<Kiryx> :)

<Kiryx> była to jak pamiętam moja decyzja, możliwe że mało trafna

<Kiryx> w każdym razie, wiesz jak działa raw_id_field w django -> zamiast tych widgetów do zaznaczania z Ctrl, masz ikonke która otwiera popup z listą M2M i checkboxami

<pablow91> dla sprawdzarki wykorzystywaliśmy tylko panel admina (do celów administracyjnych) - niektóre rzeczy były strasznie upierdliwe :D

<Kiryx> coś dodać tam customowego jest męczące

<pablow91> tak wiem o czym mówisz

<Kiryx> ale z kolei przepisywać admina to też słabo

<Kiryx> no ale założyliśmy że chcemy mieć kontrole i sie kiedyś nie obudzić że nie da sie czegoś zrobić

<kuba85> moje rozwiazanie teraz: przeklikujesz sobie te resourcy, które chcesz dodac do kolekcji w resource_list (+ ng_grid), te zaznaczone zapamiętujesz i potem odpalasz akcje 'create collection', pojawia sie formularz uzupelniasz pola, rsourcy dodawna so z automatu z tej zmiennej i wysylasz formularz ajaxem

<kuba85> fajne jest ze mozesz jendoczesnie tworzyc kolekcje i filktrowac resourcy

<Kiryx> cyzli chcesz tego taska rozwiązać też za pomocą ng_grid ?

<Kiryx> tzn, ma to sens, ale wtedy ten task jest nie do ruszenia dopoki ty nie wrzucisz patcha

<kuba85> no daltego propozycja stworzenia widokow interfejsu do zakladania nowych ClassificationProjects

<Kiryx> aha, no dobra

<kuba85> tam jest ciekawie z FeatureSetami itd

<Kiryx> to jeśli sie zgodzicie, możemy o tym pogadać i paweł jak będize miał czas to sproboje coś z tym zrobić (z tego co wiem to w najbliższe tygodnie bedziesz troche zajęty?)

<pablow91> dla mnie może być

<Kiryx> w sumie ten cały problem jest ciekawy bo dotyczy całej tabelki klasyfikacyjnej

<Kiryx> ok, to ja powiem o co chodzi

<pablow91> co do moich terminów to w najbliższy weekend powinienem mieć luz i mogę się zająć taskiem, potem to zależy od wyników rekrutacji

<pablow91> a w tej chwili istnieje jakiś sposób na zakładanie ClassificationProjects czy tylko z poziomu djangowego admina?

<pablow91> bo nie za bardzo widzę taką opcje

<Kiryx> jak wejdziesz w ResearchProject i klinijesz na Detailsy

<kuba85> zaraz wracam (5min)

<Kiryx> masz liste projektów i opcje dodania nowego

<pablow91> ok mam

<Kiryx> i tam jest kilka rzeczy

<pablow91> czyli ResarchProject jest kontenerem dla Classification projects?

<Kiryx> Collection to podzbiór kolekcji z ResearchProject które będą klasyfikowane

<Kiryx> ^ tak

<Kiryx> I już pierwszy bug: W tym dropdownie powinny być brane kolekcje które są w danym ResearchProject

<Kiryx> na samym początku Kolekcje należały do ClassificationProject

<Kiryx> i można było do klasyfikacji dodać jego własne kolekcje

<Kiryx> na chwile obecną możesz wybrać dowolne kolekcje, tak oczywiście nie powinno być

<pablow91> ale może być tak, że dana kolekcja będzie należała do wielu resarch projects?

<Kiryx> ten widok jest przeklejony ze starej wersji, także najsensowniej będize to chyba napisać od nowa jeśli chcesz

<kuba85> tak

<Kiryx> tak, i to jest kolejna rzecz która wymaga dyskusji

<Kiryx> oryginalny autor kolekcji może ją edytować i wtedy zmienia się ona wszystkim

<Kiryx> teraz powinno być już tak że dodanie kolekcji robi jej kopie dla projektu

<kuba85> albo inaczej

<kuba85> tzn nie kolekcje wymagaja faktycznie kopii

<kuba85> z kolei na poziomie poj resourcow jak owner chce ususnac a resource jest wykorzystywany w innych kolekcjach (niekoniecznie zwiazanych z projektem) to przenosimy do archiwum

<Kiryx> archiwum ?

<pablow91> a owner może zmieniać resource po jego dodaniu, czy musi usunąć stary i utworzyć nowy?

<kuba85> ale moze nie ma to sensu jak juz jest kopia

<kuba85> archiwum - np. jest user 'archive' ktory staje sie ownerem resourca

<kuba85> w tym momencie owenr moze zmieniac

<Kiryx> ja bym już ustawił ownera na null itd, i dodał jakis abstrakt albo flage "archived"

<kuba85> spoko

<Kiryx> pablow91: generalnie, o co byś nie zapytał w tym projekcie, można o tym jeszcez przedyskuwać i wpaść na coś nowego :)

<pablow91> to ja mam takie pytanie zanim za mocno od tematu odpłyniemy

<kuba85> trochę tak jest niestety

<pablow91> ten widok dodaniwa nowego klasyfikatora to ma posiadać te same pola co teraz

<pablow91> tylko zrobione tak, żeby łatwiej było wszystko wybierać?

<Kiryx> nie te same

<Kiryx> wląśnie, bo troche odpłyneliśmy

<Kiryx> było tak: CP (ClassificationProject) miał pola M2M: collecitons, users

<Kiryx> users to byli "admini" danego CP

<Kiryx> teraz CP adminów dziedziczy (niejawnie) z RP (ResearchProject)

<Kiryx> czyli wszystkie role są z automatu takie jak ma RP który jest ojcem CP

<Kiryx> zatem nie powinno tam być już user

<Kiryx> collection zostaje bo nie wszystkie kolekcje z RP z automatu chcemy klasyfikować

<Kiryx> czyli CP ma m2m collections

<Kiryx> z tym polem trzeba powalczyć tak aby był inicjalizowany zasobami własnie z RP

<kuba85> dodajac kolekcje do CP mozemy korzystac tylko z kolekcji które już są w RP

<pablow91> no to jasne

<Kiryx> ok, teraz jest pole feature sets

<pablow91> a to, że w tej chwili wyświetlane są tylko dwa pola na kolekcje to przypadek (w sensie powinno być dowolnie duzo?)

<Kiryx> aby powiedziec o co z tym chodzi musze ci pokazac jak działa tabelka klasyfikacji

<Kiryx> powinno być tak jak w django admin, tzn masz 1 puste pole + guzik AddMore

<pablow91> ok

<Kiryx> walczyłem z tym pare dni i okazało się że poza copy/paste nie ma nic ciekawego

<Kiryx> bo to przyda sie też do innych formularzy

<Kiryx> przez copy/paste rozumiem copy/paste z django-admin

<Kiryx> ale może coś przeoczylem - w zasadzie to coś znalazlęm anwet ale nie działało - możliwe że głupi błąd

<pablow91> jak rozumiem copy paste idei z django-admin a nie kodu?

<kuba85> crispy-forms + crisdpy-extensions

<Kiryx> copy paste javascriptu

<Kiryx> bo ogólnie to jakieś tam przechodzenie po drzewie HTML o odpowiednich ID, kopiowanie węzła itd

<Kiryx> w sumie zrobiłęm to ręcznie raz jak pisalęm tabelke klasyfikacyjną

<Kiryx> zatem przejdzmy do tej tabelki, i wtedy powiem ci jak działa ten Feature Sets

<Kiryx> chyba że już wiesz

<Kiryx> jak wejdziesz sobie Media classification > Classify material

<pablow91> ok jestem

<Kiryx> i zobaczysz jakie masz pola do wyboru dla audio / image i video

<Kiryx> czyli zobacz tabelke w audio i image

<Kiryx> audio ma count przybliżony, video ma pole do wpisania

<pablow91> widzę

<Kiryx> akurat tutaj nie ma tego, ale audio może mieć jakieś pole które nie ma sensu dla obrazka

<Kiryx> itd

<Kiryx> to wszystko jest definiowane per typ materiału

<Kiryx> i też nie na sztywno

<Kiryx> tylko w projekcie klasyfikacyjnym

<Kiryx> tzn, jak tworzysz projekt, powinieneś móc powiedzieć

<Kiryx> w tym CP, Obrazki mają cechy: wiek:{young, old}, count: text_input, gender{F,M}

<Kiryx> i każdy materiał image ma odpowiednie pola w tabeli

<pablow91> w sensie wybierasz jeden feature set dla obrazków, jeden dla audio i jeden dla wideo?

<Kiryx> tak

<Kiryx> i teraz jest taka zależność

<Kiryx> FaetureSet skłąda się ze zbioru Feature

<Kiryx> Feature to właśnie "wiek" które jest typu "String" (wyświetla się dropdown) albo "Int" (wyświetla się text input)

<Kiryx> w zasadzie są dwie opcje

<Kiryx> mimo że w modelu Feature masz jeszcze typy Float i Boolean

<pablow91> według modelu są 4 opcje :D

<pablow91> no własnie

<Kiryx> to Float chyba powinien być równoważny z Int,

<Kiryx> no ale narazie niech nie będzie

<Kiryx> na formularzu masz w zasadzie dropdown albo input

<pablow91> a potem pojedyncza odpowiedź zapisywana jest w FeatureAnswer?

<Kiryx> tak

<pablow91> w postaci stringu?

<Kiryx> tutaj jest mało elegancko

<Kiryx> jeśli jest to text input to jako string w "value" w FeatureAnswer

<Kiryx> jeśli inne (czyli jakiś enum) to jako id FeatureScope

<Kiryx> czyli tak

<Kiryx> FeatureSet zawiera Feature

<Kiryx> Feature ma wartość + jakis FeatureScope, np

<Kiryx> Feature: Age, FeatureScope: Old, Young

<Kiryx> FeatureAnswer może mieć FK do Age + value=0 czyli jest to odpowiedź "Old"

<Kiryx> Feature: Count (typu Int), FeatureScope: pusty

<Kiryx> FeatureAsnwer ma FK do Count, i value=5, czyli odpowiedź "5"

<Kiryx> chujowe :)

<Kiryx> co jest slabe tutaj że pojedzyncza klasyfikacja (całość), to może być anwet 10-15 krotek w bazie

<pablow91> nom

<pablow91> widać, że baza danych się krztusi na tym

<Kiryx> inne rozwiązanie to cała klasyfikacja w stringu jako JSON czy coś takiego

<pablow91> tak naprawdę to najłatwiej byłoby jakiegoś nosql użyć, ale pewnie za duże działo na to :D

<Kiryx> myslelismy o tym

<Kiryx> tzn dokladnie o hstore

<Kiryx> czyli taki prosty słownik

<Kiryx> https://github.com/TrapperTeam/Trapper/issues/6

<Kiryx> z nosql jest taki problem że szybko sie selecta robi

<Kiryx> ale dłużej update

<Kiryx> aczkolwiek tutaj może ten argument naewt nie działa i poprostu jakiś nawet JSON by zadziałał, ale wtedy każda edycja FeatureSet będzie wymagała updatu wszystkich tych klasyfikacji

<Kiryx> co byćmożę jest sensowniejsze niz join po 4 tabelach żeby tylko wyświetlić wyniki klasyfikacji ;)

<pablow91> :D

<pablow91> no joiny na pewno nie wpływają dobrze na wydajność

<Kiryx> tak, pytanie tylko jak często chcesz to robic

<Kiryx> jak chcesz po 2 tygodniach tylko zebrać statystyki

<Kiryx> to nie boli

<Kiryx> jak chcesz tam zaglądać i to szybko i często, to chujowo

<kuba85> raczej szybko i często

<pablow91> o ile czas generacji będzie rósł liniowo, a nie szybciej

<kuba85> z kolei nie sądzę żeby FeatureSet'y były edtytowane za często

<Kiryx> tutaj jest właśnie jedna z tych kwestii do porozmawiania - jak lubisz backend, to może być ciekawy problem dla ciebie :)

<Kiryx> <kuba85> z kolei nie sądzę żeby FeatureSet'y były edtytowane za często <- jeśli tak to hstore/nosql czy coś takiego tutaj zadziała lepiej

<Kiryx> no więc wracając do formularza CP

<pablow91> no własnie chciałem to napisać :)

<Kiryx> dobrze by było podczas tworzenia tego formularza móc sobie podefiniować te FeatureSety Scopy itd

<Kiryx> może coś w stylu django-admina czyli otwiera sie nowa strona

<Kiryx> nie wiem jak łatwo to można zrobic, byćmoże bardzo łatwo

<kuba85> dokladnie w zasadzie trzeba zdefiniowac wszystko po kolei per CP

<Kiryx> nieważne jak będize wyglądała klasyfikacja kiedyś

<kuba85> albo jakis wizard

<Kiryx> definicja w bazie tego typu raczej ma sens

<pablow91> ale powinny być trzy "pola" : Image FeatureSet, Video, Audio i klikasz obok nich w jakiś przycisk i wyskakuje okno do wyboru/stworzenia tego zbioru cech

<Kiryx> bo JSON i tak trzymałby chyba ID do FeatureAnswer a nie napisy

<pablow91> bo teraz jest lista wyboru co nie jest do końca przejrzyste (przynajmniej dla mnie)

<kuba85> nie jest i mozna to rzowiazac na rozne sposoby, ale to co proponujesz ma sens

<pablow91> ale jeden FeatureSet może być przyporzątkowany zarówno do Image lub np. Video

<Kiryx> ok, patrzyłem czy typ resource jest już na sztywno: kiedyś typ resource był też definiowany, tzn za rok można było dodać np. typ "3DProjection" albo "HeatMap" czy coś takiego

<Kiryx> teraz zakładamy tylko obrazek, wideo i audio

<Kiryx> wiec tak, można to rozwiązać jakoś 3 pola

<Kiryx> tak, to działa w ten sposob że poprostu dany CP ma jakis tam podzbiór feature setów

<Kiryx> i jak chcesz klasyfikować jakieś audio, to on patrzy czy ma w tej pojedynczej liście jakis FS który sie zgadza z typem

<kuba85> w sumie to jest trochę słabe jednak, że mamy tylko 3 typy resourcow

<Kiryx> tzn, mamy to jako choices

<Kiryx> czyli na sztywno

<Kiryx> mozna będize w traperze 1.5 dodać nowy typ

<Kiryx> tyle że nie z bazy

<kuba85> ok możemy sobie 'dopisac' nowe typy

<Kiryx> to raczej nie jest coś co chcesz mieć elastyczne per project ?

<kuba85> nie

<Kiryx> każdy typ resource i tak wymaga dopisania odpowiedniego playera audio/ video / 3d do frontendu

<kuba85> no wiem upload, wyciaganie nmetadanych etc

<Kiryx> ja jestem ostrożny z trzymaniem w bazie rzecyz które w perspektywie 5 lat będą miały i tak 3-4 możliwości

<Kiryx> bo to sie potem kumuluje do przekombinowanego systemu

<Kiryx> ale może sie myle..

<Kiryx> nie wiem

<kuba85> zgadzam się

<kuba85> jak juz wszystko jasne odnosnie tego CP to ja bym jeszcze zamieszał troche jak mozna ;)

<pablow91> jeszcze tylko detale implementacyjne

<pablow91> bo pisałeć coś o crispy-forms

<pablow91> no i co w końcu z tym angularjs

<kuba85> no Krzysiek nie korzystal z crispy ale to chyba jest niezly app

<Kiryx> ja musze zaraz spadać, zapisze tą rozmowe gdzieś publicznie do referencji (github wiki) i potem sie wypunktuje wazne rzeczy

<kuba85> tez musze spadac ;)

<Kiryx> o ile sie zgadzacie, wiki jest publiczne

<pablow91> mi nie przeszkadza :)

<Kiryx> przeklejanie loga czatu to amatorka, ale teraz nie mam czasu wydobyć esencji z tego ;d

<Kiryx> a właśnie

<Kiryx> daj login na github to cie dodam do repozytorium

<kuba85> angularjs - wg. mnie jak to się rozpracuje w kombinacji a djangoi to ułatwi to budowanie skomplikwoanych interfejsow (bo takie będą)

⚠️ **GitHub.com Fallback** ⚠️