Archiwum kategorii: Programowanie

Przekazywanie parametrów do funkcji w C++. Ściągawka

Kontynuując temat z poprzedniego wpisu, Wskaźniki w C++, referencje. Ściągawka, dziś ciąg dalszy. Jak wygląda przekazywanie parametrów do funkcji w C++? Jak przekazać wartości do funkcji, aby można było zmodyfikować wartość parametru?

Pierwsze, co przychodzi do głowy to coś takiego – zwykłe przekazanie parametru jako wartość:

Przekazywanie parametrów przez wartość

Co tu się jednak stało? Czytaj dalej

Wskaźniki w C++, referencje. Ściągawka

Wskaźniki w C++ są chyba najbardziej problematycznym elementem tego języka dla początkujących programistów. Przygotowałam krótką ściągawkę z najważniejszymi informacjami na temat wskaźników, referencji i klas w C++.

Wskaźniki w C

Wskaźnik. Foto: moje, marzec 2018

Czym są wskaźniki w C++?

Wskaźnik – zmienna, której wartością jest adres w pamięci. Można mu przypisać wskazanie na adres w pamięci – wtedy wskaźnik „wskazuje” na tą pamięć.

W pracy ze wskaźnikami potrzebne są dwa operatory:

  • * – operator wyłuskania, pobrania wartości wskaźnika
  • & – operator pobrania adresu.

Zobaczmy w poniższym kodzie, co jest wypisane w przypadku próby wypisania wartości wskaźników i zmiennych. Wartość wskaźnika można zmieniać, co również widać w poniższym przykładzie:

Wskaźniki i operatory

Należy dodatkowo uważać na NULL-owe wskaźniki. Próba dobrania się do ich wartości poskutkuje wyjątkiem: Czytaj dalej

Git: jak dodać na nową gałąź zmodyfikowane pliki?

Podczas pracy z repozytorium gitowym czasem zdarza się, że zaczęliśmy wprowadzać zmiany do kodu, ale przedtem zapomnieliśmy stworzyć nową gałąź. O ile nie został poczyniony commit, sprawa jest bardzo prosta do uratowania. Aby dodać na nową gałąź zmodyfikowane pliki wystarczy poniższa sekwencja poleceń.

Jak dodać na nową gałąź zmodyfikowane pliki? Na szczęście to nie jest zagmatwane :)

Jak dodać na nową gałąź zmodyfikowane pliki? Na szczęście to nie jest zagmatwane 🙂

Status?

Na początek sprawdzenie, jaki jest status zmian. Zmodyfikowany został plik README.md. Nie chcemy commitować tych zmian do gałęzi master.

d9k@Nihilia:~$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: README.md
#
no changes added to commit (use "git add" and/or "git commit -a")

Nowa gałąź

Do stworzenia nowej gałęzi i automatycznego przełączenia się na nią, wraz z przeniesieniem naruszonych plików można użyć polecenia: Czytaj dalej

Książki o testach jednostkowych

Kolejny rzut książek o testowaniu automatycznym, tym razem coś dedykowanego raczej dla programistów, czyli… Książki o testach jednostkowych (zwanych także unit testami) – po polsku.

Testy jednostkowe. Świat niezawodnych aplikacji

Wydawnictwo to http://helion.pl.
Autor: Osherove Roy
Liczba stron: 320


JUnit – testy jednostkowe. Kurs video. Automatyzacja procesu testowania w Javie

Tym razem kurs wideo, autorstwa Zofii Matusiewicz.


JUnit. Pragmatyczne testy jednostkowe w Javie

Autorzy to Andy Hunt i Dave Thomas. Wydawnictwo Helion.
Raptem 192 strony, nie jest to więc opasłe tomisko, które będzie tylko zalegało na półce.


TDD. Programowanie w Javie sterowane testami

Do zakupienia np. tu: http://helion.pl/
Viktor Farcic, Alex Garcia
Stron: 256


