Como habilitar short open php desde el archivo .htaccess

Para poder usar <?

php_value short_open_tag 1

Cómo convertir una base de datos MySQL a UTF8

Para convertir una base de datos cuyo encoding es latin1 (o cualquier otro) a UTF8 hay que:

1. Convertir la base de datos a UTF 8.

ALTER DATABASE database_name CHARACTER SET utf8 COLLATE utf8_general_ci;

2. Convertir cada tabla a UTF8.

ALTER TABLE table_1_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE table_2_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;


Cómo saber si una UIView está visible

Si necesitás saber si podés liberar una view podés chequear si tiene una superview:
if (myView.superview){
 // podés hacer algo con la vista porque se supone que está en la jerarquía
}
else {
 // myView no está en la jerarquía de vistas
}

You have new mail | Mac Terminal

Seguramente puede ser que haya mails por algún que tengas corriendo.

Para ver los mails por consola podés lanzar el comando:
$ mail

La documentación sobre este comando la podés ver acá.

Si querés eliminar todos los mails de una sóla vez podés lanzar el siguiente comando que lo que hace es limpiar el archivo en el cual los mails son guardados:
$ : > /var/mail/$USER

Cómo redirigir un sitio a sin www

Se puede hacer editando el .htaccess del sitio y metiendo la siguiente regla:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

Snow Leopard on Asus 1000he eee PC without usb drive

I've followed this instructions at Gizmodo.

At 8 minutes the install stopped. Seeing the installer logs I've seen that one file was missing.

The bug is related to NetbookInstaller and here is the bug: https://code.google.com/p/netbook-installer/issues/detail?id=249

It was fixed in this file: http://dl.dropbox.com/u/863180/NetbookInstaller%2020101127091350.app.zip

But you can restart your netbook. You should need to keep the USB plugged in other to boot.

Once you are in your Snow Leopard, you can download the NetbookInstaller version posted before and then run it in other to make your hard drive bootable.

After a few minutes it's done.

Other fixes that I've have to do:

  • Install voodoohda.kext and voodoohda.prefpane to get the speakers and mic running.
Other interestings links: 

Primeros pasos en electrónica

El primero de mis hobbies fue la programación.

El segundo fue la electrónica. Cuando era chico (sin inet) era complicado conseguir info. Además en mi ciudad era prácticamente imposible conseguir componentes. Así que este hobby lo dejé en el camino.

Ahora por la necesidad de hacer una mezcladora casera para conectar mi Mac y una pedalera de guitarra juntas para que no me echen del edificio por ruidos molestos me puse de nuevo a chusmear, y me cebé :)

Acá voy a ir anotando mis primeros pasos en electrónica.

Magento redirects a la vieja URL luego de mover un site

Mover un site Magento (casi) siempre es problemático. Y una de las cosas más aburridas es actualizar las URLs de las tiendas luego de mover un site.

Por lo cual me hice un pequeño script para automatizar un poco esto.

Para ejecutarlo hay que crear un carpeta llamada [MAGE_ROOT]/scripts/update-stores_urls y meter este php (update-stores-urls.php):
<?php

/*
 * Luego de importar el SQL de un website Magento actualiza las URLs de las tiendas.
 * 
 * 1. Setear el host para las urls unsecure.
 * 2. Setear el host para las urls secure.
 * 3. Setear los datos de conexión a la base de datos.
 * 4. Ejecutar desde la línea de comandos: 
 * 
 * $ sh run.sh
 * 
 */

define ('SOURCE_HOST_UNSECURE', 'http://www.mysite.com/');
define ('SOURCE_HOST_SECURE', 'https://www.mysite.com/');

define ('TARGET_HOST_UNSECURE', 'http://new.mysite.local/');
define ('TARGET_HOST_SECURE', 'http://new.mysite.local/');

$db['name'] = 'db_magento';
$db['user'] = 'db_user';
$db['pass'] = 'db_pass';
$db['host'] = 'db_host';

$conn = mysql_connect($db['host'],$db['user'],$db['pass']);
@mysql_select_db($db['name']) or die(mysql_error());

