Archive | March, 2007

Motywacja

Ciągle sobie mówię, że nie potrafię stawiać dachów, a robię to coraz częściej.

Tata Izy

Niech to będzie dla tych co sobie ciągle mówią, że nic nie potrafią… ;-]

[pytanie] Opera

Dlaczego dzieje się tak, że na części stron jakie przeglądam Opera pokazuje mi tekst, który się znajduje w jej cache? Mam ten problem ze stronami haxite.org oraz deviantart.com, dopiero F5 ratuje sytuację. Z joggerem nie ma tego problemu, wszystko jest cały czas aktualne…

Zasada #3

Nie podążaj wulgarną drogą; nie poddawaj się nieuważności; nie utrzymuj fałszywych poglądów; nie trwaj długo w świeckim życiu.

Powstań! Nie bądź niedbały! Prowadź swe życie dobrze. Ludzie prawi żyją szczęśliwie i w tym świecie, i w następnym

Dhammapada

Love is in the air ^^

Tak, wiosna bywa zaskakująca i naprawdę pozytywna :)

Bez zbędnych “oświadczyn” po prostu. Gdy dwoje ludzi chce być ze sobą, to żadne formułki nie są potrzebne, oni po prostu są ze sobą… :)

Muszę przyznać, że jestem szczęśliwy ^^

Generowanie formularza na podstawie struktury tabeli MySQL

Raz na stronie zlecenia.przez.net znalazłem zlecenie dotyczące stworzenia skryptu, który generuje formularz na podstawie struktury tabeli MySQL. Pomyślałem sobie, że to zadanie jest czymś ciekawym dla mnie i w wolnej chwili postanowiłem napisać prosty (a właściwie prowizoryczny) skrypt, który by wykonywał takie zadanie.


Teoria

Na początku szukałem przeróżnych funkcji do obsługi MySQL, które oferuje PHP. Coś tam niby znalazłem, ale one były dla mnie niewystarczające. Po prostu nie spełniały moich wymagań.
Gdzieś w komentarzach na stronie php.net natknąłem się na pewien ciekawy komentarz.

Właściwie bezsensem było szukanie skomplikowanych funkcji. Kluczem do eksportu struktury dla jakiejś tabeli było zapytanie SQL: “SHOW COLUMNS FROM `tabela`”.

Wynik tego zapytania zwróci nam (np) coś takiego:

mysql> show columns from `lol`;
+----------+------------------------------------------------+------+-----+---------+-------+
| Field    | Type                                           | Null | Key | Default | Extra |
+----------+------------------------------------------------+------+-----+---------+-------+
| test     | enum('zlo','dobro','papa smerf','nerd','blah') | NO   |     |         |       |
| text     | varchar(100)                                   | NO   |     |         |       |
| textarea | text                                           | NO   |     |         |       |
+----------+------------------------------------------------+------+-----+---------+-------+
3 rows in set (0.04 sec)

Jak widać wynik tego zapytania może być wystarczający do tego aby wygenerować formularz. Także przejdźmy już do jakiś konkretów…

Praktyka

Ok to oczywiście standardowo połączenie z bazą danych, oraz natychmiastowe wykonanie zapytania do bazy MySQL.

define("MYSQL_USER", "user");
define("MYQL_PASS", "pass");
define("MYSQL_HOST", "localhost");
define("MYSQL_BASE", "lol"); // przykladowa nazwa bazy ;p

$tabela ="lol"; // tabela na podstawie której powstanie formularz
$form = array(); // stworzenie tablicy form, która będzie trzymała dane potrzebne to stworzenia formularza

mysql_connect(MYSQL_HOST, MYSQL_USER, MYQL_PASS) or die ("Nie mozna polaczyc sie z baza MySQL!");
mysql_select_db(MYSQL_BASE) or die ("Nie mozna wybrac bazy danych!");

$result = mysql_query("SHOW COLUMNS FROM `$tabela`");

Ok, to skoro połączenie już mamy to teraz czas na fetch’owanie ;-)

while($row = mysql_fetch_object($result))
{
//     (...)
}

