mwgamera has no life


javascript sha256

Wpis na 0. poziomie, wysłany 2008-02-16 23:43:47

Nie wiem czy kiedykolwiek użyję do tego co chciałem na początku, ale zaimplementowałem secure hash algorithm 2 — konkretnie SHA256 w JavaScripcie. Wbrew pozorom może to być użyteczne (na przykład login nie wymagający https przy użyciu hmac albo czegoś podobnego), a z działających implementacji w JavaScripcie dotychczas spotkałem tylko SHA1.

Swoją drogą nie sądziłem że może to być takie zabawne, tyle ciekawych błędów można popełnić dzięki typowej dla wielu języków skryptowych idiotycznej dynamicznej zmianie typu jak się przekroczy zakres (zamiast obcięcia jak normalnie). Dzięki temu na przykład dodawanie modulo 232 nie jest tak proste jak (a+b)&0xFFFF (choć w większości wypadków to i tak by działało)… Jakby w dzisiejszych czasach nie można było mieć 64 bitowego typu całkowitego — jakby był to pewnie większą rozrywkę sprawiłoby mi SHA512 albo w ogóle coś bardziej mrocznego jak whirlpool.

Implementacja z pewnością nie jest optymalna (tak to zwykle bywa jak się pisze bezpośrednio „z definicji”), ale działa w rozsądnych granicach dla niezbyt długiego wejścia (tak ze 4–5 bloków).
W każdym razie, oto ona: sha256.js, a tutaj demo.

BTW1, nie wiem co zrobić z tym joggerem, żal mi biednego serwera który musi trzymać takie dawno nie aktualizowane pozostałości jak to…

BTW2, był sobie JiMP zaliczony na podstawie projektu. Projektem był prosty kalkulator (przynajmniej w końcu nauczyłem się jak się pisze w miarę porządny parser — wbrew pozorom wiedza wyniesiona z TPI okazała się przydatna na tą okoliczność ;) — a typa z którym miałem pisać paru „sztuczek” w C). Co mnie drażni to fakt, że wiem o dwóch bugach w nim, które wiem jak poprawić, ale mi się nie chce bo to już nikomu więcej nie będzie potrzebne… Czyżby własne lenistwo zaczynało mi przeszkadzać? :o
Ekshibicjonistyczna część natury każe mi podać linki do kodu (wersja okrojona z wygodnego readline'a specjalnie dla „windowsiarzy” też jest)

BTW3, Hooray, wszystko zaliczone, żadnych głupich warunków i cały tydzień ferii…

9 komentarzy | ogólne programowanietrackback

mpd mix magic

Wpis na 0. poziomie, wysłany 2007-08-30 05:33:38

Nie wiem po co to, pewnie i tak nigdy więcej nie użyję, ale oto mała funkcja dla basha podmieniająca aktualną listę na mixa (dynamiczną listę) wygenerowanego za pomocą API MusicIP Mixera na podstawie aktualnie odtwarzanego utworu w MPD.

function mpdmixmagic() {
  M="`awk -- '/music_directory/{print$2}' "${HOME}/.mpdconf"`";
  M="`eval echo \`eval echo $M\``"; A="$M/`mpc --format %file%|head -1`";
  mpc crop;
  wget -O - "http://localhost:10002/api/mix?song=$A&content=m3u" \
  | sed "s,$M/,,g" | mpc add; mpc del 2;
}

Te dziwne i pozornie bezsensowne dwa zagnieżdżone eval echo służą temu żeby string "~/music" wyciągnięty z ~/.mpdconf zamienić na /home/mwgamera/music. Pewnie jest jakiś ładniejszy sposób na to, ale nie chciało mi się szukać… Tak działa ― przynajmniej dopóki music_directory nie zawiera odstępów ;) A mpc del 2 wstawiłem bo MusicMagicServer mi wrzuca zawsze seed song jako pierwszy element nowej listy.

dodaj komentarz | ogólne programowanietrackback

czyszczenie miniaturek

Wpis na 0. poziomie, wysłany 2007-04-27 01:09:49

