jueves, 30 de enero de 2014

Globalización en Master Pages

Esta entrada tratará sobre cómo incluir la globalización en Master Pages en asp.net de manera independiente. En el ejemplo utilizaremos código C#.


3 pasos:


Establecer la cultura en el Global.asax

Utilizaremos cookies para guardar el valor de la currentculture en el manejador BeginRequest.




protected void Application_BeginRequest(object sender, EventArgs e)

HttpCookie cookie = Request.Cookies["CultureInfo"];

if (cookie != null && cookie.Value != null)

Thread.CurrentThread.CurrentUICulture = new CultureInfo(cookie.Value);
Thread.CurrentThread.CurrentCulture = new CultureInfo(cookie.Value);

else

Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-ES");
Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");




Este código lee la información del actual culture y lo establece en la cookie, si la cookie no está establecida entonces pone la cultura por defecto es-ES.


Usar un desplegable para cambiar la cultura en el MasterPage

En nuestro ejemplo usaremos un dropdownlist para cambiar la cultura:




<asp:DropDownList ID="ddlLanguage" runat="server"
OnSelectedIndexChanged="ddlLanguage_SelectedIndexChanged"
AutoPostBack="true">
<asp:ListItem Text="<%$ Resources:Resource, users_Spanish %>" Value="es-ES" />
<asp:ListItem Text="<%$ Resources:Resource, users_French %>" Value="fr-FR" />
</asp:DropDownList>


Manejaremos el evento SelectedIndexChanged en el codebehind:




protected void ddlLanguage_SelectedIndexChanged(object sender, EventArgs e)

//Establecemos la cookie que será usada en el Global.asax
HttpCookie cookie = new HttpCookie("CultureInfo");
cookie.Value = ddlLanguage.SelectedValue;
Response.Cookies.Add(cookie);

//Establecemos la cultura en el currentthread y refrescamos la página.
//Global asax se encargará del siguiente trabajo.
Thread.CurrentThread.CurrentCulture =
new CultureInfo(ddlLanguage.SelectedValue);
Thread.CurrentThread.CurrentUICulture =
new CultureInfo(ddlLanguage.SelectedValue);
Server.Transfer(Request.Path);



En este paso establecemos el valor de la nueva cultura y volvemos a recargar la página mediante el comando Server.Transfer.


Mostrar la cultura actual seleccionada en el dropdownlist en el MasterPage

En este punto solamente queda mostrar cual es la cultura actual seleccionada. Lo haremos con el siguiente código:




protected void Page_Load(object sender, EventArgs e)

if (!Page.IsPostBack)

ddlLanguage.SelectedValue = Thread.CurrentThread.CurrentCulture.Name;





Globalización en Master Pages

miércoles, 29 de enero de 2014

Crear ficheros de recursos de localización en ASP NET

Para crear ficheros de recursos de localización en ASP.NET es necesario tener una carpeta especial de ASP.NET llamada App_GlobalResources o App_LocalResources dependiendo si queremos archivos locales o globales dentro de nuestra aplicación.


Visual Studio te permite crear esta carpeta de una manera sencilla: botón derecho encima de la raíz de tu sitio web y después pinchar en Add->Add ASP.NET Folder->App_GlobarResources.


Recursos Localizacion ASPNET


Una vez hecho esto crearemos nuestro primer fichero de recursos para el idioma neutro, esto es, el que usaremos por defecto para la aplicación. Para hacer este paso pulsaremos botón derecho sobre el directorio que acabamos de crear y añadiremos un archivo de tipo recurso (.resx). El nombre que le demos es el que utilizaremos más tarde para recuperar sus valores. En este caso le llamaremos “res.resx”.


Una vez abierto en este fichero podremos insertar pares de clave y valor donde el valor es la traducción y la clave el identificador unívoco para obtener la traducción.


Podemos crear tantos archivos de recursos como idiomas queramos en nuestro sitio web, para ello podemos copiar el fichero original y pegarlo dentro del mismo directorio: App_GlobalResources pero teniendo en cuenta que el nombre de cada fichero es el que determinará el idioma correspondiente. Por ejemplo para el idioma inglés el nombre del fichero en nuestro caso será “res.en.resx”, en francés sería “res-fr-resx”…


Una vez metida una misma clave en cada fichero con las traducciones correspondientes en la casilla valor podemos empezar a utilizar las traducciones.


Por ejemplo en un fichero aspx:




...

<asp:Literal runat="server" Text="<%$Resources:res,default_bienvenido%>" />

...


Este ejemplo nos escribe un literal y el texto se va a buscarlo a la clave de nombre “default_bienvenido” que exista en el fichero de recursos “res”. Si no encuentra la clave para un fichero de un determinado idioma entonces cogerá la del idioma neutral y si no escribirá directamente la clave.



Crear ficheros de recursos de localización en ASP NET

martes, 28 de enero de 2014

Instalar Foundation para ASP.NET MVC

En esta entrada se explicará cómo instalar Foundation para ASP.NET MVC.


Se hará directamente sobre Visual Studio instalando el paquete NuGet. Para ello dentro del Visual Studio iremos a Tools->Library Package Manager->Package Manager Console. De esta forma se abrirá la consola de administración de librerías.


Package Manager Console


En la consola escribiremos: PM> Install-Package Foundation5.MVC y directamente se descargará de internet el paquete de foundation.



Instalar Foundation para ASP.NET MVC

lunes, 27 de enero de 2014

Fondo personalizado en Outlook

Un diseño de fondo personalizado en Outlook te permite crear plantillas para cada mensaje de correo electrónico. Es algo más que una firma ya que permite crear cabecera y texto que por defecto se incluirá en cada nuevo mensaje.


