20.4 C
Caracas
jueves, agosto 19, 2021
Inicio Blog Página 4

Que necesitas para aprender a tatuar?

0

El tatuaje es el arte de grabar un dibujo o escritura en la piel de forma permanente. Anteriormente estaba mal visto este arte y a quienes portaban tatuajes se les calificaba como rebeldes o personas de la baja sociedad. En la actualidad ya se ha vuelto algo común incluso entre las celebridades, pero aun es mal visto en algunos aspectos para el habito laboral.

En este post les vamos a indicar que necesitas para aprender a tatuar. Lo primero que necesita una persona para empezar a tatuar es que le guste el arte, que se haya familiarizado con practica en dibujo y en pintura, ya que esto facilitara la destreza y desempeño en la piel. Esto es importante, dado que cuando más naturalizado este la persona con el arte mayor será la calidad y recomendación del mismo.

Para comenzar vamos a necesitar por lo menos 2 máquinas, una para delinear y la otra para pintar. A medida que te vas naturalizando puedes incluir una tercera para aplicar luces, colores y mejorar la calidad. Primero hay que aprender a delinear y pintar en negro, luego aprender a sombrear y por ultimo aprender a pintar con colores ya que la persona que no saben sombrear no va a aprender a pintar correctamente porque no sabe hacer degradé y luces. Cuando una persona delinea y pinta bien, puede comenzar la practica con las sombras, luces, claros y oscuros. Cuando empiezas, la calidad de la maquina es relativa, si puedes comprar una profesional mejor pero no es recomendable ya que son más complejas a la hora de manejarlas y además es mayor gasto para algo que no sabes si seguirás realizando.

Es importante una buena fuente de alimentación de dos amperes reales en adelante para que pueda funcionar con cualquier máquina del mercado y como siempre es fundamental tener un buen sistema de higiene y bioseguridad.

Materiales Requeridos.

Que necesitas para aprender a tatuar

MAQUINAS PARA TATUAR: 

Se necesitan como mínimo dos o tres máquinas para empezar a tatuar: una de línea, otra de sombra y una para pintar.

Las diferencias entre una maquina de tatuaje de delineado y trabajo en negro y una de sombreado, para sombrear y colorear. Existen bastantes diferencias entre las dos así que la mayoría de los artistas del tatuaje tienen varias máquinas a mano configuradas para cada aplicación.

FUENTE DE ALIMENTACIÓN: 

Vamos a necesitar una fuente de alimentación que no es lo mismo que un transformador (muchas personas que confunden un transformador o compran estos en vez de una fuente de alimentación), la diferencia es que la fuente almacena los 220° y los transforma en 12 volteos. En cambio el transformador lo único que hace es transferir la corriente de la línea variándola a 12 volteos (o sea si la corriente tiene alta o baja ya no será 12 voltios reales). Para distinguir una fuente lo mínimo que tenemos que observar que tenga un difusor de color. Para lograr una buena utilidad, hay maquinas que trabajan con más voltajes y manos amperaje y viceversa.

PEDALES:

Tenemos los pedales con switch que pegan más rápidos lo toques por acero, esta diferencia quizás no muy notoria para una persona que recién comienza a tatuar, pero existe.

PUNTERAS:

Se colocan en la máquina, el del pico se adapta a los distintos tipos de agujas. Los agarres de estas son aconsejables que sean de acero 316 L, que es un material quirúrgico.

AGUJAS:

Se dividen en redondas y planas. Las redondas cerradas se utilizan para delinear o trazos y las redondas abiertas pintar o modular. Las medidas comerciales son las siguientes: 3, 5, 7, 9, 11, 13, 15. Las agujas planas o mágnum se usan para pintar y sombreados, sus medidas son 5, 7, 9, 11, 13, 15, 23, 25, 29, 33, 35, 39, 45. Los grosores de las agujas vienen en la siguiente medidas 0.25, 0.30, 0.35, 0.54. Esas deben estar siempre en perfectas condiciones, rectas y puntiagudas. “Las agujas son siempre desechables” y es muy importantes tener un recipiente exclusivo para su descarte y destruirlas antes de desecharla. ya que es un residuo patológico, su manipulación se realiza con guantes desechables.

NIPLIESS (ligas): 

Se asientan sobre el perno del martillo para sostener la varilla y permitirle un movimiento sin juego a la hora de pinchar.

BANDAS ELÁSTICAS:

Evita que la varilla se valle hacia adelante. 

TETINES O CAPS:

Son pequeño recipientes desechable para depositar el pigmento o tintas.

PAPEL BARRILETE O DE SEDA:

Es para colocarlo sobre la piel. A diferencia del papel de calcar o fotocopies se adapta a la forma del cuerpo.

ESPADOL (cloroxilenol) LÍQUIDO:

inmunizador de HIV y hepatitis. Se usa para hacer transferencia del dibujo a la piel. También vamos a necesitar un lápiz para copiar papel hectógrafico o esténcil.

CLORHEXIDINA:

Inmunizador de HIV y hepatitis. Fundamental el uso de este químico para la limpieza y desinfección los materiales, entes de su necesaria esterilización.

Optimizar Sitios WordPress

0
Optimizar Sitios Wordpress

Hoy en día un atractivo aspecto de su sitio web o un contenido perfecto puede no ser suficiente para atraer a los usuarios potenciales. Si eres propietario de un sitio, necesitas saber que Google utiliza un algoritmo que hace de la velocidad de carga del sitio uno de los factores que influyen en la posición del mismo en los resultados de búsqueda. Por ello me dispose a escribir esta guía para Optimizar Sitios WordPress.
Las estadísticas dicen que casi la mitad de los usuarios de Internet esperan un sitio para cargar en dos segundos o menos.
Es importante cuidar de esto, sobre todo que los resultados se pueden mejorar sin mucho esfuerzo.
Hay muchas técnicas para mejorar el tiempo de carga de su sitio. Una de las soluciones es un archivo .htaccess, lo que permite introducir la optimización del sitio básico en cuestión de minutos.

¿Qué es un archivo .htaccess?

.htaccess Es un archivo de configuración para su uso en servidores web Apache ubicados en el directorio raíz. Se da la capacidad de controlar una carpeta específica o la pieza de servidor. En el archivo .htaccess podemos modificar la configuración del software de servidor para detener o comenzar a correr algunas funciones y características del mismo, por ejemplo (teniendo en cuenta la finalidad de esta guía), podemos:

  • optimizar su sitio
  • mejorar la velocidad de carga de la página
  • crear una distracción (interna y externa)
  • crear directorios protegidos con contraseña
  • bloqueo específico de IP´s
  • y muchos más

Dónde encontrar el archivo .htaccess en WordPress?

El archivo debe encontrarse en la carpeta raíz de la instalación de WordPress.
Nombre del archivo .htaccess comienza con un punto (.) al principio, que especifica que se trata de un archivo oculto. Recuerde que encender “mostrar archivos ocultos o dotfiles” cuando se está intentando tener acceso a su archivo .htaccess utilizando el cliente FTP o CPanel de su alojamiento.

htaccess

¿Por qué no se puede encontrar el archivo .htaccess?

Puede que su sitio de WordPress no ha generado un archivo .htaccess todavía, este se genera cuando se actualiza la estructura de los enlaces permanentes en  Ajustes >> Enlaces Permanentes. Simplemente haga clic en el botón “Guardar cambios” para forzar a WordPress a generar un archivo .htaccess en el directorio raíz de su sitio. Si en este paso no logras crear el archivo debes comprobar los permisos de escritura en el directorio. Opcionalmente si no existe el archivo .htaccess, se puede crear desde el CPanel o subir por FTP. Vale la pena mencionar que no todos los servidores soportan el uso del archivo .htaccess (por ejemplo, servidores gratuitos) y el servicio puede ser bloqueado – tengamos esto en cuenta por si algo va mal durante la creación de la archivo.

código de Optimización para el archivo

.htaccess  compresión

La compresión simplemente reduce el tamaño del documento. Es más eficaz para los archivos HTML, JavaScript, hojas de estilo CSS y archivos XML. Generalmente compresión reduce 60% a 80% tamaño de los datos. Esto reduce también el tiempo de respuesta del servidor y ancho de banda. La mejor manera de habilitar la compresión es utilizando mod_gzip o mod_deflate para el software Apache. Ambos módulos básicamente hacen lo mismo, comprimen los datos, mod_deflate puede tener una leve mayor porcenatje de compresión, por lo que es mejor opción, sin embargo si mod_deflate no funciona correctamente en su sitio web o servidor web, puede utilizar mod_gzip. Ambos métodos compresiones se pueden activar mediante la adición de un simple código en el archivo .htaccess, además puede tener activos los dos tipos de compresión de forma simultanea:

DEFLATE:
# BEGIN DEFLATE COMPRESSION
<ifModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/xhtml text/htm text/xml text/css text/plain
  AddOutputFilterByType DEFLATE image/svg+xml application/xhtml+xml application/xml
  AddOutputFilterByType DEFLATE application/rdf+xml application/rss+xml application/atom+xml
  AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript application/json
  AddOutputFilterByType DEFLATE application/x-font-ttf application/x-font-otf
  AddOutputFilterByType DEFLATE font/truetype font/opentype
</ifModule>
# END DEFLATE COMPRESSION
GZIP
# BEGIN GZIP COMPRESSION
<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html|xhtml|htm|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</IfModule>
# END GZIP COMPRESSION

El almacenamiento en caché del navegador

Al establecer el almacenamiento en caché del navegador, le estamos diciendo al navegador que mantenga algún tipo de archivo por un período de tiempo especificado en la memoria local (caché). Cuando se necesita el archivo en caché de nuevo, el navegador se carga desde el disco duro local en lugar de solicitar desde el servidor.
Para esto podemos utilizar los módulos mod_expires y mod_headers de Apache
Ambos métodos se pueden establecer al mismo tiempo en el archivo .htaccess:

Expira encabezados:
#BEGIN EXPIRES HEADERS
<ifModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 2 days"
  #images
  ExpiresByType image/x-icon "access plus 1 year"
  ExpiresByType image/ico "access plus 1 year"
  ExpiresByType image/icon "access plus 1 year"
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType image/gif "access plus 1 year"
  ExpiresByType image/bmp "access plus 1 year"
  ExpiresByType image/jpg "access plus 1 year"
  ExpiresByType image/jp2 "access plus 1 year"
  ExpiresByType image/pipeg "access plus 1 year"
  ExpiresByType image/svg+xml "access plus 1 year"
  ExpiresByType image/tiff "access plus 1 year"
  ExpiresByType image/vnd.microsoft.icon "access plus 1 year"
  ExpiresByType image/svg+xml "access plus 1 year"
  #text
  ExpiresByType text/css "access plus 1 month"
  ExpiresByType text/javascript "access plus 1 month"
  ExpiresByType text/html "access plus 1 month"
  ExpiresByType text/ico "access plus 1 year"
  #aplication
  ExpiresByType application/x-shockwave-flash "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"
  ExpiresByType application/x-javascript "access plus 1 month"
  ExpiresByType application/xhtml+xml "access plus 1 month"
  ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
  ExpiresByType application/ico "access plus 1 month"
  ExpiresByType application/x-font-woff "access plus 1 month"
  #video
  ExpiresByType video/mp4 "access plus 1 year"
  ExpiresByType video/ogg "access plus 1 year"
  ExpiresByType video/webm "access plus 1 year"
  #audio
  ExpiresByType audio/ogg "access plus 1 year"
  #fonts
  ExpiresByType font/truetype "access plus 1 year"
  ExpiresByType font/opentype "access plus 1 year"  
</ifModule>
#END EXPIRES HEADERS
Cache-Control
# BEGIN Cache-Control Headers
<ifModule mod_headers.c>
  <filesMatch "\.(ico|jpe?g|png|gif|swf)$">
    Header set Cache-Control "public"
  </filesMatch>
  <filesMatch "\.(css)$">
    Header set Cache-Control "public"
  </filesMatch>
  <filesMatch "\.(js)$">
    Header set Cache-Control "private"
  </filesMatch>
  <filesMatch "\.(x?html?|php)$">
    Header set Cache-Control "private, must-revalidate"
  </filesMatch>
</ifModule>
# END Cache-Control Headers

Nota: No hay necesidad de configurar la directiva máximo de edad con el encabezado Cache-Control, puesto que ya está establecido por el módulo mod_expires. En caso contrario debemos utilizar:

# BEGIN Cache-Control Headers
<ifModule mod_headers.c>
  <filesMatch "\.(ico|jpe?g|png|gif|swf)$">
    Header set Cache-Control "max-age=2592000, public"
  </filesMatch>
  <filesMatch "\.(css)$">
    Header set Cache-Control "max-age=604800, public"
  </filesMatch>
  <filesMatch "\.(js)$">
    Header set Cache-Control "max-age=216000, private"
  </filesMatch>
  <filesMatch "\.(x?html?|php)$">
    Header set Cache-Control "max-age=600, private, must-revalidate"
  </filesMatch>
</ifModule>
# END Cache-Control Headers

Optimizar Imágenes

Podemos optimizar las imágenes dentro del sitio wordpress,  debemos acceder por SSH al sitio, desplazarnos al directorio wp-content y ejecutar los siguientes comandos:

Para .jpeg o .jpg
find themes/ uploads/ -iname '*.jpeg' -o -iname '*.jpg' -exec jpegoptim -s -f --all-progressive -m80 {} \;
Para .png
find themes/ uploads/ -iname '*.png' -exec optipng -k -o5 {} \;

Consideremos que para poder usar estas herramientas el servidor debe tener instalado jpegoptimoptipng, de igual forma y como manera alternativa puedes instalar el plugin WP Smush.it para optimizar tus imágenes.

Al seguir esta pequeña guía podrás notar un aumento considerable en el rendimiento de tu sitio web

De igual forma dejo el archivo .htaccess completo, inclusive con las reglas mod_rewrite de wordpress (para los enlaces permanentes), listo para subir a tu servidor, haz clic en la siguiente imagen para descargar

