IronCMS 1.1

Zaledwie osiem dni minęło od premiery pierwszej publicznej wersji mojego CMS-a, a już prezentuję Wam jego kolejną wersję. Nie jest to jednak aż tak wielki powód do dumy jak pozornie mogłoby się wydawać, bo wersja ta spowodowana jest wieloma błędami i spostrzeżeniami do wersji 1.0. W tym miejscu dziękuję wszystkim za konstruktywną krytykę i wszelką pomoc.

W tej wersji skupiłem się głównie na poprawie wytkniętych mi błędów. Tak więc z najważniejszych zmian wymienić można:

  • działające BBCode - szukałem troszkę czegoś odpowiedniego i w sumie oparłem bbcode w Ironie na klasie NBBC. Banalna edycja i dodawanie znaczników, skompresowany kod (pozbawiony wcięć i enterów) zajmuje ok. 2500 linii (64 KB) (w Ironie rozmiar obcięty do 1900 linii). Do tego genialna dokumentacja. Polecam ;)
  • nowe menu w panelu administracyjnym - było na nie wiele narzekań (sam się w nim gubiłem), więc przysiadłem na chwilę i mam nadzieję, że jest łatwiej się w nim połapać.
  • wiele poprawek w systemie komentarzy - możliwość korzystania z bbcode, komentarze adminów nie potrzebują akceptacji (wiem, absurd, przeoczyłem to), tekst domyślny znika po kliknięciu na pole, możliwość dodania komentarzy do artykułów, podniesione zabezpieczenia itd.
  • uporządkowano praktycznie wszystkie formularze w skrypcie - ujednolicono wygląd i poprawiono opisy
  • wszystkie funkcje mysql_* zastąpiono funkcjami własnymi (odniesienie do sugestii Kwpolska) - kto wie? Może kiedyś zobaczymy Irona np. na PostgreSQL? :P
  • dużo, dużo więcej...

Teraz czas na informacje nieco z innej beczki. Otóż w dniu dzisiejszym, grupa tworząca Irona została z powrotem zredukowana do jednoosobowego zespołu szaleńców (czytaj mnie...). M4tx przez cały czas swego udziału włożył do projektu około 20 linii kodu (a po wersji 1.0, która została napisana od nowa ten udział wyniósł równe zero), tak więc stwierdziłem, że nie będę go więcej męczył pytaniem, czy coś zrobi. I został (jak na razie!) wyrzucony z projektu.

Mam nadzieję, że zaprezentowane powyżej zmiany  uważacie za dobre.

IRON CMS 1.1 (*.zip)

DEMO

Dane do użytkowników w wersji demo:

Użytkownik zwykły: login: tester1 / hasło: tester

Administrator: login: tester2 / hasło: tester

Niestety byłem zmuszony tym razem wyłączyć możliwość kasowania czegokolwiek, jako że ktoś postanowił sobie poprzednim razem zrobić małą rozróbę...

A na koniec: Wesołych Świąt Wam życzę :)

NetBeans 7.0

Jak już pisałem w jednym z wcześniejszych wpisów jestem zadowolonym użytkownikiem NetBeans'a, czyli zintegrowanego środowiska programistycznego m. in. dla PHP. Dzisiaj podczas przeglądania nowości w RSS'ach zauważyłem informację o wydaniu NetBeansa 7.0 (do tej pory używałem 6.9.1). Pomijam wszystkie changelogi, skupię się na własnych wrażeniach.

Zacznę oczywiście od instalacji. Już na starcie będzie troszkę narzekania, bo tak jak w poprzednich wersjach, nie mamy możliwości ustawiania czegokolwiek poza ścieżką do instalacji. Naprawdę nie widzę sensu instalowania m. in. chińskiej, rosyjskiej, portugalskiej i japońskiej wersji językowej "na sztywno", powinno się dać to odznaczyć.

Świeżo po instalacji IDE zajmuje u mnie 142 MB. Po skasowaniu wszystkich innych wersji językowych niż angielska pozbyłem się 1291 plików i całych 7,41 MB :P Mam jednak wrażenie, że program uruchamia się troszkę szybciej.

Po uruchomieniu programu pojawiło się okienko informujące, że na komputerze wykryto ustawienia z wersji 6.9 z możliwością ich zaimportowania. Krok wręcz obowiązkowy. Wszystko poszło bez problemu, wszystkie projekty wczytały się bez zmian.

