Autor wpisu: bastard13, dodany: 24.07.2013 13:44, tagi: design, oop
to już jest koniec
I dotarłem (i Wy również:) do końca tej serii wpisów. Wielokrotnie, gdy czytałem któryś z nich, zaraz przed jego publikacją, dochodziłem do wniosku, że jeszcze przecież tyle rzeczy wypadałoby napisać, dodać i już prawie miałem to zrobić, ale... patrzyłem na jego długość i stwierdzałem, że jednak byłaby to przesada. Poza tym, nie gruntowne omówienie zagadnienia było moim zamierzeniem, a uzmysłowienie, w jak najbardziej skompresowanej formie, zalet opisywanych aktywności/procesów/technik oraz tego, że we wszystkim trzeba znać umiar. Czy mi się to udało? To pozostawiam już do Waszej oceny. Zdaję sobie sprawę, że na każdy z poruszonych przeze mnie tematów możnaby (i już nieraz to robiono) napisać obszerne tomy i wiem również, że wiele rzeczy pozostało jeszcze do omówienia, więc jeżeli macie jakieś pytania albo chcielibyście więcej, to czekam na komentarze lub wiadomości na fan page'ach (na Google+ lub Facebooku). Jeżeli chcecie niektóre (wszystkie?) z opisanych procesów zaimplementować u siebie w projekcie/pracy, ale nadal macie wątpliwości lub problemy z rozpoczęciem, to również czekam na Wasze pytania, może wspólnie uda nam się rozwiązać problem :)Czytaj więcej »Autor wpisu: Kamil, dodany: 23.07.2013 18:54, tagi: javascript
Autor wpisu: matipl, dodany: 22.07.2013 21:02, tagi: internet, php
Tym razem dość krótko. OVH – firma oferująca shared hosting, serwery VPS i dedykowane – właśnie oświadczyło za pomocą swojego systemu, że doszło do włamania do ich wewnętrznej sieci firmowej. W zeszłym tygodniu podobne włamanie miało miejsce do Developer Center firmy Apple (jakaś plaga?).
Niestety dzisiejsza sprawa dotyczy wszystkich klientów firmy OVH z Europy. To co najważniejsze – wykradziono loginy (NIC) oraz hashe haseł, które przy odpowiednich możliwościach własnych da się złamać. Reszta danych dla większości powinny być bez znaczenia (adresy do faktur, telefon, faks).
Kto z Was ma konto (dostęp do panelu w OVH) niech jak najszybciej zmieni hasło, aby później się nie zdziwił że serwer z aplikacją PHP jest niedostępny.
Informacja od OVH: http://prace.ovh.pl/?do=details&id=16227
Autor wpisu: Athlan, dodany: 18.07.2013 01:41, tagi: php, php.pl, symfony
Context
When you scale a PHP application you have to consider several aspects of runtime environment such us:
- Bytecode caching (e.x. APC or Zend Optimizer Plus or eAccelerator), more;
- Reading project files from RAM instead of HDD;
- Caching and minify static content etc.
- One additional aspect is storing sessions.
By default, PHP stores sessions in files. There are also several approaches to speed up saving sessions, such us memcached, mapping save_path folder as ramdisc, etc.
In scaling approaches there is important that many worker nodes (with deployed application) runs the same code, round-robin selected or load-ballanced, but have the same space to store sessions, because there is no guarantee in distributes architecture, that next user’s request will be handled by the same node. This implies, that session memory have to be shared between nodes, unfortunately storing these data in local RAM doesn’t meet this requirement.
Redis as PHP Session Handler
One of additional approach to storing sessions in fast-memory is Redis – key-value store. This could be configured as centralized or distributed database.
There is available a Redis session_handler for PHP. To use it:
- install Redis first as a service [more]
- copy/compile redis.so PHP extension [more information]
- register an extension in php.ini configuration file
- reconfigure session.save_handler in your php.ini configuration file, or set it directly on runtime by writing for e.x.:
ini_set('session.save_handler', 'redis'); ini_set('session.save_path', 'tcp://localhost:6379'); |
Redis Session Handler in Symfony 2
I am using Symfony 2 framework. Unfortunately, 4th step don’t affects the application. You have to register own SessionHandler in config.yml file:
framework: session: handler_id: session_handler_redis |
This configuration uses new SessionHandler registered ad session_handler_redis Symfony Service (more).
We have to write own SessionHandler in Symfony. I have found the Redis SessionHandler proposed by Andrej Hudec on GitHub (original code here). I have decided to use and improve existing implementation.
Declare new SessionHandler class somewhere in your project:
<?php namespace Fokus\Webapp\CommonBundle\SessionHandler; use \Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler; /** * NativeRedisSessionStorage. * * Driver for the redis session save hadlers provided by the redis PHP extension. * * @see https://github.com/nicolasff/phpredis * * @author Andrej Hudec <pulzarraider@gmail.com> * @author Piotr Pelczar <me@athlan.pl> */ class NativeRedisSessionHandler extends NativeSessionHandler { /** * Constructor. * * @param string $savePath Path of redis server. */ public function __construct($savePath = "") { if (!extension_loaded('redis')) { throw new \RuntimeException('PHP does not have "redis" session module registered'); } if ("" === $savePath) { $savePath = ini_get('session.save_path'); } if ("" === $savePath) { $savePath = "tcp://localhost:6379"; // guess path } ini_set('session.save_handler', 'redis'); ini_set('session.save_path', $savePath); } } |
Now, add the entry that declares the class as a Symfony Service in services.yml file:
Autor wpisu: matiit, dodany: 16.07.2013 19:38, tagi: php
Debugowanie. Dziwny temat. Rzecz niby bardzo ważna i niesamowicie pomocna. Ucząc się wielu języków naturalną rzeczą jest rozdział o debugerze. Mówię szczególnie o językach kompilowanych, np. C/C++. Całkowicie inaczej jest jeśli chodzi o naukę języków skryptowych (PHP, Ruby czy Pythona na przykład). Przeważnie pomija się wspominanie o debugowaniu, w końcu interpreter przeważnie rzuca celną informację o błędzie. Wiele tutoriali i książek pokazuje jednak pewną instynktowną formę debugowania kodu. Metodę „ślepych printów, var_dumpów itd. Tak zazwyczaj jest najłatwiej. Chciałem jednak dziś pokazać trochę ambitniejsze podejście do debugowania.
Cel
Na początek: Co tak właściwie chcielibyśmy uzyskać?
- Zatrzymywanie naszego skryptu gdzie tylko chcemy
- „Kroczenie” przez nasz skrypt linijka po linijce (wykonując go w tym czasie)
- Podglądanie jak się zmieniają zmienne
- Ewaluacja kodu w dowolnym momencie działania skryptu
Dla programisty C++ czy Javy powyższe punkty są pewnie niczym takim – przecież taki programista używa ich w tramwaju kodując ze smartphona. Co innego początkujący pythonowcy czy PHP’owcy. Oni przeważnie czegoś takiego jeszcze nie uświadczyli – a przecież to takie piękne. A więc…
Jak uzyskać taki efekt w PHP?
Xdebug – nie jest to oczywiście jedyna opcja, ale to z tym rozwiązaniem mam najwięcej doświadczenia, więc xdebuga właśnie chciałem przedstawić.
Pokażę instalację na ubuntu (z przyzwyczajenia z kursu Laravel, na który oczywiście serdecznie zapraszam – http://blog.matiit.pl/category/kurs-laravel/).
Na początku musimy wyposażyć nasze PHP w xdebuga:
sudo apt-get install php5-xdebug
Oraz oczywiście włączyć je w konfiguracji php, w ubuntu jest to plik:
/etc/php5/apache2/conf.d/20-xdebug.ini
xdebug.remote_enable=1 xdebug.remote_port="9000" xdebug.profiler_enable=1
Taka konfiguracja w zupełności wystarczy, szczególnie musimy zapamiętać numer ustawionego portu. Przetestujmy teraz czy xdebug jest aktywny.
Autor wpisu: Łukasz Socha, dodany: 14.07.2013 13:00, tagi: css
Osoby pracujące jako web developer zapewne nieraz spotkały się z koniecznością stworzenia „klikalnej” mapy Polski. Większość map tworzonych jest z wykorzystaniem Flasha. Nie wszyscy zapewne wiedzą, że taką mapę można również stworzyć za pomocą HTML/CSS z dodatkiem JS.
Przygotowanie projektu mapy
Na początek musimy przygotować pliki graficzne z mapą. Wykorzystałem mapę Polski ze strony Wikipedii. Mapa będzie w odcieniach szarości, natomiast po najechaniu myszką województwo zmieni kolor.
Jako plik bazowy wykorzystamy mapę Polski w odcieniach szarości. Kolejnymi plikami są poszczególne województwa, które pojawią się po najechaniu myszką. Ważne jest, by wszystkie grafiki miały jednakowe wymiary (obszar poza danym województwem musi być przezroczysty).
Gotowe? No to kodujemy…
Na początek stwórzmy szkielet dokumentu:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Mapa</title> <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" /> <meta name="Description" content="" /> <meta http-equiv="Content-Language" content="pl" /> <meta name="Keywords" content="" /> <script type="text/javascript" src="jquery-1.10.2.min.js"></script> <style type="text/css"> </style> <script type="text/javascript"> </script> </head> <body> <div id="area"> </div> </body> </html>
#area będzie kontenerem zawierającym całą mapę. Wrzućmy do niego obrazek z tłem mapy:
<img id="map_poland" usemap="#poland" src="mapa.png" />
Teraz dodajmy listę województw:
<ul> <li id="lubelskie"><img src="lubelskie.png" usemap="#poland" /></li> <li id="podkarpackie"><img src="podkarpackie.png" usemap="#poland" /></li> <li id="podlaskie"><img src="podlaskie.png" usemap="#poland" /></li> </ul>
Musimy jeszcze „zmapować” obrazek z mapą, żeby obszary do klikania miały mniej więcej kontury takie jak województwa. Służą do tego znaczniki map i area.
<map id="poland" name="poland" > <area shape="poly" alt="lubelskie" title="lubelskie" coords="571,255,554,275,539,269,541,280,532,280,523,289,488,291,488,305,492,325,476,328,490,335,495,348,490,352,492,357,491,389,500,417,505,417,508,406,522,417,518,429,542,436,546,450,537,449,535,454,536,458,555,459,550,463,575,464,585,451,591,455,598,451,612,468,619,451,639,446,640,431,638,410,630,398,633,388,607,350,614,346,595,306,610,307,618,269" href="#lubelskie" /> <area shape="poly" alt="podkarpackie" title="podkarpackie" coords="608,465,555,546,563,562,561,579,575,595,570,593,554,593,512,576,506,565,477,554,467,562,464,525,455,519,461,513,452,509,455,464,452,461,471,449,483,443,486,433,494,428,495,414,498,416,510,413,514,413,516,423,534,433,542,432,544,447,534,455,545,456,551,462,571,462,583,451,588,451,599,448,602,456,607,462" href="#podkarpackie" /> <area shape="poly" alt="podlaskie" title="podlaskie" coords="537,40,543,32,552,36,555,46,569,51,569,51,577,53,592,76,582,77,614,159,620,187,621,218,594,227,576,256,567,255,552,245,535,247,526,215,523,201,513,208,518,193,500,204,501,183,488,180,478,173,476,148,467,134,484,139,494,132,513,121,536,103,540,87,530,79,530,62,519,57,539,49" href="#podlaskie" /> </map>
Kolejne obszary tworzone są znacznikiem area. Atrybut shape określa kształt zaznaczenia, mamy do wyboru: rect (prostokąt), circle (koło) oraz poly (wielokąt). Atrybut coords zawiera współrzędne obszaru (para liczb – oś X i Y). Trzeba pamiętać, że współrzędne liczone są od lewego, górnego wierzchołka obrazka. Do mapowania wykorzystałem Online Image Map Editor.