Actions

Przykładowe ankiety ExpressionScript

From LimeSurvey Manual

This page is a translated version of the page ExpressionScript sample surveys and the translation is 100% complete.
Other languages:
Deutsch • ‎English • ‎Nederlands • ‎Tiếng Việt • ‎dansk • ‎español • ‎français • ‎italiano • ‎magyar • ‎polski • ‎română • ‎slovenščina • ‎български • ‎日本語


Wprowadzenie

Najlepszym sposobem nauczenia się korzystania z ExpressionScript jest zabawa z działającymi przykładami i modyfikowanie ich do własnych potrzeb.

Poniżej możesz znaleźć zestaw przykładowych ankiet, aby zademonstrować (i przetestować), w jaki sposób EM można wykorzystać do ulepszenia ankiety. Ankiety te można znaleźć w folderze /docs/demosurveys dystrybucji.


Trafność, krawiectwo i równania

Przegląd

Poniższy przykład oblicza BMI (wskaźnik masy ciała) każdego respondenta. Zobacz poniżej funkcje zademonstrowane w tym przykładzie.

Zademonstrowano funkcje EM

  1. Trafność - obsługa zaawansowanej logiki warunkowej;
  2. Piping / Tailoring - oferuje możliwość dopasowywania lub dostosowywania odpowiedzi i metadanych pytań;
  3. Dynamiczne krawiectwo - pamiętaj, że raporty zmieniają się na stronie w miarę odpowiadania na pytania.
  4. Mikro-Krawiectwo - warunkowe dostosowywanie w obrębie zdań i raportów przy użyciu instrukcji if()
  5. Równania - nowy typ pytania, który pozwala na wykonywanie obliczeń i przechowywanie wyników w bazie danych, nawet jeśli obliczenia są ukryte
  6. Walidacja warunkowa - walidacja kryteria, takie jak minimalna dopuszczalna wartość, mogą być warunkowe – np. oparte na równaniach.


Zrzuty ekranu

W tym przykładzie obliczany jest wskaźnik masy ciała, czyli obliczanie masy ciała i wzrostu w celu ustalenia, czy masz niedowagę, prawidłową wagę, nadwagę czy otyłość. Pamiętaj, że początkowo widzisz tylko cztery obowiązkowe pytania:


Tailoring1.jpg


Po wprowadzeniu informacji (i możliwości wyboru, czy chcesz używać jednostek metrycznych czy niemetrycznych), zobaczysz dostosowany raport podsumowujący wprowadzone dane i informujący o Twoim stanie wagi:


Tailoring2.jpg


Oto inny przykład, w którym zastosowano jednostki niemetryczne, aby pokazać, jak dynamicznie zmienia się wynik:


Tailoring3.jpg


Na poziomie wewnętrznym ukryte są Pytania typu równanie, które konwertują dane na metryki (jeśli to konieczne), przechowując wzrost metryki, wagę, BMI i stan wagi w bazie danych bez konieczności stosowania niestandardowego JavaScript .

W kolejnym zestawie przykładów możesz zobaczyć, jak możesz wykorzystać funkcje matematyczne i inne w ramach dostosowanych raportów. Tak wygląda strona przed wprowadzeniem jakichkolwiek danych. Istnieje logika warunkowa wyświetlająca puste komórki, jeśli nie wprowadzono żadnych (lub nienumerycznych) danych, zamiast pokazywać „NaN” lub „Podziel przez zero”.


Tailoring4.jpg


W miarę wprowadzania liczb raport na stronie zmienia się, pokazując wykonywane obliczenia i ich wynik.


Tailoring5.jpg


W tej przykładowej ankiecie jest wiele innych przykładów. Na przykład poniższy zrzut ekranu przedstawia jeden z kilkudziesięciu sposobów wypełniania strony Trafność dynamiczna. Jak podano w tekście pomocy, wypróbuj różne grupy wiekowe, a zwłaszcza nielogiczne kombinacje odpowiedzi, aby zobaczyć zabawne wiadomości wygenerowane na dole. Pamiętaj też, że jeśli powiesz, że masz więcej niż jedno dziecko, komunikat będzie brzmiał „Mam nadzieję, że będziesz się dobrze bawił ze swoimi X dziećmi”, a nie „Mam nadzieję, że będziesz się dobrze bawił ze swoim dzieckiem”. To pokazuje, jak możesz łatwo dostosować zdania, aby dopasować je do płci i/lub liczby badanych. Możesz nawet łatwo odmieniać czasowniki i odmieniać rzeczowniki na podstawie płci i liczby.


