sobota, lipca 18, 2009

Android



Cały pulpit działa w fbdev-ie (czysty framebuffer), bez X-ów. Patrząc później na listę procesów można dojść do wniosku, że Android koncepcyjnie bardzo przypomina BeOS-a.





Przeglądanie dużych stron na małym ekranie jest bardzo fajne. W domyślnym widoku widzimy kawałek strony w skali 1:1 mieszczący się na małym ekranie. Po kliknięciu ikony pojawiającej się w dolnym prawy rogu podczas przewijania zawartości strony, dostajemy widok pomniejszonej strony z ramką przedstawiającą wycinek w skali 1:1. Przestajemy ruszać ramką - widzimy standardowej wielkości kawałek strony. Oprócz tego mamy dwie ikony: zoom in, zoom out; możemy ruchem kursora przesuwać zawartość (tak jak w Google Maps).




Sprawdźmy jakiej przeglądarki używamy (na stronie webmaster.helion.pl Pawła Wimmera ze skryptami JS): Mobile Safari. Hmm... Ani Chrome ani Chromium, ale do tych potrzebne byłoby GTK i Xy, których w Androidzie nie ma!



Odpalmy terminal i zobaczmy w BusyBoksie, co jest pod spodem.



Linux 2.6.27, obcięty i raczej bardzo statyczny (niewielka liczba modułów w /lib/modules).



Własny init, tutaj przypomniał mi się BeOS i jego Kity.



Tak wyglądają aplikacje - zmodyfikowana androidowa Java. Sun pewnie nie jest ucieszony.



W GUI mam sieć, a w konsoli nic z tego, wszystko poblokowane.



Patrząc na ps, ma się wrażenie oglądania systemu z mikrojądrem i serwisami. BeOS was cool.

Co jeszcze należy dodać? Cały system korzysta, ze statycznego obrazu skompresowanego squashfs-em, na to nakładka read-write aufs. Ustawienia i artefakty użytkownika zapisywane na karcie SD. Na netbooka system będzie nadawał się doskonale.

sobota, lipca 11, 2009

Spalony kontroler klawiatury i już po laptopie

Laptop się nie włącza, ale świeci się dioda baterii. Rozbieramy obudowę i wyjmujemy płytę główną.



Po przyłożeniu baterii okazuje się, że jeden układ parzy - PC87541V-VTC (NT618G), czyli mamy zwarcie. Niestety układ ma za dużo nóżek i są one za małe, żeby w domowych warunkach go wylutować. Płyta główna jest do wyrzucenia.



A tu zdjęcie GMA945 i Celerona - rozmiary kontrolera grafiki i procesora są zbliżone.

czwartek, lipca 09, 2009

C++ Builder still alive (wersja 2009)

środa, lipca 08, 2009

Duża liczba połączeń w stanie CLOSE_WAIT na Apache'u

W ramach rekomendacji poaudytowych Altkom radzi firmom bezkrytycznie włączać najlepiej wszystkie reguły SmartDefense na firewallu CheckPoint. Gdyby chociaż raz przetestowali to, co proponują, to by wiedzieli, że mogą swoim doradztwem zrobić ludziom bajzel na produkcji.

Zablokowanie połączeń TPC/IP keep-alive realizowane jest w ten sposób, że firewall preparuje pojedyńczy pakiet FIN+ACK, który wysyła do hosta. Host ten liczy, że wyśle ACK-a i dostanie w odpowiedzi FIN+ACK, a po wysłaniu LAST_ACK zamknie połączenie. Tymczasem taka wyminana pakietów nie zachodzi i mamy wiszące połączenia w stanie CLOSE_WAIT. Po pewnym czasie procesy Apache'a strasznie się mnożą, a cały serwis WWW przestaje odpowiadać.

Workaround w httpd.conf:
KeepAlive Off
TimeOut 60

piątek, lipca 03, 2009

SMSGW: mail-sms gateway

Techbase NPE is a device that comes with 180MHz 32-bit ARM processor, 64 MB of RAM, 4MB of writable FLASH memory, SD card reader and Sim600 GSM EDGE modem. Device is handled by Linux 2.6.20 with BusyBox tools, there is JamVM – embedded Java Virtual Machine more or less compatible with Sun JVM 1.4.

Device was chosen to be a part or IT infrastructure monitoring. All alerts are sent to device via SMTP mail protocol and then delivered as a SMS.

Software used for assembling of application:

SMSGW with documentation is avaliable from systest.googlecode.com

