rocznica technologii stealth

dowiedziałem się właśnie przypadkiem (przeglądając archiwum skunk-works), że 16 sierpnia zeszłego roku była okrągła, 50 rocznica początku prac nad tym co z biegiem czasu stało się technologią stealth.
na początku chodziło po prostu o zmniejszenie radarowego echa odbitego od samolotu. rozpoczęto wtedy prace nad "project rainbow". prace zakończone porażką. ale była to pierwsza znana chwila gdy ktoś celowo i (w miarę) systematycznie pracował nad ukryciem samolotu przed radarami.
fajne. w sumie – pewnie sama ta informacja przez długi czas była tajna 🙂

lampy

eh. i kolejny produkt którego nie mam jak kupić 🙁
trafiłem na stronę firmy eurofase. wbrew nazwie nie ma nic wspólnego z europą.
firma zajmuje sie produkcją wszystkiego co świeci. żyrandole, kinkiety, lampy ogrodowe. i to co robią jest zdecydowanie mniej "masowe" – w rozumieniu wyglądu, a i pewnie ceny.
przykłady które mnie zafascynowały – seria żyrandoli opartych na motywach roślinnych:

czytanie manuali popłaca

eh. od dawna mi tego brakowało w postgresie. i okazało się, że niepotrzebnie, bo już od 8.1 jest! wyłączanie triggerów. pojedynczo. każdy można tymczasowo wyłączyć.
na wypadek gdybyście nie wiedzieli:

# ALTER TABLE test DISABLE TRIGGER xxx;

gdzie xxx to nazwa triggera, lub słowo "ALL" jeśli chcemy wyłączyć wszystkie triggery, lub słowo "USER" jeśli chcemy wyłączyć wszystkie triggery, ale pozostawić działające klucze obce (które są realizowane triggerami).
włączenie z powrotem to:

# ALTER TABLE test ENABLE TRIGGER xxx;

jedynym problemem z tym polega na tym, że w psql'u, przy robieniu \d tabeli nie widać które triggery są wyłączone:

# create table x (id serial primary key, wstawiana text);
# CREATE TRIGGER test AFTER INSERT OR UPDATE ON x FOR EACH ROW EXECUTE PROCEDURE test();
# CREATE TRIGGER test_u AFTER UPDATE ON x FOR EACH ROW EXECUTE PROCEDURE test_u();
# alter table x disable trigger test;
# \d x
                           Table "public.x"
  Column   |  Type   |                   Modifiers
-----------+---------+------------------------------------------------
 id        | integer | not null default nextval('x_id_seq'::regclass)
 wstawiana | text    |
Indexes:
    "x_pkey" PRIMARY KEY, btree (id)
Triggers:
    test AFTER INSERT OR UPDATE ON x FOR EACH ROW EXECUTE PROCEDURE test()
    test_u AFTER UPDATE ON x FOR EACH ROW EXECUTE PROCEDURE test_u()

można sobie ręcznie sprawdzić które triggery są wyłączone:

# select t.tgname, t.tgenabled from pg_class c join pg_trigger t on c.oid = tgrelid where c.relname = 'x';
 tgname | tgenabled
--------+-----------
 test_u | t
 test   | f
(2 rows)

w 8.3 na szczęście jest to już poprawione:

# \d x
                           Table "public.x"
  Column   |  Type   |                   Modifiers
-----------+---------+------------------------------------------------
 id        | integer | not null default nextval('x_id_seq'::regclass)
 wstawiana | text    |
Indexes:
    "x_pkey" PRIMARY KEY, btree (id)
Triggers:
    test_u AFTER UPDATE ON x FOR EACH ROW EXECUTE PROCEDURE test_u()
Disabled triggers:
    test AFTER INSERT OR UPDATE ON x FOR EACH ROW EXECUTE PROCEDURE test()

słodko 🙂

śmierć samobójcy

uwaga – czarny humor. i to nie jest żart tylko rzeczywistość. jak nie chcesz się poczuć dotknięty/obrażony – nie klikaj dalej.

 

kierowca ciężarówki w stanach ząłamał się gdy jego ciężarówka została skradziona.
stwierdził, że popełni samobójstwo.
rzucił sie na tory, ale pociąg wyhamował. facet nie chciał zejść z torów, więc go zniesiono i wezwano policję (co by się nim zaopiekowali czy coś).
policja przyjechała – dwóch oficerów. pobili kolesia na śmierć.
ja wiem. to nie jest śmieszne. i tak dalej. ale po prostu padłem jak to przeczytałem.

piękne i bestie

