Thursday, December 31, 2015

Gradle

Gradle wrapper

 Zajímavý koncept, který umožní automtické nastavení Gradle bez nutnosti instalace. Stačí nahrát projekt, jehož součástí je gradlew.sh nebo gradlew.bat. Ten již zajistí nahrání binárních souborů a spuštění Gradle.

V sobuoru build.gradle je potřeba přidat:

task wrapper(type: Wrapper) {
    gradleVersion = '2.3'
}

a následně spustit

gradle wrapper

Ten vytvoří výše zmíněný spustitelný soubor gradlew.

Saturday, October 31, 2015

Grafické zobrazení maven závislostí

Viz http://mvnplugins.fusesource.org/maven/1.4/maven-graph-plugin/index.html

1) do pom.xml přidat

<project>
  <profiles>
  
    <profile>
      <id>graph</id>
      <pluginRepositories>
        <pluginRepository>
          <id>mvnplugins.fusesource.org</id>
          <url>http://mvnplugins.fusesource.org/repo/release</url>
          <releases>
            <enabled>true</enabled>
          </releases>
        </pluginRepository>
      </pluginRepositories>
      <build>
        <plugins>
          <plugin>
            <groupId>org.fusesource.mvnplugins</groupId>
            <artifactId>maven-graph-plugin</artifactId>
            <version>1.4</version>
          </plugin>
        </plugins>
      </build>
    </profile>
    
  </profiles>
</project> 
 
2) Nainstalovat graphviz
 
(Ubuntu 14.04) sudo apt-get install graphviz 
 
3) spustit 
 
$ mvn -P graph graph:project
 -- OR --
$ mvn -P graph graph:reactor
 
$ mvn -P graph graph:reactor -Dhide-scope=test -Dhide-optional=true 

Automatizované testy

Fitnesse

http://fitnesse.s3.amazonaws.com/tdd_net_with_fitnesse.pdf

Video Intro:
http://vimeo.com/3323573

Programování slim fixture:
http://butunclebob.com/FitNesse.UserGuide.FixtureCode

AutoIt

https://www.autoitscript.com/wiki/Best_coding_practices

Seznam užitečných knihoven

Zde jsem nalezl řešení pro naši úlohu vzdáleného volání mezi Fitnesse a AutoIt.

https://www.autoitscript.com/wiki/User_Defined_Functions

Napojení na Oracle


http://www.autoitscript.com/forum/topic/37381-connect-oracle/

JSON v AutoIt

Knihovna
http://www.autoitscript.com/forum/topic/148114-jsmn-a-non-strict-json-udf/


Zkoušel jsem také, ale moc to nefungovalo -
http://www.autoitscript.com/forum/topic/104150-json-udf-library-fully-rfc4627-compliant/
Upozornění:
- bez úpravy mi knihovna nefungovala, musel jsem:
1) V notepad++ jsem změnil kódování na UTF-8 bez BOM


HTTP v AutoIt

Client
http://brugbart.com/http-post-request-autoit
http://brugbart.com/http-get-request-autoit

Server
http://www.autoitscript.com/forum/topic/68851-powerful-http-server-in-pure-autoit/ - tento jsem použil jako základ pro implementaci RESTful service na testované straně
https://code.google.com/p/autoit-winhttp/downloads/list
http://www.autoitscript.com/forum/topic/26213-my-web-server-v01a/

WebSphere Applcation Server - how to get J2C authentication alias in Java code



