piątek, grudnia 30, 2011

Distinct w Tibco


Bo w BW nie ma obsługi XPath distinct-nodes. Opcja z Variable List:
$Map-Data/root/param[ not(contains(  concat('|', tib:concat-sequence-format(preceding::node(), '|', true()), '|'), concat('|',.,'|'))) ]

czwartek, grudnia 29, 2011

Dlaczego GUI na Androidzie nie działa płynnie?

Jeśli ktoś ma tablet z Androidem i do przeglądania Internetu używa Firefoksa to zapewne zauważył, że działanie aplikacji wcale nie jest płynne (także w kontekście obsługi zdarzeń generowanych przez ruchy palca po ekranie). Android operuje na buforze ramki karty graficznej, wątek do rysowania jest jeden. Podejście takie samo jak w Javie. Napiszmy zatem w Swingu program obrazujący problem: na panelu rysujemy pod kątem ostrym naprzemienne linie czerwone i czarne z włączonym antyalisingiem.


Okienko aplikacji pojawia się bardzo wolno, skalowanie okna stwarza problemy wydajnościowe, pod względem używalności GUI jest słabo. Jak to można naprawić? Trzeba wziąć pod uwagę, że jeżeli czas obsługi zdarzenia/rysowania jest znaczny w porównaniu do czasu generowania zdarzenia (ruchu palcem po ekranie), to może nam się nagromadzić kolejka zdarzeń do obsłużenia. W poprawnej obsłudze stanu aplikacji, część zdarzeń powinna być odrzucona, a obsłużone tylko ostatnie. Przy takim założeniu oprócz wątku obsługi zdarzeń, którego działanie powinno być natychmiastowe, potrzebujemy dodatkowego wątku, który będzie wykonywał pracę graficzną. Pojedynczy wątek podsystemu graficznego powinien być używany tylko do blokowego transferu gotowego obrazka do bufora ramki (BitBlt).


Mniej więcej takie założenia ma Apple Grand Central Dispatch i dzięki temu GUI na iOS śmiga*. Na Androidzie też się da, ale musi zadbać o to programista. Na urządzeniach przenośnych trzeba wypracowywać kompromis pomiędzy zużyciem pamięci (offscreen pixmaps) a responsywnością, jednak Firefox powinien brać pod uwagę, że tablet to trochę większe urządzenie i da się na nim osiągnąć lepsze user experience. Ciekawe jest podejście Google-a do przeglądarki: strona wyświetlana jest tylko, kiedy cała jest gotowa, a żeby zająć czymś użytkownika u góry przebiega ładna ale za wąska linia postępu. Bufor pozaekranowy oczywiście istnieje.


Ostatni obrazek pokazuje artefakty wynikające z odmalowywania na ekranie obrazka w trakcie rysowania - ale oszczędzamy na jednym buforze pozaekranowym.

O czym powinien jeszcze pamiętać programista na platformie ARM? O minimalizowaniu ilości rozgałęzień kodu. Spekulatywne wykonywanie zaczyna pojawiać się w tych procesorach, ale nie jest na tym samym wysokim poziomie jaki prezentuje Intel x86. Z drugiej strony wykonywanie kodu, które pójdzie w niebyt, niepotrzebnie marnuje energię.

* - nie zmienia to jednak faktu, że posiadanie iPhone-a przez szwagra jest mało męskie.

Ciekawostka: Java 1.8.0-ea-b18 po chwilowej zmianie rozmiaru okna na [0,0] wisi na:

----------- Thread[Thread-2,6,main]
sun.java2d.d3d.D3DRenderQueue.flushBuffer(Native Method)
sun.java2d.d3d.D3DRenderQueue.flushBuffer(D3DRenderQueue.java:152)
sun.java2d.d3d.D3DRenderQueue.flushAndInvokeNow(D3DRenderQueue.java:142)
sun.java2d.d3d.D3DSurfaceData$D3DDataBufferNative.getElem(D3DSurfaceData.java:448)
sun.awt.image.DataBufferNative.getElem(DataBufferNative.java:75)
java.awt.image.DataBuffer.getElem(DataBuffer.java:327)
java.awt.image.SinglePixelPackedSampleModel.getDataElements(SinglePixelPackedSampleModel.java:409)
java.awt.image.Raster.getDataElements(Raster.java:1469)
sun.java2d.loops.OpaqueCopyAnyToArgb.Blit(CustomComponent.java:144)
sun.java2d.loops.GraphicsPrimitive.convertFrom(GraphicsPrimitive.java:560)
sun.java2d.loops.GraphicsPrimitive.convertFrom(GraphicsPrimitive.java:541)
sun.java2d.loops.MaskBlit$General.MaskBlit(MaskBlit.java:189)
sun.java2d.loops.Blit$GeneralMaskBlit.Blit(Blit.java:204)
sun.java2d.pipe.DrawImage.blitSurfaceData(DrawImage.java:959)
sun.java2d.pipe.DrawImage.renderImageCopy(DrawImage.java:578)
sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:71)
sun.java2d.pipe.DrawImage.transformImage(DrawImage.java:1111)
sun.java2d.pipe.ValidatePipe.transformImage(ValidatePipe.java:238)
sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3214)