Para crear el fondo lo primero que hay que hacer es diseñarlo por primera vez en un mensaje de correo.


  1. Crear un mensaje nuevo. Una vez realizado todos los pasos se podrá descartar este mensaje.

  2. Personalizar el mensaje con imágenes, colores de fondo, líneas, viñetas y demás elementos.

  3. Cuando esté el mensaje preparado pincharemos en Archivo -> Guardar como

  4. En la barra de direcciones del cuadro de diálogo Guardar como escribiremos %appdata%\microsoft\stationery y a continuación intro. De esta manera se abrirán la carpeta Diseños de fondo.

  5. En cuadro Nombre de archivo, escribiremos un nombre para el nuevo diseño y lo guardaremos como tipo HTML.

A partir de ahora en outlook podremos ver el nuevo fondo dentro de las opciones de Outlook para los mensajes pudiéndolo aplicar por defecto a cada nuevo correo electrónico.



Fondo personalizado en Outlook

Fondo personalizado en Outlook

Un diseño de fondo personalizado en Outlook te permite crear plantillas para cada mensaje de correo electrónico. Es algo más que una firma ya que permite crear cabecera y texto que por defecto se incluirá en cada nuevo mensaje.


Para crear el fondo lo primero que hay que hacer es diseñarlo por primera vez en un mensaje de correo.


  1. Crear un mensaje nuevo. Una vez realizado todos los pasos se podrá descartar este mensaje.

  2. Personalizar el mensaje con imágenes, colores de fondo, líneas, viñetas y demás elementos.

  3. Cuando esté el mensaje preparado pincharemos en Archivo -> Guardar como

  4. En la barra de direcciones del cuadro de diálogo Guardar como escribiremos %appdata%\microsoft\stationery y a continuación intro. De esta manera se abrirán la carpeta Diseños de fondo.

  5. En cuadro Nombre de archivo, escribiremos un nombre para el nuevo diseño y lo guardaremos como tipo HTML.

A partir de ahora en outlook podremos ver el nuevo fondo dentro de las opciones de Outlook para los mensajes pudiéndolo aplicar por defecto a cada nuevo correo electrónico.



Fondo personalizado en Outlook

domingo, 26 de enero de 2014

Explicación sencilla de MVC

MVC significa Model-View-Controller, en castellano: modelo-vista-controlador y es un patrón para desarrollar aplicaciones que se supone (y yo creo que efectivamente es así) para facilitar su mantenimiento.


Las apliaciones MVC contienen:


  • Modelos: son clases que representan los datos y efectúan toda la lógica de negocio. Es decir son los objetos menos visibles de una aplicación web (el usuario no saben que están ahí) pero son los que hacen el trabajo “sucio”: insertar, modificar y eliminar datos en la base de datos, validar que los datos introducidos son correctos, realizar modificaciones en ficheros, etc.

  • Vistas: son plantillas que después de ser rellenadas por datos del modelo generan la respuesta HTML al navegador.

  • Controlador: son los intermediarios entre los anteriores elementos. Organizan las peticiones del navegador para recuperar los datos del modelo y especificar que vista se utilizará en cada caso concreto.

Diagrama modelo vista controlador


Esto ha pretendido ser una explicación sencilla de MVC, espero haberlo conseguido.



Explicación sencilla de MVC

sábado, 25 de enero de 2014

Crear nuevo proyecto ASP Net MVC

En este post trataremos de explicar como crear un nuevo proyecto ASP.NET MVC.


Los pantallazos de esta entrada están tomados de Visual Studio 2010 Ultimate pero el proceso de creación para otras versiones de Visual Studio es similar.


Lo primero que debemos hacer una vez abiero Visual Studio es ir a Archivo -> Nuevo -> Proyecto


ASPNET MVC NUEVO


Aparecerá una ventana en la que nos dejará elegir el tipo de proyecto. Del menú de la izquierda seleccionaremos Web y en el cuerpo de la ventana podremos elegir ASP.NET MVC Web Application o bien ASP.NET MVC Empty Web Application.


Nuevo proyecto MVC


La diferencia entre ambas es que para la primera vienen implementadas ciertas funcionalidades mientras que para la segunda únicamente crea el “esqueleto” de una aplicación MVC.


En ambos casos se crean las referencias a las librerías MVC de .Net necesarias para su uso.


Nosotros seleccionaremos la primera opción: ASP.NET MVC Web Application.


Es posible que dependiendo de tu versión de Visual Studio te pregunte en este punt o si deseas crear un proyecto dentro de la solución para tests, esto lo seleccionarás si deseas hacer código de pruebas.


Una vez hecho todo esto Visual Studio creará por medio de una plantilla toda una estructura de carpetas y ficheros necesarios para la correcta implementación de un proyecto MVC:


ASPNET MVC Estructura inicial



Crear nuevo proyecto ASP Net MVC

viernes, 24 de enero de 2014

Obtener índice seleccionado de un tab con jquery

Si tenemos una pestaña y queremos obtener índice seleccionado de un tab con jquery puedes probar:



...
var current_index = $("#tabs").tabs("option","selected");
...

En caso de que no funcione es porque en la versión más reciente de jquery se utiliza lo siguiente:



...
var current_index = $("#tabs").tabs('option', 'active');
...

Donde #tabs es el id de la capa que contendrá las pestañas con jquery.



Obtener índice seleccionado de un tab con jquery

jueves, 23 de enero de 2014

Red no identificada en Windows

Me encontré un problema en Windows 7 que me impedía conectarme a internet e incluso a la red local mediante cable con una tarjeta de red ethernet integrada en una placa base. Al intentar conectar en el centro de redes de windows me aparecía como conectado a una red no identificada y con una ip muy extraña 169.xxx.xxx.xxx.


Lo primero que intenté fue cambiar la ip dinámica a una estática pero el problema persistía y lo más extraño es que el ipconfig me daba la misma ip extraña: 169.xxx.xxx.xxx.


