sobota, marca 28, 2009

StringMaker

public class StringMaker {
private ArrayList<string> strings = new ArrayList<string>();

public StringMaker append(Object p) {
strings.add(String.valueOf(p));
return this;
}

public String toString() {
int cnt=0, p=0, l=0;
for (String s : strings) {
cnt +=s.length();
}
char[] value = new char[cnt];
for (String s : strings) {
l = s.length();
s.getChars(0, l, value, p);
p+=l;
}
return new String(value);
}
}

public class Test1 {

private final static String S = "private ArrayList<String> strings = new ArrayList<String>()";

public long[] test1() {
Random r = new Random(System.currentTimeMillis());
StringMaker sm = new StringMaker();
long t1 = System.currentTimeMillis();
for (int i=0; i < 100000; i++) {
sm.append(S.substring(r.nextInt(40)));
}
String result = sm.toString();
long t2 = System.currentTimeMillis();
return new long[] { t2-t1, result.length() };
}

// test2 - to samo na StringBufferze
// test3 - to samo na StringBuilderze
// test4 - to samo na StringBufferze(4000000)
}

BEA JRockit(R) (build R27.6.0-50_o-100423-1.6.0_05-20080626-2104-linux-ia32, compiled mode):
n=100 test1: 50ms, 3950201 chars
n=100 test2: 77ms, 3949690 chars
n=100 test3: 77ms, 3950259 chars
n=100 test4: 41ms, 3950640 chars

Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing):
n=100 test1: 92ms, 3951062 chars
n=100 test2: 118ms, 3949873 chars
n=100 test3: 118ms, 3950118 chars
n=100 test4: 36ms, 3950035 chars

IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 Linux x86-32 jvmxi3260-20090215_29883 (JIT enabled, AOT enabled):
n=100 test1: 64ms, 3949910 chars
n=100 test2: 70ms, 3950291 chars
n=100 test3: 70ms, 3950410 chars
n=100 test4: 31ms, 3949690 chars

piątek, marca 27, 2009

Przerzutki do JRockita

JROCKIT_OPS="-XX:aggressive:memory -XXallocClearChunks=true -XXallocClearChunkSize=32m -XXallocPrefetch -XlargePages -XXtlaSize:min=256K,preferred=256K -XXlargeObjectLimit=256K -XXusePointerMatrix -XXpointerMatrixLinearSeekDistance:15 -XXcompactRatio:30"

JROCKIT_RT_OPS="-Xgcprio:deterministic -XpauseTarget=10ms"

wtorek, marca 24, 2009

Uściślijmy pojęcia

Service Oriented Architecture - architektura zorientowana na usługi. Wzorzec architektoniczny/projektowy, który zakłada, że mamy zestaw atomowych (realizujących minimalną niepodzielną funkcjonalność) serwisów, na podstawie których budujemy dalsze serwisy wyższego poziomu (Composite Applications). W pewnym momencie (kiedy mamy już wystarczającą ilość atomowych serwisów) możemy za pomocą paru kliknięć tworzyć nowe serwisy kompozytowe realizujące nową funkcjonalność biznesową. Dzięki dobrze zaprojektowanej i wdrożonej architekturze SOA firma może być agilna (Enterprise 2.0). SOA nie da się kupić (samo kupienie platformy integracyjnej nie jest kupieniem SOA), SOA trzeba zaprojektować. Można mieć platformę integracyjną i źle zaprojektowane środowisko i w rezultacie nie mieć SOA. Pomocą w implementacji SOA może być ESB.

ESB - Kolejny koncept/wzorzec architektoniczny/projektowy, który mówi, że do platformy integracyjnej za pomocą rozmaitych adapterów/klientów może podłączyć się dowolny system i platforma może podłączyć się do dowolnego systemu, natomiast usługi wewnątrz platformy (szyny) używają komunikacji natywnej (historycznie jest to JMS). Usługi wewnątrz platformy integracyjnej są niezależne od transportu. ESB ustandaryzował Sun wprowadzając JBI i wydzielając:
  • Service Engine (usługa typu adapterowego udostępniana przez oprogramowanie ESB)
  • Binding Component (usługa tłumacząca dane między różnymi transportami/formatami z którą komunikuje się Normalized Message Router).