descarga

 

Botones de compartir con iconos personalizados

0

En el mundillo de wordpress existen infinidad de plugins para compartir tus entradas en las distintas redes sociales, muchas muy buenas, que no se quedan solo en la funcionalidad de compartir, si no que, además añaden distintas herramientas como estadísticas, en está oportunidad te quiero mostrar un plugin de elaboración propia que se basa en botones de compartir con iconos personalizados, con este plugin no quise descubrir el agua tibia, me dispuse a escribirlo, porque, aunque bien mencione al principio de esta entrada existen muchos plugins, la verdad es que no conseguí alguno en el que pudiese añadir mis propios iconos.

Si lo que quieres es personalizar tu web y los iconos por defecto no se adaptan al diseño de tu sitio, o bien quieres experimentar con algún otro pack o con tu propio diseño este plugin es para ti.

Como funcionalidad adicional este plugin hace un conteo de las veces que tu entrada ha sido compartida, tan solo, que es un conteo global y no por cada red social.

El uso del plugin es bastante sencillo, y como muchos de los plugins wordpress funciona con shortcodes que debes incluir en el editor de wordpress o en los templates php

Las redes sociales y nombres para el shortcode disponibles son los siguientes:

  • Twitter => twitter
  • Pinterest => pinterest
  • Facebook => facebook
  • Google+ => googleplus
  • Reddit => reddit
  • Delicious => delicious
  • Digg => digg
  • Tapiture => tapiture
  • StumbleUpon => stumbleupon
  • Linkedin => linkedin
  • Slashdot => slashdot
  • Technorati => technorati
  • Posterous => posterous
  • Tumblr => tumblr
  • Google Bookmarks => googlebookmarks
  • Newsvine => newsvine
  • Ping.fm => pingfm
  • Evernote => evernote
  • Friendfeed => friendfeed
  • Mail => mail

Para cada red es un shortcode, con sus clases personalizadas o del tema que este usando, si por ejemplo quiere añadir compartir en facebook el shortcode sería así:

Backend WordPress:

[custom_share social="facebook" aclass="btn btn-default" iclass="fa fa-facebook"]

Plantilla PHP:

echo do_shortcode('[custom_share social="facebook" aclass="btn btn-default" iclass="fa fa-facebook"]');

En donde “social” es el nombre de la red donde desea compartir, “aclass” es su clase personalizada para el a href y por último “iclass” es su clase personalizada para el icono.

Si imprime :

[custom_share]

el plugin por defecto mostrara el botón de compartir en facebook, pero, para que funcione correctamente debe tener instalado en su tema las fuente de Font Awesome Icons que puede descargar de aquí http://fontawesome.io/

Para mostrar la cantidad de veces que una entrada o página ha sido compartida con el uso de este plugin basta con añadir el siguiente shortcode:

Backend WordPress:

[getPostShares]

Plantilla PHP:

echo do_shortcode('[getPostShares]');

Haz clic en la imagen para descargar

BOTONES DE COMPARTIR CON ICONOS PERSONALIZADOS

Filtrar haciendo uso de Essential Grid

0

Guía para Filtrar haciendo uso de Essential Grid (etiquetas, categorías, etc), evitando hacer uso de los archives de wordpress, mejorando la navegabilidad y visualización de la página.

 

Una vez creado el essential grid y añadido los filtros en tu grilla, vamos a la pestaña “API/Javascript” añadir la siguiente función:

ess-grid

