[GiM logo]gim.org.pl is down || odświeżony jogger (v.0.4) GiMa

gim photo
Michał 'GiM' Spadliński
programowanie, google, *nix, av, re
last buzz

mini:
  • The Cambist and Lord Iron

    by Daniel Abraham for free @issuu or @POD Castle.

  • Dark Side of C++

    [link]

  • Lost

    No i koniec.

  • Vista vs Open / Save As Dialog Box

    Zdaje się, że od XP 'Save As' i 'Open' pamiętają folder, gdzie ostatnio się pracowało. Jest to dość irytujące w z zachowaniem, do którego większość się chyba przyzwyczaiła, gdzie dialogi te startują w aktualnym katalogu.

    Żeby to zmienić w Viście, wystarczy odebrać sobie prawa do odczytu klucza: HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\comDlg32\LastVisitedPidlMRU. To pewnie nie jest najlepszy sposób, ale dla aplikacji z których korzystam DZIAŁA :P

  • Holy fsckin cow

    Zastanawiam się, dlaczego nie wygooglałem tego wcześniej: Speed up powershell startup

  • numery tygodni w Google Calendar

    Nie wiem czy da się to zrobić, jakoś prościej, w każdym razie znalazłem takie fajne coś: google calendar week numbers

  • xps przykłady dokumentów
    Może komuś się przyda: klik
  • D tutorials
    Kilka video tutoriali o podstawach D, różnych edytorach instalacji dmd, tango.
  • niech mi z oczu zejdą

    Każdy problem ma rozwiązanie,
    jeśli nie ma rozwiązania, to nie ma problemu, nie ma problemu

    Ej, człowieku to jest przecież jakiś horror,
    to nie tędy dróżka, jeśli chcesz żeby jakaś fróźka
    poszła z tobą do ee kina

  • powershell - path

    Do zapamiętania:
    PS> $env:path
    PS> $env:path = $env:path + ";c:\blah"

  • Jakiś czas temu...
    ...napisałem, że Programowanie Uogólnione (generic programming), brzmi syfnie, wycofuję się z tego zarzutu, po pierwsze sam zaczynam stosować to sformułowanie, poza tym po dłuższym namyśle brzmi całkiem nieźle, na pewno lepiej niż 'programowanie generyczne', także trochej, zwracam honor : )
  • Kimya Dawson - Loosy Lips
    we won't stop until somebody calls the cops
    and even then we'll start again and just pretend that
    nothing ever happened

Szorty gima (obsolete):
loading...
23
styczeń-2011
182350

Jakiś czas temu potrzebowałem napisać małą aplikację, która pozwoliłaby mi na wysyłanie maili poprzez MS Exchange 2007. Udostępnie on po SOAPie api które się zwie EWS (Exchange Web Services)

Głównym celem było zrobienie tego możliwie szybko.
Najpierw próbowałem biblioteki do obsługi SOAPa w pythonie python-suds.
Po kilku problemach na wstępie (których już dokładnie nie pamiętam) i chwili googlania, znalazłem coś co się zwie suds-ews, czyli teoretycznie suds ze wsparciem dla EWS.

Z tego co pamiętam dorzucając python-ntlm i korzystając potem z suds.transport.windows udało się nawet połączyć z serwerem exchange'a, ale wyglądało na to, że ten suds-ews, niezbyt obsługuje typy tablicowe, które EWS sobie definiuje, a przynajmniej ja nie miałem pojęcia jak z nich skorzystać.

Skończyło się na tym, że odpaliłem Visuala i napisałem krótki program, który robi to co trzeba.
Najpierw trzeba wygenerować Proxy, można to zrobić przy użyciu narzędzia wsdl, ja to robiłem z poziomu Visuala, opis jest tutaj.
Istotna informacja, która dla SOAPowców pewnie jest dość oczywista, dla mnie nie była :> : przy tworzeniu Proxy w Visualu należy podawać ścieżkę do /EWS/Services.wsdl, a w kodzie ściężkę do /ews/Exchange.asmx

Nie ukrywam, że nie znam C#, ale mając przykłady napisanie aplikacji nie było zbyt problematyczne.
Celowo wykomentowałem własny callback do sprawdzania certyfikatu, głównie po to, by móc odpalić to pod mono (o tym za chwilę) bez konieczności weryfikacji CRL.
Aplikacja jako argument bierze nazwę pliku który będzie wysłany, pierwsza linijka jest traktowana jako temat wiadomości, dodatkwo potrzebuje pliku config.txt o skomplikowanej postaci:

  • recipients = one@foobar.com, two@foobar.com

Kod jest tu: Ews.cs.
Należy sobie zmodyfikować usera, hasło, domenę i hostname w CreateBinding() (Wszystkie metody są statyczne, bo jak już wspomniałem, jestem leniwy ;p).

Próbowałem wygenerować Proxy, używając narzędzia wsdl, które przychodzi z mono, ale aktualnie nie działa, bug odnośnie tego wisi półtora roku.
Jeżeli jednak mamy Proxy wygenerowane w Visualu, to można powyższą aplikację skompilować i odpalić w mono

  • mono-csc -r:System.Web.Services.dll Ews.cs Web\ References/ExchangeWebServices/Reference.cs

Certyfikat który przychodzi z serwera, nie musi zawierać certyfikatu root'a, więc najlepiej jest dodać ręcznie certyfikat dla CA, którym podpisany jest certyfikat serwera Exchange. W moim przypadku Thawte Premium Server CA

  • wget https://www.thawte.com/roots/thawte_Premium_Server_CA.pem -O root.cer
  • certmgr -add -c Trust root.cer
  • mono Ews.exe listaOdbiorcow.txt

Rozszerzenie certyfikatu ma znaczenie, certmgr, nie łyknie rozszerzenia .pem