// Se actualizan las URLs no seguras
$query = "SELECT config_id, value FROM core_config_data WHERE path LIKE 'web/unsecure/%'";

$result = mysql_query($query);

while ($row = mysql_fetch_assoc($result)) {
    $config_id = $row['config_id'];
    $value = str_replace(SOURCE_HOST_UNSECURE, TARGET_HOST_UNSECURE, $row['value']);
    
    $query = "UPDATE core_config_data SET value = '$value' WHERE config_id = $config_id";
    
    echo $query . "\n";
    
    mysql_query($query);
}


// luego actualizo los configs secure
$query = "SELECT config_id, value FROM core_config_data WHERE path LIKE 'web/secure/%'";

$result = mysql_query($query);

while ($row = mysql_fetch_assoc($result)) {
    $config_id = $row['config_id'];
    $value = str_replace(SOURCE_HOST_SECURE, TARGET_HOST_SECURE, $row['value']);
    
    $query = "UPDATE core_config_data SET value = '$value' WHERE config_id = $config_id";
    
    echo $query . "\n";
    
    mysql_query($query);
}

echo "Actualizadas las URLs de las tiendas :)\n";

?>

Y el siguiente sh (run.sh):
# actualizacion de las urls en la bd
php update-stores-urls.php

# limpieza de la cache
rm -fr ../../var/cache/*
rm -fr ../../var/session/*

Para ejecutarlo correr desde línea de comandos:
$ sh run.sh

Para más info de cómo acá hice un mini tutorial sobre los pasos a seguir para mover / copiar un site Magento a un servidor MAMP.

Cómo quitar la nueva caja de componer email de Gmail | How to come back to old compose gmail

La verdad es que la nueva caja de componer email de Gmail es una porquería (al menos en mi humilde opinión).

Te volvés loco para ver en esa cajita tan diminuta, y si querés poner una lista y alinearla tenés que hacer 10 mil clicks.

Así que volví a usar el viejo compose de Gmail que por el momento se puede volver a usar.

Para ello hay que hacer los siguientes pasos.

1) Hacer click en el triangulito y seleccionar "Volver temporalmente a la interfaz de redacción antigua".

2) Hacer click en "Volver a la anterior temporalmente".




Cómo eliminar la caja de comparar productos del sidebar de Magento.

Una vez más se puede utilizar el local.xml para modificar el layout y así eliminar la caja de comparar productos en el sidebar de Magento.

Para eliminar dicha caja de todo tu site de Magento tenés que poner lo siguiente:

<default>
<remove name="catalog.compare.sidebar"/>
</default>

Cómo eliminar CSS de ciertas páginas en Magento

Puede ser que tengas un css en tu layout que quieras que no esté en determinada página de Magento.

Para esto se puede utilizar el sistema de layouts de Magento poniendo lo siguiente:

<reference name="head"> 
<action method="removeItem"> 
<type>skin_css</type> 
<name>filename.css></name> 
<params /> 
</action> 
</reference>

Esto se puede poner en el local.xml o también si es una página del CMS de Magento en CMS > Custom Design > Layout Update XML.

Algo similar se puede hacer si necesitás eliminar JS de ciertas páginas.

Cómo actualizar los índices de Magento desde consola

Los índices de Magento se pueden actualizar desde el backend (Sistema > Index Management) o mediante un comando por consola.

Para actualizar los índices por consola hay que situarse en el directorio "shell" y lanzar el siguiente comando:

# php indexer.php reindexall

Cómo deshabilitar productos en Magento.

Si bien se puede deshabilitar uno a uno los productos en Magento, o también hay algunos módulos que permiten hacer batch update, o incluso se pueden utilizar los perfiles de importación para actualizar los productos, hacerlo de manera programática consume muchos recursos y muchas veces al hacer actualizaciones de muchos productos Magento explota.

Entonces, para hacerlo de manera rápida se puede lanzar un query que actualice el atributo "status" al valor 2 (deshabilitado).

Para ello se puede utilizar el siguiente query:

UPDATE catalog_product_entity_int cpei, catalog_product_entity cpe
SET cpei.value = "2"
WHERE cpe.entity_id = cpei.entity_id
AND cpe.sku LIKE '%SKU%'
AND cpei.attribute_id = 273

Luego de lanzar el query hay que actualizar los índices de Magento. Esto se puede hacer desde el backend o por consola (hay que situarse en el directorio shell):

# php indexer.php reindexall

Importante: el id del atributo status (273 en mi ejemplo) puede variar según la instalación de Magento.

Para saber el id del atributo "status" se puede ir a Catálogo > Atributos > Gestionar los atributos > buscar por código el atributo status > hacer click sobre el mismo > copiar el id que aparece en la url.

Por ejemplo: admin/catalog_product_attribute/edit/attribute_id/273

Cómo hacer URL encode en Javascript.

Para hacer URL encode Javascript tiene las siguientes funciones:

  • escape() < deprecado desde ECMAScript v3
  • encodeURI()
  • encodeURIComponent()

Más en stackoverflow

NSData to NSString

En Objective C para castear un objeto NSData a un objeto NSString se realiza de dos maneras:

Si el objeto no termina en null hay que usar el método -initWithData:encoding:
    NSString* newStr = [[NSString alloc] initWithData:data
                                              encoding:NSUTF8StringEncoding];

Si el objeto termina en null hay que usar el método -stringWithUTF8String para eliminar el \0 al final de la cadena.
    NSString* newStr = [NSString stringWithUTF8String:[data bytes]];


Cómo instalar wget en Mac

Un prerrequisito para instalar wget en Mac es tener instaladas las command line tools.

Wget es una herramienta que permite descargas desde servidores. Su nombre proviene de www (w) y obtener en inglés (get).

Para instalarlo:

1. Descargar wget desde http://ftp.gnu.org/gnu/wget/wget-1.13.tar.gz

2. Abrir una terminal de Mac y lanzar los siguientes comandos:
$ mkdir ~/Development
$ mv ~/Downloads/wget-1.13.tar.gz ~/Development
$ cd ~/Development
$ tar -xzvf wget-1.13.tar.gz 
$ cd wget-1.13
$ ./configure --with-ssl=openssl
$ make
$ sudo make install
$ which wget # deberia salir /usr/local/bin/wget

Django model self reference

Una autoreferencia es cuando en un modelo una entidad puede ser hija de otra de la misma clase.

Por ejemplo, con la famosa clase Persona, el padre de una Persona sería otra Persona.

Esto a nivel de base de datos se hace con un campo "parent_id" que apunta a la PK de otra tupla.

En Django esto se puede hacer de la siguiente manera:
class Person(models.Model):
    name = models.CharField(max_length=200)
    parent = models.ForeignKey("self", null=True, blank=True, related_name="children")
Más sobre los modelos en Django.

Instalar Django en Ubuntu 12.04

Django es un framework de desarrollo para aplicaciones web desarrollado en Python.

Instalar Django en Ubuntu es easy cake :)

1. Instalar paquetes opcionales que pueden ser utilizados con Django:
$ sudo aptitude install python-imaging python-pythonmagick python-markdown python-textile python-docutils

2. Instalación de Django:
$ sudo aptitude install python-django

3. Para comprobar que está instalado correctamente:
$ django-admin


FTS y SOUNDEX de SQLite en iOS

Agregar tu propia versión de SQLite para tu proyecto iOS es fácil.

1. Descargá desde http://www.sqlite.org/ la última versión de sqlite almagamation.

2. Descomprimilo en tu computadora y agregá a tu proyecto iOS los archivos sqlite.c y sqlite.h.

3. Abrí el archivo sqlite.h y agregá:
# define SQLITE_SOUNDEX 1
# define SQLITE_ENABLE_FTS3
4. Compilá tu proyecto ;)

Ojo! No hay que tener agregada la lib sqlite de xcode, sino pincha. Así que si ya la tenías linkeada en tu proyecto quitala.

iOS wireframes

A veces es necesario realizar wireframes para aplicaciones iOS a mano alzada.

Acá hay dos imagenes que me vinieron al pelo para un proyecto para el cual estaba haciendo el workflow con el cliente :)



Cómo cambiar el favicon en Blogger?

El favicon es el icono pequeño que se ve en el navegador al lado de la URL de un sitio.

Para cambiar el favicon en un blog de Blogger hay que hacer click en el item del menú lateral "Diseño" y luego sobre el link "Editar" que se encuentra en el recuadro del favicon.



Luego hay que seleccionar el archivo a subir y hacer click en "Guardar".



¿Cómo saber cuantas cifras tiene un número?

El logaritmo es la inversa de la potencia.

Entonces, al hallar el logaritmo en base 10 de determinado número, la parte entera representa la cantidad de cifras del número.

Por ejemplo:


Log(1) => 0
Log(9) => 0,95...
Log(10) => 1
Log(11) => 1,04...
Log(99) => 1,99...
Log(100) => 2

Así que de esta manera se puede hacer una función simple para contar las cifras. Por ejemplo en PHP se podría contar las cifras con la siguiente función:
<?php

function getCifras($number) {
   return intval(log($number, 10)) + 1;
}

echo getCifras(11);   // imprime 2
echo getCifras(100);  // imprime 3
echo getCifras(1999); // imprime 4

?>


Cómo asociar tipos de archivos en MAC

1. Desde el Finder hacer click sobre el archivo.

2. Presionar CMD + I

3. Seleccionar con cuál programa abrirlo

4. Hacer click en Change All.


Instalar Open SSL en Ubuntu Linux

1. Descargar Open SSL
# wget http://www.openssl.org/source/openssl-0.9.8e.tar.gz

2. Descomprimir el archivo
# tar -xvzf openssl-0.9.8e.tar.gz

3. Ingresar al directorio
# cd openssl-0.9.8e

4. Configurar Open SSL
# ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
Cambiar "/usr/local/openssl" por la carpeta en la que querés que se copien los archivos

5. Instalarlo
# sudo make install

Download file with GWT

Esta es una manera fácil de enviar desde GWT archivos al navegador para que los usuarios se los puedan descargar.

1. Hay que agregar un frame oculto en el HTML de la hosted page:
<div id="__gwt_downloadFrame" tabIndex='-1'></div>

2. Para iniciar la descarga poner este código en la parte cliente (código GWT):
public static void download(String p_uuid, String p_filename) { 
        String fileDownloadURL = "/fileDownloadServlet" 
                               + "?id=" + p_uuid 
                               + "&filename=" + 
URL.encode(p_filename); 
        Frame fileDownloadFrame = new Frame(fileDownloadURL); 
        fileDownloadFrame.setSize("0px", "0px"); 
        fileDownloadFrame.setVisible(false); 
        RootPanel panel = RootPanel.get("__gwt_downloadFrame"); 
        while (panel.getWidgetCount() > 0) 
            panel.remove(0); 
        panel.add(fileDownloadFrame); 
} 

3. Poner esto en el servlet que va a servir el archivo a descargar:
@Override 
protected void doGet(HttpServletRequest p_request, 
                         HttpServletResponse p_response) 
        throws ServletException, IOException { 
        String filename = p_request.getParameter("filename"); 
        if (filename == null) 
        { 
            p_response.sendError(SC_BAD_REQUEST, "Missing filename"); 
            return; 
        } 

        File file = /* however you choose to go about resolving 
filename */ 

        long length = file.length(); 
        FileInputStream fis = new FileInputStream(file); 
        p_response.addHeader("Content-Disposition", 
                             "attachment; filename=\"" + filename + 
"\""); 
        p_response.setContentType("application/octet-stream"); 
        if (length > 0 && length <= Integer.MAX_VALUE); 
            p_response.setContentLength((int)length); 
        ServletOutputStream out = p_response.getOutputStream(); 
        p_response.setBufferSize(32768); 
        int bufSize = p_response.getBufferSize(); 
        byte[] buffer = new byte[bufSize]; 
        BufferedInputStream bis = new BufferedInputStream(fis, 
bufSize); 
        int bytes; 
        while ((bytes = bis.read(buffer, 0, bufSize)) >= 0) 
            out.write(buffer, 0, bytes); 
        bis.close(); 
        fis.close(); 
        out.flush(); 
        out.close(); 
} 


