Opublikowano

13,5 krok w aplikacji TAX FREE

Żeby się tak chciało jak się nie chce … Przede mną długi weekend majowy, trzeba pracować nad aplikacją, a jestem zmęczona jak długo wcześniej nie było. W pracy ogromny stres od końca poprzedniego roku, bo nikt nic nie wie co się z nami stanie. Nie wiem czy szukać nowej pracy, czy uczyć się nowego (między innymi dlatego wzięłam udział w konkursie żeby choć trochę nie myśleć o tej sytuacji). Jeszcze pomiędzy pracą a projektem dodatkowy angielski, jeszcze rodzina, jeszcze czas z nimi, bo nie można przegapić czasu jak dzieci są małe, jak się rozwijają. Tyle narzekania 🙂 Dałam sobie ostatnie 3 dni wolne (takie wolne że robimy remont, więc wolne od pracy umysłowej, jutro ciąg dalszy remontu), ale presja czasu że trzeba rozwijać projekt nie daje spokoju. Wiem że go nie skończę do końca konkursu, ale na pewno skończę do końca roku 2017, i to cały.

Napisałam tytuł 13,5 bo mało kodowania a dużo planowania w tym poście.

Plany na następne dni:

  • Uruchomić wysuwane menu
  • Załadować dane do obiektu klasy Rachunek
  • Spróbować stworzyć i zapisać dane do lokalnej bazy danych.
Opublikowano

13 krok w aplikacji TAX FREE

Jak pewnie oglądający zauważyli, w widoku DetailView z poprzedniego wpisu brakuje paska menu. I tu rada dla siebie i innych początkujących: ZAWSZE czytać dokumentację producenta! DetailView generuje się „w standardzie” z TableView, ale nie zawiera NavigationBar, ponieważ kontroller widoku modalnego nie jest dodawany do stosu nawigacji. Oczywiście trzeba dodać go ręcznie. Reszta zmian wkrótce. Teraz przyszedł czas na bazę danych.

Jak w aplikacji jest mało danych, które trzeba zapisać to można skorzystać z prostego rozwiązania do przechowywania danych – local storage i NSCodingu – protokołu umożliwiającego szybkie archiwizowanie obiektów i innych struktur. Archiwizowane obiekty można zapisać na dysku i pobrać później.

Ja chcę pójść o krok dalej i skorzystać z lokalnej bazy danych.

W systemie iOS dwie podstawowe technologie zapisu pamięci masowej dostępne dla programistów: Core Data i SQLite. Obie technologie mają zalety i wady w zależności od ilości i typu danych, które mają być przechowywane i zarządzane.

Core Data koncentruje się na obiektach, a nie na tradycyjnych podejściach opartych na tabelach. Podczas przechowywania danych przechowuje się zawartość obiektu, gdy obiekt jest reprezentowany przez klasę.

SQLite jest otwartą, lekką, z dobrym wsparciem, wieloplatformową, relacyjną bazą danych. SQLite przechowuje dane w tabelach, w których tabela zawiera jedną lub więcej kolumn, każda kolumna zawiera dane dla określonego typu danych.

SQLite:

  • SQLite jest lekki.
  • SQLite używa mniej pamięci i przestrzeni dyskowej.
  • SQLite może być żmudny i podatny na błędy kodu.
  • SQLite jest obsługiwany na Androidzie i Microsoft Windows Phone.

Core Data:

  • Potrzeba więcej czasu żeby go zrozumieć i nauczyć się.
  • Łatwiej pracuje się z obiektami.
  • Podstawowe informacje do przechowywania są obsługiwane automatycznie dzięki iCloud.

Ponieważ chcę w przyszłości przepisać tę apkę na Android, więc wybieram SQLite. Teraz trzeba przebrnąć przez tutoriale.

Opublikowano

12 krok w aplikacji TAX FREE

Przerobiłam cały pierwszy controller z UITableViewController na zwykły UIViewController, a w niego wstawiłam UITableView i uff… poszło. Dodatkowo przypięłam zdarzenia przycisków, pojedynczo, w pierwszym oknie bezpośrednio w kodzie. Jak wpisywałam zgodnie z przykładem z dokumentacji

window!.rootViewController = AppSearchBarController(rootViewController: AppFABMenuController(rootViewController: UIStoryboard(name: „Main”, bundle: nil).instantiateViewController(withIdentifier: „RootViewController”)))

to nie działało 😐

Teraz wygląda tak (gif zrobiony przy użyciu GIPHY CAPTURE):

Wstawiłam do projektu kod swipemenu: http://ashishkakkad.com/2015/09/create-your-own-slider-menu-drawer-in-swift/ , a potem przerobię wg początkowego wymyślonego projektu 🙂 Ale jest problem – u mnie wszystko dziedziczy z SearchBarControllera, więc jeszcze nie wiem jak to ugryźć razem ze swipemenu 😐

Następny krok to wreszcie zapis do lokalnej bazy danych.

Opublikowano

O unit testach i testach funkcjonalnych – Symphony

zdjęcie O unit testach i testach funkcjonalnych