catz: [kom.puterowe] [micr.osoft] [pro.gramowanie] [Techblog]
tagz: [C#] [EWS] [Exchange 2007] [Exchange Web Services] [certmgr] [mono] [python-suds] [send e-mail] [suds-ews]
Dodaj swoją opinię
02
listopad-2010
090124

...that you might need to know or maybe just forgot

This will be a bit long, longer then I initially expected.
First let's have a look at typical table-based CRC-32 implementation:

  1. uint32_t calcCrc32(const uint8_t *buf, size_t len) {
  2.     uint32_t rCrc = 0xffffffff;
  3.     size_t n;
  4.     for (n = 0; n < len; ++n) {
  5.         rCrc = crc_table[(rCrc ^ buf[n]) & 0xff] ^ (rCrc >> 8);
  6.     }
  7.     return rCrc ^ 0xffffffff;
  8. }

This is similar to the implementation that can be found in PNG Specification
But for a few experiments the following implementation will be more suitable. The only difference, is that instead of using constant values of 0xffffffff, we'll pass them as function arguments.

  1. uint32_t crc32(const void* buf, size_t bufLen, uint32_t initial, uint32_t final) {
  2.     const uint8_t* data = (const uint8_t*)buf;
  3.     uint32_t rCrc = initial;
  4.     for (size_t i = 0; i < bufLen; ++i) {
  5.         uint32_t bytesCrc = crcTable[(rCrc ^ data[i]) & 0xff];
  6.         rCrc = (rCrc >> 8) ^ bytesCrc;
  7.     }
  8.     return rCrc ^ final;
  9. }

As you probably know CRC is the remainder polynomial resulting from 'dividing' shifted message's polynomial by some chosen generetor polynomial.
(I'll be talking about 32-bit CRC and I was using the same polynomial that png uses 0xedb88320, but the polynomial itself doesn't change anything that's discussed below.)

The need of preset

Normally to get the remainder crc would be called like: crc32(buffer, buLen, 0, 0). But this causes two problems.
First problem is that if you prepend the message with any number of zeroes it won't change the resulting reminder, because this will prepend message polynomial with some 0 coefficients, and that obviously won't change the reminder itself.
Below is an example. It creates such messages, calculates crcs and prints them.

  1. uint8_t mesg[12] = { 0 };
  2. size_t len;
  3. for (len = 0; len < 10; ++len) {
  4.     if (len) mesg[len-1] = 0;
  5.     mesg[len] = 0xa5;
  6.     c1 = crc32 (mesg, len+1, 0, 0);
  7.     printf ("%2d %#08x\n", len+1, c1);
  8. }

And the results:

  1. 1 0xa6bc5767
  2. 2 0xa6bc5767
  3. 3 0xa6bc5767
  4. 4 0xa6bc5767
  5. 5 0xa6bc5767
  6. 6 0xa6bc5767
  7. 7 0xa6bc5767
  8. 8 0xa6bc5767
  9. 9 0xa6bc5767
  10. 10 0xa6bc5767

This is solved by preseting the CRC, but before we'll get to that, let's discuss the second problem.

The need of post-invert

Instead of calculating the CRC on some buffer and then verifying it, it's easier to append CRC after the message, calculate CRC of this new message, the result should be 0.
(It's quite easy to understand why it's so, but guys at this wiki page already did that, so I'm not going to duplicate it :))
Here's an example:

  1. uint8_t mesg[12] = { 0 };
  2. size_t len;
  3. /* fill the buffer with some dummy data */
  4. for (len = 0; len < 6; ++len)
  5.     mesg[len] = len;
  6.  
  7. /* appending crc */
  8. c1 = crc32 (mesg, 6, 0, 0);
  9. *(uint32_t*)(mesg+6) = c1;
  10.  
  11. printf ("10 %#08x\n", crc32(mesg, 10, 0, 0));

This brings us to the second problem, if we append any zeroes to message constructed as above, the reminder will still be 0.
And because mesg above has size of 12, and it's initially filled with zeroes, the following two lines, will also print 0x00000000 as a resulting CRC

  1. printf ("11 %#08x\n", crc32(poly, 11, 0, 0));
  2. printf ("12 %#08x\n", crc32(poly, 12, 0, 0));

That's also quite easy to understand. If the resulting reminder is 0 it means that the message polynomial was multiple of our generator, so appending any number of zero coefficients will give a new message that is still mutiple of a generator

Post-invert

The second problem is usually 'fixed' by negating CRC result. In this case that will be calling: crc32(buffer, buLen, 0, 0xffffffff)
So let's fix last example by appending negated CRC:

  1. c1 = crc32 (mesg, 6, 0, 0xffffffff);
  2. *(uint32_t*)(mesg+6) = c1;
  3. printf ("inverted crc: %08x\n", c1);

Of course now the calculation of CRC for that new message won't return 0, so we should calculate the CRC for the first 6 bytes and compare it with appended CRC or... we could calculate so called reciprocal polynomial and as before calculate the CRC for whole the message and compare it with our reciprocal

  1. /* calculate reciprocal polynomial */
  2. uint32_t test = 0xffffffff;
  3. c1 = crc32 (&test, sizeof(test), 0, 0xffffffff);
  4. printf ("reciprocal: %08x\n", c1);
  5.  
  6. printf ("10 %#08x\n", crc32(poly, 10, 0, 0xffffffff));
  7. printf ("11 %#08x\n", crc32(poly, 11, 0, 0xffffffff));
  8. printf ("12 %#08x\n", crc32(poly, 12, 0, 0xffffffff));

And here are the results, as you can see the calculated CRCs are no longer the same.

  1. reciprocal: 0x2144df1c
  2. 10 0x2144df1c
  3. 11 0xc622f71d
  4. 12 0xb1c2a1a3

Preset to -1

Now back to the first problem which is usually 'fixed' by preseting CRC to -1 (0xffffffff) instead of 0.
This is equivalent to the calling: crc32(buffer, bufLen, 0xffffffff, 0). The following code is almost identical to the first one presented, the only difference is using the preset value in call to crc32.

  1. uint8_t mesg[12] = { 0 };
  2. size_t len;
  3. for (len = 0; len < 10; ++len) {
  4.     if (len) mesg[len-1] = 0;
  5.     mesg[len] = 0xa5;
  6.     c1 = crc32 (mesg, len+1, 0xffffffff, 0);
  7.     printf ("%2d %#08x\n", len+1, c1);
  8. }

And coresponding results:

  1. 1 0x8b414715
  2. 2 0x189aba67
  3. 3 0xa602718a
  4. 4 0x78077784
  5. 5 0x9f615f85
  6. 6 0xe881093b
  7. 7 0xc42f77e6
  8. 8 0x3c6177f1
  9. 9 0xbf4abc36
  10. 10 0xbac9c0ee

Preset and post-invert

Preset and post-invert are usually used together. First important observation is that 0xffffffff becomes fixed point of a crc32

  1. test = 0xffffffff;
  2. c1 = crc32(&test, sizeof(test), 0xffffffff, 0xffffffff);
  3. printf ("fp : %#08x\n", c1);

0xffffffff is printed to the screen. As you've probably noted this is also reciprocal.
Now take a look at crc32 function, now back here, now back at crc32 function, now back here. Just before returning the value it's xored with 0xffffffff value (or you can say inverted).
That tells us, that after finishing the loop, the value of rCrc variable had to be 0.
That isn't too good, because it basically means, that we can again append any numbers of zeroes, after that value and the result won't change

  1. uint8_t mesg[12] = { 0 };
  2. size_t len;
  3.  
  4. *(uint32_t*)(mesg) = 0xffffffff;
  5. for (len = 4; len < 10; ++len) {
  6.     if (len > 4) mesg[len-1] = 0;
  7.     mesg[len] = 0xa5;
  8.     c1 = crc32 (mesg, len+1, 0xffffffff, 0xffffffff);
  9.     printf ("%2d %08x\n", len+1, c1);
  10. }

Final stuff

...or because we know that reciprocal has the same value, we can append calculated CRC after the message. We need to negate the calculated CRC first. Here's the thing:

  1. memset(poly, 0, sizeof(poly));
  2.  
  3. /* prepare dummy buffer */
  4. for (len = 0; len < 5; ++len)
  5.     poly[len] = len+66;
  6.  
  7. /* add NEGATED crc */
  8. c1 = crc32 (poly, 5, 0xffffffff, 0xffffffff);
  9. *(uint32_t*)(poly+5) = ~c1;
  10.  
  11. printf ("09 %#08x\n", crc32(poly, 9, 0xffffffff, 0xffffffff));
  12. printf ("10 %#08x\n", crc32(poly, 10, 0xffffffff, 0xffffffff));
  13. printf ("11 %#08x\n", crc32(poly, 11, 0xffffffff, 0xffffffff));
  14. printf ("12 %#08x\n", crc32(poly, 12, 0xffffffff, 0xffffffff));
  15. printf ("\n");
  16.  
  17. for (len = 9; len < 12; ++len) {
  18.     if (len > 9) poly[len-1] = 0;
  19.     poly[len] = 0xa5;
  20.     c1 = crc32 (poly, len+1, 0xffffffff, 0xffffffff);
  21.     printf ("%2d %08x\n", len+1, c1);
  22. }

...and the results:

  1. 09 0xffffffff
  2. 10 0xffffffff
  3. 11 0xffffffff
  4. 12 0xffffffff
  5.  
  6. 10 0x5943a898
  7. 11 0x5943a898
  8. 12 0x5943a898
catz: [kom.puterowe] [pro.gramowanie] [Techblog]
tagz: [crc] [crc32] [crc32 computation] [reciprocal] [same results]
Dodaj swoją opinię
07
październik-2010
204302

A friend of mine, had a problem today (with Python) which voils down to the following piece of code:

  • f = open('input.txt')
  • c = f.readlines()
  • # here were different operations
  • # on c, but that's not really important
  • print len(c)

Don't ask why there is readlines() in the first place, that's not the problem.
The problem was, that c had wrong number of lines. However answer to that lies in python's documentation:

Read until EOF using readline() and return a list containing the lines thus read. If the optional sizehint argument…

Unfortunatelly the file contained some random bytes, among different bytes there was also character with hex value of 0x1A. Now let me quote everyone's favourite source of information - wikipedia:

In the MS-DOS operating system, this character is used to indicate the end of a file or the end of user input in an interactive command line window. This behavior was borrowed from the earlier CP/M operating system.

Some operating systems such as the pre-VMS DEC operating systems, along with CP/M, tracked file length only in units of disk blocks and used Control-Z (SUB) to mark the end of the actual text in the file. For this reason, EOF, or end-of-file, was used colloquially and conventionally as a TLA for Control-Z instead of SUBstitute.

There is simple "solution" to this problem:

  • f = open('input.txt', 'rb')

Since CP/M was mentioned twice here, I can't resist to quote famous words of a man I've always regarded as a brilliant visionary - Gary Kildall (but unfortunately rather poor businessman for that matter) (the quote relates to int 21h/AH=09h):

"Ask Bill [Gates] why the string in function 9 is terminated by a dollar sign. Ask him, because he can't answer, only I know that."

catz: [eng.lish] [kom.puterowe] [micr.osoft] [pro.gramowanie]
tagz: [0x1A] [EOF] [python] [readline] [readlines] [windows]
Dodaj swoją opinię
03
sierpień-2010
130411
catz: [kom.puterowe] [Miniblog] [pro.gramowanie]
tagz: [c++] [ramblings]
Dodaj swoją opinię
31
grudzień-2009
163610

Chciałem się koniecznie podzielić tym znaleziskiem. Dzisiaj trafiłem na plugin Vrapperdo eclipsa. Umożliwia on (podstawową) edycję vim-like w eclipsie. Wcześniej testowałem też vimplugin i eclima chyba również. Jest też płatny viPlugin, tego nie widziałem.
Vrapper ma inne podejście niż dwa wyżej wymienione pluginy. Zamiast osadzać vim'a w eclipsie, imituje on edycję w stylu vim-a w eclipse'owych edytorach.

Lista komend trybu normal jest aktualnie niewielka, ale są najczęściej (przynajmniej przeze mnie) używane :). Nie rozminę się z prawdą, jeśli powiem, że komend vim-owego command-line'a praktycznie nie ma.
Dość specyficzne jest też 'aktywowanie' plugina, trzeba włączyć przełącznik na toolbarze (albo w menu edit) i dopiero NOWO otwarte okna edytora będą miały włączony vim-mode.

Chciałem się podzielić, bo na pierwszy rzut oka Vrapper przypadł mi bardziej do gustu niż vimplugin, a na joggerze, chyba nie było o nim wzmianki.

catz: [kom.puterowe] [pro.gramowanie] [Techblog]
tagz: [eclipse vim plugin] [vrapper]
Dodaj swoją opinię
03
październik-2009
104040

Truly saying I'm not much interested in C++0x (or rather C++1x :P).
Today I've stumbled upon few examples of delegates:

  1. [](int x, int y) -> int { int z = x + y; return z + x; }
  2. [&, foo](int x) { sum += x; prod *= foo; }

In the second code & refers to 'full closure' (so sum and prod are variables from that closure, accessed by reference), and foo is copied from the closure by value (i.e. any changes to foo inside the delegate won't be seen outside the delegate).

Truly saying, I don't mind it, but ...
C++ already has awful syntax (you can argue, but that's a fact :P)
Am I wrong or is the proposal (?) of delegates' syntax are is just über-crappish?

If you look at above samples and your answer is nope, here's one more for you:

  1. [&](int* foo, int i){i[foo] += (bar->*baz)(i); }

P.S. Your comments will be appreciated

catz: [eng.lish] [kom.puterowe] [pro.gramowanie] [Techblog]
tagz: [] [c++0x] [c++1x] [syntax-horror]
65 komentarzy
25
kwiecień-2008
150301
...napisałem, że Programowanie Uogólnione (generic programming), brzmi syfnie, wycofuję się z tego zarzutu, po pierwsze sam zaczynam stosować to sformułowanie, poza tym po dłuższym namyśle brzmi całkiem nieźle, na pewno lepiej niż 'programowanie generyczne', także trochej, zwracam honor : )
catz: [kom.puterowe] [Miniblog] [pro.gramowanie]
tagz: [językoznastwo] [metaprogramowanie] [programowanie] [programowanie uogólnione]
Dodaj swoją opinię

Ostatnio przeczytałem m.in. dwie książki Roberta McLiam Wilsona. "Zaułek łgarza" (Ripley Bogle) oraz Ulicę Marzycieli (Eureka Street).
Na Wilsona nadziałem się po raz pierwszy jakieś 4 lata temu, zacząłem wówczas czytać Zaułek Łgarza, lecz niestety nie dane mi było jej skończyć. Obie są przepełnione cynizmem i ironią (Zaułek bardziej). Ulica Marzycieli, pomimo panującego terroru (rzecz dzieje się w Belfaście), jest pogodniejsza, jednak Zaułek przypadł mi się bardziej do gustu.
Zaułek Łgarza to opowiedziana w pierwszej osobie, w ciągu czterech dni historia bezdomnego (Ripleya Bogle). W ciągu owych czterech dni podróżujemy z nim ulicami i dzielnicami Londynu, w międzyczasie opowiada on różne wydarzenia ze swojego życia.
Ulica marzycieli to historia dwóch przyjaciół około trzydziestki Jake'a i Miśka. Książka jest o marzeniach, o miłości (mówi o tym już w pierwszym zdaniu), o Belfaście i żyjących tam ludziach. Książka jest ciekawie napisana. Kiedy dotyczy Jake'a narracja jest w pierwszej osobie, kiedy Miśka w trzeciej (Jake jest wówczas również opisywany z punktu widzenia osoby trzeciej).
btw: kojarzy ktoś z Porachunków (Lock, Stock and Two Smoking Barells), jak Tom przedstawia pomysł zarabiania na wibratorach? To pomysł lekko przerobiony z książki Wilsona ;)

Podoba mi się styl Wilsona. Nie chcę i nie miałem zamiaru pisać tu recenzji tych książek, bo nie lubię spoilować (Z tego też względu z wyjątkiem tytułu wpisu, nie ma żadnych cytatów). Jak ktoś lubi recenzje, to sobie wygoogla (btw: trafiłem na niepochlebną recenzję Zaułka Łgarza, oczywiście zupełnie się z nią nie zgadzam, ale świadczyć to może jedynie o różnicy w gustach :P).
Zachęcam do przeczytania.

Przez grudzień i styczeń nie miałem czasu pisać na jogga. Nie obiecuję poprawy. Najprawdopodobniej wpisy będą się pojawiały coraz rzadziej.
Promotor chciał przed świętami otrzymać rozdział pracy. Więc przez grudzień siedziałem głównie nad tym. Nie udało mi się napisać rozdziału, nawet nie powiedziałbym, że pół rozdziału ;/.
Przez styczeń zajmowałem się implementowaniem pewnego protokołu (sieciowego) na zajęcia (nie skończyłem i raczej wątpię czy kiedyś do tego wrócę :/) i innymi zaliczeniami (4 maszyny wirtualne na VirtualBox, lap raczej średnio to dźwiga ;), btw: yzzuf: thx za wzmiankę o VirtualBoxie)
A zapomniałbym dodać, w zeszłym tygodniu odbyły się ostatnie warsztaty Team0xf, dotyczyły metaprogramowania w D (Generici w Javie to przy metaprogramowaniu w D pestka :P). Na stronie warsztatów powinna się pojawić wkrótce reszta nagrań.

Tyle na dzisiaj, czołem :)