Cómo saber si ser freelance es tu vocación :)

Copio un cuestionario que encontré por ahí y que me pareció divertido acerca del autoconocimiento acerca de si uno puede ser freelance.

1. 
Que te interesa de ser freelance?
a) Los retos
b) La libertad
c) Tiempo para vos y tu familia

2. El reto más grande al trabajar por tu cuenta sería
a) Estar solo todo el día
b) Ingresos irregulares y poco predecibles
c) Promocionarte y venderte

3. Que tan flexible sos?
a) Puedo manejar cualquier cosa que se presente cómodamente
b) Mi especialidad es controlar las emergencias pero me gusta la rutina
c) Prefiero tener una estructura predecible y prestablecida

4. La idea de no recibir ingresos durante varios meses:
a) Siento cierta ansiedad pero también me motiva.
b) No soy fan, pero puedo sobrellevarlo y asumirlo como parte del proceso.
c) Me aterra horrores y me duele el estómago.

5. Tus habilidades para negociar son:
a) Excelentes
b) Me salgo con la mía la mayoría de las veces
c) No muy buenas

6. En automotivación ¿cómo te calificas?
a) Con 9-10 porque Soy extremadamente automotivado
b) Con 8-7 porque lo soy una buena parte del tiempo, pero a veces me cuesta
c) Con 5 de reprobado porque no logro automotivarme

