Opolski facemash
March 19th, 2011
W przypływie nudy, a w zasadzie po obejrzeniu filmu The Social Network pokusiłem się o stworzenie takiej samej strony. Kwestia o tyle ciekawa, że w filmie pokazane były ‘niezabezpieczone serwery’ jako źródło zdjęć. W rzeczywistości wystarczy kilkadziesiąt linii kodu i troche pomysłowości aby gwizdnąć zdjęcie główne każdej opolanki na naszej klasie… A jakoże nie wszyscy mają ‘nadające się’ zdjęcia ustawione jako główne, to używamy face recognition w postaci OpenCV do filtracji. Oto i efekt:
Numery gg @ NK
October 16th, 2010
Z braku pomysłów na coś ciekawszego znowu zainteresowałem się tematem naszej klasy. Z pomocą tym razem przyszedł mi skrypt JSON przez jaki NK pobiera znajomych. Okazuje się, że da się sprawdzać jaki ktoś ma status na NKtalku. Kilkanaście minut pisania, kilka minut czekania i efekt całkiem ciekawy… Read the rest of this entry »
Nasza klasa ponownie
June 6th, 2010
Znalazłem ostatnio całkiem fajną bibliotekę – ScrapeMark. Ułatwia mi pracę pod tym względem, że gdy sam układałem ekspresje regularne były one dosyć sztywne, czyli wystarczyło zmienić w HTMLu styl i już wszystko się sypało.
Tutaj mogę śmiało ekspresję ułożyć tak:
<a>{{ text }}</a>
A zwróci mi wyniki (bez HTMLu) dla każdego z tych:
<a class="xyz"><img src="somewhere">Costam</a> -> Costam <a href="gdziestam" style="font-style:bold;">Tu i tam </a> -> Tu i tam
Ubolewam tylko nad jedną rzeczą…
Read the rest of this entry »
“O sobie” II
May 23rd, 2010
W końcu wziąłem się do roboty i spróbowałem pozyskać więcej numerów gg i coś z nimi zrobić. Jak już pisałem w “O sobie” często coś ciekawego można znaleść w róznych kolumnach. Oczywiście info nie ogranicza się tylko do numerów GG (bardzo popularne są też maile), ale numery postanowiłem przeszukać najpierw. Skrypcik do wyszukiwania wyglądał więc tak:
Błędy na początku
March 7th, 2010
Po raz kolejny dostałem po łapach za moją niekonsekwentność. Zwykle projekty staram się jak najszybciej doprowadzić do jako-takiego działania, po to żeby:
- Projekt mógł już działać podczas kiedy ja wciąż zajmuje się developingiem
- Wstępnie już mieć bazę do testów
- Móc już conieco się przyjrzeć praktyce, a nie projektować kolejnych funkcji na teorii
Takiego podejście może byłoby i owocne, ALE:
- Trzeba już na początku mieć dobre pojęcie o tym co mamy zamiar zrobić (I wziąć to pod uwagę przy projektowaniu bazy!)
- Nie iść na skróty
- Czas developingu powinien być jak najkrótszy
Tak naprawdę nie zastosowałem się do żadnego z tych punktów. Dziś w końcu zdecydowałem się ogranąć trochę kod całego fetchera i przynajmniej zastosować się do części “Good programming practise”. Cóż, nigdy zbytnio nie przejmowałem się nazwenictwem zmiennych, więc czekały mnie m.in. takie kwiatki:
for id in friends:
cursor.execute("REPLACE INTO husers (id, name, city, friends,fictional,date) VALUES (%s, %s, %s, %s,%s,%s)" ,(id, clean(friends[id]["first_name"]), clean(friends[id]["city"]), friends[id]["friends"],str(friends[id]["fictional"]),friends[id]["date"]))
Co miałem na myśli pierwotnie odwołując się do friends przez… iterację friends (?) – nie mam pojęcia. W ogóle nie wiem jakim cudem to działa, więc zdecydowałem się tego nawet nie ruszać
Mieszanie języków też nie było nigdy czymś czym bym się przejmował… i tak oto, jak powyższy fragment wyglądał jeszcze przed wstępnymi poprawkami:
cursor.execute("REPLACE INTO husers (id, imie, miasto, znajomi) VALUES (%s, %s, %s,%s)" , (id, clean(friends[id]["Imie"]), clean(friends[id]["Miasto"]), friends[id]["Znajomi"]))
Tabela z angielskiego ‘half-users’, kolumny w tabeli już po polsku. Tablica z danymi po angielsku, kolumny znów po polsku… No, logiczne przecież, nie?
O ile było jeszcze kilka ciekawych kwiatków, to największy problem napotkałem przy unifikacji bazy danych. Tu już w ogóle zaczynała się jazda bez trzymanki biorąc pod uwagę, że z 4 mln rekordów:
- 2 mln nie miało określonych czy są kontami fikcyjnymi, czy nie
- Million nie rozróżniał danych ukrytych od ich braku w ogóle, w 1,5mln ukrycie było oznaczone jako “ukryte”, w 1 mln ukrycie oznaczono było jako “[Ukryte]“, a w ostatniej połówce jako “#UKR#-1″
- W zdjęciach był taki bajzel, że w ogóle nie mam ochoty nawet opisywać
- Dawni półużytkownicy nie tylko byli zapisani w innym formacie, to jeszcze nie mieli zapisanej dla siebie “daty odkrycia”
- Duplikaty we wszystkich tabelach referencyjnych.
Nie ma co ukrywać, baza w takim stanie jest prawie nie do odratowania. Zastanawiam się raczej jak takich błędów unikać na przyszłość.
Jeśli chodzi o punkty 1-4 to rozwiązanie nasuwa się samo: projektować tabele tak by nie były potrzebne w przyszłości żadne zmiany.
A punkt 5?
Cóż, MyISAM nie daje żadnej możliwości ustawiania kluczy referencyjnych, czyli omijanie duplikatów mogę zrobić tylko programowo. Sprawdzanie czy taki rekord nie istnieje za każdym razem na tabeli z liczbą wierszy >4mln niestety nie jest dobrym pomysłem. Wygląda na to, że będę musiał przeskoczyć na InnoDB. Kwestia tylko taka, czy VPS za 40zł miesięcznie jest to w stanie utrzymać :-/
PS & Offtopic:
Trzeci raz już czytam ten tekst i trzeci raz widzę błędy ala literówki/brak zaprzeczeń (!?)
