Quantcast
Channel: Notatnik programisty
Viewing all 102 articles
Browse latest View live

#Zaczytani2016 – ogromna poświąteczna wyprzedaż ebooków

$
0
0

560x200_promo

Chwilę po północy drugiego stycznia 2016 rusza dwudniowa ogromna wyprzedaż ebooków w ebookpoint.pl.
Serwis przygotował dla czytelników ponad 7200 tytułów (ebooków i audiobooków). Promocję wspierają najwięksi polscy wydawcy, m.in.: Literackie, Czarna Owca, Rebis, Nasza Księgarnia, PWN i Wydawnictwo Dolnośląskie. Wszystkie tytuły objęte promocją zostaną zrabatowane do czterech progów cenowych: 6.90 zł, 9.90 zł, 14.90 zł i 19.90 zł. To obniżki sięgające nawet 95% cen detalicznych!

Poniżej udostępniam listę ebooków mogących zainteresować programistów:

Programowanie ogólnie i rozwój projektów

Algorytmika, analiza danych

C++

JAVA

Python

PHP

Javascript

Node.js

HTML, CSS

Elektronika, robotyka, Arduino, Raspberry

C#

SQL

NoSQL

Android

Bazy danych

Grafika, fotografia

Matematyka i nie tylko

Ciekawostki

Lista według rankingu popularności

Ranking z ostatniej tego typu promocji:

 

Artykuł #Zaczytani2016 – ogromna poświąteczna wyprzedaż ebooków pochodzi z serwisu Notatnik programisty.


TOP 10 ebooków w akcji #ZACZYTANI2016

$
0
0

ZACZYTANI2016

Wczoraj tuż po północy w jednym z największych sklepów z ebookami, rozpoczęła się wyczekiwana zwłaszcza przez wszystkich posiadaczy czytników akcja #zaczytani2016 z okazyjnymi rabatami. Promocja zakończy się dzisiaj o północy, a na następne takie obniżki będziemy czekać do przyszłego roku. Okazji jest pełno, a ja jak zwykle promuję rozwój w dziedzinie programowania. Po pierwszym dniu najchętniej wybieranymi pozycjami informatycznymi polecanymi przeze mnie były:

Miejsce pierwsze

AngularJS. Profesjonalne techniki

AngularJS. Profesjonalne techniki

Autor: Adam Freeman

ISBN: 978-83-283-0200-6

Format: 168x237, stron: 632

Data wydania: 2015-02-06

Cena: 79.00 zł
(Cena druku: 99.00 zł)

Miejsce drugie

Czysty kod. Podręcznik dobrego programisty

Czysty kod. Podręcznik dobrego programisty

Autor: Robert C. Martin

ISBN: 978-83-283-1401-6

Format: 168x237, stron: 424

Data wydania: 2015-03-25

Cena: 54.99 zł
(Cena druku: 69.00 zł)

Miejsce trzecie

AngularJS. Pierwsze kroki

AngularJS. Pierwsze kroki

Autor: Dariusz Kalbarczyk, Arkadiusz Kalbarczyk

ISBN: 978-83-283-1590-7

Format: 158x235, stron: 208

Data wydania: 2015-05-26

Cena: 31.99 zł
(Cena druku: 39.90 zł)

Miejsce czwarte

Java. Kompendium programisty. Wydanie IX

Java. Kompendium programisty. Wydanie IX

Autor: Herbert Schildt

ISBN: 978-83-283-0815-2

Format: , stron:

Data wydania:

Cena: 149.00 zł 149.00 zł
(Cena druku: 179.00 zł)

Miejsce piąte

Mistrz czystego kodu. Kodeks postępowania profesjonalnych programistów

Mistrz czystego kodu. Kodeks postępowania profesjonalnych programistów

Autor: Robert C. Martin

ISBN: 978-83-246-7537-1

Format: , stron:

Data wydania:

Cena: 31.99 zł 31.99 zł
(Cena druku: 39.00 zł)

Miejsce szóste

Python. Wprowadzenie. Wydanie IV

Python. Wprowadzenie. Wydanie IV

Autor: Mark Lutz

ISBN: 978-83-246-4991-4

Format: , stron:

Data wydania:

Cena: 119.00 zł 119.00 zł
(Cena druku: 149.00 zł)

Miejsce siódme

JavaScript i jQuery. Interaktywne strony WWW dla każdego

JavaScript i jQuery. Interaktywne strony WWW dla każdego

Autor: Jon Duckett

ISBN: 978-83-283-0129-0

Format: , stron:

Data wydania:

Cena: 79.00 zł 79.00 zł
(Cena druku: 99.00 zł)

Miejsce ósme

TDD. Sztuka tworzenia dobrego kodu

TDD. Sztuka tworzenia dobrego kodu

Autor: Kent Beck

ISBN: 978-83-246-8503-5

Format: , stron:

Data wydania:

Cena: 39.00 zł 39.00 zł
(Cena druku: 49.00 zł)

Miejsce dziewiąte

Node.js w akcji

Node.js w akcji

Autor: Mike Cantelon, Marc Harter, TJ Holowaychuk, Nathan Rajlich

ISBN: 978-83-246-9681-9

Format: , stron:

Data wydania:

Cena: 54.99 zł 54.99 zł
(Cena druku: 69.00 zł)

Miejsce dziesiąte

Pragmatyczny programista. Od czeladnika do mistrza

Pragmatyczny programista. Od czeladnika do mistrza

Autor: Andrew Hunt, David Thomas

ISBN: 978-83-246-9270-5

Format: , stron:

Data wydania:

Cena: 47.00 zł 47.00 zł
(Cena druku: 69.00 zł)

Zwinne wytwarzanie oprogramowania. Najlepsze zasady, wzorce i praktyki

Zwinne wytwarzanie oprogramowania. Najlepsze zasady, wzorce i praktyki

Autor: Robert C. Martin

ISBN: 978-83-246-9685-7

Format: , stron:

Data wydania:

Cena: 69.90 zł 69.90 zł
(Cena druku: 89.00 zł)

HTML5. Przewodnik encyklopedyczny

HTML5. Przewodnik encyklopedyczny

Autor: Adam Freeman

ISBN: 978-83-246-7181-6

Format: , stron:

Data wydania:

Cena: 99.00 zł 99.00 zł
(Cena druku: 129.00 zł)

 

Artykuł TOP 10 ebooków w akcji #ZACZYTANI2016 pochodzi z serwisu Notatnik programisty.

Termotransferowa drukarka etykiet Zebra P4T

$
0
0

zebraW ostatnim czasie pracowałem nad systemem dla dużej amerykańskiej firmy, który miał usprawnić zarządzanie zleceniami dla operatorów wózków widłowych w magazynie.
Importujemy dane pochodzące z zewnętrznego systemu ERP, pracownik korzystający ze stanowiska komputerowego na hali magazynowej rozdysponowuje poszczególne zadania, a operatorzy wózków na bieżąco mają podgląd aktualnych kursów do wykonania na przenośnym mini komputerze / czytniku kodów kreskowych Intermec. Po zakończeniu całego procesu dla jednego zlecenia osoba je kompletująca drukuje etykietę za pomocą drukarki Zebra P4T. Główna część systemu po stronie serwera została napisana w Javie i uruchomiona na Tomcacie. Panel dla operatora na magazynie korzysta z AngularaJS i komunikuje się z serwerem za pomocą socket.io, zresztą podobnie jak panele na urządzenia mobilne Intermec.

Dane techniczne

Kod produktu: P4T
Rodzaj druku: termotransfer
Rozdzielczość druku [dpi]: 203
Maks. prędkość druku [mm/s]: 038
Szerokość druku [mm]: 101.6
Maks. długość druku [mm]: 914
Min. szerokość etykiet [mm]: 50.8
Szerokość etykiety [mm]: 104
Wysokość etykiety [mm]: 914
Maks. średnica zewn. rolki etykiet [mm]: 66
Maks. długość taśmy barwiącej [m]: 30
Maks. szerokość taśmy barwiącej [mm]: 109.2
Procesor: 32-bit
Ilość pamięci FLASH: 008 MB
Ilość pamięci RAM: 016 MB
Dostępne interfejsy: USB, RS-232, Bluetooth
Zasilanie: akumulator 7,4 V
Języki programowania: CPCL, EPL, ZPL, EPL2, XML
Wymiary [mm]: 177,8 x 218,4 x 76,2
Temperatura pracy: od 0°C do 45°C
Temperatura składowania: od -30°C do 70°C
Dopuszczalna wilgotność otoczenia [%]: od 10% do 90 %
Gwarancja producenta [mc]: 12
Pojemność akumulatora [mAh]: 4200
Bezpieczny upadek na twardą pow. [m]: 1.5
Obsługiwane kody kreskowe: 1D, 2D, GS1 Databar, PDF

Komunikacja

Ponieważ oba wykorzystywane urządzenia połączone są z siecią przez wifi, postanowiłem wykonać centralne sterowanie zleceniami wydruków na serwerze aplikacji. Cały problem polegał na tym, że serwer pracujący w innej lokalizacji nie mógł łączyć się do wewnętrznej sieci wifi. W związku z tym został przygotowany jeszcze jeden program, który instalowany jest na stanowisku komputerowym na magazynie. Pełni on rolę pośrednika – wykrywa wszystkie drukarki Zebra pracujące w sieci, nasłuchuje żądania wydruków pochodzące z serwera i wysyła je do konkretnych drukarek. Tym sposobem osoba zlecająca wydruk etykiety na przenośnym urządzeniu wysyła żądanie do serwera, na którym uzupełniany jest szablon etykiety o odpowiednie dane, a on z kolei wysyłany jest do aplikacji uruchomionej na komputerze operatora na magazynie, która już bezpośrednio łączy się z drukarką i zleca wydruk.

Połączenie z drukarką wykonywane jest przez sockety (java.net.Socket(IP, PORT)) i proste zlecenie wysyłki komendy może wyglądać tak:

Socket client = new Socket("192.168.1.1", 6101);
try (DataOutputStream output = new DataOutputStream(client.getOutputStream())) {
    output.writeBytes("COMMAND");
}

Gdzie w konstruktorze obiektu Socket przekazano adres IP drukarki i port.

Zebra API

Można jednak skorzystać z SDK udostępnionego przez Zebrę która zawiera API z bibliotekami dla platofrm: android, blackberry, iOS, windows mobile no i pc.

Wykrywanie podłączonych do sieci drukarek:

API wykorzystuje protokół SNMP do wykrywania urządzeń pracujących w sieci, a przykład kodu wyszukującego drukarki wygląda następująco:

NetworkDiscoverer.localBroadcast(new DiscoveryHandler() {
	@Override
	public void foundPrinter(DiscoveredPrinter dp) {
		log.info("Wykryto drukarkę, adres IP: " + dp.address);
	}

	@Override
	public void discoveryFinished() {
		log.info("Zakończono wyszukiwanie drukarek");
	}

	@Override
	public void discoveryError(String error) {
		log.warn("Wystąpił błąd: " + error);
	}
}

Wysłanie komendy do drukarki:

Connection printerConnection = new TcpConnection(address, port);
try {
	printerConnection.open();
	printerConnection.write(command.getBytes());
} finally {
	printerConnection.close();
}

ZPL – format danych konfiguracji wydruku

Układ etykiety w drukarkach Zebra definiuje się w specjalnym formacie ZPL (Zebra programming language). Nie będę Was zanudzał samym opisem składni, bo świetnie jest to udokumentowane w tych dwóch plikach:

Przydatnym narzędziem jest Online ZPL Viewer za pomocą którego możemy edytować etykiety i zobaczyć efekty bezpośrednio w przeglądarce.

Poniżej kilka przykładów etykiet z napisem NotatnikProgramisty.pl:

^XA^LH 5,10
^FO10,10^ADN,100,30^FDNotatnikProgramisty.pl^FS
^LH0,0
^XZ

Wynik:

np_zpl

Dodajmy kod kreskowy (Code 128):

^XA^LH 5,10
^FO40,10^ADN,100,20^FDNotatnikProgramisty.pl^FS
^LH0,0
^FO25,200
^BCN,200,Y,N,N
^FD>:NotatnikProgramisty.pl^FS
^XZ

np_zpl2

Real foto:

WP_20160109_001

Podsumowanie

Urządzenie drukuje etykiety błyskawicznie, posiada również możliwość komunikacji przez USB, kabel ethernetowy oraz z wykorzytsaniem bluetooth, a SDK udostępnione przez Zebrę zawiera wiele przykładów. Co ciekawe bardzo szybko odpisali mi na pytanie zadane na facebooku. Wadą jest z pewnością cena tej drukarki (3-4 tys. zł) oraz dosyć szybkie zużywanie się taśmy do termotransferu. Na pewno domyślacie się jak łatwo można będzie połączyć taką drukarkę z RaspberryPI czy nawet Arduino :)

Artykuł Termotransferowa drukarka etykiet Zebra P4T pochodzi z serwisu Notatnik programisty.

Odroid C1+ i WRTnode

$
0
0

Zobaczcie co dzisiaj do mnie dojechało z ‎Kamami‬.odriod_wrt_small
Zapowiadają się kolejne ciekawe wieczory i czas sformatować karty z systemami dla Raspberry PI.

‎Odroid‬ posiada:

  • procesor Cortex®-A5 (ARMv7) 1.5Ghz quad core
  • Mali-450 MP2 GP OpenGL ES 2.0/1.1 w Linuksie oraz Androidzie
  • 1 GB DDR3 SDRAM
  • 40-pinowe GPIO + 7-pinowe I2S
  • Gigabit Ethernet
  • Gniazdo pamięci Flash eMMC4.5 HS200 lub UHS-1 SDR50 MicroSD
  • Gniazdo USB 2.0 x 4, USB OTG x 1
  • Wbudowany odbiornik podczerwieni

WRTnode‬ to:

  • sprzęt opensource dla systemu OpenWrt
  • procesor MTK MT7620N 580MHz (MIPS24KEc)
  • pamięć RAM: 512Mb DDR2 (64MB)
  • pamięć Flash: 128Mb (16MB) z interfejsem SPI
  • WiFi 802.11n 2.4GHz, 300Mbit, 2T2R
  • 23 linie GPIO
  • interfejsy JTAG, SPI, UART, USB 2.0 Host

Natomiast do WRTnode można wpiąć shield, który rozszerza urządzenie o:

  • 4 porty USB
  • Interfejs Ethernet 100Mb z gniazdem RJ45 (interfejs może pracować jako port LAN lub WAN)
  • wyprowadzenie pinów: UART, I2C, SPI
  • 12 linii GPIO

Na Odroidzie zainstalowałem już OpenELECa do domowego media center bez większych problemów w kilka minut. Wszystko działa bardzo płynnie, ale więcej już w kolejnym wpisie :)

 

odriod_wrt

Artykuł Odroid C1+ i WRTnode pochodzi z serwisu Notatnik programisty.

Pierwsze kroki z Odroid C1+, OpenELEC

$
0
0