(function() {
var grid = jQuery(‘.esg-grid’),

url = window.location.href;

if(!grid.length || url.search(‘#’) === -1) return;

var hash = url.split(‘#’);

hash = hash[hash.length – 1];

if(!hash) return;

hash = hash.toLowerCase().split(‘ ‘).join(‘-‘);

var timer = setInterval(function() {

if(grid.is(‘:visible’)) {

clearInterval(timer);

jQuery(‘div[data-filter=filter-‘ + hash + ‘]’).trigger(‘click’);

}

}, 500);

})();

 

Una vez añadida la función y guardar los cambios, puedes proceder a añadir como enlace personalizado el slug de filtro, si por ejemplo queremos filtrar por la categoría “portafolio”, añadiremos algo como esto al enlace:

http://www.nombredesitio.com/pagina-de-la-grilla/#portafolio

De esta forma pudiéramos crear un menú personalizado, que en vez de apuntar al archive, apunte a la página de la grilla principal con el filtro seleccionado.

Instalacion Python + Django en Windows

0

Instalación Python + Django en Windows, espero con este tutorial, solucionarle la vida a alguna otra persona que se este rompiendo la cabeza para poder instalarlo, sin embargo recomiendo por MUCHO el desarrollo bajo cualquier distro basada en Debian, por que el tiempo de preparación del entorno sera por mucho menor, y mas optimo.

Instalación Django en Windows

1.- Descargar python https://www.python.org/downloads/

python001

python002

python003

python004

python005

2.- Agregar las variables de entorno ‘X:\Python27\;X:\Python27\Scripts;‘ al final de la variable PATH, siendo “X” el disco de instalación

python006

python007

python008

python009

3.- Descargar ez_setup.py de https://pypi.python.org/pypi/setuptools

4.- Moverse por la consola hacia donde se guardo el archivo y ejecutar:

python ez_setup.py

5.- Ejecutar pip, para ello debemos ejecutar este comando para instalarlo

python get-pip.py

NOTA: Si obtienes algun error en los pasos 4 y 5 puedes descargar directamente el archivo get-pip.py https://bootstrap.pypa.io/get-pip.py directamente desde esta url  y guardas el archivo donde quieras, luego por la consola vas al directorio donde lo guardaste y ejecutas:

python get-pip.py

Una vez finalice el proceso, escribe le la consola

pip

para comprobar que todo va bien, si tienes un error como “pip” no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable, deberás añadir el path manualmente, tal como se explico en el paso 2, con la siguiente ruta.

X:\Python27\scripts\pip

6.- Instalar virtualenv ejecutando

pip install virtualenv

7.- Moverse por la consola hacia el proyecto para crear el entorno virtual del mismo ‘X:\django\tutorial>virtualenv kernel‘ siendo kernel el nombre del entorno virtual, pueden llamarlo como gusten

8.- Activar el entorno virtual

X:\django\tutorial>kernel\Scripts\activate.bat

al terminal se mostrara que estan en el entorno de la siguiente forma ‘(kernel) D:\django\tutorial>

9.- Instalar Django ejecutando el siguiente script

pip install django -U

10.- Crear proyecto ejecutar:

django-admin startproject tutorial

y en caso de error

python x:\django\tutorial\kernel\Scripts\django-admin.py startproject tutorial

siendo tutorial el nombre del proyecto

11.- Correr el proyecto ejecutando

python manage.py runserver

en caso de no funcionar como fue mi caso entra por consola a la carpeta que creo django y ejecutalo

12.- Accede desde tu navegador a http://127.0.0.1:8000/

Para instalar el requirements.txt:

pip install -r requirements.txt

Para crear migracion de la bd:

python manage.py makemigrations

Para importar la base de datos:

python manage.py migrate

Instalación de psycopg en windows

1.- Descarga el ejecutable según tu versión de http://www.stickpeople.com/projects/python/win-psycopg/, y cambia la extensión de .exe a .zip

2.- Extrae el contenido donde quieras.

3.- Copia la carpeta psycopg2 en TUVIRTUALENV/Lib (siendo TUVIRTUALENV por el nombre de tu entorno virtual)

4.- Copia el archivo .egg (.egg-info) en TUVIRTUALENV/Lib/site-packages (siendo TUVIRTUALENV por el nombre de tu entorno virtual)

Apps para móvil que todas las personas deberían tener

0

Apps para móvil que todas las personas deberían tener, es una recopilación personal de 18 increíbles aplicaciones que debes tener en tu móvil. Espero que tengas mucho espacio disponible y puedas descargarlas todas…

1. Spending Tracker

grid-cell-23322-1440441856-2

Spending Tracker o Rastreador de Gastos es una aplicación de finanzas que te ayudará a mantener un registro de tus gastos. Ayudándote a la hora de ahorrar, hacer tus presupuestos y todo lo que respecta al dinero, especialmente si eres un derrochador…

2. Snapseed

grid-cell-21769-1440442223-17

Esta es una  aplicación de fotos con herramientas de edición de fotográfica avanzadas, que hará que tus fotos tomadas con el celular tengan un aspecto pulido y profesional.

3. QuizUp

Captura de pantalla 2015-08-25 a las 12.07.25

QuizUp es una aplicación de trivia en donde podrás ganar múltiples premios, desafiar a tus amigos y conocer a otros jugadores que comparten tus mismos intereses. ¡Te convertirás en todo un player!

4. MyFitnessPal

grid-cell-24292-1440374360-9

Si estás en plan de bajar de peso, esta aplicación es para ti. Te dará un montón de herramientas y técnicas para medir tus metas, contar tus calorías y bajar de peso.

5. Plant Nanny

grid-cell-16013-1440441544-4

Esta aplicación te ayudará a visualizar la cantidad de agua que bebes durante el día, a través de una pequeña planta., recordándote cuándo es necesario que te hidrates como una esponja…

6. Lumosity

grid-cell-14515-1440427980-2

En esta aplicación podrás encontrar muchos ejercicios diseñados para ejercitar tu memoria y tus problemas de concentración.

7.  Wattpad

grid-cell-19936-1440374393-3

Esta aplicación es una comunidad de lectores y escritores, donde los usuarios podrán compartir y descubrir nuevas historias literarias ¡Muy intelectual!

8. VSCOcam

grid-cell-9866-1440441498-2

Esta aplicación de fotografía ofrece hermosos filtros y herramientas de edición, especiales para darle un toque profesional y vintage a tus fotografías.

9. Clue

grid-cell-8895-1440440736-2

Esta aplicación femenina hará un seguimiento de tu periodo y te recordará los días en que te encuentras fértil para evitar un embarazo.

10. 2048

grid-cell-6050-1440427876-7

Esta aplicación es ideal para los tiempos muertos, y es estúpidamente adictiva. En ella tienes que unir números con el fin de llegar a 2048 azulejos, ¡casi tan bueno cómo la Snake!

11. Duolingo

grid-cell-15914-1440189307-13

Con esta aplicación podrás aprender a hablar una gran cantidad de idiomas partiendo desde cero, y de manera muy didáctica ¡Parece más un juego que una lección pero aún así puedes mejorar tu práctica!

12. Waze

grid-cell-31454-1440190831-6

Esta aplicación del tráfico te solucionará la vida cuando manejas. Te indicará las rutas más rápidas para llegar, y si hay algún peligro en la ruta entre otras cosas, ¡un infaltable para los que odian los atascos!

13. Anti Mosquito

Captura de pantalla 2015-08-25 a las 13.04.06

Olvídate de las olorosas y pegajosas pomadas anti mosquitos. Con esta aplicación los espantarás a todos sin necesidad de mucho esfuerzo. ¡Averigua cómo!

14. Sleep Better 

Captura de pantalla 2015-08-25 a las 13.26.57

Sleep Better nos permite monitorizar nuestro sueño, además de despertarnos en el mejor momento dentro de un rango de tiempo determinado. Con esta aplicación tus días serán mejores, ¡y para qué decir tu humor! Claro que hay cosas que muchas veces no puedes controlar…

15. Pocket

Captura de pantalla 2015-08-25 a las 13.51.22

A través de Pocket, podrás guardar todos los contenidos que te parezcan interesantes para un posterior visualización sin internet. Lo mejor de todo es que elimina todos los molestos anuncios que vienen junto a los artículos o videos.

16. Endomondo

Captura de pantalla 2015-08-25 a las 14.40.38

Esto es tener un entrenador personal en tu bolsillo. Esta aplicación rastreará tus actividades y analizará tu rendimiento cuando hagas deporte. No apta para flojos…

17. GoKeep

Captura de pantalla 2015-08-25 a las 14.41.15

GoKeep es ideal para personas desorganizadas. En ella se puede programar la información personal a través de archivos de notas.

18. No Crop

Captura de pantalla 2015-08-25 a las 14.45.24

Esta aplicación hará que tus fotos y videos luzcan fantásticos en Instagram al subirlos en su tamaño completo, sin necesidad de recortarlos.

 

¡Las aplicaciones pueden solucionar la vida!

Precios Especiales para tipo de Usuario en Woocommerce

2

En esta oportunidad vengo a hablar acerca de un tema que afecta a prácticamente cualquier negocio de comercio electrónico o e-commerce y es como el titulo lo indica precios especiales para tipo de usuarios en woocomerce

Básicamente es una estrategia de pricing que consiste en aplicar descuentos que se aplica a esos usuarios mayoristas o distribuidores que compran una gran cantidad de piezas. Obviamente la rebaja en el precio siempre tiene un límite y normalmente los descuentos se aplican por tramos.

En wordpress existe el plugin pago Dynamic Pricing, con un costo de $129.00,  desarrollado por woocommerce, bastante completo e intuitivo, para aplicar descuentos, precios variantes y muchas otras opciones, sin embargo, en esta oportunidad te traemos un tutorial para que a través de filtros y funciones puedas realizarlos sin ayuda de ningún plugin y puedas ahorrarte algún dinero.

its-free

Antes de comenzar, ten en cuenta que este tutorial consta de 4 pasos, los cuales se añaden en el functions.php del tema que estés usando en tu tienda virtual.

1.- CREAR NUEVO ROL (OPCIONAL)

El primer paso es crear un nuevo rol de usuarios, a los cuales les quieres aplicar el precio especial, esto es, solo si no quieres usar los roles predeterminados de woocommerce, de ser asi continua al paso 2 ya cambia ‘cliente_mayorista’ por el nombre de rol que quieras usar:

// Crea el rol de usuario "Cliente Mayorista" 
add_action( 'init', 'crea_rol_cliente_mayorista' ); 
function crea_rol_cliente_mayorista(){
     $customer_role = get_role( 'customer' );
     add_role( 'cliente_mayorista', __( 'Cliente Mayorista' ), $customer_role->capabilities );
}
2.- COMPROBAR ROL DE USUARIO

El segundo paso es crear una función para comprobar el rol del usuario

// Buscando el rol del usuario 
function usuario_mayorista( $role = '',$user_id = null ){
     if( is_numeric( $user_id ) ){
         $user = get_user_by( 'id', $user_id );
     }else{
         $user = wp_get_current_user();
     }
     if( empty( $user ) ){
            return false;
     }
     return in_array( $role, (array) $user->roles );
 }
3.- APLICAR EL DESCUENTO PARA EL TIPO DE USUARIO

El tercer paso es crear filtros y funciones para aplicar el descuento por tipo de usuarios

// Aplica un precio especial dependiento del tipo de usuario
add_filter( 'woocommerce_get_price', 'aplica_precio_mayorista', 10, 2);
function aplica_precio_mayorista( $price, $product ) {
    if (!is_user_logged_in()) return $price;
    // Listando todos los productos
    $product_list = array();
    // % Descuento a aplicar
    $discount = 30;
    // Comprueba si el producto actual pertenece a la lista
    if( in_array( $product->id, $product_list ) || empty( $product_list ) ) {
        // Comprueba si el usuario tiene rol 'cliente_mayorista' para aplicar descuento
        if( usuario_mayorista( 'cliente_mayorista' ) ){
            $porcent =  $price * ( $discount / 100 );
            // redondeando el precio
            $price = round($price - $porcent);
        }
    }
    return $price;
}

Una vez realizado los cambios, antes de guardar, realiza tu configuración personal, tanto para el descuento, como para la lista de productos a los que se les va a aplicar.

Para modificar el porcentaje de descuento sustituye el número de la línea:

$discount = 30;

Si por ejemplo quieres hacer un 50% de descuento quedaría de la siguiente forma:

$discount = 50;

Ahora para definirla lista de productos específicos, basta con definir dentro del array los id de los productos, y modificar esta línea, que este momento trae todos los productos existentes:

$product_list = array();

Si por ejemplo quieres aplicar descuento a productos específicos, ve a tu lista de productos y sitúa el cursor de mouse sobre el producto y copia su id, quedaría de la siguiente forma:

$product_list = array( '14', '200' );
4.- DEFINIR USUARIOS CON EL NUEVO ROL (OPCIONAL)

En caso de que hallas creado un rol tal como se indica en el paso 1 de este tutorial, para finalizar solo queda definir a los usuarios, que disfrutaran del descuento, para ello, ve a la sección de usuarios, marca a todos los usuarios que consideres, y cambia el perfil al nuevo rol creado.

¡Bien!, ya tienes configurado precios especiales para tipo de usuarios en woocommerce.

ADICIONAL (DESCUENTOS EN PRODUCTOS VARIANTES)

En caso de que desees aplicar descuentos a productos variables añade esta función:

// Aplica un precio especial al precio variante dependiento del tipo de usuario
 add_filter('woocommerce_variable_price_html', 'aplica_precio_mayorista_variant', 10, 2);
 function aplica_precio_ mayorista_variant( $price, $product ) {
      // obteniendo el precio de venta
      $price = $product->min_variation_price;
     if (!is_user_logged_in()) return '<span class="amount">$'.number_format($price, 2, '.', '').'</span>';
     // Listado de productos con precio especial
     $product_list = array();
     // % Descuento a aplicar     $discount = 30;
     // Comprueba si el producto actual pertenece a la lista
     if( in_array( $product->id, $product_list ) || empty( $product_list ) ) {
         // Comprueba si el usuario tiene precio especial
         if( usuario_mayorista( 'cliente_mayorista' ) ){
             $porcent =  $price * ( $discount / 100 );
             $price = round($price - $porcent);
         }
     }
     // como el precio variante se obtiene en html se formatea para conservar los estilos de woocommerce
     $priceformated = '<span class="amount">$'.number_format($price, 2, '.', '').'</span>';
     return $priceformated;
 }
ADICIONAL (MONTO MINIMO DE ORDEN ESTABLECIDO)

Si luego de que aplicas un precio especial a tu usuario mayorista, requieres que este tenga establecido un mínimo en el costo final de su orden, añade las siguientes líneas:

add_action( 'woocommerce_after_checkout_billing_form', 'wc_minimum_order_amount' );
add_action( 'woocommerce_checkout_process', 'wc_minimum_order_amount' );
add_action( 'woocommerce_before_cart' , 'wc_minimum_order_amount' );
function wc_minimum_order_amount() {
    // verificando rol de usuario
    if( usuario_con_precio_especial( 'cliente_mayorista' ) ){
    $minimum = 1389;
    if ( WC()->cart->total < $minimum ) {
        if( is_cart() ) {
            wc_print_notice( 
                sprintf( 'Como usuario distribuidor debe tener una orden de almenos <strong>%s</strong> para hacer su pedido, el total de su orden actual es <strong>%s</strong>' , 
                    wc_price( $minimum ), 
                    wc_price( WC()->cart->total )
                ), 'error' 
            );
        } else {
            wc_add_notice( 
                sprintf( 'Como usuario distribuidor debe tener una orden de almenos <strong>%s</strong> para hacer su pedido, el total de su orden actual es <strong>%s</strong>' , 
                    wc_price( $minimum ), 
                    wc_price( WC()->cart->total )
                ), 'error' 
            );
        }
    }
    }
}

Modifica la siguiente línea por el monto mínimo permitido que desees:

$minimum = 1389;

 

Mysql y Doctrine en Symfony

0
Mysql y Doctrine en Symfony

Una de las principales tareas a la hora de realizar un desarrollo o aplicación web , es la permanencia de los datos, Symfony incluye la librería Doctrine, que proporciona herramientas para simplificar el acceso y manejo de la información de la base de datos. Por esta razón me propuse a escribir este artículo, donde quiero que aprendas la filosofía de trabajo de Doctrine y lo fácil que puede ser trabajar con bases de datos.¿Interesado(a)? ¡Sigue leyendo!
Ahora bien, antes de comenzar, ten en cuenta que para seguir este tutorial ya debes contar con un Bundle o paquete dentro de tu aplicación, si no sabes cómo, revisa el artículo Crear Bundles en Symfony 2.
Es importante destacar que Doctrine no guarda ninguna relación con Symfony y su uso es totalmente opcional, por lo que adentrado más en Symfony si conoces algún otro ORM (Object Relational Mapper o Mapeo Objeto Relacional) puedes sentir libertad de usarlo.
En esta artículo te enseñare a configurar el acceso a la base de datos, a crear un objeto llamado Producto, para persistir su información en la base de datos y obtenerlo de nuevo mediante una consulta.

Comencemos

1.- Configurando la base de datos

Es necesario configurar la base de datos. Por convención, esta información se configura en el archivo app/config/parameters.yml:

# app/config/parameters.yml
parameters:
    database_driver:   pdo_mysql
    database_host:     localhost
    database_name:     Ponceelrelajado_db
    database_user:     root
    database_password: 12345
# ...

En este momento Doctrine ya conoce nuestra base de datos, solo falta crearla con el siguiente comando:

php app/console doctrine:database:create

Uno de los errores más habituales que cometen incluso los programadores más experimentados consiste en no configurar correctamente la codificación de caracteres de la base de datos.
En ocasiones, el problema es que lo configuran bien la primera vez, pero no cada vez que se crea de nuevo la base de datos. Esto sucede mucho cuando se desarrolla la aplicación, ya que es habitual emplear los siguientes comandos para borrar la base de datos y regenerarla con nueva información:

$ php app/console doctrine:database:drop --force
$ php app/console doctrine:database:create

Doctrine no permite configurar estos valores por defecto en su archivo de configuración, ya que trata de ser lo más agnóstico posible en lo que se refiere a la configuración del entorno de ejecución.
Así que la solución más sencilla consiste en establecer estos valores por defecto en la propia configuración del servidor de base de datos. Si utilizas MySQL, añade las dos siguientes líneas en su archivo de configuración, que normalmente es my.cnf:

[mysqld]
collation-server = utf8_general_ci
character-set-server = utf8
2.- Creando la entidad

Imagina que estás desarrollando una aplicación en la que vas a mostrar productos. Olvidándote de Doctrine y de las bases de datos, seguramente estás pensando en utilizar un objeto Producto para representar a los productos. Crea esta clase dentro del directorio Entity del bundle PonceelrelajadoDemoBundle:

// src/Ponceelrelajado/DemoBundle/Entity/Producto.php
namespace Ponceelrelajado\DemoBundle\Entity;
class Producto
{
    protected $name;
    protected $price;
    protected $description;
}

Esta clase normalmente se llama “entidad” o “entity”, lo que significa que es una clase muy sencilla que sólo se utiliza para almacenar datos. Aunque se trata de una clase muy básica, cumple su objetivo de representar a los productos de tu aplicación. No obstante, esta clase no se puede guardar en una base de datos — es sólo una clase PHP simple.
Una vez aprendidos los conceptos fundamentales de Doctrine, podrás generar las clases de tipo entidad más fácilmente con el siguiente comando. Una vez ejecutado, Doctrine te hará varias preguntas para generar la entidad de forma interactiva:

$ php app/console doctrine:generate:entity
3.- Añadir información de mapeo

Imagina que estás desarrollando una aplicación en la que vas a mostrar productos. Olvidándote de Doctrine y de las bases de datos, seguramente estás pensando en utilizar un objeto Producto para representar a los productos. Crea esta clase dentro del directorio Entity del bundle PonceelrelajadoDemoBundle:
Trabajar con Doctrine es mucho más interesante que hacerlo directamente con la base de datos. En vez de trabajar con filas y tablas, Doctrine te permite guardar y obtener objetos enteros a partir de la información de la base de datos. El truco para que esto funcione consiste en mapear una clase PHP a una tabla de la base de datos y después, mapear las propiedades de la clase PHP a las columnas de esa tabla, de manera que sólo tienes que añadir algunos metadatos a la clase PHP para configurar cómo se mapean la clase Producto y sus propiedades.

// src/Ponceelrelajado/DemoBundle/Entity/Producto.php
namespace Ponceelrelajado\DemoBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
 * @ORM\Entity
 * @ORM\Table(name="producto")
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $name;
    /**
     * @ORM\Column(type="decimal", scale=2)
     */
    protected $price;
    /**
     * @ORM\Column(type="text")
     */
    protected $description;
}
4.- Generando getters y setters

Doctrine ya sabe cómo persistir los objetos de tipo Producto en la base de datos, pero esa clase no es muy útil por el momento. Cómo Producto es una clase PHP normal y corriente, es necesario crear métodos getters y setters (getName(), setName(), etc.) para poder acceder a sus propiedades (porque son de tipo protected). Como esto es bastante habitual, existe un comando para que Doctrine añada estos métodos automáticamente:

$ php app/console doctrine:generate:entities Ponceelrelajado/DemoBundle/Entity/Product

Este comando asegura que la clase Product contiene todos los getters y setters necesarios. Puedes ejecutar de forma segura este comando una y otra vez, ya que los getters y setters sólo se generan si no existen (no se borran los métodos existentes).
Es importante destacar que los getters y setters generados por Doctrine son muy básicos, por lo dependiendo de la complejidad de tu aplicación, tendrás que ajustar el código a tus necesidades.
Utilizando el comando doctrine:generate:entities puedes:

  1. generar getters y setters;
  2. generar las clases de tipo Repository configuradas con la anotación @ORM\Entity(repositoryClass=”…”);
  3. generar el constructor adecuado para relaciones 1:n (uno a muchos) y n:m (muchos a muchos).

Para evitar problemas, el comando doctrine:generate:entities guarda una copia de seguridad del archivo Producto.php original en el archivo Producto.php~ (la diferencia está en el carácter ~ al final del nombre). En ocasiones esta copia de seguridad puede provocar en la aplicación errores de tipo “Cannot redeclare class”. Si se producen esos errores, puedes borrar este archivo sin problemas. También puedes añadir la opción –no-backup al comando anterior para no generar estas copias de seguridad.
También puedes generar a la vez todas las entidades de un bundle (es decir, cualquier clase PHP con información de mapeo de Doctrine) o de un espacio de nombres:

$ php app/console doctrine:generate:entities PonceelrelajadoDemoBundle
$ php app/console doctrine:generate:entities Ponceelrelajado
5.- Crear tabla en la base de datos

Aunque tienes una clase Product utilizable con información de mapeo para que Doctrine sepa persistirla, todavía no tienes su correspondiente tabla producto en la base de datos. Afortunadamente, Doctrine puede crear automáticamente todas las tablas necesarias en la base de datos (una para cada entidad conocida de tu aplicación). Para ello, ejecuta el siguiente comando:

$ php app/console doctrine:schema:update --force

En realidad, este comando es muy poderoso. Internamente compara la estructura que debería tener tu base de datos (según la información de mapeo de tus entidades) con la estructura que realmente tiene y genera las sentencias SQL necesarias para actualizar la estructura de la base de datos.
En otras palabras, si añades una nueva propiedad a la clase Producto y ejecutas este comando otra vez, se genera una sentencia de tipo ALTER TABLE para añadir la nueva columna a la tabla producto existente.
Una vez hayas ejecutado este comando, la base de datos cuenta ahora con una tabla llamada producto completamente funcional, y sus columnas coinciden con los metadatos que has especificado en la clase Producto.php.

6.- Persistiendo objetos en la base de datos

Ahora que tienes mapeada una entidad Producto y su tabla producto correspondiente, ya puedes persistir la información en la base de datos. De hecho, persistir información dentro de un controlador es bastante sencillo. Añade el siguiente método al controlador DefaultController del bundle:

// src/Ponceelrelajado/DemoBundle/Controller/DefaultController.php
// ...
use Ponceelrelajado\DemoBundle\Entity\Producto;
use Symfony\Component\HttpFoundation\Response; 
public function createAction()
{
    /*En esta sección, creas una instancia y trabajas con el objeto $product como harías con cualquier otro objeto PHP normal.*/
    $product = new Producto();
    $product->setName('A Foo Bar');
    $product->setPrice('19.99');
    $product->setDescription('Lorem ipsum dolor');
    /*Esta línea obtiene el "entity manager" o gestor de entidades de Doctrine, que se utiliza para persistir y recuperar objetos hacia y desde la base de datos.*/
    $em = $this->getDoctrine()->getManager();
    /*El método persist() le dice a Doctrine que debe persistir el objeto $product, pero todavía no se genera (y por tanto, tampoco se ejecuta) la sentencia SQL correspondiente.*/
    $em->persist($product);
    /*Cuando se llama al método flush(), Doctrine examina todos los objetos que está gestionando para ver si es necesario persistirlos en la base de datos. En este ejemplo, el objeto $product aún no se ha persistido, por lo que el gestor de la entidad ejecuta una consulta de tipo INSERT y crea una fila en la tabla producto.*/
    $em->flush();
  return new Response('Created product id '.$product->getId());
}

No olvides crear una ruta que apunte a esta acción para poder probarla en el navegador, tal como se explica en el punto 2 del artículo Crear Bundles en Symfony, agrega estas lineas al final del archivo routing.yml de tu bundle:

routing.yml

# src/Ponceelrelajado/DemoBundle/Resources/config/routing.yml
nuevo:
    path:     /nuevo
    defaults: { _controller: PonceelrelajadoDemoBundle:Default:create }

De esta forma podrás crear tu primer objeto producto al acceder al siguiente enlace:
http://localhost/tu-directorio/web/app_dev.php/nuevo/

7.- Buscando objetos en la base de datos

Buscar información de la base de datos y recuperar en forma de objeto es todavía más fácil. Imagina que has configurado una ruta de la aplicación para mostrar la información de un producto a partir del valor de su id. El código del controlador correspondiente podría ser el siguiente:

public function showAction($id)
{
    $product = $this->getDoctrine()
        ->getRepository('PonceelrelajadoDemoBundle:Producto')
        ->find($id);
    if (!$product) {
        throw $this->createNotFoundException(
            'No product found for id '.$id
        );
    }
    // ... (pasar el objeto $product a una plantilla)
}

Al realizar una consulta por un determinado objeto, Doctrine siempre utiliza lo que se conoce como “repositorio”. Estos repositorios son como clases PHP cuyo trabajo consiste en ayudarte a buscar las entidades de una determinada clase. Puedes acceder al repositorio de la entidad de una clase mediante el código:

$repository = $this->getDoctrine()
    ->getRepository('PonceelrelajadoDemoBundle:Product');

Una vez que obtienes el repositorio, tienes acceso a todo tipo de métodos útiles:

// consulta por la clave principal (generalmente 'id')
$product = $repository->find($id);
// métodos con nombres dinámicos para buscar un valor en función de alguna columna
$product = $repository->findOneById($id);
$product = $repository->findOneByName('foo');
// obtiene todos los productos
$products = $repository->findAll();
// busca productos basándose en el valor de una columna
$products = $repository->findByPrice(19.99);

También puedes utilizar los métodos findBy y findOneBy para obtener objetos en función de varias condiciones:

// busca un producto con ese nombre y ese precio
$product = $repository->findOneBy(array(
    'name'  => 'foo', 'price' => 19.99
));
// obtiene todos los productos con un nombre determinado
// y ordena los resultados por precio
$product = $repository->findBy(
    array('name'  => 'foo'),
    array('price' => 'ASC')
);

Al igual que el paso anterior. no olvides crear una ruta que apunte a esta acción para poder probarla en el navegador, agrega estas lineas al final del archivo routing.yml de tu bundle:
routing.yml

# src/Ponceelrelajado/DemoBundle/Resources/config/routing.yml

ver:

path:     /ver/{id}
    defaults: { _controller: PonceelrelajadoDemoBundle:Default:show }

De esta forma podrás ver tu primer objeto producto al acceder al siguiente enlace:
http://localhost/tu-directorio/web/app_dev.php/ver/1
Crea de esta misma forma las rutas para actualizar y eliminar, de esta forma podrás hacer las pruebas desde el navegador.

8.- Actualizar objeto en la base de datos

Una vez que hayas obtenido un objeto de Doctrine, actualizarlo es relativamente fácil. Supongamos que la aplicación dispone de una ruta que actualiza la información del producto cuyo id se indica:

public function updateAction($id)
{
    $em = $this->getDoctrine()->getManager();
    $product = $em->getRepository('PonceelrelajadoDemoBundle:Product')->find($id);
    if (!$product) {
        throw $this->createNotFoundException(
            'No product found for id '.$id
        );
    }
    $product->setName('New product name!');
    $em->flush();
    return $this->redirect($this->generateUrl('homepage'));
}

Actualizar un objeto requiere de tres pasos:

  1. Obtener el objeto utilizando Doctrine.
  2. Modificar el objeto.
  3. Invocar al método flush() del entity manager.
9.- Eliminar objeto en la base de datos

Eliminar objetos es un proceso similar, pero requiere invocar el método remove() del entity manager:

public function removeAction($id)
{
    $em = $this->getDoctrine()->getManager();
    $product = $em->getRepository('PonceelrelajadoDemoBundle:Product')->find($id);
    if (!$product) {
        throw $this->createNotFoundException(
            'No product found for id '.$id
        );
    }
    $em->remove($product);
    $em->flush();
    return $this->redirect($this->generateUrl('homepage'));
}

El método remove() avisa a Doctrine que quieres eliminar esa entidad, pero, esta no se ejecuta, hasta que se invoca el método flush()

Conclusión

En esta ocasión apreciamos cómo crear un esquema de base de datos funcional para una aplicación web en Symfony 2 a través de doctrine con una base de datos Mysql. y de cómo el uso de esta fabuloso ORM ayuda a manejar los datos de una forma bastante sencilla, en el artículo Tutorial: mini-backend de usuarios con Doctrine, puedes ver un ejemplo un poco más complejo de tablas relacionadas, para que puedas seguir dando rienda suelta a tu creatividad en el mundo Symfony.
En venideros tutoriales ahondare en otros tips y herramientas prácticas de desarrollo web, tanto a nivel de back-end como front-end. ¡No olvides compartir este artículo en tus redes sociales si te gustó!

Crear Bundles en Symfony

0
Crear Bundles en Symfony

Un bundle es básicamente una carpeta que contiene los archivos necesarios para un grupo de funcionalidades específicas, un concepto similar al de los plugins en otras aplicaciones, como por ejemplo un blog, un carrito de compras o hasta el mismo frontend y backend de nuestra aplicación. La diferencia clave es que en Symfony 2 (Sf2) todo es un bundle, incluyendo tanto la funcionalidad básica de la plataforma como el código escrito para tu aplicación, de tal forma que esta vez les quiero mostrar como hacer Crear Bundles en Symfony.

Permiten utilizar funcionalidades construidas por terceros o empaquetar tus propias funcionalidades para distribuirlas y reutilizarlas en otros proyectos. Además, facilitan mucho la activación o desactivación de determinadas características dentro de una aplicación.

Las aplicaciones Sf2 se componen de bundles, tal como se define en el método “registerBundles()” de la clase “AppKernel”:

// app/AppKernel.php

public function registerBundles()

{

    $bundles = array(

        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),

        new Symfony\Bundle\SecurityBundle\SecurityBundle(),

        new Symfony\Bundle\TwigBundle\TwigBundle(),

        new Symfony\Bundle\MonologBundle\MonologBundle(),

        new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),

        new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),

        new Symfony\Bundle\AsseticBundle\AsseticBundle(),

        new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),

    );

    if (in_array($this->getEnvironment(), array('dev', 'test'))) {

        $bundles[] = new Acme\DemoBundle\AcmeDemoBundle();

        $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();

        $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();

        $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();

    }

    return $bundles;

}