7. ¿Qué logra hacer que cumplas con tus tiempos de entrega?
a) Algo en mi que no se está en paz si no lo logro.
b) El jefe que está respirándome en la nuca
c) Casi nunca entrego en los tiempos acordados

8. Llegas a tu próximo día de pago:
a) Sorprendentemente bien. Siempre tengo algo en la bolsa.
b) Más o menos. Le sufro a veces. 
Llego con la tarjeta de crédito o pidiendo prestado aunque sea un poco.
c) Siempre me falta

9. ¿Te gusta venderte a ti mismo?
a) Me encanta
b) En ocasiones me inspiro y lo logro muy bien
c) Soy más tímido de lo que quisiera

10. Es casi la hora de salida en viernes, tu:
a) ¿Hora de salida?
b) Emocionado por que llegue el fin
c) Estás con un pié en la puerta

11. Te gusta tratar con personas de todo tipo (aún las difíciles)
a) Si. Rara vez alguien me cae mal o me exaspera
b) No siempre, pero logro anteponer lo que me parece más importante.
c) No me gusta tratar con gente idiota/necia/loca/emocional (osea todos)

12. Cuando alguien te pide un favor tu:
a) Lo haces sin chistar
b) Evalúas todos los factores involucrados antes de decir
c) NO haces favores. Punto

