Benedict Evans INCONTEXT 2014 – Mobile

Posted: febrero 28th, 2014 | Author: | Filed under: Empresas/Startups, Internet | Tags: | No Comments »

Benedict Evans en la conferencia INCONTEXT 2014, en su Keynote nos deja claro que la revolución movile recién comienza, que no tenemos idea que forma va a tomar y que aún deben surgir nuevos paradigmas como en su momento tuvimos a Windows y su escritorio, o como hoy tenemos a Google y su Pagerank.

En el mundo mobile aun esta todo por inventar, los estandares actuales estan solo de paso ya que muchos de ellos son simples parches o analogías de como haciamos las cosas antes aplicadas al celular. No son soluciones nativas por lo que han de evolucionar.


Chris Dixon en Startup School 2013 – Grandes ideas que parecian malas ideas

Posted: febrero 24th, 2014 | Author: | Filed under: Empresas/Startups | Tags: , | No Comments »

Chris Dixon nos deja una lista de recomendaciones para auto evaluar nuestras ideas asi como identificar ideas de otros con potencial. Aunque suene a cliche decir que “Las grandes ideas fueron malas ideas en un momento”,  es tan cierto esto como que: “Las malas ideas fueron malas ideas en un momento”. Es por eso que hay que estar atentos a las malas ideas que solo son malas porque queremos que lo sean.

Esto aplica a las ideas disruptivas de los modelos actuales, ya sea porque eliminan intermediarios, cambian las reglas de juego para la valorizacion de las cosas o bien trivializan cosas antes fundamentales.


Bots en conversaciones

Posted: enero 25th, 2014 | Author: | Filed under: Internet | No Comments »

Leyendo una de esas entradas en Reddit que parecen ser solo una más con un video interesante y algún comentario sarcástico me encontré con un Bot muy atinado que aporto un link y resumen de una wiki relacionado al tema que los usuarios estaban comentando.

Los comentarios que siguen al aporte del Bot dan cuenta que de a poco nos acercamos a la posibilidad de tener interacciones reales con “computadoras” (en realidad con sistemas complejos, por lo general en la nube).

Aquí la captura de pantalla del Bot en acción aportando un ejemplo a la que hace referencia una persona en forma incompleta:

Bots en conversaiones reddit

Para los interesados en el post en Reddit, tiene un video muy interesante:

http://www.reddit.com/r/videos/comments/1w4gm5/riot_squad_using_ancient_roman_techniques/

 


Preguntas para entrevistas a un candidato de trabajo

Posted: enero 3rd, 2014 | Author: | Filed under: Empresas/Startups, Personal | Tags: , | No Comments »

Cuando vamos a entrevistar a un candidato para un puesto lo primero que se nos viene a la mente es que tenga los conocimientos técnicos necesarios, que tenga experiencia, que tenga pergaminos, cuanto más mejor. Esta postura suele ser alentada por algunas empresas de reclutamiento y especialmente por centros de estudios terciarios, pero no suele ser de gran ayuda. Excepto en lugares de trabajo donde la calificación técnica es excluyente, estos puestos son bastante raros en realidad, lo más importante de una persona es que sepa trabajar en equipo, colabore, intente aportar ideas y sepa adaptarse.

Además de las preguntas de rigor, referencias, educación, informática e idiomas suele ser tan importante como todo el resto conocer si la persona es algo más que eso. Si va a aportar a la cultura de la empresa, si tiene inquietudes y puede tener cierta autonomía. Si no buscamos a alguien así puede ser mejor pensar en utilizar un software para la tarea!

Estas son algunas preguntas de ejemplo para realizar en una entrevista de trabajo:

  • Ejemplos de tareas desarrolladas en tu trabajo anterior. Cuales de esas tareas eran diarias y cuales excepcionales?
  • Describe al menos dos tareas o problemas resueltos por ti o con tu colaboración de los cuales te sientes orgulloso.
  • Describe algun error o falla realizada por ti o con tu colaboración que se debió corregir. (Es importante pedir detalles aquí para evaluar la autocritica y aprendizaje).
  • En el último mes, que información interesante has leido? Puede ser técnica o general, o tal vez un hobby personal.
  • En que área sientes que siempre te has querido desarrollar pero lo postergas? A nivel laboral o personal, sea técnico, administrativo o un hobby.
  • Además del trabajo, que otras prioridades tienes en tu vida? (Es importante una vida balanceada y saber en que grado se puede comprometer la persona con el puesto)
  • Tienes material de ejemplo creado por ti? Un sitio web, imagenes, archivos de Excel/Word, colección de fotografías, etc.

