wtorek, 25 maja 2010

Zdanie wyrwane z artykułu

"[...]Zbywanie mnie formułkami o konieczności milczenia odbieram jako krętactwo władzy, a to każe mi żywić obawę, że nigdy nie poznam przyczyn katastrofy. A nawet jak je już poznam, to być może nie uwierzę, bo wcześniej moje pragnienie prawdy zostanie zgwałcone tysiącem domysłów, niedopowiedzeń, wersji, zastrzeżeń i uników.[...]"

Z. Górniak - całość

No cóż - lepiej bym tego nie ujął.

poniedziałek, 19 października 2009

Mam cię!

Już któryś tydzień z rzędu obsługiwana przeze mnie baza danych i cluster apache-y dławił się z niewiadomego powodu. Problem był w tym że działo się to "od czasu do czasu" i nie potrafiłem odtworzyć błędu.
Jedyne co wiedziałem to to że w mysqladmin processlist opluwał mnie procesami czekającymi na połączenie. Kilka mniejszych zmian w konfiguracji mysql czy apache nie dawały skutku (lub po prostu z powodu braku odpowiedniej częstotliwości błędu nie potrafiłem stwierdzić czy moje działanie pomogło).

No ale dzisiaj problem powtarzał się cały czas dzięki czemu mogłem dokładniej się temu przyjrzeć i przetestować kilka rozwiązań.

Rezultat

jedna opcja w my.cnf skip-name-resolv

a wszystko przez rozwiązywanie nazw DNS,

więcej na http://dev.mysql.com/doc/refman/5.0/en/dns.html
na forum mysql: http://forums.mysql.com/read.php?30,27073,27073#msg-27073

środa, 16 września 2009

nfs - dlaczego nie działa?

Niby wszystko ładnie pięknie a tu ... nie wstaje po restarcie maszyny.
Tak samo jak apache z wirtualną domeną podpiętą pod zasób udostępniany przez nfs.
Chwila googlowania i jest powód oraz rozwiązanie sytuacji.
Zasób montowany poprzez fstab nie może zostać przypięty ponieważ podczas przetwarzania fstab-a nie działa jeszcze sieć. Z pomocą przychodzi pakiet autofs.
Do pliku /etc/auto.master dodałem

/home/cos_tam /etc/auto.nfs --timeout=3600 --ghost

oraz stworzyłem plik /etc/auto.nfs w którym podaje opcje do montowania zasobu:

katalog -fstype=nfs,soft,intr,rsize=8192,wsize=8192 adres_ip:/home/katalog_zdalny


... i tak na pozostałych maszynach.

czwartek, 1 stycznia 2009

Eh dawno mnie tu nie było

No to trzeba nadrabiać zaległości. Zacznijmy od początku... a może to właściwie koniec. Wszystko jedno sylwester. A ten był spędzony we Wrocławiu ze zgrają mafijnych koleszków.



To zdjęcie najlepiej oddaje charakter zabawy, wielkie dzięki wszystkim uczestnikom.



To zresztą też :)



A to radosna twórczość Mateusza - super

czwartek, 11 września 2008

Symfony krok 5

W pliku /apps/frontend/config/routing.yml można ustawić która strona zostaje wyświetlona jako "index" naszej aplikacji:


homepage:
url: /
param: { module: question, action: list }

wtorek, 9 września 2008

Symfony user managmet and sessions

Sesje użytkowników są przechowywane w symfony w obiekcie User. Możemy pobrać ten obiekt w dowolnym miejscu za pomocą metody getUser();


class mymoduleActions extends sfActions
{
public function executeFirstPage()
{
$nickname = $this->getRequestParameter('nickname');

// Store data in the user session
$this->getUser()->setAttribute('nickname', $nickname);
}

public function executeSecondPage()
{
// Retrieve data from the user session with a default value
$nickname = $this->getUser()->getAttribute('nickname', 'Anonymous Coward');
}
}


Oczywiście w tym obiekcie możemy przechowywać obiekty (niezalecane) i zmienne które będą dostępne pomiędzy wywołaniami stron.

Zmienne możemy ustawiać, pobierać i czyścić


class mymoduleActions extends sfActions
{
public function executeRemoveNickname()
{
$this->getUser()->getAttributeHolder()->remove('nickname');
}

public function executeCleanup()
{
$this->getUser()->getAttributeHolder()->clear();
}
}


Do sesji użytkownika możemy dobrać się także z szablonów



Hello, getAttribute('nickname') ?>




Jeśli potrzebujemy przechować informację tylko do kolejnego wywołania, np potwierdzenie zapisania/usunięcia/edycji danych możemy skorzystać z metody setFlash i getFlash. Dane zapisane za pomocą tych metod zostaną usunięte przy kolejnym wywołaniu.
np.

$this->setFlash('attrib', $value);
$value = $this->getFlash('attrib');

// i w szablonach