13. Alguna vez te han transado?
a) No. Mi escepticismo está de lo más sano
b) Me han engañado un par de veces, pero ahora es difícil
c) Si, caigo a menudo

14. Los tiempos y tu…
a) Nos llevamos bien. Es raro que no haga todo lo que proyecté hacer en un día
b) Hay días muy buenos y muy malos. Me organizo pero a veces el tiempo me gana
c) Nos llevamos muy mal. Nunca me da tiempo de nada y no logro averiguar porque.

Si contestaste más de 8 a
Estás preparado para ser freelance. Al menos en lo que mental, organizacional y financieramente se refiere. Hay altas posibilidades que este sea TU paraíso. Ya lo has probado,  te sientes como pez en el agua, o lo suficientemente cómodo para adoptarlo como modo de vida.

Si contestaste más de 8 b
Tienes buena madera para ser freelance. Quizá has estado demasiado tiempo en el mundo corporativo y no sabes como sería la vida fuera, pero te interesa y tienes características muy útiles para el freelanceo. Eres flexible y estás dispuesto a cambiar tu punto de vista. Te falta pulir habilidades pero eso se hace con la práctica y experiencia.
Este puede ser tu paraíso si te interesa.

Si contestaste más de 8 C
El ser freelance no es tu primera opción. No te ves trabajando solo y menos sin un sueldo fijo. Te cuesta “inventar trabajo de la nada” y  la improvisación no es tu fuerte. Sin embargo, si quisieras freelancear, no todo está perdido. Hay maneras de aprender habilidades como: vender, negociar, gastar menos de lo que ganas, tratar con gente.

