Archiwum kategorii: Programowanie

Podstawy Scruma

Niedawno miałam przyjemność uczestniczyć w bardzo ciekawym szkoleniu na temat metodyki Scrum. Dowiedziałam się m.in. jakie są podstawy Scruma.

Podstawy Scruma

Foto: moje, 2017

Podstawy Scruma

Sam Scrum pewnie znany jest większości osób, które mają styczność z wytwarzaniem oprogramowania. Myślę, że metodyka ta swoją popularność zawdzięcza głównie temu, że narzuca pewną strukturę zarządzania pracą/czasem/zespołem, jednocześnie dając wolność adaptacji do własnych potrzeb. Cechy te podkreślają filary, na których opiera się Scrum, zwłaszcza ostatni:

  • Transparency – przejrzystość
  • Inspect – inspekcja
  • Adapt – adaptacja!

Podstawową wiedzę na temat Scrum warto czerpać z oficjalnego podręcznika. Jest dostępny po polsku tutaj: http://scrumguides.org/docs/scrumguide/v2016/2016-Scrum-Guide-Polish.pdf. Kopia: [2016-Scrum-Guide-Polish]

Framework

Scrum to framework – co to oznacza w praktyce? Podręcznik przedstawia to tak: Scrum to „baza”, ramy, na których zespół buduje swoją własną „implementację”. Na bazę składa się naprawdę niewiele elementów. Są to:

  • Zespół i role: Product Owner, Scrum Master oraz zespół developerski: programiści, testerzy, graficy, analitycy biznesowi itd.,
  • Zdarzenia: Sprint (przebieg), Sprint Planning (planowanie przebiegu), Daily Scrum (jak idzie praca nad celami?), Sprint Review (demonstracja i inspekcja przyrostu pracy), Sprint Retro (czego się nauczyliśmy?),
  • Artefakty: Product Backlog, Sprint Backlog i cel Sprintu,szkolenia scrumowego
  • Reguły: łączące wszystkie elementy tej układanki.

Dodatki

Pozostałe praktyki, jakie często kojarzone są ze Scrumem, są tylko dodatkiem, implementacją, zestawem dobrych praktyk. Nie są składnikiem frameworka. Przykłady:

  • Planowanie Sprinta za pomocą kart do Scrum pokera,
  • Pozycja stojąca podczas Daily Scrum,
  • Spotkania groomingowe – backlog refinement to nie tylko spotkania, ale także praca własna nad backlogiem! Zespół powinien spędzić nad tym tematem 10% czasu, przygotowując się do kolejnego sprintu – ten czas można przeznaczyć np. na szukanie technologii do realizacji przyszłych zadań itd.

Ciekawą rzeczą, jaką wyniosłam ze szkolenia była informacja, że podczas Sprintu zespół powinien dostarczyć całą, lecz uproszczoną funkcjonalność! Niedopuszczalne jest zatem np. wykonanie części prac w bazie danych, ale niezrobienie niczego w interfejsie. Zadania powinny być zatem upraszczane, a nie dzielone. Ciekawa zasada, chyba nie zawsze jednak respektowana.

Prosta walidacja maila w C#

Żeby sprawdzić poprawność adresu email, wcale nie trzeba męczyć się ze skomplikowanymi wyrażeniami regularnymi. W C# walidacja maila jest prosta – z pomocą przychodzi klasa MailAddress. Oczywiście jest to rozwiązanie wysokopoziomowe i wolne (rzuca wyjątki). Zapewnia jednak czytelność kodu.

Przykład (zaczerpnięty ze StackOverflow):

bool IsValid(string emailaddress)
{
  try
  {
    MailAddress m = new MailAddress(emailaddress);
    Console.WriteLine("TRUE" + "\t" + emailaddress);
    return true;
  }
  catch
  {
    Console.WriteLine("FALSE" + "\t" + emailaddress);
    return false;
  }
}

Testy – walidacja maila:

IsValid("ok@ok.pl");
IsValid("dolores.ryba@poczta-n.pl");
IsValid("dolores.ryba@poczta.odlotowa.pl");
IsValid("dolores.ryba@a.b.c.d.pl");
IsValid("psikus@dot.dot.dot..pl");
IsValid("@");
IsValid("");
IsValid(null);
IsValid("bad@");
IsValid("@wolf");
IsValid("@poczta.pl");
IsValid("cokolwiek");

Czytaj dalej

Parsowanie ciągu znaków do double w C

Parsowanie ciągu znaków do double jest osiągalne w C dzięki funkcji strtod. Jest to dość stara funkcja, obecna w standardzie C90 (z roku 1990).

Składnia to:

double strtod (const char* str, char** endptr);

 

Przykład:

char* pEnd;
double d1;

d1 = strtod ("3.14", &pEnd);
cout << d1 <<endl;//3.14

