wtorek, grudnia 08, 2009

No (distributed) transactions in BizTalk

Database insert to different data sources. Atomic doesn't work in Visual Studio, so change transaction type to Long Running.

Now it doesn't work in real life.

BizTalk and WCF-SQL Send Ports

Add -> New generated item -> Consume WCF Service, orchestration looks reasonably.


We deploy it and run and... it doesn't work. Orchestration is dehydrated and in Event Viewer we see 'action not understood'.

Fix is to change Action in WCF Send Port configuration from XML fragment to text

- or -

change port operation name to Action name.

sobota, grudnia 05, 2009

OpenESB revisited

We're going to create simple transactional process inserting data into tables of two XA data sources. Let's create design time JDBC connections.


The type of Database Service Engine operation is table. Here we can see generated artifacts.


Now, we have to remember that this configuration has been generated using design time JDBC connection. To use it with runtime we need to change JNDI location of database.


Presented BPEL process on the left side has got PartnerLink connected with generated by us abstract WSDL (its name should match process name). On the right side there are Partner Links from mssql1 and mssql2 bindings. The process is transactional.




To see input and output port of BPEL JBI module we have to rebuild Composite App.


We can add different bindings to our BPEL orchestration (SOAP, JMS, WCF, Quart Scheduler ...).




After JDBC data source setup and app deployment, we can check that our composite app works fine.


Having modified db schema for table tab1 in second data source we can se that new data is not inserted to tab1 in first data source - our BPEL process is transactional.

sobota, listopada 28, 2009

BizTalk 2009 BAM Portal

Nie udaje się go skonfigurować na 64-bitowym W2K8 R2: The error indicates that IIS is in 64 bit mode, while this application is a 32 bit application and thus not compatible.

Trzeba włączyć 32-bitowe aplikacje na 64-bitowym IIS-ie.

poniedziałek, listopada 23, 2009

Clound AntiVirus

W mediach internetowych trwa kłótnia między Pandą i G Datą.

Punkty z heurystyki: plik jest ukryty lub systemowy; plik jest w koszu; plik jest skompresowany UPX-em albo czymś podobnym; plik podejrzanie używa GetProcAddress32 i VirtualAlloc; plik ma funkcjonalność wysyłania poczty; plik dodaje się do autostartu itd.
Jeżeli suma punktów przekroczy entry-level to dane o pliku są zapisywane w chmurze: nazwa, scieżka, md5sum, punkty z heurystyki, [blob]. Jezeli rekordów w bazie jest wystarczająco dużo w jednostce czasu to przekraczamy low-level i możemy automatycznie okreslić plik jako podejrzany (1). Następnie plik idzie do standardowej analizy i ewentualnie trafia do definicji wirusów albo ulepszane są definicje heurystyczne (2). Żeby botnet nie triggerował niszczenia plików systemowych przez Cloud Antivirus-a w przypadku (1) producent antywirusa dysponuje bazą white-list (3). Tak mniej więcej działa G Data. Chmura zapewnia bezpieczeństwo w okresie czasu od (1) do (2) uwzględniając (3).

Antywirus w wydaniu Pandy jednak ma definicje (w folderze C:\ProgramData\Panda Security\Panda Cloud Antivirus\NPS), a wirusy "chmurowo" identyfikuje za pomocą sum kontrolnych (CRC32, SHA, SHA512, MD5) wysyłanych na serwer protokołem HTTP (dane wysyłane są w paczkach dla wielu plików w przypadku skanowania wielu obiektów). W odpowiedzi dostaje informacje o stanie pliku (czysty, zawirusowany, podejrzany - wymaga wysłania do analizy). Dodatkowo wykrycie wirusa z baz powoduje przesłanie informacji statystycznej do serwera Pandy.

Dostęp do chmury można zepsuć modyfikując plik %WINDIR%\system32\drivers\etc\hosts:

127.0.0.1 cache2.pandasecurity.com
127.0.0.1 iext.pandasecurity.com
127.0.0.1 cache1.pandasecurity.com
127.0.0.1 acs.pandasoftware.com

Podsumowując: Panda i G Data koncepcyjnie mają podobne produkty. Panda posiada definicje antywirusowe oraz silnik chmurowy. Heurystyka z definicji powoduje w razie potrzeby sprawdzenie pliku w chmurze - tak samo robi G Data AntiVirus. Dlaczego Panda jest darmowa? Firma pewnie chce przetestować rozwiązanie, które myśli udostępnić za pieniądze użytkownikom korporacyjnym. Silnik skanujący Pandy PSANHost.exe podczas pracy wcale nie jest taki lekki, a cały pakiet łatwo zepsuć. Panda zrobiona jest po części w C++ Builderze.