Właśnie odnośnie zmian - otóż tych w wersji siódmej jest naprawdę niewiele. Pojawiło się m. in. wsparcie dla systemu kontroli wersji GIT i zawijanie linii - oba wyłączyłem. Natomiast przydać się może wsparcie dla znaczników HTML5. Podejrzewam, że sytuacja przedstawia się inaczej jeśli chodzi o wersję dla Javy, bo to przecież pod ten język był pisany NetBeans.

Standardowo wyłączyłem kilka nieprzydatnych pluginów (z 17 aktywnych po instalacji zostało 10). Generalnie jak dla mnie w programie zmieniło się niewiele. Jednak z drugiej strony nie muszę przyzwyczajać się do nowego interace'u itd, a program działa sporo szybciej (przynajmniej na moim sprzęcie). Nie mam na co narzekać :)

Premiera Iron CMS-a!

Z nieukrywaną dumą informuję, że skrypt który zacząłem tworzyć dokładnie 114 dni temu (20.12.10) został w końcu doprowadzony do stanu używalności. Dziś, o godzinie 14:40 nadszedł czas zaprezentować go światu.

Premiera odbyła by się chwilę wcześniej, gdyby nie to, że nie mogłem się dostać do phpMyAdmina na sobak.pl i tym samym zdebugować pewnego zapytania (na localhoście działało, tu nie). Przez około 5 godzin męczyłem się z instalatorem. Dodatkowo ponad godzinę straciłem, czekając aż panel administracyjny 1&1 raczy się załadować., ale, tak, udało się! :) Iron CMS 1.0 jest gotowy!

O tym, że jego przepisywanie od nowa zbliża się do końca informowałem tutaj. Zajęło mi to dokładnie 20 dni (z małymi przerwami). Podczas tego "procesu" skupiłem się głównie na poprawie logiki, wydajności i błędów ze starszych wydań (były 4 wydania prezentowane tylko znajomym).

  • poprawiłem dziesiątki nieoptymalnych miejsc. Trzykrotne łączenie się z bazą w jednym pliku, czy pobieranie tej samej wartości kilkanaście razy pod rząd? Takie rzeczy tylko w starych wersjach Irona (tak, ochrzciłem CMS-a mianem żelazka :D (joke)) :)
  • poprawiłem stare funkcjonalności. Np. f-cja kosza dostępna od wersji 0.3 została rozszerzona o możliwość wyrzucania artykułów. Wcześniej były to tylko podstrony.
  • nowa wersja starego szablonu. Jak już napisałem w zapowiedzi skryptu, użyłem gotowego szablonu. Podczas przepisywania CMS-a na nowo, znalazłem jego nowszą wersję. Został mocno poprawiony HTML i CSS i doszło m. in. górne menu. Dodatkowo dorzuciłem lekką modyfikację szablonu od siebie.
  • możliwość ustawienia oddzielnego theme'u dla panelu administracyjnego
  • zalążek rang użytkowników
  • znaczna poprawa bezpieczeństwa
  • dodany instalator
  • poprawa przejrzystości panelu administracyjnego
  • zmiana wielu rozwiązań pod względem logistycznym
  • setki, naprawdę setki rzeczy o których zapomniałem bądź pisać nie warto...

Skrypt został napisany z użyciem możliwości z PHP5 (wersja czwarta musi odejść do lamusa...) i bazy danych MySQL.

Trochę statystyki

Wielkość skryptu (zdekompresowane)

  • 0.1 - 26.4 kB
  • 0.2 - 2.87 MB
  • 0.3 - 1.48 MB
  • 0.4 - 2.32 MB
  • 1.0 - 344 KB

