tibemsd.conf:
flow_control=enabled
per queue:
expiration=180min
flowControl=100MB
maxbytes=300MB
maxmsgs=100000
overflowPolicy=discardOld
Pokazywanie postów oznaczonych etykietą workaround. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą workaround. Pokaż wszystkie posty
czwartek, maja 17, 2018
poniedziałek, lutego 26, 2018
Continuosly updated CDM entities BW pattern
With one (or more) publisher(s) of CDM entity and many subscribers a single change in canonical data model forces all subscribers to adjust. With smart approach on BW side done once no furter adjustment is needed:
Parse XML string retrieved from transport against selected XSD entity but with input validation disabled. In next step map this data using for-each - designer proposes currently known fields/elements. In case data format is changed and new fields are added to the end of sequence they will be parsed but will be omitted in mapper. We still have data validation in mapper, but only on known (as of development) fields.
Parse XML string retrieved from transport against selected XSD entity but with input validation disabled. In next step map this data using for-each - designer proposes currently known fields/elements. In case data format is changed and new fields are added to the end of sequence they will be parsed but will be omitted in mapper. We still have data validation in mapper, but only on known (as of development) fields.
czwartek, lutego 22, 2018
How to output compressed data with HTTP in Tibco BW
Headers are important. Use Java Code to write string to GZIPOutputStream mapped by ByteArrayOutputStream.
czwartek, stycznia 25, 2018
Ubuntu 17.10 window buttons like in Unity
gsettings set org.gnome.desktop.wm.preferences button-layout 'close,minimize,maximize:'
poniedziałek, grudnia 18, 2017
Tibco Designer on Linux
java.extended.properties -Dswing.defaultlaf=com.jgoodies.looks.plastic.Plastic3DLookAndFeel -Dsun.awt.disablegrab=true --add-opens=java.base/jdk.internal=ALL-UNNAMED --add-opens=java.management/sun.management=ALL-UNNAMED --add-opens=java.management/com.sun.jmx.remote.internal=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED --add-opens=java.base/jdk.internal.vm=ALL-UNNAMED --add-modules=java.xml.bind --illegal-access=permit -Dswing.defaultlaf=com.jgoodies.looks.plastic.Plastic3DLookAndFeel -Dsun.awt.disablegrab=true -Xscmx1g -Xshareclasses:name=bw -Xgcpolicy:metronome -Djdk.attach.allowAttachSelf=true -Xquickstart -XX:+IdleTuningGcOnIdle -Xtune:virtualized
export _JAVA_AWT_WM_NONREPARENTING=1
czwartek, września 21, 2017
What is the cause of Tibco BusinessWorks problems with HTTPS (TLSv1.1, TLSv1.2, SalesForce)
Tibco uses old version of cryptographic library Entrust which uses even older library IAIK from Technische Universität Graz in Austria. These are not capable of providing TLSv1.2. IAIK is properly developed and maintained (with TLS supported at least since 2014), see http://jcewww.iaik.tu-graz.ac.at/index.php/sic/News/iSaSiLk_5.0_with_TLS_1.2_support_released, but Tibco doesn't update this library on its own. If you set java.property.TIBCO_SECURITY_VENDOR="j2se" or "j2se-default" or "ibm" in bwengine.tra file (also in designer.tra) you can use security stack from JRE. To be honest only part of it due to strange implementation of Tibco SSL Socket Factory. SSLContext is acquired for hardcoded value "TLSv1", what causes limiting TLS version used to TLSv1 despite the fact that Java 7+ can use TLSv1.2. How can Tibco fix this hardcode bug? By reading private MAX field from Sun's ProtocolVersion and then using it in argument to SSLContext.getInstance(). How can we hack this Tibco bug? By manually setting supported protocols inside JRE SSL contexts. If you want to access SalesForce from BW, but you can't, you can contact me and ask for help.
wtorek, września 19, 2017
poniedziałek, września 11, 2017
Przesyłanie dokumentów między instytucjami przez ePUAP
Platforma ePUAP umożliwia przesłanie podpisanego dokumentu konkrentnej sprawy (zgodnego z XSD), z załącznikami od petenta do instytuacji i vice versa. Petent jednak nie może przesłać dalej dokumentu od jednej instytucji do drugiej. Nie może też przesłać XML-a z jedną sprawą jako załącznika do drugiej, bo podmioty uczestniczące w ePUAP nie umieją czytać plików sprawy. Ministerstwo nie wpadło na to. Tymczasem jest to bardzo podstawowa funkcjonalność jakiej obywatel może oczekiwać od e-usług. Co taki sąd może zrobić z dokumentem XML sprawy ePUAP? Powołać biegłego do odczytania go. A sąd nie ma na to czasu i pieniędzy. Sama walidacja dokumentu sprawy jest prosta:
Apeluję do Pani Minister o dodanie takiej funkcjonalności do ePUAP.
Mogę nawet sam ją dopisać albo wykonać oddzielną aplikację za 0 zł.
-- Update 7.11.2017 --
W nawiązaniu do przekazanej idei przybliżonej przez Pana pod załączonym poniżej linkiem uprzejmie wyjaśniam, że można przesyłać dalej dokumenty, które zostały nam doręczone przez ePUAP. Istotnie nie jest to wystarczająco łatwe i wygodne ale możliwe. W razie czego służę wyjaśnieniami jak to można zrobić.
Jednakże między innymi dlatego problematyka e-doręczeń znalazła się w programie „Od papierowej do cyfrowej Polski” jako odrębny temat zatytułowany „Strumień e-Skrzynka i e-Doręczenie” zob. https://www.gov.pl/cyfryzacja/ strumien-e-skrzynka-i-e- doreczenie
Odrębną kwestią jest to, że poza ePUAP trudno jest wizualizować dokumenty XML jak również wersyfikować podpisy i wyodrębniać załączniki do tych dokumentów. Tu też ma Pan rację że nie jest to wygodne choć sąd może korzystać wprost z konta na ePUAP lub usługi wizualizacji jest dostępnej pod adresem https://epuap.gov.pl/wps/ myportal/strefa-urzednika/ inne-systemy/walidator
Jeszcze inne problemy dotyczą możliwości skutecznego przesłania do sądu pisma procesowego na elektroniczną skrzynkę podawczą sądu, co jak Pan zapewne wie nie jest obecnie możliwe, ale nie dlatego, że nie można przekazać dalej dokumentu otrzymanego z innego podmiotu (bo można), ani dlatego, że sąd „nie umie” odczytać dokumentu XML (bo powinien). Powody wyjaśniają sądy na swoich stronach internetowych zob. np. tutaj: http://bip.warszawa.so.gov.pl/ artykul/468/353/elektroniczna- skrzynka-podawcza
W MC doskonale zdajemy sobie sprawę z powyższych uwarunkowań i dlatego między innymi pracujemy nad takim rozwiązaniem problemu doręczeń jakie kierunkowo zostało zasygnalizowane w programie „Od papierowej do cyfrowej Polski”.
Z poważaniem
Kazimierz Schmidt
Radca ministra
Ministerstwo Cyfryzacji
Departament Utrzymania i Rozwoju Systemów
czwartek, września 07, 2017
poniedziałek, września 04, 2017
Why /etc/security/limits.conf doesn't work in Ubuntu 16.04, 16.10, 17.04?
Because there is systemd...
Modify its files:
root@user-VirtualBox:~# grep NOFILE /etc/systemd/*.conf
/etc/systemd/system.conf:DefaultLimitNOFILE=2097152
/etc/systemd/user.conf:DefaultLimitNOFILE=1048576
Modify its files:
root@user-VirtualBox:~# grep NOFILE /etc/systemd/*.conf
/etc/systemd/system.conf:DefaultLimitNOFILE=2097152
/etc/systemd/user.conf:DefaultLimitNOFILE=1048576
piątek, czerwca 09, 2017
czwartek, października 27, 2016
Fix slow and unresponsive LibreOffice in Ubuntu 16.10
echo "export SAL_USE_VCLPLUGIN=gtk" >> /etc/profile
środa, września 14, 2016
How to extract text from MS HTML
public static String extractTextFromHtml(String html, boolean isForJson) {
StringBuilder sb = new StringBuilder();
boolean ignore = false;
boolean isXmlData = false;
boolean closing = false;
for (int i=0; i < html.length(); i++) {
char c = html.charAt(i);
if (c=='<' & !ignore) {
ignore = true;
closing = false;
}
else if (c=='&' && !ignore) {
int end = html.indexOf(";", i+1);
if (end!=-1) {
Boolean isNumber = null;
Boolean isEntity = null;
for (int x=i+1; x < end; x++) {
char ch = html.charAt(x);
if ((ch >='0' && ch <= '9') || (ch=='#' && x==c+1)) {
if (isNumber == null)
isNumber = true;
else
isNumber &= true;
}
else if (ch==' ') {
if (isEntity==null)
isEntity = false;
else
isEntity = isNumber = false;
}
else
isEntity = true;
}
if (Boolean.TRUE.equals(isNumber) || Boolean.TRUE.equals(isEntity)) {
if (Boolean.TRUE.equals(isNumber)) {
String num = html.substring(i+2, end);
sb.append(Character.toString((char)Integer.valueOf(num).intValue()));
}
int add = (end - i);
i += add;
}
else if (ignore && c=='/') {
closing = true;
}
else if (ignore && c=='>') {
ignore = false;
if (closing && isXmlData)
closing = isXmlData = false;
}
else if (ignore && c==':') {
isXmlData = true;
}
else if (!ignore && !isXmlData) {
if (c=='„' || c=='”' && isForJson)
c = '"';
if (c=='"' && i>1 && html.charAt(i-1)!='\\' && isForJson)
sb.append('\\');
sb.append(c);
}
}
String s = sb.toString().trim();
if (s.startsWith("ĘĄ"))
return s.substring(2, s.length());
return s;
}
wtorek, lipca 12, 2016
Ceph S3 API SignatureDoesNotMatch
Use Amazon SDK Client (https://sdk-for-java.amazonwebservices.com/latest/aws-java-sdk.zip) and following Java code:
String accessKey = "1";
String secretKey = "2";
String endpoint = "http://localhost:8080";
String bucket = "UPPERCASE";
SignerFactory.registerSigner("S3SignerType", S3Signer.class);
BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setSignerOverride("S3SignerType");
clientConfig.setProtocol(Protocol.HTTP);
AmazonS3Client conn = new AmazonS3Client(credentials, clientConfig);
conn.setEndpoint(endpoint);
InMemoryRegionImpl region = new InMemoryRegionImpl("ceph", "localhost");
region.addEndpoint("s3", endpoint);
conn.setRegion(new com.amazonaws.regions.Region(region));
System.out.println(conn.listBuckets().get(0));
byte[] bytes = "Hello World!".getBytes();
ByteArrayInputStream input = new ByteArrayInputStream(bytes);
try {
ObjectMetadata md = new ObjectMetadata();
md.setContentLength(bytes.length);
md.setHeader("x-amz-acl", "public-read");
PutObjectRequest por = new PutObjectRequest(bucket, "plik.txt", input, md);
PutObjectResult res = conn.putObject(por);
System.out.println(res);
}
catch (AmazonS3Exception s3e) {
s3e.printStackTrace();
}
String accessKey = "1";
String secretKey = "2";
String endpoint = "http://localhost:8080";
String bucket = "UPPERCASE";
SignerFactory.registerSigner("S3SignerType", S3Signer.class);
BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setSignerOverride("S3SignerType");
clientConfig.setProtocol(Protocol.HTTP);
AmazonS3Client conn = new AmazonS3Client(credentials, clientConfig);
conn.setEndpoint(endpoint);
InMemoryRegionImpl region = new InMemoryRegionImpl("ceph", "localhost");
region.addEndpoint("s3", endpoint);
conn.setRegion(new com.amazonaws.regions.Region(region));
System.out.println(conn.listBuckets().get(0));
byte[] bytes = "Hello World!".getBytes();
ByteArrayInputStream input = new ByteArrayInputStream(bytes);
try {
ObjectMetadata md = new ObjectMetadata();
md.setContentLength(bytes.length);
md.setHeader("x-amz-acl", "public-read");
PutObjectRequest por = new PutObjectRequest(bucket, "plik.txt", input, md);
PutObjectResult res = conn.putObject(por);
System.out.println(res);
}
catch (AmazonS3Exception s3e) {
s3e.printStackTrace();
}
piątek, maja 27, 2016
Ratujemy meble zniszczone przez wilgoć
Płyta MDF to sprasowany wraz ze spoiwem w wysokiej temperaturze komponent drzewny. Gdy w płytę wniknie woda to puchnie i wypacza się. W dotyku robi się z niej tektura. Stolarz naprawia to rozbierając meble i wymieniając zepsuty element. Ewentualnie wycina, szpachluje i maluje natryskowo. W warunkach domowych możemy usunąć zepsutą warstwę nożem (resekcja do głębokości, na której płyta znowu jest twarda w dotyku), wyszlifować drobnoziarnistym papierem ściernym, wyrównać szpachlą drzewno-akrylową, ponownie wyszlifować, zagruntować Vidaronem i zamalować testerem koloru farby lateksowej, której warstwę spolerujemy pianką melaminową po upływie 2 tygodni od malowania. Dlaczego farba lateksowa? Jest bardzo duża szansa na dobranie koloru dostępnego w małym testerze. Nie dysponując warsztatem, raczej nie bylibyśmy w stanie zrobić gładkiej warstwy standardowego lakieru. Dużą naprawę zrobimy za parę lat.
piątek, października 02, 2015
DIY: Naprawa korozji obudowy pralki
Kupiłem 1,5 roku temu Electroluksa - sensowne programy, relatywnie cicha i mało wibrująca, silnik inwerterowy. Kiedyś Electrolux był synonimem niezawodnej pralki. Nawet robione 7 lat temu we Francji modele były w jeszcze w porządku. Teraz produkcja jest włosko-chińska i ustawiona w łazience pralka potrafi zerdzewieć. Pionowa ścianka jest zgrzewana oporowo z częściami służącymi do poziomego przymocowania i zgrzeiny nie są odporne na korozję. Zgrzewanie i lakierowanie zostawia przestrzenie, w których może penetrować woda. Można wymienić obudowę na nową, ale co z tego, jak zerdzewieje znowu. Ten model ma błędny proces produkcyjny. Wydawać regularnie 500 zł co 1,5 roku nie ma sensu. Chyba, żeby kupić nowego Boscha. Blacha w niemieckim Audi też nie rdzewieje. Alternatywne rozwiązanie: naprawić ściankę samemu za 40 zł za pomocą taśmy malarskiej, pędzelka, papieru ściernego i farby na rdzę Hammerite 0,25l z gwarancją na 8 lat (wszystko dostępne w Leroy Merlin).
piątek, września 18, 2015
Jak przerobić PDF-a z osadzonymi czcionkami na takiego z obiektami budowanymi z krzywych
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.1 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
czwartek, września 17, 2015
Percentiles in HSQLDB
create AGGREGATE FUNCTION PERCENTILES(IN val float, IN flag_return boolean, INOUT buffer float ARRAY, INOUT counter INT)
RETURNS varchar2
CONTAINS SQL
BEGIN ATOMIC
declare i number default 1;
declare stats varchar2(2000) default '';
declare asum float default 0;
declare p0, p50, p90, p99, p100, pavg number default 0;
declare sorted_buffer float ARRAY;
IF flag_return THEN
--call println('PERCENTILES return');
set sorted_buffer = SORT_ARRAY(buffer);
call println('PERCENTILES sorted');
set p50 = sorted_buffer[1];
set p90 = sorted_buffer[1];
set p99 = sorted_buffer[1];
while i <= counter do
begin atomic
--call println('PERCENTILES selection '||i);
set asum = asum + sorted_buffer[i];
if abs(i - round(counter / 2, 0)) < 0.001 then
set p50 = round(sorted_buffer[i], 2);
end if;
if abs(i - round(counter * 9 / 10, 0)) < 0.001 then
set p90 = round(sorted_buffer[i], 2);
end if;
if abs(i - round(counter * 99 / 100, 0)) < 0.001 then
set p99 = round(sorted_buffer[i], 2);
end if;
set i = i+1;
end;
end while;
set p0 = round(sorted_buffer[1],2);
set p100 = round(sorted_buffer[counter],2);
set pavg = round(asum / counter, 2);
--call println('PERCENTILES preparing result');
set stats = 'min='|| p0 || '|p50='|| p50 || '|p90='||p90 || '|p99='||p99 || '|max='||p100 || '|avg='|| pavg;
RETURN stats;
ELSE
IF val IS NULL THEN RETURN NULL; END IF;
IF counter IS NULL THEN SET counter = 0; END IF;
SET counter = counter + 1;
IF counter = 1 THEN SET buffer = ARRAY[val];
ELSE SET buffer[counter] = val; END IF;
RETURN NULL;
END IF;
END
for (select appid, percentiles(mem_pct) as mem_stats, avg(mem_mb) as mem,
percentiles(cpu_pct) as cpu_stats, avg(cpu_cnt) as cpu,
percentiles(gc_millis) as gc_stats from T_VM_STAT group by appid) do
begin atomic
set r = REGEXP_SUBSTRING_ARRAY(mem_stats, '((?<==)[0-9]+[\.\,]*[0-9]*)');
set (p0,p50,p90,p99,p100,pavg)=(to_number(r[1]), to_number(r[2]), to_number(r[3]), to_number(r[4]), to_number(r[5]), to_number(r[6]));
RETURNS varchar2
CONTAINS SQL
BEGIN ATOMIC
declare i number default 1;
declare stats varchar2(2000) default '';
declare asum float default 0;
declare p0, p50, p90, p99, p100, pavg number default 0;
declare sorted_buffer float ARRAY;
IF flag_return THEN
--call println('PERCENTILES return');
set sorted_buffer = SORT_ARRAY(buffer);
call println('PERCENTILES sorted');
set p50 = sorted_buffer[1];
set p90 = sorted_buffer[1];
set p99 = sorted_buffer[1];
while i <= counter do
begin atomic
--call println('PERCENTILES selection '||i);
set asum = asum + sorted_buffer[i];
if abs(i - round(counter / 2, 0)) < 0.001 then
set p50 = round(sorted_buffer[i], 2);
end if;
if abs(i - round(counter * 9 / 10, 0)) < 0.001 then
set p90 = round(sorted_buffer[i], 2);
end if;
if abs(i - round(counter * 99 / 100, 0)) < 0.001 then
set p99 = round(sorted_buffer[i], 2);
end if;
set i = i+1;
end;
end while;
set p0 = round(sorted_buffer[1],2);
set p100 = round(sorted_buffer[counter],2);
set pavg = round(asum / counter, 2);
--call println('PERCENTILES preparing result');
set stats = 'min='|| p0 || '|p50='|| p50 || '|p90='||p90 || '|p99='||p99 || '|max='||p100 || '|avg='|| pavg;
RETURN stats;
ELSE
IF val IS NULL THEN RETURN NULL; END IF;
IF counter IS NULL THEN SET counter = 0; END IF;
SET counter = counter + 1;
IF counter = 1 THEN SET buffer = ARRAY[val];
ELSE SET buffer[counter] = val; END IF;
RETURN NULL;
END IF;
END
for (select appid, percentiles(mem_pct) as mem_stats, avg(mem_mb) as mem,
percentiles(cpu_pct) as cpu_stats, avg(cpu_cnt) as cpu,
percentiles(gc_millis) as gc_stats from T_VM_STAT group by appid) do
begin atomic
set r = REGEXP_SUBSTRING_ARRAY(mem_stats, '((?<==)[0-9]+[\.\,]*[0-9]*)');
set (p0,p50,p90,p99,p100,pavg)=(to_number(r[1]), to_number(r[2]), to_number(r[3]), to_number(r[4]), to_number(r[5]), to_number(r[6]));
środa, czerwca 24, 2015
How to make Tibco BW Designer less ugly on Linux
Install Microsoft web fonts and set these used by Designer to Arial 12 and Lucida Typewriter 12.
Modify designer.tra:
java.extended.properties -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:MaxPermSize=512m -Dswing.defaultlaf=com.jgoodies.looks.plastic.Plastic3DLookAndFeel -Dawt.useSystemAAFontSettings=lcd -Dsun.java2d.opengl=false -Dswing.aatext=true
Modify designer.tra:
java.extended.properties -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:MaxPermSize=512m -Dswing.defaultlaf=com.jgoodies.looks.plastic.Plastic3DLookAndFeel -Dawt.useSystemAAFontSettings=lcd -Dsun.java2d.opengl=false -Dswing.aatext=true
czwartek, maja 14, 2015
org.xml.sax.SAXException: validation error: xsi:type "null" is not validly derived from the allowed type definition - how to communicate with SalesForce from Tibco BW
WSDL defining base object and extensions and using base object with xsi:type in definitions of 'generic' operations is not compliant with standards. Let's try to do some workaround in WSDL:
1. Define on base object. Please not that name "xsi:type" is also not compliant but works in BW.
2. Change type of element in operation definition from base type to xsd:anyType.
and in BW:
3. Create mapper with derived object. Fill it. Inside @type put 'distinguishedNamespacePrefix:TypeName'. Please note that after this attribute BW will need to add empty @xsi:type - do not fill it, this is going to work this way.
4. In process 'Namespace Registry' redefine namespace of derived object using prefix name changed to 'distinguishedNamespacePrefix'. This ensures that our @xsi:type value will have valid namespace prefix.
5. On mapper top level input and also on SOAP call activity click exclamation mark 'Edit Statement'. Check 'Exclude result prefixes'. This in runtime moves all namespace definitions to the XML root. This makes our @xsi:type working due to the fact that xsi is visible from the top to bottom of the XML teee.
6. In SOAP call input mapping use 'Copy-Contents-Of' of derivative object.
Quick note about project validation: Error 'Syntactic error in data: /schema/complexType/attribute/@name: data "xsi:type" is not a valid NCName. A valid example is "_NCname.has-no_colons".' is legitimate and looks bad, but hey - we avoided writing proxy or buying SalesForce adapter!
1. Define
2. Change type of element in operation definition from base type to xsd:anyType.
and in BW:
3. Create mapper with derived object. Fill it. Inside @type put 'distinguishedNamespacePrefix:TypeName'. Please note that after this attribute BW will need to add empty @xsi:type - do not fill it, this is going to work this way.
4. In process 'Namespace Registry' redefine namespace of derived object using prefix name changed to 'distinguishedNamespacePrefix'. This ensures that our @xsi:type value will have valid namespace prefix.
5. On mapper top level input and also on SOAP call activity click exclamation mark 'Edit Statement'. Check 'Exclude result prefixes'. This in runtime moves all namespace definitions to the XML root. This makes our @xsi:type working due to the fact that xsi is visible from the top to bottom of the XML teee.
6. In SOAP call input mapping use 'Copy-Contents-Of' of derivative object.
Quick note about project validation: Error 'Syntactic error in data: /schema/complexType/attribute/@name: data "xsi:type" is not a valid NCName. A valid example is "_NCname.has-no_colons".' is legitimate and looks bad, but hey - we avoided writing proxy or buying SalesForce adapter!
Subskrybuj:
Posty (Atom)





