O unit testach i testach funkcjonalnych

Dziś w prostych słowach o unit testach i testach funkcjonalnych w kontekście frameworka Symphony.
Jest taka biblioteka PHPUnit, która jest standardem do zapoznania się jeżeli chodzi o testowanie Symphony2 i powinna być wykorzystywana we wszystkich tworzonych projektach z Symphony2.

UNIT TESTY

Unit testy koncentrują się na zbadaniu poprawnego wywołania pojedynczej funkcji bez wywoływania innej funkcji (z tego samego testowanego projektu) – chodzi o to żeby nie wywoływać innej funkcji, bo nie wiadomo będzie która źle się wykona. W obiektowym kodzie, takim jak Symphony2, testowanie obejmuje klasę i jej metody. Przy pisaniu unit testów dane przypadki testowe powinny być zapisywane niezależnie od innych przypadków testowych, tzn. wynik testu B nie powinien zależeć od wyniku testu A. Taki sposób jest użyteczny przy tworzeniu tzw. mock obiektów, które w łatwy sposób sterują funkcjami testowymi. Mocking pozwala na symulowanie wywołania funkcji, zamiast jego wykonania. Przykładem byłoby testowanie klasy, która pokrywa zewnętrzny interfejs API. Taka klasa API może używać warstwy transportowej do komunikacji z zewnętrznym interfejsem API. Można zasymulować metodę żądania warstwy transportowej, aby zwrócić podane wyniki, a nie faktycznie wywoływać zewnętrzny interfejs API. Unit testy nie sprawdzają, czy składniki aplikacji działają prawidłowo, bo to sprawdzają testy funkcjonalne.

TESTY FUNKCJONALNE

Testy funkcjonalne sprawdzają integrację różnych elementów aplikacji, takich jak routing, kontrolery i widoki. Testy funkcjonalne są podobne do testów ręcznych, które można uruchomić w przeglądarce, np. kliknięcie na jakieś łącze i sprawdzenie czy pojawił się właściwy widok. Testy funkcjonalne umożliwiają zautomatyzowanie tego procesu.

Symfony2 zawiera wiele użytecznych klas wspomagających testy funkcjonalne obejmujące klasę Client, która jest w stanie zażądać stron i przesyłać formularze oraz DOM Crawler, które możemy wykorzystać do śledzenia odpowiedzi klienta.

Kolejnym ważnym tematem do zapoznania się przy testowaniu są procesy używające powyższych testów, takie jak Test Driven Development (TDD) i Behavioral Driven Development (BDD).

Napisanie unit testów i testów funkcjonalnych, moim zdaniem pozwala na oszczędzeniu jednego etatu w firmie – dla testera 🙂 Dodatkowo przy każdej zmianie w kodzie wcześniej napisane testy są ponownie wywoływane i najczęściej wykazują błędy niezauważone przez programistę.

Więcej o PHPUnit : https://phpunit.de/

Opublikowano

11 krok w aplikacji TAX FREE

Na początku nie doczytałam do czego służy ten SplitViewController, myślałam że będę miała od razu wysuwane menu, które przerobię na własną wizję. Niestety nie da się – chciałam dodać ToolBar, a tu się wysypuje. Po doczytaniu SplitViewController rozdziela 2 widoki: oddzielny na widok poziomy a oddzielny na poziomy. Oczywiście w zależności od urządzenia. W związku z tym przerabiam na zwykły StoryBoard, czyli zwykłą aplikację z tym samym widokiem dopasowującą się do rozdzielczości ekranu.

Po zostawieniu tylko UITableViewController jako inicjującego kontrolera, podpięłam rozwijane menu i StatusBar z biblioteki CosmicMind, ale nie mogłam podpiąć się pod przycisk rozwijanego menu ani pod przycisk menu, pomimo programowego przypięcia akcji:

newFABMenuItem.fabButton.addTarget(rootViewController, action: #selector(handleNewFABMenuItem(button:)), for: .touchUpInside)

Wydaje mi się, że problemem jest TableViewController, którego deklarację mogę zapisać tak:

class MasterViewController: UITableViewController==

class MasterViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

Nie wiem jak przechwycić zdarzenie z buttona i wskazać TableViewControllera jako delegata, ponieważ lekko zagmatwana dla mnie jest hierarchia w bibiotece Material (Cosmic Mind).

Jak widać powyżej będzie możliwość wyszukiwania, ale muszę się zastanowić co klient w pierwszej kolejności chce widzieć: nazwę sklepu, czy nazwę towaru który kupił? Po wejściu w szczegóły będzie miał możliwość na danych już wprowadzonych dodać kolejny dokument.

Opublikowano

Temat bardzo osobisty

 

Mam w zanadrzu jeszcze jeden temat osobisty, ale ściśle związany z programowaniem. Tym razem o związku damsko męskim 🙂 Tutaj programowanie też pomaga wbrew pozorom: w związku nigdy nie jest tak samo, raz jest dobrze, czasem źle. Mnie osobiście pomaga ucieczka w kod, bo ten świat wirtualny jest poukładany, równy, przewidywalny, piękny, wiadomo z grubsza co może mnie w nim spotkać. Lubię tu uciekać, to mój azyl. Przy okazji choć trochę poukłada mi się w głowie, przemyślę powiedziane słowa, czasem bolesne, próbuję zrozumieć powody kłótni i przyczyny sytuacji, staram się postawić i wczuć w drugą osobę. Ta druga osoba też ma swój świat wirtualny, też jest informatykiem, też ucieka w świat komputera, aby ukoić nerwy. Zazwyczaj rozumiemy się, on patrząc na mnie wie o co chodzi, i ja mam tak samo. Zostawiamy sobie dużo swobody (tak mi się wydaje).

I tak nam minie za 12 dni 11 lat 🙂

Opublikowano

10 krok w aplikacji TAX FREE

A jednak wróciłam do CosmicMind, mam teraz pływający przycisk na formularzu i douczam się jak dodać wysuwane menu, jeśli po wyświetleniu launchscreena ma się pojawiać lista już wprowadzonych dokumentów w klasie dziedziczącej z UITableViewController i korzystającej z UISplitViewController.

Cosmic Mind wystawia świetne przykłady, np: https://github.com/CosmicMind/Samples/blob/master/Projects/Programmatic/ToolbarController/ToolbarController/AppToolbarController.swift

Jest niestety jedno „ale” – wszystkie przykłady są dla doświadczonych IOS’esowców, bo nie da się tego wyklikać, tylko trzeba programistycznie zaimplementować na podstawie przykładów. Ale ja się nie poddam 🙂 jestem JUNIOREM i się nauczę.

Opublikowano

Czy 38-letni programista jest już stary

Temat na dzisiejszy wpis wzięłam z dyskusji z pracy, czyli czy 38-letni programista jest już stary czy jeszcze młody.

Cały weekend nie dawało mi to spokoju, zastanawiałam się czy to rzeczywiście prawda, że 38-letni programista jest już stary?

I tak jak w życiu – nic nie jest białe albo czarne, także i to. Trochę w tym prawdy, bo:

  • Nie wszystkim w tym wieku jeszcze się chce coś robić nowego i uczyć się nowego
  • Przyzwyczaili się do stanu obecnego i zaakceptowali, nawet jeśli jest im źle
  • Są w stanie zaakceptować brak podwyżek a nawet obniżki pensji, bo przecież „nikt ich nie zatrudni w tym wieku”
  • Trzeba im więcej zapłacić niż osobom wchodzącym na rynek pracy, bo się cenią
  • Osobom młodym łatwiej siedzieć po godzinach i w nocy ze względu na wiekszą wytrzymałość organizmu

Nieprawda bo:

  • Osoba w tym wieku ma duże doświadczenie i często szybciej zrobi coś co osoba tuż po studiach
  • Jest rozważna i na chłodno ocenia sytuację, bo jest już odporna na stres po tylu latach
  • Wzbudza większe zaufanie u klientów niż młoda osoba bez doświadczenia
  • Zna swoje możliwości i „mierzy siły na zamiary”
  • Wypracowała swój sposób realizacji projektów i wie ile czasu zajmie jej dany problem

A ja gdybym była pracodawcą dałabym szansę takiej osobie, bo może wniesie do firmy więcej niż takie „pokolenie googla” (przepraszam za to stwierdzenie osoby pracowite, które wiedzą że muszą się uczyć i rozwijać, a nie spoczywają na laurach i dyplomie uczelni oraz nie posługują się subiektywnymi opiniami przeczytanymi w internecie tylko wypracowują swoją własną). Dałabym szansę bo najczęściej zatrudniana osoba ma rodzinę i chce stabilizacji i nie odejdzie po roku z pracy. Da z siebie wszystko, bo jej zależy, bo lubi to co robi i nie zawsze pieniądze są wtedy najważniejsze (ale ma nadzieję że idą w parze).

A na koniec stary utarty slogan: „WARTO PODĄŻAĆ ZA MARZENIAMI” 🙂 Czy coś z tego wyjdzie? Jak nie spróbuję to się nie dowiem.

PS. Po miesiącu prowadzenia bloga stwierdzam, że lubię pisać, bo wtedy myśli mi się układają i na koniec już wiem czego chcę 🙂

Opublikowano

9 krok w aplikacji TAX FREE

Zastanawiałam się czy pisać w ogóle klasę Validator, bo potrzebne funkcje do walidacji mogę zawrzeć w DetailController. Będzie oddzielnie, ponieważ to klasa, którą mogę później wykorzystać w dowolnym miejscu w kodzie. Dodatkowo posiada metodę, która usuwa z pola tekstowego niedozwolone znaki oraz sprawdza czy NIP rzeczywiście jest polski.

I to na tyle sukcesów. Znów błąd (chciałam podpiąć zdarzenie wpisywania znaków do kontrolki, żeby wykorzystać obiekt Validator):

Ech, życie…

Zostawię to na razie, wezmę się do zrobienia slidera bocznego oraz floating button. Myślę,że (jak zawsze) rozwiązanie przyjdzie.