ESB przydaje się w heterogenicznych środowiskach, w których naprawdę mamy wiele różnych systemów i technologii (Oracle, MSSQL, EJB, JMS, WS). ESB to nie SOA (ESB może być tylko sposobem na wdrożenie SOA).

niedziela, marca 22, 2009

OpenESB może działać ze sterownikami JDBC Oracle

Trzeba tylko nad tym trochę posiedzieć. Działa generacja WSDL-i dla operacji select, insert, update, delete, wywołania funkcji {? = call funkcja}.



A nie naprawili tego tylko dlatego, że w JCAPSie mają oemowy sterownik DataDirect.

sobota, marca 21, 2009

Cloud Computing wg Sun-a

Sun ma fajny pomysł na chmurę. W kontenerach solarisowych stworzonych z szablonu dostępny może być Apache, MySQL, GlassFish, Ruby. Instancji kontenerów może być kilka i mogą być połączone wewnętrzną siecią. Dostęp do serwisów w kontenerach realizowany jest poprzez NAT (jeden publiczny adres IP + firewall). Wersjonowanie projektów zapewnia Mercurial. Backup jest na ZFS-ie. Na razie Kenai hostuje tylko sunowe projekty.

środa, marca 18, 2009

IBM chce kupić Sun-a

Takie przejęcia bynajmniej są możliwe, vide: Oracle i BEA. Co IBM by zrobił z Solarisem i JCAPSem?

Statystyki SVN

svn log -v --xml ../projects/projekt > log_projektu.log;
java -jar ../statsvn.jar log_projektu.log ../projects/projekt



Narzędzie jest darmowe z SourceSorge'a, potrafi wizualizować parę fajnych rzeczy. Przydaje się zaganianemu kierownikowi projektu w sprawdzeniu, co robią jego deweloperzy.

CruiseControl

Narzędzie do ciągłej integracji: pobiera projekt z SVN-a, kompiluje, zapuszcza testy JUnit, buduje jar-y.



Jak naprościej zacząć? Ściągnąć binarną dystrybucję, w katalogu projects wycheckoutować swój projekt z SVN-a i stworzyć plik build.xml (przykładowa zawartość poniżej):

<project name="wppm3" default="all">
<path id="classpath">
<fileset dir="lib">
<include name="util/junit.jar"/>
<include name="jdom/jdom.jar"/>
<include name="jdom/xstream.jar"/>
<include name="jdom/commons-jxpath-1.3.jar"/>
<include name="weblogic/weblogic.jar"/>
<include name="weblogic/wl-extra.jar"/>
<include name="weblogic/wlclient.jar"/>
<include name="weblogic/wls-api.jar"/>
<include name="weblogic/wljmsclient.jar"/>
<include name="weblogic/javax.servlet_1.0.0.0_2-5.jar"/>
<include name="xerces/xerces.jar"/>
<include name="oracle/xmlparserv2.jar"/>
<include name="oracle/xdb.jar"/>
<include name="oracle/ojdbc14.jar"/>
<include name="oracle/orai18n.jar"/>
<include name="castor/castor-1.0.3.jar"/>
<include name="castor/castor-1.0.3-xml.jar"/>
<include name="Microsoft SQL Server 2005 JDBC Driver/sqljdbc_1.0/enu/sqljdbc.jar" />
</fileset>
</path>

<target name="all" depends="clean, compile, sleep, test, jar"/>

<target name="clean">
<delete dir="target" quiet="true" />
</target>

<target name="compile">
<exec executable="svn">
<arg line="up"/>
</exec>