Al investigar por internet en mil foros se hablaba de ciertas soluciones que aparentemente parecía que podían funcionar: el servicio bonjour, de ipconfig/renew, reinicio del router…


Lo probé todo pero aún así seguía el mismo problema.


Yo estaba convencido de que el problema iba a ser Windows pero al arrancar con un linux booteable pude comprobar que… ¡la tarjeta no podía conectar!


Así que le metimos una tarjeta PCI y por fin se conectó.


red no identificada en windows


Por lo que he visto por internet el error “Red no identificada en Windows” puede ser debido a muchos motivos pero si ves que ninguno te soluciona el problema es posible que tu tarjeta de red esté rota.



Red no identificada en Windows

miércoles, 22 de enero de 2014

Problema con git en windows - fatal: could not read password

Primero vamos a ponernos en la situación que me encontraba:


Había instalado NetBeans  7.4 (versión php) y tenía un proyecto al que quería hacer un control del código fuente. Por suerte en esta versión de NetBeans existía un plugin instalado de git con lo que en principio todo iba a parecer fácil…


Decidí instalar el repositorio origen en un servidor de internet y pronto me decidí por bitbucket.org. Allí me registré y me dispuse a crear un repositorio para luego trabajar en local y subir los cambios a este servidor.


Cuando en bitbucket le das a comenzar me da la opción de crear un repositorio vacío o subir un repositorio existente desde un equipo local, esta última opción era la que yo quería porque el proyecto estaba ya bastante avanzado. Según me indicaba el propio bitbucket debía introducir las siguientes líneas:




$ cd /path/to/my/repo

$ git remote add origin https://usuario@bitbucket.org/usuario/repositorio.git

$ git push -u origin --all

$ git push -u origin --tags


Las dos primeras líneas se ejecutaron sin ningún problema pero cuando llegué a la tercera me topé con el siguiente error:


fatal: could not read Password for ‘https://usuario@bitbucket.org’: No such file or directory


Después de buscar soluciones por internet encontré esta herramienta.


Se trata de una consola parecida pero que te permite ejecutar estos comandos sin ningún problema.



Problema con git en windows - fatal: could not read password

martes, 21 de enero de 2014

Autorización de urls en ASP.NET

http://weblogs.asp.net/gurusarkar/archive/2008/09/29/setting-authorization-rules-for-a-particular-page-or-folder-in-web-config.aspx


La autorización de ASP.NET permite controlar el acceso a los recursos por parte de un usuario autenticado. Es decir podemos establecer si un usuario o grupo de usuarios tendrá posibilidad de acceder a una url en concreto.


Para ello se pueden establecer por cada directorio o archivo los permisos necesarios para acceder a él.


Todos sabemos que se pueden establecer reglas de reescritura mediante un web.config. A mi parecer la autorización de urls en asp.net está mal llamado por Microsoft porque lo que en realidad se controla es el acceso a un fichero o directorio determinado (es decir un recurso físico, no urls como tal).


Para establecer permisos en un sitio web se utilizarán los ficheros de configuración web.config. A continuación vamos a introducir algunos ejemplos que indican el funcionamiento de la autorización de urls en ASP.NET.


  • Denegar usuarios anónimos a toda la web. En el web.config del sitio:



<system.web>

...
<authorization>
<deny users="?"/> //acceso denegado a usuarios anónimos
</authorization>

</system.web>


  • Acceso denegado a usuarios anónimos pero posibilidad de acceso de uno a una página determinada



...

<configuration>

<system.web>

<authorization>
<deny users="?"/> //restringir usuarios anónimos
</authorization>

</system.web>

<location path="registro.aspx"> //página a la que se aplicarán las siguientes configuraciones

<system.web>

<authorization>
<allow users="*"/> // esto permitirá el acceso a cualquier usuario anónimo
</authorization>

</system.web>

</location>

</configuration>


  • Dar permiso a un usuario en concreto y denegar a todos los demás:



<location path="usuario_con_privilegios.aspx">

<system.web>

<authorization>

<allow users="premium"/> // acceso permitido a usuario_premium
<deny users="*"/> // acceso denegado a todos los demás

</authorization>

</system.web>

</location>





  • Permitir a usuarios con un determinado rol



<location path="DirectorioAdmin">

<system.web>
<authorization>

<allow roles="Admin"/> //Acceso permitido para usuarios con rol Admin
<deny users="*"/> // Acceso denegado a todos los demás

</authorization>
</system.web>

</location>

<location path="CustomerFolder">

<system.web>
<authorization>

<allow roles="Admin, Clientes"/> //Acceso permitido a usuarios con roles admin o clientes
<deny users="*"/> // Acceso denegado a todos los demás

</authorization>
</system.web>

</location>


  • Es posible también establecer reglas en un web.config por cada directorio. Es decir tener un fichero web.config para cada directorio.



<configuration>

<system.web>

<authorization>
<allow roles="Admin"/> //Acceso permitido a usuarios con el rol Admin
<deny users="*"/> // prohibir acceso a todos los demás
</authorization>

</system.web>

</configuration>


Reglas

Hay que tener en cuenta de cómo se aplican las reglas:


  • Las reglas contenidas en archivos de configuración en la aplicación tienen prioridad sobre las reglas heredadas. El sistema determina la regla que tiene prioridad creando una lista combinada de todas las reglas de una dirección URL, con las reglas más recientes (más arriba en la jerarquía) al principio de la lista.

  • Dado un conjunto de reglas combinadas para una aplicación, ASP.NET comienza al principio de la lista y comprueba las reglas hasta que encuentra la primera coincidencia <allow users=”*”/> que autoriza a todos los usuarios. (Esta regla se aplica en último lugar de forma predeterminada.) Si no coincide ninguna otra regla de autorización, se permite la solicitud. Si se encuentra una coincidencia y ésta es un elemento deny, la solicitud se devuelve con el código de estado 401 HTTP. Si coincide un elemento allow, el módulo permite que se siga procesando la solicitud.