Dzień Programisty

Wrzesień jest dobrym miesiącem do świętowania, zwłaszcza jeśli się pracuje w branży IT. Parę dni temu obchodziliśmy Dzień Testera, a już dziś kolejne święto – Dzień Programisty! Przypada ono 13 września (12 września w roku przestępnym).

Roże na Dzień Programisty. Foto: ladybu9,

Roże na Dzień Programisty + pszczoła w gratisie. Foto: moje. Ogród, 2017.

W przeciwieństwie do Dnia Testera, z tego co obserwuję, Dzień Programisty praktycznie na stałe zagościł w kalendarzach firm informatycznych (i nie tylko). A to jakaś promocja na książki programistyczne, a to poczęstunek w firmie w postaci kolorowych ciasteczek. I bardzo fajnie!  Jest co świętować, w końcu 256 dzień zdarza się tylko raz w roku 😉

Programiści!

Programiści nasi kochani, życzę Wam wszystkiego dobrego! Niech kod zawsze się kompiluje, nigdy nie rzuca wyjątków na produkcji, a szczególnie żeby Wam się nie trafiały Błędy Występujące Tylko U Kluczowego Klienta 😉

Stringi w Pythonie

Dziś będzie o Pythonie – krótka ściągawka: Stringi w Pythonie. Czytam akurat podręcznik pt. „Zanurkuj w Pythonie” – i już od samego początku pojawia się sporo ciekawostek, które warto zanotować.

Stringi

Obsługa znaków unikodu, np. polskie znaki – należy dodać znaczek u przed stringiem.

Wyłączenie obsługi znaków specjalnych, tj. np.:

  • znaku nowej linii \n
  • tryb „raw„, znaczek r przed stringiem.

>>> r = r'\n\nraw'
>>> ra = r"\n\nraw"
>>> u = u'śśśś'
>>> ua = u"źźźź"

Do stringów można używać zarówno pojedynczego, jak podwójnego cudzysłowu.

Potrójny cudzysłów (obojętnie czy pojedynczy czy podwójny) oznacza natomiast string wielolinijkowy. Przyjęło się, że używa się go jako wieloliniowy komentarz lub krótką dokumentację funkcji.

>>> dl = """to bedzie
bardzo dlugi
tekst"""
>>> print dl
to bedzie
bardzo dlugi
tekst
>>> a = '''to bedzie
dlugi te
kst'''
>>> print a
to bedzie
dlugi te
kst

Qt4: konwersja projektu qmake do CMake

Podczas tworzenia projekt w Qt4 z poziomu QtCreatora, do budowania projektu (generowania plików Makefile i tak dalej) QtCreator używa narzędzia qmake. Okazuje się jednak, że to nie wszystko:) QtCreator potrafi także używać CMake! Niestety nie ma póki co gotowego narzędzia, które automatycznie przekonwertuje projekt z qmake na CMake. Możemy jednak zrobić to sami. Jak? O tym jest właśnie ten tutorial.

Zagmatwane jak Qt4 i CMake!

Tworzymy CMakeLists.txt

Na sam początek warto wiedzieć, że sercem CMake jest plik CMakeLists.txt. To w nim definiowane są zasady, jakie biblioteki trzeba znaleźć i dołączyć, które pliki zbudować itd.

W pierwszym kroku trzeba zatem utworzyć plik CMakeLists.txt. Dodajemy go w głównym katalogu projektu. Natomiast folder wyżej (ponad źródłami i plikiem CMakeLists.txt) warto stworzyć dodatkowy folder, w którym będzie budowany nasz program.

Oto wersja pierwsza przykładowego pliku CMakeLists.txt – oferuje automatyczne wyszukiwanie plików ui i moc i generowanie na tej podstawie kodu. Odpowiadają za to zmienne: CMAKE_AUTOMOC i CMAKE_AUTOUIC.

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

PROJECT(V1)

