Helps launching QGIS plugins as standalone applications

oozey mess
2025 on Tumblr: Trends That Defined the Year
EXPECTATIONS
RMH

★
almost home

roma★

Discoholic 🪩
Not today Justin
noise dept.
Sweet Seals For You, Always

titsay
untitled
NASA
Keni
tumblr dot com
todays bird
macklin celebrini has autism

Love Begins
Sade Olutola

seen from United States
seen from Spain

seen from Maldives

seen from United States

seen from United States
seen from Maldives
seen from United Kingdom

seen from Canada
seen from United States
seen from Pakistan
seen from United States
seen from Canada
seen from United States

seen from Dominican Republic
seen from Spain
seen from United States
seen from United States

seen from United States

seen from United Kingdom
seen from United States
@koder
Helps launching QGIS plugins as standalone applications

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
Połączenia z bazą danych przy pomocy api QGIS
Aplikacja WWW umożliwia szybkie i proste przeglądanie dokumentacji JAVA. Użytkownicy dysponujący kontem Google mogą dodatkowo zapamiętywać klasy, których używają w pracy.

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
Kerberos i Debian Lenny
Pierwsza próba instalacji systemu Kerberos na Debianie 4.0 zakończyła się niepowodzeniem, mimo tego, że posługiwiałem się tymi wskazówkami ze sprawdzonego źródła (tak mi się przynajmniej wydawało). Poniżej sprawdzona receptura na podstawie innej instrukcji 1. Pobierz niezbędne pakiety i zainstaluj je poleceniem
apt-get install krb5-{kdc,admin-server}
Dzięki temu otrzymamy najważniejsze komponenty Kerberosa - bazę kluczy KDC i serwer i narzędzia administracyjne. Po wykonaniu tego kroku w katalogu /etc powinien znaleźć się plik krb5.conf i katalog /etc/krb5kdc. 2. Przed edycją plików konfiguracyjnych kerberosa warto jeszcze dostosować plik /etc/host, szczególnie jeśli serwer i baza znajdują się na innym hoście niż ten na którym działają. Można to zrobić dodając linię
192.168.xxx.xxx debian.domena.pl
Oczywiście zamiast podanych tu wartości należy wpisać poprawne, to jest adres ip serwera i bazy i nazwę pod jaką chcemy go identyfikować. 3. W pierwszej kolejności należy zmienić plik /etc/kdc/kdc.conf. Najprostszym rozwiązaniem jest usunąć jego domyślną treść i zamiast tego wstawić
database_name = /etc/krb5kdc/principal admin_keytab = FILE:/etc/krb5kdc/kadm5.keytab acl_file = /etc/krb5kdc/kadm5.acl key_stash_file = /etc/krb5kdc/stash kdc_ports = 750,88 max_life = 10h 0m 0s max_renewable_life = 7d 0h 0m 0s master_key_type = des3-hmac-sha1 supported_enctypes = aes256-cts:normal arcfour-hmac:normal des3-hmac-sha1:normal des-cbc-crc:normal des:normal des:v4 des:norealm des:onlyrealm des:afs3 default_principal_flags = +preauth
Po znaczenie poszczególnych wpisów odsyłam do dokumentacji Kerberosa, ale ta konfiguracja powinna działać (jednak nie gwarantuję, że nie ma w niej jakiś pułapek :>) 4. W sekcji rozpoczynającej [libdefaults] należy zamienić opcję "default_realm" podając domenę w której będą działać użytkownicy. Np.
default_realm = KRB.DOMENA.PL
Dopisać sekcję [kdc] z opcją
profile = /etc/krb5kdc/kdc.conf
W sekcji [realms] dopisać właściwości wskazanej przed chwilą domeny
KRB.DOMENA.PL = { kdc = debian.domena.pl admin_server = debian.domena.pl default_domain = debian.domena.pl }
Tyle powinno na początek wystarczyć. 5. Tworzymy bazę danych Kerberosa używając do tego polecenia
krb5_util create -r KRB.DOMENA.PL -s
Po podaniu tego polecenia zostaniemy poproszeni o utworzenie hasła administratora bazy. 6. Należy utworzyć plik /etc/krb5kdc/kadm5.acl z regułą, która wszystkim użytkownikom z grupy admin pozwoli na administrację bazą danych. W tym celu do pliku wspisujemy
*/admin *
Następnie dodajemy użytkownika należącego do grupy admin, tak jak na przykładzie
# kadmin.local add_policy -minlength 6 admin add_policy -minlength 6 user addprinc -policy admin admin/[email protected]
7. Należy utworzyć tablicę kluczy, której używa kadmin do ustalania zakresu uprawnień. Pozostając w programie kadmin.local wpisujemy
ktadd -k /krb5/var/krb5kdc/kadm5.keytab kadmin/admin kadmin/changepw
Jeśli zgłoszony jest błąd, że podani użytkownicy nie istnieją, można dodać ich poleceniem
addprinc
8. Restartujemy usługi Kerberosa poleceniami
invoke-rc.d krb5-kdc restart invoke-rc.d krb5-admin-server restart
9. Uruchamiamy ponownie kadmin, tym razem "przedstawiając się" jako użytkownik-administrator, którego wcześniej utworzyliśmy, czyli
kadmin -p admin/admin
Po podaniu hasła powinien ukazać się standardowy interfejs kadmina. Jeśli do Kerberosa próbujemy zalogować się zdalnie, w pierwszej kolejności należy podać token poleceniem
kinit -p nazwa_uzytkownika
, a następnie można uruchomić
kadmin
bez parametrów. Nie wiem, czy ta konfiguracja jest na 100% bezpieczna, ale powinna się przydać nowicjuszom w sprawach bezpieczeństwa takim jak JA ;P.
Autoryzacja i uwierzytelnianie z Apache Shiro
Apache Shiro to framework rozwijany pod parasolem Funacji Apache, który umożliwia programistom szybką implementację funkcji autoryzacji i uwierzytelniania użytkowników. Shiro, oprócz tego, że udostępnia domyślne mechanizmy zarządzania użytkownikimi, sesją, itp., umożliwia dostosowanie systemu do własnych wymagań przez implementację odpowiednich interfejsów. Przez to integracja z aplikacją przebiega bez problemów, bez względu na to, czy działamy w środowisku sieciowym, czy program działa na stacjach roboczych. W zależności od tego, jak przechowujemy informacje o użytkownikach i ich uprawnieniach do korzystania z aplikacji, stosujemy odpowiednie klasy implementujące interfejs org.apache.shiro.Realm. Jeśli stosujemy do tego standardowe kontenery - np. bazę SQL, ActiveDirectory itp., ponownie możemy skorzystać ze standardowych implementacji, które dostajemy z Shiro. Ich konfiguracja ogranicza się do podania lokalizacji danych o użytkownikach, lub np. sterownika JDBC i odpowiednich poleceń SQL. W przeciwnym wypadku konieczne jest utworzenie konkretyzacji interfejsu Realm, która ogranicza się do implementacji dwóch metod - pobierających danych koniecznych do autoryzacji i uwierzytelniania (role, uprawnienia, itd.). Shiro znajduje się w fazie intensywnego rozwoju, na dniach ma zostać wydana wersja 1.0. Póki co można to uruchomić pobierając kod z repozytorium i kompilując samodzielnie, ale miejmy nadzieję, że to się wkrótce zmieni. Wiele do życzenia pozostawia także dokumentacja, ale równoważą to chętni do pomocy deweloperzy projektu i aktywni użytkownicy na forum i liście dyskusyjnej. W każdym razie, jeśli myślimy poważnie o zabezpieczaniu dostępu do aplikacji, warto przyjrzeć się temu projektowi.
jython
Java ma to do siebie, że operacje, które powinny być możliwie proste do wykonania, w tym języku nadmiernie skomplikowane. Nie jestem do końca przekonany, dlaczego np. zwykłe polecenie otworzenia pliku do odczytu zajmuje kilka lini kodu. Nawet w C robi się to jedną funkcją. Z tego wynika fakt, że JAVA w żadnym wypadku nie nadaje się do pisania prosty narzędzi, które niekiedy używa się raz, a potem o nich zapomina. Na tym polu (i nie tylko) sprawdza się doskonale Python - prosta i bardzo czytelna składnia, a przy tym rozbudowana biblioteka standardowa, czynią z tego języka idealne narzędzie programisty. Co zrobić jednak, gdy mimo bogactwa różnych dodatków dostępnych w sieci, brakuje biblioteki, która rozwiązywałaby jakiś problem. Tworzenie funkcjonalności samodzielnie może być zbyt czasochłonne i niekiedy zbyt trudne, żeby się na nie porywać. Więc co można zrobić? Ano np. sięgnąć po bibliotekę JAVY i wykorzystać ją przy pomocy Pythona. A właściwie Jythona - javowej (?) implementacji tego standardu. Jython jest trochę opóźniony w stosunku do oryginału (wersja 2.5r3), ale można z powodzeniem w tym programować. Skoro tak, to warto zastanowić się nad kolenym polem, na którym można z powodzeniem użyć Jythona - a mianowicie prototypowanie. Jeśli ktoś preferuje taką metodykę wytwarzania oprogramowania i na codzień pisze w JAVIE, to Jython może okazać się zbawieniem. Nie będę się rozwodził nad zaletami Jythona / Pythona w takich zastosowaniach, bo nie ma sensu, jest ich za dużo ;) P.S A na prawdziwy paszkwil na JAVE przyjdzie jeszcze pora. Muszę tylko zebrać siły ;)
Przekierowanie standardowego wyjścia w Java
Dostęp do stadndarowego wyjścia w języku Java uzyskuje się za pośrednictwem klasy System. Domyślnie strumień bajtów, przez wywołanie metody print / println wysyłany na okno konsoli systemowej. Autorzy klasy System umożliwili zmianę jej domyślnego zachowania udostępniając metodę System.setOut(PrintStream ps). Argumentem powinien być obiekt klasy PrintStrem, który w rzeczywistości ma zaimplementowane metody używane do pisania "na konsolę". One z kolei wywołują metodę write(int arg0) obiektu OutputStream. I tu jest pies pogrzebany ;). Klasa OutputStream jest klasą abstrakcyjną, a więc nie możemy tworzyć jej obiektów. Możemy natomiast utworzyć jej potomka, który będzie zawierał implementację wspomnianej metody write. Może to wyglądać następująco (zakładam w tym momencie, że podane ciągi liter będą wyświetlane w polu JTextArea):
import java.io.IOException; import java.io.OutputStream; import javax.swing.JTextArea; public class StdOut extends OutputStream { JTextArea out; public Cos(JTextArea jta) { this.out = jta; out.append("abc abc\n"); // sprawdzamy, czy na pewno działa ;) } @Override public void write(int arg0) throws IOException { /* ponieważ argumentem funkcji jest liczba - reprezentująca kod znaku * musi zostać zamieniona na znak a następnie na ciąg znaków (string) */ out.append(String.valueOf(((char) arg0))); } }

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
Dostęp do plików DBF/Clipper w C# i Java - cz. 2
Podobną funkcjonalność do tej, która została opisana w części pierwszej, udostępnia na platformie JAVA sterownik JDBC firmy HXTT. Idea jest prosta - używając typowych obiektów takich jak Statement, ResultSet i poleceń języka SQL obsługuje się pliki DBF (Clipper i inne) wraz z plikami indeksowymi. Takie rozwiązanie, jak każde inne ma swoje plusy i minusy. Klasyczny interfejs dostępu do źródeł danych sprawia, że nie ma konieczności zapoznawania się z nowymi metodami, własnościami itp. Z drugiej strony programista musi mieć dużo zaufania do autorów sterownika, że będzie obsługiwany np. współbieżny dostęp do plików, lub zaimplementować tą funkcjonalność samodzielnie, co w tym przypadku nie jest rozwiązaniem szczególnie eleganckim i prostym. Poniżej przykładowa klasa implementująca interfejs Runnable umożliwiająca współbieżną modyfikację plików dbf public class CT2009 implements Runnable{ private Connection conn; private int pid; public CT2009(Connection conn, int pid) { this.conn = conn; try { // System.out.println(this.conn.getTransactionIsolation()); this.conn.setTransactionIsolation(this.conn.TRANSACTION_SERIALIZABLE); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.pid = pid; } @Override public void run() { // TODO Auto-generated method stub Calendar kal = Calendar.getInstance(); try { long ts = 0; Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery("Select _lockflag_, ID,PENSJA, OPIS from KASA"); while (rs.next()) { boolean stop = true; while (stop) { try { this.conn.setAutoCommit(false); rs.updateBoolean("_lockflag_", true); // blokada rekordu rs.updateRow(); int np = rs.getInt("PENSJA")+100; rs.updateInt("PENSJA", np); rs.updateBoolean("_lockflag_", false); // zdjęcie blokady rs.updateRow(); conn.commit(); stop = false; } catch (SQLException se) { System.err.println("rollback - wyjatek: "+se.getMessage()); this.conn.rollback(); } } } } catch (Exception e) { e.printStackTrace(); System.err.println("z procesu "+this.pid); } } } Używając wirtualnej kolumny "_lockflag_" można blokować do odczytu rekord, na którym ustawiony jest wskaźnik kursora. Żeby jednak to rozwiązanie miało sens, we właściwościach podawanych w momencie inicjalizacji sterownika należy zadeklarować jak długo ma trwać oczekiwanie na zdjęcie blokady. Robi się to, przez podanie odpowiedniej wartości zmiennej "lockTimeout". Pozostaje pytanie, jak wykorzystywane są pliki indeksowe, jeśli wiadomo, że zazwyczaj mają one inną nazwę, niż plik DBF, z którym są powiązane. Sterownik pobiera ich nazwy ze specjalnie spreparowanego pliku o rozszerzeniu CGP i nazwie pokrywającej się z nazwą zbioru danych. Wewnątrz, w kolejnych liniach wypisane są nazwy plików indeksowych razem z rozszerzeniami. Na koniec mała uwaga: dokumentacja sterownika jest poniżej wszelkiego poziomu, więc należy wykazać się dużą cierpliwością ;>.
Dostęp do plików DBF/Clipper w C# i Java - cz. 1
Kiedy stajemy przed problemem migracji z aplikacji, w której wykorzystywane są pliki DBF do programu opartego o relacyjną bazę, w pierwszej kolejności konieczne staje się zapewnienie spójności danych zapisanych w różnych formatach. Szczególnie, jeśli po migracji, ze "starych" źródeł danych korzystają inne programy. Dodajmy, że po pierwsze zależy nam na pełnej obsłudze plików indeksowych (odpowiednik indeksów zakładanych na relacjach w bazie SQL) dołączanych do plików DBF, a po drugie na możliwości współbieżnej modyfikacji danych. Szczególnie pierwszy z warunków na pierwszy rzut oka wydaje się trudny do spełnienia. W przypadku C# standardowy sterownik OleDb udostępniany na platformie .Net umożliwia co prawda odczyt i zapis plików DBF, natomiast o obsłudze indeksów można pomarzyć. W tym przypadku rozwiązaniem jest wykorzystanie udostępnianego przez firmę Sybase serwera Advantage Database Server (ADS) i bibliotek klienckich. Jeśli zależy nam na bardzo wydajnym współbieżnym dostępie do bazy danych wielu użytkowników i mamy sporo pieniędzy, ADS jest świetnym rozwiązaniem. Tutaj skupię się na opcji Advantage Local Server także udostępnianym przez Sybase, z tym że bezpłatnie, co może być istotne dla niektórych użytkowników. Należy przy tym wziąć pod uwagę ograniczone możliwości ALS i mniej optymalne metody dostępu do danych. W pierwszej kolejności musimy rozstrzygnąć, jaką metodę dostępu do danych wybieramy - w obiektowym modelu ADO.NET, czy raczej z wykorzystaniem niskopoziomowych procedur. Wybór pierwszej lub drugiej opcji jest możliwy po instalacji biblioteki .Net Data Provider . Ponieważ obsługa DBF przez interfejs ADO.NET nie odbiega od standardu, skupię się na opcji z wykorzystaniem procedur niskopoziomowych. Elementem biblioteki .Net Data Provider jest moduł nazwany AdvantageClientEngine - API zawierające funkcje do obsługi plików DBF. using System; using System.Collections.Generic; using System.Linq; using System.Text; using AdvantageClientEngine; namespace ConcurTest { class Polaczenie { private IntPtr kursor; private IntPtr conn, hsql; /* konstruktor. xpath - ścieżka do pliku ADD, xpass - hasło dostępowe */ public Polaczenie(string xpath, string xpass) / { kursor = get_kursor(xpath, xpass); } public void concur_updt() { int liczba,id; ushort eof; uint res; do { /* próba nawiązania zablokowania rekordu. Powtarzana tak długo jak rekord jest zablokowany przez inny proces */ while ((res = ACE.AdsLockRecord(kursor, (uint)0)) == ACE.AE_LOCK_FAILED) ; ACE.AdsGetLong(kursor, "PENSJA", out liczba); ACE.AdsSetLong(kursor, "PENSJA", liczba + 100); ACE.AdsUnlockRecord(kursor, (uint)0); /* skok do następnego wiersza tabeli */ ACE.AdsSkip(kursor, 1); /* funkcja zwraca 1 jeśli następny wiersz będzie ostatnim w tabeli */ ACE.AdsAtEOF(kursor, out eof); } while (eof != 1); } public void discon() { ACE.AdsCloseSQLStatement(hsql); ACE.AdsDisconnect(conn); // Console.WriteLine("zakonczono ..."); } private IntPtr get_kursor(string xpath, string xpass) { IntPtr xkursor; uint res; /* nawiązanie połączenia z plikiem xpath, z wykorzystaniem ALS. wskaźnik do połączenia jest przekazywany do parametru conn */ res = ACE.AdsConnect60(xpath, ACE.ADS_LOCAL_SERVER, "adssys", xpass, ACE.ADS_DEFAULT, out conn); if (res != ACE.AE_SUCCESS) { ACE.AdsShowError("nie udalo sie ;("); } /* utworzenie warunku hsql dla połączenia conn */ res = ACE.AdsCreateSQLStatement(conn, out hsql); { ACE.AdsShowError("nie udalo sie ;("); } /* utworzenie zapytania sql z wykorzystaniem utworzonego warunku */ res = ACE.AdsPrepareSQL(hsql, "select * from PLACE"); { ACE.AdsShowError("nie udalo sie ;("); } /* utworzenie kursora przez wykonanie zdefiniowanego zapytania */ res = ACE.AdsExecuteSQL(hsql, out xkursor); { ACE.AdsShowError("nie udalo sie ;("); } return xkursor; } } } Powyższy kod prezentuje przykładową klasę, za pośrednictwem której można współbieżnie odczytywać plik ADD. Ich podstawowe znaczenie można określić jako wiązanie plików DBF i NTX, które zazwyczaj mają inne nazwy niż źródło danych. Hasło można zdefiniować w momencie tworzenia pliku ADD - programowo lub używając aplikacji Advantage Data Architect. Jak można wywnioskować z powyższego kodu obsługa plików DBF z wykorzystaniem API wymaga sporo pracy i zapewne jest mniej eleganckie od ADO.NET. Można jednak spodziewać się, że wyeliminowanie warstwy obiektowej z tego elementu aplikacji może przyczynić się do przyspieszenia dostępu do danych. W części drugiej zostanie opisana metoda dostępu do danych z wykorzystaniem sterownika JDBC