<mkdir dir="target/classes"/>
<javac srcdir="src" destdir="target/classes">
<classpath refid="classpath"/>
</javac>
</target>

<target name="sleep">
<echo message="Sleeping for a while so you can see the build in the new dashboard" />
<sleep seconds="10" />
</target>

<target name="test" depends="compile">
<mkdir dir="target/test-results"/>
<junit haltonfailure="no" printsummary="on">
<classpath>
<pathelement location="target/classes"/>
<pathelement location="target/test-classes"/>
<pathelement location="lib/junit.jar"/>
<pathelement location="lib/util/junit.jar"/>
<pathelement location="lib/jdom/jdom.jar"/>
<pathelement location="lib/jdom/xstream.jar"/>
<pathelement location="lib/jdom/commons-jxpath-1.3.jar"/>
<pathelement location="lib/weblogic/weblogic.jar"/>
<pathelement location="lib/weblogic/wl-extra.jar"/>
<pathelement location="lib/weblogic/wlclient.jar"/>
<pathelement location="lib/weblogic/wls-api.jar"/>
<pathelement location="lib/weblogic/wljmsclient.jar"/>
<pathelement location="lib/weblogic/javax.servlet_1.0.0.0_2-5.jar"/>
<pathelement location="lib/oracle/xmlparserv2.jar"/>
<pathelement location="lib/oracle/xdb.jar"/>
<pathelement location="lib/oracle/ojdbc14.jar"/>
<pathelement location="lib/oracle/orai18n.jar"/>
<pathelement location="lib/castor/castor-1.0.3.jar"/>
<pathelement location="lib/castor/castor-1.0.3-xml.jar"/>
<pathelement location="lib/Microsoft SQL Server 2005 JDBC Driver/sqljdbc_1.0/enu/sqljdbc.jar" />
</classpath>
<formatter type="brief" usefile="false"/>
<formatter type="xml" />
<batchtest todir="target/test-results" >
<fileset dir="target/classes" includes="com/nordea/junit/**/*Test*.class"/>
</batchtest>
</junit>
</target>

<target name="jar" depends="compile">
<jar jarfile="target/wppm3.jar" basedir="target/classes"/>
</target>
</project>

Jeszcze trzeba w konfiguracji narzędzia obok projektu demonstracyjnego dodać ten nasz (a tamten skasować).

wtorek, marca 17, 2009

Jak sprawdzić czy nasz kod działa wewnątrz WebLogic-a

weblogic.kernel.Kernel.isServer() &&
weblogic.kernel.Kernel.isInitialized()

poniedziałek, marca 16, 2009

EUPL

Organizacja Open Source Initiative uznała Licencję publiczną Unii Europejskiej v1.1 za licencję open source. Licencja jest dostępna i ważna w języku polskim. Założenia są podobne do GPLv2, mowa jest o udostępnieniu repozytorium kodu źródłowego w czasie dystrybucji programu (Utworu), zakazie zmiany treści licencji podczas redystrybucji oprogramowania, wygaśnięciu licencji przy naruszeniu jej warunków. Ciekawostką jest możliwość łączenia kodu objętego licencją EUPL z kodem licencjonowanym na warunkach tzw. Licencji Zgodnej (m.in. GPLv2, Eclipse Public Licence 1.o), kiedy to postanowienia Licencji Zgodnej są nadrzędne wobec EUPL dla całości źródeł. EUPL zakłada udostępnienie wszystkich praw dot. własności intelektualnej dla celów korzystania z oprogramowania, jednocześnie zakłada, że kod ma postać 'utworu niedokończonego' i może zawierać błędy, w tym niecelowe naruszenie czyjejś własności intelektualnej. Licencja EUPL może być ograniczania przez prawa państw Unii Europejskiej bez naruszenia licencji jako całości.

czwartek, marca 12, 2009

MS Office 2007 pod Linuksem







