msgbartop
Desarrollador web, con todo lo que ello implica
msgbarbottom

07 Jul 10 Logs manuales y personalizados en Symfony

Suele ser una buena práctica tener un archivo de logs con las últimas acciones más importantes que se han hecho en nuestro sitio web: nuevo usuario registrado, se ha escrito un nuevo comentario, se ha editado o borrado un artículo, etc.

Symfony tiene un sistema de logs bastante decente, que nos informa de todo lo que ocurre cada vez que cargamos una nueva página. Vamos a hacer algo sencillo: vamos a escribir nuestros propios mensajes de log personalizados y los escribiremos manualmente en el momento que consideremos oportuno y deseamos tener un control. Además, escribiremos estos logs en un archivo aparte del que utiliza Symfony por defecto. Así podremos leer directamente ese archivo sin tener otros logs mezclados con los que realmente nos interesa.

Primero, vamos a crear un nuevo archivo llamado CustomLog.class.php en la carpeta /lib/:

1
2
3
4
5
6
7
8
9
10
11
<?php
 
class CustomLog{
  static public function newLog($message) {
 
        $logFile = sfConfig::get('sf_log_dir').'/custom_logs.log';
        $custom_log = new sfFileLogger(new sfEventDispatcher(), array('file' => $logFile));
        $custom_log->info($message);
 
  }  
}

El archivo donde guardaremos nuestros logs personalizados, lo encontraremos en “/log/custom_logs.log”.

Para escribir un nuevo log desde cualquier parte del código, simplemente deberemos hacer:

1
CustomLog::newLog("Escribimos un nuevo log");

Si abrimos nuestro archivo de logs personalizados, encontraremos algo como esto:

1
Jul 05 22:31:41 symfony [info] Escribimos un nuevo log

Así podremos llevar un control de lo que ocurre en nuestra web.

Quizás haya una forma mejor de hacerlo. Si es así, no dudes en dejar tu propuesta en los comentarios. A lo mejor también sería conveniente escribir esas 3 lineas dentro de un try.. catch, por lo que pudiera pasar.

Etiquetas: ,

26 Jun 10 Cambiar puerto 22 del servidor ssh

Si queremos tener más seguridad en nuestro servidor, un truco fácil es el de cambiar el puerto del servidor ssh. Por defecto, la conexión se hace en el puerto 22, que es uno de los puertos más utilizados por scripts maliciosos para realizar ataques por fuerza bruta o denegación de servicio.

Cambiar el puerto del ssh es tan sencillo como hacer lo siguiente:

1
nano /etc/ssh/sshd_config

Editamos la linea dice

1
#Port 22

La descomentamos (quitamos la almoadilla) y cambiamos el 22 por el puerto que queramos. Nos tenemos que asegurar de que el puerto que elijamos no esté ya en uso (Aquí tenemos una lista de puertos). Por ejemplo, si elegimos el puerto 27, la línea quedará:

1
Port 27

(more…)

Etiquetas: , ,

19 Jun 10 Symfony: Migrar de Propel a Doctrine

Desde que empecé con Symfony siempre he preferido utilizar Propel como ORM de mis proyectos. Me sentía cómodo utilizándolo excepto en esas ocasiones en las que se complicaba demasiado la consulta y había que tirar de ‘criteriones’ (al final optaba por construir la sql a mano). Había leído sobre Doctrine pero nunca me había parado a probarlo y utilizarlo ya que, como digo, me sentía muy cómodo con Propel y ni siquiera me planteaba cambiar.

En la nueva empresa donde trabajo (BlackSlot) he empezado a utilizar Doctrine y, ante mi sorpresa, me ha encantado. Me he dado cuenta de que si sabes sql es muy fácil aprender Doctrine y con resultados muy buenos. Con Propel, aunque sepas sql, tienes que aprender a usarlo y pensar las conversiones desde sql a Propel. Es un lenguaje nuevo.

Ante este escenario y como tengo un proyecto recién empezado, me decidí a migrarlo de Propel a Doctrine.

Tengo que destacar que la migración es realmente costosa. Si no fuese por que acabo de empezar el proyecto y no está muy avanzado, hubiese tenido que seguir con Propel. Personalmente, lo que más cuesta es transformar todo el modelo a Doctrine (todo depende de cuanto lleves hecho). Si es un proyecto acabado y bastante elaborado, te puede llevar días. Al modelo hay que añadir el modificar el schema.yml con el formato apropiado para Doctrine.

