Archive for Marzec, 2010

Użycie słowa kluczowego break

Słowo kluczowe break może występować w dwóch formach:

  • forma samodzielna, bez etykiety
  • wskazanie etykiety, która ma zostać wywołania

Słowo kluczowe break bez etykiety

Samodzielne słowo break może zostać użyte tylko w kontekście pętli (for, while, do-while) oraz konstrukcji switch.

W przypadku pętli powoduje natychmiastowe przerwanie jej wykonywania i przejście do wykonywania nasŧpnej instrukcji po zakończeniu pętli. W przypadku wywołania polecenia wewnątrz wewnętrznej pętli, zostanie przerwane wykonywanie tylko pętli wewnętrznej.

1
2
3
4
5
6
7
8
9
10
11
12
for (int i = 0; i < 10; i++) {
    System.out.print("i = " + i);

    for (int j = i; j < i + 5; j++) {
        System.out.print("  j = " + j);
        if (j < 4) {
            break;
        }
    }

    System.out.println();
}

Użycie break w linii 7 w powyższym kodzie spowoduje przejście aplikacji do wykonywania kody w linii 11 (czyli ciągle wewnątrz pierwszej pętli).

Także break jest niezastąpione podczas używania konstrukcji switch:

1
2
3
4
5
6
7
8
9
10
11
12
13
int test = 1;

switch (test) {
default:
    System.out.println("Wartość domyślna");
case 0:
    System.out.println("Zero");
case 1:
    System.out.println("Jeden");
    break;
case 2:
    System.out.println("Dwa");
}

Co zostanie wydrukowane po uruchomieniu powyższego fragmentu kodu? Zaskoczenia żadnego nie będzie:

Jeden

Czyli zostanie wywołana linia 9, a następnie nastąpi opuszczenie całej konstrukcji switch.

Ale oto co zostanie wypisane na ekranie, jeżeli zmienimy przypisanie int test = 4:

Wartość domyślna
Zero
Jeden

Ponieważ wartość 4 nie ma żadnego przypadku opisanego w switch więc jest wykonywany blok wejścia default. I następnie kod jest wykonywany aż do pierwszego napotkanego słowa break lub też końca konstrukcji switch.

Słowo kluczowe break z etykietą

Istnieje także możliwość podania etykiety po słowie kluczowym break. Konstrukcja to może zostać użyta do zakończenia każdego bloku oznaczonego daną etykietą. Powoduje przejście wykonywania kodu do pierwszej instrukcji następującym po danym bloku kodu oznaczonym etykietą:

1
2
3
4
5
6
7
wyjscie: {
    int j =2;
    if (j == 2)
        break wyjscie;
    System.out.println("Blok danych z etykietą");
}
System.out.println("Koniec");

Po wykonaniu powyższego kodu zostanie wydrukowana tylko pojedyncza linia:

Koniec

Tę wersję konstrukcji break często używa się w połączeniu z zagnieżdżonymi pętlami, pozwala na opuszczenie całej ich struktury bez kłopotliwych testów na poszczególnych jej poziomach.

Tags: , , ,

Czym jest JBoss Application Server (krótka charakterystyka)?

Historia serwera JBoss AS

Prace nad JBossem rozpoczął Marc Fleury w 1996 roku jako produkt z otwartymi źródłami, od początku będącym implementacją standardu J2EE. JBoss od początku był wydawany jako produkt objęty licencją LGPL. Początkowo produkt nosił nazwę EJBoss (Enterprise Java Beans Open Source Sofware), jednakże po sprzeciwie firmy Sun (która posiada prawa do używania nazwy EJB) porzucono początkowe E i utworzono nazwę JBoss.

W 2001 roku Fleury został współzałożycielem firmy JBoss Group LCC, która oferowała komercyjne wsparcie dla serwera aplikacji. W 2002 roku została opublikowana wersja 3 serwera, która wpierała w pełni specyfikację J2EE oraz była pierwsza wersją, która zaczęła konkurować z innymi własnościowymi serwerami aplikacyjnymi, takimi jak WebSpere czy WebLogic.

W 2004 roku spółka JBoss Group LCC została przekształcona w firmę JBoss Inc. Jednocześnie opublikowano wersję 4 tego serwera aplikacji, który uzyskał dużą popularność. Wsparcie oferowane przez JBoss Inc przestało się ograniczać tylko do serwera aplikacji, zostało także rozszerzone o szereg komponentów, które zostały stworzone na potrzeby prac nad serwerem aplikacyjnym, takimi jak: Hibernate, jBMP, JBoss Cache czy też JBoss Rules.