Wine 1.1.9 - kawał dobrej roboty.
Z Outlookiem, PowerPointem, Accessem i Visio jest jeszcze problem.

czwartek, lutego 19, 2009

Proste balansowanie WebMethods

<VirtualHost _default_:5555>
ServerName wmproxy:5555
ErrorLog /var/log/apache2/error_log_wm
TransferLog /var/log/apache2/access_log_wm

##################
ProxyPass /invoke balancer://WmInvokeCluster5555 stickysession=ssnid
<Proxy balancer://WmInvokeCluster5555>
BalancerMember http://192.168.1.208:5555/invoke route=instance0 loadfactor=50
BalancerMember http://192.168.1.219:5555/invoke route=instance1 loadfactor=50
</Proxy>

<Location /invoke >
Order Deny,Allow
Deny from all
Allow from all
</Location>
##################

##################
ProxyPass /ws balancer://WmWsCluster5555 stickysession=ssnid
<Proxy balancer://WmWsCluster5555>
BalancerMember http://192.168.1.208:5555/ws route=instance0 loadfactor=50
BalancerMember http://192.168.1.219:5555/ws route=instance1 loadfactor=50
</Proxy>

<Location /ws >
Order Deny,Allow
Deny from all
Allow from all
</Location>
##################

<Location /balancer-manager5555>
Order Deny,Allow
Deny from all
Allow from 192.168.2.0/255.255.255.0
SetHandler balancer-manager
</Location>

</VirtualHost>



Cały koncept w oparciu o zmodyfikowany Apache 2.2.10 mod_proxy.

środa, lutego 18, 2009

Jakimi fajnymi furami jeżdżą studenci EiTI




Alfa MiTo. Doktorów na takie coś nie stać, a profesorowie wolą bardziej klasyczne Toyoty Avensis.

niedziela, lutego 15, 2009

Windows 7 preferuje dyski SSD

Na obrazku ocena laptopa Acer Aspire 4530 - tylko 3,0 za HDD.

środa, lutego 11, 2009

Linux podpięty do AD

$ cat /etc/openldap/ldap.conf
TLS_REQCERT allow
host 192.168.1.1
base dc=example,dc=com

$ cat /etc/ldap.conf
host 192.168.1.1
uri ldap://ntpdc.example.com
port 389
ssl no
base dc=example,dc=com
scope sub

binddn LDAP@example.com
bindpw haslohaslo

nss_base_passwd dc=example,dc=com?sub
nss_base_shadow dc=example,dc=com?sub
nss_base_group dc=example,dc=com?sub&(objectCategory=group)
nss_map_objectclass posixAccount user
nss_map_objectclass shadowAccount user
nss_map_objectclass posixGroup user
nss_map_attribute gecos name
nss_map_attribute homeDirectory unixHomeDirectory
nss_map_attribute uniqueMember member

pam_password ad
nss_map_attribute userPassword authPassword

$ cat /etc/krb5.conf
[libdefaults]
default_realm = EXAMPLE.COM
clockskew = 300

[realms]
EXAMPLE.COM = {
kdc = ntpdc.example.com
admin_server = ntpdc.example.com
default_domain = example.com
}

[logging]
kdc = FILE:/var/log/krb5/krb5kdc.log
admin_server = FILE:/var/log/krb5/kadmind.log
default = FILE:/var/log/krb5/krb5libs.log

[domain_realm]
.example.com = EXAMPLE.COM

[appdefaults]
pam = {
debug = false
ticket_lifetime = 1d
renew_lifetime = 1d
forwardable = true
proxiable = false
minimum_uid = 1
clockskew = 300
external = sshd
use_shmem = sshd
}