odroid-c1Odroid C1+ to godny konkurent dla Raspberry PI 2. Dzięki uprzejmości sklepu Kamami.pl mam możliwość jego przetestowania, a w kilku najbliższych artykułach będę opisywał jak działa ten mini komputer z różnymi systemami operacyjnymi. A jest z czego wybierać, bo dostępne są następujące dystrybucje:

Oficjalne:

Nieoficjalne:

Podstawowe cechy

Odroid C1+ to kolejny mini komputer o dużej mocy obliczeniowej. Jest wyposażony w czterordzeniowy procesor Amlogic S805, grafikę Mali-450 oraz w interfejs Gigabit Ethernet.

Za pomocą Odroida C1 możemy sterować kinem domowym lub używać go jak zwykłego komputera do przeglądania stron internetowych, grania w gry lub komunikowania się z innymi użytkownikami w sieci. Dzięki 40-pinowym GPIO pozwala na tworzenie także własnych projektów elektronicznych, które mogą zautomatyzować wiele funkcji w naszych domach.

Parametry:

  • Procesor Amlogic ARM® Cortex®-A5 (ARMv7) 1.5Ghz quad core CPUs
  • Mali-450 MP2 GPU (OpenGL ES 2.0/1.1 w Linuksie oraz Androidzie)
  • 1 GB DDR3 SDRAM
  • 40-pinowe GPIO + 7-pinowe I2S
  • Gigabit Ethernet
  • Gniazdo pamięci Flash eMMC4.5 HS200 lub UHS-1 SDR50 MicroSD Card
  • Gniazdo USB 2.0  x 4, USB OTG x 1
  • Odbiornik podczerwieni

No właśnie – zwróćcie uwagę, że urządzenie posiada wbudowany odbiornik podczerwieni! Dzięki temu po zaopatrzeniu się w jakąś obudowę (np. taką czarną), otrzymujemy gotowy sprzęt,  który możemy podłączyć pod TV i sterować nim za pomocą pilota.

odroid-c1-z-front-back_medium

Raspberry PI 2 vs Odroid C1

 

ODROID-C1 RPi 2 Model B
odroid-c1 raspberry-pi-2-rpi2-model-b-1gb
Procesor
Amlogic S805 SoC
4 x ARM® Cortex®-A5 1.5GHz
ARMv7 Architecture @28nm
Broadcom BCM2836
4 x ARM® Cortex®-A7 900Mhz
ARMv7 Architecture @40nm
Układ graficzny 2 x ARM® Mali™-450MP 600MHz 1 x VideoCore IV 250MHz
RAM 1GB 32bit DDR3 792MHz 1GB 32bit LP-DDR2 400MHz
Pamięć Flash Micro-SD UHS-1@100Mhz/SDR50 lub
eMMC
Micro-SD @50Mhz/SDR25,
brak eMMC
USB2.0 4 Porty 4 Porty
USB2.0 OTG 1 NIE
Ethernet/LAN 10/100/1000 Mbit/s 10/100 Mbit/s
Wyjście wideo HDMI HDMI / Composite RCA
Wyjście Audio HDMI HDMI / 3.5mm Jack
Wejście kamery USB 720p MIPI CSI 1080p
Zegar RTC TAK NIE
IR Receiver TAK NIE
Port rozszerzeń 40pin (GPIO/UART/SPI/I2C/ADC)
7pin (I2S)
40pin (GPIO/UART/SPI/I2C/I2S)
ADC 2 kanały po 10bit NIE
Wymiary 85 x 56mm (3.35” x 2.2”) 85 x 56mm (3.35” x 2.2”)
Waga 40g 42g

 

Ekipa z hardkernel.com przeprowadziła kilka testów za pomocą popularnych programów:Unix-Bench, SysBench and N-Bench, w celu porównania tych dwóch mini komputerów:

rpi_vs_odroid

Jak widać, Raspberry PI pozostaje w tyle za Odroidem.

Instalujemy domowe centrum multimedialne OpenELEC

bootopenelecPierwszym zastosowaniem urządzenia jakie chciałem przetestować, to wykorzystanie go jako centrum multimedialne. Ponieważ znalazłem dystrybucję OpenELECa (popularną na Raspberry PI), postanowiłem ją zainstalować. OpenELEC to dosyć mała dystrybucja Linuksa oparta na odtwarzaczu multimedialnym Kodi (dawniej XBMC).

Tu na forum odroid.com znajdziemy odnośniki do pobrania najnowszych wersji dystrybucji OpenELEC. Ja pobrałem gotowy obraz dla karty SD z aktualnie stabilną wersją OpenELEC 6.0.3 – Kodi Isengard 15.2 Final stąd.

Po pobraniu i rozpakowaniu mamy na dysku plik z rozszerzeniem .img zawierający obraz dystrybucji Linuksa. Aby go wgrać na kartę SD możemy wykorzystać np. program Win32DiskImager. Tutaj można pobrać wersję dla Windowsa (WinXP/Win7/Win10).

image-writer

  1. Podłączamy przez USB kartę pamięci micro SD i wybieramy literę zamontowanego dysku.
  2. Wskazujemy ścieżkę pliku pobranego obrazu OpenELEC.
  3. Zapisujemy obraz na karcie klikając przycisk Write.

I to tyle. Po chwili mamy na karcie gotowy do uruchomienia system.

 

SSH

Po podłączeniu przewodu ethernetowego możemy sprawdzić przypisany adres IP w zakładce: System->O systemie->Podsumowanie. Otwieramy putty, w polu Host name (or IP address) wpisujemy IP podłączonego Odroida, port zostawiamy domyślny 22, klikamy Open i wpisujemy:

  1. Login: root
  2. Hasło: openelec

Jak to wygląda w praktyce?

 

Podsumowanie

System OpenELEC na Odroidzie C1+ działa bardzo płynnie. Nie zauważyłem żadnych zacięć podczas oglądania filmów. Dźwięk przesyłany jest do ekranu przewodem HDMI. Problem na jaki trafiłem, to brak możliwości odtwarzania wideo z VOD TVP. Przy próbie uruchomienia jakiegokolwiek materiału pojawia się błąd. Próbowałem zainstalować dodatek z sd-xbmc.org. jednak bezskutecznie. To co chciałbym jeszcze skonfigurować, to możliwość sterowania interfejsem za pomocą pilota od TV i wbudowanego odbiornika podczerwieni.

Sprzęt do testów udostępnił sklep internetowy kamami.pl za co serdecznie dziękuję.

m_kamami_logo

Na koniec kilka materiałów z Youtube’a


Raspberry Pi. Najlepsze projekty

Raspberry Pi. Najlepsze projekty

Autor: Andrew Robinson, Mike Cook

ISBN: 978-83-246-9221-7

Format: 168x237, stron: 432

Data wydania: 2014-09-09

Opis: Wykorzystaj ogromny potencjał miniaturowego komputera! Raspberry Pi to prawdziwy komputer o rozmiarach lekko przerośniętej karty kredytowej. Posiada on ogromny potencjał, całkiem sporą moc obliczeniową, a do tego kosztuje naprawdę niewiele. Platforma ta była projektowana z myślą o nauce programowania dla dzieci. Jednak, jak to często bywa, historia potoczyła się zupełnie inaczej.

Cena: 69.00zł

Raspberry Pi. Przewodnik użytkownika. Wydanie III

Raspberry Pi. Przewodnik użytkownika. Wydanie III

Autor: Eben Upton, Gareth Halfacree

ISBN: 978-83-283-0703-2

Format: 168x237, stron: 328

Data wydania: 2015-08-03

Opis: Bogate źródło informacji na temat Raspberry Pi! Raspberry Pi to komputer wielkości karty kredytowej. Wśród jego głównych atutów można wymienić ogrom możliwości oraz niską cenę. Początkowo miał pełnić rolę platformy do nauki programowania, jednak szybko znalazł tysiące innych zastosowań! Raspberry Pi jest używany jako serwer WWW, domowe media center

Cena: 49.00zł

Artykuł Pierwsze kroki z Odroid C1+, OpenELEC pochodzi z serwisu Notatnik programisty.

Odroid C1+, Odrobian i Kiosk mode

$
0
0

odroid-c1

W jednym z naszych wdrożeń systemu ERP pojawiło się zapotrzebowanie na zaprojektowanie możliwości prezentacji aktualnego stanu na dockach załadunkowych w magazynie na przemysłowym ekranie LED. Rozwiązanie zostało wykonane na Raspberry PI 2, ale idąc za ciosem w poznawaniu Odroida C1+ postanowiłem pokazać Wam jak w łatwy sposób skonfigurować to urządzenie do pracy w trybie kiosku.

W zasadzie nie planowałem tego artykułu, ale akurat testowałem dystrybucję Odrobian na Odroida, a ponieważ bezpośrednio po instalacji była już zainstalowana przeglądarka chromium-browser, postanowiłem sprawdzić możliwość konfiguracji systemu w trybie kiosku (mając już doświadczenia z RPI 2).

Założenia

Urządzenie będzie podłączone do ekranu LED przewodem HDMI, a dostęp do sieci będzie zapewniony przez WiFi. Jak to z WiFi bywa, może się zdarzyć, że z jakiegoś powodu sieć będzie niedostępna. Dlatego postanowiłem skonfigurować system tak aby:

  1. Po wystartowaniu systemu została uruchomiona przeglądarka w trybie pełnoekranowym.
  2. Strona startowa będzie plikiem HTML zapisanym na karcie pamięci.
  3. Strona serwująca dane będzie udostępniona na serwerze z system ERP.
  4. Po otworzeniu statycznej strony HTML w przeglądarce na Odroidzie spróbujemy odpytywać się ajaxem do serwera, czy jest dostępny (czy mamy połączenie z siecią).
  5. Odpytywanie będzie tak długo wykonywane, dopóki nie zostanie nawiązane skuteczne połączenie.
  6. W przypadku powodzenia zostanie wykonane już bezpośrednie przekierowanie do strony na docelowym serwerze.
  7. Po stronie głównego serwera również zostanie obsłużone sprawdzanie połączenia ajaxem.

Rozwiązanie ma taki plus, że statyczny plik HTML wgrany na kartę pamięci Odroida służy tylko za pośrednika w nawiązaniu połączenia, aby nie wyświetlić na starcie białego ekranu z informacją o tym że np. „Strona internetowa jest niedostępna”. Po wykryciu dostępu do sieci wykonywane jest przekierowanie, a reszta jest już pobierana z docelowego serwera. Dzięki temu nie potrzebujemy wgrywać aktualizacji na kartę pamięci, bo wszystko co będzie wyświetlone w przeglądarce możemy zmienić już na naszym serwerze.

Instalujemy Odriobiana

W tym wpisie na forum Odroida znajdziemy wszystkie niezbędne informacje na temat dystrybucji Odrobiana. Pobieramy obraz i wgrywamy go na kartę pamięci. Na dzień dzisiejszy aktualna wersja to Odrobian 1.2 Jessie – MATE i pobrałem ją stąd.

Obraz Linuxa można zapisać w tak, jak opisałem to w poprzednim wpisie.

Konfiguracja pulpitu

  1. Włączamy auto ukrywanie pasków narzędzi (w preferencjach po kliku prawym przyciskiem myszy).
  2. Usuwamy wszystkie ikony z pulpitu narzędziemy dconf Editor – parametr ‚show-desktop-icons’:
    Screenshot-dconf Editor
  3. Ustawiamy tło pulpitu i obraz tak, aby wygląd był zbliżony do następnie przygotowanej statycznej strony HTML:
    Screenshot

 

Tworzymy statyczną stronę HTML

Plik umieszczony na karcie pamięci Odroida.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="pl">
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8">
	<title>GE</title>
	<style>
		body {
			background-image: url("img/logo.png");
			background-repeat: no-repeat;
			background-attachment: fixed;
			background-position: center; 
			background-color: #244771;
		}
	</style>
	<script src="js/jquery-2.2.0.min.js"></script>
	<script src="js/notify.min.js"></script>
	<script>
		(function(){
			var ledBoardURL = 'http://krzysztofjelonek.net/files/odroid/kiosk/index.php';
			$.ajax({
				type: 'HEAD',
				url: ledBoardURL,
				success: function() {
					$(location).attr('href', ledBoardURL);
				},
				error: function(err) {
					console.log(err);
					$.notify("Błąd połączenia z internetem!", "error");
				}
			});			
			setTimeout(arguments.callee, 5000);
		})();
	</script>
</head>
<body>
	
</body>
</html>

Zapisałem go pod ścieżką: /home/odroid/Documents/kiosk/index.html

W powyższym fragmencie najważniejsze jest wywołanie javascriptowe:

(function(){
	var ledBoardURL = 'http://krzysztofjelonek.net/files/odroid/kiosk/index.php';
	$.ajax({
		type: 'HEAD',
		url: ledBoardURL,
		success: function() {
			$(location).attr('href', ledBoardURL);
		},
		error: function(err) {
			console.log(err);
			$.notify("Błąd połączenia z internetem!", "error");
		}
	});			
	setTimeout(arguments.callee, 5000);
})();

Jeśli zawartość strony pod adresem zapisanym w zmiennej ledBoardURL zostanie pobrana, to wykonujemy do niej przekierowanie: $(location).attr(‚href’, ledBoardURL). W przeciwnym wypadku wyświetlamy powiadomienie o problemie: $.notify(„Błąd połączenia z internetem!”, „error”) i czynności powtarzamy co pięć sekund: setTimeout(arguments.callee, 5000).

Do powiadomień wykorzystałem Notify.js.

Konfigurujemy autostart przeglądarki chromium-browser

Po rozwinięciu menu pulpitu wpisujemy „startup” i wybieramy „Startup applications”. Dodajemy nową pozycję i w komendzie wpisujemy:
chromium-browser –disable-translate –kiosk –incognito file:///home/odroid/Documents/kiosk/index.html

Screenshot-Edit Startup Program

, gdzie ‚file:///home/odroid/Documents/kiosk/index.html‚ jest ścieżką pod którą zapisaliśmy nasz lokalny plik html na karcie pamięci.

Wyłączamy wygaszacz ekranu

Odznaczamy checkbox ‚Activate screensaver when computer is idle’.

Screenshot-4

Wyłączamy ustawienia oszczędzania energii

W obu opcjach wyboru ustawiamy „Never”.

Screenshot-5

Tworzymy przykładowy widok HTML na zewnętrznym serwerze

Tutaj mała uwaga – aby dane mogły być pobrane z innej domeny przez javascript, należy ustawić odpowiednio nagłówek Access-Control-Allow-Origin. W moim przypadku strona serwowana jest przez Javę, ale na potrzeby tego wpisu umieściłem przykładowy szablon w php. Przed wysłaniem jakiegokolwiek znaku dodajemy linię:

<?php header('Access-Control-Allow-Origin: *');?>

A źródło całej strony wygląda tak:

<?php header('Access-Control-Allow-Origin: *');?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="pl">
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
        <title>KIOSK MODE</title>
        <style>
            body {
                background-image: url("img/logo.png");
                background-repeat: no-repeat;
                background-attachment: fixed;
                background-position: center;
                background-color: #244771;
            }
            .entries-container {
                margin: 0px;
                padding: 0px;
                width: 100%;
                box-shadow: 10px 10px 5px #888888;
                border: 1px solid #000000;
                -moz-border-radius-bottomleft: 0px;
                -webkit-border-bottom-left-radius: 0px;
                border-bottom-left-radius: 0px;
                -moz-border-radius-bottomright: 0px;
                -webkit-border-bottom-right-radius: 0px;
                border-bottom-right-radius: 0px;
                -moz-border-radius-topright: 0px;
                -webkit-border-top-right-radius: 0px;
                border-top-right-radius: 0px;
                -moz-border-radius-topleft: 0px;
                -webkit-border-top-left-radius: 0px;
                border-top-left-radius: 0px;
            }
            .entries-container table {
                border-collapse: collapse;
                border-spacing: 0;
                width: 100%;
                height: 100%;
                margin: 0px;
                padding: 0px;
            }
            .entries-container tr:last-child td:last-child {
                -moz-border-radius-bottomright: 0px;
                -webkit-border-bottom-right-radius: 0px;
                border-bottom-right-radius: 0px;
            }
            .entries-container table tr:first-child td:first-child {
                -moz-border-radius-topleft: 0px;
                -webkit-border-top-left-radius: 0px;
                border-top-left-radius: 0px;
            }
            .entries-container table tr:first-child td:last-child {
                -moz-border-radius-topright: 0px;
                -webkit-border-top-right-radius: 0px;
                border-top-right-radius: 0px;
            }
            .entries-container tr:last-child td:first-child {
                -moz-border-radius-bottomleft: 0px;
                -webkit-border-bottom-left-radius: 0px;
                border-bottom-left-radius: 0px;
            }
            .entries-container tr:hover td {} .entries-container tr:nth-child(odd) {
                background-color: #ffffff;
            }
            .entries-container tr:nth-child(even) {
                background-color: #d3e9ff;
            }
            .entries-container td {
                vertical-align: middle;
                border: 1px solid #000000;
                border-width: 0px 1px 1px 0px;
                text-align: left;
                padding: 7px;
                font-size: 42px;
                font-family: Arial;
                font-weight: normal;
                color: #323232;
            }
            .entries-container tr:last-child td {
                border-width: 0px 1px 0px 0px;
            }
            .entries-container tr td:last-child {
                border-width: 0px 0px 1px 0px;
            }
            .entries-container tr:last-child td:last-child {
                border-width: 0px 0px 0px 0px;
            }
            .entries-container tr:first-child td {
                background: -o-linear-gradient(bottom, #0057af 5%, #007fff 100%);
                background: -webkit-gradient( linear, left top, left bottom, color-stop(0.05, #0057af), color-stop(1, #007fff));
                background: -moz-linear-gradient( center top, #0057af 5%, #007fff 100%);
                filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#0057af", endColorstr="#007fff");
                background: -o-linear-gradient(top, #0057af, 007fff);
                background-color: #0057af;
                border: 0px solid #000000;
                text-align: center;
                border-width: 0px 0px 1px 1px;
                font-size: 42px;
                font-family: Arial;
                font-weight: bold;
                color: #ffffff;
            }
            .entries-container tr:first-child:hover td {
                background: -o-linear-gradient(bottom, #0057af 5%, #007fff 100%);
                background: -webkit-gradient( linear, left top, left bottom, color-stop(0.05, #0057af), color-stop(1, #007fff));
                background: -moz-linear-gradient( center top, #0057af 5%, #007fff 100%);
                filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#0057af", endColorstr="#007fff");
                background: -o-linear-gradient(top, #0057af, 007fff);
                background-color: #0057af;
            }
            .entries-container tr:first-child td:first-child {
                border-width: 0px 0px 1px 0px;
            }
            .entries-container tr:first-child td:last-child {
                border-width: 0px 0px 1px 1px;
            }
            .docks-container {
                margin: 0px;
                padding: 0px;
                width: 100%;
                box-shadow: 10px 10px 5px #888888;
                border: 1px solid #000000;
                -moz-border-radius-bottomleft: 0px;
                -webkit-border-bottom-left-radius: 0px;
                border-bottom-left-radius: 0px;
                -moz-border-radius-bottomright: 0px;
                -webkit-border-bottom-right-radius: 0px;
                border-bottom-right-radius: 0px;
                -moz-border-radius-topright: 0px;
                -webkit-border-top-right-radius: 0px;
                border-top-right-radius: 0px;
                -moz-border-radius-topleft: 0px;
                -webkit-border-top-left-radius: 0px;
                border-top-left-radius: 0px;
            }
            .docks-container table {
                border-collapse: collapse;
                border-spacing: 0;
                width: 100%;
                height: 100%;
                margin: 0px;
                padding: 0px;
            }
            .docks-container tr:last-child td:last-child {
                -moz-border-radius-bottomright: 0px;
                -webkit-border-bottom-right-radius: 0px;
                border-bottom-right-radius: 0px;
            }
            .docks-container table tr:first-child td:first-child {
                -moz-border-radius-topleft: 0px;
                -webkit-border-top-left-radius: 0px;
                border-top-left-radius: 0px;
            }
            .docks-container table tr:first-child td:last-child {
                -moz-border-radius-topright: 0px;
                -webkit-border-top-right-radius: 0px;
                border-top-right-radius: 0px;
            }
            .docks-container tr:last-child td:first-child {
                -moz-border-radius-bottomleft: 0px;
                -webkit-border-bottom-left-radius: 0px;
                border-bottom-left-radius: 0px;
            }
            .docks-container tr:hover td {} .docks-container td {
                vertical-align: middle;
                border: 1px solid #000000;
                border-width: 0px 1px 1px 0px;
                text-align: left;
                padding: 7px;
                font-size: 42px;
                font-family: Arial;
                font-weight: normal;
                color: #000000;
            }
            .docks-container tr:last-child td {
                border-width: 0px 1px 0px 0px;
            }
            .docks-container tr td:last-child {
                border-width: 0px 0px 1px 0px;
            }
            .docks-container tr:last-child td:last-child {
                border-width: 0px 0px 0px 0px;
            }
            .docks-container tr:first-child td {
                border: 0px solid #000000;
                text-align: center;
                border-width: 0px 0px 1px 1px;
                font-size: 42px;
                font-family: Arial;
                font-weight: bold;
                color: #ffffff;
            }
            .docks-container tr:first-child td:first-child {
                border-width: 0px 0px 1px 0px;
            }
            .docks-container tr:first-child td:last-child {
                border-width: 0px 0px 1px 1px;
            }
            html,
            body {
                height: 100%;
                text-align: center;
            }
            .main {
                height: 100%;
                width: 99%;
                display: table;
                text-align: center;
            }
            .wrapper {
                display: table-cell;
                height: 100%;
                vertical-align: middle;
                text-align: center;
            }
        </style>
        <script src="js/jquery-2.2.0.min.js"></script>
        <script src="js/notify.min.js"></script>
    </head>
    <body style="vertical-align: middle; margin: 0;">
        <div class="main">
            <div class="wrapper">
                <div class="docks-container">
                    <table>
                        <tr>
                            <td style="width:5%; background-color: #77dd77;">D1</td>
                            <td style="width:5%; background-color: #77dd77;">D2</td>
                            <td style="width:5%; background-color: #77dd77;">D3</td>
                            <td style="width:5%; background-color: #77dd77;">D4</td>
                            <td style="width:5%; background-color: #77dd77;">D5</td>
                            <td style="width:5%; background-color: #77dd77;">D6</td>
                            <td style="width:5%; background-color: #77dd77;">D7</td>
                            <td style="width:5%; background-color: red;">D8</td>
                            <td style="width:5%; background-color: #77dd77;">D9</td>
                            <td style="width:5%; background-color: #77dd77;">D10</td>
                            <td style="width:5%; background-color: red;">D11</td>
                            <td style="width:5%; background-color: red;">D12</td>
                            <td style="width:5%; background-color: #77dd77;">D13</td>
                            <td style="width:5%; background-color: #77dd77;">D14</td>
                            <td style="width:5%; background-color: #77dd77;">D15</td>
                            <td style="width:5%; background-color: #77dd77;">D16</td>
                            <td style="width:5%; background-color: #77dd77;">D0</td>
                        </tr>
                    </table>
                </div>
                <div>&nbsp;</div>
                <div class="entries-container" >
                    <table >
                        <tr>
                            <td>Dock</td>
                            <td>Nr rej</td>
                            <td>Nr załadunku</td>
                            <td>Odbiorca</td>
                        </tr>
                        <tr>
                            <td style="text-align: center;">D0</td>
                            <td style="text-align: center;">SB6650</td>
                            <td style="text-align: center;">11220</td>
                            <td style="text-align: center;">Biedronka</td>
                        </tr>
                        <tr>
                            <td style="text-align: center;">D1</td>
                            <td style="text-align: center;">SB6651</td>
                            <td style="text-align: center;">11221</td>
                            <td style="text-align: center;">Lidl</td>
                        </tr>
                        <tr>
                            <td style="text-align: center;">D2</td>
                            <td style="text-align: center;">SB6652</td>
                            <td style="text-align: center;">11222</td>
                            <td style="text-align: center;">Tesco</td>
                        </tr>
                    </table>
                </div>
            </div>
        </div>
    </body>
</html>

 

Wynik:

Przypadek problemu połączenia z siecią:

 

Krótka prezentacja

Podsumowanie

Ufff.. dziesięć razy więcej pracy miałem z przygotowaniem tego wpisu niż z samym uruchomieniem tego ekranu :) Zwróćcie uwagę, że wszystko zostało skonfigurowane tylko i wyłącznie przez pomocnicze programy narzędziowe. Nie musieliśmy edytować żadnych skryptów. Jest tu jeszcze kilka kwestii, które można by poruszyć jak np. wyłączanie niepotrzebnych zapisów na karcie, wyświetlenie jakiegoś loga podczas uruchamiania samego Odrobiana, czy wyłączenie powiadomień.

Ten plik znajdujący się na serwerze, do którego wykonywane jest przekierowanie zaraz po starcie systemu jest tylko prostym statycznym szablonem. W nim również trzeba wykonać obsługę sprawdzania połączenia, a dane powinny być do niego pobierane np. usługami restowymi. Najłatwiej oczywiście w połączeniu z AngularemJS.

Jak widać na tym przykładzie z życia wziętego, te mini komputery takie jak Raspberry PI czy Odroid wcale nie muszą znajdować zastosowań tylko w naszych domach :)

Na koniec jeszcze jedna sprawa – dostęp przez ssh:
Login: odroid
Hasło: odroid

 
m_kamami_logo
Sprzęt do testów udostępnił mi sklep internetowy kamami.pl za co serdecznie dziękuję.

Raspberry Pi. Najlepsze projekty

Raspberry Pi. Najlepsze projekty

Autor: Andrew Robinson, Mike Cook

ISBN: 978-83-246-9221-7

Format: 168x237, stron: 432

Data wydania: 2014-09-09

Opis: Wykorzystaj ogromny potencjał miniaturowego komputera! Raspberry Pi to prawdziwy komputer o rozmiarach lekko przerośniętej karty kredytowej. Posiada on ogromny potencjał, całkiem sporą moc obliczeniową, a do tego kosztuje naprawdę niewiele. Platforma ta była projektowana z myślą o nauce programowania dla dzieci. Jednak, jak to często bywa, historia potoczyła się zupełnie inaczej.

Cena: 69.00zł

Raspberry Pi. Przewodnik użytkownika. Wydanie III

Raspberry Pi. Przewodnik użytkownika. Wydanie III

Autor: Eben Upton, Gareth Halfacree

ISBN: 978-83-283-0703-2

Format: 168x237, stron: 328

Data wydania: 2015-08-03

Opis: Bogate źródło informacji na temat Raspberry Pi! Raspberry Pi to komputer wielkości karty kredytowej. Wśród jego głównych atutów można wymienić ogrom możliwości oraz niską cenę. Początkowo miał pełnić rolę platformy do nauki programowania, jednak szybko znalazł tysiące innych zastosowań! Raspberry Pi jest używany jako serwer WWW, domowe media center

Cena: 49.00zł

Artykuł Odroid C1+, Odrobian i Kiosk mode pochodzi z serwisu Notatnik programisty.

Odroid C1+, Android i przykładowa gra

PHP i podobieństwo dwóch wyrazów

$
0
0

pomylkaTrafiłem ostatnio na ciekawą sytuację. Blisko dziewięć lat temu napisałem system dla zarządzania awizacjami kierowców w magazynach dla największego w Polsce producenta wody. System do dziś supportuję i rozwijam. W międzyczasie przygotowałem integrację danych z SAPem do wymiany informacji za pomocą komunikatów EDI, które wysyłane i odbierane są za pomocą protokołu AS2. Jest to na szczęście już mój ostatni system napisany w PHP, który obsługuję (bo znacznie bardziej lubię Javę).

Ale to właśnie na tym polu zdarzyła mi się ciekawa sytuacja. Korporacja zleciła wprowadzenie zmiany w importach danych tak, aby system sam przydzielał przewoźników do zdefiniowanych tras, z odpowiednimi współczynnikami procentowymi w stosunku do wszystkich listów przewozowych na tych trasach.

Przez trasę rozumie się np. miejsce załadunku: Bielsko-Biała, miejsce dostawy: Warszawa. Dla niej system powinien przydzielać przewoźników dla nowych listów przewozowych według rozkładu procentowego: PPRZEWOŹNIK 1: 50%, PRZEWOŹNIK 2: 50%.

Cały problem polega na tym, że w danych importowych nie otrzymam bezpośrednio identyfikatora tej trasy, a system sam ma ją rozpoznać na podstawie… nazw miejscowości :) To nie byłoby jeszcze jakimś większym problemem, gdyby nie fakt, że w importowanych danych z SAP jest mnóstwo pomyłek. Zobaczcie, co znalazłem dla miasta Bielsko-Biała:

  • Bielsko-Biała
  • Bielsko-Biala
  • Bielsko Biała
  • Bielsko Biala
  • Biesko Biała
  • Biesko-Biała
  • Bisko-Biała
  • BIELSKO BIAŁA
  • BIELSKO-BIAŁA
  • BIELSKO BIAŁ

Koszmar :)

Niestety nie było innego wyjścia i trzeba było zrobić rozpoznawanie trasy dla nowego listu przewozowego za pomocą nazwy miejscowości dostawy. Pierwszy raz spotkałem się z czymś takim, aby w produkcyjnym systemie dane miały być wiązane za pomocą danych tekstowych, które są tak nieprecyzyjne.

Patrząc na te powyższe przykłady od razu widzimy że odnoszą się do tego samego miasta: Bielsko-Biała. Ale jak zmusić nasz program aby widział to samo co my?

Odległość Levenshteina

Pierwszym pomysłem na rozwiązanie tego problemu było wykorzystanie odległości Levenshteina, czyli miary odmienności napisów, zaproponowana w 1965 roku przez Władimira Lewensztejna. Miara ta znajduje zastosowanie w przetwarzaniu informacji, danych w postaci ciągów symboli: w maszynowym rozpoznawaniu mowy, analizie DNA, rozpoznawaniu plagiatów, korekcie pisowni (np. wyszukiwanie w spisie telefonicznym błędnie podanego nazwiska), itp.

W skrócie odległość Levenshteina zwraca liczbę całkowitą równą ilości działań (wstawienie nowego, usunięcie i zmianę znaku w napisie) na inny znak które trzeba przeprowadzić aby dwa ciągi tekstowe były identyczne.

Np. odległość Levenshteina pomiędzy napisami identycznymi, np.

pies
pies

jest zerowa – skoro są identyczne, to potrzeba zero działań, by jeden z nich przeprowadzić na drugi.

Odległość Levenshteina pomiędzy napisami:

granat
granit

wynosi 1, ponieważ do przeprowadzenia pierwszego na drugi wystarcza jedno działanie: zamiana litery a na i.

Odległość pomiędzy napisami:

orczyk
oracz

równa jest 3, ponieważ do przeprowadzenia pierwszego napisu na drugi potrzeba trzech działań: usunięcia liter y i k oraz wstawienia litery a.

Odległość pomiędzy napisami:

marka
ariada

wynosi 4, ponieważ potrzeba co najmniej czterech działań, np.: usunięcia litery m, zamiany k na i oraz dodania d i a.

Funkcja PHP:

int levenshtein ( string $str1 , string $str2 , int $cost_ins , int $cost_rep , int $cost_del )

 

PHP similar_text()

W PHP jest jeszcze dostępna funkcja similar_text(), która została napisana na podstawie publikacji: „Programming Classics: Implementing the World’s Best Algorithms„, która zwraca ilość zgodnych znaków dwóch wyrażeń:

int similar_text ( string $first , string $second [, float &$percent ] )

Dodatkowo w trzecim parametrze można przekazać referencję do zmiennej w które zostanie przypisany wynik procentowy podobieństwa.

 

Zdefiniujmy przypadki testowe

$correctCity = 'Bielsko-Biała';
$cities = [
	'Bielsko-Biała',
	'Bielsko-Biala',
	'Bielsko Biała',
	'Bielsko Biala',
	'Biesko Biała',
	'Biesko-Biała',
	'Bisko-Biała',
	'BIELSKO BIAŁA',
	'BIELSKO-BIAŁA',
	'BIELSKO BIAŁ',
	'Biała-Bielsko',
	'Warszawa'
];

Ponieważ nie chcemy analizować wielkości liter ani żadnych białych znaków przyda się funkcja do konwersji:

function cleanupString(String $string) {
	return mb_strtolower(trim($string),"UTF-8");
}

Nie korzystamy z funkcji strtolower, bo nie zadziała dla polskich znaków.

Zbieramy wyniki dla każdej pozycji:

$correctCity = cleanup($correctCity);
foreach ($cities as $city) {
	$city = cleanup($city);
	$levenshtein = levenshtein($correctCity, $city);
	$similarText = similar_text($correctCity, $city, $similarTextPercent);
	$similarTextPercent = round($similarTextPercent, 2);
}

Wyniki:

MiastoMiasto lowercaseIlość znakówlevenshteinsimilar_textsimilar_text (procent)
Bielsko-Białabielsko-biała14014100
Bielsko-Bialabielsko-biala1321288.89
Bielsko Białabielsko biała1411392.86
Bielsko Bialabielsko biala1331181.48
Biesko Białabiesko biała1321288.89
Biesko-Białabiesko-biała1311396.3
Bisko-Białabisko-biała1221292.31
BIELSKO BIAŁAbielsko biała1411392.86
BIELSKO-BIAŁAbielsko-biała14014100
BIELSKO BIAŁbielsko biał1321288.89
Biała-Bielskobiała-bielsko1410750
Warszawawarszawa811327.27

Teraz trzeba podjąć decyzję – jaką wartość parametru przyjąć za graniczną w celu określenia czy dwa wyrażenia pasują do siebie. Jeśli przyjąć za założenie, że weryfikowane miasto jest zgodne z docelowym gdy zgodność procentowa jest na poziomie np. 80%, to wszystkie przypadki testowe zostaną prawidłowo rozpoznane.

Wydajność

Należy zwrócić uwagę na to, że standardowa funkcja levenshtein w PHP pozwala na porównywanie ciągów znaków do długości 255 znaków. Jeśli zostanie ona przekroczona zostanie zwrócony wynik -1.

Wywoływanie tych dwóch funkcji jest dość kosztowne, ich złożoność obliczeniowa wynosi:

  • levenshtein: O(m*n)
  • similar_text: O(max(n,m)^3)

Gdzie m i n są długościami wyrażeń. Jak widać funkcja levenshtein jest wydajniejniejsza pod względem funkcji similar_text. Ale mimo wszystko obie są dość kosztowne.

Implementacje w różnych językach programowania

Pod tym odnośnikiem znajdziecie implementacje algorytmu odległości Levenshteina w różnych językach programowania. Zarówno iteracyjne jak i rekurencyjne.

Podsumowanie

Problem przedstawiony na początku wpisu został rozwiązany, a przypadki pomyłek algorytmu (raczej dla krótkich nazw miejscowości) wysyłane są na monitoring systemu. Kluczową kwestią w takich rozwiązaniach jest odpowiednie dobranie parametru progu zgodności.

 

PHP. Obiekty, wzorce, narzędzia. Wydanie IV

PHP. Obiekty, wzorce, narzędzia. Wydanie IV

Autor: Matt Zandstra

ISBN: 978-83-246-9178-4

Format: 168x237, stron: 488

Data wydania: 2014-09-08

Opis: Twój przewodnik po obiektowym PHP! Język PHP przebył długą drogę od swoich początków do obecnego poziomu rozwoju. Dziś jest pełnoprawnym, obiektowym językiem programowania, wciąż zdobywającym większe zaufanie i używanym w coraz większych projektach. Jeżeli znasz ten język od dawna, lecz nie jesteś przekonany, że nadaje się on do zaawansowanych zastosowań, albo

Cena: 79.00zł

PHP. Zaawansowane programowanie

PHP. Zaawansowane programowanie

Autor: Peter MacIntyre, Brian Danchilla, Mladen Gogala

ISBN: 978-83-246-3922-9

Format: 168x237, stron: 360

Data wydania: 2012-06-18

Opis: Zacznij tam, gdzie inni kończą! PHP jest obecnie najpopularniejszym językiem programowania aplikacji internetowych, a jego znajomość staje się koniecznością dla każdego programisty. "PHP Zaawansowane programowanie" zapozna Cię z nowymi możliwościami wersji 5.3.x, takimi jak przestrzenie nazw, funkcje anonimowe, Nowdoc, SPL oraz archiwa Phar. Doświadczeni programiści PHP znajdą tu

Cena: 59.00zł

Artykuł PHP i podobieństwo dwóch wyrazów pochodzi z serwisu Notatnik programisty.


Odroid C1+, Android, C64 i powrót do przeszłości

$
0
0

odroid-c1-android_commodore

Przez kilka godzin testowałem Androida na moim Odroidzie C1+. Opisuję poniżej możliwości emulacji C64 i PSP, a artykuł pozwoli Wam powrócić do przeszłości, zwłaszcza jeśli urodziliście się najpóźniej w połowie lat 80-tych.

Instalujemy Androida

Wszystkie niezbędne informacje na temat oficjalnej dystrybucji Androida dla Odroida C1 znajdziemy tutaj. Na dzień publikacji artykułu aktualną wersją jest Android 4.4.2 (v2.2) którego można pobrać stąd.

Po rozpakowaniu zapisujemy obraz systemu na karcie pamięci np. za pomocą programu Win32DiskImager. Tutaj mała uwaga – w jednym z poprzednich wpisów dodałem odnośnik do nieznacznie zmodyfikowanej wersji tego programu (zmiany w buforowaniu). Niestety próby wgrania Androida tą wersją aplikacji nie powiodły się – za każdym razem otrzymywałem komunikaty o błędach zaraz po uruchomieniu urządzenia. Nie miałem natomiast żadnego problemu wykorzystując oficjalną wersję z sourceforge.

pulpit

 

Instalujemy Google Play

Nasz świeży Android niestety nie posiada zainstalowanego oficjalnego Google Play, dzięki któremu można przeszukiwać i instalować aplikacje i gry. Został nam jednak udostępniony nieoficjalny instalator o którym możemy przeczytać tutaj. Na dzień dzisiejszy aktualną wersję można pobrać stąd i pobieramy ją bezpośrednio przez przeglądarkę internetową Androida. Po uruchomieniu instalator poprowadzi nas za rękę, po czym konieczny będzie reboot systemu.

Warto poszukać w Play store aplikacji do obsługi archiwów zip i rar, bo w tych formatach będziemy pobierać gry na C64. Ja zainstalowałem Easy Unrar.

Gry z Play store

Możemy teraz sobie pobrać dowolną grę w play store znaną z telefonów komórkowych. Układ graficzny Odroida radzi sobie bardzo dobrze:

Commodore 64

c64I dotarłem do miejsca, w którym aż uśmiech pojawia mi się na twarzy. C64. Commodore był moim pierwszym komputerem, który dostałem od rodziców w wieku 9-10 lat. W tamtym czasie hitem była gra Koło Fortuny, w którą graliśmy całą rodziną. Z biegiem czasu moja kolekcja kaset magnetofonowych rosła, a wśród ulubionych gier były: Giana Sisters, Ball Blasta, DJ PUFF, RobboPitstop II, Spy vs Spy i jeszcze kilka innych których nazw nie mogę sobie przypomnieć.

Jednak to nie gry wywołują u mnie tak miłe wspomnienia, ale ta nieduża książeczka dołączona do komputera – C64 Instrukcja obsługi. Zawierała ona wiedzę na temat języka programowania Basic. To było wtedy dla mnie jedyne źródło wiedzy w tej tematyce. Nie mieliśmy jeszcze internetu a i w szkołach dopiero co powstawały pracownie komputerowe. Dla tych z Was, którzy również mieli C64 mała niespodzianka – tutaj możecie pobrać tą książkę w formacie PDF :)

c64_basic

W dzieciństwie znacznie więcej przyjemności miałem z zasiadania do tej książki i z poznawania nowych komend, niż z grania w gry. Napisałem w Basicu wiele programów głównie pomocnych do nauki dla siebie samego (zadania matematyczne, nauka dat z historii, później coś związanego z animacjami, itp.), które zapisywały się oczywiście na taśmach magnetofonowych. Połknąłem w tym czasie bakcyla do programowania.

Do pracy z C64 konieczne było posiadanie cartridge’a z systemem który wkładało się z tyłu komputera / klawiatury. Jako ciekawostkę dodam, że miałem dosyć fajną wersję: Black Box v.8, dzięki której mój Commodore potrafił… mówić! Tak, system posiadał zintegrowany system syntezy mowy i dźwięku. Wystarczyło wpisać odpowiednie komendy, a komputer do nas przemówił w języku polskim! Tutaj można pobrać instrukcję cartridge’a Black Box v.8.

Ale wróćmy do Androida na Odroidzie. Aby powrócić do przeszłości i zabawy z C64 pobieramy z Play store emulator Frodo 64. Po uruchomieniu pojawi się znany dla osób w wieku ok. 30 lat niebieski ekran. Tutaj napisałem prosty program, który pobiera zmienną tekstową od użytkownika i wyświetla ją na ekranie:

Screenshot_2016-01-31-23-42-44

W Basicu każda linia kodu musiała posiadać numer.

Przykład gry z książki – Zgadywanka:

NEW
1 REM GRA ZGADYWANKA
2 PRINT "(SHIFT CLR/HOME)"
5 INPUT "PODAJ GORNY ZAKRES LICZBY"; GZ
10 LI = INT(GZ * RND(1)) + 1
15 RU=0
20 PRINT "ZNAM JUZ LICZBE"
30 PRINT : INPUT "PODAJ LICZBE"; PR
35 RU=RU+1
40 IF PR>LI THEN PRINT"MOJA LICZBA JEST WIEKSZA": GOTO 30
50 IF PR<LI THEN PRINT"MOJA LICZBA JEST MNIEJSZA": GOT0 30
60 IF PR=LI THEN PRINT "BRAWO! ZGADLES"
65 PRINT "W ZALEDWIE"; RU ; " RUCHACH." : PRINT
70 PRINT "CZY CHCESZ ZAGRAC JESZCZE RAZ (T/N)"
80 GET OD$: IF OD$="" THEN 80
90 IF OD$ = "T" THEN 2
100 IF OD$ <> "N" THEN 70
110 END

Na początku programu należy podać jaki ma być górny zakres liczby do odgadnięcia, a następnie odgadnąć tę liczbę.
Przykładowy przebieg gry:

PODAJ GORNY ZAKRES LICZBY? 25
ZNAM JUZ LICZBE
PODAJ LICZBE? 15
MOJA LICZBA JEST WIEKSZA
PODAJ LICZBE? 20
MOJA LICZBA JEST MNIEJSZA
PODAJ LICZBE? 19
BRAWO! ZGADLES
W ZALEDWIE 3 RUCHACH.
CZY CHCESZ ZAGRAC JESZCZE RAZ (T/N)?

 

Pobieramy gry na C64

Bogata baza gier jest dostępna np. tutaj. Pobieramy konkretny pozycje, rozpakowujemy, wczytujemy do emulatora Frodo 64 i gramy. Do naszego Odroida możemy podłączyć pada i mamy gotowy retro komputer :)

C64 gameplay

[Aktualizacja 02.02.2016]

Jeśli macie w pamięci jakąś grę na C64 i nie możecie sobie przypomnieć jej nazwy, poszukajcie tutaj (100 gier w 10 min.):

W opisie filmu na Youtube umieszczona jest lista wszystkich gier.

Scena Commodore wciąż istnieje,  np. poniżej materiał z konkursu na X2014 (na symym końcu zwycięskie demo):


A na Youtubie znajdziecie wiele produkcji, które wygrywały różne konkursy w ostatnich latach.

C64 to wreszcie niezapomniane melodie jak np. ta z gry Bomb Jack:

Emulator PSP

Chciałbym Wam jeszcze pokazać jak na Odroidzie C1+ można pograć w gry z PSP. Z Play store pobieramy i instalujemy emulator PPSSPP. Jest to Androidowa wersja platformy z ppsspp.org.

ppsspp

Tekken 6 na PSP

Jeśli macie gdzieś zrobiony obraz Waszej gry Tekken 6 na PSP, to wgrywamy go na kartę. Jednak przy pierwszym jej uruchomieniu możemy być rozczarowani. Zamiast płynnej gry zobaczymy pokaz slajdów i usłyszymy nieprzyjemne dźwięki. Do uruchomienia Tekkena trzeba wprowadzić kilka zmian w konfiguracji:

SW Setup

1. Change HDMI resolution to 1280x720 HD with ODROID-Utility App

2. Change the CPU Governor to Performance with ODROID-Utility App

3. Install PPSSPP App (One of the best PSP emulator)

4. Configure the Settings

In Graphics menu
Rendering Mode : Non-buffered rendering(Speedhack)
Simulate block transfer (unfinished) : Check
Framerate control
Frameskipping : 2
Auto frameskip : Check
Prevent FPS from exceeding 60 : Check
Alternative speed : 0
Features
Postprocessing shader : Off
Strech to display : uncheck
Small display : uncheck
Immersive mode : Check
Performance
Rendering resolution : 1xPSP
Display resolution (HW scaler) : 2xPSP
Mipmapping : Check
Hardware transform : Check
Software skinning : Check
Vertex cache : Check
Lazy texture caching : Check
Retain changed textrue : Check
Disable slower effects : Check
Hack settings
Disable alpha test : Check
Texture coord speedhack : Check
Show FPC count : Both

In Controls menu
On-screen touch controls : Uncheck

In System menu
Multithreaded : Check

Tekken 6 gameplay

Podsumowanie

Jak widać to małe wdzięczne urządzenie jakim jest Odroid C1+ potrafi całkiem wiele. W tym artykule pracowałem na oficjalnym systemie przeznaczonym dla tego urządzenia jakim jest Android. Istnieje jednak dystrybucja Linuxa jako samodzielna platforma do gier: Lakka: Retro emulation console. Znajdziecie w niej romy nie tylko do C64, ale takich komputerów jakimi były Atari, Amiga 500, 1200, Game Boy, Nintendo 64 i wiele, wiele innych. Wygląd systemu / menu jest podobny do tych z konsoli np. Sony Playstation:

lakka

Fajnie było wrócić do przeszłości :)

notatnikprogramistypl_black

 

Sprzęt do testów udostępnił sklep internetowy kamami.pl.

m_kamami_logo

 

Książki dla Raspberry PI

Raspberry Pi. Najlepsze projekty

Raspberry Pi. Najlepsze projekty

Autor: Andrew Robinson, Mike Cook

ISBN: 978-83-246-9221-7

Format: 168x237, stron: 432

Data wydania: 2014-09-09

Opis: Wykorzystaj ogromny potencjał miniaturowego komputera! Raspberry Pi to prawdziwy komputer o rozmiarach lekko przerośniętej karty kredytowej. Posiada on ogromny potencjał, całkiem sporą moc obliczeniową, a do tego kosztuje naprawdę niewiele. Platforma ta była projektowana z myślą o nauce programowania dla dzieci. Jednak, jak to często bywa, historia potoczyła się zupełnie inaczej.

Cena: 69.00zł

Raspberry Pi. Przewodnik użytkownika. Wydanie III

Raspberry Pi. Przewodnik użytkownika. Wydanie III

Autor: Eben Upton, Gareth Halfacree

ISBN: 978-83-283-0703-2

Format: 168x237, stron: 328

Data wydania: 2015-08-03

Opis: Bogate źródło informacji na temat Raspberry Pi! Raspberry Pi to komputer wielkości karty kredytowej. Wśród jego głównych atutów można wymienić ogrom możliwości oraz niską cenę. Początkowo miał pełnić rolę platformy do nauki programowania, jednak szybko znalazł tysiące innych zastosowań! Raspberry Pi jest używany jako serwer WWW, domowe media center

Cena: 49.00zł

Artykuł Odroid C1+, Android, C64 i powrót do przeszłości pochodzi z serwisu Notatnik programisty.

C64 intro w CSS3

$
0
0

W ostatnim artykule opisywałem jak samemu można zrobić sobie swój retro komputer wykorzystując mini komputer Odroid C1+. Dzisiaj natrafiłem na coś ciekawego – przykład możliwości wykonania intra html w stylu tych z Commodore 64. Do wykonania tych efektów został wykorzystany tylko i wyłącznie CSS :)


Źródła na GitHubie tutaj, tu strona autora, a poniżej podgląd.

Obsługa spacji zadziała tylko w nowym oknie.

Logo zrobiłem za pomocą narzędzia: Christian Heilmann’s C64 charset logo generator.

pixelambacht-logo_black

Artykuł C64 intro w CSS3 pochodzi z serwisu Notatnik programisty.

Koniec z appletami Javy

$
0
0

java-logoPod koniec zeszłego roku wielu producentów przeglądarek usunęło lub zaplanowało usunięcie wsparcia dla wtyczek NPAPI. NPAPI to API do tworzenia wtyczek w przeglądarkach internetowych, które wykorzystywane było w Mozilla Application Suite, Mozilla Firefox, Google Chrome, Safari, Opera, Konqueror i niektórych wersjach Internet Explorer. Dzięki NPAPI mogliśmy uruchamiać na naszych stronach applety Javy czy np. wyświetlać multimedialne treści przez MS Silverlight (jeśli dobrze pamiętam wykorzystywane chyba np. w tvn playerze).

Pod koniec zeszłego roku przeglądarki Chrome, Opera i MS Edge zablokowały możliwość uruchamiania appletów Javy za pomocą pluginu NPAPI. Firefox zrobi to samo pod koniec tego roku. W związku z tym Oracle nie miało wyjścia – tydzień temu ogłosili, że od wersji JDK 9 wtyczka dla Javy przestanie być rozwijana, a w późniejszych wydaniach zostanie całkowicie usunięta z JDK i JRE.

Inne blogi o Javie

Na takich stronach jak antyweb, spidersweb i wielu innych ze zdziwieniem czytałem wiele dziwnych stwierdzeń o Javie, a ponieważ sam na co dzień z nią pracuję, poniżej napiszę kilka sprostowań i wyjaśnień.

Data wydania JDK 9

Nie jest prawdą, że JDK 9 zostanie wydane we wrześniu tego roku. Owszem, takie były plany… ale w zeszłym roku. Na dzień dzisiejszy oficjalna data wydania JDK 9 to 23 marca 2017. Nie wiem skąd ta zgodność polskich portali i blogerów w tym temacie. Tutaj nawet trwa już odliczanie :)

Porównywanie HTML 5 i appletów Javy

Na spierswebie znajdziemy np. duży nagłówek: „Czym właściwie była Java?”. Nie „czym była”, ale „czym jest”, albo „Czym właściwie były applety Javy”. Tak byłoby lepiej.

Na antywebie znowu przeczytamy:

„[…] Oczywiście jest też prostsze rozwiązanie – nie aktualizować. Założę się, że cała masa użytkowników wyjdzie z takiego założenia – mogą zrezygnować z instalacji nowszej wersji JDK, albo nie zaktualizować przeglądarki[…]”.

Nie JDK, a JRE. JDK kompilujemy, JRE uruchamiamy. Do uruchamiania appletów wymagane jest (było) JRE.

Na innej stronie przeczytałem:

„Jako alternatywę Oracle proponuje stosunkowo nowe rozwiązanie Java Web Start, jednak póki co ciężko określić, czy będzie to dużo bezpieczniejsza opcja. Ogół Internetu zaś szybko przerzuca się na korzystanie wyłącznie z HTML5, CSS i JavaScripta. Piąta wersja standardu HTML wprowadziła obsługę wideo, co uczyniło, że większość wtyczek przeglądarkowych jest już bezużyteczna.”

Niech autor pokaże jak w CSS można wykonać komunikację z kolektorem danych po RS232, czy skanerem :)

