Szybki kurs Twitter Bootstrap, lekcja numer 1

Twitter Bootstrap. W wielkim skrócie: framework/toolkit HTML5/CSS/JS napisany przez ludzi z Twittera służący co prostego tworzenia estetycznych i funkcjonalnych interfaceów użytkownika. Tyle. Temat można drążyć długo i namiętnie, ja do tej dyskusji nie będę się dołączał i zamiast dywagacji i opisów możliwości skoncentruję się na szybkim kursie korzystania z Twitter Bootstrap.

Lekcja numer 1: Instalacja

<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8">
<title>Twitter Bootstrap Tutorial Lesson 1</title>
<link href="bootstrap/css/bootstrap.css" rel="stylesheet" />
</head>
<body>

	<!-- Kod strony idzie tutaj -->

	<script type="text/javascript"
		src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
	<script src="bootstrap/js/bootstrap.js"></script>
</body>
</html>

Apache, to prefork czy worker?

Jak sprawdzić czy apache pracuje w trybie mpm-worker czy mpm-prefork?

apache2 -V | grep MPM

W efekcie otrzymamy na przykład coś takiego:

Server MPM:     Prefork

Jak zdjąć korbę bez ściągacza?

Jak zdjąć korbę bez użycia ściągacza? Okazało się, że bardzo prosto. Gdy walenie młotkiem nic nie daje, wykonujemy co następuje:

  1. wykręcić śruby mocujące
  2. WD-40 do środka
  3. odczekać kilkanaście minut
  4. wkręcić śruby mocujące na ‚luźno’
  5. pójść się przejechać. Tylko powoli i ostrożnie.
  6. przy pierwszych śladach luzu zejść z roweru
W moim przypadku wystarczył dystans 100m.

PHP 5.3: Late Static Binding

Late static binding

Co by mówili jego przeciwnicy, PHP ciągle się rozwija i z wersji na wersję posiada coraz więcej ciekawych i przydatnych (zwykle) możliwości. Aktualna wersja PHP, czyli z rodziny 5.3, oprócz takich ciekawostek jak przestrzenie nazw (namespace), operator goto (ok, raz na milion linii kodu może się przydać ;]), czy funkcji anonimowych i domknięć, wprowadziło coś co wreszcie wyprostowało użycie metod i atrybutów statycznych: późne statyczne łączenie (Late Static Binding, LSB).

Ale zacznijmy od początku. Ponieważ jawne wywoływanie klasy w której zdefiniowana jest metoda statyczna wewnątrz tej klasy jest raczej mało wygodne, PHP udostępnia słowo kluczowe self. Umożliwia ono proste wywołanie metody (i atrybutu) statycznego wewnątrz klasy do której przynależy. Przykładowo:

class fotel {

	static protected function getName() {
		return 'Jestem fotelem';
	}

	static public function echoMyName() {
		echo self::getName();
	}

}

fotel::echoMyName();

Metoda fotel::echoMyName wywoła metodę statyczną fotel::getName() bez podawania nazwy klasy. Proste? Proste i eleganckie. Niestety, nie pozbawione wad, gdyż słowo kluczowe self wywołuje statyka należącego do tej samej klasy w której jest użyte. Nie uwzględnia dziedziczenia.

Czytaj dalej

Pobieranie zdjęcia profilowego z Facebooka przy pomocy PHP API

API Facebooka jest fajne, ale trochę z nim pracując ostatnimi czasy zauważyłem, że nie zawsze wszystko jest udokumentowane tak dobrze, jakbym chciał. Przykładowo, dziś spędziłem jakieś 30 minut szukając sposobu na pobranie URLa do zdjęcia profilowego użytkownika przy wykorzystaniu PHP API.

Niby jest sposób polegający na wywołaniu http://graph.facebook.com/[_id_usera_]/picture , ale nie wydawał mi się on wystarczająco ‚elegancki’. W końcu, jeśli już własną aplikację napisaną w PHP, to czemu nie zrobić tego porządnie?

Zakładam, że mamy już zainstalowane i skonfigurowane PHPowe API Facebooka (jeśli nie, poszukajcie w sieci). W tym momencie wystarczy prosta funkcja:

function getFbPictureUrl($facebookID) {

	global $config;

	$retVal = null;

	try {
			
		$fb=new Facebook(array(
  'appId'  => $config['facebook']['appId'],
  'secret' => $config['facebook']['secret'],
  'cookie' => $config['facebook']['cookie']
		));

		$data = $fb->api($facebookID, array(
    'fields' => 'picture',
    'type' => 'large'
    ));

    $retVal = $data['picture'];

	}catch (Exception $e) {
		$retVal = null;
	}

	return $retVal;
}