$ cat /etc/samba/smb.conf
[global]
workgroup = EXAMPLE
realm = EXAMPLE.COM
preferred master = no
security = ads
encrypt passwords = true
log file = /var/log/samba/%m.log
log level = 3
dos charset = CP1250
unix charset = UTF8
display charset = UTF8
idmap gid = 10000-20000
idmap uid = 10000-20000
template homedir = /home/%D/%U
template shell = /bin/bash
winbind enum users = Yes
winbind enum groups = Yes
winbind use default domain = Yes
winbind nested groups = Yes
winbind refresh tickets = yes
winbind separator = +
passdb backend = tdbsam
idmap backend = ad
winbind nss info = rfc2307

oplocks = yes
max xmit = 65535
dead time = 15
getwd cache = yes
large readwrite = no
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
load printers = no

$ cat /etc/nsswitch.conf
passwd: files winbind ldap
shadow: files windind ldap
group: files winbind ldap

$ nano /etc/pam.d/ [tab]
{auth,account,password} sufficient pam_winbind.so use_first_pass

$ net groupmap add rid=1000 ntgroup="Development" unixgroup=dev type=d
# lepiej zamiast tego nadac grupie nt atrybut gidNumber taki sam jak gid uniksowy

$ nano /etc/samba/smb.conf
[project]
comment = 'Remote project'
path = /home/dev/project
browseable = yes
read only = no
map inherit acl = no
inherit acls = no
inherit permissions = no
create mask = 664
directory mask = 775
valid users = @"EXAMPLE+Development"
admin users = @"EXAMPLE+Domain Admins"
force user = dev
force group = dev

$ cat /etc/apache2/vhosts.d/svn.conf

DAV svn
SVNPath /var/lib/svn/svnrepo
AuthBasicProvider ldap
AuthType Basic
AuthName "Subversion svnrepo repository"

AuthzSVNAccessFile /var/lib/svn/svn-acl

AuthLDAPURL ldap://192.168.1.1:389/OU=IT,dc=example,dc=com?samAccountName?sub?(objectCategory=person)
AuthLDAPBindDN "example\LDAP"
AuthLDAPBindPassword "haslohaslo"

Require valid-user

poniedziałek, lutego 09, 2009

Użytkownicy i grupy, SVG w mediawiki



Będąc leniwym można użyć Eclipse'a JEE z driverem z jdbc.postgresql.org.
Wygląda na to, że wybranie na tabelce opcji edit nie działa jeśli istnieje
autonumerowana kolumna.