Do czego wykorzystywaliśmy applety Java?

Otóż nie jest prawdą, że applety w Javie wykorzystywane były przeważnie do odtwarzania wideo, czy animacji. Owszem, były wykorzystywane w np. giełdowych systemach transakcyjnych, co w dzisiejszych czasach można już zrobić za pomocą innych technologii jak np. web sockety. Kilka lat temu korzystałem z takiego systemu w ING. Podejrzewam że applety Javy już dawno zostały usunięte. Ale np. taki mBank w dalszym ciągu swoim klientom udostępnia applet do wyświetlania kursów giełdowych w czasie rzeczywistym za pomocą appletu… którego już nie da się uruchomić w żadnej przeglądarce :) Z chwilą, gdy Opera zablokowała Javę straciłem dostęp do podglądów notowań giełdowych w mBanku :)

My w biznesie applety Javy stosowaliśmy głównie do komunikacji z urządzeniami zewnętrznymi podłączanymi do komputera klienta. Rozwiązania częściowo zostały już przepisane na Java Web Start.

Przykłady :

  • kolektory danych – eksporty / importy danych,
  • skanowanie dokumentów
  • podpisy cyfrowe – podpisywanie PDF’ów
  • itp.

Np. jeden z appletów który pisałem zawierał w sobie natywne pliki exe, które w momencie uruchomienia były kopiowane do katalogu domowego użytkownika i applet komunikował się z nimi.