JBoss Inc została w 2006 roku wykupiona przez firmę Red Hat Inc. Opublikowano także nową wersję serwera JBoss AS 5.

Czym jest JBoss AS

JBoss Application Server 5 jest serwerem aplikacji, napisanym w 100% w języku programowania Java, zgodnym ze specyfikacją J2EE 5. Jest on zbudowany na podstawie technologii JBoss Microcontainer, która jest lekkim kontenerem, wspierającym bezpośrednią instalację aplikacji, konfigurację oraz zarządzanie cyklem życia obiektów POJO (Plain Old Java Objects). JBoss Microcontainer jest samodzielnym projektem, który zastąpił wcześniejsze jądro serwera JBoss JMX Microkernel, używane w wersjach 3 oraz 4. Podstawowe cele projektu:

  • jądro JBoss Microcontainer powinienno być samodzielnym projektem
  • usługi dostępne w JBoss AS powinny łatwo dać się używać w innych serwerach aplikacji
  • użycie obiektów POJO
  • dostarczenie środowiska do zarządzania obiektami POJO, wsparcie dla zależności oraz klastrowania

Serwer JBoss AS został zaprojektowany wokół koncepcji Virtual Deployment Framework (VDF).

To co obejmuje pojęcie JBoss AS bardzo dobrze oddaje następujący obrazek (Źródło: Administration And Configuration Guide):

JBoss Application Server 5 architecture

JBoss Application Server 5 architecture

Na grafice widać, jaki szereg różnych technologii wchodzi w skład serwera aplikacji. Duża część z nich została rozwinięta na jego potrzeby, ale istnieją także jako samodzielne biblioteki do wykorzystania w innych aplikacjach.

  • W serwerze aplikacji jest zawarta implementacja specyfikacji EJB3.0, która pozwala na duże uproszczenie procesu tworzenia, ułatwienia testowania aplikacji.
  • JBoss Messaging jest szkieletem dla megastruktury JBoss ESB, oraz domyślną implementacja JMS.
  • JBoss Cache 2.0 jest dostarczane w dwóch wersjach. Jedna to tradycyna pamięć cache korzystająca ze struktur drzewiastych oraz PojoCache, czyli pamięć cache oparta na obiektach POJO. Wspiera transakcje oraz replikację między systemami i pozwala na przezroczyste dla użytkownika wykorzystanie obiektów POJO zarówno w replikacji danych jak i ich utrwalaniu.
  • JBoss WS 2 jest to zestaw usług implementujących usługi webowe JAXES 2.0.
  • JBoss Transaction jest domyślnym zarządcą transakcji w JBoss AS 5.
  • JBoss Web jest kontenerem webowym w JBoss AS 5, jest on implementacja bazująca na aplikacji Apache Tomcat.

Tags: , ,

W jaki sposób zrobić zrzut ekranu w telefonie z Androidem

Ostatnio chciałem uzyskać zrzut ekranu z telefonu z systemem Android (na potrzebny wpisu na blogu) i po krótkim poszukiwaniu okazało się to dużo prostsze niż myślałem.

Krok 1: konfiguracja komputera

W sytuacji gdy używamy Linuksa, może być konieczna odpowiednia konfiguracja, opisana w tym wpisie: Dostęp do Internetu za pomocą HTC G1 z systemem Android (Proxoid). Ja przynajmniej ma tak skonfigurowanego demona UDEV, zawsze można spróbować bez tych kroków, jeżeli zadziała, to proszę o sygnał.

Dla przypomnienia, oto co trzeba zrobić:

Pierwszym elementem jest utworzenie pliku /etc/udev/rules.d/11-android.rules o następującej zawartości:

1
2
SUBSYSTEMS=="usb", SYSFS{idVendor}=="0bb4", SYSFS{idProduct}=="0c02", MODE="0666", OWNER="nazwa użytkownika"
SUBSYSTEMS=="usb", SYSFS{idVendor}=="0bb4", SYSFS{idProduct}=="0c01", MODE="0666", OWNER="nazwa użytkownika"

Aktualizacja

W przypadku jądra 2.6.32 powyższy wpis sprawiał mi problemy (telefon był ciągle wykrywany, nagle przestawał być widziany). Dopiero zmiana tego wpisu na poniższy rozwiązała problemy:

1
2
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0c01", ENV{ACL_MANAGE}="1", MODE="0666", OWNER="nazwa użytkownika"
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0c02", ENV{ACL_MANAGE}="1", MODE="0666", OWNER="nazwa użytkownika"

