Marcin Mackiewicz

Programista JAVA, RS Adware Polska

Wypowiedzi

  • Marcin Mackiewicz
    Wpis na grupie Java w temacie Przypisanie wartości do pola Label w fxml
    19.05.2020, 19:32

    W klasie "ProgramTabsDlaWupController" nie masz zainicjowanego property "labelZalogowany" co oznacza że użycie metod getText() oraz setText() na wartości null rzucą wyjątkiem NullPointerException.

    W konstruktorze do ProgramTabsDlaWupController dodaj inicjacje zmiennych typu this.labelZalogowany = new Label();

  • Marcin Mackiewicz
    Wpis na grupie Administratorzy w temacie System do digitalizacji dokumnetów
    16.07.2019, 09:35

    Używałem Alfresco Community.

    - Możliwość przechowywania . dowolnych plików
    - Definiowanie rodzajów dokumentów
    - Możliwość definiowania pól dodatkowych do opisywania plików
    - Podgląd dokumentu
    - Przestrzeń użytkownika / Przestrzeń firmowa
    - Definiowanie zasad przetwarzania plików / triggerów
    - Możliwośc definiowania własnych widoków wyszukiwarki plików
    - Możliwość zdefiniowania workflow
    - Możliwość definiowania uprawnień do zasobów

    Możesz definiować taki przypadek:
    1. User A
    2. User ma dostęp do katalogu /company_workspace/Skany
    3. /company_workspace/Skany ma zdefiniowany trigger który uruchamia workflow "Opisz dokument" i przydziela jako właściciela osobę A
    4. User otrzymuje zadanie opiasnia skanu na swoją listę zadań
    5. User opisuje dokument i zapisuje. Fakt zakończenia pracy ma zdefiniowany trigger który w zależności od kategorii dokumentu układa plik w repozytorium z odpowienim katalogu i oznacza dokument jako gotowy i pokazuje go w wynikach wyszukiwania

    Przy skanowaniu dokumentów i dodawaniu ich ze skanera bezpośrednio do aplikacji jest problem ponieważ nie wiesz jaki user wrzuca pliki. Możesz wtedy zdefiniować różnym userom różne ścieżki w aplikacji i fakt pojawienia się skany w odpowiednim katalogu determinuje opowiedniego użytkownika.

    Można też zdefiniować że skany wpadają do jednego worka do którego ma dostęp x użytkowników i zadanie opisania zostaje przydzielone do grupy osób.

  • Marcin Mackiewicz
    Wpis na grupie Bazy Danych w temacie Wyszukiwanie duplikatów danych w bazach ORACLE
    9.05.2019, 14:21

    Zacznijmy od tego, że ten sam towar powinien być pod jednym indeksem. Z opisu fizycznego towaru często nie wyznaczysz dupllikatów. Najważniejsze to poprawnie wprowadzone kody produktów od producenta.

    Duplikat w twoim przypadku występuje jeżeli wszystkie atrybuty w algorytmie się zagadzają dla danego indeksu.
    Dla różnych kategorii produktowych możesz mieć inny algorytm porównywania.

    Przed przystąpieniem do implementacji algorytmu trzeba zadbać aby dane były reprezentowane w postaci normalnej.
    Nie może być tak, że na polach długość, szerokość wysokość wartość "1" raz jest centymetrem a raz calem

    Teraz możesz mieć dwa produkty wykonane u rożnych producentów które mają dokładnie taki sam opis fizyczny. I moje pytanie biznesowe: Czy traktujemy to jako duplikat czy jednak producent ma znaczenie mimo, że produkt jest identyczny?

    W taki sposób możesz tylko wskazać/zasugerować co może być duplikatem niestety konretnej decyzji żaden automat nie podejmie. Jeżeli jednak właściciel towarów podejmie decyzję że automat decyduje to musi zostać ustalony/e algorytm/y wyszykujący/e i po ich zastosowaniu i tak trzeba ręcznie sprawdzić poprawność podjęcia decyzji przez komputer :)

  • Marcin Mackiewicz
    Wpis na grupie Bazy Danych w temacie Anonimizacja bazy danych firmy
    4.05.2019, 01:42

    Zawsze myślałem że anonimizacja jest wtedy kiedy nie można w żaden sposób odczytać danych źródłowych z danych zanonimizowanych...

    Tutaj masz przykładowe zapytanie które aktualizujee jedną kolumnę przelosowanymi danymi z tej kolumny. Standardowy ranom:

    drop table if exists example_data;
    create table example_data(
    id int primary key,
    nname text,
    surname text
    );
    insert into example_data values (1, 'Igor', 'Lesik'), (2, 'Agata', 'Banaszak'), (3, 'Józef', 'Stadek');

    update example_data src set
    nname = rnd.nname
    from (
    select n.id, o.nname from (
    select *, row_number() over () as rn from example_data
    ) as o
    join (
    select id, row_number() over (order by random()) as rn from example_data
    ) as n using (rn)
    ) as rnd where src.id = rnd.id;

    Nie potzeba żadnych dodatkowych słowników czy skryptów. Jeden update na danych które już posiadasz.

    Proponuję takie coś ubrać w funkcję w twojej DB z parametrami gdzie podasz np. nazwę tabeli i nazwę kolumny to da ci prosty select do malformowania danych
    select randomize_data('example_data', 'nname'), randomize_data('example_data', 'surname');
    select randomize_data('other_table', 'other_column');

    Można też sobie stworzyć tabelę z listą do anonimizacji i wtedy jest prościej przy dużej liczbie obiektów
    drop table if exists anon;
    create table anon (tname text, cname text);
    insert into anon values ('example_data', 'nname'), ('example_data', 'surname');

    select randomize_data(nname, cname) from anon;


    Działa dla dowolnego typu danych.
    Sprawdzone z PostgreSQL. Powinno działać z MySQL. Ta forma na pewno nie zadziała z Oracle.

  • Marcin Mackiewicz
    Wpis na grupie Bazy Danych w temacie Jak aktualizaować rekordy w bazie danych na podstwie...
    1.04.2018, 11:18

    Jakieś masło maślane... chyba że źle zrozumiałem...

    (A, B - bazy danych, 1..x - rekordy w bazie)
    Jeżeli A1 = B1 to wykonaj A2 => B2?
    A jeżeli A2 = B2 to wykonaj A3 => B3?

    To przecież wyjdzie przekopiowanie całej tabeli z wyjątkiem A1

    Czy może dane1, dane2, dane3 to kolejne kolumny z tego samego wiersza danej bazy?

    Ja bym sobie zrobił tak:
    I. Rozwiązanie:
    1. Kopia całej tabeli z A.A do tymczasowej tabeli B.A' w bazie docelowej.
    2. Wykonanie zapisu UPDATE ... FROM ... WHERE... na tabelach B.A oraz B.A'
    3. Kasowanie tabeli B.A'
    Wszystko w zrobionym skrypcie do wykonywania tego typu zadań.

    II. Rozwiązanie
    Korzystam z https://www.sql-workbench.eu/ , które ma narzędzia dostępne z terminala. Można wskazać bazę, tabelę źródłową i docelową a następnie podać sposób aktualizacji (UPDATE, INSERT) oraz warunek WHERE

    Trzeba jednak pamiętać, że tego typu rozwiązania są bardzo podatne na niepowodzenia jeżeli model danych zmienia się dosyć często.

  • Marcin Mackiewicz
    Wpis na grupie PHP w temacie Podpis kwalifikowany
    1.04.2018, 11:07

    W PHP nie widziałem nigdzie implementacji PKCS#11. Jedyne co moim zdaniem można zrobić to wykonać polecenie systemowe.

    Nie rozumiem po co sprawdzać ważność podpisu w zewnętrznej bazie danych. Przecież urząd certyfikacji wydaje podpis z zawartą jego datą ważności. Nie możesz ingerować w podpisany przez urząd dokument. Sprawdzenie poprawności klucza powinno odbywać się przez weryfikację urzędu który wystawiał podpis oraz przez jego datę ważności.

    Jeżeli twoja aplikacja ma sprawdzać poprawność klucza to rozwiąż to przechowując w bazie danych SHA z podpisu albo jego ID. Jeżeli użyty podpis (jego SHA) nie zgadza się z zarejestrowanym w aplikacji to go po prostu nie używaj.

  • Marcin Mackiewicz
    Wpis na grupie Bazy Danych w temacie Duża baza - prośba o poradę
    5.03.2018, 12:30

    Przy takiej ilości danych zakładam, że pola tekstowe zawierają powtarzające się wartości.
    Czy tam są dane osobowe i się nie powtarzają?

    Wykorzystaj zagadnienia z hurtowni danych.

    Dodaj słowniki i buduj je na etapie importu..
    Ogólnie praca na liczbach jest dużo szybsza niż praca na tekstach a na pewno będziesz miał where varchar(100) like '%%'. Zrobienie słowników skróci te dane:

    fakty: datetime, varchar
    zamień np na
    fakty: datetime, id_varchar
    slownik1: id, varchar(100)
    gdzie fakty.id_varchar => slownik1.id.
    Teraz jak ktoś poprosi o dane zawierające treść "kozioł" to wystarczy
    WITH sl AS (
    SELECT id FROM slownik1 WHERE varchar ilike '%kozioł%'
    )
    SELECT * FROM fakty JOIN sl ON sl.id = fakty.id_varchar
    co zadziała dużo szybciej niż
    SELECT * FROM fakty WHERE varchar ilike '%kozioł%'
    Z tabeli faktów zrób klaster ale wykorzystaj do tego mechanizm klastrowania wbudowany w engine bazy danych. Jak porobisz sobie kilka, kilkanaście niezależnych tabel to będziesz miał problem jeżeli zakres danych obejmie więcej niż jedną tabelę.

    Na słownikach gdzie masz dane tekstowe załóż index na tekstach.

    Na pewno na każdym engine bazy danych będzie działało dużo szybciej nie z tradycyjną tabelką.

    ps. SQL PostgresSQL 9.x

  • Marcin Mackiewicz
    Wpis na grupie Java w temacie JavaFx WebBrowser i wyciek pamięci pod Windowsem a...
    17.01.2018, 00:10

    Problemem jest sam komponent. NIe zwalnia pamięci. przez co zapycha przydział pamięci dla JVM i aplikacja albo się zawiesza albo pada. Koledzy z Oracl'e wiedzią o tym od lat (https://bugs.java.com/view_bug.do?bug_id=8088114) ale poprawki jak nie było tak nie ma. Problem przesiąkł aż do JAVA9.

  • Marcin Mackiewicz
    Wpis na grupie MySQL w temacie formatowanie wyniku
    9.11.2017, 09:28

    SELECT LPAD(id, 5, 0) FROM tabela
    Uzupełnia 0 z lewej strony tak aby było 5 znaków. Uwaga int'a nie da się zapisać z zerami wiodącymi dlatego typ jest zmieniany na tekstowy,

  • Marcin Mackiewicz
    Wpis na grupie Administratorzy w temacie tunelowanie przez ssh do połączenia z przestrzeni nazw
    25.09.2017, 12:07

    A nie chodzi ci poprostu o

    ssh -CL [port_lokalny]:[serwer_w_wew_prz_nazw]:[port_zdalny] user@host
    i tak jak pisze przedmówca nazwa [server_w_wew_prz_nazw] jeżeli jest nazwą hosta to musi być rozwiązywalny na tym hoście.

  • Marcin Mackiewicz
    Wpis na grupie Bazy Danych w temacie PostgreSQL - pętla do pliku XML
    12.09.2017, 16:49

    Przy strukturze w PostgreSQL 9.5:

    DROP TABLE IF EXISTS faktury_pozycje;
    DROP TABLE IF EXISTS faktury;
    DROP TABLE IF EXISTS odbiorca;


    CREATE TABLE odbiorca (
    id int,
    nazwa text,
    adres text,
    CONSTRAINT odbiorca_pkey PRIMARY KEY (id)
    );

    CREATE TABLE faktury (
    id int,
    id_odbiorca int,
    CONSTRAINT faktury_pkey PRIMARY KEY (id),
    CONSTRAINT faktury_fkey FOREIGN KEY (id_odbiorca)
    REFERENCES odbiorca (id) MATCH SIMPLE
    ON UPDATE CASCADE ON DELETE RESTRICT
    );

    CREATE TABLE faktury_pozycje (
    id int,
    lp int,
    indeks text,
    ilosc int,
    CONSTRAINT faktury_pozycje_pkey PRIMARY KEY (id, lp),
    CONSTRAINT faktury_pozycje_fkey FOREIGN KEY (id)
    REFERENCES faktury (id) MATCH SIMPLE
    ON DELETE CASCADE ON UPDATE CASCADE
    );

    INSERT INTO odbiorca VALUES (1, 'odbiorca 1', 'adres 1');
    INSERT INTO odbiorca VALUES (2, 'odbiorca 2', 'adres 2');

    INSERT INTO faktury VALUES (1, 1);
    INSERT INTO faktury VALUES (2, 2);
    INSERT INTO faktury VALUES (3, 1);

    INSERT INTO faktury_pozycje VALUES (1, 1, 'indeks 1', 1);
    INSERT INTO faktury_pozycje VALUES (2, 1, 'indeks 2', 3);
    INSERT INTO faktury_pozycje VALUES (2, 2, 'indeks 4', 7);
    INSERT INTO faktury_pozycje VALUES (3, 1, 'indeks 1', 1);
    INSERT INTO faktury_pozycje VALUES (3, 2, 'indeks 2', 2);
    INSERT INTO faktury_pozycje VALUES (3, 3, 'indeks 3', 3);
    INSERT INTO faktury_pozycje VALUES (3, 4, 'indeks 4', 7);
    wystarczy SQL:
    SELECT 
    f.id,
    xmlelement(name faktura,
    xmlelement(
    name odbiorca,
    xmlelement(name nazwa, o.nazwa),
    xmlelement(name adres, o.adres)
    ),
    xmlelement(
    name pozycje,
    xmlagg(
    xmlelement(
    name towar,
    concat(
    xmlelement(name indeks, indeks),
    xmlelement(name ilosc, ilosc)
    )::xml
    )
    )
    )
    ) AS faktura
    FROM faktury_pozycje fp
    JOIN faktury f ON fp.id = f.id
    JOIN odbiorca o ON f.id_odbiorca = o.id
    GROUP BY f.id, o.nazwa, o.adres;

  • Marcin Mackiewicz
    Wpis na grupie Bazy Danych w temacie PostgreSQL - pętla do pliku XML
    12.09.2017, 16:17

    Wersja PostgreSQL?
    Struktura z jakiej chcesz osiągnąć XML'a?

  • Marcin Mackiewicz
    Wpis na grupie Programiści WWW w temacie pytanie GIT pobieranie nowych branch'y
    2.09.2017, 23:43

    Rozleciało ci się pewnie dlatego, że miałeś w gałęzi zmiany bez commit'a i zrobienie chceckout przeniosło te zmiany do nowej gałęzi.

    Jeżeli modyfikujesz kod na serwerze to zaraz po jego modyfikacji powinieneś wypchnąć do repozytorium albo przed checkout z danej gałędzi zrobić reset.

    Przy zmianie/tworzeniu gałęzi w lokalnej kopii powinieneś się upewnić, że nie leżą w niej żadne zmiany.

    Proponuję tworzyć gałęzie na github i potem pobierać do lokalnej kopii. Powinno być łatwiej.

  • Marcin Mackiewicz
    Wpis na grupie Programiści WWW w temacie pytanie GIT pobieranie nowych branch'y
    2.09.2017, 22:58

    Na lokalnym kompie tworzenie developement-people z developement:

    mkdir repo && cd  ./repo
    git clone <repo>
    git checkout --track origin/developement
    git checkout -b developement-people
    Przesłanie gałęzi z lokalnego komputera do repo:
    git push
    Przełączenie się na serwerze testowym na gałąź developement-people przy założeniu, że repozytorium już istnieje oraz że gałąź istnieje w repo a nie istnieje w lokalnej kopii:
    git fetch
    git checkout --track origin/developement-people


    GIT version 2.13.3Ten post został edytowany przez Autora dnia 02.09.17 o godzinie 23:01

  • Marcin Mackiewicz
    Wpis na grupie Programiści WWW w temacie redirect 301 problem z przekierowaniem z jednego adresu...
    26.08.2017, 01:34

    301 niestety nie działają już jeśli istnieje jakikolwiek parametr _GET. Musisz użyć modułu rewrite aby to obsłużyć.

  • Marcin Mackiewicz
    Wpis na grupie Bazy Danych w temacie Jak prawidłowo podejśćdo szyfrowania zawartości bazy danych
    18.08.2017, 22:09

    A ja w sumie chciałbym zrozumieć dlaczego kolumna "A" ma być szyfrowana a kolumna "B" nie w mojej tabeli... jakie jest uzasadnienie biznesowe?

    Jeżeli dane w bazie wymagają zaszyfrowania bo są wrażliwe to może lepiej dane przenieść na oddzielny wolumen i ten zaszyfrować. Dane wewnątrz bazy nie są szyfrowane ale bez podmontowania zaszyfrowanego wolumenu dane będą zabezpieczone poprawnie.

    Dodatkowo nie znajdziesz gotowca na coś takiego. W PostgreSQL jest extension pgcrypto którym można szyfrować tabele a nawet kolumny. Można też użyć funkcji implementujących pgp.
    Niestety dostęp do danych jest rozwiązywany na poziomie zapytań SQL czyli wymagana zmiana w aplikacjach/usługach korzystających z danych lub tworzenie funkcji wewnątrz bazy do decrypt'u. Ale nadal gdzieś trzeba przechowywać klucze deszyfrujące.. gdzie?

    Myślę, że najprościej zaszyfrować wolumen z plikami bazy.

  • Marcin Mackiewicz
    Wpis na grupie Programiści WWW w temacie seryjne przerabianie xls do pdf program
    12.07.2017, 22:40

    np. Libre Office z cmd... + plik wsadowy z pętlą czytającą pliki z katalogu

    soffice --headless --convert-to pdf plik.xls

  • Marcin Mackiewicz
    Wpis na grupie Bazy Danych w temacie [POSTGRESQL] Jak nadać użytkownikowi np. uprawnienia...
    27.06.2017, 07:01

    A powiedz. Do czego to zawezanie jest potrzebne?
    Pgadmin to marzedzie dla programistow. Chcesz to daz userowi? On sie w tym zgubi...

  • Marcin Mackiewicz
    Wpis na grupie Bazy Danych w temacie Połączenie bazy danych z wyszukiwarką zdjęć
    26.06.2017, 22:33

    No zależy od engine bazy danych i ich możliwości i wyboru sposobu przechowywania.

    1. Jeżeli wyszukiwanie na stronie to na pewno zasoby w postaci foto muszą być serwowane usługą www czyli muszą leżeć na serwerze web na skonfigurowanym do czytania udziale.

    2. Dane z pliku excel przekładam do tabeli lub tabel w bazie zachowując zasadę zachowania postaci normalnej. Zakładam, że w pliku excel jest nazwa pliku jakiego dotyczy w związku z tym w momencie czytania excel szukam pliku zrodlowego i wyliczam z niego md5 i zapisuje przy danych o pliku

    3. Przy dużej liczbie foto (np 1 mln) przechowywanie na systemie plików jest problemem:

    Przy dużej liczbie plików na każdym systemie plików problem będzie z indeksowaniem oraz wyszukiwaniem położenia danych wewnątrz systemu plików. Z doświadczenia wiem, że bardzo duże czasy dostępu do plików są nawet na systemach z journalingiem. Po prostu stworzenie indeksu dla dużej liczby plików zajmuje bo przeskanowania wymaga każdy plik.
    Aby tego uniknąć przydałoby się foto pogrupować w jakąś sensowną strukturę. Stworzył bym sobie katalogi o dwuznakowych nazwach od 00 do FF i w każdym z tych katalogów jeszcze raz od 00 do FF (tak tak system szesnastkowy). Dla każdego pliku wyliczyłbym md5 z treści a następnie ulokował w odpowiednim katalogu. np. plik o moj_psiak.jpg ma sumę md5 16c487716e6ed76f6cc5150d8bc15127 co oznacza, że plik znajdzie się w katalogu 16 w podkatalogu c4 (oczywiście nazwę pliku zmieniam na sumę md5) :)
    To załatwia szyki dostęp do pliku ponieważ przy np mln zdjęć w jednym katalogu średnio wypadnie 15 szt (1000000 / 65525 ~ 15).

    4. Tworzę prosty formularz www + obsługę wyszukiwania plików w bazie. Same miniatury zaciągane w formie <img scr="" /> bezpośrednio z serwera.

    Z drugiej strony może zamiast kombinować rozważyłbym użycie niemodelowej bazy / indeksera np. Elasticsearch, który zapewniłby mi przechowywanie zasobów wraz z danymi dodatkowymi oraz odpowiednio zindeksowałby zasoby pozwalając na szybkie wyszukiwanie :)Ten post został edytowany przez Autora dnia 26.06.17 o godzinie 22:34

  • Marcin Mackiewicz
    Wpis na grupie Bazy Danych w temacie [POSTGRESQL] Jak nadać użytkownikowi np. uprawnienia...
    26.06.2017, 22:12

    To tak nie zadziała. pgAdmin np nie sprawdza uprawnień do obiektu w object tree. Mogę zobaczyć listę obiektów nawet jak mam "revoke on schema form user". pgAdmin zwraca sobie error z tytułu permission denied ale i tak mogę przeglądać tree i mam dostęp do obiektów do których mam uprawneinia. Koledze chodziło o to, żeby pokazywać tylko te obiekty do których dany user ma uprawnienia a pozostałe uryć.

    Zrobilem sobie tabele magazyn w schemacie public. Zrobilem widok magazyn_v w semacie t.
    Zrobilem usera ttt z grant usage on t to ttt z grant select on magazyn_v to ttt;
    Zrobilem revoke on schema public from ttt.

    W pgadmin zalogowałem sie na usera ttt i mogłem przeglądać index obiektów, mialem dostep do tabel na ktorych miałem uprawnienia.

Dołącz do GoldenLine

Oferty pracy

Sprawdź aktualne oferty pracy

Aplikuj w łatwy sposób

Aplikuj jednym kliknięciem

Wyślij zaproszenie do