"rm auctions". kanadyjska firma która ma bardzo ciekawą niszę rynkową. wyszukuje piękne samochody. kupuje je, po czym, po uzbieraniu pewnej ilości (zazwyczaj do 100) robi aukcję w scottdale w arizonie.
właśnie trwa kolejna edycja ich aukcji.
na autoblogu pojawiły sie pierwsze wpisy o wygranych aukcjach i muszę przyznać, że jestem zauroczony.
poniżej lista tego co już opisali. zdjęcia są linkami do postów na autoblogu gdzie możecie więcej poczytać o samochodzie (np. że plymuth ma tylko 300 mil przebiegu, a duesenberg należał do znanego malarza i jest w całości na oryginalnych (od nowości) częściach – bo przejechał tylko 10000mil.

  1. plymuth hemi ‘cuda z 1971 roku. kabriolet (co widać). cena zapłacona – $2,200,000.
  2. Rolls-Royce 40/50HP Silver Ghost ROI Des Belges z 1911 roku. $725,000.
  3. Duesenberg Model SJ Cabriolet, z roku 1937. $2,550,000
  4. Shelby 427 S/C Cobra Roadster z 1967 roku. $1,300,000.
  5. Delahaye Type 135 Special z 1936 roku. $1,200,000.
  6. Porsche 956 Group C Endurance Racing Coupe z 1982. wystawiony, ale nie sprzedany. cena wywoławcza: $2,000,000.
  7. Ford Model A Rear Entry Tonneau z 1903 roku!. $630,000.
  8. Chevrolet Corvette L88 Roadsterz 1967 roku. niesprzedany z ceną wywoławczą $1,550,000.
  9. Ferrari Dino 206 SP z 1966 roku. niesprzedane. cena wywoławcza: $1,000,000.
  10. Bugatti Type 37A Grand Prix Car z 1927 roku. $445,000.

jednocześnie z częścią rm auctions, w scottdale są też licytowane samochody sprzedawane przez inne firmy. np. ten:
Shelby Cobra 427 Supersnake z 1966 – jedyny istniejący model z podwójnym doładowaniem. osobisty samochód carrolla shelby'ego. sprzedany za, bagatela, $5,000,000.

prosta genealogia

wiele razy zbierałem sie do zrobienia swojego drzewa genealogicznego. podobno gdzieś tam kiedyś mój przodek był "posiadaczem ziemskim".
niestety – znajdywanie danych to jedno, ale samo rysowanie czy korzystanie z jakiegoś programu do rozrysowywania drzewa zawsze było skomplikowane. lub płatne. lub jedno i drugie.
do teraz.
na fali "web 2.0" powstał serwis geni.com. każdy może w nim w bardzo prosty sposób zrobić swoje drzewo. soft jest we flashu, ale wszystkie dane są trzymane na serwerze i (częściowo) asynchronicznie dociągane.
generowanie drzewa jest proste – przy każdej dopisywanej osobie można zaznaczyć czy żyje czy nie, jakiego ma emaila (o ile ma). jak ma to system automatycznie zasugeruje zaproszenie danej osoby do geni.com. dzięki czemu można np. zaprosić rodziców by wpisywali elementy "wyżej" – których samemu sie już nie pamięta.
interfejs jest dosyć przemyślany – oddzielne gałęzie (rodzina żony) są ukrywane i pokazywane dopiero po kliknięciu – dzięki temu nie ma ryzyka, że na raz na ekranie będziemy mieli 1500 osób 🙂
polecam się zapoznać – choćby po to by zobaczyć ile faktycznie osób z rodziny sie pamięta.

kolejny “otwarty” stuff – c.d.

miesiąc temu pisałem o openmoko – głównie w kontekście ciekawostki – projekt bazujący na otwartej specyfikacji, ale bez zadęcia w stronę "open*" über alles.
dziś się dowiedziałem, że panowie od openmoko obwieścili timeline tego co będzie:

  1. 2007-02-11 : udostępnienie pełnych źródeł linuksa użytego na openmoko. wybrani programiści na świecie dostaną darmowe telefony.
  2. 2007-03-11 : telefon pojawi się w internetowym sklepie openmoko.com. ma kosztować $350
  3. 2007-09-11 : telefon wejdzie do sprzedaży do tradycyjnych kanałów – sklepy, sieci komórkowe itp.

mniej więcej w czasie etapu 3 pojawi się nowy model. co będzie zawierał nie wiadomo – ludzie od projektu maja pomysły, ale informują, że to i tak developerzy i użytkownicy będą wybierać/wpływać na to co finalnie tam trafi.
no cóż. pozostaje czekać. z przyjemnością przyjrzałbym się tej komórce.

perl best practices critic

jakiś czas temu damian conway napisał "perl best practices" ("perl. najlepsze rozwiązania"). zawarł w niej szereg sugestii jak pisać.
książkę ogólnie polecam, choć nie zgadzam się ze wszystkim co napisał. ale to już inna bajka.
w oparciu o to co napisał, powstał program: perlcritic (można go zainstalować przez "install Perl::Critic" w shellu cpanowym).
program ten analizuje twój program perlowy i wypisuje błędy (błędy czytaj konstrukcje inne niż zalecane przez damiana). wraz z odnośnikami do numerów stron w książce!
warto zobaczyć jak to wygląda. przykładowo. dla jednego z moich (działających!) programów wynik perlcritica wygląda tak:

=> perlcritic archiveMails.pl
Code before strictures are enabled at line 9, column 1.  See page 429 of PBP.  (Severity: 5)
Integer with leading zeros at line 75, column 55.  See page 58 of PBP.  (Severity: 5)
Don't modify $_ in list functions at line 94, column 37.  See page 114 of PBP.  (Severity: 5)

nie najgorzej. nie? zobaczmy co się dzieje jak każę mu wyświetlać wszystkie błędy, a nie tylko krytyczne:
ojć. całości nie pokażę. za dużo, ale to mogę pokazać:

=> perlcritic -1 archiveMails.pl  | wc -l
69

to mało mówi. więc zróbmy prostą statystykę:

=> perlcritic -1 archiveMails.pl  | perl -pe 's/at line \d+, column \d+/at line X, column Y/' | sort | uniq -c | sort -nr
     14 Mixed-case variable name(s) at line X, column Y.  See page 44 of PBP.  (Severity: 1)
     10 Regular expression without "/x" flag at line X, column Y.  See page 236 of PBP.  (Severity: 3)
      9 Regular expression without "/m" flag at line X, column Y.  See page 237 of PBP.  (Severity: 2)
      6 Builtin function called with parens at line X, column Y.  See page 13 of PBP.  (Severity: 1)
      4 Postfix control "unless" used at line X, column Y.  See pages 96,97 of PBP.  (Severity: 2)
      3 Useless interpolation of literal string at line X, column Y.  See page 51 of PBP.  (Severity: 1)
      3 Subroutine does not end with "return" at line X, column Y.  See page 197 of PBP.  (Severity: 4)
      2 "unless" block used at line X, column Y.  See page 97 of PBP.  (Severity: 2)
      2 Mixed-case subroutine name at line X, column Y.  See page 44 of PBP.  (Severity: 1)
      2 File handle for "print" is not braced at line X, column Y.  See page 217 of PBP.  (Severity: 1)
      1 RCS keywords $Revision$, $Source$, $Date$ not found at line X, column Y.  See page 441 of PBP.  (Severity: 2)
      1 RCS keywords $Revision$, $HeadURL$, $Date$ not found at line X, column Y.  See page 441 of PBP.  (Severity: 2)
      1 RCS keywords $Id$ not found at line X, column Y.  See page 441 of PBP.  (Severity: 2)
      1 Postfix control "if" used at line X, column Y.  See pages 93,94 of PBP.  (Severity: 2)
      1 Package variable declared or used at line X, column Y.  See pages 73,75 of PBP.  (Severity: 3)
      1 No "VERSION" variable found at line X, column Y.  See page 404 of PBP.  (Severity: 2)
      1 Integer with leading zeros at line X, column Y.  See page 58 of PBP.  (Severity: 5)
      1 Forbid $b before $a in sort blocks at line X, column Y.  See page 152 of PBP.  (Severity: 1)
      1 Double-sigil dereference at line X, column Y.  See page 228 of PBP.  (Severity: 2)
      1 Don't modify $_ in list functions at line X, column Y.  See page 114 of PBP.  (Severity: 5)
      1 Code is not tidy at line X, column Y.  See page 33 of PBP.  (Severity: 1)
      1 Code before warnings are enabled at line X, column Y.  See page 431 of PBP.  (Severity: 4)
      1 Code before strictures are enabled at line X, column Y.  See page 429 of PBP.  (Severity: 5)
      1 Capture variable used outside conditional at line X, column Y.  See page 253 of PBP.  (Severity: 3)

łał. a przypominam – ten kod działa i robi co trzeba.
tak czy inaczej – warto spojrzeć. to co perlcritic pokazuje, to czasem całkowicie nieistotne szczegóły (jak np. mixed case variable name), ale czasem jest to coś co warto poprawić. sam po przeczytaniu best practices sporo zmieniłem w swoim stylu kodowania.