Skąd tak duża różnica? Od wersji 0.2 w skład skryptu wszedł JS-owy edytor WYSIWYG - TinyMCE. W 0.3 go "lekko" odchudziliśmy (z m4tx'em) - stąd taki spadek rozmiaru. W 0.4 doszło troszkę nowych rzeczy, a IronCMS 1.0 został pozbawiony edytora WYSIWYG, zastąpiono go BBCodem. Jego rozmiar jest podwójnym sukcesem, bo poprzez rozbicie theme'u na theme dla strony i oddzielny dla panelu, ilość obrazków de facto nam się podwoiła.

Dlaczego nie WYSIWYG lecz BBCode?
Otóż stwierdziłem, że skryptów idiotoodpornych powstało już mnóstwo. Zdaję sobie sprawę, że to może zawęzić ilość użytkowników Irona (ale spójrzmy obiektywnie - ile ludzi tak czy siak będzie go używać? :P). Poza tym - znajomość BBCode, to nie jest jakaś magiczna sztuka.

Linie kodu (kliknij aby powiększyć)

Podziękowania

  • dla Rhina za rozwiązanie niezliczonej ilości moich błędów i przeoczeń
  • dla Pawła1503 i m4tx'a za betatesty
  • dla CapaciousCore'a, za naprawdę fachowe porady dotyczące skryptu.

DOWNLOAD IRON CMS 1.0

Zapowiedź CMS-a i porządki na stronie

Około dwudziestego grudnia 2010 postanowiłem zacząć wcielać w życie pomysł, który przechodził mi przez myśl co jakiś czas. Miałem zamiar w końcu odrestaurować stronę sobak.pl. Był to czas, gdy blog stał się rozwiązaniem tymczasowym, w zamian za starą wersję mojej strony (kilka skryptów na krzyż). Postanowiłem napisać taki zalążek CMS-a do jej zarządzania.

Dosłownie dzień później stwierdziłem jednak, że mój przyszły skrypt można by uczynić jeszcze bardziej uniwersalnym i stworzyć niego "takiego pełnoprawnego CMS-a". I zacząłem pisać... szło mi to dość opornie. Dla przyspieszenia prac postanowiłem, że skorzystam z ogólnodostępnego szablonu (za co niektórzy chętnie by mnie zabili), aby jak najszybciej móc skupić się na pisaniu "kodu właściwego".

Pierwsza zmiana nastąpiła siódmego lutego 2011. Wtedy to do udziału w projekcie udało mi się namówić m4tx'a. W tym momencie zmieniłem też nazwę skryptu z samozwańczego SobakCMS na IronCMS (wiem, pachnie ironią...). Jeśli by kogoś interesowało pochodzenie nazwy (w co wątpię ;)), to po w poszukiwaniu nazwy przeglądałem iTunes'a i leciałem właśnie po dłuugiej liście utworów Iron Maiden.

Podczas tego już ponad czteromiesięcznego procesu tworzenia naklepałem tyle kodu i tyle razy go poprawiałem, że wydałem sobie cztery wewnętrzne, niepublikowane wersje dla utrzymania porządku. 25.03 postanowiłem zakończyć tworzenie ówczesnej wersji 0.4 i cały kod uzyskany do tej pory... napisać od nowa.

W ten sposób miałem okazję przyjrzeć się jak bardzo partyzanckie i nieoptymalne rozwiązania tam stosowałem (przykład jednego z nich już przedstawiałem). Poprawiłem naprawdę dużo kodu i w dniu dzisiejszym mogę powiedzieć z radością, że prace zmierzają ku końcowi. Premiera zapowiadanego skryptu powinna się odbyć najpóźniej za tydzień (oby nie było tak jak z Fx4). Uprzedzam tylko uczciwie: proszę nie spodziewać się fajerwerków. Nie jestem zawodowym programistą PHP i jest to mój pierwszy CMS. Nie znaczy to z drugiej strony, że będzie tam masa register_globals, magic quotes ect. Starałem się korzystać z nowoczesnych rozwiązań.

 

I teraz druga część dzisiejszego wpisu. Przeprowadziłem właśnie (kolejne już) porządki na stronie. Podjęte działania:

  • skasowanie starej wersji bloga - niektórzy może pamiętają, że kiedyś blog mój znajdował się pod adresem sobak.pl/blog. Instalacja WordPressa leżała tam aż do dziś
  • odinstalowałem wtyczki All in one SEO Pack i Syntax Highlighter Evoled, z którymi miałem małe problemy. Pytanie na marginesie: zna ktoś z Was dobrą wtyczkę do podświetlania kodu w WP
  • odinstalowałem wtyczkę Google Analytics for WordPress zastępując ją zwykłym wklejeniem kodu do szablonu. Naprawdę niepotrzebny mi skrypt PHP na 3000 linii do wygenerowania ośmiu linii JavaScriptu.
  • kilka mniejszych optymalizacji
  • wycofałem wsparcie dla IE6. Przy udziale tej przeglądarki w Polsce na poziomie 2% uznałem, że mogę z czystym sumieniem usunąć hacki na tą przeglądarkę

Ogłoszenia parafialne zakończone. O tym, czy Mojżesz uratował się z potopu dowiecie się w następnym odcinku ;)

[PHP] Pobranie najnowszych wpisów z WordPressa

W tym wpisie przedstawię prosty skrypt pobierający ostatnie wpisy z bloga opartego na WordPressie. Skrypt powinien działać co najmniej na wszystkich WP z gałęzi 3.x