Con el método “registerBundles()”, puedes controlar completamente los bundles que utiliza tu aplicación, incluso aquellos bundles que forman el núcleo del framework

En este artículo te enseñaremos  crear bundles en Sf2

Comencemos

1.- Crear el bundle

La distribucion estandar de Sf2 cuenta un comando completamente funcional para crear tus bundles, para mostrarte lo sencillo que es crearemos un bundle llamado “PonceelrelajadoDemoBundle”

$ php app/console generate:bundle --namespace=Ponceelrelajado/DemoBundle --format=yml

Sin que te des cuenta, se ha creado un directorio para el bundle en src/Ponceelrelajado/DemoBundle. Además se ha añadido automáticamente una línea en el archivo app/AppKernel.php para registrar el bundle en el núcleo de Symfony:

// app/AppKernel.php

public function registerBundles()

{

$bundles = array(

…,

new Ponceelrelajado\DemoBundle\PonceelrelajadoDemoBundle(),

);

// …

return $bundles;

}

Ahora que ya está configurado el bundle, puedes comenzar a construir tu aplicación dentro del bundle.

2.- Cambiar el enrutamiento

Por defecto, el archivo de configuración de enrutamiento en una aplicación Symfony2 se encuentra en app/config/routing.yml, pero, si quieres y al igual que en el resto de la configuración en Sf2, puedes utilizar el formato XML o PHP para configurar tus rutas.

Si te fijas en el archivo de enrutamiento principal, verás que Symfony ya ha agregado una entrada al generar el bundle “PonceelrelajadoDemoBundle”:

YAML

# app/config/routing.yml

acme_hello:
    resource: “@AcmeHelloBundle/Resources/config/routing.yml”
    prefix:   /

XML

<!– app/config/routing.xml –>

<?xml version=”1.0″ encoding=”UTF-8″ ?>

<routes xmlns=”http://symfony.com/schema/routing”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=”http://symfony.com/schema/routing

http://symfony.com/schema/routing/routing-1.0.xsd”>

<import resource=”@AcmeHelloBundle/Resources/config/routing.xml”

prefix=”/” />

</routes>

PHP

// app/config/routing.php

use Symfony\Component\Routing\RouteCollection;

use Symfony\Component\Routing\Route;

$collection = new RouteCollection();

$collection->addCollection(

$loader->import(‘@AcmeHelloBundle/Resources/config/routing.php’),

‘/’

);

return $collection;

Básicamente le estamos diciendo a Symfony que cargue la configuración de enrutamiento del “archivo Resources/config/routing.yml” que se encuentra en el interior del bundle “PonceelrelajadoDemoBundle”.

En otras palabras, puedes configurar tus rutas directamente en el archivo app/config/routing.yml o puedes definirlas en varias partes de la aplicación y después las importas desde ese archivo.

Ahora que el archivo routing.yml del bundle se importa desde el archivo de enrutamiento principal de la aplicación, añade la nueva ruta que define la URL de la página que estás a punto de crear:

YAML

# src/Ponceelrelajado/DemoBundle/Resources/config/routing.yml

hello:
    path:     /hello/{name}
    defaults: { _controller: PonceelrelajadoDemoBundle:Hello:index }

XML

<!– src/Ponceelrelajado/DemoBundle/Resources/config/routing.xml –>

<?xml version=”1.0″ encoding=”UTF-8″ ?>

<routes xmlns=”http://symfony.com/schema/routing”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=”http://symfony.com/schema/routing

http://symfony.com/schema/routing/routing-1.0.xsd”>

<route id=”hello” path=”/hello/{name}”>

<default key=”_controller”>PonceelrelajadoDemoBundle:Hello:index</default>

</route>

</routes>

PHP

// src/Ponceelrelajado/DemoBundle/Resources/config/routing.php

use Symfony\Component\Routing\RouteCollection;

use Symfony\Component\Routing\Route;

$collection = new RouteCollection();

$collection->add(‘hello’, new Route(‘/hello/{name}’, array(

‘_controller’ => PonceelrelajadoDemoBundle:Hello:index’,

)));

return $collection;

$collection = new RouteCollection();

$collection->addCollection(

$loader->import(‘@PonceelrelajadoDemoBundle/Resources/config/routing.php’),

‘/’

);

La ruta se compone básicamente de dos partes: el path, que es la URL con la que debe coincidir la petición del usuario para activar la ruta, y un array llamado defaults, que especifica el controlador que se ejecuta. Las partes de la URL encerradas entre comillas indican que su valor puede variar. De esta forma, {name} significa que las URL /hello/Ryan, /hello/Fabien o cualquier otra URI similar coincidirá con esta ruta. El valor de las partes variables también se pasa al controlador, que puede acceder a ellos a través del nombre asignado en la propia ruta (name en este caso).

3.- CONSTRUIR EL CONTROLADOR

Cuando el usuario solicita la URL /hello/Ryan, se activa la ruta hello, a la que corresponde el controlador PonceelrelajadoDemoBundle:Hello:index, qué es realmente el código que se ejecuta. El segundo paso del proceso de creación de páginas consiste precisamente en crear ese controlador.

La cadena PonceelrelajadoDemoBundle:Hello:index es el nombre lógico del controlador, que se traduce como el método indexAction() de una clase PHP llamada Ponceelrelajado\DemoBundle\Controller\Hello. Crea en primer lugar este archivo dentro de tu bundle “PonceelrelajadoDemoBundle”:

// src/Ponceelrelajado/DemoBundle/Controller/HelloController.php

namespace Ponceelrelajado\DemoBundle\Controller;

use Symfony\Component\HttpFoundation\Response;

class HelloController

{

}

En realidad, el controlador no es más que un método PHP que tú creas y Symfony ejecuta. Aquí es donde el código utiliza la información de la petición para construir y preparar el recurso solicitado. Salvo en algunos casos avanzados, el resultado final de un controlador siempre es el mismo: un objeto Response de Sf2.

Crea el método indexAction que Symfony ejecutará cuando se sirva la ruta hello:

// src/Ponceelrelajado/DemoBundle/Controller/HelloController.php

// …

class HelloController

{

public function indexAction($name)

{

return new Response(‘<html><body>Hello ‘.$name.’!</body></html>’);

}

}

El controlador es muy sencillo: crea un nuevo objeto de tipo Response y cuyo primer argumento es el contenido que se utiliza para crear la respuesta enviada al usuario (en este caso, una página HTML muy simple).