Kłócą się panowie, którzy chyba mają stanowiska marketingowców...

KDE 4.3.3 na Windows

Natywna wersja windowsowa powoli się stabilizuje. Sporo aplikacji działa bez problemów.



niedziela, listopada 22, 2009

DSEE 7.0 na NT 6.1

Po rozpakowaniu windowsowej wersji DSEE w katalogu var mamy plik dsee7.war, który należy zadeployować sobie na GlassFishu. Najpierw jednak inicjalizujemy Directory Server i podnosimy cacao.

Cacao używa samodzielnie podpisanego certyfikatu SSL, który nie przejdzie w DCC 7. Dlatego wyeskportujemy certyfikat i zaimportujemy go do keystore'a, którego używa GlassFish.





środa, listopada 04, 2009

Switchable graphics a Acer Timeline i Windows 7

Działające sterowniki pozwalające na przełączanie między ATI a Intelem ma Lenovo. Sterowniki należy rozpakować i podmienić plik INF dla Windows 7 64-bit. Minus jest taki, że sterowanie jasnością LCD nie działa (kwestia BIOSu albo Launch Managera).

Update: Są dedykowane sterowniki do W7.

poniedziałek, listopada 02, 2009

BizTalk 2009 z Visual Studio 2008

BizTalk 2009 pozwala na tworzenie projektów w Visual Studio, ale z zainstalowanym Visual C# (inaczej będziemy widzieć 'project creation failed'). Ponadto Service Pack 1 do VS2K8 może wymagać poprawki do Rejestru:
REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Projects\{FAE04EC0-301F-11d3-BF4B-00C04F79EFBC}]
"PossibleProjectExtensions"="csproj;btproj"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\Projects\{FAE04EC0-301F-11d3-BF4B-00C04F79EFBC}]
"PossibleProjectExtensions"="csproj;btproj"
KC4Z0ZBWWH4G0G

wtorek, października 27, 2009

Acer Aspire 4810TZG

Laptop firmowo zapakowany jest w dość ładne pudełko, w którym znajdziemy kabel zasilający i zasilacz LiteOn z emblematem baterii z liściem (symbol energooszczędności).

W zależności od ilości światła laptop wydaje się być srebrny albo grafitowy. Na obudowie nie będzie już widać palców, co było standardem w Acerach z linii Gemstone. Materiał z tyłu ekranu fakturą przypomina szczotkowane aluminium, natomiast ten w środku w płaszczyźnie klawiatury, jest bardziej śliski. Obudowa nie ma zatrzasków, ekran można odgiąć bardziej niż w modelach Gemstone (co jest plusem, zważywszy dziwne pozycje używania laptopa w warunkach domowych).