catz: [i.nne] [lit.era] [pro.gramowanie]
tagz: [D] [Eureka Street] [Ripley Bogle] [Robert McLiam Wilson] [Ulica Marzycieli] [Zaułek Łgarza] [metaprogramowanie]
2 komentarze
12
listopad-2007
113308

W zeszłym roku, przez semestr, uczęszczałem na takowy przedmiot. Naszym zadaniem było zaimplementowanie serwera takiej bazy.
W implementacji nie korzystaliśmy z przypominającego SQLa OQLa, lecz z pomysłu który próbuje wypromować pan Kazimierz Subieta mianowicie SBQLa (Stack Based Query Language).

W obiektowej bazie danych przechowywane są całe obiekty (super stwierdzenie, nie? ;)).
Pan Subieta a zanim i my rozważa trzy typy obiektów:

  • obiekty atomowe, czyli takie które przechowują wartości,
  • obiekty złożone, czyli takie, które są kontenerami dla jakichkolwiek innych obiektów, oraz
  • obiekty pointerowe (lub jak kto woli wskaźnikowe) które służą do tworzenia referencji do innych obiektów

Każdy obiekt ma nazwę, oraz unikatowy identyfikator. Obiekt atomowy dodatkowo ma wartość, którą przechowuje, a obiekt pointerowy identyfikator obiektu na który wskazuje.
Przykład (miałem zrobić ładny obrazek, ale jestem leń :P): mamy obiekt złożony typu osoba, który posiada podobiekty atomowe typu imie, nazwisko podobiekt złożony typu adres.
Jeśli się nie mylę, bardziej skomplikowane implementacje posiadają funkcje które można wykonywać na elementach (tak jak w tradycyjnych bazach danych) a także pozwalają na przechowywanie metod w obiektach i wywoływanie tychże metod.