Jeśli nie działa generacja PNG z SVG (w którym robimy use-case'y) to należy zajrzeć do /srv/www/htdocs/mediawiki/bin/ulimit*/sh i zrobić coś z -v $2.
Dodatkowo dla rzeczy wyeksportowanych z Visio są problemy z mime-type,
workaround to '$wgMimeDetectorCommand = 'file --brief --mime'.

czwartek, lutego 05, 2009

WebObjects - easy WebMethods development in Java

WebObjects framework provides easy way for WebMethods development using Java.
For every flow, java or adapter service existing in a IS package the framework generates Java beans covering pipeline's input and output, and packs generated classes into one jar file. So for every document used as a pipeline's input or output you get a Java class. You don't have to do complex multi-step flow mappings, you can do your job easily in Java. You operate on real Java objects, not on pipeline's keys and values. From Java you can call other services using Java objects.
All development can be done in Eclipse after importing jar file generated by WebObjects from IS package.



On the picture above you can see a Java service called abcd. It uses JDBC adapter service called invokeFb. WebObjects framework generated invokeFb_In and invokeFb_Out classes for that service. Service invokeFb exists in test.sql namespace, its input and output classes (invokeFb_In, invokeFb_Out) were generated in pkg.test.sql Java package. DataProxy.invokeService() method called with invokeFb_In object, knows exactly which service to invoke and what object should be returned.
You can generate jars for WmPublic and WmRoot and call native WM services from Java.

Under heavy load with huge documents processed by flow services it is possible to hang Integration Server - pipeline's objects have circular references and they are hard to process by Garbage Collector. One work around is to mark services as stateless, change session lifetime from 10 to 2 minutes, tune GC (concurrent mark sweep), the other is to change JVM to JRockit (but then your installation is not supported by Software AG).
With WebObjects you just call DataProxy.clear(pipeline) between getting Java input object from pipeline and putting output.
How to get and put objects? If invokeFb were a Java Service written with WebObjects you would do:

invokeFb_In in = DataProxy.unbox(pipeline, invokeFb_In.class);
invokeFb_Out out = new invokeFb_Out();
// do something with out
DataProxy.box(out);

niedziela, lutego 01, 2009

Windows Server 2008 R2 - szary i niebieski wracają





Widać wpływy Mac OS-a X w pasku zadań. Wersja systemu 6.1 powoduje, że Oracle 11g nie chce się instalować (ale wystarczy uruchomić Program compatibility na pliku Oracle Universal Installer i idzie).

wtorek, stycznia 13, 2009

Windows 7 - nic specjalnego

Zainstalowałem dzisiaj Windows 7 beta (w VMWarze). W zasadzie to taka Vista SP2, dla bajeru zmienili trochę wygląd, coś tam jest bardziej user friendly, coś tam może szybciej chodzi i tyle. Wcale nie czułem, że system chodzi tak szybko jak Windows XP.
Mam na laptopie KDE 4.1.87 i dużo bardziej mi się podoba niż Windows 7.

piątek, grudnia 19, 2008

Benchmarki VM c.d

Tym razem hostem jest laptop z procesorem AMD Athlon X2 QL-60, 2GB pamięci RAM, grafiką GeForce 9100M G a testowym systemem jest 64-bitowy Windows Server 2008 EE. Dla działającego realnie Windowsa zostały zmierzone wyniki PCMark05 w trybie oszczędzania energii (obniżenie do połowy taktowania CPU, spowolnienie grafiki itd.) i w trybie wydajności -obydwa testy wykonywane na jednym rdzeniu CPU (żeby można było porównywać wyniki maszyn wirtualnych, które raczej mają jeden VCPU) i tryb wydajności na obu rdzeniach.
V100 to VMWare Server 2.0 + 1 VCPU + W2K8 768MB RAM, V200 to ta sama konfiguracja ale na dwóch wirtualnych procesorach. VB to VirtualBox 2.1.
VM2 i VB2 to VMWare i VirtualBox z W2K8 na 1 CPU i zmniejszoną pamięcią do 512MB. Oprogramowanie do wirtualizacji było w 64-bitowych wersjach, zainstalowane na OpenSUSE 11.1 64-bit, jedna partycja / na XFS-ie.









Jakie z tego wnioski?
  • Cache'owanie systemu plików w Linuksie i Windowsie 2008 (wow) jest ładnie zrobione i jak jedno zgra się z drugim to mamy system wirtualny szybszy od rzeczywistego
  • VirtualBox gdyby miał dobre narzędzia do zarządzania mógłby być produktem serwerowym
  • Nie ma sensu wybierać Xen-a, bo wirtualizacja z patchowaniem strumienia instrukcji jest szybsza
  • Zamiast VMotion można zrobić wirtualizację usług, jeśli mamy do czynienia z WebService'ami to wystarczy Apache 2.2.10 i mod_proxy_balancer
  • Powinienem na Oracle'u 11 wystawić jako WebService'y jakieś operacje w schemacie hr i wtedy można by mieć jakieś sensowne życiowe testy



Jeśli wyeliminujemy wyniki grafiki 2D to można przyjąć, że mamy 20% spadku wydajności. Ale... 20% per CPU. Jeśli na kilkurdzeniowym serwerze mamy uruchomioną maszynę z jednym wirtualnym procesorem to... patrz przypadek 'AVG Performance 2CPU'. Powiedzmy, że ten spadek wydajności rekompensujemy sobie stawiając równolegle pare maszyn, usługa w nich uruchomiona moze być balansowana - czy teraz też będziemy mieć 20% per CPU? Pewnie więcej...