Z dokumentacji Androida:

Tips and Tricks
Switching to hardware accelerated 2D graphics can instantly increase performance, but you should still design your application to use the GPU effectively by following these recommendations:
Reduce the number of views in your application
The more views the system has to draw, the slower it will be. This applies to the software rendering pipeline as well. Reducing views is one of the easiest ways to optimize your UI.
Avoid overdraw
Do not draw too many layers on top of each other. Remove any views that are completely obscured by other opaque views on top of it. If you need to draw several layers blended on top of each other, consider merging them into a single layer. A good rule of thumb with current hardware is to not draw more than 2.5 times the number of pixels on screen per frame (transparent pixels in a bitmap count!).
Don't create render objects in draw methods
A common mistake is to create a new Paint or a new Path every time a rendering method is invoked. This forces the garbage collector to run more often and also bypasses caches and optimizations in the hardware pipeline.
Don't modify shapes too often
Complex shapes, paths, and circles for instance, are rendered using texture masks. Every time you create or modify a path, the hardware pipeline creates a new mask, which can be expensive.
Don't modify bitmaps too often
Every time you change the content of a bitmap, it is uploaded again as a GPU texture the next time you draw it.
Use alpha with care
When you make a view translucent using setAlpha()AlphaAnimation, or ObjectAnimator, it is rendered in an off-screen buffer which doubles the required fill-rate. When applying alpha on very large views, consider setting the view's layer type to LAYER_TYPE_HARDWARE.
Słabo, prawda?

środa, grudnia 28, 2011

Tinker, Tailor, Soldier, Spy

Gary Oldman potrafi genialnie kreować grane postacie. Smiley to facet, po którym w zasadzie nie widać uczuć i nie wiadomo, co tak naprawdę myśli. Po odejściu z pracy widać, że była ona dla niego ważna. Może stosuje podejście 'I don't care now', ale wraca. Wie jak rozmawiać z ludźmi, żeby osiągnąć cel. Wraca do pracy jako szef - z dyskretnym uśmiechem na ustach. Porządna brytyjska obsada: Collin Firth (King's Speech), John Hurt (V for Vendetta), Tom Hardy (Inception).

Tusk to najgorszy premier po 89 roku

Odwołanie Anny Streżyńskiej ze stanowiska prezesa UKE, żeby na jej miejsce wsadzić osobę z klucza partyjnego i móc ogłaszać sukcesy rządu, to jest bezczelność. Prezes UKE jest osobą, która zrobiła najwięcej dobrego dla polskich internautów. Nie jakiś tam Tusk z hasłem 'Internet w każdej gminie'. Internet powinien być cenowo dostępny - i taki jest dzięki wieloletniej profesjonalnej pracy Pani Prezes. Jeśli prezes rady ministrów ruguje profesjonalistów, a na ich miejsce wpycha ludzi z klucza, to marny z niego premier. Co do opinii, że Streżyńska za często zmienia zdanie i naraża operatorów na koszta - być może, ale dlatego, że jest osobą otwartą na dyskusje, a celem nadrzędnym jest dobro klienta, poza tym operatorzy wewnętrznie marnują dużo większe pieniądze, niż wydają na projekty regulacyjne. Być może przesadziłem z tytułem, ale się wkurzyłem. Z drugiej strony, jak się posłucha Staniszkis, to tytuł ma uzasadnienie.

wtorek, grudnia 27, 2011

Dzisiaj w Olimpie



wesoła nowina - Windows się zepsuł. Tanie chińskie AC97, których spora część producentów kradła sterowniki od Realteka zamiast opracować własne.

Listopadowe słońce


czwartek, grudnia 22, 2011

Tibco a złożone typy Oracle




W Oracle 11g można procedurę wystawić jako WebService. Jest jedno ale: wszystkie parametry top level muszą być typami prostymi lub obiektami (obiekt może zawierać pole typu rekord lub tablicę, tak więc prawie wszystkie rodzaje parametrów da się opakować w obiekt).



W wariancie z Javą nadal mamy kontrolę nad transakcyjnością w ramach procesu, w przypadku WebService-u musielibyśmy w procedurach opakowujących zaimplementować SAGA pattern, co niekoniecznie będzie wykonalne. Droga na skróty, czyli wkładanie składowalnych procedur Javy/JPublisher na typach prostych do nieswojego serwera bazodanowego, to zły pomysł - zemści się w utrzymaniu. Tibco od wersji 5.6 BW próbuje obsługiwać złożone typy Oracle, ale należy to traktować raczej jako 'technical preview'/work-in-progress.