SBQL pozwala na wyciąganie obiektów z bazy danych. SBQL pozwala tworzyć intuicyjne zapytania (no kompletnie nieintuicyjne również ;)), moja implementacja różni się od tego co promuje pan Subieta, także przedstawione przeze mnie zapytania niekoniecznie mogą być możliwe w implemntacji opisywanej przez niego.

  • osoba where imie
  •   - zwraca te obiekty osoba, które posiadają podobiekt imie (na dowolnej głębokości)
  • osoba where nazwisko = "Kowalski"
  •   - trzeba cokolwiek tłumaczyć?

Więcej i ciekawszych przykładów, znajdziecie w...

Live show

Nie wiem dlaczego, ale nikt nie zdecydował się udostępnić efektów swojej pracy.
Postanowiłem postawić serwer i napisałem małego pehapa, który pozwala wykonać na żywo kilka zapytań. Na chwilę obecną nie ma możliwości wykonywania dowolnych zapytań (gdyż obawiam się evil hax0rów z mr0cku ;)), raczej wątpię, czy wprowadzę w ogóle taką możliwość :>.
Chętnych do pooglądania przygotowanych przeze mnie zapytań odsyłam tutaj. Jest tam seria kilku zapytań pod rząd, które zwracają to samo, ale robią to na różne sposoby TIMTOWTDI ;).