Después de crear solamente una ruta y un controlador ¡ya tienes una página completamente funcional! Si todo lo has configurado correctamente, la aplicación debe darte la bienvenida al acceder a la siguiente URL:

http://localhost/tu-directorio/web/app_dev.php/hello/Ponceelrelajado

Tambien puedes acceder a tu aplicacion en el entorno de produccion con la siguiente URL:

http://localhost/tu-directorio/web/app.php/hello/Ponceelrelajado

Pero antes debes limpiar el cache de tu aplicación, de lo contrario te mostrar un error:

php app/console cache:clear –env=prod –no-debug
4.- CONSTRUIR PLANTILLAS (OPCIONAL)

Las plantillas te permiten mover toda la parte de la vista (es decir, el código HTML) a un archivo separado y reutilizar diferentes partes del diseño de la página. En vez de escribir el código HTML dentro del controlador, genera el código HTML a partir de una plantilla:

// src/Ponceelrelajado/DemoBundle/Controller/HelloController.php

namespace Ponceelrelajado\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class HelloController extends Controller

{

public function indexAction($name)

{

return $this->render(‘PonceelrelajadoDemoBundle:Hello:index.html.twig’, array(‘name’ => $name));

// si utilizas PHP en vez de Twig

// return $this->render(‘PonceelrelajadoDemoBundle:Hello:index.html.php’, array(‘name’ => $name));

}

}

Para poder usar el método render(), tu controlador debe extender de la clase Symfony\Bundle\FrameworkBundle\Controller\Controller, de esta forma se añaden atajos para las tareas más comunes de los controladores. tal como se muestra en el ejemplo anterior.

Ten en cuenta que puedes procesar las plantillas de dos formas diferentes. Por defecto Sf2 admite dos lenguajes de plantillas: las clásicas plantillas creadas con PHP y las nuevas y concisas plantillas creadas con Twig. No te asustes porque puedes elegir libremente cuál utilizar o incluso mezclar las dos en el mismo proyecto.

Al procesar la plantilla “PonceelrelajadoDemoBundle:Hello:index.html.twig”, el controlador utiliza la siguiente convención de nomenclatura:

NombreBundle:NombreControlador:NombrePlantilla

Este es el nombre lógico de la plantilla, que se traduce a un archivo físico utilizando la siguiente convención:

</ruta/a/Nombrebundle>/Resources/views/<NombreControlador>/<NombrePlantilla>

En este caso, “PonceelrelajadoDemoBundle” es el nombre del bundle, “Hello” es el controlador e “index.html.twig” la plantilla:

index.html.twig