Otro quebradero de cabeza son los plugins en Propel que has utilizado en tu proyecto. El más típico es el sfGuardPlugin para llevar las cuentas de usuario. Tendrás que instalar el plugin sfDoctrineGuardPlugin que es el equivalente para Doctrine.

Si aún después de haber leído esto, sigues queriendo migrar de Propel a Doctrine un proyecto empezado, estos son los pasos que tienes que seguir:
(more…)

23 Mar 10 Aplicación Android: Webcams de tráfico en Vizcaya

Aquí va otra aplicación para Android que nos será de especial utilidad a los conductores de Vizcaya. Se trata de poder consultar las webcams de trafico de vizcaya al instante y así poder conocer el estado de las carreteras antes de realizar un desplazamiento. Podremos evitar las carreteras congestionadas antes de llevarnos una sorpresa.

Se incluyen webcams tan relevantes como las de Bilbao, Txorierri, Barakaldo, autopista A8, Derio, Zamudio, Aeropuerto, Cruces, Zorroza, Max Center, etc.

No vuelvas a meterte en un atasco con tu coche, evita las retenciones.

Utiliza el siguiente código para descargarte la aplicación o busca “trafico vizcaya” en el Android Market.
Tráfico Vizcaya

La aplicación de momento es un poco simple, si teneis alguna sugerencia no dudeis en dejarla en los comentarios. ¡Gracias!

14 Mar 10 Aplicación para Android: apezz.com

Ya podemos disfrutar de la aplicación para Android del agregador social de noticias, apezz.com. Podremos ver las últimas noticias publicadas y pendientes de la web, así como su descripción y un acceso directo a la web de la noticia para ampliar la información.

Es una primera versión básica. Las próximas actualizaciones serán:
- Loguearnos con nuestro usuario de la web.
- Ver los comentarios a noticias.
- Comentar noticias.
- Votar noticias.

Una vez hechas estas actualizaciones, podremos interactuar con la web completamente desde la aplicación Android.

Para descargarla, solamente deberemos buscar “apezz” en el Android Market o a partir del siguiente código QR:
apezz-qrcode

11 Mar 10 Mostrar/cargar imagen externa en una aplicación Android

Muchas veces nos encontramos con el problema de tener que cargar imagenes, que tenemos alojadas en un servidor externo, en nuestra aplicación Android. Las imágenes básicas las podemos incluir en la propia aplicación pero imágenes como, por ejemplo, los avatares de los usuarios los tenemos que cargar directamente desde el servidor.

Primero creamos el layout (main.xml):

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"> 
 
 <ImageView android:id="@+id/image_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
 
</LinearLayout>

Ahora creamos la activity que cargará la imagen del servidor y la mostrará en el layout anterior (Main.java):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.jonsegador.examples.externalimage;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.Toast;
 
public class Main extends Activity {
    private ImageView imageView;
    private Bitmap loadedImage;
    private String imageHttpAddress = "http://jonsegador.com/wp-content/apezz.png";            
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        imageView = (ImageView) findViewById(R.id.image_view);       
        downloadFile(imageHttpAddress);
    }
 
    void downloadFile(String imageHttpAddress) {
        URL imageUrl = null;
        try {
            imageUrl = new URL(imageHttpAddress);
            HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
            conn.connect();
            loadedImage = BitmapFactory.decodeStream(conn.getInputStream());
            imageView.setImageBitmap(loadedImage);
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(), "Error cargando la imagen: "+e.getMessage(), Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    }
}

Por último, incluimos la Activity en el AndroidManifest.xml y damos permisos para acceder a internet.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.jonsegador.examples.externalimage"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Main" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>    
    </application>
    <uses-sdk android:minSdkVersion="3" />  
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

Y este debería de ser el resultado:
imagen_externa_android

Etiquetas: , , , ,

07 Mar 10 CentOS / Red Hat: Deshacer yum update (roll back)

Es bastante importante tener actualizado nuestro servidor con los parches de seguridad más recientes. Puede que el sistema se actualice sin problemas… pero puede que no. En esos momentos es cuando desearíamos poder volver a la versión anterior de los paquetes que hemos actualizado.

Con el gestor de paquetes yum lo podemos hacer. Para ello, primero tenemos que modificar un par de archivos:

Añadimos esta linea al fichero /etc/yum.conf

tsflags=repackage