Autorización de urls en ASP.NET

lunes, 20 de enero de 2014

Depuración php con NetBeans

Este post intentará explicar de una manera sencilla cómo conseguir la depuración php con NetBeans en Windows.


Antes de nada me gustaría decir que he intentado depurar php en Eclispse y no lo he conseguido. Tras treinta minutos de desesperación y leyendo por ahí temas en foros he descubierto que la mejor herramienta para trabajar en php es netbeans y no perderse entre las múltiples variaciones y versiones que ofrece Eclipse. No digo que en Eclipse no se pueda pero creo que si tienes un proyecto php es mejor utilizar NetBeans.


  1. Instalar NetBeans. Para empezar lo primero que debes hacer es bajarte, si no la tienes ya, la última versión de NetBeans. En este ejemplo me bajé la versión NetBeans IDE 7.4 optimizada para php en la página oficial de NetBeans.

  2. Configurar NetBeans. Una vez instalado debemos ir a Tools->Options. En la ventana seleccionaremos PHP y la pestaña General. Si no tenemos seleccionado el intérprete deberemos buscarlo. Se trata del ejecutable php.exe. La ubicación de este archivo depende de donde hiciste la instalación. En mi caso al instalar xampp estaba dentro de la raíz de xampp en la carpeta php.NetBeans-PHP-Depuracion

  3. Editar el fichero php.ini. En la misma carpeta encontrarás el fichero php.ini. Haz una búsqueda dentro del archivo de xdebug y verás que se encuentran comentadas algunas líneas dentro de esa sección. Hay que descomentar las siguientes:

zend_extension_ts=”C:/xampp/php/php_xdebug.dll”


xdebug.remote_enable=1


Nota: debes de tener el archivo php_xdebug.dll que es la librería que php usa para la depuración. Si no es así puedes bajartela aquí.


Una vez realizado todo esto ya tienes el entorno para poder depurar preparado.


depuracion-php-netbeans



Depuración php con NetBeans

Redireccionar url en función del navegador en Apache

En ocasiones es necesario añadir reglas de redireccionamiento dependiendo el navegador que utilice nuestro cliente web.


Para ello podemos utilizar el archivo .htaccess e indicar unas directivas en función del navegador que se esté utilizando el cliente.


El siguiente bloque escrito en htaccess puede ser muy útil si tienes sitios que no se muestran correctamente en navegadores viejos y obsoletos:




<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %HTTP_USER_AGENT "MSIE 8" [or]
RewriteCond %HTTP_USER_AGENT "MSIE 7" [or]
RewriteCond %HTTP_USER_AGENT "MSIE 6"

RewriteRule . actualizar-navegador.html [L]


Con esto le estamos diciendo que si el navegador del cliente en Internet Explorer 6, 7 u 8 vaya a una página especial donde le podremos indicar al usuario que necesita actualizar el navegador.




<!DOCTYPE html>

<body>

<div>

...

necesita actualizar el navegador para visualizar correctamente la página, para ello visite los siguientes links...

</div>

</body>

</html>


Redireccionar url en función del navegador en Apache permite también ocultar el acceso a ciertos navegadores. Esto puede ser útil en empresas que tienen intranets y obligan a sus empleados a utilizar un único navegador por seguridad.



Redireccionar url en función del navegador en Apache

domingo, 19 de enero de 2014

Diferencias entre autenticación y autorización

En muchas ocasiones no se llega a distinguir las palabras o términos que más se utilizan en el mundo del software o Internet.


Un ejemplo podría ser las diferencias entre autenticación y autorización que son fundamentales en el desarrollo del software.


  • La autenticación es el proceso por el cual se identifica un cliente (persona) como válida para posteriormente acceder a ciertos recursos definidos.

  • La autorización es el proceso sobre el cual se establecen que tipos de recursos están permitidos o denegados para cierto usuario o grupo de usuarios concreto.

Podríamos poner un ejemplo de un usuario que se autentifique (identificado) en una aplicación pero que no tenga acceso a ningún recurso porque no está autorizado a ello. Esto sería como que tu presentaras tus credenciales en un sitio web y al acceder a tu panel de administración no podrías realizar ninguna acción. En realidad este caso sería un caso poco realista pero serviría para explicar cual es la diferencia entre autenticación y autorización.


La autorización tiene mucho que ver con perfiles y roles de usuarios. Lo normal es que al diseñar una aplicación existan muchos tipos de usuario que englobemos en distintos perfiles: por ejemplo: administrador, editor, invitado…


Estos usuarios tendrán acceso a distintos recursos según sea el perfil al que pertenezcan. Un administrador de un sistema, por ejemplo, tendrá acceso a todos los recursos que ofrezca la aplicación. Hablamos de recursos como todos los recursos, no solamente los contenidos sino también ficheros, servicios, etc. que se encuentren en el servidor web o incluso fuera de él.


Existen hasta modos de establecer que nivel de autorización tiene un usuario que no está autenticado, es decir, un invitado de un sitio web a veces puede tener acceso a muchos pero no todos los recursos.


Diferenciar estos dos conceptos es importante para un desarrollador sobretodo a la hora de buscar documentación.



Diferencias entre autenticación y autorización

sábado, 18 de enero de 2014

Autenticación en ASP.NET con IIS

Autenticación es el acto de validar la identidad de un cliente. Una vez autenticado un cliente podemos controlar el acceso de este cliente a los recursos. Para autenticarse, el cliente debe establecer unas credenciales (usuario y contraseña) que indique unívocamente quien es.