catz: [kom.puterowe] [pro.gramowanie] [Techblog]
tagz: [implementacja obiektowej bazy danych] [obiektowe bazy danych] [sbql]
11 komentarzy
14
lipiec-2007
212317
Simple DOM Viewer header

Jest jedna rzecz, której strasznie brakuje mi w Operze, mianowicie DOMInspectora, takiego jak ma Firefox. Co prawda jest Opera Developer Console, jednak z pewnych względów, nie wystarcza mi. Zapewne łatwiej byłoby zmodyfikować tamten kod, jednak jest on dość obszerny i nie chciało mi się nad nim siedzieć/czytać, więc napisałem pierwszą wersję mojego małego DOMInspectora dla Opery.

Pokaż więcej...

catz: [bro.wsers] [kom.puterowe] [pro.gramowanie] [Techblog]
tagz: [dom viewer] [dominspector] [opera] [webdevelopment]
2 komentarze
27
czerwiec-2007
191058

zsh in uxterm Przez dłuższy czas używałem, zsh, później z powodu problemów z UTFem wróciłem do basha, jednakże ostatnio wróciłem do zsh, jednakże nie z powodów o kŧórych będzie mowa poniżej.
Jakiś czas temu porównywałem różne shelle i postanowiłem się podzielić wynikami.

Pokaż więcej...

catz: [kom.puterowe] [pro.gramowanie] [Techblog]
tagz: [bash] [ksh] [optymalizacja skryptów] [porównanie shelli] [zsh]
27 komentarzy
10
czerwiec-2007
171343

Prawda, że chwytliwy temat? ;)
Otóż obejrzałem ostatnio 3 Tech Talki, którymi chciałbym się podzielić, a chwilowo (nadal) mam problemy z dostępem do szortów.

Pokaż więcej...

catz: [go.ogle] [kom.puterowe] [pro.gramowanie] [Techblog]
tagz: [ani vulnerability] [google tech talks] [python] [vim]
3 komentarze
15
marzec-2007
105209

Rusza trzecia edycja konkursu organizowanego przez Google, czyli Google Summer of Code 2007. Na stronie SoC'a znajduje się już lista organizacji mentorskich, które biorą udział w tegorocznej edycji. W tym roku jest ich aż 131.