Prezentuję dwie leciutko się różniące wersje pod wyświetlanie dokładnie jednego ostatniego wpisu i wyświetlaniu określonej ilości ostatnich wpisów.

Wersja na jeden wpis

<?php
// Database config
$db['host'] = 'serwer_twojej_bazy';
$db['user'] = 'nazwa_usera';
$db['pass'] = 'haselko';
$db['name'] = 'nazwa_bazy_danych';

@mysql_connect ($db['host'], $db['user'], $db['pass']) or die ('Nie udało się połączyć z bazą danych');
@mysql_select_db ($db['name']) or die('Nie udało się wybrać bazy danych.');

// Get title of newest post
$query = mysql_query ("SELECT `post_title` FROM `wp_posts` WHERE `post_status` = 'publish' AND `post_type`='post' ORDER BY `post_date`  DESC LIMIT 1") or die ('Nie udało się pobrać najnowszego wpisu');

$row = mysql_fetch_array ($query);
$post_title = $row['post_title'];
echo $post_title;
mysql_close();

Wersja na wiele wpisów

<?php
// Database config
$db['host'] = 'serwer_twojej_bazy';
$db['user'] = 'nazwa_usera';
$db['pass'] = 'haselko';
$db['name'] = 'nazwa_bazy_danych';
// Other config
$num_posts  = '5';

@mysql_connect ($db['host'], $db['user'], $db['pass']) or die ('Nie udało się połączyć z bazą danych');
@mysql_select_db ($db['name']) or die('Nie udało się wybrać bazy danych.');

// Get titles of newests posts
$query = mysql_query ("SELECT `post_title` FROM `wp_posts` WHERE `post_status` = 'publish' AND `post_type`='post' ORDER BY `post_date`  DESC LIMIT $num_posts;") or die ('Nie udało się pobrać najnowszego wpisu');

echo '<ul>';
while ($row = mysql_fetch_array ($query)) {
   echo "t<li>";
   echo $row['post_title'];
   echo "</li>n";
}
echo '</ul>';

mysql_close();

Sercem obu tych skryptów jest jedno zapytanie czyli:

SELECT `post_title` FROM `wp_posts` WHERE `post_status` = 'publish' AND `post_type`='post' ORDER BY `post_date`  DESC LIMIT *

różnicą jest jedynie różna wartość ustawienia LIMIT. W pierwszym skrypcie wynosi ona oczywiście jeden, ponieważ pobieramy tylko jeden wpis, a więc tylko jeden rekord. W drugim zaś zależy od ustawienia odpowiedniej zmiennej $num_posts w konfiguracji skryptu.

Oba warianty skryptu różnią się też oczywiście sposobem wyświetlenia pobieranych danych. W pierwszym jest to zwyczajne wywołanie funkcji mysql_fetch_array, w drugim zaś wypadku jest ona użyta w pętli, a wpisy pokazywane są jako lista nieuporządkowana, co można dość łatwo zmodyfikować do swoich potrzeb.

Przedstawione skrypty stanowią tylko swoisty "rdzeń". Musimy oprawić je w ramy dokumentu HTML i ewentualnie możemy ustawić dla nich style CSS.

Zdaję sobie sprawę, że przedstawione skrypty dla wielu osób mogą się wydawać banalne i źle napisane (przecież nie użyłem PDO i miliona wyjątków), ale mam nadzieję, że choć dla jednej początkującej osoby ten prosty skrypt stanie się jakąś bazą do dalszego eksperymentowania z SQL i PHP.

Postępujące lenistwo internautów

Kolejny wpis z serii moich przemyśleń o wszystkim i niczym.

Problem opisany w tytule zauważyła pewnie już większość z Was. Użytkownik internetu staje się coraz bardziej leniwy. Przyczyniło się do tego stosowanie wszystkich zasad usability i maksymalne uproszczanie interfejsu. Teoretycznie nie jest to złe, a jednak jakie przynosi to efekty? Spójrzmy...

W dzisiejszych czasach na przykład błędu wyświetlanego przez skrypt nie można wyświetlić tak samo jak reszty strony. Musi być oddzielony, mieć oddzielne tło i dobrze by też było, aby był pogrubiony... najlepiej dwukrotnie (tak, da się). W przeciwnym wypadku user nie będzie wiedział co się stało, bo "to przecież trzeba było czytać, a tu były dwa zdania i nie wiedziałem od którego zacząć." Najłatwiej było nie czytać żadnego. Potem mamy informację od usera, że coś nie działa, ale nie wie co. Pod warunkiem, że user taki znajdzie formularz kontaktowy. A jak jeszcze w formularzu tym zamiast edytora WYSIWYG damy BBCode lub co gorsza niektóre znaczniki HTML, to z wiadomością od usera możemy się pożegnać.