También deberemos añadir esta linea al archivo /etc/rpm/macros (si no existe, lo creamos)

%_repackage_all_erasures 1

La documentación de rpm no tiene ninguna referencia a la opción deshacer (rollback). Para volver a la versión de los paquetes anteriores a la actualización usaremos el comando rpm con el parametro –rollback

rpm -Uhv --rollback '15:00'
rpm -Uhv --rollback '2 hours ago'
rpm -Uhv --rollback 'december 31'
rpm -Uhv --rollback 'yesterday'

Es una buena idea activar el rollback por lo que pueda pasar. Ahora podremos ejecutar

yum update

sin miedo a posibles incompatibilidades.

Etiquetas: , , ,

23 Feb 10 Tutorial Android paso a paso III: Desarrollo de la aplicación Notepad

En este tercer y último post del tutorial, vamos a practicar el ciclo de vida de la aplicación, y como guardar y recuperar el estado de la aplicación.

Puedes ver los anteriores artículos:
Tutorial Android paso a paso I: Desarrollo de la aplicación Notepad
Tutorial Android paso a paso II: Desarrollo de la aplicación Notepad

Objetivos:
• Conocer los eventos del ciclo de vida de la aplicación.
• Tecnicas para mantener el estado de la aplicación.

Paso 1

La aplicación actual contiene algunos problemas. Para solucionarlo, vamos a mover la funcionalidad de edición de notas a la clase NoteEdit.

1. Eliminar el siguiente código de la clase NoteEdit, que obtiene los datos de la nota a través del Bundle. Vamos a pasar a utilizar la clase DBHelper para obtener los datos directamente de la base de datos.

1
2
3
4
5
Bundle extras = getIntent().getExtras();String title = extras.getString(NotesDbAdapter.KEY_TITLE);
String body = extras.getString(NotesDbAdapter.KEY_BODY);
mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);

2. Además, eliminamos la asignación de los datos a la interfaz de usuario

1
2
3
4
5
6
if (title != null) {
    mTitleText.setText(title);
}
if (body != null) {
    mBodyText.setText(body);
}

(more…)

Etiquetas: , , ,

20 Feb 10 Tutorial Android paso a paso II: Desarrollo de la aplicación Notepad

Continuamos con la segunda parte del tutorial para el desarrollo de una aplicación para Android paso a paso. La primera parte la puedes consultar en Tutorial Android paso a paso I: Desarrollo de la aplicación Notepad.

En este segundo post, vamos a crear una segunda actividad que nos permita crear y editar notas. Además, vamos a poder tener la posibilidad de eliminar notas a través del un menú contextual.

Objetivos:
• Crear una nueva actividad.
• Realizar llamadas a la nueva actividad.
• Paso de datos entre las actividades.
• Crear un nuevo menu contextual.
(more…)

Etiquetas: , , ,

17 Feb 10 Tutorial Android paso a paso I: Desarrollo de la aplicación Notepad

Me he decidido a hacer una serie de posts a modo de curso para empezar a desarrollar aplicaciones para Android. Voy a omitir la instalación del entorno de desarrollo (eclipse + sdk android) ya que existen numerosos manuales disponibles en internet. De todas formas, para instalarlo recomiendo este enlace. Después seguiremos los manuales disponibles en inglés en la web oficial de Android (http://developer.android.com/resources/tutorials/notepad/index.html), pero en castellano y con pasos muy fáciles de seguir (no será una traducción al pie de la letra).

Nos deberemos descargar los ejemplos que encontraremos aquí para seguir el curso.

Empezamos!

Desarrollo de la aplicación Notepad

A través de este tutorial vamos a crear una aplicación para tomar notas, que nos introducirá a los aspectos básicos y herramientas para el desarrollo en Android. Comenzando por un proyecto base, seguiremos los pasos  para crear una simple aplicación, viendo como desarrollar la lógica de negocio y las interfaces, así como compilar y ejecutar la aplicación.

En este ejercicio, vamos a construir una simple lista de notas, permitiendo al usuario añadir nuevas notas, pero no editarlas.

Objetivos:
• Conocer ListActivities y crear menus de aplicación.
• Utilizar SQLite para almacenar datos.
• Cómo recuperar los datos de una base de datos y mostrarlos en pantalla.
• Conceptos básicos sobre cómo interactuar con la interfaz de usuario.

(more…)

Etiquetas: , , ,