Category Archives: Programowanie

QFakturat – program do zarządzania fakturami, produktami i danymi klientów na Linux

Kilka lat temu, żeby zdobyć trochę doświadczenia poza Java i Ruby, zabrałem się za naukę Qt4.8 i C++. W ramach tego ćwiczenia zacząłem pracować nad aplikacją, która nie istniała wtedy na Linuxa i pewnie do dziś jest tego typu unikalnym programem na pingwina i diabełka.
Aplikacja była pisana na wymogi prowadzenia firmy taty, gdzie z względu kosztów licencyjnych zrezygnowaliśmy ze środowiska Windowsa. W firmie od 6 lat używane są tylko systemy Linuxowe (KUbuntu i openSUSE).

QFakturat był pisany początkowo w Qt4.8 na Linux, jednak z czasem części kodu zostały przepisane na Qt5 oraz dodana została kompatybilność dla systemów *BSD. Nigdy nie próbowałem portować aplikacji na Windowsa ani OS Xa, więc nie jestem w stanie powiedzieć, czy działa.

Screenshot_20160509_150456

Obecna funkcjonalność programu:

  • wystawianie faktur w PDF (i tylko PDF)
  • obsługa kilku sprzedawców
  • zapisywanie/edytowanie/usuwanie klientów
  • zarządzanie produktami
  • automatyczne konwertowanie kwot brutto<->netto<->podatek przy zmianie jednej z wartości
  • spersonalizowane faktury – pozwalają na ustawienie własnego tekstu w stopce faktury i na lewym boku
  • 3 skórki programu
  • walidacja i opcjonalne formatowanie NIPu
  • wysoka elastyczność programu (sam możesz ustawić rodzaje faktu, listę stawek VAT, metody zapłaty, czas na zapłatę czy obsługiwane waluty)
  • zarządzanie produktami i filtrowanie sprzedanych/dostępnych produktów/usług.

Continue reading

Proste przykłady w Prologu

Niewiele w Internecie prostych, krótkich i działających za pierwszym razem snippetów z Prologa, zatem podaje kilka swoich, które napisane i używane zostały podczas wykładów na AU.

% poniży kod doda liczby, niezależnie od tego w jakiej kolejności zostały podane
add(A,B,R):- A = R - B.
add(A,B,R):- R = A + B.
add(A,B,R):- B = R - A.
 
% silnia z 0 to z definicji 1 
factorial(0, 1).
 
% rekurencyjnie oblicza silnię z podanej liczby X
% zmniejsza wartość X co każde wywołanie.
% liczy silnię, aż wywoła definicję powyżej
 
factorial(X, RESULT) :- R1 is X-1,
                       factorial(R1, R2),
                       RESULT is R2 * X.
 
male(mark). % fact
male(jonah). % fact
female(marie).
female(sophie).
female(marcie).
parent_of(jonah, mark).
parent_of(marcie, mark).
parent_of(sophie, mark).
parent_of(jonah, marie).
parent_of(marcie, marie).
parent_of(sophie, marie).
mother_of(X,Y) :- parent_of(X,Y), female(Y). % rule
father_of(X,Y) :- parent_of(X,Y), male(Y).

Continue reading

UML – Diagram klas

Diagram klas jest jednym ze sposobów reprezentacji zależności pomiędzy klasami, które mają być użyte do stworzenia kodu źródłowego. Jest to główny budulec OO modelu aplikacji, przydatny również do tworzenia technicznej dokumentacji projektu.

Diagram klas zawiera:

  • typ klasy
  • nazwa klasy
  • atrybuty klasy
  • metody klasy
  • rodzaje zależności pomiędzy klasami

Continue reading

Kompilacja tricków w bashu

  • Będąc w powłoce używaj CTRL+R do wyszukiwania wpisanych już kiedyś poleceń
  • Dodaj “set -o vi” w swoim ~/.bashrc by używać skrótów klawiaturowych z VI zamiast emacsowych
  • używaj sedowej składni zastępowania tesktu w bashu
$ ls Downloads/
$ ^wnload^cument
 
  • używaj składni !!:n, gdzie n to parametry poprzedniego polecenia, możesz je podawać w zakresie:
$ ls Downloads/ Documents/ Projects/
ls Documents/:
ls Downloads/:
ls Projects/:

$ ls !!:1-2
ls Downloads/ Documents/

Continue reading

Tworzenie CV w LaTeX

Gdy aplikujesz na jakieś stanowisko lub starasz się być zauważonym przez rekruterów, pomocne jest CV, które wyraźnie pokazuje kim jesteś, co zrobiłeś i w jakim kierunku chcesz się rozwijać. Gdy ostatnio wysyłałem swoje CV, zdecydowałem się przerobić je wg wskazówek, które poprzednio otrzymałem. Przeszukując CV innych osób zauważyłem, że niektóre z nich używały LaTeX, który jest prosty w utrzymaniu w systemach kontroli wersji. Zainteresowałem się tą metodą tworzenia CV, co doprowadziło mnie do rozpoczęcia nauki LaTeX.

Continue reading

Darmowe kursy online

Kliknij w ten link, jeśli szukasz większej ilości zbiorów IT do nauki online.

Przygotowałem małą listę dostępnych on-line kursów do nauki, samodoskonalenia, z różnych dziedzin, na wielu poziomach. Oczywiście, nie znalazłem wszystkich dostępnych w sieci ani nie wymieniłem wszystkich najpopularniejszych; zawarłem tutaj listę tych, które wg mnie są najciekawsze. Wiele z nich jest dostępnych tylko w języku angielskim, niektóre w kilku językach, ale co to za problem? Znajdziecie tam kilkanaście kursów językowych ;)

Jeśli macie swoje propozycje, wrzucajcie je w komentarzach!

Continue reading

No suitable driver found for jdbc:mysql

Miałem dzisiaj bardzo dziwny problem z NetBeans7.2 z próbą stworzenia połączenia z bazą danych MySQL.

Zaczęło się od niedoczytanej dokumentacji… czyli zamiast:

            Connection con = null;
 
            String url = "jdbc:mysql://localhost:3306/mysql";
            String user = "user";
            String password = "password";
            con = DriverManager.getConnection(url, user, password);

Continue reading

Algorytm BFS szukający drabiny słów

Jest to zadanie, które miałem wykonać jako projekt uczelniany.

Zadanie polegało na stworzeniu programu, który wczytuje słownik, a następnie dwa słowa, które muszą znajdować się w słowniku. Wtedy przechodzi krok po kroku od jednego słowa do drugiego, w ten sposób, by szczeblami drabiny słów były inne słowa różniące się od poprzedniego jedną literą . Celem było znalezienie najkrótszej drabiny w całym grafie.

Continue reading

Optymalizacja SQLite3

Wykonywanie transakcji:

Domyślnie  każde wykonanie INSERT/UPDATE w SQLite3 jest oddzielną operacją, zaznaczenie w bazie danych:

BEGIN TRANSACTION;

Spowoduje, że wszystkie operacje po zaznaczeniu tej opcji będą traktowane jako jedna operacja. Warto tę opcję zaznaczyć gdy mamy do wykonania dużo operacji INSERT/UPDATE. Po zakończeniu działań na bazie danych zamykamy transakcję:

END TRANSACTION;

 

Wyłączenie synchronizacji:

Domyślnie SQLite za-pauzuje wykonywanie operacji po wydaniu komendy do systemu operacyjnego o zapisanie danych. To gwarantuje, że dane są zapisane na dysk. Wyłączenie synchronizacji przez użycie:

synchronous = OFF;

Nakazujemy SQLiteowi trzymanie danych w pamięci przed zapisaniem danych i kontynuowanie pracy. Możliwe jest, że baza danych zostanie uszkodzona, jeśli system operacyjny zaliczy błąd lub gdy nieoczekiwanie przerwiesz wykonywanie skryptu (przez Ctrl +Z), zwykłe zatrzymanie skryptu (Ctrl + C) nakazuje serwerowi SQLite zapisać dane do bazy przed zakończeniem programu.

 

 

Notowanie w pamięci:

Rozważmy przechowywanie danych w pamięci RAM przez użycie opcj:

PRAGMA journal_mode = MEMORY;

Twoje transakcje będą dużo szybsze, jednak jeśli stracisz zasilanie, lub skrypt dodający dane wykrzaczy się, baza danych zostanie uszkodzona (testowane).

 

 

Połączenie synchronizacji i trzymania danych w pamięci:

Połączenie obu opcji daje bardzo duże przyspieszenie, jednak znacząco zwiększa ryzyko uszkodzenia pliku z bazą danych:
PRAGMA journal_mode = MEMORY;
PRAGMA synchronous = OFF;

 

 

Zwiększenie cache:

PRAGMA cache_size = -1048576 jeśli przed liczbą całkowitą stoi minus, liczba ta oznacza wtedy ilość bajtów, ile ma zajmować cache w tym uruchomieniu bazy danych, w tym wypadku oznacza to, że cache ma mieć wielkość 1MB, jeśli przed liczbą nie ma znaku to oznacza to ilość stron, domyślnie ilość to 2000.

 

 

Zwiększenie rozmiaru strony:

Zmniejszyć lub zwiększyć można ją przez użycie:

PRAGMA page_size = 2n.

Po znaku równości musi być wynik podniesienia liczby 2 to potęgi całkowitej. Domyślnie ustawione na 8192, może przyjąć wartości od 512 do 65536.

 

 

:inmemory: znane z SQLite API dla C++/C/Perl użyte w SQLite3:

Ustawienie parametru temp_store na 2 nakaże bazie danych przechowywanie wszelkich informacji w pamięci podręcznej komputera, zamiast zapisywać je co krok na dysku, znacznie przyspiesza insercję danych do bazy:

PRAGMA temp_store = 2;

“Matką” tej opcji jest SQLITE_TEMP_STORE=3 użyte do kompilowania serwera SQLite. Parametr kompilacji ustawiony na 3 oznacza, że wszystkie operacje mają być wykonywane w pamięci RAM, całkowicie pomijając używanie plików tymczasowych.

 

Yyymmm… wielotabelowość(?):

Używanie wielu tabel zwiększa czas dostępu do danych i zapisu do bazy. Jeśli Twoja baza danych jest poszerzana systematycznie co jakiś czas, warto dodać pętlę, która np. co miesiąc utworzy nową tabelę, w której będą zapisywane dane przez ten miesiąc. Baza stanie się w ten sposób również bardziej skalowalna.

Tworzenie słowników…

Dam Ci rady jak możesz zrobić swoje proste i te bardziej złożone słowniki.

Nie baw się w żadne 27GB słownik… bo taki sam wygenerujesz smartfonem w parę godzin. Używanie dużego słownika wiąże się ze zużyciem dysku, a wygenerowanie takiego w locie (bez zapisywania) na i7 z 8 wątkami to 3 minuty, odczyt z dysku i porównanie zajmie więcej czasu.

Ściągnij wszelkie bazy danych do jakich masz dostęp, jakiś mały słownik, przeskanuj te bazy danych:

1. brute-force’m ile możesz; do długości wyrazu min. 8 znaków

2. odzyskane hasła zapisuj do słownika

3. puszczaj te bazy ponownie przez słownik z regułami (patrz 1.)

4. wróć do punktu 2. zmień i dodaj reguły, wykonaj ten punkt min. 6 razy

5. Usuń duplikaty ze słowników.

Ten perlowy skrypt usuwa duplikaty ze słownika. Dlaczego jest lepszy od uniq i jtr? Bo wrzuca słownik do pamięci RAM nie do /tmp dzięki czemu usuwanie jest tysiące razy szybsze, nie ma zużycia dysku i nie wysypie Ci się system przy zapełnieniu całej partycji /tmp (co innego jak zapełni Ci się RAM, złapiesz laga na kilkanaście minut ;)).

#!/usr/bin/perl -w
use strict;
#usuwa duplikaty z pliku
my $origfile = "2";
my $outfile = "none-" . $origfile;
my %hTmp;
 
open (IN, "< $origfile") or die "Couldn't open input file: $!";
open (OUT, ">$outfile") or die "Couldn't open output file: $!";
 
while (my $sLine = ) {
next if $sLine =~ m/^s*$/; #remove empty lines
$sLine=~s/^s+//; #strip leading/trailing whitespace
$sLine=~s/s+$//;
print OUT qq{$sLinen} unless ($hTmp{$sLine}++);
}
close OUT;
close IN;

Skrypt był publiczny w Interncie.

No i w sumie to tyle. Po kilku dużych wyciekach baz danych będziesz miał więcej do roboty, ale będzie też szybciej leciało bo słownik będzie większy.