d1 = strtod ("12,34", &pEnd);
cout << d1 <<endl;//12

d1 = strtod ("-1.55211e-016", &pEnd);
cout << d1 <<endl;//-1.55211e-16

d1 = strtod ("8.67548e-017", &pEnd);
cout << d1 <<endl;//8.67548e-17

d1 = strtod ("8.67548e+1017", &pEnd);
cout << d1 <<endl;//inf

d1 = strtod ("abc", &pEnd);
cout << d1 <<endl;//0

d1 = strtod ("", &pEnd);
cout << d1 <<endl;//0

d1 = strtod (NULL, &pEnd);
cout << d1 <<endl;//exit!

Jaki framework do PHP?

Jakiego frameworka użyć? To pytanie często pada na początkowym etapie projektu. Przyjrzyjmy się rozwiązaniom dla języka PHP.

Od jakiegoś czasu najpopularniejszym frameworkiem dla PHP jest Laravel. Widać to np. na porównaniu SitePoint:

Inny sposób sprawdzenia popularności danej technologii to np. sprawdzenie ilości pytań na StackOverflow 😉 Wiadomo, nie jest to miarodajne porównanie, ale daje jakiś ogląd sytuacji.

  • Laravel – 49.306
  • CodeIgniter – 49.135
  • Symfony – 43.769
  • CakePHP – 27.412
  • Yii – 15.315
  • Kohana – 2.177

Są to jednak dość rozbudowane narzędzia. Alternatywą są te dwa frameworki. Ich autorzy zapewniają, że zależy im na zachowaniu prostoty użycia. Mogą być więc dobrym wyborem na początek przygody z używaniem frameworków w PHP:

Lista TODO w Visual Studio

Visual Studio posiada całkiem ciekawą funkcjonalność. Umożliwia budowanie listy zadań w oparciu o linijki kodu oznaczone komentarzem:

//TODO

Visual Studio wyświetla je w zakładce „Task List”. Zadania można filtrować po projekcie i pliku.

Pamiętajmy jednak, że tego typu komentarze stanowią antywzorzec;) Jeżeli natomiast przed wrzuceniem kodu do repozytorium rozwiążemy wszystkie zadania oznaczone tym tagiem – nie widzę przeciwwskazań, by korzystać z tej funkcji.

MySQL – dump tylko określonych wierszy

MySQL umożliwia wykonanie dumpa tylko określonych danych. Dzięki temu można np. podzielić dumpa jednej, dużej tabeli na parę mniejszych części. Służy temu przełącznik --where.

Przykład 1 – wykonujemy dump tabeli myVeryBigTable, lecz tylko takich wierszy, które mają id 1, 2 lub 3:

mysqldump myDatabaseName --host 127.0.0.1 --port=3306 
--user=myUserName --password
myVeryBigTable
--where="id in (1,2,3)"
> .\mySimpleDump.sql

Przykład 2 – możliwe jest także wykonanie nieco bardziej skomplikowanego zapytania:

mysqldump myDatabaseName --host 127.0.0.1 --port=3306
--user=myUserName --password
myVeryBigTable
--where="id in (select id from myOtherTable where objectId in (123,558,6987))"
> .\myDump.sql

Netbeans nie aktualizuje aplikacji www

Pracując przy aplikacji webowej (napisanej w Javie) natknęłam się na problem nieaktualizowania aplikacji przez Netbeans. Proces kompilacji udawał się, jednak na serwerze nadal była stara zawartość. Z jakiegoś powodu nie udało się zaktualizować kodu.

Rozwiązaniem było ręczne usunięcie folderu web/web-inf/classes. Po usunięciu katalogu i przebudowaniu projektu Netbeans aktualizował zawartość plików.

Qt i problemy z atof()

W projekcie, nad którym aktualnie pracuję, natknęłam się na pewien problem, który spowodował nieprawidłowe działanie dużego fragmentu aplikacji napisanej w C, dołączonej do interfejsu implementowanego w Qt (używam wersji 4.8.0, choć nie ma to zbyt wielkiego znaczenia).

Okazało się że część analityczna programu używała  w wielu miejscach funkcji atof() do przekształcania liczb zapisanych w pliku w postaci ddd.ddd (separatorem była zatem kropka).

#include <cstdlib>
double atof( const char * str );

Funkcja nie odczytywała części dziesiętnych z powodu nieprawidłowego traktowania separatora. Ten poważny błąd, uniemożliwiający działanie całego programu wystarczyło naprawić jedną linijką:

setlocale(LC_NUMERIC,"C");

Linijkę tę należy umieścić w pliku main.cpp, tuż po utworzeniu obiektu typu QApplication. Teraz mój plik wygląda następująco:

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    setlocale(LC_NUMERIC,"C");

    MainWindow w;
    w.show();

    return a.exec();
}

I – wszystko działa 🙂