Aktualnie wiele programów wyświetla gdzieniegdzie miniaturki pokazujące zawartość plików. Wygenerowanie takiej miniaturki trochę zwykle zabiera więc je się cache'uje. Ponieważ jak wspomniałem robi to wiele programów, więc powstał standard cache'owania żeby nie musiał każdy sobie tego robić oddzielnie (korzyści oczywiste) ― Thumbnail Managing Standard. Spora część programów go używa więc jest godny uwagi. Czasami jednak okazuje się, że w cache'u mamy sporo śmiecia, czasami aż tak dużo że zaczyna to być objętościowo zauważalne na dysku. Trzeba wtedy trochę przeczyścić.

Owe „śmiecie” można podzielić na dwie główne grupy. Pierwsza to miniaturki nieistniejących plików. Zostają gdy plik zostanie usunięty lub zmieni nazwę. Druga to po prostu nieużywane miniaturki, których nie ma sensu trzymać ze względu na nieprzydatność.

Drugi przypadek można szybko rozwiązać na przykład (stąd) tak: $find ~/.thumbnails -type f -atime +7 -delete Po drobnych zmianach i dodaniu logowania wygląda to tak: LIFE=14
LOG=${HOME}/.thumbnails/clean.log
(   find "${HOME}/.thumbnails" \
    -mindepth 2 -type f -atime +"$LIFE"\
    -exec bash -c 'pngmeta "{}" | awk -F :\  -- /Thumb::URI:/{print\$2}' \;\
    -delete
) | sed "s/^/[`date -Imin`] UNUSED /" >> "$LOG"

Szybko się jednak okazało, że istnieje jeszcze ten pierwszy i (w moim wypadku) jest nawet istotniejszy. Żeby się tego pozbyć trzeba niestety przejrzeć wszystko. ‘find’ jest fajny, ale skoro tak, to nie ma chyba sensu się nim bawić. Końcowy skrypt: (skrypt) #!/bin/bash

# CONFIGURATION
LIFE=1209600
LOG=${HOME}/.thumbnails/clean.log;

TIME=`date +%s`

# Get URI of thumbnail
getthuri() { pngmeta "$f" | awk -F ': '  -- '/Thumb::URI:/{print$2}'; }