wtorek, grudnia 13, 2011

nsswitch.conf w Windows


piątek, grudnia 09, 2011

Luther

Jenny:  You didn't really do that, did you?
Luther: Do what?
Jenny:  Like, call up some totally psycho killer girl.
Luther: Her name's Alice.

czwartek, grudnia 08, 2011

Oracle against Spring

Właścicielem Springa jest VMware - konkurencja w wirtualizacji i cloud computing.

poniedziałek, grudnia 05, 2011

TIBCO, IAIK, BIG-IP

11-letni (sic!) IAIK używany jako domyślny stos SSL w produktach Tibco (np. BusinessWorks) cache-uje sesje SSL i nie radzi sobie z tym, że długość życia sesji na urządzeniu F5 to domyślnie 1 godzina. Stale włączony komponent realizujący zabezpieczoną komunikację po protokole SOAP, przy niewygasającym ruchu, będzie z godzinną regularnością rzucał błędami. Żeby naprawić problem Tibco musi poprawić menedżera sesji: sslContext.setSessionManager(). Pewnie się naczekamy. Wnioski: należy używać ESB OpenSource a nie zamkniętych rozwiązań, w których samemu (albo zwinną firmą np. Touk) nic nie można poprawić.


Jak zasymulować F5? Spróbujmy Apache-em: odeśle stare zaakceptowane Session ID lub nowe.

httpd-ssl.conf:
SSLSessionCache "shmcb:c:/Users/user/Apache/ssl_scache(512000)"
SSLSessionCacheTimeout 30

javax.net.debug=all w implementacji Sun Microsystems:
%% Client cached [Session-2, TLS_DHE_RSA_WITH_AES_128_CBC_SHA]
%% Try resuming [Session-2, TLS_DHE_RSA_WITH_AES_128_CBC_SHA] from port 49499

Najnowszy IAIK też działa:
ssl_debug(8): Starting handshake (iSaSiLk 4.4 Evaluation Version)...
ssl_debug(8): Sending v3 client_hello message to localhost:443, requesting version 3.1...
ssl_debug(8): Trying to resume session CA:FE:BA:BE:00:01:02:03...

public class Lab {
private final static boolean useIAIK = true;
static {
System.setProperty("javax.net.debug", "all");
System.setProperty("javax.net.ssl.trustStore", "D://dev//ssl.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "secret");
System.setProperty("com.entrust.toolkit.ssl.trustroots.type", "JKS");
System.setProperty("com.entrust.toolkit.ssl.trustroots", "D://dev//ssl.jks");
System.setProperty("com.entrust.toolkit.trace", "FINEST");
Security.insertProviderAt(new Entrust(), 1);
}
    
public static void main(String[] args) throws Exception {
while (true) {
SSLClientContext ctx = new SSLClientContext();
ctx.setDebugStream(System.out);
ctx.setChainVerifier(null);
Socket s = useIAIK ? new SSLSocket(InetAddress.getByName("localhost"), 443, ctx) :
SSLSocketFactory.getDefault().createSocket(InetAddress.getByName("localhost"), 443);
s.setKeepAlive(true);
OutputStream os = s.getOutputStream();
os.write("GET / HTTP/1.1\r\n".getBytes());
os.write("Host: localhost\r\n".getBytes());
for (int i=0; i < 1; i++) {
os.write(("Header-"+i+": 0\r\n").getBytes());
os.flush();
Thread.sleep(1000);
}
os.write("\r\n".getBytes());
os.flush();
InputStream is = s.getInputStream();
int b = 0;
while ( (b=is.read())!=-1 )
System.out.print( (char)b );
is.close();
s.close();
Thread.sleep(40000);
}
}
}

niedziela, grudnia 04, 2011

Entropia

user@openindiana:~$ time dd if=/dev/random of=/dev/zero bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1,0 MB) copied, 56,3951 s, 18,6 kB/s

real 0m56.748s
user 0m0.009s
sys 0m56.382s
user@openindiana:~$ time dd if=/dev/urandom of=/dev/zero bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1,0 MB) copied, 0,0697105 s, 15,0 MB/s

real 0m0.079s
user 0m0.003s
sys 0m0.076s

czwartek, grudnia 01, 2011

Obiektywna ocena rzeczywistości

Żeby do bagażnika w Yarisie nie można było włożyć przedziurawionego koła, bo dojazdowe do 80km/h jest w rozmiarze 14 cali, a normalnej 15-tki na jego miejsce nie da się wcisnąć, to jest kurde skandal.

Żeby na parkingu dla pracowników niemieckiej firmy walały się gwoździe, to jest normalnie kurde skandal.