set(QT_SRC ${QT_SRC} "${PROJECT_SOURCE_DIR}")
https://wiki.qt.io/Using_CMake_build_system
FIND_PACKAGE(Qt4 REQUIRED QtGui QtXml)
INCLUDE(${QT_USE_FILE})

QT4_WRAP_UI(UISrcs mainwindow.ui)
QT4_WRAP_CPP(MOCSrcs mainwindow.h)
 
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
INCLUDE_DIRECTORIES(${QT_SRC})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/gui)

add_executable(DemoQt ${PROJECT_SOURCE_DIR}/main.cpp mainwindow)

TARGET_LINK_LIBRARIES(DemoQt Qt4::QtGui Qt4::QtXml) 

Aby wypisać wartości zmiennych, warto użyć polecenia MESSAGE, np.:

MESSAGE("MyProjectLib_src:\t\t${MyProjectLib_src}")

Moje wartości zmiennych są zatem następujące:

MOCSrcs /home/d9k/ProstyProjektQtCmake/qponiższytcreator-build/moc_mainwindow.cxx
MOCSrcs /home/d9k/ProstyProjektQtCmake/qtcreator-build/ui_mainwindow.h
QT_SRC /home/d9k/ProstyProjektQtCmake/zrodla
PROJECT_SOURCE_DIR /home/d9k/ProstyProjektQtCmake/zrodla
QT_USE_FILE /usr/share/cmake-2.8/Modules/UseQt4.cmake
CMAKE_CURRENT_SOURCE_DIR /home/d9k/ProstyProjektQtCmake/zrodla
CMAKE_CURRENT_BINARY_DIR /home/d9k/ProstyProjektQtCmake/qtcreator-build
QT_LIBRARIES /usr/lib/x86_64-linux-gnu/libQtGui.so;/usr/lib/x86_64-linux-gnu/libQtCore.so

Okazuje się jednak, że używanie automatu nie zawsze jest dobre – zwłaszcza, jeśli projekt jest rozbudowany i struktura katalogów jest drzewiasta. Wzorując się na poniższych wpisach w serwisie StackOverflow, udało mi się zmodyfikować poprzednią wersję, aby nie używała automatycznego przypisywania plików ui i moc.

Przechodzimy na sterowanie manualne

Usuwamy zatem fragment ze zmiennymi CMAKE_AUTOMOC i CMAKE_AUTOUIC, by zastąpić go własnym wskazaniem ścieżek: Czytaj dalej

Zanurkuj w Pythonie – recenzja podręcznika

Odważyłam się i zanurkowałam w paszczy Pythona 😉 A konkretnie to udało mi się przebrnąć przez „Zanurkuj w Pythonie” Marka Pilgrima. Podręcznik dostępny jest za darmo tu: https://pl.wikibooks.org/wiki/Zanurkuj_w_Pythonie (i to w dodatku po polsku).

Zanurkuj w Pythonie? Na początek polecam nurkowanie w chłodnym potoku!

Zanurkuj w Pythonie. Albo w chłodnym potoku. Foto: moje, data nieznana

Książka jest bardzo przekrojowa – obejmuje szerokie spektrum tematów: instalacja, sprint (dosłownie) przez składnię języka, operacje na plikach i strumieniach, parsowanie XML i HTML, obsługa usług sieciowych SOAP i HTTP, testy jednostkowe. Potem przychodzi czas na wyrażenia lambda, funkcje dynamiczne i optymalizację kodu.

Każdy rozdział jest zbudowany wg podobnego schematu: przedstawienie kompletnego kodu programu, a następnie tłumaczenie linijka po linijce. Co więcej, autor udostępnia na swojej stronie kody źródłowe, więc lekturę można uzupełnić własnymi doświadczeniami.