for f in ${HOME}/.thumbnails/*/*.png; do
    
    ATIME=`stat -c%X "$f"`

    if [ `dc -e "$TIME $ATIME -p"` -gt "$LIFE" ]; then

        URI=`getthuri`
        echo "[`date -Imin`] UNUSED $URI" >> $LOG
        rm "$f" >&2 2>/dev/null

    else

        URI=`getthuri`
        # Get local path if it's local, empty string otherwise
        LOCAL=`awk -F 'file://' -- '/^file:\/\/\//{print$2}' <<< "$URI"`

        # If it's local check if base file still exists
        if [ ! -z "$LOCAL" -a ! -e "$LOCAL" ]; then
            echo "[`date -Imin`] NONEXISTENT $URI" >> $LOG
            rm "$f" >&2 2>/dev/null
        elif [ ! -z `egrep '^(http|ftp)s?://' <<< "$URI"` ]; then
            # External - check with wget
            if wget -q --spider "$URI"; then true; else
                echo "[`date -Imin`] NONEXISTENT $URI" >> $LOG
                rm "$f"  >&2 2>/dev/null
            fi
        fi

    fi

done
Wymaga wget'a, date z GNU i pngmeta. Chodzi powoli. Głównie dzięki sprawdzaniu miniaturek zewnętrznych plików, ale łatwo to wyrzucić, jak ktoś nie chce. Ja osobiście preferuję pozbycie się wszystkiego spoza mojego dysku. Jeszcze wyciąganie URI z pliku, ale tego się nie przeskoczy, bo nawet gdyby pominąć logowanie tego co jest wyrzucane, to trzeba jakoś sprawdzić czy plik bazowy istnieje. Na pewno można ten skrypt zrobić ładniej, ale tak przynajmniej działa. Z resztą, ustawienie go w cronie raz na tydzień gdzieś koło piątej rano powinno wystarczyć żeby nie przeszkadzał.

Przy okazji, kto mi poleci jakiś dobry i wygodny podświetlacz składni z wyjściem z HTMLu? Bo „wklejalne” wersje tych przykładów powyżej uzyskałem po prostu przez kilka sedów i awka w potoku :P

dodaj komentarz | ogólne programowanietrackback

UTF-8 character regexp

Wpis na 0. poziomie, wysłany 2006-08-22 22:03:43

(?:^|(?<=[\x00-\xBF]))([\x80-\xFF][\x80-\xBF]{1,5}|[\x00-\x7F])

Z potrzeby…
Zakładając, że wejście jest poprawnym UTF-8, to wyrażenie pasuje do dokładnie jednego znaku (nie bajta czy oktetu).
Ten regexp nie nadaje sie do walidacji, byłby dużo dłuższy :P

1 komentarz | programowanietrackback

random

Wpis na 0. poziomie, wysłany 2006-08-22 03:55:13

mwgamera@jogger:~$ ssh mwgamera@his.brain.invalid "cat /dev/random"

  • dF+5DuI~3x+'rI-fLNÜćAHâĆ=ňëÝK:ążĺĂ…
  • Dodałem sobię favikonkę i wyświetlanie tychże w komentarzach… Ładnie?
  • Ma ktoś pomysł jak zrobić ładniejszą favikonkę? I czemu obrazek クロノ (Chrono), który używam jako avatara, nie daje się zadowalająco przeskalować do 32px?
  • Czemu gdzie nie spojrzę to widzę w kodzie <link> do favikonki w formacie PNG, ale z wstawionym type="image/x-icon"? Przecież to bzdura!
  • Muszę sobie w końcu zrobić normalne kategorie…
  • Ten szablon którego używam od czasu zaimportowania coraz bardziej się zmienia i jest coraz bardziej „mój” (btw, na jakiej to jest licencji?). Będe musiał jeszcze coś w końcu zrobić, żeby wyglądał tak jak powinien w moim firefoxie 1.0.4 (debianowa paczka, więc troche stary ^^). Na razie wygląda tak… I nie wygląda tak przez moje zmiany, bo tego jeszcze nie ruszałem. Tak było…
  • Jakiś czas temu zgłosiłem bardzo istotny błąd w joggerze (FS#306). Tak, anonimowo, bo mi flyspray nie chciał przysłać kodu… Niestety, widać, przy tworzeniu kanału RSS jest używana jakaś funckcja która zakłada, że wejście jest w jedno–bajtowym kodowaniu (chyba ISO Latin-1 skoro 0xAE to ‘®’), a co gorsza że wyjście jest HTMLem (wynikiem nie jest ‘®’ tylko ‘&reg;’)! Czyżby htmlentities w dodatku bez podanego opcjonalnego argumentu charset? RSS mojego joggera przez to nie jest poprawnym UTF-8 ani XMLem! Jak do tej pory — żadnej reakcji. Może powinienem kogoś ręcznie „pingnąć” żeby się tym zajął :P
  • Notka o f/sn powstawała w bólach ze względu na totalny brak pomysłu co napisać mimo nieodpartej chęci napisania :P
  • W JavaScripcie brakuje przenośniej możliwości używania XPath. Wszędzie w sieci można spotkać przykłady jak znaleźć jakiś znacznik z ustawioną daną klasą uzywając getElementsByTagName a potem odfiltowywując takie co danej klasy nie mają. To działa — ale ten pomysł jest zły u podstaw. Nie, nie… Jeśli chodzi o oddzielenie skryptu od kodu strony to pomysł jest świetny i daje spore możliwości. Sam tak przecież zrobiłem wyświetlanie daty ostatniej modyfikacji posta na joggerze. Ale kiedy próbowałem zrobić sobie rozszeżenie do firefoxa, które będzie automatycznie poprawiać błędne tagi <ruby> to w pierwszym podejściu na testowej stronie (gdzie było ich dużo) pod załadowaniu firefox zamierał na 10 sekund! W drugim podejściu użyłem document.evaluate i opuźnienie po załadowaniu jest niezauważalne. Btw, jeśli ktoś chce to RubyFix jest tutaj.
  • Wczoraj (właściwie już przedwczoraj) koło. godziny 21 była burza, a burza była zła. Padła prąd, padł Aster (mój ISP), 107 dni uptime bezpowrotnie zniknęło.
  • Ćma na monitorze może bardzo przeszkadzać w pisaniu wpisu…
  • EOT, idę spać
  • …8jP2o3?BW1\]5L[UwB7]jmQ,zCnv"p.H3;

3 komentarze | ogólne programowanietrackback

ISO 8610 regexp

Wpis na 0. poziomie, wysłany 2006-07-26 17:31:37

^(?:-([0-9]{1,2})|([0-9]{4}))?(?:-?(?:([0-9]{2})?(?:-?([0-9]{2}))?|W([0-9]{2})(?:-?([1-7]))?|([0-9]{3})))?(?:T([0-9]{2})(?::?([0-9]{2})(?::?([0-9]{2}))?)?(?:[,\.]([0-9]+))?(?:(Z)|([+-])([0-9]{2})(?::?([0-9]{2}))?)?)?$ Oto wyrażenie regularne, które może posłużyć do walidacji bądź parsowania daty/czasu w formacie ISO 8610.

Dopasowania

  • rok
    • [1] końcowe cyfry
    • [2] pełny rok
  • data kalendarzowa
    • [3] miesiąc
    • [4] dzień miesiąca
  • data tygodniowa
    • [5] numer tygodnia
    • [6] dzień tygodnia
  • data porządkowa
    • [7] dzień roku
  • czas
    • [8] godziny
    • [9] minuty
    • [10] sekundy
    • [11] część ułamkowa
  • streaf czasowa
    • [12] Z — UTC
    • przesunięcie względem UTC
      • [13] kierunek (+/-)
      • [14] godziny
      • [15] minuty

Każdy z tych elementów może być pusty.

To wyrażenie pasuje do wszystkich rodzajów dat zdefiniowanych w ISO 8601 w ich pełnej postaci (zarówno podstawowej jak i rozszeżonej). Pasuje też do niektórych skróconych reprezentacji. Pole [1] jest używane do niektórych skróconych wersji, które pozwalają na przedstawienie roku w postaci jednej lub dwóch ostatnich cyfr. Należy zwrócić uwagę, że [11] to nie są milisekundy, tylko część ułamkowa ostatniego pola (np. T20.5 = T20:30).

Przy pisaniu tego korzystałem z ISO 8601:2000 w wersji z 2000-10-05.

Zwykle jednak bardziej interesujący jest podzbiór zdefiniowany przez W3C. Gotową funckcję w javascripcie, która parsuje taką datę można znaleźć na blogu Paula Sowdena.

2 komentarze | programowanietrackback

Perl i Qt

Wpis na 1. poziomie, wysłany 2005-12-21 19:11:37

/me dał się przekonać o wyższości Qt nad paroma innymi bibliotekami do grafiki. Ale jak jej użyć jak ja w C++ nie piszę (tylko w ANSI C). Z pomocą przychodzi PerlQt - ostatnio sporo w perlu piszę…
Moja refleksja: hmm… fajne :D Szkoda tylko że puic: File generated with too recent version of Qt Designer (3.3). Recent extensions won't be handled. :(

dodaj komentarz | programowanietrackback

pmpong

Wpis na 0. poziomie, wysłany 2005-12-12 22:45:57

Eh, szkolna „pracownia wolnego oprogramowania” nie jest zbyt przyjazna dla nie-roota… Nie można nawet wykonywać własnych programów.
Te terminale nadają się jedynie do tego żeby w coś na przerwie pograć, ale w co? Po raz setny we frozen-bubble, supertuxa (którego te komputery zresztą nie wyciągają), czy może lbreakouta…
Cóż poradzić, jedyną możliwością wykonania własnego kodu jest użycie języka skryptowego, którego interpreter jest zainstlowany. Wybór padł na perla. Gra?… hmm… to może PONG? :D Tak pong jest dobrym wyborem, szczegolnie po paru drobych usprawnieniach...
A więc oto wynik paru godzin mojego bezmyślnego klepania w klawiaturę: http://mwgamera.webpark.pl/pmpong/
Ściągać, grać i się cieszyć :P PONG ROX!

2 komentarze | ogólne programowanietrackback

Qt

Wpis na 1. poziomie, wysłany 2005-11-29 17:57:59

Zmieniłem trochę zdanie na temat Qt. Dotychczas mi się po prostu zbyt bardzo kojarzyła z KDE (a KDE i GNOME to najgorsze co może się przytrafić X'om). Po drobnej zmianie ustawień Qt okazała się być całkiem ładnym i wygodnym UI. Jak dla mnie pozostaja jeszcze jednak jedna mała wada: ja piszę w wielu językach, w tym w C, ale nie C++… Jednak zaczynam podzielać pogląd, że GTK (to o dziwo mi się z GNOME nie kojarzy :P) niedorównuje Qt.
Btw, dzięki 片翼の天使 za zwrócenie uwagi na Qt.

dodaj komentarz | programowanietrackback

ovebit

Wpis na 1. poziomie, wysłany 2005-11-01 21:10:35

Ciekawy pomysł mam... mocno inspirowany minigrą "takeover" we FreeDriod classic. Czyżby miała szanse powstać nowa gra logiczna? Może, jak zdążę zrobić relase zanim przestanie mnie to jarać :P Na razie zapowiada się dobrze...

2 komentarze | programowanietrackback

asombot: blacklist

Wpis na 1. poziomie, wysłany 2005-10-01 23:57:21

Żeby asombot nie służył jako idler ludziom, którzy mi się naprzykrzyli, zrobiłem mu blacklistę. Lista dotyczy niezależnie ludzi którzy nie mogą invite'ować i kanałów na które nie można invite'ować. Jako pierwszy zagościł w niej gość (i jego kanał na którym asombot dotychczas siedział), który wczoraj wieczorem próbował zrobić t/o demonowi. Dodatkowo, dla lepszej kontroli, zrobiłem polecenia join i part, które tylko ja mogę używać.

4 komentarze | ogólne programowanietrackback

usleep? delay!

Wpis na 1. poziomie, wysłany 2005-09-08 17:00:37

Jest rozwiązanie problemu przenośności usleep. Tym rozwiązaniem, przynajmniej częsciowym jest funkcja delay z modułu Crt w Turbo Pacalu.
Ale... TP jest brzydki i ssie :P

2 komentarze | programowanietrackback

usleep

Wpis na 0. poziomie, wysłany 2005-08-31 23:49:24

Czy istnieje przenośny odpowiednik usleep?... Wydaje mi się, że nie za bardzo. Z resztą 'man usleep' pisze:
This function is obsolete. Use nanosleep(2) or setitimer(2) instead.
No to zrobiłem:
int msleep(unsigned long usec) {
#if defined(__POSIX__)
   struct timespec time;
   time.tv_sec = 0; time.tv_nsec = usec * 1000;
   nanosleep(&time, NULL);
#elif /* miejsce na inne kombinacje dla innych systemów ... */
#else
# error Zdefiniuj se 'msleep'.
#endif
/* ... */
}