W tym roku wśród uczestników zabrakło (a przynajmniej nie udało mi się na pierwszy rzut oka dostrzec) m.in. Perl, openSUSE, ReactOS, Wine, Looking Glass, GIMP, CUPS, Django, irssi, Jabber (jest jako XMPP :>), no i mojej organizacji mentorskiej z zeszłego roku: ClamAVa, ale o tym wiedziałam widziałem :).
Pojawiło się za to sporo małych i mniej znanych projektów. Polecam zapoznanie się z pełną listą. Zachęcam do udziału w tegorocznej edycji konkursu, a aplikantom i uczestnikom, życzę powodzenia :)

Przypominam, że na dzień dzisiejszy, zgłoszenia można składać do 24 marca.

catz: [go.ogle] [kom.puterowe] [pro.gramowanie] [Techblog]
tagz: [google] [google summer of code 2007] [programowanie] [soc]
3 komentarze
14
listopad-2006
230534

Jeden znajomy poinformował mnie że można ze słownika usuwać elementy w taki sposób [pomijam dlaczego akurat tak]:

  • a = { '1':1, '2':1, '3':1, '4':1, '5':1, '6':1 }
  • for i in a.keys():
  •     del a[i]
  • print a
Jednakże podobny kod w przypadku list, działa ciut inaczej:
  • a = range(10)
  • for i in a:
  •     a.remove(i)
  • print a
No więc domyślam się, że pythonowy for a in b, działa jakoś tak:
  • a = range(10)
  • j = 0
  • while j < len(a):
  •     i = a[j]
  •     a.remove(i)
  • print a
Pomijam, że mi wystarcza del a[:], ale to tak w ramach testów.
catz: [kom.puterowe] [pro.gramowanie]
tagz: [dict] [list] [python] [remove elements]
3 komentarze

Mamy klasę A, w niej zagnieżdzone klasy B i C która dziedziczy po C.
Zastanawiałem się właśnie, jak w klasie zagnieżdżonej C wywołać __init__ klasy B.
Rozwiązaniem okazało się wywoływanie A.B.__init__(self..) w klasie C, jednakże z nieznanych mi przyczyn (dopiero poznaję pythona) super(A.B, self).__init__(..) nie chce działać i zwraca błąd:

  • TypeError: super() argument 1 must be type, not classobj

Dzięki dla solydzajsa za pomoc ;-)

catz: [pro.gramowanie]
tagz: [inheritace] [nested classes] [python]
1 komentarz
18
październik-2006
012400

Od jakiegoś czasu jestem w Toruniu. Zaczął się nowy semestr, nowe zajęcia.
Jako przedmioty do wyboru (oprócz obowiązkowych) wybrałem sobie Bazy Danych II oraz Wstęp do Sieci Neuroty^H^Hnowych ;-).

Na BDII póki co jesteśmy męczeni pythonem. Pierwsze moje wypociny, można jak zwykle znaleźć w uczelni. Dziś dowiedziałem się między innymi, że kolejność dziedziczenia ma znaczenie na nadpisywanie metod, ba nawet zostało nam wytłumaczone, dlaczego tak się dzieje, ale nie chce mi się malować ładnego rysunku ;-).

Na WdSN budujemy jak na razie proste sieci oparte o perceptrony i uczymy je algorytmem kieszonkowym (z zapadką lub bez) rozpoznawać zaszumione 'obrazy' (w moim przypadku matryce bitowe 6x6) cyferek.
Wredny perceptron nie chce się nauczyć ósemki, chociaż resztę rozpoznaje w 100%. Spróbowałem zrobić warstę rozproszoną (z N perceptronów i do niej oraz do wejścia dołączyć perceptron wyjściowy) i wówczas uczyć. Uczenie trwało dość sporo czasu (przerwałem), a i tak udawało mu się sklasyfikować poprawnie ca. 950 przypadków na zbiorze testowym 1000 próbek. Jutro mam czas, to spróbuję budować 'wieżę' perceptronów, zobaczymy czy sobie poradzi.

Jako przedmioty obowiązkowe mam też Podstawy Przetwarzania Sygnałów, Rachunek Prawdopodobieństwa i Statystyka Matematyczna (rozwinięcie tego co mieliśmy na Wstępie do Statystycznej Analizy Danych) oraz Logikę Matematyczną.
Obawiałem się, co też to będzie to ostatnie, jednak okazuje się, że jak na razie jest to przedmiot dość związany z Algebrą (ostatnio było o monoidach), do tego laborki z owego przedmiotu są dość przyjemne.

To tak w ramach skrótu co u mnie w nowym roku akademickim :).

24
wrzesień-2006
163823

Zawsze na stronach z tekstami piosenek denerwował mnie nadmiar wyświetlanych reklam a przy tym tempo w jakim się te strony ładują.
Tak, ten pomysł chodził mi po głowie już od jakiegoś czasu (właściwie to kilka lat już chyba :)). Mianowicie lekka i mała strona z tekstami moich ulubionych piosenek.

Pokaż więcej...

25
sierpień-2006
044632

Dziś z racji tego, że nie mogłem znaleźć odpowiedniego narzędzia, postanowiłem napisać własne. Czyżbym zaczynał robić się jak DJB?
Małe cudo jest napisane w perlu w koszmarny sposób (bo ze mnie taki perl programista, jak, a sami wiecie jak co), póki co ma 215 linijek. Jutro więcej soczystych i pikantnych szczegółów. A na razie zieeew..

15
lipiec-2006
192345

My job in Google Summer of Code is to write two unpackers for Clam AntiVirus for MEW and UPack exe-packers. MEW seems to be beaten-up. Now it's time for UPack. Some more information about both of them will be realeased in later.