Dlatego uważajcie w co klikacie na stronach internetowych :)

 

Podsumowanie

Tak jak pisałem wyżej, większego problemu nie ma, bo jest Java Web Start. Problem z appletami odczuliśmy już kilka lat temu, kiedy polityka bezpieczeństwa Javy zaczęła od nas wymagać podpisywania appletów. Od tego zaczęły się problemy z supportem. Natomiast porównywanie appletów Javy z HTML5 i CSS3 jest bezsensowne.

Artykuł Koniec z appletami Javy pochodzi z serwisu Notatnik programisty.

Wymiana danych EDI – UN/EDIFACT

$
0
0

ediEDI to w skrócie „Electronic Data Interchange”, czyli elektroniczna wymiana danych. To transfer informacji biznesowych ze źródłowego systemu informatycznego do innego z wykorzystaniem standardowych, zaakceptowanych formatów komunikatów. Najczęściej występującymi przykładami dokumentów biorących udział w wymianie danych są: zamówienia, potwierdzenia zamówień, awiza wysyłki, faktury, faktury korygujące, itp.

Głównymi celami i korzyściami jakie można uzyskać wdrażając EDI to:

  • zmniejszenie pracochłonności procesu poprzez wyeliminowanie wielokrotnego wprowadzania danych przez pracowników przedsiębiorstwa
  • zmniejszenie ilości błędów w przepływie informacji między sprzedawcami i nabywcami
  • przyspieszenie wymiany informacji między przedsiębiorstwami

Wdrożenie EDI wymaga bezpośredniej komunikacji między systemami komputerowymi, zarówno nabywców jak i sprzedawców produktu.

Automatyzacja

Z pewnością znasz kogoś kto pracuje w jakimś przedsiębiorstwie jako tzw. specjalista ds. marketingu. W praktyce taka praca polega na odbieraniu telefonów i e-maili, przyjmowaniu zamówień, wprowadzaniu ich do systemu informatycznego, poinformowaniu klienta, że wszystkie towary są na stanie (lub nie) i wystawieniu faktury. Później należy wydrukować dokumenty, a nierzadko jeszcze w XXI wieku własnoręcznie je zaadresować i odstawić na odbiór przez pocztę lub kuriera. To ciężka praca, bo taki pracownik znajduje się na pierwszej linii ognia – klient przy najbliższej okazji wyżyje się na nim i wygarnie że np. przesyłka dojechała dzień później, czy że nie mamy czegoś na stanie. Można oberwać dosłownie za wszystko, włącznie z tym że wybory wygrało PIS :) (sorry, taka powyborcza dygresja 02.2016).

Nie unikniemy tego całkowicie, jeśli rodzaj prowadzonego przedsiębiorstwa nastawiona jest na sprzedaż produktów dla konsumentów detalicznych. Tak będzie w przypadku sprzedaży, ale czy proces zakupów nie można byłoby usprawnić między dwoma przedsiębiorstwami?

Zobaczmy ilu ludzi jest zaangażowanych do procesu złożenia zamówienia od jednego przedsiębiorcy do drugiego:

  1. Kupujący – pracownik działu handlowego
  2. Sprzedający – pracownik działu handlowego
  3. Po drodze kurier, sortownia, transport do najbliższej centrali odbiorcy, znowu sortownia, kurier, uff..

Czyli mamy dwa przedsiębiorstwa i dwa etaty które trzeba opłacić. Jak podaje goldenline, na dzień dzisiejszy mediana zarobków w marketingu to ok. 3400 zł brutto. 3400 brutto dla pracownika znaczy tyle, że dostając na rękę ok. 2500 zł kosztuje pracodawcę już ponad 4100 zł. Do tego obaj pracodawcy ponoszą koszta utrzymania stanowiska (biurko, komputer, telefony, media, itp.), ale to już pomińmy.

4100 zł x 12 miesięcy x 2 przedsiębiorstwa = prawie 100 tys. zł! Taki jest koszt pracy dwóch pracowników działu handlowego w ciągu roku. Co prawda każdy z nich będzie obsługiwał kilkanaście innych klientów, ale i tak ta kwota jest dosyć spora, jak za proces który można zautomatyzować.

W idealnych warunkach można byłoby się pozbyć tych dwóch etatów wprowadzając właśnie wymianę danych EDI. Świat nie jest idealny i tego też nie da się zrobić, ale z pewnością ilość etatów można zminimalizować.

Formaty dokumentów elektronicznych

Podstawowym formatem dla wymiany danych jest EDIFACT przyjęty przez Międzynarodową Organizację Normalizacyjną (ISO) w 1987 roku jako norma ISO 9735. Na rynku polskim kilka firm wprowadziło możliwość obsługi plików XML, jednak światowym standardem jest właśnie EDIFACT.

Oprócz samego formatu pliku wprowadzone są na świecie dwa standardy składni:

  1. American ANSI X12 standard,
  2. European EDIFACT standard.

Są jeszcze starsze jak UNGTDI, czy VDA używany w Niemczech.

EDIFACT

No właśnie – mamy EDIFACT z 1987 roku, kiedy świat jeszcze nie znał formatu XML. Poniżej przykład komunikatu wykorzystywanego jako odpowiedź na zapytanie o dostępność biletu lotniczego (FRA-JFK-MIA):

UNA:+.? '
UNB+IATB:1+6XPPC+LHPPC+940101:0950+1'
UNH+1+PAORES:93:1:IA'
MSG+1:45'
IFT+3+XYZCOMPANY AVAILABILITY'
ERC+A7V:1:AMD'
IFT+3+NO MORE FLIGHTS'
ODI'
TVL+240493:1000::1220+FRA+JFK+DL+400+C'
PDI++C:3+Y::3+F::1'
APD+74C:0:::6++++++6X'
TVL+240493:1740::2030+JFK+MIA+DL+081+C'
PDI++C:4'
APD+EM2:0:1630::6+++++++DA'
UNT+13+1'
UNZ+1+1'

Czytelnie? No nie bardzo, a z pewnością nie tak jak jesteśmy do tego przyzwyczajeni pracując z XMLami. Każdy typ komunikatu posiada swoją dokumentację z którą należy się zaznajomić, a jest z czym – specyfikacja dla faktur liczy zaledwie 121 stron :)

invoice

W skrócie: plik w formacie EDIFACT może zawierać wiele komunikatów, a te z kolei składają się z segmentów zawierających elementy. Nazwy segmentów oraz ilości elementów określone są w dokumentacji dla każdego z typów dokumentów. Poszczególne segmenty rozdzielane są apostrofem, poszczególne elementy znakiem +, a parametry dwukropkiem. Jednak ogólna struktura jest następująca:

Service String Advice     UNA  Optional
 +----- Interchange Header        UNB  Mandatory
 | +---   Functional Group Header   UNG  Conditional
 | | +-     Message Header            UNH  Mandatory
 | | |        User Data Segments             As required
 | | +-     Message Trailer           UNT  Mandatory
 | +---   Functional Group Trailer  UNE  Conditional
 +----- Interchange Trailer       UNZ  Mandatory

Podstawowe obowiązkowe segmenty:

  • UNB – nagłówek pliku wymiany danych, zawiera m.in. identyfikatory nadawcy i odbiory, ilość komunikatów (UNH) oraz unikalny identyfikator samej wiadomości
    Np. UNB+UNOA:2+5900000000000:14+F1:F2+160206:1416+61997++IFTSTA’ oznacza transakcję o id=61779 składającą się z dwóch wiadomości wysłaną od firmy 5900000000000 do firmy F1 dnia 16.02.2016.
  • UNZ – zawsze ostatni segment pliku również zawierający dla potwierdzenia ilość komunikatów w transakcji identyfikator transakcji (tak jak w segmencie UNB).
    Np. UNZ+2+61997 oznacza że w pliku znajdują się dwa typy dokumentów z transakcji o id=61997.
  • UNH – segment komunikatu, może ich być wiele (np. kilka faktur, czy zleceń transportowych). Ilość segmentów powinna być zgodna z określonymi w segmentach UNB i UNZ.
    Np. UNH+1+IFTSTA:D:96A:UN:SHIP’ oznacza pierwsze zlecenie transportowe, a UNH+2+IFTSTA:D:96A:UN:SHIP’ drugie w obrębie jednej transakcji.
  • UNT – segment zakończenia komunikatu, zawiera informacje o ilości wszystkich segmentów pomiędzy UNH i UNT włącznie z nimi.
    Np. UNT+18+2′ oznacza koniec drugiego komunikatu (UNH) z ilością segmentów równą 18.

EDI w Polsce

Od 2001 roku prace nad uzgadnianiem formatów komunikatów EDI prowadzi Grupa ds. EDI, która powstała z inicjatywy ECR Polska. Aktualną listę uzgodnionych typów dokumentów znajdziemy tutaj. A na dzień dzisiejszy są nimi:

W Polsce usługi EDI oferują następujące firmy:

Sposoby przesyłania komunikatów

EDI nie określa sposobu przesyłania komunikatów – mogą one być przesyłane przez dowolne medium, którym posługują się obie strony transmisji. Może to być transmisja modemowa, poprzez FTP, HTTP, AS1, AS2. My jako programiści musimy wykonać transformację obiektów pochodzących z naszych systemów na pliki w formacie EDIFACT i w drugą stronę. Pozostaje tylko zlecenie wysyłki tych plików, ich odbiór i import. Do samej wymiany komunikatów wykorzystywany jest protokół AS2, do obsługi którego można wykorzystać open source’owy program Mendelson AS2 napisany w Javie. Zajmie się on wysyłaniem jak i odbieraniem komunikatów:

mendelson

Pomocne odnośniki

Podsumowanie

Sam miałem okazję pracować nad integracją komunikatów: iftmin, iftsta, invoice, correcting invoice, orders, ordrsp. Korzystałem również z rozwiązań INFINITE i programu do procesowania dokumentów EDInet Connector. INFINITE umożliwia wymianę danych za pomocą plików XML, do których dostaniemy pliki z XML Schema. Na podstawie schem można np. w Javie wygenerować klasy je mapujące.

Myślę, że warto automatyzować procesy. Zatrudnianie pracownika w dużej hurtowni, którego jedynym celem będzie przyjmowanie zamówień, wysyłka potwierdzeń i faktur jest według mnie marnowaniem zasobów ludzkich.

Świetnym anty przykładem marnowania takich zasobów jest wprowadzenie przedwyborczej obietnicy PIS w sprawie 500+. Według wyszukanych w internecie wyliczeń świadczenia otrzymają rodzice blisko 4 milionów dzieci. Nie wiem ile będzie takich rodzin, ale zakładając że tylko 2 miliony, to znaczy że 2 miliony osób będzie przynajmniej raz na rok wypisywać wnioski, składać je w gminie, gdzie tam znowu będą musiały być wprowadzone przez klawiaturę (w najlepszym przypadku). 2 miliony osób x 1 godzina na wypisanie wniosku, dojazd do gminy, itp. daje 2 miliony roboczogodzin na coś zupełnie bezsensownego. To tak jakby 10 osób musiało ciągle pracować przez 68 lat – bez żadnej przerwy. A do tego dochodzą koszta zatrudnienia 7 000 urzędników. Czy to wszystko nie mogłoby się dziać automatycznie np. poprzez rozliczenia PIT?

Bez sensu…

 

Artykuł Wymiana danych EDI – UN/EDIFACT pochodzi z serwisu Notatnik programisty.

Ile zarobili twórcy Wiedźmina?

$
0
0

Tw3_skellige_armor_final_concept_by_Marek_MadejWiedźmin jest obecnie jedną z najbardziej rozpoznawalnych polskich gier komputerowych. Firma, która ją opracowała – CD Projekt SA podaje, że do końca 2015 roku sprzedało się łącznie ponad 20 milionów sztuk gier Wiedźmin, Wiedźmin 2: Zabójcy Królów oraz Wiedźmin 3: Dziki Gon. Miedzy innymi dzięki temu łączny wynik netto Grupy CD Projekt za lata 2012-2015 wyniósł 389,7 mln PLN, a kurs akcji w tym samym okresie wzrósł o ponad 350%. Warto zauważyć, że w 2015 roku (rok premiery Wiedźmina 3) przychody netto CD Projektu wzrosły z 96,2 mln PLN do 798 mln PLN. W Sedlak & Sedlak postanowiliśmy się przyjrzeć, jak te wyniki wpłynęły na pensję osób zarządzających w spółce.

Zarobki osób zarządzających w CD Projekt

W 2014 roku wartość wynagrodzeń, nagród i korzyści wypłaconych członkom zarządu (wraz z wynagrodzeniami od podmiotów zależnych) wyniosła 2,2 mln PLN. Kwota ta zawierała premie w wysokości po 176 tys. PLN dla dwóch członków zarządu. Natomiast w 2015 roku wartość stałej części wynagrodzenia osób zarządzających oraz wynagrodzeń od podmiotów zależnych wyniosła 1,9 mln PLN.

Tabela 1. Wynagrodzenie zasadnicze członków zarządu oraz wynagrodzenie otrzymane od spółek zależnych w 2015 roku

zasadnicze wynagrodzenie od podmiotów zależnych razem
Adam Kiciński 420 000 420 000
Marcin Iwiński 312 000 24 000 336 000
Piotr Nielubowicz 312 000 24 000 336 000
Adam Badowski 396 000 396 000
Michał Nowakowski 360 000 4 000 364 000
Piotr Karwowski* 10 000 48 000 58 000

Źródło: Opracowanie Sedlak & Sedlak na podstawie sprawozdania zarządu z działalności grupy kapitałowej CD Projekt SA za rok 2015

 

Program motywacyjny funkcjonujący w CD Projekt

Podane w powyższej tabeli kwoty to jednak nie wszystkie pieniądze, jakie zostały wypłacone lub naliczone twórcom Wiedźmina. W spółce funkcjonował bowiem program motywacyjny oparty o akcje spółki obejmujący lata 2012-2015. Zawierał on dwa kryteria: rynkowe i wynikowe.

Kryterium rynkowe odpowiadało za 20% potencjalnych uprawnień. Warunkiem spełnienia uprawnień do programu był wzrost kursu akcji spółki na GPW o 100 punktów procentowych wyższy niż wzrost indeksu WIG w tym samym czasie. W trakcie trwania programu WIG wzrósł o 25,6 %, a akcje CD Projekt w tym samym czasie wzrosły o 353%. Oznacza to że warunki przyznania praw do programu zostały spełnione.

Kryterium wynikowe odpowiadało za 80% uprawnień. Aby zostało zrealizowane skonsolidowany zysk netto za lata 2012-2015 w przeliczeniu na jedną akcję spółki musiał wynieść 2,436 PLN. W rzeczywistości wyniósł on 4,11 PLN, co oznacza przebicie progu przyznania praw do wypłaty świadczeń z programu o 69%.

CD Projekt SA w sprawozdaniu z działalności za 2015 rok podał wysokość naliczonej części zmiennej wynagrodzenia uzależnionej od łącznego zysku netto Grupy Kapitałowej za lata 2012-2015. Wymienione wartości przedstawia tabela poniżej. Nie podano jednak ile z tych kwot zostało już wypłaconych członkom zarządu.

Tabela 2. Naliczona kwota wynagrodzenia zmiennego dla członków zarządu wynikająca z systemu motywacyjnego w CD Projekt SA

naliczona część zmienna wynagrodzenia wynikająca
z systemu motywacyjnego
za lata 2012-2015 w PLN
(w oparciu o kryterium
zysku netto)
naliczona kwota w ujęciu średniorocznym w PLN
(w oparciu o kryterium
zysku netto)
Adam Kiciński 11 100 000 2 775 000
Marcin Iwiński 11 100 000 2 775 000
Piotr Nielubowicz 11 100 000 2 775 000
Adam Badowski* 5 303 000 2 652 000
Michał Nowakowski* 5 303 000 2 652 000

* kwoty naliczone z tytułu części zmiennej wynagrodzenia uzależnionej od zysku netto segmentu Produkcji gier za lata 2014-2015
Źródło: Opracowanie Sedlak & Sedlak na podstawie sprawozdania zarządu z działalności grupy kapitałowej CD Projekt SA za rok 2015

 

Podsumowanie

Kwota wynagrodzenia zasadniczego członków zarządu CD Projekt pomiędzy 2014 a 2015 rokiem nie zmieniła się. Wydaje się to nieprawdopodobne biorąc pod uwagę ogromny sukces Wiedźmina 3. Należy jednak zauważyć, że członkom zarządu naliczone zostały kwoty wynagrodzenia zmiennego opartego na programie motywacyjnym. Przełożenia sukcesu wydawniczego na pensje zarządu dopatrywałbym się właśnie tam.

Konrad Akowacz
Sedlak & Sedlak

Źródło: wynagrodzenia.pl
Ogólnopolskie Badanie Wynagrodzeń

Artykuł Ile zarobili twórcy Wiedźmina? pochodzi z serwisu Notatnik programisty.

Microsoft wydał open source Visual Studio Code 1.0 dla OS: Windows, OS X i Linux

$
0
0

ms_visual_studio_code_header
Open source’owy edytor tekstowy od Microsoft – Visual Studio Code, został wydany w stabilnej wersji 1.0. Jak informuje MS na blogu, VS Code używa obecnie ponad 500 tysięcy programistów piszących kod w takich językach jak: JavaScript, TypeScript, Python, C++, C#, CSS, PHP, Node.js i wiele innych.

errors

Pierwotnie MS VSC miał być dedykowany do tworzenia web aplikacji w Javascript i Typescript. Jednak tylko przez sześć miesięcy społeczność wykonała ponad tysiąc rozszerzeń, dzięki którym edytor ten obecnie wspiera np. Node.js, Go, C++, PHP, czy Pythona.

Środowisko dostępne jest w 9 językach (brak polskiego).

2016_04_14_timeline

Dla mnie ten program to raczej ciekawostka, ma problemy z podpowiadaniem składni np. w Javie. To jakby bardzo uboga wersja Notepada++ z dodatkowymi funkcjami (wsparcie Git, czy debugowania) i nie ma kompletnie nic wspólnego z IDE takimi jak Netbeans czy Eclipse.

Ale zawsze warto wiedzieć co w trawie piszczy :)

Wpis na blogu code.visualstudio.com.
Link do pobrania programu na różne platformy tutaj.

 

Artykuł Microsoft wydał open source Visual Studio Code 1.0 dla OS: Windows, OS X i Linux pochodzi z serwisu Notatnik programisty.

Bing jako najlepsza wyszukiwarka dla programistów?

$
0
0

bingBing podczas jednej z aktualizacji udostępnił ciekawą i unikalną funkcję dla programistów – wyszukiwarka zwraca przykładowe kody programów, które możemy uruchomić jednym kliknięciem w przeglądarce :) Jest to efekt współpracy MicrosoftuHackerRank.

Jako programiści bardzo często wyszukujemy w sieci przykładowych implementacji różnych algorytmów np. na StackOverflow. Gigant z Redmond udostępnił nam narzędzie przeznaczone właśnie do takich celów.

Jak korzystać z tej funkcji?

Prosta sprawa – wchodzimy na bing.com wpisujemy w wyszukiwarce np. „quick sort java”, czy „fibonacci python” i voilà! Naszym oczom ukazuje się fragment kodu w wybranym języku, który możemy edytować i w każdej chwili uruchomić. Na chwilę obecną można wybrać jeden z następujących języków programowania: C, C ++, C #, Java, Javascript, PHP i Python.

giphy2

Nie działa!

No właśnie, wszystko co trzeba wykonać aby móc korzystać z tej funkcji, to zmienić ustawienia regionalne. Po wejściu na główną stronę wyszukiwarki, klikami przycisk ustawień znajdujący się w prawym górnym rogu, klikamy w Ustawienia, przechodzimy na zakładkę Region i wybieramy „Stany Zjednoczone — angielski„.

Ciekawe jaka będzie odpowiedź Google’a :)

Jeśli ktoś z Was chciałby sobie coś pokodować bezpośrednio w przeglądarce, to tutaj udostępniłem fajne narzędzie.

P.s. wpiszcie w komentarzach tu lub pod wpisem na Facebooku, jakie ciekawe przykłady kodów udało się Wam wyszukać!

Artykuł Bing jako najlepsza wyszukiwarka dla programistów? pochodzi z serwisu Notatnik programisty.


Java Spring, recenzja kursu wideo z Videopoint.pl

$
0
0

vsprku_smallKażdy, kto zawodowo programuje w obojętnie jakim języku wie, że bez wsparcia frameworków nasze życie byłoby znacznie trudniejsze. Tak jak Python ma swojego Django, PHP – Symfony, czy Ruby Railsa, tak w Javie bez znajomości Springa ciężko będzie znaleźć komukolwiek zatrudnienie. Praktycznie w każdej ofercie pracy dla osób programujących w Javie, wśród wymagań znajdziemy znajomość frameworka Spring.

Poniżej krótko zrecenzuję kurs wideo „Spring. Kurs video. Poziom pierwszy. Prosty sposób na zaawansowane aplikacje w Javie” dostępny na Videopoint.pl, ale na początek kilka słów o samym Springu.

Czym jest Spring

W skrócie jest on open source’owym frameworkiem dla tworzenia aplikacji w Javie. Jego pierwsze wersje zostały napisane przez Roda Johnsona na bazie kodu opublikowanego w jego książce „Expert One-on-One J2EE Design and Development” w roku 2002.