Espero que les parezcan interesantes, la idea es conocer a la persona en su personalidad completa, con sus intereses y debilidades.

Se escuchan sugerencias para la lista!


Mapas vectoriales de paises en PNG, PDF e Illustrator

Posted: octubre 8th, 2013 | Author: | Filed under: Recursos Web | Tags: , | No Comments »

Para los casos en que necesitamos un mapa limpio de países de todo el mundo, o bien de regiones o el mundo entero en alta resolución y con posibilidades de trabajar sobre ellos podemos descargarlos desde este sitio.

Podemos encontrar mapas de países de latinoamérica, México, Brasil, Colombia, Argentina, asi como otros de Estados Unidos, Canada y Europa país a país.

https://www.freevectormaps.com


Remover proteccion de clave en hojas en Excel 2007 y 2010

Posted: septiembre 26th, 2013 | Author: | Filed under: Recursos Web, Software | Tags: | No Comments »

En caso de que tengamos un archivo Excel protegido, en su totalidad u hojas con celdas que no se pueden editar, podemos forzar la clave con un pequeño script en VB. Es ideal para casos en que “olvidamos” la clave y no podemos ver las fórmulas de las celdas protegidas.

Lo primero que debemos hacer es abrir el archivo en cuestion en Excel, en la pestaña de Revisar vemos las opciones de “Proteger Hoja” y “Proteger Libro”.

excel-proteger-hoja-contraseña-remover-1

El script que busca la clave para desproteger el archivo corre en la consola de VB de Excel, para abrirla presionamos las teclas Alt+F11 con lo cual veremos una ventana de ejecución de script.

excel-proteger-hoja-contraseña-remover-2

Seleccionamos a la izquierda la hoja en cuestión del archivo y veremos un cuadro blanco donde podemos pegar el siguiente código:

Sub PasswordBreaker()
‘Breaks worksheet password protection.
Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
MsgBox “One usable password is ” & Chr(i) & Chr(j) & _
Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End Sub

Debería quedar  de la siguiente forma:excel-proteger-hoja-contraseña-remover-3

Hecho esto le damos clic en ejecutar o con la tecla F5. El script probará contraseñas hasta encontrar una utilizable, por ejemplo algo como esta clave:

AABAABAAABA[

Luego podemos volver a proteger el archivo para evitar modificaciones por error en celdas con fórmulas.


Integrar Google Docs con WordPress y Cforms

Posted: febrero 9th, 2012 | Author: | Filed under: PHP, Wordpress | Tags: , , , , | No Comments »

Muchos webmaster tienen redes de sitios clasificados por tema o rubro, de los cuales obtienen consultas, potenciales clientes, etc. Luego utilizan estos datos para cobrar comisiones, hacer un seguimiento de las ventas y monitorear la actividad. Centralizar estas consultas en un solo correo es una solución que suele ser práctica para casos de poco volumen o bien cuando los sitios los gestionamos solo nosotros.

Para los casos en que tenemos muchos sitios y queremos que terceros puedan ver la información, a modo de control, es necesario contar con una planilla en la cual se carguen los mensajes en forma automatica. Lo ideal es que los campos de información de los formularios completen las columnas del excel online para hacer facil el seguimiento. Eso es lo que vamos a hacer, guardar todos los emails en un Google Doc que podemos compartir y mantener actualizado al momento.

Gracias a rakisuy por este artículo!

Rakisuy:
Lo primero que debemos de hacer es ir a nuestro Google Docs, alli creamos una nueva Hoja del tipo formulario. La podemos editar, creamos los campos que tendrá nuestro formulario de Cforms.

Formulario de WordPress con Google DocsHacemos click arriba a la derecha en More actions y seleccionamos Embed. Esto nos abrira un popup con un codigo HTML, el cual es un iframe, para insertar nuestro formulario en donde deseemos, pero eso no lo haremos!

Tomamos la URL del iframe y la abrimos en el navegador, alli nos abrira nuestro formulario.

Lo importante ahora es que veamos el action en el codigo HTML de nuestro form, el cual es por ej.:

https://docs.google.com/spreadsheet/formResponse?formkey=dddddddddddddddddddddddddd&theme=0AX42CRMsmRFbUy1iOGYwN2U2Mi1hNWU0LTRlNjEtYWMyOC1lZmU4ODg1ODc1ODI&embedded=true&ifq

Aqui lo que nos importa es el formkey, el theme no nos interesa, por lo que lo borramos junto con todo lo demas dejando asi:

https://docs.google.com/spreadsheet/formResponse?formkey=dddddddddddddddddddddddddd

El nombre de nuestros campos es entry.0.single para nuestro primer campo, entry.1.single para el segundo, y asi sucecivamente, vemos que cambia el indice el campo, se le suma uno y comienza en 0

Lo importante es hacer un post a nuestro action, y pasando el valor de nuestros campos, pero tenemos que tener cuidado, ya que Google Docs usa HTTPS, protocolo seguro, por lo que el codigo PHP necesario para hacer un envio POST aqui es:

$Url = ‘https://docs.google.com/spreadsheet/formResponse?formkey=dddddddddddddddddddddddddd’;
$strRequest = “entry.0.single=valor campo uno&entry.1.single=valro del campo 2&entry.2.single=valor del campo 3″;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $Url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1) ;
curl_setopt($ch, CURLOPT_POSTFIELDS, $strRequest);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$result = curl_exec($ch);
curl_close($ch);