Tailoring6.jpg


Pobierz

Aby uzyskać dostęp do próbki ankiety, prosimy kliknąć na poniższy link: LS3_em_tailoring.zip.

Przykładowy spis ludności

Przegląd

To jest przykład spisu ludności, w którym pyta się, ile osób liczy Twoje gospodarstwo domowe.

Pokazuje, jak trafność na poziomie grupy może ułatwić wdrożenie „pętli” pytań. Po utworzeniu grupy dla Osoby 1 wyeksportowałem ją. Ponieważ zamiast kodu SGQA użyłem nazw zmiennych qcode, takich jak nazwa_p1, mogłem użyć edytora tekstu, aby szybko edytować i ponownie zaimportować grupę kilka razy (np. edycja i ponowny import każdej powtarzającej się grupy zajmowała około 10 sekund, zapewniając że wszystkie zmienne mają unikalne nazwy i że logika na poziomie grupy jest prawidłowa).

Możesz także skorzystać z funkcji Kopiuj pytanie, ale nie będzie to tak szybkie, jak opcja sugerowana powyżej.

Pokazuje to również, jak zapobiec wyświetlaniu komunikatu Zakończono do czasu rzeczywistego zakończenia ankiety (np. skompletowania wszystkich potrzebnych grup).


Zademonstrowano funkcje EM

  1. Istotność na poziomie grupy - Grupy kontrolne (Osoby 1-5) wyświetlają się tylko dla określonej liczby współmieszkańców;
  2. Krawiectwo - Podsumowanie raportu końcowego dane demograficzne każdego współmieszkańca;
  3. Progresywne wyświetlanie pytań - Niezależnie od tego, czy w trybie grupowym, czy w trybie „wszystko w jednym”, kolejne pytania pojawiają się dopiero po udzieleniu odpowiedzi na poprzednie.


Zrzuty ekranu

Badanie generuje dostosowany raport pokazujący dane demograficzne określonej liczby konkubentów:


Census.jpg


Jeśli przełączysz się na tryb pytań pojedynczo, zobaczysz, że indeks dostosowuje pytania. Ponieważ użytkownik stwierdził, że dana osoba jest kobietą, zadaje pytanie „Jak ma na imię”. A ponieważ odpowiedzieliśmy „Maryja”, następne pytanie brzmi: „Ile lat ma Maryja”?


Census2.jpg


Pobierz

Aby pobrać próbkę ankiety, kliknij tutaj: LS3_group_relevance.zip.


Filtry tablic kaskadowych

Przegląd

Niniejsza ankieta została opracowana w oparciu o projekt ankiety udostępniony dzięki uprzejmości Joy Lane Research, LLC.


Zrzuty ekranu

Poniżej zwróć uwagę, że:

  • Q02 pokazuje tylko zestaw produktów sprawdzonych w Q01 (przy użyciu array_filter)
  • Q02 pokazuje także „Inny produkt”, tekst wpisany w polu „Inna elektronika” w Q01
  • Q04 pokazuje tylko produkty z Q02, które zostały sprawdzone (a więc kaskady filtrów tablicowych)
  • Q05 pokazuje tylko produkty z Q02, które nie zostały sprawdzone w Q02 (przy użyciu kaskadowego wykluczenia array_filter_exclude)


Cascading array filter.jpg


Cascading array filter2.jpg


Pobierz

Aby pobrać powyższy przykład, kliknij poniższy link: Przykład ankiety LS2_cascading_array_filter.


Rurowanie/Krawiectwo przy użyciu wszystkich typów pytań i atrybutów

Przegląd

Jeśli nie wiesz, jak nazwać swoje zmienne (SGQA vs Qcodes), nie jesteś sam. Chociaż główna dokumentacja opisuje jak tworzyć nazwy zmiennych Qcode, nic nie przebije zobaczenia tego w działającej wersji demonstracyjnej. Ta ankieta pokazuje, jak uzyskać dostęp do atrybutów pytań i odpowiedzi za pomocą ExpressionScript.