Spring składa się z wielu modułów, które dostarczają różne usługi, np:

  • Spring Core Container (podstawowy moduł dostarczający BeanFactory czy ApplicationContext)
  • Kontener IoC (z angielskiego Inversion of Control) – dzięki niemu można konfigurować aplikację przez tzw. wstrzykiwanie zależności (Dependency Injection).
    Na przykład – jeśli obiekt klasy Foo wykonuje operację na obiekcie klasy Bar, to postępując tradycyjnie, do klasy Foo musiałby być przekazany obiekt klasy Bar lub klasa Foo sama musiałaby utworzyć nową instancję Bar.
    W springowym podejściu IoC, obiekt klasy Bar zostanie dostarczony przez zewnętrzny proces w czasie wykonania programu. Zostanie tzw. wstrzyknięta zależność dla klasy Foo.
  • Programowania aspektowego
    Cytując Wikipedię: „AOP, działa na zasadzie Dynamicznego Proxy (ang. Dynamic Proxy, dynamicznego – w sensie tworzenia go w czasie wykonania programu). Przykładowo, za pomocą AOP można do mutatorów (ang. setters, mutators) klasy DAO automatycznie dodać fragmenty kodu zarządzające transakcjami. AOP działa na zasadzie wzorca dekorator, który w tym przypadku dekoruje metody klasy dodatkowym kodem wykonywanym fabrykując proxy. Proxy to opakowuje istniejący obiekt DAO; wywołanie metod DAO przez stworzony AOP obiekt opakowujący wywołuje dodatkowo kod zarządzający transakcjami.”.
  • Oraz: dostępu do danych, obsługi transakcji, Model-Widok-Kontroler, zdalnego dostępu, autoryzacji i uwierzytelniania, zdalnego zarządzania JMX, komunikatów JMS, obsługi testowania.

Historia jego rozwoju to:

  • Wersja 1.0, 2004
  • Wersja 2.0, 2006
  • Wersja 3.0, 2009 (JDK 5+)
  • Wersja 4.0, 2013 (JDK 6+)
  • W bieżącym kwartale (tj. drugim 2016) będzie wydana wersja 4.3.
  • Wydanie wersji 5.0 planowane jest na ostatni kwartał 2016.
    Minimalnym wymaganiem będzie Java 8. Tutaj JIRA backlog.

To co trzeba podkreślić, to fakt, że Spring posiada świetną dokumentację, wiele tutoriali i poradników.

Recenzja kursu z Videopoint.pl

videopoint_offline

Wersja offline

Niedawno polski Videopoint.pl wydał kurs pod tytułem „Spring. Kurs video. Poziom pierwszy. Prosty sposób na zaawansowane aplikacje w Javie” autorstwa Dobromira Matusiewicza. Dobromir jest starszym projektantem w Asseco Poland SA i od kilkunastu lat zajmuje się tworzeniem oprogramowania dla banków. Współpracuje z Politechniką Rzeszowską.

Cały kurs wideo trwa ok. 3 godzin i 20 minut. Można oglądać go bezpośrednio z panelu klienta jak i całkowicie offline po uprzednim pobraniu na dysk komputera czy kartę telefonu. Sam oglądałem go na telefonie komórkowych z ekranem 4,7 cala i było całkiem ok. Jakość obrazu jest dobra i wszystkie listingi kodu były czytelne.

W wersji offline dostajemy zipa po rozpakowaniu którego dostępny jest plik html z listą wszystkich lekcji, a w katalogu video znajdziemy poszczególne pliki w formacie mp4. Łącznie jest ich 44.

Dużym plusem materiału jest to, że autor przez wszystkie lekcje rozwija jedną przykładową aplikację, której celem jest pobieranie i konwersja kursów walut. Zaczyna się od podstawowej konfiguracji programu zarówno za pomocą adnotacji Springowych, czy w XML, a kończy na pobieraniu danych i komunikacji z bazą danych. W międzyczasie można dosyć szybko zrozumieć na czym polega „wstrzykiwanie zależności” z czego znany jest Spring, czy dowiedzieć się jak w Javie obsługuje się wielojęzykowość.

Dla kogo jest ten kurs, a dla kogo nie?

Moja ocena jest taka – kurs ten nie jest z pewnością przeznaczony dla osób całkiem początkujących w Javie. Autor często mówi skrótami myślowymi, które naturalnie rozumie każdy obyty z Javą programista. Z drugiej strony nie jest on również dedykowany dla programistów mających już jakiekolwiek doświadczenie ze Springiem. Sądzę, że lekcje wideo dedykowane są dla osób znających już Javę, ale nie mających doświadczenia z tym frameworkiem.

Poniżej krótki fragment:

Czego się nauczycie?

W trakcie przerabiania materiału:vsprku

  1. Poznacie Środowisko STS (Spring Tool Suite) i będziecie rozwijać przykładowy mavenowy projekt przez wszystkie lekcje.
  2. Zrozumiecie działanie wstrzykiwania zależności IoC.
  3. Będziecie umieli konfigurować aplikację za pomocą klas Javy oraz plików XML.
  4. Nauczycie się konfiguracji automatycznego wstrzykiwania zależności (@Autowired).
  5. Opanujecie ustawienia automatycznego skanowania komponentów (wraz z filtrowaniem).
  6. Dowiecie się jak pracować z profilami.
  7. Skonfigurujecie aplikację za pomocą właściwości (zmienne systemowe przekazywane podczas uruchamiania oraz zmienne środowiskowe).
  8. Wykonacie wielojęzykową wersję aplikacji (i18n i Javovy ResourceBundleMessageSource).
  9. Zamienicie standardowe logowanie commons-loging na rzecz log4j (bridge slf4j)
  10. Nauczycie się pracy z bazami danych (Spring Jdbc), wykonywania zapytań DDL i DML, konfiguracji JdbcTemplate, tworzenia klas DAO i mapowania rekordów na obiekty, itp.
  11. Zapoznacie się z takimi adnotacjami jak: @Configuration, @Bean, @ConstructorProperties, @Autowired, @ComponentScan, @Service, @Filter, @Primary, @Qualifier, @Profile, @PropertySource, @Value, @Import

W pakiecie otrzymuje się gratis ebook „Spring Framework. Wprowadzenie do tworzenia aplikacji. Wydanie II„!

spfrwpWydawca zrobił świetną promocję dodając gratis prawie 500-stronicową książkę o Springu zawierającą 15 rozdziałów w formie ebooka autorstwa J Sharmy i Ashisha Sarina. Właśnie tą książkę polecałem już wcześniej na Facebooku osobom chcącym zacząć zabawę ze Springiem. Jednak nie wiem czy jest to stała, czy tylko okresowa promocja (nie informują o tym w regulaminie).

Podsumowanie

Cena ponad trzygodzinnego kursu z dołączonym ebookiem to 59 złotych (maj 2016), podczas gdy sama tylko książka w wersji drukowanej kosztuje o 10 zł więcej.

Notka z dnia 5 maja 2016
Kurs trafił na promocję tygodnia z obniżoną ceną do 41,30 zł łącznie z ebookiem.

Warto kupić? Sądzę że warto, ale tak jak pisałem wcześniej, polecam ją tym, którzy znają już core Javę.

Oczywiście można się przyczepić do kilku kwestii – np. do dosyć częstego powtarzania przez autora słów „framework Spring” (zwłaszcza w początkowych filmach). W lekcji 7 możemy usłyszeć że wartość „numer hashcode jest unikalny dla różnych obiektów”. Osoba z wieloletnim doświadczeniem oczywiście zna kontrakt hashcode() i equals() i wie, że nawet obiekty tej samej klasy mogą mieć identyczny hashcode. Przykład? Stringi „FB” i „Ea” zwracają identyczny hashcode równy 2236:

System.out.println("FB".hashCode());
System.out.println("Ea".hashCode());

//WYNIK
2236
2236

Zapewne autor również o tym wie, ale to właśnie przykład takiego skrótu myślowego.

Tak czy inaczej polecam ten kurs, zwłaszcza że dołączona jest do niego gratis książka. Materiał wideo zdecydowanie dla początkujących, książka natomiast również dla tych doświadczonych ze Springiem.

Jest on dostępny TUTAJ.


Wraz z publikacją tego artykułu ogłosiłem na Facebooku informację na temat konkursu, w którym do wygrania będą TRZY darmowe kursy Springa z Videopoint.pl!

Artykuł Java Spring, recenzja kursu wideo z Videopoint.pl pochodzi z serwisu Notatnik programisty.

PL/SQL, recenzja kursu wideo z Videopoint.pl

$
0
0

W kolejnym artykule recenzującym materiały z videopoint.pl zajmiemy się  kursem: „PL/SQL. Kurs video. Od podstaw do zagadnień zaawansowanych. Programowanie baz danych”. Tym razem opinię przygotował doświadczony programista Bartek Medoń.

Wstęp

vplsqlKorzystając z okazji pragnę podzielić się z Wami moimi odczuciami dotyczącymi kursu video “PL/SQL. Kurs video. Od podstaw do zagadnień zaawansowanych. Programowanie baz danych” od videopoint.pl.
Mam czasem wrażenie, że jest wiele programistów, którzy myślą, że relacyjna baza danych to tylko tabele, atrybuty, zapytania sql i nic więcej. Nie wiedzą o tym, że istnieją np. sekwencje, widoki, triggery czy właśnie dodatkowe języki pozwalające np. na napisanie funkcji w samej bazie danych niezależnie od kodu aplikacji np. PL/pgSQL dla PostgreSQL czy właśnie PL/SQL dla Oracle Database.
Myślę więc, że taki kurs może być bardzo dobrym uzupełnieniem wiedzy dla kogoś kto „coś już z bazami robił”.

Co zawiera kurs i ile kosztuje?

Nie będę tutaj się specjalnie rozpisywał, bo wszystkie informacje znajdziecie na tej stronie. Wspomnę tylko, że kurs kosztuje 59 zł i za taką kwotę otrzymujemy prawie 4 godziny materiałów szkoleniowych. Na podanej stronie znajdziesz również dokładny spis lekcji, co na pewno jest fajne dla osób, które znają już w jakimś stopniu PL/SQL i zastanawiają się czy warto kupić ten kurs czy nie wniesie on nic nowego do ich wiedzy.

Poniżej przykładowa lekcja:

Ebook gratis

or12prW cenie kursu otrzymujemy również gratisowego ebooka: „Oracle Database 12c. Problemy i rozwiązania”.
Dzięki tej książce będziesz przygotowany na najbardziej stresujące sytuacje spotykane w codziennej pracy administratora. W trakcie lektury opanujesz techniki optymalizacji wykorzystania pamięci i dysków, czasu trwania zapytań SQL oraz wydajności. Znajdziesz tu również liczne opisy problemów z życia wziętych oraz najlepsze sposoby ich rozwiązywania. Ponadto nauczysz się monitorować pracę systemu i zidentyfikujesz problemy, zanim dotkną one jego użytkowników. Przekonasz się, jak kluczową rolę pełnią właściwie dobrane indeksy. Książka ta jest obowiązkową pozycją dla każdego administratora bazy danych!

 

Kim jest autor?

Zdarzyło mi się kiedyś kupić książkę, której autor albo nie za bardzo wiedział o czym pisze lub miał duży problem z przystępnym przekazaniem wiedzy. Nie wgłębiałem się wtedy w to tylko książki się pozbyłem. Tym razem postanowiłem sprawdzić kim jest autor niniejszego kursu. Na wstępie uruchomiłem darmową lekcję dostępną na stronie kursu, co „na dzień dobry” zrobiło na mnie pozytywne wrażenie, ale w końcu to takie jakby demo dostępne publicznie, które musi być dobre więc postanowiłem “pogrzebać” dalej.
Jak czytamy na videopoint.pl o autorze: “Przemysław Starosta — doświadczony programista baz danych, trener, pasjonat zagadnień bazodanowych. Na co dzień zajmuje się tworzeniem zapytań SQL, programowaniem baz danych w PL/SQL oraz prowadzeniem szkoleń dla programistów”. Brzmi dobrze, poszperałem jeszcze trochę po sieci i faktycznie można powiedzieć, że autor doskonale wie o czym mówi, zresztą sam kurs to potwierdził.

Co trzeba znać aby zrozumieć kurs?

Odpowiedź jest bardzo prosta – jeśli znasz język sql nawet w podstawowym zakresie to możesz rozpocząć kurs. Jeśli jednak jesteś osobą, która np. postanowiła, że zostanie programistą i szuka kursu do nauki obsługi baz danych to na razie odpuść sobie, zacznij od zrozumienia czym jest baza danych, jak działa, jakie są jej rodzaje oraz oczywiście od języka sql (rzecz jasna istnieją bazy NoSQL, ale nie zagłębiajmy się w to teraz).

Jakość czyli obraz i dźwięk

Kurs video to oczywiście głos i obraz więc należy od takiej formy przekazywania wiedzy oczekiwać dobrej jakości i tutaj zdecydowanie to znajdujemy, lektor mówi powoli, ale nie za powoli, wyraźnie, logicznie, nie słychać co chwile “yyyy” chociaż nie brak tego “zwrotu”, co dla mnie nie było żadnym problemem, jednak wspominam o tym, bo często trafiam na materiały video, w których mówca go nadużywa, co albo jest jego nawykiem albo może świadczyć o jego nieprzygotowaniu. Obraz jest wyraźny, nie przeskakuje za szybko więc bezproblemowo można przyjrzeć się poczynaniom autora, przepisać kod, zrozumieć.
Generalnie pod tyk kątem nie mam żadnych zastrzeżeń chociaż przyznam, że nie sprawdziłem jak wideo sprawowałoby się np. na smartphonie.

Prostota

Kurs jest dość łopatologiczny, ale w pozytywnym znaczeniu. Autor tłumaczy nawet proste rzeczy całkiem dokładnie, nie ma jakiś wielkich przeskoków czy skrótów myślowych, dzięki czemu każdy musi zrozumieć o czym mówi lektor, o co chodzi w danym przykładzie.

Zakres wiedzy, merytoryczność

Kurs jest naprawdę obszerny i mimo wspomnianej dokładności w tłumaczeniu prostych czy pozornie prostych rzeczy otrzymujemy w tych 4 godzinach naprawdę solidną porcję wiedzy, która oczywiście nie jest w stanie wyczerpać wszystkich zagadnień czy zastąpić zwyczajnej praktyki, ale nikt nie powinien żałować czasu jaki poświęcił na kurs.
Trochę wyżej wspominałem o autorze i jeszcze raz warto wspomnieć, że jest to osoba, która zdecydowanie wie o czym mówi, a różnego rodzaju przykłady i uwagi potwierdzają tylko, że jest to praktyk, a nie jedynie teoretyk.
Warto też zauważyć, że kurs dostaje się na zawsze tzn. można go pobrać na dysk komputera i wrócić do niego w dowolnym momencie.

Czego mi zabrakło?