Zamiast $config[‚facebook’][‚appId’] i tak dalej wstawiamy dane naszej aplikacji i już. Funkcja zwróci URL do zdjęcia profilowego użytkownika z CDNu, lub null w przypadku błędu.

Trzeba tylko pamiętać, aby $facebookID przekazywać jako string. Zapytanie może trochę trwać, więc polecam dodanie jakiegoś cache.

Optymalizacja MySQL, część 2 – Indeksy

Wstęp

Od ostatniego mojego artykułu na temat optymalizacji zapytań do bazy MySQL minęło sporo czasu. Nadszedł czas na kontynuację tematu. Tak samo jak poprzednio, tematem będzie wpływ indeksów na wydajność (czas wykonywania) zapytań. Jednak tym razem, zamiast skupiać się na problemie odczytu z bazy, napiszę kilka słów na temat zapisów i jaki wpływ na nie ma liczba indeksów.
Jak udowodniłem w poprzednim artykule, właściwie założone indeksy i właściwie sformułowane zapytania są w stanie wielokrotnie zmniejszyć czas odpowiedzi serwera MySQL. W niektórych przypadkach, nawet setki razy. A jak wygląda sprawa indeksów przy zapisach do tabel? No cóż, trochę inaczej…

Co się dzieje przy zapisie

Indeks jako taki, można nazwać uporządkowaną strukturą przechowująca wartości pól tabeli wraz z odnośnikami do zawierających je rekordów. Jeśli baza danych dostanie polecenie znalezienia rekordów spełniających określony warunek na indeksowanej kolumnie, nie będzie musiała skanować wszystkich rekordów w tabeli aby odszukać te spełniające warunek. Wystarczy, że odwoła się do indeksu, odpowiednim algorytmem odnajdzie właściwy wpis w indeksie (pamiętajmy, że indeks jest posortowany, więc odszukanie wartości może być bardzo szybkie) i na podstawie odnośników odszuka właściwe rekordy w tabeli. Jest to dużo szybsze niż skanowanie wszystkich wpisów w tabeli.
Pewne niedogodności związane z indeksami zaczynają pojawiać się, gdy zaczynamy dokonywać zapisów w tabeli. W szczególności w polach, które zawierają się w dowolnym indeksie. Jak wspominałem, indeks zawiera posortowane wartości z pól. Jeśli zmodyfikujemy wartość pola (lub dodamy nowy rekord), indeksy z nim powiązane będą musiały być odtworzone. To znaczy: musi nastąpić odbudowa odnośników pomiędzy wartościami indeksu i przyporządkowanymi im polami oraz posortowanie wartości w indeksie. Przy dużej ilości rekordów lub duże liczbie indeksów może to być czasochłonne. Co więcej, wykonywane przy każdym zapisie. No i mamy problem. Bez indeksów wolno przy odczycie, z indeksami wolniej przy zapisie. A o ile wolniej? Postanowiłem to sprawdzić…

Czytaj dalej

Battlefield Bad Company 2 – Subiektywny przegląd broni, część 1

O samej grze Battlefield Bad Company 2 napisano i powiedziano już dużo. Moim zdaniem jest to obecnie najlepszy multiplayer FPS i kropka (singiel jest dobry, ale w porównaniu do multi się chowa). Gram w BF:BC2 od marca 2010 i ciągle nie mam dość.  Może nie jestem mistrzem, ale najgorszy też chyba nie. W najbliższym czasie postaram się zamieścić kilka wpisów na temat gry, głównie w kontekście gry online. Dziś pierwsza część subiektywnego (bardzo subiektywnego) przewodnika po uzbrojeniu.

M416

Moim zdaniem najlepsza broń w całej grze. Co prawda, przez dłuższy czas nie mogłem się do niej przekonać i preferowałem AN-94 Abakan, lecz gdy poznałem jej sekrety, stała się moim ulubionym karabinkiem. M416 łączy dużą siłę rażenia z celnością i szybkostrzelnością. Nadaje się więc do walki zarówno na mały, jak i średni i duży dystans. Jej główną wadą jest spory odrzut, więc trzeba zapomnieć o ogniu ciągłym na średni i duży dystans. Strzelamy krótkimi seriami i tylko na mały dystans można stosować ogień ciągły.
Co do strzelania na duży dystans, z M416 da się spokojnie zdejmować snajperów, na przykład przez szerokość mapy Arica Harbor w trybie podbój. Trzeba tylko pamiętać o 1-1,5 sekundowych przerwach pomiędzy seriami w celu korekty i ustabilizowania broni po strzale.
Sensownym dodatkiem jest kolimator (red dot) i amunicja magnum.

Czytaj dalej