poniedziałek, listopada 26, 2012

NVidia driver registry config


Skoda Rapid

Najmniejszy sedan Skody ma 4,48m. Skoda Octavia ma 4,57m a Volkswagen Jetta 4,64m. Bagażnik jest spory, ale przez to tylna szyba jest płaska, co powoduje słabą widoczność do tyłu. Bardzo przyzwoita jakość materiałów.





sobota, listopada 24, 2012

ICC antiblue color profiles

Workaround na niebiesko-zielone ekrany LCD.

piątek, listopada 23, 2012

Z książki 'Modele i zastosowania systemów czasu rzeczywistego'








czwartek, listopada 22, 2012

Przykłady na schemacie Oracle HR

select sys.dbms_xmlgen.getxml('select e.first_name || '' '' || e.last_name as full_name, d.manager_id as manager_id, d.department_name, l.city, cursor(select em.first_name || '' '' || em.last_name as full_name, j.job_title from hr.employees em, hr.jobs j where em.manager_id = d.manager_id and em.job_id = j.job_id) as employee from hr.departments d, hr.employees e, hr.locations l where d.location_id = l.location_id and (l.city like ''' || ? ||  ''') and e.employee_id = d.manager_id') as xml from dual

środa, listopada 21, 2012

Zamiennik solarisowego /etc/project w Linuksie

mkdir /cgroup
mount -t tmpfs cg /cgroup
mkdir /cgroup/cg-tibo-apps
mount -t cgroup cg-tibco-apps -o cpuset,cpu,memory,blkio /cgroup/cg-tibo-apps
mkdir /cgroup/cg-tibo-apps/bw-channel-crm
echo 0 > /cgroup/cg-tibo-apps/bw-channel-crm/cpuset.cpus
echo 0 > /cgroup/cg-tibo-apps/bw-channel-crm/cpuset.mems
echo 2000 > /cgroup/cg-tibo-apps/bw-channel-crm/cpu.shares
echo `ps -ef | grep bwengine | grep bw-channel-crm | grep -v grep | awk '{print $2}' > /cgroup/cg-tibo-apps/bw-channel-crm/tasks

HornetQ 2.2.14 AIO 3x szybszy od Tibco EMS 6.3


1 milion komunikatów z bieżącą datą w body jest wysyłanych przez 22 procesy BW na jedną persystentną kolejkę JMS. HornetQ radzi sobie w 607 sekund, EMS w 1941 sekund. Klient to Windows 7, serwer to CentOS 5.8 - oba 64-bitowe, współdzielony storage to NFS. HornetQ jest tańszy i szybszy, nie ma błędów w obsłudze XA, nie ma limitu pamięciowego na ilość komunikatów w kolejce, po restarcie wznawia pracę od razu.

poniedziałek, listopada 19, 2012

Wieszający się out-of-box klient HornetQ


Domyślnie serwer blokuje klienta przed takim wysyłaniem wiadomości, które spowodowałoby przekroczenie limitu zasobów na serwerze - 10MB RAM per kolejka. Należy zmienić to konfiguracji dodając opcje page. Do diagnostyki produktów typu black box doskonale nadaje się Your Kit Java Profiler.

piątek, listopada 16, 2012

EMS server unresponsive

EMS preallocates linear datastore range chunks per sender. Too many concurrent producers (> 10 000) causes a lot of random I/O writes and as a result whole EMS server becomes unresponsive. Limit number of producers and consumers or buy fast SSD storage.

Although EMS messages are swapped to disk their headers and internal indices are kept in memory, so for every 1M messages you need 1GB RAM.

środa, listopada 14, 2012

Prosty test na XA

import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Scanner;

import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.TextMessage;
import javax.jms.XAConnection;
import javax.jms.XASession;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import javax.transaction.xa.XAResource;

import com.tibco.tibjms.TibjmsXAConnectionFactory;


public class Test {
 
 private static boolean canRun = true;
 private final static void runTest() throws Exception {
  final com.tibco.tibjms.TibjmsXAConnectionFactory xacf = 
   new  TibjmsXAConnectionFactory();
  xacf.setConnAttemptCount(60);
  xacf.setConnAttemptDelay(100);
  xacf.setConnAttemptTimeout(1000);
  xacf.setReconnAttemptCount(60);
  xacf.setReconnAttemptDelay(100);
  xacf.setReconnAttemptTimeout(1000);
  xacf.setServerUrl("tcp://node1:7222,tcp://node2:8222");
  Thread[] threads = new Thread[20];
  FileOutputStream fos = new FileOutputStream("C://xa.log");
  final PrintStream ps = new PrintStream(fos);
  for (int i=0; i < threads.length; i++) {
    threads[i] = new Thread() {
      public void run() {
        while (canRun) {
         XAConnection xaconn1 = null;
         XAConnection xaconn2 = null;
         TransactionManager tm = null;
         XAResource xares1 = null;
         XAResource xares2 = null;
         try {
          xaconn1 = xacf.createXAConnection();
          xaconn2 = xacf.createXAConnection();
          tm = com.arjuna.ats.jta
           .TransactionManager.transactionManager();
          tm.setTransactionTimeout(30);
          xaconn1.start();
          xaconn2.start();
          XASession sess1 = xaconn1.createXASession();
          XASession sess2 = xaconn1.createXASession();
          xares1 = ( sess1.getXAResource() ); 
          xares2 = ( sess2.getXAResource() );
          MessageConsumer bw1cons = 
           sess1.createConsumer(sess1.createQueue("test.bw1"));
          MessageConsumer fw1cons =
           sess1.createConsumer(sess1.createQueue("test.fw1"));
          MessageProducer bw1prod = 
           sess1.createProducer(sess1.createQueue("test.bw1"));
          MessageProducer fw1prod = 
           sess1.createProducer(sess1.createQueue("test.fw1"));
          tm.begin();
          tm.getTransaction().enlistResource(xares1);
          tm.getTransaction().enlistResource(xares2);
          ///
          TextMessage m = (TextMessage) bw1cons.receive(1000);
          if (m!=null)
           fw1prod.send(m);
          m = (TextMessage) fw1cons.receive(1000);
          if (m!=null)
           bw1prod.send(m);
          ///
          tm.getTransaction().delistResource(xares1,
           XAResource.TMSUCCESS);
          tm.getTransaction().delistResource(xares2,
           XAResource.TMSUCCESS);
          tm.commit(); 
         }
         catch (Exception e) {
          e.printStackTrace(ps);
          ps.flush();
          Transaction tr = null;
          try {
           tr = tm.getTransaction();
          }
          catch (Exception ex) {
           ex.printStackTrace(ps);
           ps.flush();
          }
          if (tr!=null) {
           try {
            tr.rollback();
           }
           catch (Exception ex) {
            ex.printStackTrace(ps);
            ps.flush();
           }
           try {
            tr.delistResource(xares1, XAResource.TMFAIL);
           }
           catch (Exception ex) {
            ex.printStackTrace(ps);
            ps.flush();
           }
           try {
            tr.delistResource(xares2, XAResource.TMFAIL);
           }
           catch (Exception ex) {
            ex.printStackTrace(ps);
            ps.flush();
           }
          }
         }
         finally {
          try {
           xaconn1.close();
          }
          catch (Exception ex) {
           ex.printStackTrace();
          }
          try {
           xaconn2.close();
          }
          catch (Exception ex) {
           ex.printStackTrace();
          }
         }
        }
       }
      };
    }
    for (Thread t : threads)
     t.start();
 }

public static void main(String[] args) throws Exception {
  System.out.println("Press q to stop.");
  runTest();
  Scanner sc = new Scanner(System.in);
  if (sc.nextLine().contains("q"))
    canRun = false;
  sc.close();
 }
}

Reklama Plus - OBA MA

piątek, listopada 09, 2012

Usługa ESB na wielu transportach


Świat idzie do przodu i ESB powinno wystawiać tę samą usługę jako SOAP over HTTP i SOAP over JMS, a od jakiegoś czasu oczekiwany jest REST+JSON. W Tibco do pierwszych dwóch można wykorzystać kontrolkę serwis, a do REST+JSON wystawić HTTP Receivera tłumaczącego wejście za pomocą biblioteki Staxon do XML-a i podać obiekt XML do tej samej implementacji serwisu.

czwartek, listopada 08, 2012

Kradnąc kod źródłowy zmieniaj nazwy zmiennych, stałych i metod

Błyskotliwy przykład kradzieży przez Software Mind wytwarzającego oprogramowanie dla operatora sieci komórkowej: pracownicy odszyfowali pliki class, zdekompilowali bajtkod Javy i przekleili bez zmian nazw zmiennych, metod, stałych. Przypadek naruszenia praw autorskich w Polsce można normalnie zgłosić do prokuratury, jest to procesowane z urzędu.

TDI to ponad 4000 linii wyspecjalizowanego kodu, 70 plików o rozmiarze około 150KB wytworzonych przez 3 lata o pracochłonności około 100 dniówek pracy dewelopera. Powstało pod wpływem prac rozwojowych dla Generali dotyczących wdrożenia Service Mix-a, kiedy okazało się, że interfejs JBI pozwala na podłączenie kodu audytującego przetwarzane komunikaty. Tibco BW posiada analogiczne listenery i takich używa TDI.

Update: Operator całą winą obarcza dostawcę, który nie poinformował, że odebrany produkt zawiera wady prawne i informuje, że w przypadku roszczeń względem operatora, zostaną zgłoszone przez niego roszczenia względem dostawcy.

środa, listopada 07, 2012

Architekt

Ilu architektów potrzebnych jest do EAI?
  • architekt od wypracowanych technologicznych standardów i bibliotek kodu (adaptuje technologie, tworzy frameworki, szablony, przykłady)
  • architekt od procesów wytwarzania oprogramowania (definiuje kroki związane z analizą, dewelopmentem, testowaniem, wdrażaniem, usuwaniem błędów)
  • architekt od standardów wytwarzania oprogramowania (definiuje przyjęte wzorce projektowe, techniki, zasady kodowania, używania API)
  • architekt od infrastruktury (sprzęt, sieć, storage, systemy operacyjne, wysoka dostępność)