has('attrib')): ?>
get('attrib') ?>



Ciasteczka

W symfony możemy decydować gdzie zapisane są ciasteczka. Określamy to w pliku apps/myapp/config/factories.yml


all:
storage:
class: sfSessionStorage
param:
session_name: my_cookie_name


Po stronie aplikacji sesje są przechowywane domyślnie w plikach. Możemy to zmienić w pliku apps/myapp/config/factories.yml


all:
storage:
class: sfMySQLSessionStorage
param:
db_table: SESSION_TABLE_NAME # Name of the table storing the sessions
database: DATABASE_CONNECTION # Name of the database connection to use


Czas przechowywania sesji można ustawić w pliku apps/myapp/config/settings.yml


default:
.settings:
timeout: 1800 # Session lifetime in seconds

Symfony krok 4

W niektórych przypadkach potrzebujemy tylko wysłać nagłówek:


public function executeRefresh()
{
$output = '<"title","My basic letter"],["name","Mr Brown">';
$this->getResponse()->setHttpHeader("X-JSON", '('.$output.')');

return sfView::HEADER_ONLY;
}


lub wybrać szablon o dowolnej nazwie


$this->setTemplate('myCustomTemplate');


Przydatnymi metodami są także forward, redirect i forward404 (nie można znaleźć strony. Dzięki nim możemy przejść do innej akcji w innym module lub załadować dowolną stronę.


$this->forward('otherModule', 'index');

$this->redirect('otherModule/index');
$this->redirect('http://www.google.com/');

/**
* szablon do strony 404 znajduje się w $sf_symfony_data_dir/modules/default/
* możemy także nadpisać akcje error404 w dowolnym module, oraz dołączyć do modułu
*/
forward404();
/**
* istnieje tez kilka funkcji pomocniczych które ułatwią nam pracę
*/
forwardIf();
forwardUnless();
forward404If();
forward404Unless();
redirectIf();
redirectUnless();

$this->forward404If(!$article);


Jeśli mamy czynność którą musimy powtórzyć przed / po wykonaniu każdej akcji możemy utworzyć metody preExecute() i postExecute()

public function preExecute()
{
// The code inserted here is executed at the beginning of each action call
...
}

public function executeIndex()
{
...
}

public function executeList()
{
...
$this->myCustomMethod(); // Methods of the action class are accessible
}

public function postExecute()
{
// The code inserted here is executed at the end of each action call
...
}


Funkcje pomocne przy wykonywaniu akcji:


Name Function Sample Output
Request Information
getMethod() Request method Returns sfRequest::GET or sfRequest::POST constants
getMethodName() Request method name 'POST'
getHttpHeader('Server') Value of a given HTTP header 'Apache/2.0.59 (Unix) DAV/2 PHP/5.1.6'
getCookie('foo') Value of a named cookie 'bar'
isXmlHttpRequest()* Is it an Ajax request? true
isSecure() Is it an SSL request? true
Request Parameters
hasParameter('foo') Is a parameter present in the request? true
getParameter('foo') Value of a named parameter 'bar'
getParameterHolder()->getAll() Array of all request parameters
URI-Related Information
getUri() Full URI 'http://localhost/myapp_dev.php/mymodule/myaction'
getPathInfo() Path info '/mymodule/myaction'
getReferer()** Referrer 'http://localhost/myapp_dev.php/'
getHost() Host name 'localhost'
getScriptName() Front controller path and name 'myapp_dev.php'
Client Browser Information
getLanguages() Array of accepted languages Array( [0] => fr [1] => fr_FR [2] => en_US [3] => en )
getCharsets() Array of accepted charsets Array( [0] => ISO-8859-1 [1] => UTF-8 [2] => * )
getAcceptableContentTypes() Array of accepted content types Array( [0] => text/xml [1] => text/html



Przykłady wykorzystania:

pobieranie parametrów:

class mymoduleActions extends sfActions
{
public function executeIndex()
{
$hasFoo = $this->getRequest()->hasParameter('foo');
$hasFoo = $this->hasRequestParameter('foo'); // Shorter version
$foo = $this->getRequest()->getParameter('foo');
$foo = $this->getRequestParameter('foo'); // Shorter version
}
}


upload plików:


class mymoduleActions extends sfActions
{
public function executeUpload()
{
if ($this->getRequest()->hasFiles())
{
foreach ($this->getRequest()->getFileNames() as $uploadedFile)
{
$fileName = $this->getRequest()->getFileName($uploadedFile);
$fileSize = $this->getRequest()->getFileSize($uploadedFile);
$fileType = $this->getRequest()->getFileType($uploadedFile);
$fileError = $this->getRequest()->hasFileError($uploadedFile);
$uploadDir = sfConfig::get('sf_upload_dir');
$this->getRequest()->moveFile($uploadedFile, $uploadDir.'/'.$fileName);
}
}
}
}