Bawicie się w Bitcoin?

W poszu­ki­wa­niu cieka­wych przed­się­wzięć Githu­bo­wych do kolej­nego odcinka Wygrze­ba­nych… natkną­łem się na program Bitcoin (pisany w C++) Nawet nie miałem świado­mo­ści, że używają tego ludzie na całym świecie, a sama idea wywo­łuje tak duże dysku­sje. Z pewno­ścią jest czymś nowym, zasłu­gu­ją­cym na chwilę uwagi.

W skró­cie: Bitcoin jest walutą kryp­to­gra­ficzną wziętą z sufitu, tzn. wyli­czoną przez uczest­ni­ków. Do niedawna można było sobie w/w progra­mem samemu gene­ro­wać bitmo­nety. Liczba wszyst­kich istnie­ją­cych w sieci monet jest ogra­ni­czona do prawie 21 mln sztuk, a co 2 tyg. trud­ność wyge­ne­ro­wa­nia kolej­nych wzra­sta dwukrot­nie. Praw­do­po­dob­nie dlatego zablo­ko­wano możli­wość gene­ro­wa­nia monet samo­dziel­nie, gdyż trwa­łoby to za dużo czasu. Obec­nie obli­cze­nia wyko­nują tzw. poole, czyli grupy kompu­te­rów z mocnymi kartami graficz­nymi zrze­szone w klastry. Oczy­wi­ście wyge­ne­ro­wane monety są rozdzie­lane pomię­dzy uczestników.

Całość działa na zasa­dzie zdecen­tra­li­zo­wa­nej sieci peer-to-peer (jak np. Kadem­lia w eMule) i jest dosyć bezpieczna, ALE! Ale sam program jest niebez­pieczny! Plik wallet.dat, zawie­ra­jący klucze prywatne do naszego konta czeka sobie na wzię­cie z zewnątrz lub nieumyślne skaso­wa­nie. Następna sprawa to to, że zanim zaczniemy używać programu musi on wystar­to­wać, tzn. pobrać CAŁĄ histo­rię trans­ak­cji wszyst­kich uczest­ni­ków. Obec­nie jest tego 180 tys. bloków. Co będzie za rok? 500 tys. bloków? Trwa dysku­sja nad wpro­wa­dze­niem niezbęd­nych zmian.

Należy zdać sobie sprawę, że system jest trochę nacią­gany — premiuje pierw­szych uczest­ni­ków, którzy zapewne chomi­kują swoje monety aż staną się dużo warte. I to w ich inte­re­sie jest aby rozdmu­chać sprawę wśród ogółu inter­nau­tów tak, aby zechcieli płacić żywą gotówką za wirtu­alne monety. Zadzi­wia­jące jest również to, jak szybko rozwi­nął się cały ekosys­tem BTC (bo taki skrót ma Bitcoin w kanto­rach). Od razu powstały giełdy wymiany, fora inter­ne­towe, lewe markety z dragami, wykresy, prognozy, cuda na kiju.

Kurs BTC->PLN czy USD jest wysoce niesta­bilny z prostej przy­czyny: mało zaan­ga­żo­wa­nych osób i środków. Obec­nie mając ok. 10 tys. PLN można robić z kursem co nam się żywnie podoba. Przed­wczo­raj kurs wyno­sił 34 PLN za 1 BTC. Dzisiaj już 48 zł. Wyobra­ża­cie sobie robić z kimś inte­resy w tej walucie?

Sam system jest prekur­sor­ski, ma sporo zalet, np.:

  • nie można zablo­ko­wać komuś konta,
  • brak opłat za trans­fer międzynarodowy,
  • brak opłat za utrzy­ma­nie konta,
  • brak godzin otwar­cia ani sesji Elixir ;-)
  • kreowa­nie nowego pienią­dza wymaga coraz to więcej wysiłku (a nie jak to jest obec­nie — kilkoma podpi­sami FED), a granica tej kreacji jest z góry ustalona

Podsu­mo­wu­jąc, system w obec­nej postaci należy trak­to­wać jako zjawi­sko lub walutę dla geeków, bardzo ostroż­nie pako­wać w to praw­dziwą walutę. Co oczy­wi­ście nie prze­szko­dzi mi inte­re­so­wać się tą sprawą :-D

