Enigma2 - tworzenie pakietów OPKG

, poniedziałek, 20 sierpnia 2012 0 komentarze

W tym artykule opiszę proces tworzenia i przeglądania pakietów OPKG, czyli plików z rozszerzeniem IPK. Na początek informacja w jaki sposób rozpakować pakiet. Powiedzmy, że chcemy podejrzeć zawartość pakietu enigma.ipk. W tym celu należy wykonać następujące kroki:

1. Utwórz katalog tymczasowy:

mkdir ./tmp

2. Wejdź do katalogu tmp:

cd tmp

3. Rozpakować zawartość pakietu IPK:

ar -ox ../enigma2.ipk

4. Rozpakować zawartość archiwów:

gunzip ./*.tar.gz

5. Wypakować pliki TAR:

tar xf ./data.tar
tar xf ./control.tar

6. Usunąć pliki TAR:

rm *.tar

Jeżeli chodzi o strukturę pakietu OPKG to jest ona następująca:

package.opk (ar)
+- debian-binary (text)
+- control.tar.gz (tarball)
...+- control (text)
...+- preinst (script)
...+- postinst (script)
...+- prerm  (script)
...+- postrm (script)
+- data.tar.gz (tarball)
...+- system
......+- bin
.........+- opkg-hello (program)

W strukturze jest stały plik tekstowy debian-binary, następnie spakowane skrypty kontrolne control.tar.gz, a następnie spakowane archiwum docelowe, czyli dane data.tar.gz.
Teraz przejdziemy do procesu tworzenia pakietu. W celu utworzenia pakietu wykonujemy:

1. Tworzymy katalog tmp

mkdir ./tmp

2. Wchodzimy do katalogu tmp:

cd tmp

3. Tworzymy plik tekstowy debian-binary z zawartością "2.0"
4. Tworzymy pliki kontrolne i pakujemy je do archiwum control.tar.gz. Do tworzenia archiwum TAR.GZ uzywany komendy:

tar zcvf control.tar.gz LISTA PLIKÓW/KATALOGÓW

5. Pliki danych pakujemy z docelową strukturą katalogową do data.tar.gz
6. Tworzymy pakiet przy użyciu komendy:

ar -r enigma2.ipk LISTA PLIKÓW/KATALOGÓW

Poniżej znajdują się przykładowe zawartości skryptów kontrolnych.

1. Skrypt control:

Package: enigma2-plugin-extensions-sample                                                                             
Version: 1.2-rc1                                                                                                                  
Description: My Sample Plugin                                                                                 
Maintainer: MASL                                                                                      
Section: base                                                                                                                     
Architecture: mipsel                                                                                                              
Priority: optional                                                                                                                
Homepage: xxxxxx                                                                                                                  
Depends: enigma2                                                                                                                  
Source: xxxxx

2. Skrypt postinst:

#!/bin/sh                                                                                                                         
echo ""                                                                                                                           
echo "********************************************************"                                                                   
echo "*  My Plugin                              *"                                                                       
echo "*  Support:  masl@xxx.pl                *"                                                                             
echo "*  Mod by MASL (c) 2012     *"                                                                                  
echo "********************************************************"                                                                   
echo ""                                                                                                                           
echo "Sample Plugin successfully installed! You should restart enigma2 now"                                                          
echo ""                                                                                                                           
exit 0  

2. Skrypt postrm:

#!/bin/sh                                                                                                                                                                                                                                                        rm -rf /usr/lib/enigma2/python/Plugins/Extensions/SamplePlugin                                                              
echo "Plugin removed! You should restart enigma2 now!"                                                                                                                                                                                                        
exit 0


Linux - jak sprawdzić wielkość katalogów w systemie plików

piątek, 10 sierpnia 2012 0 komentarze

W celu wylistowania systemów plików należy wykonać komendę:

df -h

W wyniku dostaniemy listę filesystemów zamontowanych w naszym linuxie, czyli coś w rodzaju:
Filesystem                Size      Used Available Use% Mounted on
ubi0:rootfs             102.1M     99.3M      2.8M  97% /
udev                      2.0M     88.0K      1.9M   4% /dev
/dev/mtdblock2            2.0M    388.0K      1.6M  19% /boot
tmpfs                    67.6M    268.0K     67.3M   0% /var
tmpfs                    67.6M     16.0K     67.6M   0% /tmp
tmpfs                    67.6M         0     67.6M   0% /dev/shm
/dev/sda1               931.2G     92.3G    838.9G  10% /media/hdd

W celu sprawdzenia wielkości katalogów w wybranym filesystemie należy wykonać:
du -shx -d 1 /

Znaczenie opcji:
- s - wyświetlenie jedynie wartości sumarycznej
- h - pokaż raport w formie czytelnej
- x - zawężenie do bezpośredniego filesystemu - katalogi z innych filesystemów są pomijane w końcowym raporcie
- d - głębokość pokazywanej struktury - wartość 1 oznacza pokazanie tylko bezpośrednich "dzieci"

Przykładowy wynik wykonania komendy:
560.0K /bin
4.2M /etc
21.4M /lib
137.0M /usr
132.0K /home
1.6M /sbin
0 /universe
26.9M /media
191.8M /

VU+ DUO Enigma2 - informacja o portach

, poniedziałek, 30 lipca 2012 0 komentarze

Ostatnio zostałem użytkownikiem sprzętu o nazwie VU+ DUO będącego tunerem telewizji satelitarnej opartym na systemie LINUX. Wszystkim tym którzy chcą mieć naprawdę dobrą maszynę z ładnym interfejsem graficznym (tutaj zachęcam do zainstalowania Black Hole) do oglądania telewizji SAT polecam ten sprzęt.

Przestrzegam wszystkich na wstępie przed tworzeniem hasła zawierającego znak AT (@) ponieważ ja takowe miałem i było to źródłem problemów ze steamingiem na iPAD-a i na inne urządzenia również. Pojawiający się błąd na iPAD w ogóle nic nie mówi na temat problemu z URL-em i dlatego ta przestroga - pół dnia na to straciłem żeby stwierdzić gdzie leży przyczyna.

No to teraz wyjaśnienie na temat otwartych portów:

21 - FTP
22 - SSH
23 - Telnet
80 - WebInterface - można zmienić w ustawieniach pluginu (polecam to zrobić - można uniknąć wielu problemów jak zainstaluje się nam inna wtyczka pracująca na porcie 80 i zrestartujemy system)
111 -
139 - Netbios port
445 - port wymiany plików Windows (SMB)
2029 -
8001 - domyślny port streamingu VIDEO
12000 - port nasłuchu serwera CCcam (można wyłączyć nasłuch ustawiając parametr "SERVER LISTEN PORT" na 0 w pliku /etc/CCcam.conf)
16000 - port telnetu dla CCcam
16001 - port usługi WEB dla CCcam: http://ip_CCcam_server:16001
31335 - STREAM-SEC: przeznaczenie to wysyłanie pojedynczego strumienia - wykorzystywany do strumieniowania AUDIO MP2
31337 -
31338 - STREAM-PES: przeznaczenie to strumieniowanie DVB zawierające kilka ES wewnątrz
31339 - STREAM-TS: przeznaczenie to strumieniowanie DVB z wykorzystaniem transport-stream jako kontenera
31340 - UDP-STREAM-PES
31341 - UDP-STREAM-PES
31342 - STREAM-TS-FILE: przeznaczenie to strumieniowanie DVB - odczyt z pliku zamiast z demultipleksera
31343 - STREAM-ES
57076 -
60533 -



SmartGWT: zamknięcie okna po operacji saveData()

, niedziela, 31 lipca 2011 0 komentarze

Przedstawiam rozwiązanie problemu dotyczącego zamknięcia okna po poprawnym wykonaniu operacji save. Problem polega na tym, że po wykonaniu kodu jak poniżej dostaniemy błąd NULL-owej referencji do okna.

public class DynamicFormWindow extends Window {
protected DynamicForm form;
private ActionPanel actionPanel = new ActionPanel();

public DynamicFormWindow(DynamicForm form, String title) {
this.form = form;

setShowShadow(true);
setShadowSoftness(4);
setShadowOffset(3);

this.setTitle(title);
this.setLayoutMargin(4);
this.setShowMinimizeButton(false);
this.setCanDragResize(true);
this.setAutoSize(true);
this.setIsModal(true);
this.setShowModalMask(false);
this.centerInPage();

this.addCloseClickHandler(new CloseClickHandler() {
@Override
public void onCloseClick(CloseClientEvent event) {
destroy();
}
});

VPanel panel = new VPanel();
panel.setPadding(2);
panel.addMember(form);
panel.addMember(this.actionPanel);

this.addItem(panel);

IButton saveButton = new IButton("Zapisz");
saveButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
DynamicFormWindow.this.saveData();
}
});
addActionButton(saveButton);
}

protected void saveData() {
this.form.saveData();
this.destroy();
}

protected void addActionButton(IButton button) {
this.actionPanel.addMember(button);
}

}


Problem polega na tym, że po wykonaniu saveData() automatycznie wykonywane jest destroy(), gdzie saveData() wykonuje akcję asynchronicznie używając GWT-RPC po stronie serwerowej aplikacji.

Rozwiązaniem problemu jest wykorzystanie Callbacka na saveData() oraz funkcjonalności Scheduler-a. W tym celu zmieniamy ciało metody saveData() w następujący sposób:


protected void saveData() {
if (this.form.validate()) {
this.form.saveData(new DSCallback() {
@Override
public void execute(DSResponse response, Object rawData, DSRequest request) {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
DynamicFormWindow.this.destroy();
}
});
}
});
}
}


Takie podejście daje nam to, że kod zamykający okno wykonywany jest po tym jak zakończy się operacja saveData() oraz bieżąca pętla obsługi zdarzeń GWT. Oznacza to, że kod zamykający okno wykona się po całkowitym zakończeniu obsługi związanej z akcją saveData().

Dodatkowe metody Schedulera scheduleEntry/scheduleFinally wykonywane są wewnątrz pętli obsługi zdarzeń zaraz przed/po tym jak wykonany zostanie kod związany z obsługą zdarzeń GWT. W przypadku wykonywania manipulacji DOM wewnątrz tej samej pętli obsługi zdarzeń, można przeciwdziałać dodatkowemu odmalowaniu przez browser.

Web Project Template, czyli Eclipse + Maven+ Spring + GWT + Hibernate

, , , , 0 komentarze

W tym artykule chciałbym podzielić się swoim doświadczeniem w ramach konfiguracji projektu typu Web wykorzystującego Spring, SmartGWT, Hiberante. Całość konfiguracji w zamierzeniu ma być budowana przez Maven-a. Zakładam, że do developmentu używane będzie środowisko Eclipse Helios SR 2. Dlatego zacznijmy od konfiguracji środowiska projektowego.

Zaczynamy od ściągnięcia Eclipsa ze strony Eclipse Helios SR2 Packages (v 3.6.2). Teraz, żeby nam się dobrze pracowało instalujemy następujące pluginy:
- Maven Integration for Eclipse Update Site
- Google Update Site for Eclipse 3.6
- GWT Designer Update Site
- SpringSource Update Site for Eclipse 3.6
- SpringSource Update Site for Eclipse 3.6 (Dependencies)
- JBoss Tools Development Milestone Update Site
Po instalacji Eclipse oraz wymienionych pluginów jesteśmy przygotowani do pracy, więc możemy zacząć. Moja propozycja podziału na moduły aplikacji typu Web jest następująca:
- moduł dziedzinowy: zawierający zarówno model dziedzinowy jak i operacje związane z modelem, czyli inaczej mówiąc model JPA oraz związane z nimi DAO (Data Access Objects)
- moduł usług: zawierający bean-y Springowe udostępniające usługi biznesowe w oparciu o model dziedzinowy
- moduł warstwy web: moduł zawierający całość logiki klienckiej, udostępniający warstwę UI dla użytkownika końcowego.

Moduł warstwy web komunikuje się z modułem serwisów w celu wykonywania akcji po stronie serwera. Nie ma on dostępu do modułu domenowego, gdyż moduł serwisów izoluje dostęp do warstwy domenowej.

Zajmijmy się teraz konfiguracją modułów. W tym celu utworzyć należy strukturę plików tak jak zostało to przedstawione na rysunku obok.

Najważniejsze w tym momencie są pliki pom.xml, czyli pliki konfiguracyjne Mavena. Teraz zajmę się ustawieniami w tych plikach. Dobrze, główny plik konfiguracyjny (root) znajdujący się na poziomie katalogów m2-domain, m2-service, m2-web wygląda następująco:

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0
pl.masl.m2
m2-root
1.0.0-SNAPSHOT
pom
M-2 :: ${project.artifactId}


UTF-8
1.6
1.6
4.8.2
3.0.5.RELEASE
3.0.5.RELEASE
3.5.6-Final
1.0.0.Final
2.0.8
5.1.10



m2-domain
m2-service
m2-web




junit
junit
${junit.verion}
test


org.slf4j
jcl-over-slf4j
1.5.8


org.slf4j
slf4j-log4j12
1.5.8





maven-annotation-plugin

http://maven-annotation-plugin.googlecode.com/svn/trunk/mavenrepo






Central Repo
http://repo1.maven.org/maven2


com.springsource.repository.maven.release
http://maven.springframework.org/release/

false



com.springsource.repository.maven.snapshot
http://maven.springframework.org/snapshot/

true



com.springsource.repository.maven.milestone
http://maven.springframework.org/milestone/

false



SmartGWT Repo
http://www.smartclient.com/maven2/


JavaNet
http://download.java.net/maven/2




Co widać w tym pliku to ustawienia dotyczące wersji bibliotek używanych w ramach aplikacji, definicję modułów z których składa się aplikacja oraz definicja repozytoriów dla bibliotek.

Następnie konfigurujemy plik pom.xml dla modułu domenowego:
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0


m2-root
pl.masl.m2
1.0.0-SNAPSHOT


pl.masl.m2
m2-domain
1.0.0-SNAPSHOT
M-2 :: ${project.artifactId}



org.hibernate
hibernate-jpamodelgen
${hibernate-jpa.version}


org.hibernate
hibernate-entitymanager
${hibernate.version}


org.hibernate
hibernate-c3p0
${hibernate.version}


org.hibernate
hibernate-ehcache
${hibernate.version}


org.springframework
spring-test
${spring.version}


org.springframework.data
spring-data-jpa
1.0.0.M2


org.springframework
spring-orm
${spring.version}


mysql
mysql-connector-java
${mysql.connector.version}






org.apache.maven.plugins
maven-compiler-plugin
2.0.2

${maven.compiler.source}
${maven.compiler.target}
${project.build.sourceEncoding}
-proc:none




org.bsc.maven
maven-processor-plugin
1.3.1


process

process

generate-sources

target/metamodel


org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor








org.codehaus.mojo
build-helper-maven-plugin
1.3


add-source
generate-sources

add-source



target/metamodel










Co mamy w tym pliku to zależności od hibernate-a i Springa, definicja pluginu do kompilacji, definicja pluginów do generacji modelu JPA 2.0.

Teraz konfiguracja pliku pom.xml dla modułu usług:
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0

m2-root
pl.masl.m2
1.0.0-SNAPSHOT

pl.masl.m2
m2-service
1.0.0-SNAPSHOT
M-2 :: ${project.artifactId}



pl.masl.m2
m2-domain
1.0.0-SNAPSHOT
jar
compile


aspectj
aspectjrt
1.5.4


aspectj
aspectjweaver
1.5.4


net.sf.dozer
dozer
5.3.2


org.springframework
spring-tx
${spring.version}


org.springframework.security
spring-security-config
${springframework.security.version}






org.apache.maven.plugins
maven-compiler-plugin
2.3.2

${maven.compiler.source}
${maven.compiler.target}
${project.build.sourceEncoding}



org.apache.maven.plugins
maven-source-plugin
2.1.2


attach-sources
verify

jar-no-fork








W tym pliku widać definicję zależności od modułu domenowego, bibliotek Springa oraz pluginów do kompilacji.

No i na koniec definicja pom.xml-a dla modułu webowego:

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">


m2-root
pl.masl.m2
1.0.0-SNAPSHOT


4.0.0
pl.masl.m2
m2-web
war
1.0.0-SNAPSHOT
M-2 :: ${project.artifactId}



2.3.0
2.4
${project.build.directory}/${project.build.finalName}




pl.masl.m2
m2-service
1.0.0-SNAPSHOT


com.google.gwt
gwt-user
${gwtVersion}
provided


com.google.gwt
gwt-servlet
${gwtVersion}
compile


javax.validation
validation-api
1.0.0.GA
test


javax.validation
validation-api
1.0.0.GA
sources
test


com.smartgwt
smartgwt
${smartgwt.version}
compile


com.smartgwt
smartgwt-skins
${smartgwt.version}
compile


com.google.code
gwt-log
3.1.3


net.sf.gwt-widget
gwt-sl
1.3-RC1
jar
compile


gwt-servlet
com.google.gwt


cglib-nodep
cglib




org.springframework
spring-web
${spring.version}


org.springframework
spring-webmvc
${spring.version}



org.springframework.security
spring-security-config
${springframework.security.version}


org.springframework.security
spring-security-web
${springframework.security.version}




${webappDirectory}/WEB-INF/classes
m2



org.codehaus.mojo
gwt-maven-plugin
2.3.0-1



compile
test
i18n
generateAsync





pl.masl.m2:m2-service

M2.html
${webappDirectory}
pl.masl.m2.web.gwt.client.Constants


pl.masl.m2.web.gwt.client.Messages




org.apache.maven.plugins
maven-war-plugin
2.1.1


compile

exploded




${webappDirectory}



org.apache.maven.plugins
maven-compiler-plugin
2.3.2

${maven.compiler.source}
${maven.compiler.target}
${project.build.sourceEncoding}






Tutaj mamy uzależnienie od bibliotek Springa, bibliotek GWT, bibliotek SmartGWT, ustawień dla kompilacji GWT oraz ustawień dla modułu typu WEB.

Teraz zajmiemy się wciągnięciem modułów do Eclipsa.

GlossyBlue Blogger by Black Quanta. Theme & Icons by N.Design Studio
Entries RSS Comments RSS