En ASP.NET existen estos tipos de autenticaciones:


  • Autenticación Windows, utiliza servicios propios del sistema operativo, de usuarios del sistema o incluso de red (directorio activo).

  • Autenticación basada en formularios, a través de un formulario de acceso se gestiona el inicio de sesión y la autenticación de un cliente. Es uno de los métodos de autenticación más comunes ya que para aplicaciones que requieran de autenticación en Internet no es lógico utilizar la autenticación Windows.

  • Passport, sirve para utilizar un único inicio de sesión en varios dominios. Es decir es parecido a lo que utiliza Google para todos sus servicios, cuando estas autenticado en un servicio puedes acceder a otro sin tener que dar tus credenciales de nuevo.

Autenticación Windows

Dentro de la autenticación Windows a su vez se encuentran estos subtipos:


  • Anónima, no se le pide directamente al cliente ningún tipo de credenciales.

  • Básica, el navegador solicita al cliente el usuario y contraseña. De manera predeterminada la cuenta enviada debe tener privilegios de inicio de sesión en el servidor web. Es decir es como si nos autenticaramos directamente en el servidor web. Este método de autenticación no es muy seguro ya que se envía mediante http y el método de codificación de la información es relativamente fácil revertirlo.

  • Implícita, es similar a la autenticación básica pero el algoritmo que codifica la información por http es más seguro. Mientras que la autenticación básica utiliza Base64 la autenticación implícita utiliza un digest o hash que es mucho más segura.

  • Autenticación de Windows Integrada, la autenticación de Windows integrada es la mejor opción cuando se utiliza una aplicación web de intranet donde los usuarios tienen cuentas de dominio de Windows. En estos casos la autenticación se realiza automáticamente sin que el cliente tenga que introducir sus credenciales.

  • Autenticación mediante certificados de cliente, un certificado es una instrucción que contiene información sobre una entidad y su clave pública en un grupo. Los certificados pueden contener aparte otros datos. 


Autenticación en ASP.NET con IIS

viernes, 17 de enero de 2014

Conocer ruta logs y tmp del servidor en producción

Si el desarrollo de tu sitio web joomla! lo has realizado en tu equipo local puede ser que en el momento de subirlo a producción tus rutas hacia las carpetas logs y tmp no sean las correctas.


Para averiguar la nueva ruta física completa donde se encuentran dichos directorios puedes crearte un nuevo fichero php como por ejemplo ruta.php con el siguiente código:



<?php echo __FILE__; ?>


Este fichero le colocarás por ejemplo en la raíz de tu directorio html de tu servidor hosting mediante ftp y posteriormente accederás a la ruta del tipo:


www.nombredetudominio.es/ruta.php


En la pantalla del navegador podrás visualizar la ruta física que utilizarás para configurar las rutas hacia las carpetas logs y tmp editable desde la opción de menú configuración global o directamente sobre el archivo configuration.php de tu sitio joomla!


En la comprobación que permite joomla! se establecen entre otras cosas la ruta logs y tmp del servidor marcando como erróneo cuando estas no tienen los permisos suficientes.



Conocer ruta logs y tmp del servidor en producción

jueves, 16 de enero de 2014

Manejo y registro de errores php en tiempo de ejecución

Es posible que al ejecutar un sitio web php con apache aparezcan en pantalla errores de tipo notice, warning, error…


El modo en que se muestran o advierten al usuario es lógicamente administrable a través de sus ficheros de configuración.


Antes de nada hay que aclarar que php ofrece distintos niveles de manejo de errores y logging.


Las constantes de nivel de errores

Los niveles de error en php son:


  • E_ALL: todos lo errores y advertencia.

  • E_ERROR: errores fatales en tiempo de ejecución.

  • E_RECOVERABLE_ERROR:  errores en tiempo de ejecución capturable. Si no se captura pasa a ser de tipo E_ERROR.

  • E_WARNING: advertencias en tiempo de ejecución. (no son errores fatales).

  • E_PARSE: errores en tiempo de compilación.

  • E_NOTICE: avisos en tiempo de ejecución (son advertencias que suelen derivar de bugs en el código, pero que son posiblemente intencionados).

  • E_STRICT: avisos en tiempo de ejecución para que php sugiera cambios en el código para asegurar compatibilidad con dicho código

  • E_CORE_ERROR: errores fatales que ocurren durante la inicialización de php.

  • E_CORE_WARNING: advertencias que ocurren durante el arranque de php.

  • E_COMPILE_ERROR: errores fatales en tiempo de compilación.

  • E_COMPILE_WARNING: advertencias en tiempo de compilación.

  • E_USER_ERROR: mensajes de error generados por el usuario mediante el código.

  • E_USER_WARNING: mensajes de advertencia creados por el usuario.

  • E_USER_NOTICE: mensajes de aviso creados por el usuario por código.

  • E_DEPRECATED: aviso sobre una parte de código que no será funcional en versiones futuras de php.

  • E_USER_DEPRECATED: aviso generado por el usuario que no será funcional en posteriores versiones de php.

Estos errores se mostrarán o no dependiendo de la configuración de php.ini. Este fichero se encuentra en la instalación típica de php dentro de Apache.


Los parámetros más importantes que se utilizan para configurar el manejo de errores  y logs son:


  • error_reporting

  • display_errors

Con error_reporting podemos establecer qué nivel o niveles de errores se mostrarán de todos los que hemos expuesto anteriormente.


Los valores más comunes para la configuración de este parámetro son:


  • Valor por defecto en la mayor parte de instalaciones:

error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE

  • Valor idóneo para etapas de desarrollo:

error_reporting=E_ALL

  • Valor sugerido para producción:

error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT

Con la directiva display_errors podemos decidir si queremos que los errores se muestren en las páginas (en forma de html) a la hora de visualizar el resultado de nuestro código php. Esto puede ser muy útil cuando se trabaja en local o en proyectos que aún no están subidos a producción pero es totalmente indeseable cuando la web está desplegada en producción. Elegir una de las dos:


display_errors=On; Esta configuración mejor en desarrollo
display_errors=Off ; Esta configuración en producción


Manejo y registro de errores php en tiempo de ejecución

Aplicación de encuestas en php

Si necesitáis implementar un sitio web que gestione encuestas os aconsejo LimeSurvey.


Es gratuita y permite una amplia configuración que puede adaptarse a las necesidades de cualquier tipo de encuesta.


No creo que sea la única aplicación de encuestas en php pero de momento es la que más me ha convencido.


aplicacion-encuestas


Si encontráis alguna mejor no dudéis en indicarlo por favor!!!



Aplicación de encuestas en php

miércoles, 15 de enero de 2014

Configurar Virtual Host con Apache en Windows

Al montar Apache en Windows puede ser que te encuentres con el problema de descargar un sitio web que funciona correctamente en el servidor pero que al ejecutarlo en local (aunque sí que cargue) pierde estilos, enlaces, javascript y más cosas. Es posible que las rutas que utiliza ese código sean rutas relativas y al situarlo físicamente en tu workspace deje de funcionar.


La solución a este problema tiene un nombre: Virtual Hosts. Con este módulo se permite configurar múltiples sitios dentro de un mismo servidor dándoles los nombres que deseemos.


Existen numerosas formas de configuraciones de virtual hosts en Apache, yo trataré en este post de explicar la forma más común de configuración que consiste en crear varios hosts virtuales dentro de una misma dirección IP. (Si deseas más información puedes acceder a la página de documentación de Apache donde existen numerosos ejemplos).


Comencemos por editar el archivo de configuración de apache httpd-vhosts.conf. Este fichero se encuentra dentro de la ruta donde tengas instalado Apache dentro de la ruta apache\conf\extra. 




<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/ejemplo1.com"
ServerName ejemplo1.com</VirtualHost>

<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/ejemplo2.com"
ServerName ejemplo2.com

</VirtualHost>

...


Hasta este punto tendremos configurado Apache para albergar diversos sitios web con distinto nombre dentro de este servidor. Nos falta un segundo paso que nos permitirá que cuando introduzcamos en el navegador el nombre de uno de los sitios locales no se vaya a Internet a buscarlos sino a la ruta que nosotros le hemos establecido.


  • Ir a c:\windows\system32\drivers\etc\ y editar con el bloc de notas el archivo hosts

  • Insertar al final:



127.0.0.1 localhost
127.0.0.1 ejemplo1.com

127.0.0.2 ejemplo1.com


Escribiremos tantas líneas con los nombres de sitio como queramos acceder localmente.


Ahora solamente deberás abrir el navegador y meter la url que has establecido como servername, por ejemplo: local.ejemplo1.com 



Configurar Virtual Host con Apache en Windows

martes, 14 de enero de 2014

cannot modify header information

Si se produce el siguiente error en PHP:
PHP Warning: Cannot modify header information – headers already sent by


Asegurate de que el fichero que te está produciendo el error no está enviando código html al servidor. Esto quiere decir que hay que tener mucho cuidado con todo, no solo los echo sino también espacios en blanco que el intérprete php pueda considerar código html.


Este error se suele producirse con relativa asiduidad cuando desde el código hacemos un




...

<html>
<?php
/* Esto producirá un error. Fíjese en el html
* que se muestra antes que la llamada a header() */
header('Location: http://www.example.com/');
exit;
?>

...



cannot modify header information

lunes, 13 de enero de 2014

Centrar menu en Foundation

Este post indicará la manera de como centrar menu en Foundation.

Por defecto Foundation no permite centrar un menú en su framework.

Tenemos el siguiente marcado html:



<nav id="mi_menu" data-topbar="">
<ul>
<ul>
<ul><!-- Title Area --></ul>
</ul>
</ul>
<!-- Remove the class "menu-icon" to get rid of menu icon. Take out "Menu" to just have icon alone -->
<ul>
<li><a><span>Menu</span></a></li>
</ul>
<section>
<ul>
<li><a href="#">HOME</a></li>
<li><a href="#" target="_blank">BLOG</a></li>
<li><a href="#" target="_blank">SHOP</a></li>
</ul>
</section></nav>

Para centrar el menú podemos utilizar el siguiente código en css:




@media only screen and (min-width: 40.063em)
#mi_menu
width: 100%;
height: 3em;
margin: 0;
text-align: center;



#mi_menu .nav-bar
height: auto;
margin: 0;
padding: 0;
display: inline-block;





Centrar menu en Foundation

domingo, 12 de enero de 2014

Iconos vectoriales para Web

El otro día descubrí un sitio que permite descargarte iconos vectoriales para web.


Se llama fontawesome y te ofrece iconos altamente personalizables – tamaño, color, sombra y cualquier otra cosa en base a css.


En realidad lo que te descargas es una fuente en distintos formatos (svg, ttf, otf, woff, eot)  que te asegura la legibilidad en prácticamente el 100% de navegadores. La fuente  contiene más de 300 iconos representados por un identificador en su propiedad content de css:




.fa-envelope-o:before
content: "\f003";



También contiene los ficheros para estilos dinámicos con sass y less.


Es muy sencillo de utilizar y personalmente los considero muy apropiados para muchas webs. El problema que veo es que este estilo de iconos se están poniendo muy de moda en muchos sitios web haciendo que parezcan todos muy similares.



Iconos vectoriales para Web

sábado, 11 de enero de 2014

text-decoration none no funciona

El otro día tuve un problema con un enlace en html cuyo text-decoration none no funciona.


Quería que el enlace en cuestión quitara el subrayado cuando el ratón pasara por encima y le apliqué el siguiente estilo css a su clase:




...

text-decoration:none;

...