También se pueden hacer “trucos” para adaptar la vida independiente a quien gusta de las estructuras: asociarte con alguien, diseñar los procedimientos. Que los días de pago siempre sean los mismos (una vez que el cliente pagó), etc. Quizá valga la pena que intentes asomarte a este paraíso para averiguar en carne propia.

Cómo eliminar el atributo com.apple.quarantine

En Mac, por cuestiones de seguridad cuando se descargan archivos, éstos son marcados con un atributo de "cuarentena".

Esto es así para que una vez descargado el archivo al intentar abrirlo Mac nos pregunte "El archivo bla bla bla se ha descargado el día tal, desea abrirlo?". Una vez que le damos OK no nos lo vuelve a preguntar porque le elimina este atributo (com.apple.quarantine) al archivo.


Esto normalmente no es tema escabroso. Pero en mi caso me había descargado los fuentes de Wordpress y cuando lo quise ejecutar en mi apache local por este tema no se ejecutaba ya que los archivos estaban en cuarentena.

Hay unos comandos para trabajar con estos atributos (y otros).

Para ver desde consola los atributos de un archivo:
xattr filename
Para eliminar el atributo com.apple.quarantine de un archivo:
xattr -d com.apple.quarantine filename
Para eliminar el atributo com.apple.quarantine de un directorio de manera recursiva:
xattr -dr com.apple.quarantine diretoryName

Cómo ejecutar Chrome con parámetros en Mac

Hay veces en las cuales es necesario ejecutar una aplicación pasándole parámetros. Por ejemplo si se quiere abrir Chrome con alguna funcionalidad extra que no viene por defecto.

Para ello hay que abrir una terminal (Applications > Utilities > Terminal) y ejecutar lo siguiente:
# open /Applications/Google\ Chrome.app --args --enable-speech-input
Acá hay una lista de launch parameters para Chrome.

Virtual Box compartir carpetas entre host Mac y guest Debian

Esto es para poder acceder desde una máquina virtual Debian corriendo en Virtual Box a las carpetas del host (en este caso Mac, Mountain Lion).

1. Desde Virtual Box asignar las carpetas a compartir.

2. En la máquina virtual (guest) crear puntos de montaje (como root).
mkdir /mnt/share
mkdir /mnt/share/music
mkdir /mnt/share/videos
mkdir /mnt/share/pix
mkdir /mnt/share/dox
mkdir /mnt/share/down
3. Agregar lo siguiente al final del archivo /etc/sudoers:
user ALL = NOPASSWD : ALL
Reemplazar "user" con tu usuario.

4. Crear un script para montar las carpetas compartidas:
mkdir ~/scripts
nano scripts/shared-folders

#!/bin/sh
sudo mount -t vboxsf music /mnt/share/music
sudo mount -t vboxsf videos /mnt/share/videos
sudo mount -t vboxsf pix /mnt/share/pix
sudo mount -t vboxsf dox /mnt/share/dox
sudo mount -t vboxsf down /mnt/share/down
Los nombres que van luego de "vboxsf" son los que se designaron en el punto 1.

5. Agregar el script a los programas de inicio de Gnome: Desktop > Preferences > Sessions > Startup programs

Cómo evitar que Google Analytics contabilice mis propias visitas

Si Google Analytics está contabilizando tus propias visitas a tu sitio web eso puede implicar un margen de error en las estadísticas.

Si tenés un blog o sitio que no tiene muchas visitas, y vos estás visitándolo porque estás editando posts, haciendo cosas de programación, etc, puede ser que la cantidad de visitas propias esté distorcionando tus estadísticas.

Hay una manera simple de evitar que Google Analytics contabilice tus visitas y es con un plugin de Google para Chrome que lo podés descargar desde acá.

Cómo hacer un redirect 301 en blogger

Hay veces en las cuales es necesario hacer un redirect de una página o post en un sitio web.

Esto también puede ser necesario en un blog, ya que se pueden eliminar contenidos, o cambiar, actualizar, etc.