Do ważnych miejsc w serwisie linki muszą być co najmniej sto dwadzieścia siedem tysięcznych raza większe, niż do tych mniej ważnych. Inaczej user nie znajdzie... bo kto zajmowałby sobie uwagę przeglądaniem jakiegoś menu. A niektórzy webmasterzy do już hardcore'y i dają aż dwa menu! Uwierzycie? :O

Ehh... miał być normalny wpis, ale jakiś taki mam dzisiaj stan, że wyszedł przepakowany ironią. Jednak czy pomijając moje wygłupy, zgadzacie się z sensem wpisu, czy wg Was żyję w rzeczywistości alternatywnej? ;)

* Oczywiście nie jest tu mowa o wszystkich internautach. To zaledwie 90%...

Chat z Premierem – podsumowanie

Dosłownie kilka minut temu dobiegł końca chat z premierem Donaldem Tuskiem na portalu onet.pl, rozpoczęty po godzinie 14:30. Jak wrażenia?

Szczerze mówiąc zawiodłem się. Biorąc pod uwagę to, że wysłałem 3 pytania i na żadne nie otrzymałem odpowiedzi, tak samo wśród znajomych (a pytania kulturalne i rzeczowe) można by się pokusić o jakąś teorię sPiSkową, że całe wydarzenie było ustawione.

Troszkę czasu zajęło się zalogowanie, ale za trzecim podejściem udało się i zacząłem przyglądać się dyskusji.

Większość pytań dotyczyła oczywiście polityki, ale pojawiło się kilka pytań odnośnie piłki nożnej, której fanem jest p. Premier.  Były pytania o ulgi studenckie, emerytury itd. Osobiście sam pokusiłem się o zadanie trzech pytań:

  • refundacja in vitro - niby miała być, a jednak się wystraszyli Kościoła i nie ma? Szkoda...
  • subwencja dla partii politycznych - kojarzy ktoś, czy w ogóle głosowanie w Sejmie było, czy zatrzymało się na pomyśle?
  • podniesienie VAT na rehabilitację - od pierwszego stycznia wzrósł VAT na usługi rehabilitacyjne dla osób niepełnosprawnych. Bo burzy wywołanej przez Fakty TVN urzędnicy stwierdzili, że było to przeoczenie, że zawiodły procedury. Miało to zostać zmienione, a jednak mamy już szósty kwietnia i podwyżki nadal zostały.

Na deser screenik:

Patrząc na ilość literówek można przynajmniej stwierdzić, że to pan Premier osobiście pisał swoje odpowiedzi. No, chyba, że w Onecie pracują takie tłumoki. A na razie uznajmy, że miało być "mechanizmów", ale "w" zaginęło w akcji ;)

PS: Wiem, że ostatnio zmniejszyła się liczba wpisów technicznych, ale nie martwcie się. To chwilowe ;)

YouTube przyłącza się do gaszenia świateł

W dniu dzisiejszym o godz. 20:30 odbędzie się tzw. Godzina dla Ziemi. Jest to akcja polegająca na gaszeniu iluminacji na jak największej ilości budynków - przyłączyły się m. in. Wieża Eifella i ogromna ilość właścicieli mniejszych i większych budynków (m. in. kościoły).

Przed chwilą z radością zauważyłem, że także YouTube przyłączył się do akcji. I jak to Google lubi robić - z odrobiną humoru ;)

Po lewej od tytułu każdego filmiku pojawił się przycisk pozwalający "wyłączyć światło na YT. Oto efekt (kliknij na obrazek, aby powiększyć):

YT z "włączonym światłem"

YT z "wyłączonym światłem"

Wy też zamierzacie wygasić swoje domy i wyłączyć umęczone komputery? ;)

PS: Mam pomysł jakby tutaj oszczędzić dużo prądu: niech Google wyłączy wszystkie swoje serwery na 15 minut. Fala samobójstw gwarantowana :P

Aktualizacja (10.04.11)
Tymczasem w komentarzach rozpętała się dyskusja na temat faktycznej "pożyteczności" takiej akcji. Polecam przeczytanie, może naprostować wiele błędnych opinii.