Swoją drogą, wg. komunikatów podawanych przez jądro to użycie atrybuty SYSFS nie jest zalecane przynajmniej od wersji 2.6.32, zamiast tego poleca się użycie właśnie atrybutu ATTR.

Należy wpisać swoją nazwę użytkownika po deklaracji OWNER. Teraz restart demona:

# /etc/init.d/udev restart

I można podłączać telefon. Po wydaniu poniższego polecenia powinniśmy otrzymać podobny komunikat:

# lsusb  | grep High
Bus 001 Device 017: ID 0bb4:0c02 High Tech Computer Corp.

Krok 2: Pobranie SDK dla telefonu

Ze strony Googla należy pobrać odpowiednie SDK dla telefonu kompatybilne z używanym systemem operacyjnym na komputerze biurkowym: http://developer.android.com/sdk/index.html. Pobranie SDK należy rozkopresować w jakimś katalogu.

Ja korzystam z SDK w wersji 1.6_r1.

Krok 3: Konfiguracja telefonu

Ostatnim elementem związanym z konfiguracją sprzętu jest włączenie trybu „USB debugging”. Czyli z MENU wybrać opcję Settings->Applications->Development, i zaznaczyć opcję USB debugging.

Okienko Android USB Deugging

Okienko Android USB Deugging

Krok 4: Zrzut ekranu

Po tych krokach związanych z konfiguracją telefonu i komputera pozostaje już tylko uruchominie aplikacji o nazwie Dalvik Debug Monitor i do dzieła. Czyli należy wejść do katalogu z SDK do telefonu, następnie do podkatalogu tools i uruchomić aplikację ddms.

Dalvik Debug Monitor

Dalvik Debug Monitor

Jeżeli aplikacja pomyślnie wykryje telefon (powinien pojawić się w okienku Name) to możemy z menu wybrać pozycję Device->Screen capture, co spowoduje zrobienie zrzutu ekranu telefonu. Pozostaje teraz tylko zapisać obrazek.

Źródła

Tags: , ,

Mapa myśli z poleceń VIMa

Mapa myśli przedstawiająca polecenia z VIMa. Całości pochodzi ze strony: Learning Vim The Pragmatic Way.

Mapa myśli poleceń VIMa

PDF z mapą myśli poleceń VIMa

Źródła

Tags: , , , , ,

Zadawanie zapytań w aplikacji rpm: wybór informacji do wyświetlenia

Po zapoznaniu się ze sposobami wyboru listy pakietów we wpisie Zadawanie zapytań w aplikacji rpm: wybór pakietów czas na poznanie sposobów wyświetlenia informacji o nich.

