Posted: febrero 19th, 2011 | Author:admin | Filed under:PHP, Recursos Web | Tags:Google Translate, PHP | Comentarios desactivados en Traducción en tiempo real mediante Google Translate con PHP
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:
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.
La versión estandar de Google Apps no cuenta con los servicios de migración de correos, por lo que si tenemos un servidor viejo con correos tipo Squirrelmail no podemos hacer una migración automática.
De todas formas tenemos la posibilidad de hacerlo a mano.
Primero que nada creamos las casillas de correo en Google Apps. Creamos la cuenta para el dominio, verificamos que somos los dueños con un archivo HTML y por el momento dejamos los DNS del dominio sin cambiar. Esto es importante ya que necesitamos activar el servicio de Apps para el dominio, para eso el archivo HTML de verifiación, pero no damos de baja el servicio de correo y registros MX en el dominio viejo.
Con el servicio activado y las cuentas creadas, accedemos a una de la siguiente forma: https://mail.google.com/a/dominio.com
Puede ser una buena idea usar otro navegador para no tener que salir de la cuenta de administracion.
Una vez que accedimos a la nueva casilla en Google Apps, lo que hacemos es configurar para recibir correos desde otra casilla. El problema es que no nos dejará configurar el correo con el mismo nombre. Por ejemplo si el correo a migrar es info@dominio.com, y ya creamos en Google Apps el nuevo correo info@dominio.com, al agregar una cuenta para importar debemos «mentir» y usar un nombre diferente. Por ejemplo importar desde info@dominio.net.
De esa forma Apps cree que es una cuenta distinta. En el siguiente paso configuramos el acceso POP o IMAP al servidor viejo segun tengamos acceso, y comenzamos la importación…
Si tenemos que migrar múltiples cuentas puede ser un trabajo largo pero a medida que vamos dando de alta la importación podemos salir y acceder a la siguiente siguiendo los mismos pasos. Apps realizará el trabajo de migración por su cuenta mientras nosotros seguimos dando de alta las importaciones en las otras.
Permite montar un directorio en forma remota, requiere SSHFS: http://fuse.sourceforge.net/sshfs.html
6) Conexión SSH con un host intermedio:
ssh -t reachable_host ssh unreachable_host
Podemos acceder a un equipo inaccesible desde nuestra red, pero que es accesible desde une red remota. Hacemos una conexión con un intermediario que nos permite acceder.
7) Copiar de host1 a host2 mediante el equipo local:
ssh root@host1 “cd /somedir/tocopy/ && tar -cf – .” | ssh root@host2 “cd /samedir/tocopyto/ && tar -xf -”
Útil cuando dos equipos no pueden conectarse en forma directa, utilizamos nuestro equipo como intermediario.
8) Ejecutar programas de entorno gráfico en forma remota:
ssh -fX <user>@<host> <program>
El servidor SSH requiere de la siguiente configuración:
Nos permite acceder a un equipo remoto sin necesidad de la contraseña.
17) Test de velocidad SSH
yes | pv | ssh $host “cat > /dev/null”
Nos muestra en vivo la transferencia, envia la salida a /dev/null
Es necesario contar con pv instalado:
Debian: ‘apt-get install pv’
Fedora: ‘yum install pv’ (‘extras’ repository)
18) Establecer una ventana GNU a la cual es posible reconectarse:
Posted: noviembre 13th, 2010 | Author:admin | Filed under:Internet, Recursos Web | Comentarios desactivados en Como proteger un directorio en un sitio web con contraseña
Al momento de desarrollar un nuevo sitio web suele suceder que debemos publicar el sitio para que el clienta pueda verlo, pero no queremos que el resto del mundo acceda hasta el momento en que este listo. Tampoco queremos que los buscadores lo indexen, ya que daran de alta el contenido que puede ser de prueba o bien podemos tener el sitio en una url temporal, como un subdominio o un dominio de desarrollo. Para evitar dolores de cabeza más tarde viendo como el contenido es indexado mezclando los sitios podemos colocar una contraseña y evitar el indexado erróneo.
Una solución simple en Apache es utilizar un archivo .htaccess y .htpasswd para crear una simple autenticación de usuario. El procedimiento que debemos seguir es simple. Primero definimos un nombre de usuario y contraseña, por ejemplo:
Usuario: usuario
Contraseña: 123456
El siguiente paso es comprender como funciona el sistema de autenticación de Apache. Debemos crear un archivo .htpasswd que contendrá el usuario y contraseña. Creamos un archivo .htpasswd con el siguiente contenido (si lo hacemos en windows con notepad debemos tener cuidado al guardar de seleccionar todas las extensiones de archivo, ya que por defecto esta marcada la opción Archivos de Texto que nos agrega .txt al final):
usuario:gtXa5NHfNQI9U
El archivo .htpasswd contiene simplemente eso. Como pueden ver la contraseña se encuentra encodeada en base 64, por lo cual si trabajos en un servidor compartido no debemos confiar a este sistema una seguridad de relevancia. Es una simple barrera, no un sistema infalible…
Para encodear la contraseña a base 64 podemos buscar en Google alguna de las webs que hacen esto online, por ejemplo: http://www.motobit.com/util/base64-decoder-encoder.asp
Colocamos el nombre de usuario, dos puntos y la contraseña encodeada.
Hecho esto colocamos este archivo en un directorio que no sea visible desde el servidor web. Es decir que si tipeamos una URL no podamos acceder al mismo. Si estamos trabajando en un servidor Apache en Linux, podríamos tener nuestro sitio web en una ruta como la siguiente:
/var/www/vhosts/sitioweb.com/
Por lo general tendremos un directorio httpdocs que es donde colocamos los archivos web, pero tendremos cuidado de NO colocar el .htpasswd ahí para que no sea visible desde Internet. Colocamos el archivo en la siguiente ubicación:
/var/www/vhosts/sitioweb.com/.htpasswd
Hecho esto pasamos a proteger el directorio, por ejemplo podría ser el siguiente:
Listo, con estos dos archivos en su lugar y con las rutas correctas, veremos el mensaje que pide usuario y contraseña al acceder al sitio web.
Al momento de desarrollar un nuevo sitio web suele suceder que debemos publicar el sitio para que el clienta pueda verlo, pero no queremos que el resto del mundo acceda hasta el momento en que este listo. Tampoco queremos que los buscadores lo indexen, ya que daran de alta el contenido que puede ser de prueba o bien podemos tener el sitio en una url temporal, como un subdominio o un dominio de desarrollo. Para evitar dolores de cabeza más tarde viendo como el contenido es indexado mezclando los sitios podemos colocar una contraseña y evitar el indexado erróneo.
PHP sigue muchas de la reglas de C, por lo que no podía faltar la referencia. Veamos un ejemplo ilustrativo, tenemos un array de elementos y queremos recorrerlo realizando modificaciones a medida que lo hacemos. La función preferida para esto es foreach, pero al hacerlo trabajamos sobre una copia de la variable, por lo que al salir del bucle nuestros cambios desaparecen.
Un primer intento podria ser este:
if (!empty($data[‘noticias’])) { foreach ($data[‘noticias’] as $each) {
$each[‘fechaactual’] = date(«Y-m-d h:i:s»);
} }
Para solucionar esto usamos una referencia:
if (!empty($data[‘noticias’])) { foreach ($data[‘noticias’] as $k=>$v) {
/* Creamos la referencia en la posición actual */
$pointer =& $data[‘noticias’][$k];
/* Hacemos cambios en el arreglo original */
$pointer[‘fechaactual’] = date(«Y-m-d h:i:s»);
Muchas veces en nuestro sitio queremos poder agregar campos personalizados para los usuarios. Ya sea un número de facturación, direcciones, tipo de cliente o una cuenta de twitter.
A pesar de que WordPress no trae aún en forma nativa la gestión de campos personalizados para usuarios (en la versión actual, 2.9.2), podemos hacer una pequeña modificación en nuestro archivo functions.php del theme.
Abrimos el archivo mencionado y simplemente agregamos el siguiente código:
<?php
/* Con este bloque mostramos en el admin el campo adicional en el admin */
Posted: abril 27th, 2010 | Author:admin | Filed under:Internet, Recursos Web | Comentarios desactivados en Micropagos en Juegos y Juegos en todo
Dando un vistazo a las tendencias de juegos, servicios de celulares y demás aplicaciones de ocio como pueden ser trivias, sorteos, etc. se puede ver una tendencia clara hacia la interacción constante con el usuario. Cada vez se requiere una respuesta más elaborada a estas aplicaciones, lo cual nos lleva a invertir más tiempo y a darle una importancia relativa mayor en nuestra vida. El resultado, una vez que estamos participando no podemos dejar de hacerlo.
Los juegos online como Mafia, Farmville y otros están marcando el camino para las nuevas generaciones de entretenimiento. Juegos donde participas con tus amigos, donde tu grupo social está incluído y compartes pero sobre todo compites con tus conocidos. Una vez que tenemos nuestra granja y vemos la de nuestros amigos, queremos una mejor, invertimos más tiempo y esto alimenta el círculo para que sigamos en él.
Claro que en caso de que no tengamos el tiempo suficiente para construir paso a paso nuestra granja podemos gastar unos pocos dólares y nos ahorramos el tiempo… O si estamos en el Mafia podemos comprar lo que otros tienen y se han ganado con tiempo. ¿Qué padre le negaría unos dólares a su hijo que ha estado tan tranquilo con ese juego las últimas semanas?
Esto nos lleva a los micropagos. Los micropagos son pagos de un dólar por ejemplo, que se puedan hacer al instante y con un servicio de celular o a través de Paypal, con comisiones mínimas que permiten que el pago sea rentable. Este eslabón posibilita la creación de aplicaciones que requieran de pagos mínimos para obtener resultados rápidos, creando un abanico hasta ahora inexplorado para compras en Internet, el público en general que no cuenta con tarjetas de crédito.
Es de suponer que los micropagos sean el próximo paso a dar por parte de Facebook, en su intento de crear una red cerrada o Internet propia, donde otras grandes companías como Google no puedan participar ni interferir, y donde los usuarios no tengan la necesidad de salir de esta red.
Sumando micropagos, celulares, juegos en celulares y el día de mañana juegos en la TV, en la calle, en discotecas y pubs podemos imaginar un futuro donde participar en juegos, compartiendo y compitiendo con nuestros amigos y contactos de redes sociales sea la norma. Y a falta de tiempo podamos gastar unos pocos dólares para estar en el msmo nivel sin tener que invertir tiempo.
Posted: enero 7th, 2010 | Author:admin | Filed under:Empresas/Startups, Internet | Comentarios desactivados en Herramientas esenciales para trabajadores freelance e independientes, administración de tiempo, finanzas y tareas.
Cuando trabajamos como freelance o bien en un grupo independiente nos enfrentamos a muchas tareas administrativas y de monitoreo que pueden ser tediosas. Es importante llevar una agenda de clientes, seguimiento de proyectos, colaboración con otras personas, finanzas, entre otros. Muchas veces perdemos de vista estas tareas por algunos dias o semanas y luego tenemos un problema ya que no sabemos con exactitud que cliente nos tiene que pagar, que fechas manejamos para los proyectos, etc.
Por suerte existen muchas herramientas online para hacernos la vida más fácil:
Administración de proyectos
http://www.writeboard.com – Una simple pizarra en blanco para dejar comentarios.
http://www.tadalist.com – Lista de tareas para realizar.
http://basecamphq.com – Un poderoso gestor de proyector, recomendado si debemos trabajar en equipo.
Administración de clientes
http://www.highrisehq.com – Complejo administrador de clientes con todo detalle.
http://www.google.com/a/smallbiz – Herramienta de Google para compartir documentos y contactos en línea.
http://www.feelbreeze.com – Envío masivo de correos.
Finanzas
http://www.freshbooks.com – Administrador con versión gratuita.
http://invoice.zoho.com – Potente administrador, genera balances, reportes, etc.
http://www.lessaccounting.com – Gestor recomendado de finanzas.
Recursos: desarrolladores
http://www.my-debugbar.com/wiki/IETester/HomePage – Prueba tu sitio en todas las versiones de Internet Explorer.
https://addons.mozilla.org/en-US/firefox/addon/60 – Herramienta para diseñadores web, plugin de Firefox.
https://addons.mozilla.org/en-US/firefox/addon/1843 – Potente depurador para desarrolladores, plugin de Firefox.
Recursos: tipografías
http://www.dafont.com – Uno de los mejores sitios de fuentes.
http://www.smashingmagazine.com/2007/08/08/80-beautiful-fonts-typefaces-for-professional-design – Tipografías de alta calidad.
Crear una empresa propia es algo simple y complicado a la vez. Depende en gran parte de nuestra capacidad de elegir bien algunos elementos al comenzar la misma y durante el proceso no equivocarnos demasiado. Fallar en el intento es la norma y nunca es el momento ideal para lanzarse al agua. Es una cuestión de determinación frente a una situación que presente ventajas.
Por lo general no se necesita una idea revolucionaria para tener éxito, únicamente necesitamos una idea clara de lo que buscamos y la determinación para llevarlo adelante. Esta determinación no se debe confundir con rigidez.
Debemos estar preparados cada día para cambiar el rumbo y ajustarnos a las necesidades y oportunidades de nuestros clientes y mercado. Reinventar la empresa sin miedos, como norma base.
Puede sonar contradictorio, pero uno de los factores clave de las startups es la capacidad de maniobra frente a situaciones complejas, a diferencia de empresas grandes donde las decisiones deben enfrentar la inercia propia de sus directores y empleados.
El tema de directorios nos lleva al siguiente punto, la elección de los socios al momento de crear la empresa.
Es fundamental contar con socios al momento de iniciar el proyecto, para intercambiar ideas, ampliar la red de contactos de la empresa y lograr una motivación extra.
Un fundador solitario se enfrenta a retos enormes, como la visión de una única perspectiva de los problemas, asi como la limitación en las tareas que puede realizar en paralelo. Si se trata de una empresa de tecnología es probable que uno de los fundadores cuente con la capacidad técnica, mientras otro se pueda especializar en las ventas.
El financiamiento de la startup suele ser más sencillo si se cuenta con varios socios, pudiendo repartir la carga entre varios para no comprometer la situación económica que obligue a cancelar el proyecto. Este financiamiento por lo general surge de ahorros generados en un trabajo previo. Contar con una reserva inicial para un plazo de 6 meses a 1 año es imprescindible en una empresa nueva.
Por lo general los primeros meses de estado embrionario de la empresa se recorren en paralelo a un trabajo tradicional, tanteando el terreno, desarrollado las herramientas necesarias y conociéndose con los potenciales socios. El problema llega, o mejor dicho, no llega, hasta que se toma la decisión de cortar el cordón umbilical y lanzarse adelante.
El momento de lanzarse al agua nunca es ideal, siempre se pueden intentar mejores condiciones, lo cual aún antes de comenzar define el grado de temeridad y ejecutividad del directorio.
Una vez en el agua con nuestros socios, el grado de compromiso no puede fallar. La decisión de dedicarse fulltime a la empresa es crítica, así como la capacidad de enfocarse en las ventas y en nuestro producto. En la actualidad contando con un sitio web, número de teléfono y una presencia corporativa profesional (logo, tarjetas, etc) no necesitaremos mas que una simple oficina que genere gastos mínimos. El personal de la empresa puede consistir de un núcleo duro de socios fulltime y una red de personas de confianza para trabajos específicos, sin necesidad de tomar gastos grandes que nos comprometan.
La oficina debe contar con instalaciones básicas pero enfocadas en maximizar la productividad, ya sea en equipos actuales, escritorios y sillas adecuadas, buena iluminación y un ambiente agradable. Existe la tendencia en la actualidad y gracias a la tecnología a dar flexibilidad en horarios y forma de trabajo. Esto se puede lograr mediante acceso remoto a la red, laptops y sitios web para administración de proyectos. De acuerdo a las características del personal esto tendrá un grado mayor o menor de éxito. Algunas personas logran el balance por si mismos, mientras que otros necesitan al menos una estructura básica de horarios para mantener el ritmo.
Crear una cultura de ahorro y eficiencia desde el primer día es importante, si la empresa logra crecer y obtener un financiamiento externo puede caer en el derroche. Es fácil sentir que el dinero sobra al lograr una inversión o grandes ventas. La reinversión productiva debe estar anteo todo, cada dólar gastado debe provocar más ventas o mejoras de producto.
Durante la etapa de pequeña empresa puede regir un sistema simple de reparto por rendimiento, de forma de motivar al desempeño excepcional y lograr la sana competencia entre los miembros. La etapa de dedicación extrema y uso de reservas no dura para siempre, ya sea por falta de fondos como por agotamiento de las personas.
Lograr ventas es un proceso que puede tomar meses, construir redes de clientes paso a paso de forma que los clientes mismos hagan el trabajo por nosotros en el futuro mediante recomendaciones. Este flujo de clientes es necesario para la supervivencia de la empresa, contando con personal especializado en las ventas y clientes, preferentemente con alguno de los socios como vendedor ya que el compromiso va más allá del sueldo que reciba.
Vender la piel del oso antes de tenerla, puede ser la diferencia entre la mera supervivencia de la empresa y el éxito.
Conociendo nuestro producto y nuestras limitaciones, podemos complementarnos con el trabajo o servicio de otras empresas, que nos den lo que por tiempo o dinero aún no somos capaces de generar nosotros mismos. De esta forma podemos construir un producto mucho más complejo y útil de lo que lograríamos con algo completamente «artesanal». Como parte de la preparación de la empresa debemos conocer las empresas que pueden aportarnos estos complementos.
La venta del producto estrella puede ser un fracaso rotundo, para lo cual debemos estar preparados a reinventarnos. Si vendemos equipamiento necesitaremos contar con stock, personal calificado en el manejo del mismo y una cadena logística. Algunos pasos se pueden complementar con otras empresas, aunque recurrirán en costos mayores, por lo que el volumen suele ser crítico en este tipo de empresa. Por su parte vender conocimientos o servicios requiere de la capacidad técnica, personal calificado y acumulación de experiencia en el área.
Por regla general nuestros productos se deben basar en nuestras áreas de conocimiento experto, lo cual nos lleva a la necesidad de investigar e innovar constantemente para poder adaptarnos.
A medida que se desarrolla el proceso de crecimiento se pueden plantear momentos de extrema tensión entre los socios. Contar con los ambientes adecuados para evitar la acumulación de tensiones es importante. Reuniones semanales donde realizar balances e intercambiar ideas pueden evitar un desastre a largo plazo.
Aún así los socios no están casados de por vida, con el tiempo se puede perder el interés y se deben seguir caminos separados.
Probablemente lo más difícil es decidir cómo hacerlo sin dañar la empresa. Por esta razón es que se debe buscar siempre una separación en buenos términos, manteniendo el equipo de trabajo unido.
En el ideal los socios deberían mantener un contacto estrecho, ya que es probable que en un futuro tengan servicios o compañías complementarias para trabajar.
Veamos un ejemplo típico de algoritmo de Backtracking. Tenemos una serie de elementos únicos, cada uno con un peso o volumen ocupado, y cada elemento a su vez nos da cierta ganancia. Disponemos de una capacidad limitada por lo que debemos seleccionar de los elementos disponibles aquellos que nos den la mayor ganancia posible.
Supongamos que tenemos n elementos disponibles, numerados de 0 a n-1 y dos arreglos, uno p[n] que indica el peso de cada elemento y g[n] que indica la ganancia que nos da el elemento. M indica la carga máxima que podemos llevar. Debemos buscar elegir los elementos que nos den la mejor ganancia dado el espacio que ocupan.
Con estos datos pasemos a formalizar el problema.
Forma de la solución: Utilizaremos una tupla de largo n <x0,x1,…,xn-1>, donde cada elemento xi indica con 1 si llevamos el elemento i, o con 0 si no lo llevamos.
Reestricciones Explícitas: Cada elemento xi de la tupla se corresponde con un elemento i disponible.
Reestricciones Implícitas: La sumatoria de los pesos de los elementos seleccionados no superan la capacidad disponible M.
Función Objetivo: Maximizar la ganancia.
Predicados de Poda: Supongamos que en un momento dado encontramos una solución M_sol que es la mejor encontrada hasta el momento. Y supongamos que estamos construyendo una nueva solución parcial llamada sol. Dada esta solución parcial tendremos una poda si la suma de la ganancia que llevamos en la parcial, más las restantes que aún no hemos evaluado no llega a superar la ganacia de M_sol. Esto quiere decir que si la parcial tiene desde 0…k elementos, y nos quedan por analizar k…n-1, pero aunque eligieramos todos no llegamos a superar la ganancia de M_sol, no tiene sentido seguir con esta recorrida.
Terminada la conceptualización del problema, podemos pasar a construir la función que llamará al Backtracking:
int carga ( int* g, int* p, int* sol, int M) {
int pos = 0; // Posicion actual en la recorrida de elementos.
int ganancia = 0; // Ganancia parcial acumulada.
int m_ganancia = 0; // Mejor ganancia encontrada
int disponible = M; // Espacio disponible restante.
int restante = 0; // Ganancia restante disponible
int * parcial = new int[n]; // Marcaremos con 1 si llevamos al i, o con 0 en caso contrario
for (int i=0; i<n; i++) {
parcial[i] = 0; // Inicializamos en cero los eltos elegido.
restante += g[i]; // Ganancia de los elementos restantes, para la poda.
}
/* Llamamos a la función recursiva */
Back(g, p, parcial, ganancia, m_ganancia, disponible, restante, pos, sol);
delete[] parcial;
return m_ganancia;
}
Y veamos el código de la función recursiva:
void Back(int* g, int* p, int* parcial, int ganancia, int &m_ganancia, int disponible, int restante, int pos, int* sol) {
/* El primer paso es verificar que queda espacio disponible.
Ademas verificamos que podamos llegar a encontrar una mejor solución,
en caso contrario podamos. */
if ( (disponible > 0) && (ganancia + restante > m_ganancia)) {
/* Si ya pasamos por todos los elementos, terminamos */
if (pos == n) {
/* Ya sabemos que encontramos una mejor solucion que m_ganancia */
m_ganancia = ganancia;
for (int i=0; i<n; i++)
sol[i] = parcial[i];
/* Si no llegamos al final, probamos el elemento actual */
} else {
parcial[pos] = 1;
/* Probamos elegir el elemento y actualizamos los valores de ganancia y peso */
Back(g, p, parcial, ganancia, ganancia+g[pos], m_ganancia, disponible-p[pos], restante-g[pos], pos+1, sol);
parcial[pos] = 0;
/* O bien no lo llevamos y probamos seguir sin este elemento */
Back(g, p, parcial, ganancia, ganancia, m_ganancia, disponible, restante-g[pos], pos+1, sol);
}
}
}
De esta forma la función recursiva hace todas las combinaciones posibles de llevar ciertos elementos guardando el mejor resultados posible. Cada vez que se llega a pos == n es que recorrimos toda la secuencia, por lo que llegamos al final de la rama de decisiones del algoritmo. En ese momento y como el if que verifica que el espacio disponible sea sufuciente y que obtuvimos una mejor solución a la previa encontrada, podemos copiar el resultado obtenido.