To integrate SMSLib I had to port it from Java 1.5 to JamVM 1.4 (note that GNU Classpath doesn't support POSIX extensions to regular expressions), fix SLFJ startup checks and change usage of RXTX to direct way instead of reflection. RXTX used by me didn't have mappings for B115200 and B230400 and I had to look them up in termios.h (file is available in Linux kernel sources), found values should be used in port.setSerialPortParams().

czwartek, czerwca 25, 2009

Workaround na wieszające się serwery Della

Wygląda na to, że serwery Della z 8-mioma rdzeniami Intel Xeon przegrzewają się pod Linuksem. Teoretycznie Xeony mają Thermal Circuit Control, który przy nadmiernym wzroście temperatury powinien spowalniać procesor, ale pod Linuksem nie widać jego działania, widać za to, że serwer wiesza się sprzętowo. Workaround to unikanie niepotrzebnych migracji procesów między rdzeniami, co przy ciągłym (wielodniowym) obciążeniu ~5% załatwia problem:
echo 1 > /sys/devices/system/cpu/sched_mc_power_savings.

piątek, czerwca 19, 2009

Monitoring na sms-a

Kupujemy modem GSM, podłączamy go do linuksowego serwera, stawiamy na serwerze bramkę mail-sms, a potem już tylko:
HOSTNAME=`hostname`
USER=`whoami`
SMTP="10.10.1.25"

function sendmail {
(
sleep 3
echo "HELO $HOSTNAME"
sleep 1
echo "mail from: monitoring@email.com"
sleep 1
echo "rcpt to: smsgw@email.com"
sleep 1
echo "data"
sleep 1
echo "From: monitoring.$USER@email.com"
sleep 1
echo "To: smsgw@email.com"
sleep 1
echo "Subject: $1"
sleep 1
echo ""
sleep 1
echo "$2"
sleep 1
echo "."
sleep 1
echo "quit"
sleep 1
) | telnet $SMTP 25
}

sendmail "$1" "$2"

# ./sendsms "+48602201122" "Brak dzialajacego procesu A dla systemu B"

czwartek, czerwca 18, 2009

Jakim cudem Java ME na komórkach może być szybka?

Procesory ARM miewają natywną obsługę bajtkodu Javy - Jazelle.

Automatyczne testowanie aplikacji webowych

"Przechodzimy" aplikację w Firefoksie wyposażonym w plugin "Live HTTP headers" i kopiujemy dane wysyłane formularzem. Dane te wkleimy potem do linii poleceń wgeta.



Przykładowy skrypt:
WP_URL="http://10.10.1.20:8080/app/AppServlet"
COOKIE="cookie.dat"
WGET_CMD="wget --timeout=15 --keep-session-cookies --save-cookies=$COOKIE --quiet $WP_URL -O -"
> $COOKIE

RUNNING=$(ps uax | grep -c nazwa_skryptu.sh)
[[ $RUNNING -gt 3 ]] && echo "Poprzednie wywolanie skryptu wisi" && exit 1

RES=$($WGET_CMD --post-data="user=jan.kowalski&password=lubieTpsa&action=login" | grep -c "Zalogowany: ")
echo "Test logowania. Wynik: $RES"
RES=$($WGET_CMD --load-cookies=$COOKIE --post-data="action=create-process&action_params=...&state=" | grep -c "Nowy proces")
echo "Zaladowanie procesu. Wynik: $RES"
RES=$($WGET_CMD --load-cookies=$COOKIE --post-data="action=next&action_params=..." | grep -c "Dane zapisano")
echo "Wynik procesu poprawny?: $RES"
RES=$($WGET_CMD --load-cookies=$COOKIE --post-data="action=save-and-close&action_params=..." | grep -c "Zakonczono proces")
echo "Zamkniecie procesu. Wynik: $RES"
RES=$($WGET_CMD --load-cookies=$COOKIE --post-data="action=logout" | grep -c "Wylogowano uzytkownika")
echo "Wylogowanie. Wynik: $RES"

wtorek, czerwca 16, 2009

HostDeny z logów Apache'a

#!/bin/sh
RATE_LIMIT="100"
HOSTS_DENY=".htaccess"
LOG="/home/apache_wp/apache_wp/logs/access_log_443"
DT=$(date +%d/%b/%Y:%k:%M)
PERIODIC_LOG="periodic.log"

cat $LOG | grep "$DT" | grep "SomeServletUrl" | cut -d" " -f1 > $PERIODIC_LOG
echo "### Generated at $DT ###">> $HOSTS_DENY

for ip in $(cat $PERIODIC_LOG | sort -u); do
cnt=$(cat $PERIODIC_LOG | grep -c "$ip");
[[ $cnt -gt $RATE_LIMIT ]] || continue;
echo >> $HOSTS_DENY;
echo "# $ip generated $cnt requests above rate limit $RATE_LIMIT" >> $HOSTS_DENY;
echo "Deny from $ip" >> $HOSTS_DENY;
done;

niedziela, czerwca 14, 2009

OpenESB nightly build

Sun schował je tutaj:
http://download.java.net/jbi/binaries/open-esb-full-install/v2.1/nightly/latest/
http://download.java.net/jbi/binaries/glassfishesb/v2.1/nightly/latest/

[2009-10-11] http://download.java.net/jbi/binaries/installers/single-component/v2.1/nightly/

sobota, czerwca 13, 2009

Upgrade Fedory 10.9x do finalnej 11

W /etc/yum.repos.d wyłączamy fedora-rawhide.repo (Enabled=0), włączamy fedora.repo i fedora-updates.repo oraz wewnątrz tych plików zmieniamy $releasever na 11 i odpalamy yum upgrade.

piątek, czerwca 12, 2009

LicensedCpus.c

Program dedykowany wszystkim dyrektorom IT, którzy nie wiedzą, że software licencjonowany na 2 CPU można uruchamiać na serwerze z 4 CPU.
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <errno.h>
#include <string.h>

int get_num_cpus() {
int cnt = 0;
char *line = NULL;
size_t len = 0;
FILE *fp = fopen("/proc/stat", "r");
if (fp!=NULL) {
while (getline(&line, &len, fp)!=-1) {
if (line!=NULL && strstr(line, "cpu")!=NULL)
cnt++;
}
if (line)
free(line);
fclose(fp);
cnt--;
}
return cnt;
}

int main(int argc, char** argv) {
static cpu_set_t mask;
int user_mask, i=0, max, m=0;

if (argc<3) {
fprintf(stdout, "Usage: %s cpu_mask(int) command(full_path)\n",argv[0]);
exit(0);
}

user_mask = atoi(argv[1]);
max = 1 << (get_num_cpus()-1);
CPU_ZERO(&mask);
for (i=0; i<max; i++) {
if ( (user_mask & (1 << i)) == (1 << i)) {
CPU_SET(i, &mask);
m |= (1<<i);
}
}

if (sched_setaffinity(0, sizeof(mask), &mask)==0) {
fprintf(stdout, "Running %s with mask %d, cpus=%d\n", argv[2], m, max);
return execv(argv[2], argv+2);
}
else {
fprintf(stderr, "Cannot set cpu mask: %s. Effective mask was %d\n", strerror(errno), m);
exit(1);
}
}

sobota, czerwca 06, 2009

Jak GCC dzieli przez 100

mov edx, 600
mov eax, 51EB851Fh ; EAX = 32/100 * 2^32
mul edx
mov eax,edx
shr eax,5 ; EAX = EAX/32

środa, czerwca 03, 2009

Naprawiona biblioteka libIntroscopeRedHatStats.so

Idea poprawki polega na stworzeniu proxy na bibliotekę i własnej implementacji metody getAggregateCPUUsage.

Pozostałe funkcje JNI można prawdopodobnie zaimplementować następująco:

getProcessCPUUsage -> getrusage()
getTotalClockTicks -> clock()
isThreadCpuTimeEnabled -> defined RUSAGE_THREAD
getThreadCpuTime -> getrusage(RUSAGE_THREAD, &usage)

Update: Przepisałem całą bibliotekę, gdyby ktoś chciał binarkę prośba o kontakt.

Memory leak in Wily Introscope

Wygląda na to, że agent Introscope ma wycieki pamięci w natywnym kodzie:
[tomcat@swa158 ~]$ jrcmd 0 print_memusage
18130:
[JRockit] memtrace is collecting data...
[JRockit] *** 0th memory utilization report
(all numbers are in kbytes)
Total mapped ;;;;;;;1192600
; Total in-use ;;;;;;1182252
;; executable ;;;;; 12260
;;; java code ;;;; 7680; 62.6%
;;;; used ;;; 5763; 75.0%
;; shared modules (exec+ro+rw) ;;;;; 4540
;; guards ;;;;; 1056
;; readonly ;;;;; 68
;; rw-memory ;;;;;1177604
;;; Java-heap ;;;; 393216; 33.4%
;;; Stacks ;;;; 22871; 1.9%
;;; Native-memory ;;;; 761516; 64.7%
;;;; java-heap-overhead ;;; 12342
;;;; codegen memory ;;; 904
;;;; classes ;;; 29696; 3.9%
;;;;; method bytecode ;; 2927
;;;;; method structs ;; 3278 (#69939)
;;;;; constantpool ;; 11117
;;;;; classblock ;; 1488
;;;;; class ;; 3060 (#8698)
;;;;; other classdata ;; 4942
;;;;; overhead ;; 280
;;;; threads ;;; 107; 0.0%
;;;; malloc:ed memory ;;; 24265; 3.2%
;;;;; codeinfo ;; 1047
;;;;; codeinfotrees ;; 438
;;;;; exceptiontables ;; 591
;;;;; metainfo/livemaptable ;; 9324
;;;;; codeblock structs ;; 3
;;;;; constants ;; 6
;;;;; livemap global tables ;; 2091
;;;;; callprof cache ;; 0
;;;;; paraminfo ;; 88 (#1284)
;;;;; strings ;; 4991 (#92449)
;;;;; strings(jstring) ;; 0
;;;;; typegraph ;; 1593
;;;;; interface implementor list ;; 48
;;;;; thread contexts ;; 81
;;;;; jar/zip memory ;; 5451
;;;;; native handle memory ;; 39
;;;; unaccounted for memory ;;; 694309; 91.2%;28.61
---------------------!!!

16612:
[JRockit] memtrace is collecting data...
[JRockit] *** 0th memory utilization report
(all numbers are in kbytes)
Total mapped ;;;;;;;1192932
; Total in-use ;;;;;;1181960
;; executable ;;;;; 12004
;;; java code ;;;; 7424; 61.8%
;;;; used ;;; 5796; 78.1%
;; shared modules (exec+ro+rw) ;;;;; 4540
;; guards ;;;;; 1068
;; readonly ;;;;; 68
;; rw-memory ;;;;;1177312
;;; Java-heap ;;;; 393216; 33.4%
;;; Stacks ;;;; 23003; 2.0%
;;; Native-memory ;;;; 761092; 64.6%
;;;; java-heap-overhead ;;; 12342
;;;; codegen memory ;;; 592
;;;; classes ;;; 28928; 3.8%
;;;;; method bytecode ;; 2911
;;;;; method structs ;; 3256 (#69475)
;;;;; constantpool ;; 10845
;;;;; classblock ;; 1441
;;;;; class ;; 2938 (#8350)
;;;;; other classdata ;; 4923
;;;;; overhead ;; 61
;;;; threads ;;; 109; 0.0%
;;;; malloc:ed memory ;;; 24479; 3.2%
;;;;; codeinfo ;; 1019
;;;;; codeinfotrees ;; 420
;;;;; exceptiontables ;; 585
;;;;; metainfo/livemaptable ;; 9489
;;;;; codeblock structs ;; 3
;;;;; constants ;; 7
;;;;; livemap global tables ;; 2183
;;;;; callprof cache ;; 0
;;;;; paraminfo ;; 89 (#1288)
;;;;; strings ;; 4997 (#92452)
;;;;; strings(jstring) ;; 0
;;;;; typegraph ;; 1527
;;;;; interface implementor list ;; 47
;;;;; thread contexts ;; 82
;;;;; jar/zip memory ;; 5451
;;;;; native handle memory ;; 41
;;;; unaccounted for memory ;;; 694751; 91.3%;28.38
---------------------!!!

[tomcat@swa158 ~]$
Tomcaty są skonfigurowane z -Xmx384M a pamięć wirtualna (VSZ) dla procesu po dwóch tygodniach wynosi 1192MB, RSS 900MB. Czyli o 500-800MB za dużo. Sama diagnostyka JRockita pokazuje unaccounted for memory 91.3%. Ta sama aplikacja chodząca bez Wily’ego zachowuje się poprawnie. Średnio na dzień wycieka około 50MB pamięci.
W rezultacie po pewnym czasie na produkcji wchodzimy w swapa (co już Wily pokazuje jako wydłużenie się requestów). Jedyne rozwiązanie to cotygodniowy restart tomcatów.

Wyciek mamy w natywnym kodzie. Znajdźmy jakieś natywne biblioteczki:
tomcat@swa175:~/tomcatDiag1/wily> find . -name *.so
./ext/libIntroscopeAIX4PSeries32Stats.so
./ext/libIntroscopeSolarisSparc64Stats.so
./ext/libIntroscopeRedHatStats.so
./ext/libIntroscopeHpuxParisc32Stats.so
./ext/libIntroscopeSolarisSparc32Stats.so
./ext/libIntroscopeSolarisAmd64Stats.so
./ext/libIntroscopeAIX52PSeries64Stats.so
./ext/libIntroscopeAIX53PSeries64Stats.so
./ext/libIntroscopeSolarisAmd32Stats.so
./ext/libIntroscopeHpuxItaniumStats.so
./ext/libIntroscopeAIX5PSeries32Stats.so
./ext/libIntroscopeAIX4PSeries64Stats.so

Zobaczmy jaki kod Javy odwołuje się do libIntroscopeRedHatStats.so:
tomcat@swa175:~/tomcatDiag1/wily> nm ./ext/libIntroscopeRedHatStats.so | grep Java
000015e2 T Java_com_wily_introscope_agent_platform_linux_LinuxPlatformStatisticsBackEnd_getAggregateCPUUsage
0000158e T Java_com_wily_introscope_agent_platform_linux_LinuxPlatformStatisticsBackEnd_getParentProcessID
000011c6 T Java_com_wily_introscope_agent_platform_linux_LinuxPlatformStatisticsBackEnd_getProcessCPUUsage
0000153a T Java_com_wily_introscope_agent_platform_linux_LinuxPlatformStatisticsBackEnd_getProcessID
00001524 T Java_com_wily_introscope_agent_platform_linux_LinuxPlatformStatisticsBackEnd_getProtocolVersion
000017a0 T Java_com_wily_introscope_agent_platform_linux_LinuxPlatformStatisticsBackEnd_getThreadCpuTime
0000148a T Java_com_wily_introscope_agent_platform_linux_LinuxPlatformStatisticsBackEnd_getTotalClockTicks
0000152e T Java_com_wily_introscope_agent_platform_linux_LinuxPlatformStatisticsBackEnd_init
00001796 T Java_com_wily_introscope_agent_platform_linux_LinuxPlatformStatisticsBackEnd_isThreadCpuTimeEnabled
00001534 T Java_com_wily_introscope_agent_platform_linux_LinuxPlatformStatisticsBackEnd_term

Zdekompilujmy JAD-em LinuxPlatformStatisticsBackEnd.class i poszukajmy podejrzanych metod ze słowem kluczowym native:
private native long[] getAggregateCPUUsage(String s)
throws PlaformStatUnavailableException;

Założę się, że char* wyjęte ze Stringa javowego nie jest zwalniane.

Podłączamy IBM JDK z parametrem -Xcheck:jni:all i widzimy:

JVMJNCK071W JNI warning: Memory at 0x080C22A0 acquired by GetStringUTFChars was not released before returning from native. This is probably a memory leak.
JVMJNCK078W Warning detected in com/wily/introscope/agent/platform/linux/LinuxPlatformStatisticsBackEnd.getAggregateCPUUsage(Ljava/lang/String;)[J

czyli Wily faktycznie ma wycieki pamięci. Shame on you CA!

Summary: One of Wily native libraries has improper interactions with Java VM via JNI - it doesn't free memory used for accessing Java strings. I have rewritten the library - sources and binary .so file are avalilable here (archive is protected with password).

czwartek, maja 28, 2009

Eurowybory

Będę głosował na człowieka z zasadami, który nie zmienia poglądów jak chorągiewka na wietrze, nie nakradł się, nie naoszukiwał. A okręgi wyborcze powinny być jednomandatowe.

środa, maja 27, 2009

Haszowanie PESELu

public class PH {

private static byte[] hash(String in, String key) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(key.getBytes());
return md.digest(in.getBytes());
}

private static String fillNumber(String s, int len) {
while (s.length() < len)
s = "0"+s;
return s;
}

private static String byte2String(byte[] b, int len) {
StringBuffer sb = new StringBuffer();
for (int i=0; i < Math.min(b.length, len); i++) {
int c = '0' + (b[i] & 0xff)%10;
sb.append((char)c);
}
return sb.toString();
}

public static void main(String[] args) throws Exception {
HashMap<String, String> map = new HashMap<String, String>();
int hc = 0;
for (int i=0; i < 100000; i++) {
String pesel = "721028" + fillNumber(i+"", 5);
String hash5 = byte2String( hash(pesel, "random123!"), 10);
if (map.get(hash5)!=null) {
System.err.println("Kolizja dla peselu "+pesel+" => "+hash5 + " => "+map.get(hash5));
hc++;
}
else
map.put(hash5, pesel);
}
System.err.println("Kolizji: "+hc);
}
}

Haszowanie PESELu ma być częściowe, czyli nie zmieniamy daty urodzenia, a tylko 5 ostatnich cyfr. Jeżeli ze standardowo zahaszowanego stringu z peselem wybierzemy poniżej 10 znaków (z 16) jako klucz, to mamy kolizje. Ponad 36000 na 100000 dla 5 znaków.

Workaround:
CREATE OR REPLACE
PROCEDURE HASH_OSOBY AS
type ROWID_TAB is table of rowid index by binary_integer;
collisions rowid_tab;
collisions_cnt number := 0;
passes number := 0;
key varchar2(4000) := 'klucz1';
err varchar2(4000) := '';
BEGIN
dbms_output.disable;
for rec in (select rowid from monitor.os) loop
begin
update monitor.os set pesel = haszujpesel(pesel, key) where rowid=rec.rowid;
exception when others then
collisions_cnt := collisions_cnt+1;
collisions(collisions_cnt) := rec.rowid;
err := SQLERRM;
insert into log_h(T,LOG) values(sysdate(),err);
end;
end loop;

insert into log_h(T,LOG) values(sysdate(), 'Pass '||passes||', number of collisions: '||collisions_cnt);
while collisions.count > 0 loop
key := key||key;
for i in collisions.first..collisions.last loop
begin
update monitor.os set pesel = haszujpesel(pesel, key) where rowid=collisions(i);
collisions.delete(i);
exception when others then
err := SQLERRM;
insert into log_h(T,LOG) values(sysdate(),err);
end;
end loop;
passes := passes + 1;
collisions_cnt := collisions.count;
insert into log_h(T,LOG) values(sysdate(), 'Pass '||passes||', number of collisions: '||collisions_cnt);
end loop;
END HASH_OSOBY;

Kończąc niniejsze rozważania należy powiedzieć, że w ramach ochrony danych osobowych dane testowe powinny zawierać w pełni zahaszowane PESELe, a o spójność PESELi z datami urodzenia po zahaszowaniu powinien zadbać autor bazy.

wtorek, maja 19, 2009

Fedora 11 rulez


  • PrintScreen wreszcie działa (wywołuje ksnapshot)
  • Sysinfo pokazuje temperaturę CPU
  • Filmy z tvp.pl działają (rpmfusion + xinelib*)
  • yum install kadu - w standardzie
  • yum install eclipse

piątek, maja 15, 2009

java.sql.ResultSet over DOM

Taki wrapper pozwala zachować stary kod operujący tylko na strukturach bazodanowych (rs.getInt...) i jako źródła danych używać obiektów zserializowanych do XML-a.

Node g = DOMHelper.getElementsByTag(p, "group-list").get(0);
rs = new DOMResultSet(g);
while (rs.next()) { // iteracja po węzłach poniżej group-list
// obiekt z wezła group
Group g = Group.fromResultSet(rs);
// w group wskazujemy węzły group-attrib
if (rs.findColumn("group-attrib")>0) {
while (rs.next()) {
GroupAttrib ga = GroupAttrib.fromResultSet(rs, g);
}
rs.refreshRow(); // kasujemy wskazanie
}
Debug.println("Wczytano "+rs.getString("."),this);
// "." oznacza biężący węzeł do zwrócenia jako string XML
}

piątek, maja 08, 2009

17W zużycia energii na mobilnym Athlonie i z GeForce 9100



Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
Option "RegistryDwords" "PowerMizerLevel=0x1"
Option "Coolbits" "1"
EndSection
Sterowniki to 185.18.08 beta. Czyli poprzedni krótki czas pracy na baterii to była wina NVidii.

czwartek, maja 07, 2009

Windows 7 dla użytkowników W2K3



Da się zrobić, żeby wyglądało po staremu.

Ciekawostka: szybka zmiana rozmiaru osadzonego okna w Przeglądarce Zdarzeń powoduje wywalenie się mmc.exe. Trochę obciach jak na Release Candidate. Nie czuć optymalizacji GDI.

sobota, kwietnia 25, 2009

Oracle Workshop for WebLogic 10.3 pod Linuksem

W przypadku wywalania się aplikacji na starcie należy wyedytować plik /bea/workshop_10.3/workshop.ini dodając linię:
-Dorg.eclipse.swt.browser.XULRunnerPath=/usr/lib/xulrunner-1.9 z poprawną ścieżką do XULRunnera.

Do Oracle Service Bus przydałyby się jakieś testowe WebService'y - są np. tutaj.

wtorek, kwietnia 21, 2009

Sun Fuji Milestone 5

Lekkie ESB techniczne (czyli w zasadzie sama warstwa routingu), w którym przepływy można wyklikać w przeglądarce. Do dyspozycji są adaptery: bazodanowy, http, jms, rss, ftp, email. Proste transformacje komunikatu mogą być dokonowywane przez węzły serwisowe JRuby.



Kiedy kontrolka JDBC będzie obsługiwać Oracle'a, będzie można zacząć myśleć o praktycznych zastosowaniach.

poniedziałek, kwietnia 20, 2009

Oracle buys Sun

No to teraz będą mieć trzy różne serwery aplikacyjne, dwie różne maszyny wirtualne i 2.5 ESB. Najważniejszym aspektem całego newsa jest to, że będą mieć system operacyjny i hardware, na którym najlepiej działa baza danych. Ultimate end user solution: SPARC + Solaris + Oracle 11g.

piątek, kwietnia 17, 2009

JRockit Mission Control

Śledzimy fragmentację...
JAVA_OPTS="-Xms384M -Xmx384M -Xmanagement:ssl=false,authenticate=false,autodiscovery=true"
JROCKIT_OPTS="-Xgc:genpar -XXcompactRatio:100"
JROCKIT_OPTS="-Xgc:singlecon -Xns32m -XXcompactRatio:100 -XXtlaSize:min=128K,preferred=512K -XXlargeObjectLimit=128K"



jrcmd 0 start_management_server
jrcmd 0 start_rmp_server

wtorek, kwietnia 14, 2009

Proxy na program

#include <windows.h>
#include <process.h>

int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)

{
char* argv[32];
for (int i=0; i < 32; i++)
argv[i] = 0;

int argp = 2;
char *args = lpszArgument;
while(*args!=0) {
if (*args==' ') {
argv[argp++] = ++args;
args[-1] = 0;
}
}
argv[0] = "AppToFilterArgs.exe";
argv[1] = args;
return execv("AppToFilterArgs", argv);
}

Można prościej z ShellExecute(0, "open", "AppToFilterArgs.exe", args, NULL, SW_SHOW); albo bardziej skomplikowanie z CreateProcess. Pierwszy kod jest pod Windowsem blokujący - proces główny czeka na zakończenie AppToFilterArgs.exe (podobno _execv w oryginalnym VisualStudio 2005+ jest polecane jako zgodne ze standardem POSIX, jak tak dalej pójdzie to nie będzie już można polegać na błędach w oprogramowaniu MS...).

poniedziałek, kwietnia 13, 2009

G DATA AntiVirus 2010

W porównaniu do wersji 2009 zostały zmienione ustawienia silnika BitDefender (włączona analiza behawioralna), w ramach cloud security (czyli heurystyka sieciowa jak w Artemizie) podejrzane pliki wysyłane są do analizy. Zmieniło się GUI.



Oryginalny BitDefender 2009 ma funkcjonalność sprawdzania, czy zainstalowane oprogramowanie (Windows, przeglądarki internetowe, itp.) są w najnowszych załatanych wersjach.



niedziela, kwietnia 12, 2009

Analiza zmian po instalacji

Narzędzie TrackWinstall pozwala na porównanie stanu systemu sprzed instalacji danego programu ze stanem po instalacji. Narzędzie analizuje Rejestr oraz katalogi Windows i Documents and Settings. Żeby porównać inne katalogi można posłużyć się narzędziem junction od SysInternals i w katalogu Windows stworzyć hardlinka.

sobota, kwietnia 11, 2009

Jak włączyć McAfee Artemis w VirusScan Enterprise 8.7

Artemiza to nazwa dla technologii weryfikującej wskazania heurystyki po stronie serwera AVERT Labs. Obecnie włącza się ją oddzielnie dla każego komponentu: skanowanie na żądanie, skanowanie poczty, skanowanie przy dostępie. Pierwsze dwa załatwia zakładka wydajność:


Artemizę dla skanowania On Access włącza się w rejestrze w HKLM/Software/McAfee/VSCore/On Access Scanner:



Jak to działa? 50 klientów dobijało się do serwera z zapytaniem o plik trojan.exe o rozmiarze 256101 z pewną liczbą punktów dostarczoną przez analizę heurystyczną (liczba ta jednak była za mała do zaliczenia pliku do malware). 51 zapytanie dostanie odpowiedź, że to niebezpieczny plik, czyli zagrożenie Generic!Artemis.

SunBelt VIPRE

SunBelt ma własnego antywirusa. Firma twierdzi, że produkt jest szybki, nie wymagający dużo zasobów i ma bardzo dobrą wykrywalność. Subiektywnie rzecz biorąc działającej w tle Ochrony Aktywnej nie czuć, wszystkie komponenty zużywają 36MB RAM-u, zaś definicje wirusowe bazują na przepakowanych bazach Kaspersky'ego (plus wkład własny firmy SunBelt). Wygląda na to, że mamy fajnego antywirusa.




piątek, kwietnia 10, 2009

AntiVirenKit 2009

AVK miał parę lat temu dwa silniki: AVP i RAV. Po wykupieniu firmy GeCAD przez Microsoft, G DATA zmieniło drugi silnik na BitDefendera. I generalnie wszyscy byli/są przekonani że w AntiVirenKicie są silniki Kaspersky'ego i BitDefendera. Okazuje się jednak, że w wersji 2009 jest Avast i BitDefender (nazwane jako AV A i AV B)! Można to zobaczyć w Common Files\G DATA\AVKScanP.



Wersja korporacyjna ma Avasta i F-Prota. Kiedy ostatni raz robiłem testy antywirusów F-Prot był bardzo szybki, dzięki prostym sygnaturom, ale miał słabą heurystykę. BitDefender był pod względem wykrywalności mutacji lepszy. Teoretycznie komputer do pracy biurowej bywa słabszy od domowego, przeznaczonego do gier i dlatego powinien mieć antywirusa mniej spowalniającego system, ale czy wraz ze wzrostem wydajności musi spadać wykrywalność?



Skaner sieciowy (proxy) jest fajny.

Skaner plików ma prawdziwy wielowątkowy silnik pisany pod procesory wielordzeniowe. Domyślny priorytet skanera jest wysoki. W rezultacie na laptopie z odpalonym skanowaniem całego systemu czuć zapach prawie topiącego się plastiku. Szybkie obejście problemu to zmniejszenie priorytetu procesu AVK.exe i ustawienie maski afiniczności CPU za pomocą
Task Managera.

wtorek, kwietnia 07, 2009

BeOS is alive

Haiku pre-alpha. To by było genialne na netbooki.



Działa w VirtualBoksie 2.2, dysk VMDK.

poniedziałek, kwietnia 06, 2009

Jak wywalić JVM

import sun.misc.Unsafe;

public final class EvilCode {

public final static Unsafe getUnsafe () {
try {
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
return (Unsafe)field.get(null);
}
catch (Exception ex) {
throw new RuntimeException("can't get Unsafe instance", ex);
}
}

public final static void main(String[] args) {
Unsafe u = getUnsafe();
Random r = new Random();
for (int i=0; i < 1000000; i++) {
u.setMemory(r.nextLong(), 1L, (byte)0x0);
}
}
}

#
# An unexpected error has been detected by Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0xb7df628a, pid=7635, tid=3084217232
#
# Java VM: Java HotSpot(TM) Client VM (11.0-b16 mixed mode, sharing linux-x86)
# Problematic frame:
# C [libc.so.6+0x7528a] memset+0x1a
#

niedziela, kwietnia 05, 2009

Jak zrobić chmurę Java EE

Ja bym to zrobił tak:
  • Całość w oparciu o maszyny wirtualne VirtualBox odpowiednio z bazą Oracle XE, Postgresem i serwerem aplikacyjnym Apache Geronimo. Wirtualki byłyby tworzone z szablonów.
  • Środowisko deweloperskie (też wirtualne) na OpenSUSE 11.1 dostępne z apletu Javy w oknie przeglądarki bazujące na XRDP.
  • Ponieważ klient mógłby mieć parę wirtualek, to do usprawnienia autoryzacji wszystkie systemy podpięte byłyby do LDAP-a, na tej samej maszynie byłby SVN.
  • Na koncie użytkowika ustawiona by była qouta na fs, cpu, mem.
  • Interfejs do zarządzania infrastrukturą byłby zrobiony w Grailsach.
  • Wirtualki mogłyby wystawiać WebService'y dostępne z zewnątrz poprzez Apache ProxyPass.
  • Sewery: jeden na LDAP + SVN + Grails GUI + ProxyPass, następne hostujące konta użytkowników i maszyny wirtualne.
  • GUI w Grailsach przy okazji wystawiałoby serwisy, z których korzystałby bajerancki plugin do Eclipse'a.
Wersja beta szacowana na 2 osobomiesiące (z czego plugin do Eclipse'a 1 osobomiesiąc).
Skoro to takie proste, to teraz wszyscy zaczną oferować nam chmury...

Aptana Cloud

Wersja najtańsza oferuje 256MB i 5GB na MySQL-a i Tomcata-a. W wersji trial zużycie swapa wynosiło 40%, a z logów tomcata wynikało, że parę razy miał za mało pamięci, żeby wstać. Tną koszty. Całość działa w oparciu o kontenery Solaris-a 11. Mój kolega znający się na serwerach twierdzi, że ten cały cloud computing to nowa nazwa marketingowa na hosting, przy czym hosting jest tańszy. Patrząc na ofertę Aptany, przyznaję mu rację.











środa, kwietnia 01, 2009

Prawie niewidoczna autentykacja NTLM dla Acegi

Zrobiłem plugin NTLM zanim jeszcze SpringSecurity miał obsługę tej autentykacji. Założenie jest proste: korzystając z jCIFS i hasza dostarczonego przez IE logujemy się do kontrolera domeny. Jeśli autentykacja powiodła się to w formatce logowania zamiast hasła ustawiamy specjalny token sprawdzany po drugiej stronie przez plugin. Oprócz NTLM dodatkową autoryzacją jest LDAP (żeby na czyimś koncie windowsowym zalogować się jako inny użytkownik). Udostępniam przykładowy projekt, ponieważ w konfiguracji Grails 1.1 + Acegi 0.5 dostarczona przez Spring-a autoryzacja nie chce działać.

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.