Template:Uwaga


Treść

  • Przykłady każdego typu pytań
  • Wszystkie typy pytań, w których można użyć określenia „inne”, zostały uwzględnione, dzięki czemu można zobaczyć, jak wpływa to na nazewnictwo zmiennych
  • Wartości domyślne dla wszystkich typów pytań, które akceptują wartości domyślne
  • Dostosowywanie - Raporty na stronie i poza nią pokazujące wszystkie 16 dostępnych przyrostków notacji kropkowej EM.
  • Raporty te pokazują wszystkie aktualnie wprowadzone dane (pokazują więc, w jaki sposób można wygenerować własne raporty do wydrukowania dla użytkowników zamiast drukowania- ekran odpowiedzi)
  • Prawidłowe nazewnictwo wszystkich zmiennych w kodzie Qcode i SGQA


Zrzuty ekranu

To ogromna ankieta, dlatego zdecydowaliśmy się nie zamieszczać zrzutów ekranu. Zamiast tego pobierz i graj z nim.


Pobierz

Aby pobrać ankietę, kliknij poniższy link: LS3_EM_question_attributes.lss

Tradycyjna walidacja, przeprojektowana

Przegląd

To pokazuje wszystkie typy walidacji korzystające z wyrażeń i ich wpływ na każdy typ pytań obsługujący walidację. W wielu przypadkach wskazówki dotyczące walidacji zaczynają być ukryte i pojawiają się tylko wtedy, gdy pytanie nie spełnia kryteriów walidacji (w ten sposób znikają również, gdy pytanie przejdzie kryteria walidacji).


Pokazane typy walidacji

  1. min_num_value_n - minimalna wartość odpowiedzi
  2. max_num_value_n - maksymalna wartość odpowiedzi
  3. min_answers - minimalna wymagana liczba odpowiedzi
  4. max_answers maksymalna dozwolona liczba odpowiedzi
  5. multiflexible_min - minimalna dozwolona wartość odpowiedzi (dla pytania typu multiflexi number)! N!#multiflexible_max - maksymalna dozwolona wartość odpowiedzi (dla pytania typu multiflexi number)
  6. min_num_value - minimalna dozwolona suma wszystkich odpowiedzi na pytanie! N!#max_num_value - maksymalna dozwolona suma wszystkich odpowiedzi na pytanie
  7. equals_num_value - suma wszystkich odpowiedzi na pytanie musi być równa tej wartości

N !#validation - to jest walidacja wyrażenia regularnego dla pytania - może dotyczyć poszczególnych komórek


Zrzuty ekranu

Używając nowych stylów CSS, każdy typ sprawdzania poprawności wyświetla osobną wskazówkę. Jeśli są widoczne, można je ukryć za pomocą opcji hide_tip. Domyślną opcją jest pokazywanie ich czerwoną czcionką, jeśli pytanie nie spełnia kryteriów walidacji, i zieloną, jeśli je spełnia:


Validation1.jpg


Użytkownik nie może przesłać strony z błędami sprawdzania poprawności. Jeśli podał błędne informacje, zostanie natychmiast ostrzeżony:


Validation3.jpg


Walidację można zastosować do poszczególnych komórek w tablicy, tak jak w tym przykładzie, gdzie sprawdzanie wyrażeń regularnych zapewnia, że każdy wpis jest prawidłowo sformatowanym numerem telefonu w USA, łącznie z numerem kierunkowym.


Validation4.jpg


Pobierz

Aby pobrać powyższy przykład należy kliknąć na poniższy link: LS3_Validation_tests.zip.


Równania sprawdzające

Przegląd

Czasami potrzebujesz niestandardowej walidacji, której nie można osiągnąć przy użyciu tradycyjnych kryteriów min/max. W tym celu będziesz musiał użyć opcji em_validation_q i em_validation_sq, które pozwolą ci konstruować złożone równania walidacyjne odpowiednio na poziomie pytania i podpytania.


Template:Uwaga


Zademonstrowano funkcje EM

  1. em_validation_q - jest to równanie określające, czy całe pytanie jest ważne
  2. em_validation_q_tip - to jest komunikat wyświetlany w przypadku, gdy pytanie nie spełnia kryteriów em_validation_q! N!#em_validation_sq – jest to równanie określające, czy każde pytanie podrzędne (komórka tablicy) jest poprawne
  3. em_validation_sq_tip – to jest komunikat wyświetlany w przypadku wystąpienia z pytań podrzędnych jest nieprawidłowe.

