Want to setup a relational database with advanced search features? Just merge two specific software in one powerful application: MariaDB and Sphinx.
Continue reading Running MySQL/MariaDB and Sphinx in Docker for powerful searchPerl6, get your test environment running in seconds
So you want to give a try to Perl6 to see what this language can do for you, but you don’t want to mess up your system with a lot of software you don’t know if will ever use again. No problem! The obvious answer is called Docker.
Continue reading Perl6, get your test environment running in secondsPerl-FPM, running Perl on nginx as FastCGI
Perl was the language of choice in the early days of web programming, when Perl was a synonym for CGI. Many things are changed in the meanwhile, but we can still use Perl with a modern webserver to get things done! Continue reading Perl-FPM, running Perl on nginx as FastCGI
Get started with Perl on Docker
Docker is the modern way for distribute applications. It allows you to create a deployable entity that will run in the same way on almost every *unix platform without the need to install anything more than same basic dependencies required by Docker itself. An ideal choice to run a code sample, a testing environment or your production application. Let’s see how to use it to run a simple Perl script. Continue reading Get started with Perl on Docker
How to transfer only a certain file extension with rsync
Rsync is the tool of choice if you have to transfer files from a server to another one. The tool is very powerful and has a lot of options, but is not that easy to use when you have in mind what you need to do but you don’t know how. Continue reading How to transfer only a certain file extension with rsync
How to correctly manage UTF-8 with Perl
Perl has a native support for different character encodings, like the well known UTF-8, but its default behavior is to use Latin-1. This brings easily to a lot of problems if you don’t tune certain settings. Continue reading How to correctly manage UTF-8 with Perl
Upload huge files with Perl’s LWP::UserAgent
Everybody who work with Perl knows LWP::UserAgent, the most used library when you need to work with HTTP connections.
The library has some methods that cover the most common usage cases, such as GET and POST request.
If you need something more particular you have to set up a HTTP::Request object and pass it to LWP::UserAgent’s request method. I don’t think I’m saying something unexpected.
I recently got some problems by sending a bug file. It wasn’t really big because I’m talking about a 100 MB file, but it was bit enough to send my small VPS server out of memory. This was because I needed to pass it as raw POST payload for Google Drive API and to do that I was slurping it into memory. A bad idea.
Continue reading Upload huge files with Perl’s LWP::UserAgent
Simple smooth expanding element with Javascript without any framework
One common situation in web developing is that you want to expand and collapse an element (maybe a DIV) with a smooth animation. It’s a common request because having a smooth animation helps the user to follow what happens on the page without being disorientated by fast changes. Continue reading Simple smooth expanding element with Javascript without any framework
Google Analytics API with PHP using a service account
Google APIs are great. You can do almost everything with them: data reporting, file upload, everything. Unfortunately the documentation isn’t that good because same very important informations are not reported there! So you try the examples and they don’t work because of a hidden step you didn’t done. Continue reading Google Analytics API with PHP using a service account
Extending PDOStatement for errors checking and other tasks
PDO is a great OO library for interacting with your database from PHP. It has a very consistent interface and your code will be cleaner than ever. And your PHP script will be more portable because PDO is not related to any database, but is a generic library to work with MySQL, PostgreSQL, SQLite and a lot others.
The only thing I miss in PDO is a better query error management. When I execute a query I have to check every time the PDOStatement->errorCode property to get sure everything is working well. That’s very annoying.
Fortunately there is a way to extend the PDOStatement class to get more comfortable in writing our script. In the official docs there is not a lot about this, but here is an explanation.
The official documentation talks only about a PDO::ATTR_STATEMENT_CLASS attribute for the PDO instance to be set through the setAttribute method. That’s not much, but here is an example:
try { $dbh = new PDO( "mysql:dbname=my_database;host=localhost;charset=utf8", $user, $pass ); $dbh->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyPDOStatement')); } catch (PDOException $e) { die('Connection failed: ' . $e->getMessage()); }
You can set the attribute after the connection, not a problem. MyPDOStatement is a custom class that extends PDOStatement. A minimal version will look like this:
class MyPDOStatement extends PDOStatement { private function __construct() {} function execute($input = array()) { parent::execute($input); if ($this->errorCode() !== '00000') { $err = $this->errorInfo(); error_log(SQLException($err[2], $err[1])); return false; } return true; } }
The private constructor is mandatory. You can use it to pass some variable to every MyPDOStatement instance, very useful in many situations.
For example we could use an array to track query execution times. So the code will look like this:
$info = array('queries' => 0, 'query_time' => 0); try { $dbh = new PDO( "mysql:dbname=my_database;host=localhost;charset=utf8", $user, $pass ); $dbh->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyPDOStatement', array($info))); } catch (PDOException $e) { die('Connection failed: ' . $e->getMessage()); } class MyPDOStatement extends PDOStatement { private $info; private function __construct(&info) { $this->info = &$info; } function execute($input = array()) { $t = microtime(true); parent::execute($input); $t = microtime(true) - $t; if ($this->errorCode() !== '00000') { $err = $this->errorInfo(); error_log(SQLException($err[2], $err[1])); return false; } $this->info['queries']++; $this->info['query_time'] += $t; return true; } }