Ahora bien, para hacer un redirect hay varias maneras posibles. Puede hacerse por javascript, desde un lenguaje de servidor (PHP, Java, etc), con la etiqueta meta redirect, etc. Cada opción tiene sus pros y contras.

En Blogger no se puede hacer un redirect con lenguaje de servidor ya que no hay lenguaje de servidor :)

Se puede hacer con JS, pero no sirve para no perder el posicionamiento en Google.

Así que la mejor opción es hacer un redirect 301. Ahora la cuestión es cómo hacer un redirect 301 en Blogger?

Simple, hay que ir a Configuración > Preferencias para motores de búsquedas > Errores y direccionamientos > Redireccionamiento personalizado y hacer click en "Editar". Acá hay que poner la URL antigua y la URL a la que debe redirigir. Simple!

Programador PHP Argentina

Hola.

Soy un programador freelance de Argentina que se dedica al desarrollo de aplicaciones web.

Desde hace más de 7 años que me dedico al desarrollo de aplicaciones PHP. Empecé con PHP "puro y duro" por así decirlo.

Luego estuve viendo los diferentes frameworks MVP del mercado de los cuales los que más me gustaron son Zend y Symphony.

Y finalmente comencé a trabajar con los diferentes CMS que hay para PHP para no "reinventar la rueda" :)

Trabajé con Wordpress y Drupal a nivel CMS. Y en cuanto a tiendas online con Magento y Prestashop.

Ahora mismo, además de dedicarme al desarrollo de aplicaciones web me encuentro trabajando en el desarrollo de aplicaciones móviles. Principalmente me dedico a iOS con Objective, pero también (dependiendo del proyecto) trabajo con Android (desde 2.2 en adelante) y con jQuery Mobile (para el caso de web applications móviles).

Si tenés alguna duda o querés un presupuesto contactame acá que hoy mismo me pongo en contacto con vos.

Dónde está el archivo php.ini en Mac

El archivo php.ini en Mac se encuentra en la ruta /usr/php.ini

Si no se encuentra allí hay que copiarlo desde /etc/php.ini.default y darle permisos de escritura para poder modificarlo

# sudo cp /etc/php.ini.default /etc/php.ini
# sudo chmod u+w  /etc/php.ini



Cómo instalar mcrypt en Mountain Lion

La libería mcrypt para PHP no viene instalada por defecto.

Para instalarla hay que seguir una serie de pasos.

1) Instalar las command line tools de xcode.

2) Instalar mcrypt. Para ello.

Abrir una terminal (Applications > Utilities > Terminal). Y crear un directorio llamado mcrypt

# cd ~ ; mkdir mcrypt ; cd mcrypt

Descargar la libería mcrypt desde Sourceforge.

Descargar el código fuente de PHP. Para saber qué versión de PHP descargar tipear en la consola:

# php -v

Mover los archivos descargados a ~/mcrypt y expandirlos.

Configurar libmcrypt


Ir al directorio de mcrypt:

# cd libmcrypt-2.5.8
# ./configure
# make
# sudo make install

Ahora la librería mcrypt está configurada e instalada.

Errores de Autoconf

Si tenés errores como el siguiente:

Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

Significa que no está instalado autoconf. Para instalarlo ir a la consola ir tipear lo siguiente:

# cd ~/mcrypt<
# curl -O http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
# tar xvfz autoconf-latest.tar.gz
# cd autoconf-2.69/
# ./configure
# make
# sudo make install

Compilar la extensión mcrypt para php.


# cd ../php-5.3.13/ext/mcrypt/
# /usr/bin/phpize

La salida tiene que ser
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626 
configure.in:3: warning: prefer named diversions
configure.in:3: warning: prefer named diversions

# ./configure
# make
# sudo make install

La salida tiene que ser:

Installing shared extensions:     /usr/lib/php/extensions/no-debug-non-zts-20090626/


Habilitar la extensión mcrypt para PHP.


Abrir el archivo /etc/php.ini (si no se encuentra allí lo podés copiar del default) y agregar la siguiente linea al final del archivo:

extension=mcrypt.so



Cuál es la mejor app de gtalk para iPhone