Era muy extraño pero esto no funcionaba así que decidí aplicárselo al elemento directamente con firebug pero… ¡seguía sin funcionar!


Después de darle muchas vueltas llegué a pensar que se le estaba aplicando este estilo a través de javascript pero la solución era la hoja de estilos ya que no me había percatado de que se le estaba poniendo un border-bottom:




...

border-bottom: 1px solid black;

...


Simplemente le quité esta propiedad y conseguí solucionar el problema.



text-decoration none no funciona

viernes, 10 de enero de 2014

Componentes y controles en Android (GUI Widgets)

En este post explicaremos algunos componentes de la interfaz llamados también GUI Widgets o controles. Componentes de este tipo serían por ejemplo: cajas de texto, botones, calendarios… Los widgests se pueden insertar en los diferentes layouts que explicamos en el post anterior.


Los componentes estarán disponibles en la barra de herramientas del diseñador de Eclipse. Cada componente estará asociado a una clase Java disponible en la documentación JavaDoc.


Entre los más usados se encuentran los siguientes controles:


  • Botón: android.widget.Button

  • Calendario: android.widget.CalendarView

  • CheckBox: android.widget.CheckBox

  • Selección de fechas: android.widget.DatePicker.

  • Caja de texto: android.widget.EditText

  • Botón con imagen: android.widget.ImageButton

  • Image: android.widget.ImageView

  • Información de progreso: android.widget.ProgressBar

  • RadioButton: android.widget.RadioButton

  • Menú desplegable: android.widget.Spinner

  • Etiqueta de texto: android.widget.TextView

Cada widget contiene sus propios atributos y eventos, por ejemplo, el widget botón tiene, entre otras, una propiedad para establecer el texto del botón así como un evento de pulsación mientras que el widget caja de texto puede establecer mediante la propiedad inputType el tipo de entrada que permite introducir (numérico, fecha, email…).


Un ejemplo común de un widget en marcación xml sería por ejemplo:




<Button
android:id="@+id/dummy_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Enviar" />



Componentes y controles en Android (GUI Widgets)

jueves, 9 de enero de 2014

Layouts en android o cómo organizar los componentes en la pantalla

Existen multitud de tipos de layouts para ordenar los componentes en una pantalla. A continuación explicaremos algunos de los más comunes:


  • LinearLayout: consiste en agrupar los elementos uno detrás de otro de forma horizontal o vertical.

  • TableLayout: este layout permite agrupar los elementos en una tabla que contiene filas y columnas.

  • RelativeLayout: los elementos se ubican dada una posición relativa de otro elemento del mismo layout.

  • FrameLayout: ubica todos los elementos alineados sobre la esquina superior izquierda de manera que unos controles quedarán encima de otros.

  • ScrollView: se puede utilizar cuando el número de componentes de una pantalla se desborda y es necesario un scroll vertical.

Todas estas clases heredan de la clase View o ViewGroup. De esta manera heredarán a su vez una serie de propiedades comunes:


  • layout_width: anchura

  • layout_height: altura

  • layout_marginTop: margen superior

  • layout_marginBottom: margen inferior

  • layout_marginLeft: margen izquierdo

  • layout_marginRight: margen derecho

  • layout_gravity: orientaciones vertical y horizontal del elemento

  • layout_weight: peso

  • layout_x: coordenada x donde ubicar el elemento

  • layout_y: coordenada y donde ubicar el elemento

La manera de utilizar estos layouts será mediante marcación XML en el fichero layout correspondiente a cada actividad. Por ejemplo:




<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0099cc"
tools:context=".FullscreenActivity" >

<!--
The primary full-screen view. This can be replaced with whatever view
is needed to present your content, e.g. VideoView, SurfaceView,
TextureView, etc.
-->

<TextView
android:id="@+id/fullscreen_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:keepScreenOn="true"
android:text="@string/dummy_content"
android:textColor="#33b5e5"
android:textSize="50sp"
android:textStyle="bold" />

<!--
This FrameLayout insets its children based on system windows using
android:fitsSystemWindows.
-->

<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true" >

<LinearLayout
android:id="@+id/fullscreen_content_controls"
style="?buttonBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:background="@color/black_overlay"
android:orientation="horizontal"
tools:ignore="UselessParent" >

<Button
android:id="@+id/dummy_button"
style="?buttonBarButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/dummy_button" />
</LinearLayout>
</FrameLayout>

</FrameLayout>



Layouts en android o cómo organizar los componentes en la pantalla

miércoles, 8 de enero de 2014

Ciclo de vida de una actividad en Android

Cuando se lanza una actividad en android implica que la actividad anterior sea parada temporalmente. Esto no significa que la anterior actividad sea destruida sino que simplemente pierde el foco y se puede recuperar al volver a ella (botón back). Las  actividades solo son destruidas cuando el sistema así lo decida para resolver problemas de memoria. La preocupación del programador debe de centrarse en que la aplicación esté disponible cuando el usuario pulse el botón volver. La práctica más habitual es guardar el estado de la aplicación cuando ésta pierda el foco y recuperar su estado cuando vuelva a recuperar el foco.


Una actividad puede pasar por 3 estados diferentes:


  • Activa: la pantalla o actividad se encuentra visible por el usuario.

  • Pausada: la actividad ha perdido el foco pero sigue visible total o parcialmente por el usuario. Un ejemplo sería una ventana de diálogo que contiene el foco pero que está ligada a la actividad principal.

  • Parada: la actividad no está visible.

