Llamada a url con parámetros mediante curl

programacion

Resulta que haciendo un Cron para se ejecute una url cada cierto tiempo nos hemos encontrado con que al hacer «curl http://mi-url-con-parametros?p1=1&p2=2» no funciona bien porque parece que hay que escapar el carácter «&«.

Pues no. No es eso.

Lo que tenemos que hacer es utilizar el parámetro -d de curl para indicar los parámetros. (valga la redundancia).

Así pues, la instrucción anterior la podéis probar como:

/usr/bin/curl -d «p1=1&p2=2» http://mi-url-con-parametros/

Otro ejemplo:

/usr/bin/curl -d «option=com_ejemplo&view=ajax&no_html=1&task=one_task» http://www.midominio.com/index.php

Espero que os ayude. xD

Concurrencia, bloqueo de código y semáforos en php

PHP

En ciertas ocasiones necesitamos que una parte de nuestro código se ejecute por solo un usuario a la vez.
Estos bloqueos de código los utilizamos para evitar problemas de concurrencia.
En php es posible implementar estos bloqueos mediante semáforos. (Ver semáforos en el manual de php)

El problema es que no siempre nuestro hosting viene con una versión estilo System V (–enable-sysvsem) compilada de php.

Si esto es así, podemos resolver el problema ejecutando el siguiente código:

if ( !function_exists('sem_get') ) {
    function sem_get($key) { return fopen(__FILE__.'.sem.'.$key, 'w+'); }
    function sem_acquire($sem_id) { return flock($sem_id, LOCK_EX); }
    function sem_release($sem_id) { return flock($sem_id, LOCK_UN); }
}

Con esto, ahora ya podemos usar las funciones de php para semáforos (sem_get(), sem_acquire(), sem_release())

Aquí os dejamos un ejemplo práctico de cómo usar los semáforos para obtener el siguiente número de pedido disponible y actualizar el pedido actual:

$sem_key = 12;
$sem_id = sem_get($sem_key, 1);
if (! sem_acquire($sem_id)) die ('Error esperando al semaforo.');


$ref = $model->getNextPedidoReference();
$pedido->referencia = $ref;
if (!$model->Update($pedido)){
    handle_error("Error guardando el pedido");
    return;
}


if (! sem_release($sem_id)) die ('Error liberando el semaforo');

De esta forma ya podemos estar seguros de que no se podrá dar el caso de que dos usuarios obtengan el siguiente número de pedido disponible a la vez y acabes teniendo dos pedidos con la misma referencia.

Happy coding!

Editor de código “Sublime text”

Programas

Nos ha causado una muy grata impresión el editor de códigoSublime text” disponible para Linux, Windows, y Mac y queríamos presentároslo.

Simplemente os dejamos el enlace a la web.
El enlace a una revisión completa del programa (en inglés).
Y la lista de características (también en inglés):

  • Side by side multi-pane editing
  • Minimap: see your code from 10,000 feet
  • Full screen mode: use all your pixels, all the time
  • Nothing but text mode: the text, the whole text, and nothing but the text
  • Syntax highlighting for many languages with C, C++, C#, CSS, D, Erlang, HTML, Groovy, Haskell, HTML, Java, JavaScript, LaTeX, Lisp, Lua, Markdown, Matlab, OCaml, Perl, PHP, Python, R, Ruby, SQL, TCL, Textile and XML supported out of the box, and more available for download
  • Multiple color schemes, with several included, and many more available for download
  • Bracket highlighting
  • Auto save: never lose your changes, not even if the dog thinks power cords are tasty
  • Fully customizable key bindings, menus and toolbar
  • Rich key binding language including sequenced key bindings, regular expression key matches, contextual bindings and parameterized bindings
  • Python plugins with a rich API
  • Rich selection of editing commands, including indenting / unindenting, paragraph reformatting, line joining and much more
  • Multiple selections: Simplify many tasks that used to require macros or regular expression
  • Column select
  • Regular expression search and replace
  • Incremental find as you type
  • Preserve case on replace
  • Bookmarks: Makes navigating through long files a breeze
  • Spell check as you type
  • Bracket matching
  • Commenting and uncommenting blocks of text
  • Asynchronous file loading, so you’re never blocked when loading files off slow network drives
  • Macros
  • Snippets
  • Auto complete
  • Repeat last action
  • Build tool integration
  • Automatic build on save
  • WinSCP integration for editing remote files via SCP and FTP

Probadlo y a ver qué os parece!!
Saludos!

Creación de listas en Joomla con JHTML

Joomla

En Joomla hay una forma bastante sencilla y cómoda de montar el html de unos radiobuttons o de un select.

$genderOptions[] = JHTML::_('select.option', 'm', JText::_('Male'));
$genderOptions[] = JHTML::_('select.option', 'f', JText::_('Female'));
$gender_list = JHTML::_('select.radiolist', $genderOptions, 'gender', '', 'value', 'text', $inseveUser->gender);

$viasOptions[] = JHTML::_('select.option', 'c', JText::_('Calle'));
$viasOptions[] = JHTML::_('select.option', 'a', JText::_('Avenida'));
$vias_list = JHTML::_('select.genericlist', $viasOptions, 'tipo_via', '', 'value', 'text', $inseveDireccion->tipo_via);

Además, para poder hacer optgroups en los selects, basta con añadir la opción:

$genderOptions[] = JHTML::_('select.optgroup', 'nombre');

y luego debajo añadir las opciones y por último llamando a select.genericlist.

Sustituir función eregi por preg_match

PHP

La funcion ‘eregi‘ está obsoleta desde PHP 5.3.

Ahora debemos usar la función ‘preg_match‘ que es compatible con ‘Perl‘.

Para la sustitución, tenemos que tener en cuanta lo siguiente:

1. Es necesario añadir delimitadores a la expresión regular.
2. Algunas expresiones las tendremos que cambiar por sus equivalentes en PCRE (Perl Compatible Regular Expressions).
3. La ‘i’ de ‘eregi’ viene de case-insensitive, que en PCRE equivale a usar el flag ‘i’.

Sabiendo esto, vamos a un caso práctico:

Utilizando Joomla 1.5 con el editor JCE, nos podemos encontrar con el siguiente error:

«Deprecated: Function eregi() is deprecated in XXX\plugins\editors\jce\libraries\classes\editor.php on line 236»

En este caso, solo tenemos que ir a la línea en cuestión, y cambiar el código:

if( eregi( $key, $param ) ){

Por

if( preg_match( '/'.$key.'/i', $param ) ){

Esperamos que os sea de ayuda.