Luego de estar buscando y probando una y otra app para utilizar gtalk en mi iPhone y ver que son una peor la que otra finalmente encontré una que funciona bien, no crashea a cada rato, se mantiene logueado a pesar de que se cierre la aplicación y que las notificaciones llegan en tiempo y forma.

La aplicación es: Beejive y si bien es una aplicación de pago, la versión gratuita a pesar de tener unos banners bastante intrusivos es totalmente funcional.

Could not instantiate class named NSLayoutConstraint

Por defecto cuando se crea un proyecto nuevo en xcode 4.5 cada XIB creado utiliza autolayout lo cual es una propiedad de iOS 6.

Entonces al correr el proyecto con una versión de iOS < 6 explota.

Las posibles soluciones son:
  • O bien correr el proyecto con iOS >= 6.0
  • O bien modificar poner la propiedad autolayout de cada XIB a false.
Para poner la propiedad autolayout a false, seleccionar el XIB y en el File Inspector deseleccionarla.


No provisioned iOS devices are available with a compatible iOS version.

Si ocurre este problema al intentar hacer correr una aplicación desde xcode en el un terminal iOS es probable que se deba a lo siguiente.

Por defecto xcode 4 crea aplicaciones con soporte sólo para armv7. Si tu terminal tiene un procesador armv6 ahí está el problema.

Para solucionarlo hay que agregar armv6 a la lista de arquitecturas soportadas. Esto se hace agregando una nueva entrada en el archivo ProjectName-Info.plist




Cómo comprobar si funciona el envío de emails de Magento

Hay veces en las cuales es necesario comprobar si Magento está enviando de manera correcta los emails y no hay en el backend un botón "Enviar email".

Una manera fácil de comprobar si nuestra tienda de Magento está enviando los emails correctamente es tener un usuario de pruebas y desde el backend resetear su password.

Si está funcionando correctamente le llegará el email al usuario. Si no no llega es porque hay algún problema con el envío de emails.

Cómo limpiar la cache DNS en Mac

Los request normalmente son cacheados para agilizar las búsquedas que atacan a un mismo host pero a veces es necesario limpiar la cache.

Para hacerlo hay que abrir una terminal y tipear lo siguiente:

Para OSX 10.4

# lookupd -flushcache

A partir de OSX 10.5

# dscacheutil -flushcache

Cómo compartir carpetas entre Mac OS X y Ubuntu (Virtual Box).

Para poder compartir carpetas entre Mac y una máquina virtual Ubuntu corriendo en Virtual Box hay que seguir los siguientes pasos:

1. Dentro de la máquina virtual Ubuntu instalar el Guest Aditions de Virtual Box.
2. Agregar el usuario de Linux al grupo virtualboxsf.
3. Compartir la carpeta (hacerla automontable). Esto se hace desde el menú de Virtual Box.
4. Reiniciar Ubuntu.

Dónde están guardados los mensajes de Skype en Mac?


Skype no aloja de manera online los mensajes antiguos de chat. Sólo aloja los contactos.

Si querés cambiar de Mac y no querés perder tus mensajes tenés que copiar el contenido de la carpeta ~/Library/Application Support/Skype/tu_usuario de la vieja Mac a la nueva.

De la misma manera también podés recuperar tus mensajes antiguos desde una Time Capsule ;)

Cómo utilizar valores hexadecimales para definir colores en Objective C

Objective C no tiene una función para definir un color a partir de un valor hexadecimal. Y normalmente esto es una necesidad :)

Pero sí tiene una función para definir un color a partir de valores RGB (Red, Green, Blue). Para ello se utliza la siguiente función:

[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];

A partir de ello se puede crear una macro e incluirla en algún header para que esté disponible:

#define UIColorFromRGB(rgbValue) [UIColor \
colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \
green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \
blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

Luego se puede utilizar esta macro de la siguiente manera:

self.view.backgroundColor = UIColorFromRGB(0xCECECE);

Cómo mostrar el directorio /usr en Finder

El directorio /usr por defecto está oculto en el Finder.

Para poder verlo hay que cambiar el flag hidden a nohidden.

Para esto hay que abrir una terminal y tipear lo siguiente:
# sudo chflags nohidden /usr