A ono mi na to "wała", nie ma __POSIX__. To wywaliłem te warunki niech się chociaż dla mojego systemu skompiluje a potem pomyśle. Dalej źle, to wywaliłem -ansi. Poszło, skompilowało się bez problemu, tylko nich mi ktoś powie czemu niezależnie z jakim argumentem wywołam to zatrzymuje mi program na ~0.5 sekundy?...
A ja chciałem zrobić na poczatku tak, żeby za pomocą instrukcji preprocesora zrobić kod kompilowalny również pod DOSa wzgl. win32... ale chyba to nie jest możliwe...

dodaj komentarz | programowanietrackback

Manual

Wpis na 1. poziomie, wysłany 2005-07-27 00:28:25

No, skończyłem pisać skrócony opis 9 aktualnie działających silników ASOM. Teraz manual jest już ukonczony (no, nie licząc tego, że będzie wciąż co jakiś czas poprawiany itd)… Heh… ale fajną mam zabawkę :P

1 komentarz | ogólne programowanietrackback

free asombot buffer

Wpis na 1. poziomie, wysłany 2005-07-26 20:55:22

Z powodu bardzo długich fortunek ostatnio na bash.org.pl musiałem wprowadzić nowe polecenie dla asombota aby nie drażnić użytkowników potokiem nechcianego tekstu (po prostu spamem). Nowe polecenie to freeb. Opróżnia bufor wyjsciowy asombota, co powoduje natychmiastowe przerwanie wypisywania jakiegokolwiek tekstu. Należy z tego polecenia kożystać rozważnie, gdyż należy pamiętać, że ktoś inny może czekać na swoje wyniki. (na szczęscie obciążenie asombota jest na tyle małe, że zwykle naraz używa go jedna osoba/kanał, więc można sobie pozwolić na użycie tego polecenia)
Manual asombota uzupełniony.

6 komentarzy | programowanietrackback


無料アクセスカウンターofuda.cc「全世界カウント計画」