El ciclo de vida de una actividad contiene los siguientes métodos:


  • onCreate: se invoca cuando la actividad se crea por primera vez. Es aquí donde deberemos inicializar los datos que contendrá así como sus vistas. De esta manera es importante sobreescribir este método cada vez que definamos una actividad. El método recibe un parámetro de tipo Bundle. El valor de este parámetro será nulo si se ejecuta por primera vez pero en cambio contendrá la información suficiente para restaurar la actividad en caso de recuperación.

  • onRestart: se llama a este método cuando la actividad había sido detenida previamente pero se va a volver a visualizar.

  • onStart: este método se ejecuta cuando la actividad va a ser visualizada.

  • onResume: este método se ejecutará siempre que la aplicación este preparada para interactuar con el usuario. Este es el lugar idóneo para inicializar datos.

  • onPause: se invoca cuando la actividad va a perder el foco. Podemos ver este método como un aviso de que la pantalla va a dejar de ser visible y por tanto es un lugar idóneo para guardar el estado de la actividad.

  • onStop: se llama a este método cuando la actividad ha sido ocultada por completo.

  • onDestroy: método por el que pasa cuando la actividad va a ser destruida por completo.


Ciclo de vida de una actividad en Android

Handler axd funciona correctamente en local pero no funciona en el servidor

Tengo una librería MSCaptcha que funciona correctamente en local pero al subir al servidor no funciona correctamente.


El problema surge de que IIS7 introdujo dos condiciones previas denominadas integratedMode” y “classicMode. Un handler que tiene una precondition integratedMode asociado a él sólo se puede cargar en un grupo de aplicaciones que tiene el integratedMode establecido en el conjunto de propiedades en la ApplicationPool. Handlers con la precondition classicMode sólo se cargarán en Grupos de aplicaciones que tienen la propiedad integratedMode establecida en falso.


En mi servidor local el pool de aplicaciones está en modo integrado con lo que la librería MSCaptcha funciona correctament pero en el servidor de producción está en modo clásico.


Para solucionarlo sin tener que cambiar configuraciones de servidor se puede establecer en el web.config una directiva para que el handler cargue con la configuración que decidamos.


En mi caso particular será:




<add name="MSCaptcha" verb="GET" path="CaptchaImage.axd" type="MSCaptcha.CaptchaImageHandler, MSCaptcha" preCondition="integratedMode"/>


De está forma he logrado que mi captcha se visualiza en el servidor.



Handler axd funciona correctamente en local pero no funciona en el servidor

Leer un documento XML como recurso en c#

Este post pretende explicar como leer un documento XML como recurso en c#


Disponer de un documento XML en los recursos de tu proyecto .Net es útil si no lo quieres hacer visible en el despliegue de la aplicación.


leer recurso xml visual studioPuedes cargar dicho documento mediante las siguientes líneas:




XmlDocument doc= new XmlDocument();
doc.LoadXml(Properties.Resources.XMLPreguntas);



Leer un documento XML como recurso en c#

Mostrar números de línea en visual studio

Este post indica la manera de mostrar números de línea en visual studio.


Por defecto en una instalación nueva de visual studio no se visualizan los números de línea en el editor.


sin numeros de linea visual studio


Para mostrarlos solo deberemos ir a la opción de menú “herramientas” (tools) situado en el menú superior y seleccionar “opciones” (options).


opciones



Se abrirá una ventana con todas las opciones. En el árbol de la izquierda elegiremos “Editor de texto” (Text Editor) y del desplegable seleccionaremos “Todos los lenguajes” (All Languages).


Una vez dentro en la sección display activaremos el check con la propiedad “Números de línea”.


numeros de linea visual studio 2



Ahora tendremos visibles los números de línea para todos los archivos que abramos con visual studio.


numeros de linea visual studio 3




No se puede cargar el archivo o ensamblado System.Web.Extensions

Error al compilar: No se puede cargar el archivo o ensamblado System.Web.Extensions Version=1.0.61025.0, Culture=neutral… El sistema no puede encontrar el archivo especificado.


Error system.web.extensions


La causa de este error es que no se puede encontrar la referencia al ensamblado indicado. Es muy posible que el equipo o servidor no tenga instalado ASP.NET AJAX 1.0.


Una vez instalado, las librerías quedarán directamente registradas en la GAC con lo que la siguiente compilación del proyecto dejará de existir el problema.


Para la instalación de ASP.NET AJAX 1.0 es necesario tener instalado:



No se puede cargar el archivo o ensamblado System.Web.Extensions

martes, 7 de enero de 2014

Qué son las actividades en Android

En este post intentaremos explicar qué son las actividades en Android.


Una actividad es una pantalla que en algún momento podrá ser visualizada por el usuario. Una aplicación en android tendrá entre 1 a N actividades.


Es en una actividad (pantalla) donde se colocarán los diferentes componentes como son los controles: caja de texto, botón, cuadros de selección (checkbox), listas desplegables…


Cuando creamos un nuevo proyecto android desde eclipse entre otras cosas tendremos la opción de indicarle cual será el nombre de la actividad principal (pantalla de inicio) desde la cual se arrancará nuestra aplicación.


Cada una de las pantallas que creemos deberán extender a la clase Activity. Si nos fijamos al extender esta clase también podremos sobreescribir algunos de sus métodos entre ellos está el siguiente:


  • OnCreate, se ejecutará al iniciar la aplicación. En este método se suele iniciar el layout o clase que contiene el diseño de la pantalla.




setContentView(R.layout.mi_actividad);




 En posteriores posts hablaremos del ciclo de vida de las actividades.




Qué son las actividades en Android

Menú desplegable en WordPress

Básicamente existen dos tipos de menú desplegable en WordPress:


  • Elemento de menú padre que contiene un enlace a una página, url o categoría

  • Elemento de menú padre que no contiene ningún enlace, es decir, que únicamente sirve para desplegar o hacer visibles sus elementos inferiores (hijos).

Para crear este último elemento padre es tan fácil como crear un elemento de menú cuya url sea #:


menu-desplegable-wordpress


Una vez añadido al menú tan solo quedará agregarles los elementos hijos para agruparlos dentro de él.



Menú desplegable en WordPress