Sometimes I need securely connect to external system from WebSphere Application server application. The secure connection usualy requires password as a credential. The WebSphere Application Server allows store the username and password inside its configuration as so called J2C Authentication Alias. If I need use the cofigured J2C Auth Alias I can use the following Java code fragment:

 public static final String USERNAME = "username";
 public static final String PASSWORD = "password";

 /** Return username and pasword for specific J2C authentication alias
  *
  * @param authenticationAlias
  * @return Map with "username" and "password" keys
  * @throws NotImplementedException
  * @throws LoginException
  */
      public Map<String,String> getCredentials(String authenticationAlias) throws NotImplementedException, LoginException {
     Map<String,String> map = new HashMap<String,String>();
     map.put(Constants.MAPPING_ALIAS, authenticationAlias);
     CallbackHandler callbackHandler = WSMappingCallbackHandlerFactory.getInstance().getCallbackHandler(map, null);
     LoginContext loginContext = new LoginContext("DefaultPrincipalMapping", callbackHandler);
     loginContext.login();
     Subject subject = loginContext.getSubject();
     Set credentials = subject.getPrivateCredentials();
     PasswordCredential passwordCredential = (PasswordCredential) credentials.iterator().next();
     String user = passwordCredential.getUserName();
     String password = new String(passwordCredential.getPassword());
     Map<String,String> result = new HashMap<String,String>();
     result.put(USERNAME, user);
     result.put(PASSWORD, password);
     return result;
      }

Thursday, May 7, 2015

Robot simulace

GAZEBO - 3D simulace
http://gazebosim.org/

Stage - 2D simulace

http://playerstage.sourceforge.net/index.php?src=stage

Player - klient pro GAZEBO nebo STAGE

http://playerstage.sourceforge.net/index.php?src=player

Coppelia Robotics v-rep

http://www.coppeliarobotics.com/downloads.html

Robocode

http://robocode.sourceforge.net/



Instalace:
Vyzkouseno na Ubuntu 14.04 TLS ve virtualni image VMWare Player.

Instalace Gazebo 5.0.1 - bez problemu podle navodu z distribuce

Instalace Stage 4.1.1 - bez problemu, build projektu

Instalace Player 3.0.2 -
make hlasi chybu /usr/bin/ld: cannot find -lgeos


reseni: opraveno pridanim linku v /usr/lib:
cd /usr/lib
sudo ln -s libgeos_c.so.1.8.2 libgeos.so.1
sudo ln -s libgeos_c.so.1.8.2 libgeos.so


dale make hlasi:
playerclient.cc:171:34: error: expected unqualified-id before numeric constant

reseni: sleduj odkaz http://sourceforge.net/p/playerstage/mailman/message/32992365/
To work around this problem until the next Player release comes out, you
can just substitute "boost::TIME_UTC_" for "boost::TIME_UTC" in
client_libs/libplayerc++/playerclient.cc
 
 

dale make hlasi:
readlog.cc:714:62: error: cannot convert ‘FILE* {aka _IO_FILE*}’ to ‘gzFile’ for argument ‘1’ to ‘char* gzgets(gzFile, char*, int)’
reseni: sleduj odkaz http://sourceforge.net/p/playerstage/mailman/message/28994223/
v server/drivers/shell/readlog.cc
change the line
>
> ret = gzseek(this->file,0,SEEK_SET);
>
> to
>
> ret = gzseek((gzFile)this->file,0,SEEK_SET);
 
a take 
 
ret = (gzgets(this->file, this->line, this->line_size) == NULL); 

to

 
ret = (gzgets((gzFile)this->file, this->line, this->line_size) == NULL); 

dale make hlasi:
/usr/bin/ld: CMakeFiles/camera.dir/camera.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'