Wygrzebane z GitHuba (2) : Imagine

Dzisiaj drugi odci­nek Waszego ulubio­nego serialu: Wygrze­bane z GitHuba. Wszyst­kie stacje TV rywa­li­zują o wyłącz­ność na emisję kolej­nego odcinka, padają kwoty sied­mio­cy­frowe wyra­żane w zimba­bwiań­skich dolarach…

Imagine to udana próba ujed­no­li­ce­nia inter­fej­sów różnych biblio­tek graficz­nych w zakre­sie mani­pu­la­cji obra­zami w PHP. Nieważne czy pod maską mamy GD, Image­Ma­gick czy Gmagick. Wszyst­kie opera­cje wyko­namy za pomocą jedno­li­tego inter­fejsu. Doku­men­ta­cja do znale­zie­nia tutaj.

Pomimo tego iż projekt ma dopiero nieco ponad rok, jest przez ten czas wyko­nany kawał dobrej roboty. Projekt ma ładną struk­turę wyra­żoną w name­spa­cach, przez co można śmiało ładować tylko potrzebne klasy za pomocą stan­dar­do­wego SplC­las­sLo­adera (do pocią­gnię­cia np. stąd).

O Imagine pisał php|architect, jest również prezen­ta­cja.

Poni­żej zade­mon­struję jak można użyć tego cuda do zmniej­sze­nia zestawu obraz­ków do jedno­li­tych kwadra­tów i wyświe­tlić na ekran w locie. To oczy­wi­ście metoda dla maso­chi­stów CPU, bo normal­nie czło­wiek prze­cież zapi­suje obrazki najpierw na dysk, a dopiero potem wyświe­tla. Efekt, który chcemy uzyskać będzie wyglą­dał tak:

<?php
require_once 'SplClassLoader.php';
 
// rejestrujemy przestrzen nazw Imagine
// i wskazujemy gdzie jej szukac
$classLoader = new SplClassLoader('Imagine', 'lib');
$classLoader->register();
 
// importujemy niezbedne klasy
use Imagine\ImageInterface;
use Imagine\Gd\Imagine;
use Imagine\Image\Box;
use Imagine\Image\Color;
use Imagine\Image\Point;
 
$columns = 2;
$images = 4;
$singleImgSize = 250;
 
// licze calkowita szerokosc tla
$backgroundXSize = (int) $columns * $singleImgSize;
// wysokosc zaokraglam w gore dla nieparzystych
$backgroundYSize = (int) $singleImgSize * ceil($images / $columns);
 
// jezeli mam i chce skorzystac z ImageMakicka
// to po prostu importuje wyzej
// use Imagine\Imagick\Imagine;
$imagine = new Imagine();
 
// tworze pusty obrazek w czarnym kolorze i 0 przezroczystosci
$background = $imagine->create(new Box($backgroundXSize, $backgroundYSize), new Color('000', 0));
 
// tablica z nazwami obrazkow do przeskalowania
// i wyswietlenia
$imagesArray = array('img1.jpg', 'img2.jpg', 'img3.jpg', 'img4.jpg');
 
// punkty startowe wklejania
$x = 0;
$y = 0;
 
foreach ($imagesArray as $img) {
  // otwieram obrazek z dysku,
  // zmniejszam go do kwadratu
  // uzywam trybu OUTBOUND,
  // czyli pilnuję proporcji i wywalam fragmenty dluzszego boku
  $image = $imagine->open('../images/' . $img)
            ->thumbnail(new Box($singleImgSize, $singleImgSize), ImageInterface::THUMBNAIL_OUTBOUND);
 
  // wklejam zmniejszony obrazek do tla
  // podajac lokalizacje lewego gornego rogu wklejania
  $background->paste($image, new Point($x, $y));
 
  // licze pozycje startowa dla nastepnego obrazka  
  $x += $singleImgSize;
  if ($x >= $canvasXSize) {
    $x = 0;
    $y += $singleImgSize;
  }
}
 
// obiekt Image obsluguje metode
// __toString() w postaci danych binarnych PNG
// wystarczy tylko podac naglowki
header('Content-Type: image/png');
// zamiast wyswietlac mozemy uzyc
// $background->save('obrazek.png',array('quality' => 85));
echo $background;