{# src/Ponceelrelajado/DemoBundle/Resources/views/Hello/index.html.twig #}

{% extends ‘::base.html.twig’ %}

{% block body %}

Hello {{ name }}!

{% endblock %}

index.html.php

<!– src/Ponceelrelajado/DemoBundle/Resources/views/Hello/index.html.php –>

<?php $view->extend(‘::base.html.php’) ?>

Hello <?php echo $view->escape($name) ?>!

Veamos la situación a través de la plantilla Twig línea por línea:

La etiqueta “extends” indica que se utiliza una plantilla padre donde se define el diseño del sitio web.

La etiqueta block indica que todo su contenido se debe colocar dentro de un bloque llamadobody. Como se explicará más adelante, la plantilla padre (base.html.twig) es la responsable de definir ese bloque y de mostrarlo en la página HTML adecuadamente.

La plantilla padre se indica como ::base.html.twig, por lo que no incluye ni la parte del nombre del bundle ni la del nombre del controlador (de ahí los dos puntos dobles (::) al principio). Esto significa que la plantilla no se encuentra dentro de ningún bundle, sino en el directorio app del proyecto:

base.html.twig

{# app/Resources/views/base.html.twig #}

<!DOCTYPE html>

<html>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

<title>{% block title %}Welcome!{% endblock %}</title>

{% block stylesheets %}{% endblock %}

<link rel=”shortcut icon” href=”{{ asset(‘favicon.ico’) }}” />

</head>

<body>

{% block body %}{% endblock %}

{% block javascripts %}{% endblock %}

</body>

</html>

base.html.php

<!– app/Resources/views/base.html.php –>

<!DOCTYPE html>

<html>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

<title><?php $view[‘slots’]->output(‘title’, ‘Welcome!’) ?></title>

<?php $view[‘slots’]->output(‘stylesheets’) ?>

<link rel=”shortcut icon” href=”<?php echo $view[‘assets’]->getUrl(‘favicon.ico’) ?>” />

</head>

<body>

<?php $view[‘slots’]->output(‘_content’) ?>

<?php $view[‘slots’]->output(‘stylesheets’) ?>

</body>

</html>

El archivo de la plantilla base define el diseño HTML y muestra el contenido del bloque body que se definió en la plantilla index.html.twig. También muestra el contenido de un bloque llamado title, que si quieres puedes definir en la plantilla index.html.twig. ¡Como no has definido ese bloque en la plantilla, se utiliza el valor predeterminado “Welcome!”.

Las plantillas son realmente útiles para generar y organizar el contenido de las páginas de la aplicación. Una plantilla puede generar cualquier cosa, desde el código HTML o CSS hasta cualquier otra cosa que el controlador tenga que devolver.

Dentro del ciclo petición/respuesta, el motor de plantillas simplemente es una herramienta opcional. Recuerda que el objetivo de cada controlador es devolver un objeto Response. Así que por muy potentes que sean, las plantillas son solo una forma opcional de generar ese objeto Response.

CONCLUSIÓN

En esta ocasión apreciamos la estructura principal de Symfony2, y creamos un bundle de ejemplo, aquí en Ponceelrelajado esperamos que este artículo te haya sido útil y que de ahora en adelante puedas desarrollar tus propios bundles y funcionalidades.

En venideros tutoriales ahondaremos en otros tips y herramientas prácticas de desarrollo web, tanto a nivel de back-end como front-end. ¡No olvides compartir este artículo en tus redes sociales si te gustó!

 

Tutorial de Instalación de Symfony

0
Tutorial de Instalación de Symfony

En artículos anteriores, te mostré como hacer ciertas cosas con Symfony, sin embargo, no he escrito acerca de los mas básico, que es su instalación, por esa razón, me decidí a escribir este Tutorial de Instalación de Symfony, para que aquellos que aun no sepan, puedan instalarlo siguiendo esta pequeña guía.

 Symfony es PHP. Ni más ni menos. Se trata de uno de los framework  desarrollado por SensioLabs, más potentes que existen para desarrollar aplicaciones web, que te facilita la vida a la hora de programar, sin la necesidad de profundizar demasiado en el código.

A pesar de que Symfony ya lanzó al mercado Symfony 3 (Sf3) en finales de noviembre de 2015, este artículo está orientado a la instalación de Symfony 2 (Sf2), pero, no te preocupes, a diferencia de su antecesor Symfony 1 (Sf1), no tendrás que volver a formarte para programar en Sf3 y las aplicaciones que desarrolles en Sf2 seran facilmente actualizables a Sf3, tan solo no debes usar las  funcionalidades o comportamientos de Symfony marcado como obsoleto (deprecated en inglés), La lista de cambios incompatibles de Symfony 3 te explica con detalle qué características van a cambiar y te muestra los cambios necesarios en tu código.

Sf2 es tan potente y funcional que siempre se va a encontrar en los primeros lugares de cualquier top de framework para desarrollo web, para muestra dejo los siguientes enlaces de top, realizados por linkedin y el elwebmaster.com, en donde ocupa el tercer y cuarto puesto respectivamente.

En el siguiente artículo te enseñaremos a instalar Sf2, con el gestor de base de datos Mysql y Doctrine como ORM Object-relational mapping o mapeador de objetos-relacional . ¿Interesado(a)? ¡Sigue leyendo!

Requerimientos para la instalación de Sf2

Independientemente de que quieras realizar una instalación local o en un servidor remoto, debes cumplir con los siguientes requerimientos:

Obligatorios:

  • PHP debe ser una versión mínima de PHP 5.3.3;
  • Es necesario habilitar JSON;
  • Es necesario tener habilitado el ctype;
  • Tu PHP.ini debe tener configurado el valor date.timezone;
  • Como vamos a usar Doctrine necesitamos tener instalado PDO;
  • Y el controlador de PDO para el servidor de base de datos Mysql:
    • pdo_mysql.default_socket = “MySQL”;
    • pdo_mysql.cache_size = 2000;
    • extension=php_pdo_sqlite.dll;
    • extension=php_pdo_mysql.dll;
    • extension=php_fileinfo.dll.

Opcionales:

  • Instalar el módulo PHP-XML;
  • Necesitas tener por lo menos la versión 2.6.21 de libxml;
  • Activar el tokenizer de PHP;
  • Habilitar las funciones mbstring;
  • Activar iconv;
  • POSIX tiene que estar habilitado (únicamente en *nix);
  • Debes tener instalado Intl con ICU 4+;
  • APC 3.0.17+ (u otra caché opcode debe estar instalada);
  • Configuración recomendada en PHP.ini:
    • short_open_tag = Off;
    • magic_quotes_gpc = Off;
    • register_globals = Off;
    • session.autostart = Off.

Comencemos con la instalación

1.- Instala Composer en el directorio del proyecto

Una vez creado el directorio donde se va a instalar el proyecto, debes ejecutar el siguiente comando por consola:

curl -sS https://getcomposer.org/installer | php

En caso de instlacion local en Windows y de no disponer de curl, asegurate que tienes php agregado en las variabes de entorno e ingresa al siguiente enlace https://getcomposer.org/installer ubicar el archivo descargado y agregar la extension .php, quedando como installer.php, mueve este archivo a la carpeta raíz del proyecto, dirigete a través de la consola a la carpeta raíz del proyecto y ejecutar el siguiente comando:

php installer.php

Esto te creará el archivo “composer.phar”. Ahora bien, instalar Composer de esta forma es correcto, pero implica tener que instalarlo para cada nuevo proyecto. Para evitar esta situación menos que ideal, mueve el archivo “composer.phar” ejecutando el siguiente comando:

mv composer.phar /usr/local/bin/composer

Si estas en Windows, cópialo al directorio donde se encuentren todos los ejecutables de PHP (php, pear, pecl, etc.), si adicional quieres hacer una instlacion global de composer, tienes que crear un archivo llamado composer.bat en el mismo directorio donde has movido el archivo composer.phar. El contenido de ese archivo debe ser el siguiente:

@ECHO OFF

SET composerScript=composer.phar

php "%~dp0%composerScript%" %*
2.- Crear proyecto Sf2

Una vez hayas movido el archivo composer.phar, ejecuta el siguiente comando para hacer la instalación de un proyecto en Sf2.

composer.phar create-project symfony/framework-standard-edition directorio\carpeta-raiz\Symfony2\Symfony 2.*

En caso de no haber movido el archivo composer.phar, puedes ejecutar el mismo comando, anteponiendo la ejecución de php

php composer.phar create-project symfony/framework-standard-edition directorio\carpeta-raiz\Symfony2\Symfony 2.*

En caso haber hecho la instalación global en Windows, puedes ejecutar el mismo comando, sin colocar la extensión del de composer

composer create-project symfony/framework-standard-edition directorio\carpeta-raiz\Symfony2\Symfony 2.*

Al finalizar la descarga, la consola, te irá pidiendo algunas opciones para la configuración del proyecto, solo, preciona la tecla “Enter”, para dejar la configuración por defecto.

3.- Mover ficheros

Una vez finalizada la descarga y configuración, dentro del directorio del proyecto, encontrarás el fichero “Symfony”, mueve todo el contenido de ese carpeta a la carpeta principal del proyecto.

En caso de ser un servidor remoto, mueve todo el contenido de la carpeta web a tu carpeta public_html.

¡Bien! ya tienes un proyecto en Sf2 y puedes ver la página inicial de tu proyecto en el navegador escribiendo una url como esta:

http://localhost/tu-directorio/web/app_dev.php

Recuerda cambiar el nombre de “tu-directorio” por el directorio correcto.

Conclusión

Con estos sencillos pasos ya puedes tener, la estructura básica y funcional para crear tu aplicacion web en sf2, ya solo queda que le des rienda suelta a tu creatividad para que desarrolles tus aplicaciones en este “Grandioso framework”.

Puedes continuar con el artículo Crear Bundles en Symfony 2 para que crees tu primera aplicación.

Manténte al tanto de los próximos tutoriales, suscribiéndote a nuestro newsletter, para que recibas más tips y herramientas prácticas de desarrollo web, tanto a nivel de back-end como front-end. Y por supuesto ¡no olvides compartir este artículo en tus redes sociales si te gustó!

Crear extensiones personalizadas en twig

0
Crear extensiones personalizadas en twig

La principal motivación para escribir una extensión es mover el código usado frecuentemente a una clase reutilizable como agregar apoyo para la internacionalización. Una extensión puede definir etiquetas, filtros, pruebas, operadores, variables globales, funciones y visitantes de nodo.
La creación de una extensión también hace una mejor separación del código que se ejecuta en tiempo de compilación y el código necesario en tiempo de ejecución. Por lo tanto, hace que tu código sea más rápido.

En este post te explicare paso a paso como Crear extensiones personalizadas en twig.

Creando la clase de la extensión

Para obtener la funcionalidad personalizada primero debes crear la clase para la extensión Twig. Como ejemplo vas a crear un filtro para dar formato a un precio suministrando un número en el precio:

// src/Acme/DemoBundle/Twig/AcmeExtension.php
namespace Acme\DemoBundle\Twig;

class AcmeExtension extends \Twig_Extension
{
	public function getFilters()
	{
		return array(
		new \Twig_SimpleFilter('price', array($this, 'priceFilter')),
		);
	}

	public function priceFilter($number, $decimals = 0, $decPoint = '.', $thousandsSep = ',')
	{
		$price = number_format($number, $decimals, $decPoint, $thousandsSep);
		$price = '$'.$price;

		return $price;
	}

	public function getName()
	{
		return 'acme_extension';
	}
}

Registrando una extensión como servicio

Ahora hay que dejar que el contenedor de servicios sepa de su nueva extensión declarando la misma:

YAML:

# src/Acme/DemoBundle/Resources/config/services.yml
services:
acme.twig.acme_extension:
class: Acme\DemoBundle\Twig\AcmeExtension
tags:
- { name: twig.extension }

XML:

<!-- src/Acme/DemoBundle/Resources/config/services.xml -->
<services>
<service id="acme.twig.acme_extension" class="Acme\DemoBundle\Twig\AcmeExtension">
<tag name="twig.extension" />
</service>
</services>

PHP:

// src/Acme/DemoBundle/Resources/config/services.php
use Symfony\Component\DependencyInjection\Definition;

$container
->register('acme.twig.acme_extension', '\Acme\DemoBundle\Twig\AcmeExtension')
->addTag('twig.extension');

Usando la extensión personalizada

Usar tu recién creada extensión de Twig no es diferente a cualquier otra:

{# produce $5,500.00 #}
{{ '5500'|price }}

Pasando otros argumentos a tu filtro:

{# outputs $5500,2516 #}
{{ '5500.25155'|price(4, ',', '') }}

Notas

Ten en cuenta que las extensiones Twig no se cargan de manera diferida. Esto significa que hay una mayor probabilidad de que obtengas una CircularReferenceException o ScopeWideningInjectionException si cualquier servicio (o tu extensión Twig —en este caso—) es dependiente del servicio Petición. Para obtener más información, échale un vistazo a Cómo Trabajar con Ámbitos

Instalación de WordPress y Repositorios Git desde Composer

0

WordPress sistema de gestión de contenidos o CMS (por sus siglas en inglés,Content Management System) herramienta exageradamente útil para el desarrollo de sitios web, tan amigable, fácil e intuitivo es su uso, que, según las estadísticas del w3tech para febrero de 2015 del 100% de los sitios que se encuentran en la red el 25,4% de estos, están desarrollado en wordpress.

Sin embargo y a pesar de la facilidad de instalación y configuración, cuando ya has desarrollado o desarrollas muchos sitios en los que implementas los mismos plugins o temas base, resulta tedioso y repetitivo tener que instalar 1 a 1 los plugins o temas a través de su administrador backend, aunque, también existe la posibilidad de descomprimir todos tus plugins o temas en las carpetas pertinentes, evitando el tedio de hacer instalaciones 1 a 1, hoy te traigo un post de como instalar wordpress desde composer añadiendo, si se quiere plugins o temas de repositorios git libres o personalizados.
Como Desarrollador symfony que hace uso de composer para poder crear proyectos y/o descargar módulos de terceros y partiendo de una necesidad de mi nuevo equipo de trabajo de poder instalar wordpress de forma conjunta con los temas y plugins recurrentes, surgió la idea de usar composer con su archivo json para que con una sola línea de comando se haga la Instalación de WordPress y Repositorios Git desde Composer, a continuación dejo los pasos para realizarlos
1.- Instalar composer en el directorio del proyecto

Una vez creado el directorio donde se va instalar el proyecto ejecutar por consola:

curl -sS https://getcomposer.org/installer | php

Este comando te creara el archivo composer.phar, Instalar composer de esta forma es correcta, pero, habrá que instalarlo para cada nuevo proyecto, para evitar esto, mueve el archivo composer.phar  ejecutando el siguiente comando :

mv composer.phar /usr/local/bin/composer

Si estas en Windows cópialo al  directorio donde se encuentran todos los ejecutables de PHP (php, pear, pecl, etc.)

2.- Crear el archivo composer.json

Crea el archivo composer.json y edítalo con el editor de texto de tu preferencia con los siguientes datos:

{
 "name" : "ponceelrelajado/wic",
 "description" : "Wordpress Install Composer, proyecto de prueba para instala wordpress y repositorios personalizados con composer",
 "authors" : [
 {
 "name" : "Jhonatan Ponce",
 "email" : "[email protected]",
 "homepage": "https://www.ponceelrelajado.com/"
 }
 ],
 "repositories": [
 {
 "type": "composer",
 "url" : "http://wpackagist.org"
 },
 {
 "type": "composer",
 "url" : "http://rarst.net"
 },
 {
 "type": "package",
 "package": {
 "name": "wordpress",
 "type": "webroot",
 "version": "4.3",
 "dist": {
 "type": "zip",
 "url": "https://github.com/WordPress/WordPress/archive/4.3.zip"
 },
 "require" : {
 "fancyguy/webroot-installer": "1.0.0"
 }
 }
 },
 {
 "type": "package",
 "package": {
 "name": "ponceelrelajado/ares",
 "type": "wordpress-theme",
 "version": "dev-master",
 "source": {
 "url": "https://[email protected]/ponceelrelajado/ares.git",
 "type": "git",
 "reference": "master"
 }
 }
 }
 ],
 "config" : {
 "vendor-dir": "wp-content/vendor"
 },
 "require": {
 "php": ">=5.3",
 "wordpress": "4.*",
 "fancyguy/webroot-installer": "1.0.0",
 "composer/installers": "v1.0.16",
 "ponceelrelajado/ares": "dev-master",
 "wpackagist-plugin/akismet": "3.1.1",
 "wpackagist-theme/evolve": "*"
 },
 "extra": {
 "webroot-dir": "wordpress",
 "webroot-package": "wordpress",
 "installer-paths": {
 "wp-content/plugins/{$name}/" : ["type:wordpress-plugin"],
 "wp-content/mu-plugins/{$name}": ["type:wordpress-muplugin"],
 "wp-content/themes/{$name}" : ["type:wordpress-theme"]
 }
 }
}

El código anterior contiene los repositorios necesarios para descargar la versión 4.3 de wordpress y dos repositorios personalizados en bitbucket, explicare de forma segmentada parte del mismo

{
 "type": "composer",
 "url" : "http://wpackagist.org"
},
{
 "type": "composer",
 "url" : "http://rarst.net"
},
 {
 "type": "package",
 "package": {
 "name": "wordpress",
 "type": "webroot",
 "version": "4.3",
 "dist": {
 "type": "zip",
 "url": "https://github.com/WordPress/WordPress/archive/4.3.zip"
 },
 "require" : {
 "fancyguy/webroot-installer": "1.0.0"
 }
 }
}

En el cuadro anterior se muestran los repositorios necesarios para descargar la versión 4.3 de wordpress y los repositorios composer para instalar plugins o temas definidos en “require”.

{
 "type": "package",
 "package": {
 "name": "ponceelrelajado/ares",
 "type": "wordpress-theme",
 "version": "dev-master",
 "source": {
 "url": "https://[email protected]/ponceelrelajado/ares.git",
 "type": "git",
 "reference": "dev-master"
 }
 }
}

En el cuadro anterior se muestran listados los repositorios personalizados en bitbucket a descargar dentro del proyecto, se utilizo la versión dev-master para que siempre se mantenga actualizado, pero, pueden usar una versión especifica.

"config" : {
 "vendor-dir": "wp-content/vendor"

El cuadro anterior se muestra una configuración opcional para la instalación del vendor de composer.

"require": {
 "php": ">=5.3",
 "wordpress": "4.*",
 "fancyguy/webroot-installer": "1.0.0",
 "composer/installers": "v1.0.16",
 "ponceelrelajado/ares": "dev-master",
 "wpackagist-plugin/akismet": "3.1.1",
 "wpackagist-theme/evolve": "*"
},

En el apartado anterior se muestran los requerimientos necesarios del proyecto y las versiones de los repositorios a descargar, en este apartado también se definen los plugins o temas con sus versiones a descargar de los paquetes composer definidos en la primera parte.

3.- Instalar git en el servidor

A pesar de que su repositorio personalizado, se puede descargar en zip cambiando “type”: “git”, por “type”: “zip”, y la url por la url de tu repositorio en zip en el composer.json por usabilidad es mejor instalar git en el servidor ya que de esta forma se podrá correr los comando para actualizar o guardar en el repositorio los cambios.

Dejo una breve guía de instalación de git en CentOS que fue donde hice la prueba.

  •         Crear carpeta git-master dentro de la carpeta del proyecto y dentro de esta descargar el zip de git.
cd ~

wget -O git.zip https://github.com/git/git/archive/master.zip
  •         Descomprimir y entrar al directorio principal de git-master
unzip git.zip

cd git-master
  •         Configurar el paquete, construir los ejecutables, la documentación e instalar con las siguientes líneas
make configure

./configure --prefix=/usr/local

make all doc

sudo make install install-doc install-html

Pueden tener más info revisando el siguiente enlace:

https://www.digitalocean.com/community/tutorials/how-to-install-git-on-a-centos-6-4-vps

4.- Ejecutar comando de instalación

Ejecutar el comando de instalacion

php composer.phar install

En caso de que ya lo hayas instalado y quieras actualizar:

php composer.phar update

 

En caso de que al correr te de el siguiente mensaje de errorr: The HOME or COMPOSER_HOME environment variable must be set for composer to run correctly. Instala o actualiza composer definiendo el path de COMPOSER_HOME con el siguiente comando:

COMPOSER_HOME="/path/you/want/to/be/home" php composer.phar install
5.- Editar index.php y wp-config.php

Una vez ejecutado el comando de instalación, dentro del directorio de instalación tendrás los siguientes ficheros :

  • Ø  wordpress/
  • Ø  wp-content/
  • Ø  composer.json
  • Ø  composer.lock
  • Ø  composer.phar

En caso de no haber modificado la configuración de instalación del vendor, tendrás los siguientes ficheros :

  • Ø  vendor/
  • Ø  wordpress/
  • Ø  wp-content/
  • Ø  composer.json
  • Ø  composer.lock
  • Ø  composer.phar

A este mismo nivel crea los archivos index.php y wp-config.php:

  • Ø  vendor/
  • Ø  wordpress/
  • Ø  wp-content/
  • Ø  composer.json
  • Ø  composer.lock
  • Ø  composer.phar
  • Ø  index.php
  • Ø  wp-config.php

Con el siguiente contenido:

index.php:
<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */
 
/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define('WP_USE_THEMES', true);
 
/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wordpress/wp-blog-header.php' );
wp-config.php:
<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the
 * installation. You don't have to use the web site, you can
 * copy this file to "wp-config.php" and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * MySQL settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/Editing_wp-config.php
 *
 * @package WordPress
 */
 
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'database_name_here');
 
/** MySQL database username */
define('DB_USER', 'username_here');
 
/** MySQL database password */
define('DB_PASSWORD', 'password_here');
 
/** MySQL hostname */
define('DB_HOST', 'localhost');
 
/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');
 
/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');
 
define( 'WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] );
define( 'WP_SITEURL', WP_HOME . '/NOMBRECARPETADEINSTALACION/wordpress' );
define( 'WP_CONTENT_URL', WP_HOME . '/NOMBRECARPETADEINSTALACION/wp-content' );
define( 'WP_CONTENT_DIR', $_SERVER['DOCUMENT_ROOT'] . '/NOMBRECARPETADEINSTALACION/wp-content' );
 
/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');
/**#@-*/
 
/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each
 * a unique prefix. Only numbers, letters, and underscores please!
 */
$table_prefix = 'wp_';
 
/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 *
 * For information on other constants that can be used for debugging,
 * visit the Codex.
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define('WP_DEBUG', false);
 
/* That's all, stop editing! Happy blogging. */
 
/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
 define('ABSPATH', dirname(__FILE__) . '/wordpress');
 
/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

Hacer las modificaciones pertinentes de base de datos y “NOMBRECARPETADEINSTALACION” por la correcta

De forma opcional se puede copiar el contenido de la wp-content de la instalación principal de wordpress en el wp-content creado a partir de composer

Aplicaciones asombrosas que te harán la vida más sencilla: Manejo de cuentas de correo electrónico desde el escritorio con Mail Bird

0

En un post anterior escribí acerca de la aplicación myMail para gestionar tus cuentas de correo desde el móvil, esta ves, y para darle continuidad al hilo, traigo Aplicaciones asombrosas que te harán la vida más sencilla: Manejo de cuentas de correo electrónico desde el escritorio con Mail Bird.

 

Si al igual que yo manejas más de una cuenta de correo, de seguro te has visto, con varias pestañas abiertas de tu navegador web con cada una de tus cuentas de correo, esto trae como consecuencia que, en algún momento tendrás muchas pestañas abiertas resultando visualmente molesto, además de, un consumo excesivo de memoria RAM, para evitar esto existe Mail Bird, aplicación de escritorio con una interfaz limpia, sencilla e intuitiva, en donde podrás configurar tus cuentas de correo e integrar y administrar tus marcadores y carpetas existentes o crear nuevos si lo deseas.

Esta aplicación es totalmente configurable, sólo descarga, instala, registrate, configura y comienza a usar tu nueva aplicación de escritorio para gestionar tus cuentas de correo, podrás también personalizar las firmas y fuentes para cada cuenta, ademas de adecuar el tema visual que mas se adapte a ti.

Mail Bird Theme

Mail Bird se autodenomina como: “Mejor Cliente de correo electrónico para Windows” y vaya que tiene motivos para que esta autodenominación sea cierta.

Mail Bird también cuenta con módulos para integrarlos a otras App como Facebook, evernote, whatsapp, Dropbox, asana etc.

Al momento de regístrate tendrás 1 mes gratis de la cuenta pro, y puedes configurar tantas cuentas como desees, al finalizar el mes pro gratuito, se te activara la cuenta gratis y sólo podrás tener activas 3 cuentas, pero, aún así no pierde crédito por la funcionalidad y la usabilidad de la aplicación, los costos de la aplicación son los siguientes:

  • Gratis: Con limitaciones de cuentas.
  • Pro mensual: 1$ al mes.
  • Pro de por vida: 45$

Para mayor información y descarga visita su sitio web getmailbird.com

Traducir Temas o plugins WordPress

0

A la hora de desarrollar un sitio en WordPress, podemos encontrarnos con la necesidad de que el mismo sea multilenguaje y que se adapte al idioma del navegador, o que bien todas las opciones se encuentren en un mismo idioma,  para brindar una grata experiencia al futuro visitante de nuestra Web, es muy común encontrarse a la hora de instalar plantillas o plugin con traducciones incompletas o simplemente sin traducciones, por esta razón me decidí a escribir este post para enseñarte a Traducir Temas o plugins WordPress, de dos formas distintas, una desde el mismo administrador de wordpress (Loco Translate) y otra desde una app de escritorio (Poedit).

Traducir Temas o plugins WordPress Con Loco Translate

Este genial plugin ha sido desarrollado por Tim Whitlock (aka Loco) y nos permite contar con un completo editor de archivos PO para internacionalizar nuestros plugins y plantillas desde WordPress.

 

Ya no necesitaremos descargar la plantilla y sentarnos a terminar la traducción de manera local y luego volver a subir los cambios, con Loco Translate todo el trabajo se mantiene desde el mismo CMS.

 

Dentro de las cosas dignas de destacar en Loco Translate tenemos:

  • Editor de traducciones al estilo POEdit integrado desde la zona de administración de WordPress
  • Crea y actualiza ficheros de idioma directamente en tus plugins y plantillas
  • Extrae cadenas de texto traducible desde el código fuente
  • Compilación nativa de ficheros MO sin necesidad de tener Gettext instalado en nuestro sistema

Descarga Loco Translate

Fuente: https://localise.biz

Traducir Temas o plugins WordPress Con Poedit

Poedit es un software (disponible tanto para Windows como para Mac y Linux) que te permite traducir un tema o plugin de WordPress. Está disponible de manera gratuita en poedit.net. La versión gratuita viene con una memoria de traducción que recuerda tus traducciones anteriores y las utiliza para hacerte sugerencias sobre textos similares.

Descarga Poedit

También tiene una versión Pro con funcionalidades adicionales (como el recuento de palabras) y soporte técnico para WordPress. Cuesta 19.99 dólares.

Poedit Website

Los pasos para traducir un tema o plugin con Poedit son los siguientes:

1. Abre Poedit y selecciona Archivo > Nuevo Catálogo desde archivo POT / PO

2. Selecciona el archivo .POT o .PO de tu tema o plugin que desees traducir (puedes encontrar los archivos en la carpeta wp-content/themes/your-theme/language/)

3. Una ventana emergente se abrirá preguntándote por el idioma de la traducción que vas a realizar. Selecciona el idioma:

4. Pulsa OK y Poedit le dará nombre automáticamente a tu archivo. Si seleccionas español (España): es_ES.po

5. Guarda el archivo en tu ordenador

6. Ahora ya puedes empezar la traducción de tu tema o plugin. Todo el texto que debe ser traducido aparecerá en la columna de la izquierda y las traducciones ya completadas se mostrarán en la parte derecha. Los campos de la parte de abajo te mostrarán el texto fuente, tu traducción y notas para los traductores. Traducir es un proceso muy sencillo: selecciona una palabra o frase, introduce tu traducción y haz clic en “Validar”.

NOTA IMPORTANTE:

      • Has de respetar todos los caracteres especiales del texto original cuando realices la traducción (mira la captura de pantalla de arriba)
      • No es obligatorio traducir todas las cadenas de texto. Quizás no quieras emplear tu tiempo traduciendo cadenas de texto que se encuentran en el panel de administración de tu tema o plugin de WordPress y que solo son visibles para ti, no para los usuarios.

7. Cuando finalices la traducción, guarda el archivo. Poedit automáticamente creará dos archivos, un .PO y un .MO. Tendrás que subir ambos archivos a la carpeta de idiomas de tu tema (o, en su caso, plugin).

Aplicaciones asombrosas que te harán la vida más sencilla: Gestionar cuentas de correo electrónico a través del móvil con myMail

0
my-mail
my-mail
Continuando con el hilo que comencé hace algún tiempo está vez quiero reseñar Aplicaciones asombrosas que te harán la vida más sencilla: Gestionar cuentas de correo electrónico a través del móvil con myMail
myMail es una App móvil disponible para iOS y Android, bastante sencilla, intuitiva, configurable, minimalista y lo mejor, es que es gratis.
Siendo un usuario de iOS puedo dar fé de que la App Mail gestor de correos predeterminado de la manzana, no cumple con mis expectativas a la hora de gestionar y configurar varias cuentas de correos.
myMail tiene la posibilidad de mostrar avatares, lo que hace más fácil de ubicar y seleccionar una cuenta determinada, sin embargo y si al igual que yo tienes tus cuentas en gravatar, desde la misma App puedes modificar cada avatar, adicional a eso puedes abrir los enlaces y documentos desde la misma aplicación, sin la necesidad de salir de la misma, aunque, siempre puedes configurar para que las abra la App de tu elección.

my-mail accounts

myMail se integra con todas tus carpetas y marcadores a la perfección con la opción de siempre crear nuevos.
myMail lleva las fotos de perfil de tus contactos a tu lista de mensajes y si tu contacto no tiene avatar, esta aplicación le pondrá uno por defecto, mostrando la primera letra del nombre del contacto, y no solo lo hace con tus contactos, myMail muestra iconos para los servicios más populares, para que puedas reconocer inmediatamente al remitente.
Con el simple gesto de deslizar un dedo, podrás leer, marcar, mover o borrar tus emails, sin duda alguna la mejor App para móvil que he usado para gestionar mis cuentas de correo electrónico.

my-mail inbox

Descargar la App para Android desde aquí
Descargar la App para iOS dese aquí
Si quieres saber más de la app puedes visitar su web mymail.my.com

Migrar base de datos MySQL por SSH

12

Al momento de realizar desarrollos web, es muy común que te encuentres con la necesidad de realizar una migración de un servidor a otro.

El proceso para realizar la migración es bastante fácil e intuitivo a través de cPanel, sin embargo, cuando se trata de migrar base de datos MySQL y estas son muy pesadas, puede que, el límite de carga de archivos phpMyAdmin, no sea suficiente y aún siendo suficiente el tiempo de carga es bastante tardío y desesperante.

Por esa razón me decidí en escribir este artículo, en modo tutorial, para que puedas hacer migraciones de bases de datos, de forma muy sencilla a través del SSH.

Antes de empezar, debes tener activa la opción para acceder al servidor vía SSH, lo puedes hacer desde tu cPanel, o contactando a tu proveedor de servicios, asi mismo, no es necesario que seas un erudito con respecto a comandos Linux, este tutorial solo conta de 3 pasos:

  1. Dumpear la Base de Datos a un archivo SQL.
  2. Copiar el archivo SQL generado al nuevo servidor.
  3. Importar el archivo SQL a la Base de Datos del nuevo servidor.

Ahora bien comenzaremos explicando uno a uno.

  1. Dumpear la Base de Datos a un archivo SQL.

Éste proceso de Dumplear significa que transformaremos nuestra base de datos a un archivo con extensión *.sql, en el servidor donde tenemos la base de datos, ejecutams a través de la consola el siguiente comando:

mysqldump nombre_bd -u user_bd -p > archivo.sql

En donde debemos reemplazar “nombre_bd” por el nombre la base de datos a migrar, y “user_bd” por el usuario con el cual accederemos a la Base de Datos, luego de ejecutar este comando te pedirá la contraseña de ese usuario, colócala y espera a que termine.

Listo ya dumpeaste la base de datos.

  1. Copiar el archivo SQL generado al nuevo servidor.

Ahora que ya hemos generado el archivo, vamos a copiar – para el mismo al nuevo servido ejecutando el siguiente comando:

scp -P 22 -r archivo.sql [email protected]:/ruta

El número 22 determina el puerto por donde se va a conectar el SSH, por default se utiliza el “22”, pero algunas empresas por seguridad lo cambian, en caso de que te de error de conexión pregunta a tu proveedor de servisios el puerto por donde se conecta el SSH.

Recuerda reemplazar “user”, “server” y “ruta”, por los datos de tu nuevo, luego de ejecutar este comando te pedirá la contraseña del nuevo servidor, colócala y espera a que termine.

Listo ya moviste el archivo al nuevo servidor.

  1. Dumpear la Base de Datos a un archivo SQL.

Ahora que tenemos el archivo SQL en el nuevo servidor, conéctate a este vía SSH, y ejecuta el siguiente comando:

mysql nombre_bd -u user_bd -p < ruta/archivo.sql

En donde debemos reemplazar “nombre_bd” por el nombre la base de datos en la que queremos importar el contenido, “user_bd” por el usuario con el cual accederemos a la Base de Datos y “ruta” por la ruta a la que se encuentra el archivo SQL, luego de ejecutar este comando te pedirá la contraseña de ese usuario, colócala y espera a que termine.

Listo ya migraste tu base de datos.

Todo el mundo debería de saber programar

0

Hace algún tiempo ya, me tope con este video, en ese momento, el mismo me lleno de satisfacción personal, por tener la habilidad de conocer y usar unos pocos lenguajes de programación.

Esta vez que por casualidad me lo vuelvo a topar, ademas de la satisfacción personal, comienzo a tener disyuntivas del actual sistema educativo de Venezuela, si bien es cierto que la tecnología en el plano nacional, ha tenido un gran aumento del uso, no implica que sea el mejor.

Pienso que si en las clases de informática no solo te enseñaran a usar programas de ofimática, si no, que ademas a los niños les enseñaran a imprimir un “Hola mundo” en la pantalla o a hacer calculadoras en cualquier lenguaje de programación, se les estaría incitando a desarrollar, a buscar la manera de automatizar y resolver problemas. Programar no es solo cosas de nerds o frikis, te ayuda a separar los problemas complejos en porciones más sencillas, y a solucionarlos paso a paso aplicando la lógica.

Steve Jobs decía:

“Todos los niños deberían aprender a programar, porque desarrollarían habilidades básicas para desenvolverse mejor en la vida.”

Claro está, en Venezuela no somos tan bien remunerados, ni contamos con las instalaciones que se muestran en el vídeo, pero, ese es el norte y programar es divertido, por eso y mucho más todo el mundo debería de saber programar.

Footer siempre abajo

8
Footer siempre abajo

Uno de los principales problemas a la hora de desarrollar o diseñar un sitio o sistema web es la ubicación del footer.

Cuando se tiene un tamaño predefinido del contenedor resolverlo por css es muy sencillo, sin embargo, cuando no se tiene un tamaño especifico para el contenido y este es muy largo o muy corto, es un poco mas complejo.

En este post te explicamos una de las formas de como resolverlo de manera sencilla por css, de esta forma podemos evitar que el footer y nuestros créditos aparezcan muy abajo y el usuario deba hacer mucho scroll para verlos o bien que aparezca a mitad de la página si el contenido es muy corto.

Para resolverlo haremos uso de la propiedad padding:

Primero el html:

La estructura del html es bastante sencilla, primero apuntamos a nuestra hoja de estilos css, luego dentro de la etiqueta body, crearemos la etiqueta “wrapper” y dentro de esta dividiremos el contenido normalmente creando las secciones “header-zone” para el header, “middle-zone” para nuestro contenido y “footer-zone” para el footer o nuestra zona de créditos. Tal como se muestra a continuación:

<!DOCTYPE html> 
 <html lang="es"> 
 <head> 
  <link rel="stylesheet" href="style.css"> 
 </head> 
 <body> 
   <div id="wrapper" class="col-md-12"> 
    <div id="header-zone"> 
    </div> 
    <div id="middle-zone"> 
    </div> 
    <div id="footer-zone"> 
    </div> 
  </div> 
 </body> 
</html>

Luego el css:

Una vez tengamos la estructura del html, apuntando a nuestra hoja de estilos, lo que debemos hacer es copiar estas sencillas reglas.

body, html { 
  margin:0; 
  padding:0; 
  height:100%; 
} 
#wrapper { 
  min-height:100%; 
  position:relative; 
} 
#header-zone { 
  padding:10px; 
  height: 50px; 
  background:red; 
} 
#middle-zone { 
  padding-bottom:100px; 
} 
#footer-zone { 
  height: 50px; 
  background:black; 
  width:100%; 
  position:absolute; 
  bottom:0; 
  left:0; 
}

Con esta estructura del html y estilos podemos encontrar el footer siempre abajo o al final de cada página independientemente de su tamaño.

WordPress Migrate DB Pro

0

Si estás desarrollando un sitio web en WordPress y necesitas actualizar constantemente el ambiente de producción con la data de tu ambiente de desarrollo, WordPress Migrate DB Pro es uno de los plugins más útiles que podrás encontrar.

Funciones de WordPress Migrate DB Pro

1. Exportar/importar tu DB local/remota aplicando el cambio de la URL de instalación: es decir, pasando ‘http://localhost/miproyecto.com’ a ‘http://miproyecto.com’ y viceversa.

2. Búsqueda y reemplazo de todas las rutas de archivos insertados en el contenido: es decir, convirtiendo los registros que apunten de ‘http://localhost/miproyecto.com/wp-content/uploads/mi-archivo.jpg’ a ‘http://miproyecto.com/wp-content/uploads/mi-archivo.jpg’ y viceversa

3. Búsqueda y reemplazo de rutas absolutas: es decir, convirtiendo ‘C:\xampp\htdocs\miproyecto.com’ a ‘/home/miproyecto/public_html/, y viceversa

La versión Pro permite además hacer Push/Pull entre los ambientes de desarrollo y producción, directamente desde la aplicación, sin pasar por PHPMyAdmin.

Llevo años haciendo todo esto a pie y recién ahora es que me di a la tarea de buscar y probar algunos para optimizar esta parte del proceso

Descargar

Programación orientada a objetos en JavaScript

0

Aprende a programar con Programación orientada a objetos en JavaScript creando código reutilizable y más simplificado, que te permitirá afrontar en mejores condiciones el desarrollo de aplicaciones más complejas, como las que se requieren actualmente, tanto en la web como endispositivos con tecnologías basadas en HTML5.

Usando la programación orientada a objetos (POO) en tus proyectos no solamente podrás trabajar más cómodamente al enfrentarte a aplicaciones de mayor envergadura, sino que serás capaz de reutilizar mejor el código y de mantener en el futuro de una manera más sencilla.

¿Por que POO en JS?

Con la evolución de internet, el uso de JavaScript ha variado notablemente y hoy en día tanto la web como el desarrollo para dispositivos requiere de aplicaciones más complejas, elaboradas y con un ciclo de vida mayor. Ante este escenario cobra más sentido que nunca el desarrollar con una metodología que favorezca la simplificación de código, la abstracción, la reutilización y el mantenimiento. La POO nos ofrece todas estas características, y podemos tener acceso a ellas en JavaScript.

No obstante, el uso histórico que se ha dado al lenguaje durante muchos años, las importantes particularidades de un lenguaje basado en prototipos, sin un tipado estricto y sin palabras reservadas para trabajar con programación orientada a objetos, hace que dominar su uso no sea una tarea sencilla. Con este curso aprenderás a programar con POO en JavaScript, y además aprenderás a hacerlo bien.

Tanto si desarrollas para la web, como para dispositivos con tecnologías estándares como HTML5, cada día será más probable que tengas que enfrentarte a aplicaciones cada vez más complejas, que hacen que un enfoque de programación por procedimientos o funcional no sea el más adecuado.

Con este curso aprenderás a usar programación orientada a objetos en JavaScript, evitarás malas prácticas habituales, y lograras crear código reutilizable, sostenible y eficiente para tus proyectos basados en tecnologías web.

Descargar

Aplicaciones Asombrosas que te harán la vida más sencilla: Manejo de contraseñas Con Lastpass

0

Quiero dar inicio a un hilo de entradas denominado “Aplicaciones Asombrosas que te harán la vida más sencilla” para reseñar las aplicaciones que he tenido la oportunidad de usar y me han parecido asombrosas, prácticas, funcionales e intuitivas, en este caso y como el titulo lo indica: “Aplicaciones Asombrosas que te harán la vida más sencilla: Manejo de contraseñas Con Lastpass”.

La mayoría de los sistemas informáticos basan su seguridad en la validación de las credenciales de usuario a través de claves alfanuméricas: desde la cuenta de correo electrónico, pasando por las redes sociales, hasta llegar a tu cuenta bancaria, cada uno de estos sistemas requiere que tu acceso esté protegido por una contraseña secreta.

Por si no fuese poco que cada sistema tiene sus reglas particulares y métodos para verificar que estás creando una clave “segura” (cantidad de caracteres, no repetición, uso de mayúsculas, minúsculas, números, símbolos y hasta imágenes), hay algunas reglas básicas de la seguridad informática que todos deberíamos seguir, tales como:

  1. No es buena idea guardar las contraseñas en el navegador.
  2. No debes repetir una contraseña en dos sitios diferentes.
  3. Tu contraseña debe ser lo más aleatoria y compleja posible, tratando de no incluir datos o fechas personales e incluso evitando el uso de palabras.
  4. Es buena idea cambiar las contraseñas con cierta regularidad.
  5. Si el sitio web con el que estás trabajando tiene métodos de autenticación en dos pasos, ÚSALO (ejemplo: verificación de acceso a través de una llave USB o envío de un código a través de un SMS).
  6. No compartas tus contraseñas con otras personas.

Si aún no te aburriste de leer este artículo y has llegado hasta este punto, es muy probable que te hayas dado cuenta de que estás infringiendo algunas de estas reglas, si acaso no todas.

Creo que no es necesario explicar lo complejo que puede resultar el hecho de tener que generar contraseñas súper complejas y además vernos obligados a recordarlas para tipearlas constantemente. A menos que tengas memoria fotográfica, es virtualmente imposible.

En mi caso particular, adicional a mis propias claves de cuentas personales (que pueden ser tantas como 100 ó 200), como desarrollador web tengo que lidiar con un número indefinido de contraseñas, en constante cambio y que además debo compartir con mi equipo de trabajo. Cada nuevo proyecto requiere que se generen al menos 10 accesos: servidores web (desarrollo y producción), acceso al administrador de contenido, usuarios FTP, cuenta de correo del webmaster, documentos compartidos, acceso a redes sociales del cliente …y pare de contar. Es una pesadilla.

La solución a todo esto terminó siendo, de manera bastante irónica, crear una sola contraseña.

 

LastPass: la última contraseña que vas a necesitar recordar

LastPass es una plataforma web que aloja, encripta y protege todas tus contraseñas a través de una clave maestra, y que puedes utilizar tanto vía web como a través de un plugin/extensión en tu navegador, disponible para Chrome, Firefox, Safari, Internet Explorer y Opera, en Windows, Mac y Linux.

 

Es gratis e ilimitado en versión desktop y puedes utilizarlo de manera sincronizada en tantos equipos como desees.

Al momento de crear tu cuenta debes generar una contraseña con un nivel exageradamente alto de seguridad, pero que puedas recordar y tipear constantemente. Luego, ANÓTALA EN UN PAPEL y guarda ese papel en un lugar seguro (preferiblemente sin indicar que esa contraseña pertenece a LastPass).

La razón de esto es que si olvidas tu contraseña maestra, la aplicación no te va a enviar un correo para que hagas click en un enlace y vuelvas a generarlas (un método bastante inseguro que defraudaría el propio propósito de la aplicación) sino que te ofrecerá un solo intento para que la recuperes desde un equipo donde hayas utilizado LastPass anteriormente. Si fallas, hasta ahí llegó tu cuenta LastPass y perderás tanto la cuenta como todas las contraseñas que hayas albergado en él.

¿Cómo funciona?

El proceso de instalación y configuración es sumamente claro y sencillo.

Una vez instalada la extensión en tu navegador, el programa te permitirá migrar todas las contraseñas que tengas alojadas localmente, a tu perfil LastPass en la nube y luego te ofrecerá la opción de borrar las copias locales. Eso significa que, a menos que hayas hecho una copia manuscrita o en un documento de texto, todas tus contraseñas se encontrarán únicamente en LastPass, y a partir de ese momento, cada nueva contraseña que generes va a alojarse automáticamente en sus servidores, que cuentan con una protección encriptada de 256 bits.

 

Luego, cuando desees iniciar sesión en alguna de tus cuentas (por ejemplo, tu correo electrónico), la extensión del navegador va a desencriptar la contraseña adecuada y a “llenar” los campos asociados al login con la clave correspondiente. Todo eso con 1 click.

Recordar varias contraseñas para un mismo sitio web

Una de las grandes ventajas de LastPass, es que puedes alojar un número ilimitado de nombres de usuario y contraseñas para un solo sitio web, por ejemplo, es común que manejemos varios correos a través de Gmail y Google Apps (correo personal, trabajo, proyectos independientes, etc.) y con esta extensión podrás albergarlos todos sin que uno reemplace al otro.

Así, cada vez que necesites iniciar sesión en el correo, la aplicación te ofrecerá distintas opciones de usuario y contraseña que encajen con ese perfil de sitio web.

 

Creando nuevas contraseñas

Ya que no es necesario tener que recordar cada una de las contraseñas que has generado para cada cuenta que posees (puesto que LastPass se encarga de eso), el siguiente paso es dejar de reutilizar la misma contraseña en varios sitios y comenzar a generar claves más complejas, seguras y difíciles de hackear.

Para esto, LastPass cuenta con una función que genera cadenas alfanuméricas aleatorias con un solo click, permitiéndote elegir entre diferentes opciones, tales como la cantidad y tipo de caracteres, y hasta crear contraseñas pronunciables. Una vez que estés contento con tu nueva contraseña, esta quedará alojada en tu perfil y asociada a la cuenta para la cual la estás utilizando.

 

Compartir contraseñas de manera segura

Si trabajas con un equipo en el que todos deben tener acceso a una misma cuenta (por ejemplo, para acceder a un correo electrónico o redes sociales), el método usual es enviarse la contraseña unos a otros vía email y luego cada uno la “recuerda” en su navegador… lo cual resulta en una de las prácticas más inseguras que uno puede escoger, puesto que de la misma manera en que la fuerza de una cadena se mide por su eslabón más débil, basta que se vulnere la cuenta de email de una de estas personas o que su máquina sea infectada con un spyware que capture las contraseñas guardadas en el navegador para que todo se vaya al garete.

LastPass ofrece dos opciones para que puedas enviar una contraseña de la manera más segura posible (quitando, por supuesto, la comunicación verbal o anotando la clave en un papel que luego destruyes) con otro usuario LastPass:

  1. Compartir la contraseña: lo cual significa que estarás dando acceso limitado a otro usuario para que la utilice, pero no podrá visualizarla o modificarla en LastPass.
  2. Dar la contraseña: que te permite dar acceso completo y visualización de la misma, de manera que el otro usuario puede reutilizarla como lo desee. Por supuesto, este método no excluye que si alguien vulnera la cuenta de esa persona, la contraseña caiga igualmente en malas manos, pero es menos probable que esto ocurra en comparación con los métodos tradicionales.

 

Notas Seguras, datos bancarios y tarjetas de crédito

Aunque el manejo de contraseñas es su principal función, LastPass te permite también generar notas seguras que pueden ser de texto plano, datos para llenado automático de formularios y hasta información de tu tarjeta de crédito, de manera que no tengas que tipearla manualmente cada vez que la necesites (y así evitar posibles capturas de datos a través de “keyloggers”).

Seguridad

Como comenté anteriormente, LastPass cuenta con un sistema de encriptación de 256 bits (S256-bits AES), pero como al fin y al cabo el acceso a la aplicación depende de una nueva contraseña alfanumérica que también puede ser vulnerada, puedes ampliar la protección de tu cuenta maestra a través de diversas herramientas:

  • Cierre de sesión automático al momento de cerrar el navegador.
  • Cierre de sesión automático después de que haya transcurrido un límite de tiempo sin actividad.
  • Protección con re-introducción de contraseña maestra (que puedes aplicar a cuentas o notas individuales)
  • Blanqueado automático de “copiado en memoria” después de uso de contraseña.
  • Alertas vía email cuando se accede desde una nueva ubicación o cuando se han modificado los datos de alguna de tus cuentas.
  • Autenticación en varios pasos: que te permite bloquear el acceso a la cuenta a menos que se introduzcan los datos enviados a tu dispositivo o método de autenticación seleccionado (Google Authenticator, llaves USB Sesame o Yubikey, entre otros).

Gratis

Aunque LastPass es totalmente gratuito para utilizar en tu computador, su modelo de negocios es “freemium” lo que significa que: es gratis, pero si adquieres una licencia paga, tienes acceso a más características, tales como la aplicación para smartphones (disponible para Android, iOS, Windows, BlackBerry, WebOS y Symbian), así como mayores opciones de control para compartir contraseñas.

Después de más de un año con una licencia gratuita, hace pocos meses decidí pasarme al plan premium, no solo porque es increíblemente económico ($1 mensual) o porque la app móvil es realmente útil (puedes probarla durante 1 mes para ver si te convence), sino también para mostrar mi agradecimiento por esta fabulosa aplicación que me ha permitido recuperar un tiempo invaluable y me facilita el día a día.

LastPass cuenta con un sistema de lealtad que otorga 1 mes premium gratuito por cada nuevo usuario referenciado. Si te gustó este artículo y quieres instalar la aplicación, por favor utiliza el siguiente enlace al momento de registrarte y ayúdame a extender mi licencia (tú también ganas 1 mes premium gratis).

Ir al Registro y Descarga

Espero que lo disfruten y les da la misma paz mental que me da a mi.

Como diría Gandalf: “Keep it secret, keep it safe”

Fuente:camionetica.com

Conocimiento colectivo

0

Con el único fin de compartir y acrecentar el conocimiento colectivo, tenemos a los chicos de DescargasNsN – New. Softwarez. NetWork.

En su sitio web podrás descarga todo tipo de Archivos: Software, Programación, Diseño, Desarrollo, S.O, Antivirus, Mac, Peliculas, Musica, Juegos PC, Cursos Multimedia, eBooks, Tutoriales, y mucho mas….

Visítalos, aprende y comparte tus conocimientos.

Ir DescargasNsN

Popular

Programación: La psicología de las computadoras

Programación: La psicología de las computadoras

0
Programación: La psicología de las computadoras En un post anterior te mostramos porque todo el mundo debería de saber programar y es que todos nos...
Optimizar Sitios Wordpress

Optimizar Sitios WordPress

0
Hoy en día un atractivo aspecto de su sitio web o un contenido perfecto puede no ser suficiente para atraer a los usuarios potenciales....
Ponceelrelajado - Tips y Trucos Sublie Text

Trucos y Tips Sublime Text

0
Sublime text es uno de los editores de texto preferidos por los desarrolladores por la gran simplicidad, estética y cantidad de plugins disponibles en la comunidad, hoy dejamos un recopilatorio de Trucos y Tips Sublime Text.

SPOILER Temporada 7 de Game of Thrones + Trailer Oficial

0
¡Alerta de Spoiler! Si eres uno de esos fans impacientes de Game of Thrones y no puedes esperar hasta Julio para averiguar lo que sucede en...
Footer siempre abajo

Footer siempre abajo

8
Uno de los principales problemas a la hora de desarrollar o diseñar un sitio o sistema web es la ubicación del footer. Cuando se tiene...

Videojuegos

10 videojuegos que deberían convertirse en películas por sus historias

10 videojuegos que deberían convertirse en películas por sus historias

0
En posts anteriores ya te hemos hemos escrito de videojuegos, aunque no me considero una gamer, si no mas bien una jugadora ocasional, la verdad es que he tenido la oportunidad de probar algunos...
videojuegos de sociedades distópicas

5 videojuegos de sociedades distópicas que muestran el futuro decadente de la humanidad

0
En un post anterior te listamos lo que a nuestro parecer, son juegos que deberían de ir la gran pantalla, sin embargo, pesar de la gran lista de títulos que existen, hemos notado que...

Más Leído