Wybór informacji do wyświetlenie

  • brak kryteriów
    Jeżeli zostanie pominięty ten parametr, to po prosty polecenie rpm wyświetli nazwę i wersję pakietu:

    # rpm -q bash
    bash-3.2-24.el5
  • -iwyświetlenie informacji o pakiecie

    Polecenie to pozwala na wyświetlenie szczegółowych informacji o wybranym pakiecie:

    # rpm -q -i bash
    Name        : bash                         Relocations: (not relocatable)
    Version     : 3.2                               Vendor: Red Hat, Inc.
    Release     : 24.el5                        Build Date: Tue 21 Oct 2008 02:15:55 PM CEST
    Install Date: Tue 23 Feb 2010 08:06:34 PM CET      Build Host: hs20-bc1-7.build.redhat.com
    Group       : System Environment/Shells     Source RPM: bash-3.2-24.el5.src.rpm
    Size        : 5349546                          License: GPLv2+
    Signature   : DSA/SHA1, Mon 08 Dec 2008 01:25:44 PM CET, Key ID 5326810137017186
    Packager    : Red Hat, Inc. <http: //bugzilla.redhat.com/bugzilla>
    URL         : http://www.gnu.org/software/bash
    Summary     : The GNU Bourne Again shell (bash) version 3.1.
    Description :
    The GNU Bourne Again shell (Bash) is a shell or command language
    interpreter that is compatible with the Bourne shell (sh). Bash
    incorporates useful features from the Korn shell (ksh) and the C shell
    (csh). Most sh scripts can be run by bash without modification. This
    package (bash) contains bash version 3.1, which improves POSIX
    compliance over previous versions.

    Znaczenie powyższych pól jest następujące:

    • Name – nazwa pakietu, którego dotyczyło pytane. Najczęściej jest powiązane z nazwą aplikacji jaka jest instalowana przez podany pakiet, ale nie zawsze (np. pakiety httpd, coreutils).
    • Version – główna wersja aplikacji, taka na podstawie której został stworzony pakiet instalacyjny.
    • Release – wersja wydania danego pakietu. Jeżeli zmienia się pole Version to powinna mieć wartość 1. Jest zwiększana zawsze w momencie wprowadzenia zmian w stosunku do podstawowej wersji aplikacji.
    • Install date – data instalacji pakietu w systemie.
    • Group – grupa, do której należy pakiet.
    • Size – łączony rozmiar wszystkich plików jakie znajdują się w danym pakiecie.
    • Summary – krótki opis pakietu.
    • Description – dłuższy, dokładniejszy opis pakietu.
    • Packager – kto jest odpowiedzialny za stworzenie pakietu (pakietu, nie samej aplikacji).
    • Build Date – data utworzenia pakietu.
    • Build Host – nazwa komputera, na którym nastąpiło utworzenie pakietu.
    • Source RPM – nazwa źródłowego pliku RPM, na podstawie którego utworzono pakiet.
    • License – licencja na podstawie której jest rozprowadzana dana aplikacji.
    • URL – adres do strony danej aplikacji.

  • -llista plików
    Parametr ten powoduje wyświetlenie listy plików, jakie znajdują się w danym pakiecie:

    # rpm -ql bash                                                          
    /bin/bash                                                                                  
    /bin/sh                                                                                    
    /etc/skel/.bash_logout                                                                    
    /etc/skel/.bash_profile                                                                    
    /etc/skel/.bashrc                                                                          
    /usr/bin/bashbug-32                                                                        
    /usr/share/doc/bash-3.2                                                                    
    /usr/share/doc/bash-3.2/CHANGES                                                            
    /usr/share/doc/bash-3.2/COMPAT                                                            
    ....

    Można także dodatkowo dodać przełącznik -v, który spowoduje wyświetleni dodatkowych informacji o poszczególnych plikach:

    # rpm -qvl bash
    -rwxr-xr-x    1 root    root           729292 Oct 21  2008 /bin/bash
    lrwxrwxrwx    1 root    root                4 Oct 21  2008 /bin/sh -> bash
    -rw-r--r--    1 root    root               33 Oct 21  2008 /etc/skel/.bash_logout
    -rw-r--r--    1 root    root              176 Oct 21  2008 /etc/skel/.bash_profile
    -rw-r--r--    1 root    root              124 Oct 21  2008 /etc/skel/.bashrc
    -rwxr-xr-x    1 root    root             7044 Oct 21  2008 /usr/bin/bashbug-32
    drwxr-xr-x    2 root    root                0 Oct 21  2008 /usr/share/doc/bash-3.2
    -rw-r--r--    1 root    root           221125 Sep 26  2006 /usr/share/doc/bash-3.2/CHANGES
    -rw-r--r--    1 root    root            11659 Aug 29  2006 /usr/share/doc/bash-3.2/COMPAT
    -rw-r--r--    1 root    root            73644 Oct 10  2006 /usr/share/doc/bash-3.2/FAQ
    ....
  • -cwyświetlenie plików konfiguracyjnych
    W pliku RPM pliki z konfiguracją aplikacji są traktowane w specyficzny sposób, w związku z czym muszą być odpowiednio oznaczone. Z tego też powodu możemy w łatwy sposób sprawdzić, jakie pliki konfiguracyjne zwiera dany pakiet:

    # rpm -qc bash
    /etc/skel/.bash_logout
    /etc/skel/.bash_profile
    /etc/skel/.bashrc
  • -dwyświetlenie plików z dokumentacją
    Przełącznik ten pozwala na wyświetlenie wszystkich plików z dokumentacją, jakie znajdują się w danym pakiecie:

    # rpm -qd bash | head
    /usr/share/doc/bash-3.2/CHANGES
    /usr/share/doc/bash-3.2/COMPAT
    /usr/share/doc/bash-3.2/FAQ
    /usr/share/doc/bash-3.2/INTRO
    /usr/share/doc/bash-3.2/NEWS
    /usr/share/doc/bash-3.2/NOTES
    /usr/share/doc/bash-3.2/POSIX
    /usr/share/doc/bash-3.2/article.ms
    /usr/share/doc/bash-3.2/article.ps
    /usr/share/doc/bash-3.2/article.txt
    ....
  • --provideszależności dostarczane przez pakiet

    Można wyświetlić informacje, jakie dodatkowe zależności, możliwości udostępnia wybrany pakiet (są one potem używane przez inne pakiety do określenia co jest wymagane do instalacji danego pakietu):

    # rpm -q --provides -p libicu-3.6-5.11.4.i386.rpm
    libicudata.so.36
    libicui18n.so.36
    libicuio.so.36
    libicule.so.36
    libiculx.so.36
    libicutu.so.36
    libicuuc.so.36
    libicu = 3.6-5.11.4
  • --requiresczego wymaga dany pakiet do instalacji

    W każdym pakiecie może znajdować się informacja o zależnościach, które muszą zostać spełnione zanim zostanie on zainstalowany:

    # rpm -q --requires -p x3270-3.3.4p7-3.el5.4.i386.rpm
    config(x3270) = 3.3.4p7-3.el5.4
    libc.so.6
    libc.so.6(GLIBC_2.0)
    libc.so.6(GLIBC_2.1)
    libc.so.6(GLIBC_2.3)
    libc.so.6(GLIBC_2.3.4)
    libc.so.6(GLIBC_2.4)
    libcrypto.so.6
    libicui18n.so.36
    libicuuc.so.36
    libnsl.so.1
    libssl.so.6
    libutil.so.1
    rpmlib(CompressedFileNames) < = 3.0.4-1
    rpmlib(PayloadFilesHavePrefix) <= 4.0-1
    rtld(GNU_HASH)
    xorg-x11-font-utils

    Jak widać, pakiet x3270-3.3.4p7-3.el5.4.i386.rpm wymaga spełnienia szeregu różnych zależności w celu jego instalacji. Można zauważyć, że na liście są wymieniane biblioteki ibicui18n.so.36 oraz libicuuc.so.36, które są udostępniane przez pakiet libicu-3.6-5.11.4.i386.rpm.

  • --scriptswyświetlenie skryptów instalacyjnych

    Polecenie to spowoduje wyświetlenie skryptów wykonywanych zarówno przed/po instalacji/odinstalowaniu aplikacji.

    # rpm -q --scripts initscripts
    preinstall scriptlet (using /bin/sh):
    /usr/sbin/groupadd -g 22 -r -f utmp
    postinstall scriptlet (using /bin/sh):
    touch /var/log/wtmp /var/run/utmp /var/log/btmp
    chown root:utmp /var/log/wtmp /var/run/utmp /var/log/btmp
    chmod 664 /var/log/wtmp /var/run/utmp
    chmod 600 /var/log/btmp

    /sbin/chkconfig --add netfs
    /sbin/chkconfig --add network
    /sbin/chkconfig --add netconsole
    /sbin/chkconfig --add rawdevices
    preuninstall scriptlet (using /bin/sh):
    if [ $1 = 0 ]; then
      /sbin/chkconfig --del netfs
      /sbin/chkconfig --del network
      /sbin/chkconfig --del netconsole
      /sbin/chkconfig --del rawdevices
    fi
  • queryformatsamodzielne utworzenie informacji o pakiecie

    Polecenie to pozwala na samodzielne zdefiniowanie listy informacji, jakie zostaną wyświetlone o danym pakiecie. Pełny opis polecenie znajduje się w dokumentacji oraz na stronach podanych na końcu wpisu.

    Wyświetlenie nazwy oraz wersji pakietu:

    # rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}\n' bash
    bash-3.2-24.el5

    Wyświetlenie daty instalacji pakietu:

    # rpm -q --queryformat '%{NAME} was installed on %{INSTALLTIME:date}\n' bash
    bash was installed on Tue 23 Feb 2010 08:06:34 PM CET

    Wyświetlenie listy plików, które znajdują się w pakiecie łącznie z ich rozmiarami:

    # rpm -q --queryformat '%{NAME}: [%{FILENAMES} (%{FILESIZES} bytes)\n]' bash
    bash: /bin/bash (729292 bytes)
    /bin/sh (4 bytes)
    /etc/skel/.bash_logout (33 bytes)
    /etc/skel/.bash_profile (176 bytes)
    /etc/skel/.bashrc (124 bytes)
    /usr/bin/bashbug-32 (7044 bytes)
    /usr/share/doc/bash-3.2 (4096 bytes)
    /usr/share/doc/bash-3.2/CHANGES (221125 bytes)
    /usr/share/doc/bash-3.2/COMPAT (11659 bytes)
    /usr/share/doc/bash-3.2/FAQ (73644 bytes)
    ....

    Można także wyświetlić lisŧę wszystkich tagów, jakie mogą zostać użyte w opcji queryformat:

    # rpm --querytags
    HEADERIMAGE
    HEADERSIGNATURES
    HEADERIMMUTABLE
    HEADERREGIONS
    HEADERI18NTABLE
    SIGSIZE
    SIGPGP
    SIGMD5
    PKGID
    SIGGPG

    Opis częsci z poszczególnych tagów można znaleźć w artykule Available Tags For –queryformat

Źródła

Tags: , ,