Oprócz typo­wych zadań typu skalo­wa­nie czy konwer­sja na inne formaty, projekt ma aspi­ra­cje na dosyć zaawan­so­wane mani­pu­la­cje obra­zami typu odwra­ca­nie w pozio­mie i pionie, refleksy, wykresy, ujed­no­li­cony inter­fejs ryso­wa­nia obiek­tów, histo­gramy itd.

Obrazki na licen­cji CC-BY poży­czone z Flic­kra. Właści­ciele praw do obraz­ków: pierw­szego, drugiego, trze­ciego, czwar­tego.

Wygrzebane z GitHuba (1) : CSS Crush

Od jakie­goś czasu grze­bię sobie po GitHu­bie. Pomy­śla­łem, że rozpocznę cykl opisów skryp­tów, które wzbu­dziły moją cieka­wość lub wg mnie mogą być dosyć przy­datne dla webma­ste­rów. Na pierw­szy ogień idzie CSS Crush — narzę­dzie do auto­ma­tycz­nego zmniej­sza­nia wiel­ko­ści plików CSS.

Zapewne każdy kto szukał kiedyś możli­wo­ści zaosz­czę­dze­nia nieco trans­feru natknął się na różne programy do minia­tu­ry­za­cji skryp­tów. Chyba najpo­pu­lar­niej­sze narzę­dzie to YUI Compres­sor, które przyj­muje pliki Java­Script lub CSS i próbuje powy­rzu­cać trochę „niepo­trzeb­nych” znaków. Minu­sem w/w programu jest to, że jest napi­sany w Javie. Co prawda powstał port w Java­Script, ale powiedzmy, że szukamy wygod­niej­szego rozwią­za­nia, które daje się rozszerzać.

CSS Crush to właści­wie jedna klasa plus kilka­na­ście funk­cji (makr) rozbu­do­wu­ją­cych. To trochę dziwna klasa, bo WSZYSTKO mamy statyczne. Nawet mnie się to nie podoba, no ale niech będzie. Widocz­nie autor ma ważne podstawy żeby tak robić.

Używa się tego bajecz­nie prosto. Gdzieś wcze­śniej żądamy dołą­cze­nia pliku CSS_Crush.php, a następ­nie w sekcji head gdzie linku­jemy nasz kod CSS wystar­czy wpisać

<link rel="stylesheet" type="text/css" href="<?php echo CSS_Crush::file('/styles/style.css'); ?>">

i właści­wie tyle. Skrypt sam sobie utwo­rzy zmini­ma­li­zo­wany plik i zwróci do niego ścieżkę dostępu. Jest to na tyle sprytne, że jeżeli nie wpro­wa­dza­li­śmy żadnych zmian do pliku źródło­wego CSS, to skrypt nie będzie mielił go ponownie.

Proces minia­tu­ry­za­cji pliku prze­biega w zasa­dzie zgod­nie z tym co robi YUI Compres­sor, czyli m.in. wywa­la­nie zbęd­nych ente­rów, spacji, średni­ków, nadmia­ro­wych zer i zamianę kolo­rów poda­nych w rgb na hexy.

CSS Crush można również rozsze­rzać o makra. Aktu­al­nie dostępne są ułatwia­cze w stylu auto­ma­tycz­nego doda­wa­nia -moz- i -webkit- oraz doda­wa­nie kilku hacków.

Progra­mem można stero­wać poprzez doda­nie mu tablicy asocja­cyj­nej jako drugiego argu­mentu przy CSS_Crush::file. Są to boole­any 'macros', 'comments', 'minify' i 'versioning'. Jako swego rodzaju manka­ment można uznać formułkę, która wyświe­tla się na początku każdego zmie­lo­nego pliku. Zapro­po­no­wa­łem auto­rowi doda­nie opcji 'boilerplate', za pomocą której wywa­limy nagłó­wek pliku.

Chyba jest o co walczyć, skoro plik CSS Gazety.pl z 77,6 KB zmniej­szył się do 67 KB. Ta wartość razy kilka­set tysięcy odwie­dzin jakieś oszczęd­no­ści na trans­fe­rze nam zapewni.

Aktu­ali­za­cja (25.05.2011) : Autor zatwier­dził mój pull requ­est, więc od teraz opcja 'boilerplate' już oficjalnie.