Ogólnie rzecz biorąc, jeśli używana jest metoda em_validation_sq, jeśli jakakolwiek komórka jest nieprawidłowa, kolor tła tej komórki zmienia się na czerwony, aby wskazać, że wystąpił błąd.


Zrzuty ekranu

Sqvalidation.jpg


To pytanie gwarantuje, że wiek dzieci zostanie wprowadzony w kolejności malejącej, poprzez zastosowanie poniższego równania sprawdzającego:

q1_sq1 >= q1_sq2 && q1_sq2 >= q1_sq3 && q1_sq3 >= q1_sq4


Sqvalidation2.jpg




W poniższym przykładzie walidacja gwarantuje, że w danym wierszu zostaną udzielone odpowiedzi na nie więcej niż 3 pytania, poprzez zastosowanie poniższego równania walidacyjnego:

(suma(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= 3) && (suma(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= 3) && (suma(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) < = 3)

Można to także zapisać w następujący sposób. LimeSurvey automatycznie konwertuje go w czasie wykonywania na wyżej wymienione wyrażenie.

(suma(self.sq_A) <= 3) && (suma(self.sq_B) <= 3) && (suma(self.sq_C) <= 3)


Sqvalidation3.jpg


Pobierz

Aby pobrać próbkę ankiety wykorzystaną w powyższych przykładach należy kliknąć na link: ls2_test_em_sq_validation.lss.


Trafność podpytania

Przegląd

To pokazuje, jak array_filter i kryteria sprawdzania poprawności mogą współdziałać. W przypadku walidacji mających zastosowanie do sum uwzględniane są tylko istotne (widoczne) wartości.


Zademonstrowano funkcje EM

  1. filtr_tablicy
  2. wykluczenie_filtru_tablicy
  3. min_num_value
  4. maksymalna_wartość_
  5. równa_liczba_wartość

Pokazuje także dynamiczne raportowanie liczby pytań, na które udzielono odpowiedzi w pytaniach kluczowych.


Zrzuty ekranu

Zmiana liczby widocznych wierszy powoduje dynamiczną zmianę sumy. Oznaczenie pytania podrzędnego jako nieistotnego nie usuwa jego wartości. Raczej, jeśli jest to nieistotne, jego wartości nie przyczyniają się do żadnego równania.


Sqrel1.jpgSqrelver12.png


Zwróć uwagę, co się stanie, gdy zaznaczymy „Piąte pytanie podrzędne” dla pierwszego pytania „” „Które wiersze powinny pojawić się poniżej”” „”. Zwróć uwagę, że suma drugiego pytania „Wprowadź liczby” wynosi teraz 5. Mimo że pytanie podrzędne 5 dla tego pytania nadal ma wartość 14 (np. jeśli odznaczysz piąte pytanie podrzędne, ponownie zobaczysz wartość 14) , wartość ta nie wlicza się do sumy, ponieważ jest obecnie nieistotna. Wszystkie nieistotne dane są usuwane (w bazie danych mają wartość NULL) po przesłaniu, ale pozostają dostępne na stronie na wypadek, gdyby użytkownicy chcieli lub musieli zmienić zdanie na temat odpowiedzi.


Sqrel2.jpg


Pobierz

Aby pobrać nasz przykład, kliknij tutaj: ls2_subquestion_relevance.lss.


Używanie przecinka jako separatora podstawy (kropka dziesiętna)

Przegląd

ExpressionScript zapewnia, że w polach numerycznych można wprowadzać tylko prawidłowe liczby. Jeśli wpiszesz nieprawidłowy numer, zostaniesz ostrzeżony, że coś jest nie tak (np. w przypadku motywu owocowego całe pytanie jest „zaczernione”).

Należy pamiętać, że wartości liczbowe są zawsze konwertowane w bazie danych przy użyciu kropki jako separatora podstawy. W ten sposób analizy statystyczne będą działać prawidłowo.

Aby zmienić separator podstawy, przejdź do opcji Elementy tekstu znajdujących się w zakładce Ustawienia i poszukaj funkcjonalności znak dziesiętny.


Template:Uwaga


Typy pytań korzystające z separatora Radix

  1. Wprowadzanie numeryczne [ N]
  2. Wielokrotne wprowadzanie liczb [ K]
  3. Tablica (Liczby) [ :]
  4. Tablica (teksty) [ ;], przy użyciu atrybutu numbers_only
  5. Lista (radio) [ L], przy użyciu atrybutu other_numbers_only
  6. Krótki dowolny tekst [ S], jeśli używany jest atrybut numbers_only
  7. Wiele krótkich tekstów [ Q], jeśli używasz atrybutu numbers_only
  8. wielokrotny wybór [ M], przy użyciu atrybutu other_numbers_only
  9. wielokrotny wybór z komentarzami [ P], jeśli używany jest atrybut other_numbers_only


Zrzuty ekranu

Na poniższych zrzutach ekranu możesz zauważyć, że przecinek może być używany jako separator podstawy.


Radix1.jpg


Pobierz

Aby pobrać powyższy przykład, kliknij poniższy link: ls2_comma_as_radix_separator.lss.


Grupy losowe

Przegląd

Ta ankieta pokazuje, jak wykorzystać atrybut „random_group”.

Jeśli ten atrybut jest używany, przy każdym uruchomieniu ankiety kolejność pytań jest losowa. Jednakże po rozpoczęciu ankiety kolejność losowania pozostaje stała, nawet jeśli zmienisz język.


Zrzuty ekranu

Sprawdźmy wspólnie poniższy przykład. Pierwszym losowym pytaniem na stronie będzie pytanie Q1, Q4 lub Q7. Drugim losowym pytaniem na stronie będzie pytanie Q2, Q5 lub Q8.


Random1.jpg


Oto losowość wygenerowana podczas pierwszego testowania tej ankiety.


Random2.jpg


Kiedy po raz drugi testowałem ankietę, wygenerowano inną randomizację.


Random3.jpg


Kiedy jednak przeszedłem na język francuski (bez ponownego rozpoczynania ankiety), kolejność randomizacji pozostała niezmieniona.


Random4.jpg


Pobierz

Aby pobrać powyższy przykład, kliknij poniższy link: Randomization_Group_Test.lss


Losowo zadaj jedno pytanie na grupę

Przegląd

Ta ankieta pokazuje, jak skonfigurować ankietę, aby losowo wyświetlać jedno pytanie na grupę. Jest w nim 5 grup po 6 pytań każda. Na początku w Grupie 0 zapełnionych jest pięć ukrytych pytań z równania, zwanych Ask1-Ask5. Każde z nich ma wartość {floor(rand(1,6.9999))} w polu tekstowym pytania, co oznacza, że każda zmienna Ask1-Ask5 będzie miała wartość od 1 do 6. Następnie każde pytanie w grupie ma równanie trafności, takie jak „zapytaj1==N”, gdzie N jest N-tym pytaniem w grupie (więc trzecie pytanie w grupie 1 ma równanie trafności „zapytaj1==3”).

Ankieta ta działa równie dobrze w trybie ankiety pojedynczo, grupa po grupie i pytanie po pytaniu. Ponieważ randomizacja jest ustawiona w pierwszej grupie i ta grupa jest skutecznie ukryta (ponieważ wszystkie pytania typu Ask1-Ask5 są ukryte), randomizacja pozostaje taka sama dla podmiotu; ale każdy inny podmiot będzie miał odrębną randomizację.


Zademonstrowane funkcje

  1. Typ pytania z równania
  2. Funkcje losowe
  3. Funkcja warunkowa (jeśli)


Zrzuty ekranu

To jest Grupa 0, która używa Typ pytania równania do wybierania losowych wartości od 1 do 6 dla każdej grupy (z wyjątkiem ostatniej grupy, która ma tylko 4 pytania). Należy zauważyć, że funkcja „if()” najpierw sprawdza, czy zapytanie1 zostało już ustawione, a jeśli tak, używa tej wartości. Jeśli wartość nie została ustawiona, używa losowej wartości do ustawienia wartości Ask1.


Randq3.jpg


Ta grupa pokazuje, jak zmienna (ask4) z Grupy 0 służy do kontrolowania, które pytanie jest widoczne w czwartej grupie.


Randq2.jpg


Pobierz

Aby pobrać powyższy przykład ankiety, kliknij tutaj: Losowe pytania w przykładzie ankiety grupowej.


Zadaj losowo określoną liczbę pytań w grupie (podzbiór pytań)

Important.png  Dotyczy to tylko wszystkich losowych pytań z jednej grupy i tylko wtedy, gdy używany jest format Grupa po grupie lub Wszystko w jednym.



Przegląd

Ta ankieta pokazuje, jak zadać losowy podzbiór pytań w grupie. Na przykład pokaż 5 losowych pytań z 10 pytań znajdujących się w grupie.

Ankieta składa się z jednej grupy zawierającej 10 pytań. Do wszystkich pytań przypisana jest ta sama nazwa grupy randomizacji. W rezultacie będą one wyświetlane w losowej kolejności podczas ładowania strony. Każdemu pytaniu przypisane jest równanie istotności, które oznacza, że suma „relevanceStatus” wszystkich pozostałych pytań w grupie jest mniejsza niż liczba pytań, które chcesz wyświetlić. Ponieważ relevanceStatus jest przypisywany podczas renderowania pytań, w praktyce oznacza to sumę liczby poprzedzających pytań.

Zatem w naszym przykładzie 5 z 10 równanie Q1 wyglądałoby następująco:

suma(Q2.relevanceStatus, Q3.relevanceStatus, Q4.relevanceStatus, Q5.relevanceStatus, Q6.relevanceStatus, Q7.relevanceStatus, Q8.relevanceStatus, Q9.relevanceStatus, Q10.relevanceStatus) LT 5

W drugim kwartale wyglądałoby to tak:

suma(Q1.relevanceStatus, Q3.relevanceStatus, Q4.relevanceStatus, Q5.relevanceStatus, Q6.relevanceStatus, Q7.relevanceStatus, Q8.relevanceStatus, Q9.relevanceStatus, Q10.relevanceStatus) LT 5

I tak dalej...


Zademonstrowane funkcje

  1. zmienna trafnościStatus
  2. Losowa

Pobierz

Aby pobrać powyższy przykład, kliknij poniższy link: Przykład losowej ankiety 5 z 10.

Ocena wprowadzona przez użytkownika Lista produktów

Przegląd

Poniższy przykład pokazuje, jak możesz poprosić użytkowników o wystawienie zestawu produktów, które ich interesują, a następnie poprosić ich o ocenę tych produktów.


Zademonstrowano funkcje ES

  1. Dostosowywanie odpowiedzi - podczas oceniania produktów etykiety pochodzą z pola komentarza poprzedzającego pytania wielokrotnego wyboru
  2. Dopasowywanie skal - wiele zaawansowanych opcji pytań, takich jak nagłówki skali, może być również dostosowane.


Zrzuty ekranu

Ten obraz pokazuje, że ponieważ wybrano tylko produkty 1,3 i 5, wyświetlane są tylko te 3 (przy użyciu atrybutu array_filter). Ponadto etykietami wierszy w drugim pytaniu są albo numery produktów (jeśli nic nie zostało wpisane w polu komentarza), albo zawartość pól komentarza.


Mcc filter1.jpg


Ten obraz pokazuje, jak określone są dostosowane odpowiedzi:


Mcc filter2.jpg


Oto plik logiczny Show Logic dla tego pytania, który pozwala nam sprawdzić, czy logika warunkowa działa zgodnie z oczekiwaniami (np. aby sprawdzić, czy są jakieś błędy składniowe):


Mcc filter3.jpg


Następny obraz przedstawia grupę, w której określasz 5-punktową skalę ocen (Opcje 1-5), tytuł skali i produkty, które chcesz ocenić. Ostatnie pytanie pokazuje, że każdą część pytania tablicowego można dostosować:


Mcc filter4.jpg


Następny obraz przedstawia widok pliku logicznego ostatniego pytania. Jak widać, pytania podrzędne, odpowiedzi i nagłówki skali można dostosować.


Mcc filter5.jpg

Pobierz

Aby pobrać przykładową ankietę z powyższego, kliknij poniższy link: Przykładowa ankieta z oceną produktów wprowadzoną przez użytkownika.