La variable $Url es nuestro action, pero recuerda que sin pasar el theme, ni los otros parametros, solo el action!
Nuestros valores lo pasamos en la variable $strRequest, y lo hacemos como string, poniendo el nombre de nuestro campo = $nuestrovalor y los unimos con “&”.

Con este codigo y hasta ahora podemos insertar datos en nuestra planilla de Docs, pero nos falta la integración con nuestro Cforms, para eso utilizaremos el archivo my-functions.php e iremos a la linea 154, la cual es:

function my_cforms_action($cformsdata) {

Notemos que todo el archivo esta comentado, lo que haremos sera descomentar esta funcion para poder utilizarla.

Lo siguiente que haremos sera obtener el valor ingresado en nuestro formulario de Cforms, lo hacemos de la siguiente manera:

$micampo = $form['El nombre de mi campo'];

En donde dice ‘El nombre de mi campo’ es el nombre del campo que le dimos en nuestro panel de Administración de WordPress en nuestro Cforms. y asi podemos obtener el valor de todos los campos, por lo que nos quedaria algo asi:

$Nombre = $form['Nombre'];
$Email = $form['Email'];
$Consulta = $form['Consulta'];

Claro que esto lo hacemos luego de que carga el $form, en la linea 160:
$form   = $cformsdata['data'];

Ahora pondremos estos valores en nuestro string Request, por lo que sera algo asi:

$strRequest = “entry.0.single=”.$Nombre.”&entry.1.single=”.$Email.”&entry.2.single=”.$Consulta;

Juntando todo nuestro codigo tendremos algo asi:

function my_cforms_action($cformsdata) {

### Extract Data
### Note: $formID = ” (empty) for the first form!

$formID = $cformsdata['id'];
$form   = $cformsdata['data'];

### triggers on your third form
if ( $formID == ’3′ ) {

### Do something with the data or not, up to you
$form['Your Name'] = ‘Mr./Mrs. ‘.$form['Your Name'];

}

$Nombre = $form['Nombre'];
$Email = $form['Email'];
$Telefono = $form['Telefono'];
$Pais = $form['Pais'];
$Consulta = $form['Consulta'];
$sitio = get_bloginfo(‘url’);

$Url = ‘https://docs.google.com/spreadsheet/formResponse?formkey=dHg5em5zLWQyRFdGekdSN1RadjdZR0E6MQ’;
//$strRequest = “entry.0.single=”.$Nombre.”&entry.1.single=”.$Email.”&entry.2.single=”.$Telefono.”&entry.3.single=”.$Pais.”&entry.4.single=”.$Consulta.”&entry.5.single=”.$sitio;
$strRequest = “entry.0.single=”.$Nombre.”&entry.1.single=”.$Email.”&entry.2.single=”.$Telefono;
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $Url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1) ;
curl_setopt($ch, CURLOPT_POSTFIELDS, $strRequest);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$result = curl_exec($ch);
curl_close($ch);

}

De esta manera, las consultas que nos llegan al mail tambien quedaran en una hoja de Google Docs, sumamente util en caso de recibir varias consultas que pueden atender varias personas, permite una importante organización.

Algo bueno de esto tambien es que Google automaticamente nos agrega una columna Timestamp, de cuando se insertaron los datos, sabiendo asi el momento exacto de la consulta.

Una captura de como se ve esto en el Docs:

 


Como insertar marcas de agua en WordPress

Posted: mayo 26th, 2011 | Author: | Filed under: Recursos Web, Wordpress | Tags: | 1 Comment »

Una forma simple de agregar marcas de agua a las imagenes de nuestro sitio en wordpress no consiste en usar plugins, podemos hacerlo con un archivo .htaccess, un archivo php y la imagen a incrustar.