Gdy zabierałam się za lekturę, o Pythonie nie wiedziałam praktycznie nic (mając jednocześnie doświadczenia z Javy, Ruby czy innych języków) i nawet będąc już w połowie lektury nadal wydawało mi się, że ten stan rzeczy nie uległ zmianie. Początkowo irytowało mnie , że książka jedynie ogólnie nakreśla podstawy, nie opisuje wszystkich możliwych funkcji, tylko skupia się na kilku, użytych w programie. Tymczasem autor w każdym rozdziale pisze, aby wiedzę uzupełnić u źródła, tj. przeczytać odpowiedni fragment dokumentacji Pythona. Fajnie, ale wymaga to czytania podręcznika na komputerze, a nie na Kindlu… Na szczęście druga część książki poszła już z górki, możliwe że dlatego, że „opatrzyłam się” już ze składnią. Bardzo podobały mi się rozdziały o testach (bycie QA zobowiązuje 😉 ). Ciekawy był rozdział o optymalizacji, brakowało mi jednak lepszego podsumowania, jakiejś tabelki, które podejścia są zasobożerne, a które nie. Czytaj dalej

Scrum kontra złożoność

Niedawno podawałam garść ciekawych informacji na temat metodologii Scrum. Dziś kontynuacja tego tematu.

Często słyszy się, że ta metodologia pracy nie jest dla każdego zespołu. Pewnie tak. Na jednym ze szkoleń widziałam ciekawy wykres obszarów złożoności pracy:

Scrum in complexity?

  1. Simple – dziedzina dobrze znana – tu sprawdzają się tzw. najlepsze praktyki, zalecenia z poradników itd.
  2. Complicated – dziedzina znana, ale trudna. Sprawdzają się dobre praktyki, ogólne „zalecenia”.
  3. Complex – dziedzina bardzo złożona, nie można powiedzieć, czy dane działania odniosą sukces czy nie. Metodą pracy są głównie eksperymenty – właśnie tutaj najlepiej działa Scrum!
  4. Chaos.

Krzywa uczenia

I dodatkowo: krzywe uczenia się w zależności od złożoności problematyki:

Krzywa uczenia sie w Scrum

  1. Simple – continuous improvement. Wystarczy po prostu działać, powtarzać – uczenie się jest proste, bez większych problemów.
  2. Complicated – continuous improvement – powiedziałabym: wzloty i upadki.
  3. Complex – continuous adaptive – błądzenie jak we mgle 😉 Jeden eksperyment zbliży nas do rozwiązania, inny oddali. Pamiętajmy, że adaptacja leży w głównych założeniach metodyki Scrum 🙂

Złączenia w SQL

Dziś podręczna, graficzna ściągawka obejmująca złączenia (join: left join, inner join, right join, full outer join) w SQL Definicje podaję ze sporym uproszczeniem, bez zagłębiania się w teorię baz danych – jest to szybka ściąga przypominająca podstawowe wiadomości.

Złączenia

Złączenia (join) używane są do łączenia kilku tabel zawierających różne kolumny, lecz posiadających jedną wspólną kolumnę (klucz). Przykład – złączenie tabeli z zamówieniami z tabelą danych osobowych klientów.

Zakładając, że:

  • zapytanie nr 1 (Q1) zwraca następujący zestaw danych: A, B, C
  • zapytanie nr 2 (Q2) zwraca następujący zestaw danych: C, D, E

Pełne zapytanie będzie następujące:


SELECT * FROM Q1 LEFT JOIN Q2 USING (key);

SELECT * FROM Q1 LEFT JOIN Q2 ON (Q1.key1 = Q2.key2);

Ilustracja:

Bazy danych - złączenia

Left join

SELECT * FROM Q1 LEFT JOIN Q2 USING (key)

Inner join

SELECT * FROM Q1 INNER JOIN Q2 USING (key)

Right join

SELECT * FROM Q1 RIGHT JOIN Q2 USING (key)

Full outer join

SELECT * FROM Q1 FULL OUTER JOIN Q2 USING (key)

Innym tematem dotyczącym SQL są operacje na zbiorach. Więcej na ten temat tu: Bazy danych -ściągawka.