reseni: sleduj http://player-stage-gazebo.10965.n7.nabble.com/TIME-UTC-is-not-a-member-of-boost-td11642.html
For each error : undefined reference to symbol '_ZN5boost6system15system_categoryEv'
add the flag -lboost_system after -lboost_signals in the file player-3.0.2/build/examples/libplayerc++/
CMakeFiles/*.dir/link.txt
For example : player-3.0.2/build/examples/libplayerc++/CMakeFiles/camera.dir/list.txt will be :
/usr/bin/c++ -Wall CMakeFiles/camera.dir/camera.o -o camera -rdynamic -L/usr/local/lib ../../client_libs/libplayerc++/libplayerc++.so.3.0.2 ../../client_libs/libplayerc/libplayerc.so.3.0.2 ../../libplayerinterface/libplayerinterface.so.3.0.2 ../../libplayercommon/libplayercommon.so.3.0.2 -lm -lz -lgeos -lgeos_c -lboost_thread -lboost_signals -lboost_system -lm ../../libplayerjpeg/libplayerjpeg.so.3.0.2 -ljpeg ../../libplayerwkb/libplayerwkb.so.3.0.2 ../../libplayercommon/libplayercommon.so.3.0.2 -lgeos -lgeos_c -Wl,-rpath,/usr/local/lib:/home/doizuc/Downloads/player-3.0.2/build/client_libs/libplayerc++:/home/doizuc/Downloads/player-3.0.2/build/client_libs/libplayerc:/home/doizuc/Downloads/player-3.0.2/build/libplayerinterface:/home/doizuc/Downloads/player-3.0.2/build/libplayercommon:/home/doizuc/Downloads/player-3.0.2/build/libplayerjpeg:/home/doizuc/Downloads/player-3.0.2/build/libplayerwkb 


Opravu provest v
examples/libplayerc++/CMakeFiles/camera.dir/link.txt
examples/libplayerc++/CMakeFiles/clientgraphics.dir/link.txt
examples/libplayerc++/CMakeFiles/clientgraphics3d.dir/link.txt
examples/libplayerc++/CMakeFiles/example0.dir/link.txt 
examples/libplayerc++/CMakeFiles/example1.dir/link.txt
examples/libplayerc++/CMakeFiles/example2.dir/link.txt
examples/libplayerc++/CMakeFiles/example3.dir/link.txt  
examples/libplayerc++/CMakeFiles/example4.dir/link.txt  examples/libplayerc++/CMakeFiles/goto.dir/link.txt
examples/libplayerc++/CMakeFiles/grip.dir/link.txt 
examples/libplayerc++/CMakeFiles/laserobstacleavoid.dir/link.txt 
examples/libplayerc++/CMakeFiles/ptz.dir/link.txt
examples/libplayerc++/CMakeFiles/randomwalk.dir/link.txt
examples/libplayerc++/CMakeFiles/sonarobstacleavoid.dir/link.txt
examples/libplayerc++/CMakeFiles/speech.dir/link.txt
examples/libplayerc++/CMakeFiles/speech_cpp_client.dir/link.txt
examples/libplayerc++/CMakeFiles/wallfollow.dir/link.txt
utils/playerjoy/CMakeFiles/playerjoy.dir/link.txt
utils/playerprint/CMakeFiles/playerprint.dir/link.txt
utils/playerprop/CMakeFiles/playerprop.dir/link.txt

priklad hromadneho prikazu na replace textu v souborech

cd ~/player-3.0.2/build

sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/camera.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/clientgraphics.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/clientgraphics3d.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/example0.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/example1.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/example2.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/example3.dir/link.txt 
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/example4.dir/link.txt 
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/goto.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/grip.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/laserobstacleavoid.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/ptz.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/randomwalk.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/sonarobstacleavoid.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/speech.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/speech_cpp_client.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' examples/libplayerc++/CMakeFiles/wallfollow.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' utils/playerjoy/CMakeFiles/playerjoy.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' utils/playerprint/CMakeFiles/playerprint.dir/link.txt
sed -i -- 's/-lboost_signals/-lboost_signals -lboost_system/g' utils/playerprop/CMakeFiles/playerprop.dir/link.txt



dale

make install bylo potreba volat s admin pravy: sudo make install



Otestovani funkcnosti Player/Stage
 
player ~/stg/share/stage/worlds/simple.cfg
 
Objevila se chyba:
error   : Sorry, no support for shared libraries, so can't load plugins.
error   : You should install libltdl, which is part of GNU libtool, then re-compile player.
 
reseni: nastavit export LD_LIBRARY_PATH=/usr/local/lib64:/home/tomas/stg/lib64 

Dale se objevila chyba:

error   : Failed to load plugin stageplugin.
error   : libtool reports error: file not found
error   : plugin search path: /home/tomas/player-3.0.2/build:/home/tomas/stg/share/stage/worlds:/usr/local/lib/
error   : failed to load plugin: stageplugin

reseni: doplneni cesty k plugin adresari do LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/tomas/stg/lib64
Objevilo se okno Stage se zakladnim prostredim a jednim robotem.


Uff. Tim je prostredi a robot pripraveny na klientske pripojeni a rizeni. Dalo to trochu prace, ale nakonec se zdarilo. Simon bude mit radost...



 


Rizeni robota v playerv

Spustit prikaz
playerv -h marvin --position2d --laser
 
Bohuzel s parametrem --laser playerv okamzite ukonci cinnost, pri pouziti  
playerv -h marvin --position2d klient funguje. Zarizeni position2d i obe zarizeni ranger funguji.
 
 




Rizeni robota pouzitim playerc a jazyka Python

Priklad v Python zde:
http://playerstage.sourceforge.net/doc/Player-svn/player/group__libplayerc__py__example.html

Neco o nastaveni:
https://packages.debian.org/unstable/python-playerc

Instalace python-playerc:
sudo dpkg -i ~/python-support_1.0.14ubuntu2_all.deb
sudo dpkg -i ~/python-playerc_3.0.2+dfsg-3ubuntu2_amd64.deb

sudo chmod 755 /usr/local/lib/python2.7/site-packages/_playerc.so

export LD_LIBRARY_PATH=/usr/local/lib64:/home/tomas/stg/lib64:/usr/lib/pyshared/python2.7
export PYTHONPATH=/usr/local/lib/python2.7/site-packages:/usr/lib/pyshared/python2.7:/usr/share/pyshared


Python editor:

Eric6 - http://eric-ide.python-projects.org/eric-download.html

Velmi jednoduchy priklad pro pohyb:

# Jizda dopredu

import time
import math
from playerc import *

# Pripojeni k robot simulatoru
c = playerc_client(None, 'localhost', 6665)
c.connect()

# Prihlaseni se k zarizeni pohybu robota
p = playerc_position2d(c,0)
if p.subscribe(PLAYERC_OPEN_MODE) != 0:
  raise playerc_error_str()

# Rozjeti robota rychlosti 1
p.set_cmd_vel(1.0,0.0,0.0,1)

# Cekani 10 x 1 sekunda
for i in range(0,10):
 time.sleep(1)
 print i

# Zastaveni pohybu robota
p.set_cmd_vel(0.0, 0.0, 0.0, 1)

# Odhlaeni se od zarizeni pohybu
p.unsubscribe()

# Odpojeni od simulatoru
c.disconnect()



Instalace python player pro 32bit potřebuje tyto knihovny:
sudo dpkg -i libstdc++6_5.1.1-6_i386.deb
sudo dpkg -i libstdc++6_5.1.1-6_i386.deb
sudo dpkg -i gcc-5-base_5.1.1-6_i386.deb
sudo dpkg -i libstdc++6_5.1.1-6_i386.deb
sudo dpkg -i libgeos-3.4.2_3.4.2-7_i386.deb
sudo dpkg -i libgeos-c1_3.4.2-7_i386.deb
sudo dpkg -i libjpeg62-turbo_1.4.0-7_i386.deb
sudo dpkg -i libplayercommon3.0_3.0.2+dfsg-4.2+b1_i386.deb
sudo dpkg -i libplayerinterface3.0_3.0.2+dfsg-4.2+b1_i386.deb
sudo dpkg -i libplayerjpeg3.0_3.0.2+dfsg-4.2+b1_i386.deb
sudo dpkg -i libplayerwkb3.0_3.0.2+dfsg-4.2+b1_i386.deb
sudo dpkg -i libplayerc3.0_3.0.2+dfsg-4.2+b1_i386.deb





Thursday, December 18, 2014

Fitnesse a testy v DB Oracle

Fitnesse

Framework pro systémové a akceptační testy. Fitnesse vhodným způsobem spojuje možnosti business popisu testů s jejich implementací a provedením. Web Wiki s mechanismy, které umožní na wiki stránky Fitnesse umístit deklarativní předpisy pro povedení testů. Tyto předpisy pak Fitnesse testovací engine (jsou v současné době dva: starší F.I.T. a mladší S.L.I.M.) provádí a výsledky testů jsou přímo zobrazené na wiki stránkách s těmito předpisy (více viz http://www.fitnesse.org).


Jakým způsobem připravit testy, které budou testovat prostřednictvím SQL příkazů v databázi DBMS Oracle?

Zaměřil jsem se na použití novější koncepce provádění testů - S.L.I.M. (Simple List Invocation Method)

SLIM je modernější způsob pro vytvoření předpisů a následné provádění testů v systému FitNesse (http://www.fitnesse.org/FitNesse.UserGuide.WritingAcceptanceTests.SliM)

Postup pro nastavení 

Nastavení a definice na úrovni testovací suite

Do stránky suite je potřeba napsat definici, že budeme používat SLIM, a vhodné je zde uvést cesty ke knihovnám, které budeme přidávat:

!define TEST_SYSTEM {slim}


Příprava knihoven do lib podadresáře

Pro napojení do Oracle databáze budeme potřebovat následující jar soubory:
ojdbc5.jar
dbslim-0.0.1.jar
mchange-commons-java-0.2.8.jar
c3p0-0.9.5-pre10.jar
c3p0-oracle-thin-extras-0.9.5-pre10.jar
log4j-over-slf4j-1.7.7.jar
slf4j-api-1.7.7.jar

Soubory umístěte do podadresáře lib .

Do SetUp stránky testu místěte odkazy na knihovny:

!path lib\*.jar


Nastavení a definice

Stránka SetUp:

!contents


!path lib/*.jar





|Import            |
|fitnesse.slim.test|
|fitnesse.fixtures |
|slim              |


!define COLLAPSE_SETUP {true}
!define COLLAPSE_TEARDOWN {true}

!|SetUp|


Stránka testu:


!include SetUp

<test page>


!|Script|Db Slim Setup|!-oracle.jdbc.driver.OracleDriver-!|jdbc:oracle:thin:@dbhost:1521:database1|user|password|

!define currentModule {mymodule}
!define currentVersion {4.0.2}
!define releasedAt {2014-09-18 12:41:26}

!define dbQuerySelectDbVersion (
select * from T_DB_VERSION
)

!|Script  |Db Slim Select Query        |${dbQuerySelectDbVersion}                    |
|check    |data;                       |C_MODULE     |0            |${currentModule} |
|check    |data;                       |C_VERSION    |0            |${currentVersion}|
|check    |data;                       |C_RELEASED_AT|0            |${releasedAt}    |
|check    |data By Column Index        |2            |and Row Index|0 |${releasedAt} |
|$version=|dataByColumnNameAndRowIndex;|1            |0                              |
|check    |data;                       |C_VERSION    |0            |4.0.2            |


Problémy k řešení

  1. Nastavení cesty v suite nestačí, musím nastavit !path v SetUp stránce testu.
  2. Pokud není správně nastavená cesta k dbslim-0.0.1.jar dostanu chybu:  Db Slim Setup Could not invoke constructor for DbSlimSetup[4] , ale nikde jsem nenalezl vyjímku s stacktrace, která by blíže určovala příčinu. Očekával bych někde ClassNotFound nebo něco podobného. Zkoušel jsem i verbose logování (parametr -v pro rozšířené logování). Hledal jsem v otevřené konzoli fitnesse, v adresáři FitNesseRoot/ErrorLogs a dále nevím, kam se ještě podívat. Když se podaří nastavit sprváně cesta k dbslim-0.0.1.jar , tak u se na stránce testu objeví alespoň Db Slim Setupjava.lang.NoClassDefFoundError: com.mchange.v2.c3p0.ComboPooledDataSource.