Month: January 2007
świat nowych gier
do całkiem niedawna mogłem śmiało powiedzieć, że najnowszą grą w jaką grałem (z tych komercyjnych, bo jest jeszcze freeciv i xmoto) był quake2. teraz, pogrywam sobie czasem w quake3. wow. to jest skok.
na reklamy nowych gier patrzę czasem, ale mało mnie wzruszają.
do dziś. zobaczyłem trailer – nagrany kawałek gry – z gry "crysis". która ma wejść na rynek w pierwszym lub trzecim (zależnie w/g kogo) kwartale 2007.
zobaczyłem i padłem. co prawda już pojawiają sie żarty, że crysis wejdzie do sprzedaży w pierwszym kwartale, ale sprzęt na jakim zadziała będzie dopiero w czwartym, ale to nie ma znaczenia. poziom realizmu, połączeń między wydarzeniami, szczególików w grze po prostu powala. zobaczcie sami – uwaga. plik .mov ma prawie 100 megabajtów!
rewelacyjny plugin do firefoxa
często zdarza ci się mieć dużo otwartych zakładek w firefoxie? jak tak, to polecam przyjrzenie się temu pluginowi. działa on podobnie do "expose" z macosx – czyli po wciśnięciu przycisku, pojawiają ci się miniaturki wszystkich otwartych zakładek. gdy klikniesz w którąś z nich – zostanie wyciągnięta na pierwszy plan.
miniaturki zawierają "screenshota" z zakładki – oczywiście pomniejszonego. polecam spojrzeć – sam o tym wcześniej nie wiedziałem, a wydaje się być mocno użyteczne.
second life – open source!
w 1990 mało znany (wtedy) pisarz – neal stephenson opublikował swoją trzecią książkę – snowcrash, znaną pod polskim tytułem zamieć.
książka ta w/g mnie (i pewnie nie tylko) jest genialna. krótką recenzję jej napisał alex.
w książce tej stephenson przedstawił wizję "ulicy". jest to wirtualny świat (metawers), do którego dostęp jest z całego świata, korzystają z niego miliony ludzi. do czego? do wszystkiego. by pogadać, ubić biznes, spotkać się. to samo co w rzeczywistości. ale lepiej – bo w miejscu gdzie nie widać, że nie stać cię na porządne ciuchy czy mieszkanie.
w oparciu o wizję przedstawioną w książce (aha – ulica nie jest osią fabularną książki, jest to bardziej skomplikowane, polecam recenzję alexa oraz własnooczne przeczytanie 🙂 powstało kilka realnych produktów informatycznych.
w większości nieznanych.
z jednym wyjątkiem.
tym wyjątkiem jest "second life" firmy linden labs.
oczywiście można by się spierać czy second life "pochodzi od" metawersu. tym co mnie przekonuje to fakt, że tak jak i metawars tak i second life nie są grami mmorpg. nie łączysz się z grą by zabić smoka czy wziąć udział w jakiejś misji. łączysz się by po prostu żyć. tak jak chcesz. chcesz jeździć na desce? samochodem? projektować ciuchy? stać się gwiazdą? czy może wielkim posiadaczem ziemskim? to wszystko jest możliwe. i nie jest istotne jak wyglądasz w rzeczywistości. nie ważne, że nie masz kasy na paliwo do swojego "malucha". w second life możesz jeździć hummerem czy innym czołgiem. czy być projektantem wziętych ubrań. czy choćby "call-girl".
po co? a po co ludzie robią cokolwiek modyfikującego rzeczywistość? prochy? alkohol? światy gier rpg?
anyway – z second life korzystają setki tysięcy (jak nie miliony) ludzi. świat ten ma swoją walutę (wymienialną na dolary). ma gazety. ma spotkania. ma wszystko co ten (no, poza fizycznym kontaktem, ale to się pewnie zmieni).
najlepszym miernikiem rzeczywistości tego świata jest fakt iż dzienny obrót giełdy na której można kupić (za dolary lub "lindeny") rzeczy do użycia w grze przekroczył milion dolarów. faktycznych. prawdziwych.
ludzie kupują i sprzedają wszystko. ziemię, przedmioty, czas (np. wynajmując się do jakichś prac w second life).
od dawna chciałem spróbować. wejść w ten świat i zobaczyć czy i na ile odbiega od moich wyobrażeń stephensonowej ulicy. ale nie mogłem. aplikacje klienckie były tylko na windows i macos'a (była wersja linuksowa, ale miała kupę bugów).
ale. stał się cud. linden labs otworzyli kod klienta na licencji gpl v2. pozwoli to na szybkie udostępnienie klienta linuksowego. dzięki czemu i ja będę mógł sobie urządzić biuro w tym świecie.
po co? po to co inni. swoje biura w second life otworzyły już firmy takie jak microsoft, toyota, intel, cnet networks, dell, reuters czy sun. ma spotkania ze znanymi (w tym świecie – "first life"). ma swoich terrorystów. niedługo może się okazać, że to tam życie będzie oferowało więcej – choćby ze względu na faktyczny brak granic.
dla kogo się pracuje najlepiej?
magazyn "fortune" opublikował nową (na rok 2007) listę 100 firm dla których się najlepiej pracuje. nie chodzi o pensje. chodzi o ogólny "poziom zadowolenia z pracy".
lista jest dosyć interesująca. na pierwszym miejscu jest google, ale następna firma z branży it na liście jest dopiero na miejscu 8. i jest to "network appliances". yahoo – miejsce dopiero 44. cisco wyżej – 11 miejsce. microsoft – mimo (podobno) wielkiego zbiurokratyzowania i "korporacyjności" – jest na liście, na miejscu 50!.
na liście jest też kilka ciekawostek – najwyższa średnia pensja jest w pewnej firmie prawnej (kancelarii) – przy czym nie jest to najwyższa średnia na świecie, a jedynie najwyższa średnia wśród 100 firm z tejże listy.
lektura niemalże obowiązkowa dla każdego kto chciałby wyjechać z polski i poszukać szczęścia w stanach 🙂
kilka nowych postgresów
3 dni temu (zajęty byłem, nie mogłem od razu zblogować) core-team wypuścił kilka nowych wersji postgresql'a: 8.2.1, 8.1.6, 8.0.10, 7.4.15 i 7.3.17.
wersje te to typowe bugfixy – bez nowych funkcjonalności. tym niemniej – jeśli używasz postgresa – warto się zastanowić nad upgrade'em przynajnmniej w ramach swojej wersji głównej (7.3, 7.4, 8.0, 8.1 i 8.2) – poprawiono np. błędy związane z tym, że w pewnych określonych sytuacjach postgres mógł po prostu paść (backend, nie cała baza).
nieznany bohater: generate_series
kto z was wie o istnieniu funkcji generate_series() w postgresie? a kto z niej kiedykolwiek (nie testowo!) skorzystał?
wydaje mi się, że jest to najbardziej niedoceniania funkcja istniejąca w tym systemie bazodanowym.
co daje? zobacz:
select * from generate_series(0, 100);
na pierwszy rzut oka nic rewolucyjnego? taki tam sobie liczniczek?
zobaczmy więc kilka przykładowych zastosowań.
pierwsze:
mamy tabelkę, z polem id (z seriala), i chcemy sprawdzić czy są dziury w numeracji. tradycyjna metoda to jakieś joiny czy skanowanie sekwencyjne ze zliczaniem dziur w aplikacji klienckiej.
a zobaczmy coś takiego:
create table x as select * from generate_series(1, 10000) as x (i);
delete from x where random() < 0.0010;
w ten sposób uzyskaliśmy tabelę x, z numerycznym polem i. a w numeracji tego pola są dziury.
jak je wylistować? tak:
select * from generate_series(1, 10000) except select i from x;
voila. działa. ślicznie. i szybko 🙂
to było proste i oczywiste.
teraz przykład trochę mniej oczywisty – przykład jest z mojej pracy, ale użyję trochę uproszczonej wersji struktur danych 🙂
stwórzmy sobie tabelkę z użytkownikami:
CREATE TABLE users (id serial PRIMARY KEY, username TEXT, registered date);
ok. teraz – wstawmy do niej 10 użytkowników, z losowymi unikalnymi username'ami, i różnymi, losowymi datami rejestracji:
insert into users (username, registered) select 'user: ' || x.i, '2000-01-01'::date + cast(random()*1000 as int4) from generate_series(1, 10) as x(i);
mamy teraz w users 10 użytkowników. daty rejestracji są losowane z zakresu ‘2000-01-01' do ‘2002-09-27';
teraz. to co potrzebowałem to musiałem wygenerować "faktury" dla użytkowników. w tym zaległe.
idea była taka, że w tabelce z fakturami:
CREATE TABLE invoices (id serial PRIMARY KEY, user_id INT4, paid_from date, paid_to date, status INT4);
są trzymane faktury użytkowników. każda faktura jest na 30 dni. musimy wstawić każdemu użytkownikowi tyle faktur by obejmowały cały okres od daty rejestracji użytkownika do chwili obecnej.
przykładowo:
jeśli mielibyśmy użytkownika który zarejestrował się 2006-12-01 (a dziś jest 2007-01-11) to musielibyśmy wygenerować dla niego 2 faktury:
- od 2006-12-01 do 2006-12-30
- od 2007-12-31 do 2007-01-29
dalszych nie, bo musimy zakończyć faktury na fakturze "aktualnej".
pierwsze co potrzebujemy to wiedzieć ile maksymalnie nam się może faktur wygenerować dla pojedynczego użytkownika. w naszym przypadku sprawdzamy to poprzez:
select ceil((now()::date - min(registered))/30.0) from users;
u mnie pokazało się 83.
ponieważ lubię proste liczby, zaokrąglę sobie to do 100. nie ma żadnego matematycznego uzasadnienia – po prostu tak wolę.
tak więc. to co nam się przyda to generate_series(1,100), a dokładniej generate_series(0,100).
pierwsze zapytanie które napiszemy zwróci nam dla danego użytkownika (na razie tylko jednego) listę 101 faktur (od 0 do 100):
SELECT u.registered + (x.i * 30), u.registered + (x.i*30) + 29 FROM users u, generate_series(0, 100) as x(i) WHERE u.id = 1;
zwracam uwagę na to, że nie mamy żadnego warunku na połączenie users i generate_series – nie jest to join, ale tzw. kartezjan.
jak widać – zapytanie zadziałało.
teraz musimy je ograniczyć, by zwróciło dane tylko do aktualnych:
SELECT
u.registered + (x.i * 30), u.registered + (x.i*30) + 29
FROM
users u, generate_series(0, 100) as x(i)
WHERE
u.id = 1
AND now()::date >= u.registered + (x.i * 30)
;
wow. działa.
to teraz. ponieważ mamy do czynienia z kartezjanem a nie joinem, to usunięcie "where u.id = 1" nie spowoduje uszkodzenia danych, tylko wypełnienie ich dla wszystkich userów.
dzięki czemu możemy zapisać finalne zapytanie w postaci:
INSERT INTO invoices (user_id, paid_from, paid_to, status)
SELECT
u.id,
u.registered + (x.i * 30),
u.registered + (x.i*30) + 29,
0
FROM
users u, generate_series(0, 100) as x(i)
WHERE
now()::date >= u.registered + (x.i * 30)
;
czy na pewno zadziałało dobrze?
zobaczmy:
SELECT
u.id,
u.registered,
( SELECT count(*) FROM invoices i WHERE i.user_id = u.id ) as invoice_count,
i1.paid_from as invoice1_from,
i1.paid_to as invoice1_to,
i2.paid_from as invoice2_from,
i2.paid_to as invoice2_to,
now()::date as "now"
FROM
users u,
invoices i1,
invoices i2
WHERE
i1.id = (SELECT min(t.id) FROM invoices t WHERE t.user_id = u.id)
AND
i2.id = (SELECT max(t.id) FROM invoices t WHERE t.user_id = u.id)
;
u mnie wszystko zadziałało ok.
jak widać (mam nadzieję) – generate_series potrafi sporo. generowanie list liczb pozwala na robienie np. robienie zestawień, włącznie z wyświetlaniem sum danych nieistniejących, sprawdzanie braków, "zgadywanie" pewnych wartości.
pozostaje zachęcić was do testowania i bawienia się – to czym i jak się bawicie jest niejednokrotnie ważniejsze od finalnego efektu – efekt jest jednorazowy. zabawa owocuje wiedzą która zostaje i kiedyś sie przyda.
aha. ważna notatka – generate_series zostało dodane w 8.0. no ale przecież chyba nikt już nie używa baz starszych 🙂 (żartuję oczywiście)
trackbacki
od czasu gdy zainstalowałem sobie wp-hashcasha i wywaliłem w diabły akismet, nie mam w ogóle spamerskich komentarzy.
ale.
ale jest coś takiego jak trackback. trackbacki nie podlegają filtrowaniu, są w pełni automatyczne, a na stronach wyświetlają się tak jak komentarze.
raj dla spamerów.
kiedyś strasznie mi tym spamowali jeden post nt. tego kto zagra jokera w batmanie. wyblokowałem trackbacki do tego postu. od kilku dni jednakże dostaję po kilka spamerskich trackbacków do innych postów.
przykład?
do wyciąg z logów apache'a, od "22/Dec/2006:14:26:08 +0000" do teraz. pierwsza kolumna to ilość trackbacków, druga – który post miał ich tyle:
756 /index.php/2006/07/22/kto-zagra-jokera-w-kontynuacji-batman-begins/trackback/
2 /index.php/2006/12/07/niagara-2-zapowiedzi/trackback/
1 /index.php/2007/01/06/wyszukiwanie-wg-nipu/trackback/
1 /index.php/2007/01/05/nowe-sciany/trackback/
1 /index.php/2007/01/02/nowe-opony/trackback/
1 /index.php/2007/01/02/meta-poprawka/trackback/
1 /index.php/2006/12/27/lorem-ipsum/trackback/
1 /index.php/2006/12/25/nowy-koncept-jaguara/trackback/
1 /index.php/2006/12/23/searchmash-firefox/trackback/
1 /index.php/2006/12/23/nowe-lamborghini/trackback/
1 /index.php/2006/12/20/lepszy-malloc/trackback/
1 /index.php/2006/12/07/kolejna-kultowa-firma-przejeta-przez-nudnego-molocha/trackback/
1 /index.php/2006/12/07/google-zmieni-swiat/trackback/
1 /index.php/2006/12/01/ciekawy-benchmark/trackback/
1 /index.php/2006/05/30/jak-wyglada-kokaina/trackback/
śmieszne. niestety – jak do tej pory nikt nie użył trackbacków do niczego innego niż spamowanie, więc po prostu pewnie wyłączę w całości obsługę takich urli (mod_rewrite rządzi).
macie jakieś inne pomysły? czy to co stanowi podwaliny "blogosfery" (blograjdołka:) musi zniknąć?
tapeta na dziś
apple-telefon
od dosyć dawna w sieci pełno było spekulacji nt. tego, że apple ma wyprodukować telefon gsm.
pojawiały się informacje, że będzie to iphone, potem się okazało, że taki produkt faktycznie został wypuszczony, ale jest to telefon cisco (a dokładniej należącego do cisco linksysa). w szczególności – był to nie tyle telefon, co cała seria telefonów.
jednakże okazało się, że w plotkach była część prawdy – apple jednak przygotowywał telefon. i faktycznie nazywa się iPhone.
co potrafi? (jak wygląda można zobaczyć tu).
to co standardowa komórka, plus kilka dodatkowych "myków". muzyka, fotografie (ma wbudowany 2megapikselowy aparat), filmy (komórka jest wyposażona w duży ekran – dużo większy niż w normalnych telefonach. było to możliwe dzięki temu, że telefon nie ma klawiatury.
komórka będzie miała 4 lub 8 giga pamięci. na pokładzie macosx, z kilkoma fajnymi aplikacjami – po pierwsze, normalna przeglądarka – safari. po drugie – zintegrowany google search i mapsy. do tego kilka miłych feature'ów:
- dzwonienie bezpośrednio z interfejsu google-maps
- czujnik zbliżeniowy wykrywający, że np. telefon jest blisko ucha i włączający funkcje telefoniczne
- ekran typu multi-touch
- czujnik położenia, dzięki czemu aparat wie kiedy jest odwrócony i wie, że trzeba przełączyć ekran w inny tryb pracy (pion/poziom).
całość oczywiście bardzo designerska i wygodna. kiedy w polsce? nie wiadomo. wiadomo, że na razie w stanach sprzedawać go będzie tylko jeden z operatorów (cingular).