Klawiatury używa się dość przyjemnie, nie jest głośna, klawisze mają krótki skok. Niestety na fortepianowej czerni klawiszy pozostają odciski palców, co wygląda po pewnym czasie mało estetycznie. Z drugiej strony, gdyby klawisze były wykonane z szorstkiego, czy też matowego plastiku (taki jest w Travelmate'ach z linii Timeline), pewnie pisanie byłoby trochę mniej przyjemne.

W Timeline'ach mamy do dyspozycji touchpad multitouch - do przetestowania w windowsowej przeglądarce zdjęć - zoom in, zoom out, następny obrazek (zbliżamy/oddalamy od siebie dwa palce, dwoma palcami przesuwamy szybko w poprzek gładzika). Powierzchnia gładzika jest wykonana z tego samego materiału, co obudowa z tyłu ekranu, nie jest śliska.


Laptop ma matrycę AU Optronics podświetlaną diodami LED w rozmiarze 14'' o rozdzielczości 1366x768 pikseli. Krótsza wysokość ekranu w porównaniu do standardowych wymiarów 1280x800 wzmaga wrażenie sporej długości pulpitu. Kolory są dość dobrze odwzorowane, podświetlenie ma 10 stopni jasności, z czego w normalnym użytku do wykorzystania są pierwsze trzy, dalej obraz będzie za jasny. Laptop ma dwie karty graficzne: zintegrowaną Intel i PCI-Express ATI Radeon 4330. Przy włączonym Intelu Radeon nie jest prawidłowo wyłączany i laptop się grzeje w dolnej lewej częsci, dlatego lepiej wyłączyć Intela - laptop pozostanie ledwie ciepły i niemal bezgłośny.

Obudowa ma cal grubości, przez co jest trochę mniej solidna od tej ponad 3,5 centymetrowej w modelu Aspire 4x30. W lewej częsci pod ekranem znajduje się włącznik, jest on umieszczony we wklęśnięciu względem płaszczyzny klawiatury, a do tego jest wąski, przez co trudniej przypadkowo wyłączyć laptopa, ale przy tym trudniej go włączyć palcem wskazującym lewej dłoni - po pewnym czasie można przyzwyczaić się do używania palca wskazującego prawej dłoni z ułożeniem wzdłuż przycisku. W drugim krańcu obudowy jest przycisk otwierający tackę napędu optycznego - ta jest solidna i bardziej odporna na wpadanie w rezonans (co było standardem przy krzywych płytach w innych Acerach).

Laptop wyposażono w dwurdzeniowy procesor Intel Pentium SU4100 @ 1.3GHz z 2 MB pamięci cache L2. Procesor ten to Intel Core 2 Duo SU7300 z nie działającą wirtualizacją i mniejszym o 1/3 cache-em L2 (zaś SU7300 to wolniej taktowany SU9400). Windows 7 w konfiguracji z 4GB RAM-u śmiga. Przy nic nierobieniu jedno ładowanie baterii potrafi starczyć na ponad 9 godzin. Przy przeglądaniu Internetu bez flasha będzie to 8 godzin.

Pytanie, czy do pełni szczęscia potrzebna nam wirtualizacja? Laptop ten raczej nie został do niej zaprojektowany, bo ma chodzić długo na baterii (włączenie VirtualBoksa, albo VMware Playera, w których można uruchomić systemy 32-bitowe powoduje zjechanie wskaźnika baterii do 4 godzin). Ponadto lepiej chyba mieć 2 rdzenie bez wirtualizacji niż jeden rdzeń z Intel-VT (Intel Core Solo SU3500). Mamy do dyspozycji 500GB dysku twardego, więc zamiast coś wirtualizować, można zainstalować obok.

Laptop nie ma standardowego BIOS-u tylko program EFI Insyde H2O przypominający z wyglądu BIOS Phoenix.


niedziela, października 25, 2009

OpenSUSE 11.2 w VirtualBoksie

Żeby instalacja się udała należy wyedytować konfigurację GRUB-a dodając do parametrów kernela "nopreload".



Kolorystyka jest trochę kontrowersyjna...

Hint na używanie Fedory 12 beta LiveCD: Ctrl+Alt+F2, renice -n 30 `pidof loop3`.

Shaping ruchu sieciowego w OpenSolarisie

Stworzyliśmy wirtualną kartę sieciową do dedykowanej obsługi ruchu SSH. Żeby ssh user@10.0.2.150 zadziałało trzeba jeszcze podnieść eth0 (ifconfig eth0 up).


sobota, października 24, 2009

Intel AC97 w Windows 7

Windows 7 nie ma sterownika do intelowego AC97, ale Realtek ma driver do swojego sprzętu, a wszystkie kodeki AC97 są w zasadzie takie same... Sprawdzone w VirtualBoksie.

wtorek, października 20, 2009

Ultimate HTTP Tunnel

Sprytna aplikacja, którą każdy chciał mieć od dawna. Cytat ze źródeł:
/* Ultimate HTTP Tunnel
*
* c - client
* l - local server
* r - remote server
* d - destination
*
* | |
* | |
* [c] <---> bytes <--> [l] <---> HTTP with XML <--->[r] ---> bytes ---> [d]
* | |
* | |
*
* [c] doesn't have access to [d] port
* [l] have access to [r] port and [r] have access to [d] port
* [l] and [r] create HTTP Tunnel for [c] to access [d]
*/
Można przepuścić przez tunel HTTP dowolny protokół, [l] udaje Internet Explorera, a [r] udaje Apache'a.

sobota, października 17, 2009

Master Data Management

Mamy kilka systemów dziedzinowych, wszystkie zawierają dane tego samego typu biznesowego (np. dotyczące klientów) i chcielibyśmy te dane zsynchronizować. Bierzemy pod uwagę, że obecna firma to efekt paru przejęć, połączeń i innych tego typu zaniechanych okazji do połączenia systemów IT. Bierzemy też pod uwagę, że klientki zmieniają nazwiska, adresy zamieszkania, telefony itd. Robimy jedną bazę, w której będą spójne i aktualne dane i wszystkie nowe aplikacje powinny z niej korzystać.



Sun ma kompleksowe rozwiązanie integrujące się z OpenESB/JCAPS-em. Definiujemy sobie model danych i instalujemy na serwerze aplikacyjnym aplikację MasterIndex1. Wykonujemy na Oracle'u skrypty z katalogu 'Database Scripts'.



Tworzymy na Glassfish-u źródło danych dostępne po JNDI-u jako jdbc/MasterIndex1DataSource.



Dodajemy operatora zarządzania danymi.



Z MDM możemy rozmawiać za pomocą WebService-u.



Zasymulujmy import użytkownika z systemu dziedzinowego A. Dla odmiany używając Eclipse-a a nie NetBeans-a.



Teraz dodajmy w zasadzie tego samego klienta z systemu B. Jeśli pozmieniamy mu trochę dane to dostanie inny Enterprise UID (czyli zostanie potraktowany jako nowy unikalny rekord).



Error Codes

czwartek, października 15, 2009

Oracle Fusion

Wszystko jest zmigrowane na WebLogic'a (jest sportowany Enterprise Manager, obok jest standardowy deployment WebLogic Console) - czyli to jednak było hostile takeover. Fusion Middleware ma wszystkie funkcjonalności potrzebne do zastąpienia produktów ESB.



Welcome Screen jest rewelacyjny.







SOA Suite jest trochę niedopracowany. Deployment można zrobić tylko na Admin Serverze z dołożonymi komponentami SOA. Powyżej przykład z operacją bazodanową udostępnioną jako WebService.


Żeby operacje bazodanowe działały musimy stworzyć w konsoli DataSource'a oraz dodać go do DbAdapter-a (najprościej wyedytować weblogic-ra.xml z pliku Oracle\Middleware\Oracle_SOA1\soa\connectors\DbAdapter.rar)

niedziela, września 27, 2009

Rozmiary okien TCP

www.wp.pl 4380
www.onet.pl 5792
www.google.pl 5672
www.gazeta.pl 32768
www.microsoft.com 8190

sobota, września 26, 2009

Jak uaktywnia się skalowanie okna TCP



W przypadku Axis-a można to rozwiązać tak:

System.setProperty("tcp.window.size", "64000");
AxisProperties.setProperty("axis.socketFactory", "CustomSocketFactory");

Czasy WebService'u dla rozmiaru okna:

1460 (RWIN=MSS :) => 21860 ms
5000, 7000, 17000, 33000, 64000 => 4500-6500 ms

TCP Window Scaling

Diagnostyka i konfiguracja. Po drodze może być stary Cisco IOS Firewall obcinający pakiety spoza okna (którego rozmiar jest w rzeczywistości przeskalowany przez 2^wscale)...

poniedziałek, września 14, 2009

Tweakowanie systemu Windows

... na podstawie oryginalnej dokumentacji od MS.

piątek, września 11, 2009

Prstat

27109 adinstan  469M  323M cpu1    30    0 209:37:17  35% bwengine/64
27109 adinstan 469M 323M cpu17 20 0 209:37:45 35% bwengine/64
27109 adinstan 469M 323M cpu16 20 0 209:38:14 35% bwengine/64
27109 adinstan 469M 323M cpu17 20 0 209:38:56 35% bwengine/64
27109 adinstan 469M 323M cpu18 20 0 209:39:10 35% bwengine/64
27109 adinstan 469M 323M cpu0 10 0 209:39:24 35% bwengine/64
27109 adinstan 469M 323M cpu2 10 0 209:39:38 35% bwengine/64
27109 adinstan 469M 323M cpu19 10 0 209:40:07 35% bwengine/64
Proces skacze po procesorach. Można go dowiązać narzędziami psrset+pbind, co powinno zmniejszyć opóźnienia (ważna rzecz dla np. aplikacji RT).

wtorek, września 08, 2009

Yet another firewall issue



Pod koniec wywołania WebService'u ginie segment TCP; warstwa transportowa ciągle próbuje dokończyć transmisję, co widać jako wiszenie WebService'u. Co ciekawe, w takim przypadku w kliencie .NET ustawienie timeout-u nic nie daje i aplikacja kliencka będzie cała wisieć.

W trybie debugowania pojawia się ContextSwitchDeadlockException: The CLR has been unable to transition from COM context 0x21def80 to COM context 0x21df1d0 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.
netsh int tcp set global autotuninglevel=disabled
DefaultTTL=128, SackOpts=0

sobota, września 05, 2009

Software'owy RAID w W2K8

Mirror partycji systemowej możemy stworzyć paroma kliknięciami bez restartu. Do boot menu dodana zostanie pozycja umożliwiająca odpalenie systemu z drugiego dysku. Wszystko dużo łatwiejsze i szybsze niż w Linuksie i Solarisie. Mój ulubiony layout: RAID1 + RAID0.


czwartek, sierpnia 20, 2009

Transaction timeout na WLS a QueryTimeout na JDBC

Przekroczenie czasu wykonywania się transakcji i jej rollback nie gwarantuje, że w tym samym momencie przerwane zostanie zapytanie JDBC. Weblogic może rzucić wyjątek TimedOutException, a Statement JDBC będzie się nadal wykonywać. Dlatego należy pamiętać o Statement.setQueryTimeout(). Uwaga: nie wszystkie bazy to obsługują.

DbDiff na replice read-only

Założenie: z produkcyjnej bazy danych online generowana jest codziennie replika read-only. Chcemy w jakiś sposób generować różnice pomiędzy stanem z dnia obecnego a stanem z dnia poprzedniego. Tabelki zawierają od kilkuset tysięcy do paru milionów rekordów. Projekt nie jest priorytetowy i nie chcemy na niego wydawać pieniędzy.

Rozwiązanie: Tworzymy bazę przejściową z tabelkami CURRENT_* i PREVIOUS_*. Na początku transakcyjnej operacji kopiujemy wszystkie CURRENT_* do PREVIOUS_*, potem ładujemy aktualny stan bazy read-only do CURRENT_* i liczymy różnicę (select minus select). Baza przejściowa ma do dyspozycji 1500MB pamięci, program do generowania różnicy 768MB.

Warunki brzegowe: Tabelki źródłowe po zserializowaniu do plików mają > 300MB. Dell + Intel Core 2 Quad 2.4 GHz + 3GB RAM + NT5.

Wyniki:
Czas operacji na bazie:
Apache Derby: 31 minut (bez select into table)
Oracle XE: 12 minut (20 minut bez create table as select)
MSSQL 2005 Express: 16 minut (24 min bez select into from).
PostgreSQL: nie da się (transakcje nie działają tak jak trzeba)
MySQL: nie da się (brak operatora minus/except)

Kto tworzy Linuksa

Sporo ludzi. Na pierwszym miejscu osoby prywatne (21.1% zmian w kodzie), na drugim RedHat (12.0%), potem IBM (6.3%), Novell (6.1%), Intel (6.0%), Oracle (3.1%), Parallels - producent narzędzi do wirtualizacji (1.7%), Fujitsu (1.5%), SGI (1.2%), Sun i HP (1.0%), Freescale, Marvel i MontaVista (0.9%), AMD, Nokia, Google, Atheros (0.8%). A firmy Canonical w zasadzie nie widać. Ubuntu ssie...

środa, sierpnia 19, 2009

Metro Sun-a nie działa z Sharepointem MS

Na końcu metody getElementPropertyAccessor w klasie JAXBContextImpl z pakietu com.sun.xml.bind.v2.runtime nie należy rzucać wyjątku tylko zwrócić dodatkowy Accessor, który bierze pod uwagę, że klasy MS mogą mieć nazwy zaczynające się od Get i Set...
public GetSetAccessor(Class wrapperBean, String localName)
throws JAXBException
{
try {
String javaFieldName = Character.toLowerCase(
localName.charAt(0)) + localName.substring(1);
wrapperBean.getDeclaredField(javaFieldName);
}
catch (Exception e) {
throw new JAXBException("No access to field "+
localName + " of " + wrapperBean+": "+e.toString());
}
String fieldInMethod = Character.toUpperCase(
localName.charAt(0)) + localName.substring(1);

String setterName = "set"+fieldInMethod;
String getterName = "get"+fieldInMethod;

for (Method m : wrapperBean.getMethods()) {
if (m.getName().equals(setterName) &&
m.getParameterTypes().length==1) {
setter = m;
}
else if (m.getName().equals(getterName) &&
m.getParameterTypes().length==0) {
getter = m;
}
}
}
No i gdzie to interoperability out of box?...