TastyCode devblog
7mar/100

Własna strona błędu 404 w Kohanie

Ostatnio odkryłem prawdziwy "pałer" frameworków. Zacząłem od CodeIgnitera. Całkiem fajny, w większości miejsc daje wolną rękę programiście. Jednak nie wygląda na to, żeby miał być dalej tworzony. Spróbowałem Kohanę, jedną (to ona jest? :) ) z jego forków.

Jako że dosłownie zakohałem się w Kohanie, będę co jakiś czas umieszczał tutaj jakieś porady.
Porada na dziś:
Własna strona błędu 404 w Kohanie
Wbrew pozorom nie jest to takie trudne! Kohana (tak jak CodeIgniter) ma zaimplementowany system tak zwanych Hooków/Eventów (zdarzeń). Mogę zmienić standardową funkcję obsługi błędu 404, i podmienić ja na moją własną.
Na początku musimy się upewnić, czy mamy w naszej aplikacji włączone hooki. W tym celu otwieramy plik application/config/config.php, i prawdopodobnie w linijce 75 będzie znajdować się poniższy kod:

$config['enable_hooks'] = FALSE;

Zmieniamy FALSE na TRUE.
Następnie tworzymy nowy plik application/hooks/error_404.php. Kohana automatycznie wykonuje wszystkie pliki z katalogu application/hooks/, więc nie musimy go jakoś specjalnie włączać :)
W tym pliku zadeklarujemy klasę przechwytywania błędu (error_404), oraz podmienimy standardową funkcję obsługi błędu 404, na naszą własną z klasy error_404. Nasza funkcja będzie uruchamiać inny, podany w stałej, kontroler.

<?php
class error_404 {
	const error_controller = 'Error404'; // Nazwa kontrolera który chcemy wykonywać podczas błędu. (jeżeli mamy kontroler np. w pliku application/controllers/errors/Error404.php, wpisujemy tutaj errors/Error404)
	public static $page = '';

	public static function show_404() { // nasza funkcja przechwytująca błąd 404
		header("HTTP/1.0 404 Not Found"); // wysyłamy nagłówek ze statusem Not Found.
		if(Router::$current_uri != self::error_controller) { // zabezpieczenie, przed zapętleniem się strony, gdy podany kontroler obsługi błędu nie zostanie znaleziony
			self::$page = Router::$current_uri; // zapisujemy adres brakującej strony, więc możemy w kontrolerze strony błędu wyświetlić jej adres
			Router::$current_uri = self::error_controller; // Przekierowujemy na nasz kontroler
			Router::setup(); // i ponownie inicjalizujemy klasę Router.
		} else {
			Kohana::show_404(self::$page); // gdy nasz kontroler obsługi błędu nie istnieje, wyświetlamy standardową tablicę z Kohany, z adresem strony wcześniej zapisanej do zmiennej $page.
		}
	}
}

Event::replace('system.404', array('Kohana', 'show_404'), array('error_404', 'show_404')); // Podmieniamy standardową funkcję obsługi eventu "system.404", na naszą.
?>

Potem musimy zdefiniować nasz kontroler w pliku application/controllers/Error404.php. Nie będzie on się różnił specjalnie od innych, więc nie będę się tutaj specjalnie rozpisywał:

<?php
class Error404_Controller extends Controller {
	public function index() {
		echo '<html><body><b>404 Not Found</b><small> - '.error_404::$page.'</small><br /><br /><small>Powered by KohanaPHP</small></body></html>';
	}
}
?>

Stay tuned, następne tutoriale już niedługo!

21lis/092

Using LED on N810 Tablets in Python

I think that in Poland we don't have much NIT developers, and... Here we go - first post in English ;)
I was looking for an API in Python for manipulating color (and brightness ofc ;) ) of builtin LED on my N810. I drilled through some sites, and i found that FlipClock (which is written in Python) uses LED in some cases. I downloaded it, and found that you can set color of LED with these two simple functions.
Manipulating LEDs rely on writing to virtual files in /sys/ directory.

import time

# This function changes color of LED
def setLED(r,g,b):
 val = "%X:%X:%X" % (r, g, b)
 f = open('/sys/devices/platform/i2c_omap.2/i2c-0/0-0032/color', 'w')
 f.write(val)
 f.close()
# This functions sets LED mode ("run" - default mode. "direct" - in this mode you can change color of LED)
def setLEDMode(mode):
 f = open('/sys/devices/platform/i2c_omap.2/i2c-0/0-0032/', 'w')
 f.write(mode)
 f.close()

# using:
# 1. First we need to set mode to "direct"
setLEDMode('direct')
# 2. Now set color of LED
setLED(255, 255, 255) # no, it won't be really white, blue led is too strong, so it will be like lightblue =)

# Let it sleep for a while
time.sleep(5)

# 3. Set everything to 0, so next time we won't see ugly "blink" of last color.
setLED(0, 0, 0)
# 4. Return to "default mode" (run)
setLEDMode('run')

Let's do some fireworks on your N810! :D
I'm really sure, that it should work also on N800 and family (770 have led? ;) )

PS. I have just found out strange thing - when I close keyboard while LED is on it automagicaly turns off :D I must try it ;)
PS2. And also when i lock keypad... It's not a big deal, when you are just blinking LED, but when you must turn it on for a long time, you can set color and sleep for 0.5sec in loop instead of setting color and waiting Xsec. :)

Edit!
Today I found out this post on some forum: http://forum.mobile-review.com/showpost.php?s=936a897dcf4ba22136a9fb1fc0904dd9&p=2120483&postcount=441
So on N900 (Maemo 5) LED is controlled in similar way, expect thing, that path pattern is like this:
/sys/class/led/[some unique/unknown ID]/brightness
I don't have N900, so i can't try it (and i don't know if my mother and GTranslate translated this post correctly ;) )
I think that it should work :)

12lis/090

Instalacja FlexSDK/mxmlc na Debianie/Ubuntu

Po ściągnięciu FlexSDK na mój komputer, i uruchomieniu pliku mxmlc ujrzałem piękny "Segmentation Fault". Przypomnę że korzystam z Debiana (w przypadku Ubuntu będzie tak samo ;) )
mxmlc wymaga nowszej wersji Javy, niż tej którą mamy zainstalowaną. Wystarczyło doinstalowanie pakietu sun-java6-jdk komendą aptitude install sun-java6-jdk i wybranie w update-alternatives --config java opcji ze ścieżką /usr/lib/jvm/java-6-sun/jre/bin/java (w moim przypadku było to 3) aby mxmlc zaczął poprawnie działać.

Miłego Flex'owania! :)

6lis/090

Prace nad TastyCode

Właśnie rozpocząłem prace nad moim "flagowym" projektem (na który wykupiłem tę domenę ;) )
Pojawiła się informacja "Stay tuned" na stronie głównej, a niedługo (jak coś skodzę) zostaną otwarte beta-testy. Podstawowy "niby-framework" już napisałem. Będę korzystał z własnej klasy obsługi templatek (którą pewnie niedługo udostępnię :) ) opartą bezpośrednio na plikach PHP (oddzielne pliki z kodem HTML i definicjami typu ) - najprościej i najszybciej. Mod_rewrite oczywiście do tego.

TastyCode ma być serwisem umożliwiającym użytkownikom wymienianie się ciekawymi kawałkami kodu (code-snippets?), jak i swego typu forum na którym każdy pomaga każdemu :)

Tak więc powtórzę się - stay tuned! :)