Póki co ta pętla jest pusta. Stało się tak dlatego, że chcę z osobna opisać co się będzie działo.

W tej pętli nastąpi “analiza” wyników. Zostanie pobrana nazwa pola, oraz jego typ i default’owa wartość. Wszystkie te informacje zostaną zapisane do tablicy $form, która posłuży później do generowania formluarza.

Jak pisałem wcześniej ten skrypt będzie prosty, także nie liczcie na to, że obsłuży każdy typ pola ;-)

Generalnie sprawa będzie wyglądała tak:

  • $row->Type = “varchar” lub “char” => input type=text
  • $row->Type = “enum” lub “set” => input type=radio
  • $row->Type = “text” => pole textarea

Jedynym problemem, może być wyciągnięcie wartości z pól “enum” lub “set”, bo jak wiadomo są one ustawione “z góry” (właśnie dlatego wstawi się do formularza pole radio). Wprawdzie zamiast pola radio można posłużyć się <select> z tylko jedną możliwością wyboru, ale myślę, że przedstawione przeze mnie rozwiązanie nie sprawi większych problemów.

Ok, to najpierw pokażę kod, a potem postaram się go objaśnić.

if(preg_match("/(enum|set)/", $row-&gt;Type))
{
        $options=explode("','", preg_replace("/(enum|set)\('(.+?)'\)/","\\2", $row-&gt;Type));
        $form[$row-&gt;Field] = array("type" =&gt; "radio", "value" =&gt; $options);
}

Nie wygląda tak źle, prawda? Instrukcja warunkowa jest jasna. Zmylić może wartość zmiennej $options.
Normalnie zmienna $row->Type dla pola “enum” (lub “set”) wygląda tak: enum(‘val1′,’val2′).

Funkcja explode “rozrywa” wszystkie stringi, które są podzielone znakiem przecinka (“,”), ale zanim to nastąpi funkcja preg_replace usunie zbędne fragmenty, czyli “enum(” i “)” ;-)

Zakończenie

Wygenerowanie formularza już nie powinno sprawić większych problemów. Na wszelki wypadek na końcu tej notki umieszczę jeszcze cały kod tego skryptu (wraz z wygenerowanym formularzem).
Ten skrypt nie jest doskonały, można dużo zmienić i poprawiać. Nie pokażę kodu zapisującego dane z formularza, bo myślę, że dacie sobie radę (gdyby jednak tak nie było to mogę potem coś o tym naskrobać) ;-)

Teraz mała uwaga do “znawców”. Jeśli jesteście zdania, że można to zrobić lepiej, to proszę bardzo róbcie, ale nie krytykujcie mnie za to, że zrobiłem to inaczej. Oczywiście wszelkie rady chętnie przyjmę, a błedy poprawię :)

Kodziwo

&lt;?php
// Generator formularza na podstawie struktury bazy MySQL
// Made by radmen
// radmen [at] gmail dot com
// Copyleft
//

define("MYSQL_USER", "root");
define("MYQL_PASS", "mysql-pass");
define("MYSQL_HOST", "localhost");
define("MYSQL_BASE", "lol");

$tabela = "lol"; // tabela na podstawie której powstanie formularz
$form = array(); // stworzenie tablicy form, która będzie trzymała dane potrzebne to stworzenia formularza

mysql_connect(MYSQL_HOST, MYSQL_USER, MYQL_PASS) or die ("Nie mozna polaczyc sie z baza MySQL!");
mysql_select_db(MYSQL_BASE) or die ("Nie mozna wybrac bazy danych!");

$result = mysql_query("SHOW COLUMNS FROM `$tabela`");
while($row = mysql_fetch_object($result))
{
        // $row-&gt;Field =&gt; nazwa rekordu
        // $row-&gt;Type =&gt; typ rekordu
        
        if(preg_match("/(enum|set)/", $row-&gt;Type))
        {
                $options=explode("','", preg_replace("/(enum|set)\('(.+?)'\)/","\\2", $row-&gt;Type));
                $form[$row-&gt;Field] = array("type" =&gt; "radio", "value" =&gt; $options);
        }
        if(preg_match("/(varchar|char)/", $row-&gt;Type))
        {
                $form[$row-&gt;Field] = array("type" =&gt; "text", "value" =&gt; $row-&gt;Default);
        }
        if(preg_match("/text/", $row-&gt;Type))
        {
                $form[$row-&gt;Field] = array("type" =&gt; "textarea", "value" =&gt; $row-&gt;Default);
        }
}

