Archivo de la categoría: Programación

Temas relacionados con la programación en general. Lenguajes .Net, java, python, C#, Visual Basic, C…

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

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.

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.

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.

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;
?>

...

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" />

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>

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.

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.

Dimensiones de pantallas Android

Las aplicaciones deben de ser capaces de adaptarse a las pantallas con diferentes resoluciones. Android clasifica los tipos de pantalla por densidades y no por pixels (afecta tanto el tamaño de la pantalla como la relación de aspecto).

La unidad de medida, por tanto, será la densidad de pixels o dpi.

Los tipos de pantalla se dividen en los siguientes grandes grupos acorde a su densidad:

  • baja: ldpi (120dpi)
  • media: mdpi (160dpi)
  • alta: ldpi (240dpi)
  • muy alta: xhdpi (320dpi)

A nivel práctico esto supone que deberíamos disponer de una misma imágen con cuatro tamaños distintos para mantener la relación de aspecto. En un proyecto android deberemos tener una carpeta de recursos por cada grupo y en ella colocar la imágen que corresponda a cada una.

Es decir es necesario trabajar para las distintas dimensiones de pantallas Android.