What is an exe-packer? It's a program that allows to compress binary of other programs, They are decompressed on the fly after running exe-packed file.
Malware writers thought it would be cool to make executable smaller (so it could go even faster through the net and occupy less disk-space). Some Antivirus systems instead of unpacking compressed file, match exe-packer.
This is very wrong. Why? Many demoscene programs are exe-packed (this is very useful if you want to fit in 64k or 4k), so matching by exe-packer can cause much false-positives.

12
maj-2006
021329
tak mi się przypomniało, że jakiś czas temu coś takiego popełniłem, jak komuś to da podobne efekty jak mi, to proszę o komentarz:
Z=0
C=132
D=148
E=165
F=176
G=198
A=220
H=247
C1=264
D1=297
E1=330
F1=352
G1=396
A1=440
H1=495

z="$D $D $G $G $A $A $G $Z $F $F $E $E $D $D $C"
for i in $z
do
        xset b 10 $i 100
        echo -ne ".\007"
        sleep 0.1
done
echo
nasz projekt dostał zaliczenie, nie jest to nic specjalnego, ale mam nadzieję, że popracujemy nad tym jeszcze, tak, żeby był sensowny i przydatny. efekty można zobaczyć, na serwerze, na którym miejsca użyczył nam Leszek 'leafnode' Krupiński. jak komuś się uda skompilować to gratulację, jak ktoś chce mieć jakiś użytek z synchronizacji, to mogę założyć konto i podać adres serwera. a no i najważniejsze, zaczęły się juwenalia w toruniu, dzisiaj jako gwiazda wieczoru grał Hunter, a później miał grać jakiś zespół z Austrii 'SO I SIN' czy jakoś tak, ale nie doczekałem, zimno, a skakać się za bardzo nie dało, bo od razu usta pełne piachu, pozatym nie powiedziałbym, że to 'moje klimaty'. tyle.
17
wrzesień-2005
012803
heh, testowaliśmy z deely'm Thorn'a póki co można jedynie chodzić, ale i tak całkiem przyjemnie :) przy czym w jedną osobę to bez sensu, bo no, bez sensu ;). pod klawiszem 'L' jest magiczna rzecz o nazwie lagcounter, jak jest więcej niż 500ms to nie warto grać. ja miałem momentami po 14s laga, za to deely'emu śmiagło, że aż miło ;]. czasem występuje jakieś dziwne migotanie, ale nie mam już siły szukać skąd, znaczy czasem to jedynie z racji tego, jak jest duża różnica między bandwidthem, co jest chyba dość oczywiste. pozatym dorobiłem na szybko zapisywanie pozycji, na planszy, na której się skończyło grę i serwer stara się przywrócić przy kolejnej grze na tej pozycji. dobra kończę i idę spać, w końcu wakacje nie ? Thorn.
10
wrzesień-2005
001854
Przeniosłem Thorna na leafnode'owego wafla, linka dam wkrótce. dzięki leafnode'owi również zajrzałem do źródeł, servera Thorna, gdyż okazało się, że zżera 99% czasu procka ;D i była jedna głupia petelka, której z szacunku dla szerokiego grona programistów nie wkleję ;>. sama komunikacja applet-server jakby przyśpieszyła. lagcounter póki co nie działa, ale sprawdzę potem. pozatym po zobaczyłem niedawno wzmiankę na joggu zdzichaBG zobaczyłem wzmiankę o bootcharcie i ponieważ rebootuję dość często komputer postanowiłem wypróbować. podobnie jak zdzichuBG mam swój delaystart, ale to akurat nie zerżnięty pomysł ;-). no więc po małym tunningu bootowanie trwa 30s a nie 40 jak na wcześniej, myślę, że dałoby się to poprawić jeszcze, ale na razie odłożyłem to na bok, gdyż sziwan, podrzucił pomysł z wypróbowaniem swsusp no i sprawdzałem ale software suspend 2. niestety z racji na moduł nvidii nie udało mi się pomyślnie tego użyć z biegającymi Xami, ale pod konsolą bez problemu, chociaż wymaga jeszcze potestowania... z tym, że problem jest taki, że to nie startuje 30s, tylko ponad minutę, ale system jest w stanie w jakim został opuszczony. wogóle przyszedł mi dziś ładny 19" LCD z Allegro [tak już dostałem od Fallcone'a opieprz, że 19" nie warto]. a pozatym to może niektorzy nie zauważyli, ale Allegro SIĘ ZMIENIŁO! , moim zdaniem wygląda ładniej. ech, teraz to już ebay wogóle nie dorasta do pięt Allegro ;-).
02
wrzesień-2005
142403
testowałem dzisiaj różne sposoby ładowania obrazków z sieci, z poziomu appleta w javie. testowałem różne kody średnio koło 20 linii. rezultaty były mizerne, ale w końcu się udało, wszystko przez to, że chciałem ominąć ImageIcon, a wszystko wskazuje, że z różnych próbowanych metod, jedynie tam buforowanie jest dobrze zrobione... tutaj zamieszczam kod, który u mnie działa:
  protected Image loadImage(int imageNum) {
      String path = "obrazki/img"+imageNum+".png";
      ImageIcon icon=null;
                
      icon = new ImageIcon(getClass().getResource(path));
      return icon.getImage();
  }