// Formularz - tutaj wyjątkowo prymitywny ;p

echo "&lt;form&gt;\n";
foreach ($form as $name =&gt; $info)
{
        if($info['type'] == "text")
        {
                echo "&lt;p&gt;$name: &lt;input type=\"text\" name=\"$name\" value=\"".$info['value']."\"/&gt;&lt;/p&gt;\n";
        }
        
        if($info['type'] == "textarea")
        {
                echo "&lt;p&gt;$name &lt;textarea name=\"$name\"&gt;".$info['value']."&lt;/textarea&gt;&lt;/p&gt;\n";
        }
        
        if($info['type'] == "radio")
        {
                echo "&lt;p&gt;$name: ";
                foreach ($info['value'] as $RadioValue)
                {
                        echo "$RadioValue &lt;input type=\"radio\" name=\"$name\" value=\"$RadioValue\"&gt; ";
                }
                echo "&lt;/p&gt;\n";
        }
}
echo "&lt;/form&gt;";
?&gt;

Masowa zmiana wymiarów obrazka

Wczoraj chwilkę się męczyłem, aby móc masowo zmienić wymiary dla kilku obrazków. Szukałem, kombinowałem i w końcu przypomniałem sobie, że po Linuksem mam Imagemagick

Generalnie cały skrypt jest totalnie banalny, ale dla mnie kompletnego n00ba basha to zajęło chwilkę (ok 5 minut ;p), dlatego chcę się podzielić tym mało odkrywczym kodem, oraz z lekka wyjaśnić…

Ci co znają basha to właściwie nie mają po co czytać reszty tej notki :-)

Ok na początek przedstawię od razu jak wygląda całe kodziwo:

#!/bin/bash
# Copyleft... whatever.. ;p
#
for x in *.jpg
do
        convert $x -resize 30x30% "mini_$x"
done

Ok teraz po kolei… ;-)

for x in *.jpg – to jest pętla, która listuje wszystkie pliki jpg będące w katalogu. W zmiennej x zostaje zapisana nazwa tego pliku.

convert $x -resize 30×30% $x – to oznacza, że plik (którego nazwa jest w zmiennej x) będzie przeskalowany. Jego wymiary będą stanowiłi 30% oryginału. Przeskalowany plik będzie posiadać nazwę “mini_[RESZTA NAZWY ORYGINAŁU].jpg”
Oczywiście do polecenia convert możemy dać inne parametry, ale to już odsyłam do manuala.

Tą notkę napisałem tylko dlatego, że być może komuś to się kiedyś przyda. Mi takie rozwiązanie uratowało moje leniwe dupsko, wiem, że to nie jest nic nadzwyczajnego, ale “a nóż widelec” :-)

Wygrzebane na allegro.pl

Klik… ;-)

Przyjrzyjcie się opisowi aukcji xD

Gdyby obrazek jakimś trafem zginął to maci niżej…

Free Image Hosting at www.ImageShack.us

Dzięki parv za cynk ;p

Opera

Dzisiaj postanowiłem sprawdzić jak w boju sprawuje się Opera. Już podoba mi się to, że tak strasznie nie przymula jak mój FF. ;-]

Przy okazji sprawa do operowców… Co powinienem zrobić z moją Operką, aby była jeszcze milsza w obsłudze? :>

PRAWDZIWA moderacja działem artykułów :-]

Zapytaj się żydokomunistycznocynicznofaszystowskich czarnych masonów rozprowadzających rosyjską pornografię i narkotyki w bangladejskiej szkole turlania skamieniałych fekalii. WYPIERDALAJ!

Powód skasowania art’a, zapodany przez Sumika ;-p

wykop.pl – znowu pad ;-]

i tak się dziwnym trafem złożyło, że polski klon digg’a znowu zaliczył glebę ;p