Lo que tenemos que hacer es crear el archivo watermark.php en la raiz del ftp (junto al archivo wp-config.php), con el siguiente contenido:

<?php
$src = $_GET['src'];

header(‘Content-type: image/jpeg’);

//this will prevent the watermark from showing up in the thumbnail images
if (eregi(“150×150″, $src)) {
$watermark = imagecreatefrompng(‘empty.png’);
} else {
$watermark = imagecreatefrompng(‘watermark.png’);
}

$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$image = imagecreatetruecolor($watermark_width, $watermark_height);
if(eregi(‘.gif’,$src)) {
$image = imagecreatefromgif($src);
}
elseif(eregi(‘.jpeg’,$src)||eregi(‘.jpg’,$src)) {
$image = imagecreatefromjpeg($src);
}
elseif(eregi(‘.png’,$src)) {
$image = imagecreatefrompng($src);
}
else {
exit(“Your image is not a gif, jpeg or png image. Sorry.”);
}

$size = getimagesize($src);
$dest_x = $size[0] – $watermark_width – 0;
$dest_y = $size[1] – $watermark_height – 0;
imagecolortransparent($watermark,imagecolorat($watermark,0,0));
imagecopyresampled($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $watermark_width, $watermark_height);

imagejpeg($image, “”, 95);
imagedestroy($image);
imagedestroy($watermark);
?>

Luego agregamos un archivo watermark.jpg en la raiz, junto al archivo php.

Por ultimo modificamos el arcvhio .htaccess con la siguiente línea, de forma que cada pedido de una imagen en tamaño completo tenga la marca de agua incrustada.

RewriteRule ^(.*)wp-content/uploads/(.*) $1watermark.php?src=wp-content/uploads/$2


Proteger admin de wordpress con .htaccess

Posted: marzo 9th, 2011 | Author: | Filed under: Internet, Recursos Web | Tags: , | 1 Comment »

En el artículo anterior Como proteger un directorio en un sitio web con contraseña vimos como agregar un password a un directorio. Una aplicación útil de esto es proteger el directorio admin de nuestro wordpress con usuario y contraseña para agregar un nivel extra de seguridad.

Los pasos a seguir son los mismos que en el caso anterior, creamos el archivo .htpasswd, lo colocamos en un directorio no accesible desde la web y luego el archivo .htaccess en el directorio wp-admin de forma que el sitio público no quede bloqueado pero si el admin.

El problema que puede surgir en muchos casos con esta solución es que no podemos acceder al archivo admin-ajax.php, que es utilizado por ejemplo por algunos plugins para cargar contenidos.

Una solución es agregar en nuestro archivo .htaccess una directiva para que este archivo sea accesible para todo el público sin pedido de contraseña, esto lo logramos con un archivo como el que sigue:

AuthName “Restricted Area”
AuthType Basic
AuthUserFile /var/www/misitioweb.com/.htpasswd
AuthGroupFile /dev/null
require valid-user

<Files “admin-ajax.php”>
Allow from all
Satisfy Any
</Files>

La primera parte es la de pedido de contraseña, luego colocamos el acceso público para el archivo admin-ajax.php.

De esta forma nuestros plugins deberían funcionar sin problemas aunque coloquemos la protección de contraseña en el directorio wp-admin.


Traducción en tiempo real mediante Google Translate con PHP

Posted: febrero 19th, 2011 | Author: | Filed under: PHP, Recursos Web | Tags: , | No Comments »

La traducción de textos en tiempo real es posible utilizando PHP y la API de Google Translate. En forma rápida y sencilla podemos realizar traducciones en los idiomas soportados por el servicio de Google.

En dos líneas podemos realizar el pedido de traducción y procesar la información de respuesta que llega en JSON:

$trans = @file_get_contents( “http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=Texto&langpair=es|en” );
$json = json_decode( $trans, true );

Los parámetros a utilizar son tres. El primero indica la versión de API que estamos utilizando, en la actualidad la 2.0 está en desarrollo por lo que haremos uso de la 1.0.

El parámetro q indica el texto a traducir. Luego indicamos los idiomas de origen y destino. En este caso es que indica español y en que indica english. Debemos hacer uso de las siglas utilizadas por Google Translate para indicar los idiomas.

Al procesar el JSON con json_decode obtenemos un array con un campo “responseStatus” que indica si la traducción se realizó con éxito. En dicho caso devuelve el valor “200″.

El texto está contenido en ["responseData"]["translatedText"], por lo cual podemos responder en un AJAX para realizar traducciones instantáneas y en forma sencilla.

echo $json['responseData']['translatedText'];