a tutaj macie skrinszota z rezultatami walki z Javą.
28
sierpień-2005
144109
Męczyłem jak sprawić żemy vm javy pozwoliła wspomnianemu już appletowi na zapisywanie. No i wymęczyłem trzeba sobie stworzyć pliczek takiej zawartosci:
grant {
permission java.io.FilePermission "*", "write";
};
no i odpalamy appleta:
appletviewer -J-Djava.security.policy=my.policy test.html
28
sierpień-2005
002636
Hurra zrobiłem [już prawie] edytor leveli, także projekt z javy stąpa powoli naprzód. Postanowiłem zamieścić specjalnie DLA WAS!!! [ale wyróżnienie, nie?] skrinszota. Tylko jeszcze zapisywanie muszę dorobić, bo inaczej będe bez sensu klikał ;] A skrinszota macie tutaj.
26
sierpień-2005
124319
Cały projekt jest na annie.
Plan jest taki, applet miał się łączyć z serwerem w javie postawionym na annie. Pojawił się jednak problem, gdyż na annie jest restrykcyjny firewall, który nie pozwala by mój sewer w javie był widoczny, a jak wiadomo, applety mogą łączyć się jedynie z hostami, z których przyszły...
Pierwszą myślą, była rezygnacja z appletu i zrobienie aplikacji klient-serwer, ale nie byłoby to ani ciekawe, ani interesujące, ani warte pisania.
Później pomyślałem, coby przenieść wszystko na staszka [do którego mam pełen dostęp], ale wiązałoby się to ze zmianą skryptu [bo nie korzystam z PearDB] by korzystał z mysqla, lub postawienie postgresqla na staszku a dodatkowo j2sdk, który jest za słabą maszyną by to dźwigać i chodziłoby to pewnie w opłakanym tempie. Ale przyszło oświecenie, plan jest taki:
  • całość [server, strona, baza] siedzi na annie
  • sam applecik leży na staszku
  • robię tunelik ze staszka na annę
  • applecik łączy się ze staszkiem
Idę walczyć!
27
maj-2005
140503
wiele wody w rzekach upłynęło, od ostatniego mojego wpisu. aktualnie mam na głowię sesję. prace nad pluginem ircowym wogóle zamarły od jakiegoś czasu. jakiś baran zrobił włam na serwer gdzie leży moja strona. pracuję nad jednym artykułem, do którego potrzeba trochę kodu, no to też trochę się nakodziłem. a zrobiłem ciekawy program do maple'a ale wrzucę, dopiero jak ssh na staszku wstanie. no i zapomniałbym dodać, że mój aniołek jest najcudowniejszy na świecie.
23
wrzesień-2004
135823
zrobiłem sobie nowego zabawka, zwie się GPstoreview http://gim.org.pl/gpstoreview/
28
sierpień-2004
230234
Ech co ja się będe rozpisywał
gim@gimlandia:/usr/src/ekg2$ perl -MCrypt::PasswdMD5 -e
        'print unix_md5_crypt("haslo","magiczny"),"\n"'
$1$magiczny$GRigsmDZcThzR932XK8pP0
da się to w perlu chyba jakoś prościej, ale nie chciało mi się myśleć
10
sierpień-2004
012340
koniec dnia... napisałem prawie tyle ile chciałem... brat właśnie wrócił od panny, rychło w czas, niech sobie matoł klucze bierze jak tak późno wraca, a nie się dobija
09
sierpień-2004
123210
Tak, trzy tysiące sto dziewięćdziesiąt siedem komórek mózgowych poszło się^Wna długi spacer bez powrotu, po tym jak za^Wuderzyłem głową w piecyk gazowy... Trzeba być na prawdę bardzo zdolnym ;/ Dobra trzeba się wreszcie wziąć za irc plugin do ekg2, bo jak tak dalej pójdzie, to nigdy go nie skończę
NP: El doopa - Lofix
09
sierpień-2004
102025
Wiem, że takich rzeczy jest pełno, ale postanowiłem napisać swój. Tak, właściwie z nudów... Miałem dodać wczoraj, ale cosik net mi padł... Oka oto skrypcik:
#!/bin/bash

PLIK=/etc/jabber/jabber.xml
# PAMIETAJ ZE UTF-8"
TEMA="TEMAT WIADOMOSCI"
WIAD="TEKST"


# Dalej nie dotykac... ;]
serwer=`cat /etc/jabber/jabber.xml | grep cmdline | grep host \
| sed 's/<host.*>\(.*\)<\/jabber.*/\1/' | sed 's/ //g' `
spool=`cat /etc/jabber/jabber.xml | grep cmdline | grep spool \
| sed 's/<spool.*>\(.*\)<\/jabber.*/\1/'| sed 's/ //g' `

MAINDIR="$spool/$serwer"

echo -n "Podaj nazwę użytkownika: "
read newuser
[[ -f "$MAINDIR/$newuser.xml" ]] && echo "Podany username jest zajety!" && exit

echo -n "Podaj haslo: "
read -s newpass
echo
echo -n "Podaj Imie i Nazwisko: "
read newdane

DATA="`date +\"%Y%m%dT%H:%M:%S\" -d "2 hours ago"`"
SEKI="`date +\"%s\"`"
STAM1="<xdb><query xmlns='jabber:iq:last' last='$SEKI'"
STAM2=" xdbns='jabber:iq:last'>Registered</query>"
PAS1="<password xmlns='jabber:iq:auth' xdbns='jabber:iq:auth'>"
PAS2="$newpass</password>"
REG1="<query xmlns='jabber:iq:register' xdbns='jabber:iq:register'>"
REG2="<username>$newuser</username><name>$newdane</name><email/>"
REG3="<x xmlns='jabber:x:delay' stamp='$DATA'>registered</x></query>"

MES="<message from='$serwer' to='$newuser@$serwer'>"
FILE="$MAINDIR/$newuser.xml"

echo -n "$STAM1$STAM2$PAS1$PAS2$REG1$REG2$REG3" > $FILE
echo -n "<foo xdbns='jabber:x:offline' xmlns='jabber:x:offline'>" >> $FILE
echo -n "$MES<subject>$TEMA</subject><body>$WIAD</body>" >>$FILE
echo -n "<x xmlns='jabber:x:delay' from='$newuser@$serwer'" >> $FILE
echo -n " stamp='$DATA'>Offline Storage</x></message></foo></xdb>" >> $FILE

echo "[+] Done."