Bardzo często w książkach, kursach o danych technologiach autorzy początkowo skupiają się na tym aby pokazać odbiorcy jak przygotować sobie środowisko pracy i np. dla kursu języka PHP pokazują jak zainstalować w Windowsie pakiet Wamp, jak go skonfigurować, założyć bazę danych itp.
Tutaj czegoś takiego nie ma, kurs rozpoczyna się od kodowania w Oracle SQL Developer i teoretycznie można by stwierdzić, że skoro nie jest to kurs dla totalnie zielonych to przystępując do kursu taka osoba będzie już miała przygotowaną do pracy bazę Oracle. Ale z drugiej strony kurs może rozpoczynać osoba, która nie jest początkująca, ale dotychczas pracowała np. na PostgreSQL i dla niej jakiś mały tutorialik jak bezproblemowo przygotować narzędzia do pracy z kursem mógłby być fajnym dodatkiem.

Podsumowanie

Mogę szczerze polecić kurs dla każdego kto chciałby poszerzyć swoją wiedzę w zakresie programowania z wykorzystaniem baz danych. Przekazywanej wiedzy jest sporo, a forma przekazu jest przyjazna i zrozumiała. W cenie niespełna 60 zł to naprawdę dobry wybór.

Notka z dnia 17 maja 2016
Kurs trafił na promocję tygodnia z obniżoną ceną do 41,30 zł łącznie z ebookiem.

Autor recenzji

Nazywam się Bartek Medoń, jestem pasjonatem informatyki i szeroko pojętej technologii. Zawodowo pracuję jako programista, prowadzę również kilka własnych stron WWW z branży rozrywkowej, interesuje się e-biznesem.
Pierwsze programy pisałem jeszcze na Commodore C64, a w wieku 12 lat zacząłem jarać się Internetem i szeroko pojętymi technologiami webowymi, chociaż miałem też styczność z wieloma innymi językami.
Studiowałem informatykę kwantową i muszę powiedzieć, że wszystko co związane mechaniką/fizyką kwantową jest niezwykle fascynujące i „ryje beret” :-)

Inne kursy w tematyce SQL

 
 

Książki w tematyce SQL

Artykuł PL/SQL, recenzja kursu wideo z Videopoint.pl pochodzi z serwisu Notatnik programisty.

Duże zniżki z okazji Warszawskich Targów Książki – ostatni dzień

$
0
0

Dziś ostatni dzień targów książki w Warszawie i ostatni dzień dużych zniżek na pozycje w tematyce m.in. z IT.

Dla programistów mamy dostępne promocje w dwóch sklepach:

  1. Helion – książki -20%, a ebooki -50%, -55% i -60%.
    Wydawnictwo można osobiście odwiedzić na stoisku 25/D4.
    Helion wysyła książki za darmo Pocztą Polską.
  2. Ebookpoint – ebooki -50%, -55% i -60%.

W związku z tym krótki przegląd co warto kupić.

Klasyka, must have każdego programisty, czyli seria Roberta C. Martina

Tegoroczną nowością tej serii jest Software Craftsman. Profesjonalizm, czysty kod i techniczna perfekcja.

 

Dobre praktyki

Oprócz książek z wyżej wymienionej serii warto przeczytać również te wymienione poniżej. W szczególności polecam Pragmatycznego programistę.

 

Agile

 

Wzorce projektowe, projektowanie obiektowe

Dla kogoś zupełnie „zielonego” we wzorcach projektowych polecam Wzorce projektowe. Rusz głową!. Gwarantuję, że po jej przeczytaniu, całkowicie zmieni się podejście do projektowania kodu.
Oczywiście nie można tutaj zapomnieć o klasyce „bandy czworga„, czyli Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku. To właśnie w tej książce po raz pierwszy zostały opisane wzorce projektowe. Autorzy (Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides – każdy programista powinien znać te nazwiska) przedstawili zestaw rozwiązań, wzorców, popularnych problemów pojawiających się w programowaniu.

 

Java

Nowością z końca poprzedniego roku jest Java 8. Przewodnik doświadczonego programisty.
Dosłownie kilka dni temu została wydana książka TDD. Programowanie w Javie sterowane testami.

 

Python

 

C++

 

JavaScript

Nowością bieżącego miesiąca jest zestaw książek przetłumaczonych ze znanej serii „You Don’t Know JS”, a ich ceny zaczynają się w promocji od 7,95 zł :)

 

HTML i CSS

Tutaj mogę polecić dwie dobre książki:

 

Testy penetracyjne, sieci

 

Elektronika / Arduino / Raspberry PI

Należy tutaj wyróżnić pierwszą z poniższych książek: Elektronika dla bystrzaków. Ebook kosztuje 12,80 zł i jest jednym z lepszych „wstępniaków” do elektroniki, dobrze ocenianym w grupach związanych z elektroniką na Facebooku.

 

Pozostałe nowości i bestsellery

Zachęcam do podzielenia się z innymi wartymi według Was książkami do przeczytania, których tu brakuje. Dodawajcie swoje propozycje pod wpisem na stronie Notatnika Programisty na Facebooku.

Artykuł Duże zniżki z okazji Warszawskich Targów Książki – ostatni dzień pochodzi z serwisu Notatnik programisty.

CheckiO.org – graj i ucz się Pythona

$
0
0

CheckiO_Company_LogoZdobywanie wiedzy w dzisiejszych czasach nie sprowadza się już tylko do czytania nudnych książek i to obojętnie w jakiej dziedzinie. Lubimy wyzwania, rywalizację i zdobywanie kolejnych „leveli”. Nauka ma sens jeśli widzimy w niej przyjemność, a takie serwisy jak checkio.org pomagają nam w jej doznawaniu.

Checkio.org

Po założeniu konta w serwisie naszym głównym widokiem jest mapa zawierająca kilka lokalizacji, które będą odblokowywane w miarę postępu gry,  a zaczynamy od wysepki „Home”.

5

Po kliknięciu w dostępne miejsce na mapie otrzymujemy listę zadań do rozwiązania. Z prawej strony każdej pozycji znajduje się informacja o poziomie traudności (elementary, simple, moderate i challenging).

9

Po kliknięciu w wybrane zadanie otrzymujemy szczegółowe informacje na jego temat wraz z określeniem danych wejściowych oraz wyjściowych i kilkoma przykładami testowymi.

6

Jeśli jesteśmy gotowi do wyzwania klikamy w przycisk „Solve it” i otwiera się nam ekran składający się z czterech głównych elementów:

  1. Edytor kodu
  2. Opis zadania
  3. Wyjście (konsola Pythona)
  4. Komponent do sprawdzania wyników na podstawie własnych danych wejściowych.

7

Ten ostatni komponent nie zawsze będzie tylko zwykłym polem tekstowym:

Po rozwiązaniu kilku zadań i zdobyciu odpowiedniej ilości punktów będziemy mogli przejść do kolejnej wyspy i nowych zadań:

8

Podsumowanie

Dzięki tego typu serwisom z pewnością niejeden z Was zacznie swoją przygodę z nowym językiem programowania, czy w ogóle z programowaniem. Zdefiniowanie celów, przegląd postępu, nowe wyzwania i rywalizacja sprawiają, że nauka jest po prostu przyjemna i ciekawa.

Z okazji dzisiejszego Dnia Matki można do północy kupić w Helionie 3 książki w cenie 2 z darmową dostawą. Promocja dotyczy tylko tytułów wydawnictwa Helion, nieprzecenionych.
Przykładowy zestaw do Pythona:

Na koniec polecam również sprawdzić serwis empireofcode.com. To już typowa gra, w której budujemy swoje bazy, prowadzimy walki, a w to wszystko wplecione są wyzwania z programowania (do wyboru Python lub JavaScript).
empire1

empire2

Lista gier programistycznych

  1. checkio.org
  2. empireofcode.com
  3. www.codingame.com
  4. codecombat.com

Artykuł CheckiO.org – graj i ucz się Pythona pochodzi z serwisu Notatnik programisty.

Java JNA, user32.dll – przechwytujemy aplikacje okienkowe

$
0
0

lib-dll-javaZdarzają się takie sytuacje, że chcielibyśmy naszym programem sterować inną aplikacją okienkową. W tym artykule wprowadzę was w temat pobierania danych z programów windowsowych za pomocą funkcji biblioteki user32.dll wywoływanych z poziomu Javy. W Javie możemy wywoływać natywny kod z bibliotek DLL w dosyć łatwy sposób dzięki JNA – Java Native Access.

Zastosowania

Np. w mojej pracy inżynierskiej wykorzystałem JNA do sterowania znanym dawniej odtwarzaczem muzycznym WinAmp, czy PowerPointem. Wpadłem też kiedyś na pomysł, żeby przechwytywać z Total Commandera aktualną ścieżkę w której się znajduję aby po uruchomieniu skrótu klawiaturowego uruchomiła się konsola w tej samej lokalizacji. W tym przypadku akurat wykorzystałem AutoHotkeya i napisałem skrypt wywołujący funkcje z biblioteki user32.dll.
Napisałem również program rejestrujący czasy aktywności wszystkich okien w Windowsie, dzięki któremu generuję dzienny raport pracy: nad jakim projektem pracowałem (dzięki umieszczeniu w tytule okna ścieżki aktualnie edytowanej klasy w Netbeansie), ile razy odchodziłem od komputera i jaki był tego łączny czas (każde wylogowanie WIN+L), itd.

Zastosowań może być mnóstwo, a z JNA korzystają takie projekty jak:

  • IntelliJ IDEA
  • Netbeans
  • Log4j – biblioteka do logowania
  • Hudson
  • Apache Cassandra
  • i wiele innych

Narzędzia do badania okien

Osobiście korzystam z dwóch narzędzi do badania komponentów okienek. Są to:

  1. Active Window Info (Window Spy) dołączony do programu AutoHotKey.
    Po jego uruchomieniu przesuwamy wskaźnik myszy nad interesujący nas komponent innego programu i otrzymujemy informację na jego temat.
    active_window_info
  2. WinSpy++
    winspy1
    Bardziej zaawansowany – aby pobrać informacje o komponencie, przeciągamy na niego ikonkę, po czym pojawi się znacznie więcej informacji niż w przypadku poprzedniego programu:
    winspy2
    Jeśli klikniemy w przycisk „More”, a następnie „Locate” nasz komponent zostanie wyszukany i wyświetlony w drzewie:
    winspy3

 

Hello world – pobieramy tekst z Notepada++

Uruchamiamy program i wpisujemy jakiś tekst w edytorze:

notepad

Badamy element w WinSpy++ i otrzymujemy informacje:

notepad2

To, co nas interesuje to Class okna programu (Notepad++) i komponentu (Scintilla).

Kod w Javie

W projekcie mavenowym dodajemy zależności do JNA:

<dependencies>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>4.2.2</version>
        </dependency>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna-platform</artifactId>
            <version>4.2.2</version>
        </dependency>
    </dependencies>

Tworzymy interfejs do biblioteki user32.dll

interface User32 extends StdCallLibrary {

    User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
    int WM_GETTEXT = 0x000d;
    int WM_GETTEXTLENGTH = 0x000e;

    WinDef.HWND FindWindowA(String lpClassName, String lpWindowName);

    WinDef.HWND FindWindowExA(WinDef.HWND hwndParent, WinDef.HWND hwndChildAfter, String lpClassName, String lpWindowName);

    WinDef.LRESULT SendMessageA(WinDef.HWND editHwnd, int wmGettext, long l, byte[] lParamStr);

}

W nowej klasie dodajemy metodę zwracającą uchwyt do komponentu edytora Notepada++:

public HWND getNotepadEditHWND() {
    WinDef.HWND notepadHWND = user32.FindWindowA("Notepad++", null);
    return user32.FindWindowExA(notepadHWND, null, "Scintilla", null);
}

oraz pomocnicze metody do pobierania tekstu i jego długości dla wskazanego komponentu:

public int getTextLengthInChars(WinDef.HWND hwnd) {
    return user32.SendMessageA(hwnd, User32.WM_GETTEXTLENGTH, 0, null).intValue();
}

public String getText(WinDef.HWND hwnd) {
    int textLength = getTextLengthInChars(hwnd);
    byte[] result = new byte[textLength];
    user32.SendMessageA(hwnd, User32.WM_GETTEXT, textLength + 1, result);
    return Native.toString(result, "CP1250");
}

Zawartość całej klasy wygląda następująco:

package net.krzysztofjelonek.worklogger;

import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.win32.StdCallLibrary;

public class WinApi {

    private final User32 user32;

    interface User32 extends StdCallLibrary {

        User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
        int WM_GETTEXT = 0x000D;
        int WM_GETTEXTLENGTH = 0x000E;

        WinDef.HWND FindWindowA(String lpClassName, String lpWindowName);

        WinDef.HWND FindWindowExA(WinDef.HWND hwndParent, WinDef.HWND hwndChildAfter, String lpClassName, String lpWindowName);

        WinDef.LRESULT SendMessageA(WinDef.HWND editHwnd, int wmGettext, long l, byte[] lParamStr);

    }

    public WinApi() {
        user32 = User32.INSTANCE;
    }

    public HWND getNotepadEditHWND() {
        WinDef.HWND notepadHWND = user32.FindWindowA("Notepad++", null);
        return user32.FindWindowExA(notepadHWND, null, "Scintilla", null);
    }

    public int getTextLengthInChars(WinDef.HWND hwnd) {
        return user32.SendMessageA(hwnd, User32.WM_GETTEXTLENGTH, 0, null).intValue();
    }

    public String getText(WinDef.HWND hwnd) {
        int textLength = getTextLengthInChars(hwnd);
        byte[] result = new byte[textLength];
        user32.SendMessageA(hwnd, User32.WM_GETTEXT, textLength + 1, result);
        return Native.toString(result, "CP1250");
    }

    public static void main(String[] args) {
        WinApi winApi = new WinApi();
        System.out.println(winApi.getText(winApi.getNotepadEditHWND()));
    }
}

Po uruchomieniu otrzymujemy na wyjściu zawartość pola edycyjnego notatnika:

To jest przykładowy tekst

Zwróćcie uwagę, że nie ma problemów z kodowaniem polskich znaków.

Jest to klasa robocza, a docelowo po refaktoryzacji metoda getNotepadEditHWND() jak i kolejne związane związane z obsługą konkretnych programów powinny znaleźć się z w osobnych klasach komunikujących się z naszą WinApi.

Podsumowanie

W przedstawionym przykładzie jest wiele uproszczeń. Np. w metodzie getNotepadEditHWND() pobieranie uchwytu do klasy „Scintilla” zostało wykonane z założeniem, że jest to pierwsza klasa tego typu w oknie „Notepad++”. W kolejnym artykule przedstawię rozwiązanie dla zagnieżdżonych komponentów z rekurencyjnym ich przeszukiwaniem na przykładzie Total Commandera.

 

Książki do nauki Javy

 

Artykuł Java JNA, user32.dll – przechwytujemy aplikacje okienkowe pochodzi z serwisu Notatnik programisty.

Viewing all 102 articles
Browse latest View live