20-abril-2013
admin

Instalación de Drupal 6.28 en Español

1 – En primer lugar se necesita tener instalado Apache, MySQL y PHP. Esto se puede hacer de una sola instalación utilizando los paquetes ya preparados y configurados como es por ejemplo: AppServ.

2 – Descargar la versión de Drupal 6.28. Descomprimir el archivo en la carpeta WWW donde la instalación del AppServ (Vamos a llamar al directorio principal Drupal).

3 – Descargar la versión más reciente de la traducción para Drupal 6 (en este caso 6.x-1.4). Descomprimir el archivo descargado en la carpeta principal de Drupal anterior y reemplace los archivos originales.

4 – Acceda a la carpeta que contiene Drupal escribiendo la dirección de su sitio en la barra de exploración de su navegador web, ejemplo: http://localhost/Drupal

5 – Inicialmente se mostrara la página Choose language (selección de Idioma). Se debe marcar la opción Español.

6 – A continuación, se mostrará la página «Problema de requerimientos» (donde se muestran los errores existentes). Para poder instalar drupal, primero debe resolver los problemas detectados. Entre los mas conocidos están:

Error 1: The Drupal installer requires that you create a settings file as part of the installation process. Copy the ./sites/default/default.settings.php file to ./sites/default/settings.php.
Posible solución: Copie el archivo ./sites/default/default.settings.php y renómbrelo como ./sites/default/settings.php.

Error 2: The Drupal installer requires that you create ./sites/default/settings.php as part of the installation process, and then make it writable. If you are unsure how to grant file permissions, please consult the on-line handbook.
Posible solución: Cree un archivo nuevo llamado settings.php (déjelo en blanco), y súbalo al directorio ./sites/default/ de su instalación de drupal.

Error 3: Error de permisos de escritura en directorios/archivos de drupal.
Posible solución: Cambiar permisos de escritura de sites/default o archivos indicados en error.

Error 4: Change file permissions so that it is writable by the web server. If you are unsure how to grant file permissions, please consult the on-line handbook.
Posible solución: Cambiar permisos de escritura de sites/default o archivos indicados en error.

Error 5: El directorio sites/default/files no existe, ya que no se ha creado automáticamente.
Posible solución: Crear el directorio files manualmente.

7 – Una vez resueltos estos problemas (en el caso de que se de alguno), sólo hay que seguir el resto de pasos de instalación.

6-abril-2013
admin

Framework Aggregation en MongoDB

Algunos ejemplos (muy por encima) de uso de agregaciones en MongoDB son:

$sum: En este ejemplo se devuelve la suma del campo «pop» agrupado por «state»

db.zips.aggregate([
    {$group:
     {
     _id:  "$state",
     population:{$sum:"$pop"}
     }
    }
])

$max: En este ejemplo se devuelve el valor máximo del campo «pop» agrupado por «state»

db.zips.aggregate([
    {$group:
     {
     _id: "$state",
     pop:{$max:"$pop"}
     }
    }
])

$avg: En este ejemplo se devuelve el valor medio del campo «pop» agrupado por «state»

db.zips.aggregate([
    {$group:
     {
     _id: "$state",
     average_pop:{$avg:"$pop"}
     }
    }
])

$addToSet: En este ejemplo se devuelve las ciudades(city) agrupando los codigos postales (_id) en un array.

db.zips.aggregate([
    {$group:
     {
     _id: "$city",
     postal_codes:{$addToSet:"$_id"}
     }
    }
])

$project: Da nueva forma a una secuencia de documentos de cambio de nombre, agregar o eliminar campos

db.zips.aggregate([
    {$project:
     {
     _id:0,
     'city':{$toLower:"$city"},
     'pop':1,
     'state':1,
     'zip':'$_id'
     }
    }
])

$match: En este ejemplo se devuelven todas las ciudades que tienen más de 100 000 personas de bolación.

db.zips.aggregate([
    {$match:
     {
     pop: { $gt: 100000 }
     }
    }
])

Documentación oficial en MongoDB.org

Más Ejemplos

6-abril-2013
admin

Crowdfunding

Crowdfunding es una forma de financiación colectiva utilizada en Internet. Cualquier persona que lo desee puede financiar un proyecto donando pequeñas cantidades de dinero. Ya sea para obtener algún tipo de beneficio o para sentirse parte del proyecto. En cierta medida representa una evolución de las típicas donaciones por Paypal que aún siguen utilizándose para apoyar proyectos.

Algunas páginas webs populares para financiar proyectos creativos (cinematográficos, tecnológicos, musicales, de diseño…) son:
Kick Starter
RocketHub
Indiegogo
Ideame
Fondeadora

En España existen portales para el mismo fin como:
Verkami
Lanzanos
Participa
Goteo

12-marzo-2013
admin

CRUD en Mongo

Algunas operaciones CRUD que se pueden realizar en mongo:

insert
Ejemplo que inserta una nueva entrada en la tabla «fruit»
db.fruit.insert({«name»:»apple»,»color»:»red»,»shape»:»round»});

findOne
Con esta instrucción se trae una única entrada.
db.people.findOne( { «name»:»Jones» },{ «name»:true, «_id»:false } ); //En este ejemplo solo se muestra el campo name (el restode campos no se mostrarían y el _id hay que quitarlo aparte.).
Otro Ejemplo
db.scores.find({«type»:»essay», «score»:50},{«_id»:false, «student»:true});

Querying usando $gt y $lt (añadir ‘e’ para equal)
db.scores.find({«type»:»essay», «score»:{$gte:50,$lt:66}});

Inequalities en strings
El ejemplo devuelve todos los users cuyo name empieza por una letra mayor o igual que F y además esa letra es menor o igual que Q.
db.users.find( { name : { $gte : «F» , $lte : «Q» } } );

$regex, $exists, $type
Con regex se pueden usar ^$ para completar expresiones
exists – debe ser true o false
type – es para buscar por tipo de campo http://docs.mongodb.org/manual/reference/operator/type/
Ejemplo de uso:
db.users.find( { name:{$regex:»q»}, email:{$exists:true} } );

$or, $and, $in y $all
db.users.find( { $or:[ { name:{$regex:»q»}}, {email:{$exists:true} }]} );
db.scores.find( { $or: [ {score:{$lt:50}},{score:{$gt:90}} ] } );

querying inside arrays y queries with dot notation
db.catalog.find( { price : { $gt : 10000 } , «reviews.rating» : { $gte : 5 } } );

cursors
cur = db.people.find(); null;
cur.limit(5); null; (esto opcional. limita a 5)
cur.sort( {name:-1} ); null; (esto es opcional ordena por nombre ascendente)
cur.hasNext();
cur.next();

while(cur.hasNext()) printjson(cur.next());

Consulta que recupera los documentos de exámenes, ordenados por puntuación en orden descendente, pasando por alto los primeros 50 y que muestra sólo los próximos 20.
db.scores.find({ type : «exam» }).sort( {score:-1} ).skip(50).limit(20);

count
db.scores.count({type:»exam»});

¿Cómo se cuentan los documentos de la colección de partituras en que el tipo era «essay» y el puntaje fue mayor que 90?
db.scores.count({type:»essay», score:{$gt:90}});

update
Modifica el monbre y el salario de smith, quita el resto de propiedades
db.people.update({name:»smith»},{name:»thomspn», salary:5000});

$set
db.people.update({name:»smith»},{$set:{salary:5000}});
db.people.update({name:»smith»},{$inc:{salary:1}});
db.users.update({‘username’:’splunker’},{$set:{‘country’:’RU’}});

$unset
db.users.update({‘username’:’splunker’},{$unset:{‘country’:’RU’}});
Consulta de actualización que quitará intereses en el siguiente documento en los usuarios de colección. La clave principal es nombre de usuario.
db.users.update({‘username’:’jimmy’},{$unset:{‘interests’:1}});

$push, $pop, $pull, $pushAll, $pullAll, $addToSet
Supongamos que tenemos el siguiente documento en su colección de amigos:
{ _id : «Mike», interests : [ «chess», «botany» ] }
¿Cuál será el resultado de las siguientes actualizaciones?
db.friends.update( { _id : «Mike» }, { $push : { interests : «skydiving» } } );
db.friends.update( { _id : «Mike» }, { $pop : { interests : -1 } } );
db.friends.update( { _id : «Mike» }, { $addToSet : { interests : «skydiving» } } );
db.friends.update( { _id : «Mike» }, { $pushAll: { interests : [ «skydiving» , «skiing» ] } } );
Resultado:
{ _id : «Mike» , «interests» : [ «botany», «skydiving», «skydiving», «skiing» ] }

multi-update
db.people.update({name:»smith»},{$set:{salary:5000},{multi:true}});

¿Cómo dar a cada registro cuyo puntaje fue inferior al 70 un extra de 20 puntos?
db.scores.update({score:{$lt:70}},{$inc:{score:20}},{multi:true});

Removing data
db.scores.remove({score:{$lt:60}});
db.people.remove();
db.people.drop();

getLastError
db.runCommand( {getLastError:1} );

9-marzo-2013
admin

MongoDB, Spark y FreeMarker

Ejemplo de uso de MongoDB, Spark y FreeMarker. Además, se utilizará Maven para incluir las dependencias necesarias para ello.

En primer lugar se necesita el driver de Java, ya que es la tecnología sobre la que está implementado el framework Spark y será el encargado de interactuar o explotar la base de datos.

              
	org.mongodb	
	mongo-java-driver
	2.10.1      
    

Un ejemplo de uso de este driver puede ser:

        MongoClient client = new MongoClient( new ServerAddress("localhost", 27017));
        DB data = client.getDB("course");
        DBCollection col = data.getCollection("hello");
        DBObject doc = col.findOne();

Spark Web Application Framework

     
            spark
            spark
            0.9.9.4-SNAPSHOT
     
      
	import static spark.Spark.*;
	import spark.*;

	public class HelloWorld {

	   public static void main(String[] args) {
	      	get(new Route("/hello") {
        		 @Override
		         public Object handle(Request request, Response response) {
        		    return "Hello World!";
	        	 }
      		});
	   }
	}

Para probarlo si estás usando IntelliJ IDEA basta lanzar con run y luego en el navegador http://localhost:4567/hello.


Uso de plantillas con Freemarker

   
      org.freemarker
      freemarker
      [2.3.19,2.4)
   

Ejemplo de plantilla. Se puede observar que hay una variable ${name}. Ésta variable se rellenará mediante el framework de Spark.

< html >
< head >
  < title >Welcome!

< body >
  < h1 >Hello ${name}


        final Configuration configuration = new Configuration();
	configuration.setClassForTemplateLoading(HelloWorldSparkFreemarkerStyle.class, "/");
	Spark.get(new Route("/") {
            
		@Override
		public Object handle(final Request request, final Response response) {
			StringWriter writer = new StringWriter();
			try {
				Template helloTemplate = configuration.getTemplate("hello.ftl");
				Map helloMap = new HashMap();
				helloMap.put("name", "Freemarker");
				helloTemplate.process(helloMap, writer);
                
			} catch (Exception e) {
				halt(500);
				e.printStackTrace();
			}
			return writer;
		}
        });

Podría utilizarse el acceso a la BD mediante el driver de java para obtener cualquier información y posteriormente poder mostrarla en una jsp mediante un plantilla freemaker.


9-marzo-2013
admin

MongoDB Iniciación

¿Qué es MongoDB?
MongoDB forma parte de la nueva familia de sistemas de base de datos NoSQL. En vez de guardar los datos en tablas como se hace en las base de datos relacionales, MongoDB guarda estructuras de datos en documentos tipo JSON con un esquema dinámico (MongoDB llama ese formato BSON).

Instalar MongoDB

Instalación en windows.
1 – Descomprimir la última version de MongoDB que se puede descargar de aquí.
2 – Crear un directorio c:/data/db
3 – El servidor de MongoDB se arranca la db ejecutando «mongod» en la consola de windows. (Es recomendable meter el directorio de instalación en el PATH de las variables de entorno).
4 – Se puede comprobar que todo funciona correctamente ejecutando en otra consola de windows: «mongo localhost/test» ó «mongo».

Ejemplo de comandos a utilizar por la consola:

mongo shell
	use test //Cambiar de db, se pasaria a la db test
	db.things.save({a:1, b:2, c:3}) //Crea una entrada en la tabla things
	db.things.find() //Devuelve todos los elementos de things
	db.things.find( {a:1} )
	db.things.find().pretty()
	db //Dice la db a la que estas conectado
	show dbs
	show collections

26-febrero-2013
admin

Scraping con PHP usando cURL y DOMXPath

Para conectarse a una página web y obtener el código html de ella se puede utilizar la librería cURL.
Documentación: http://php.net/manual/es/book.curl.php

Como ejemplo se muestra esta función que recibe como parámetros la dirección web de la que se desea obtener la información.

function getDomUrl($url){
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_REFERER, "");
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
	curl_setopt($ch, CURLOPT_ENCODING, "ISO-8859-1,UTF-8;q=0.7,*;q=0.7");
	curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 
               (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/535.19 
               (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19");

	$body = (curl_exec($ch));
	curl_close($ch);

	return $body;	
}

A continuación, para procesar este DOM obtenido de una página web podemos utilizar la librería DOMXPath.
Documentación: http://php.net/manual/es/class.domxpath.php

Esta librería utiliza XPath (XML Path Language) que se trata de un lenguaje que permite construir expresiones que recorren y procesan un documento XML.
Documentación: http://es.wikipedia.org/wiki/XPath

Ahora tenemos una función que recibe como parámetros el DOM de una página y una expresión regular XPath que extraerá una parte de dicho DOM.

			
function getDomXPath($domh, $path){
	$xpath = new DOMXPath($domh);
	return $xpath->query($path);
}

Por último, un ejemplo de uso de estos métodos:

$dom = new DOMDocument();
$domhtml = getDomUrl("http://www.disastercode.com.es");
@$dom->loadHTML($domhtml);
$trozo = getDomXPath( $dom, "//div[@id='plantilla']/center/table[2]/tr/td/center/table/tr/*/a[@id='neutro']/../..");

25-febrero-2013
admin

Depurar con Logs en Android

Android proporciona un API de logging (la clase android.util.Log).

En Android, todos los mensajes de log llevarán asociada la siguiente información:
– Fecha/Hora del mensaje.
– Criticidad. Nivel de gravedad del mensaje (se detalla más adelante).
– PID. Código interno del proceso que ha introducido el mensaje.
– Tag. Etiqueta identificativa del mensaje (se detalla más adelante).
– Mensaje. El texto completo del mensaje.

Los mensajes de log se van a clasificar por su criticidad:
– Error
– Warning
– Info
– Debug
– Verbose

public class LogsAndroid extends Activity {
 
    private static final String LOGS = "LogsAppAndroid";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        Log.e(LOGS , "Mensaje de error");
        Log.w(LOGS , "Mensaje de warning");
        Log.i(LOGS , "Mensaje de información");
        Log.d(LOGS , "Mensaje de depuración");
        Log.v(LOGS , "Mensaje de verbose");
    }
}

Para ver los mensajes de log hay que ir a la vista llamada LogCat en el eclipse.

24-febrero-2013
admin

Evitar reinicio automático de la activity

Cuando por ejemplo se gira la pantalla del dispositivo android se reinicia la actividad. Esto pasa porque el método onCreate es llamado por defecto, según el ciclo de la vida de una aplicación Android. Podemos evitar que ello ocurra, colocando la siguiente etiqueta dentro del fichero Android Manifest.xml de nuestra aplicación (en la etiqueta activity de nuestra actividad):

Para verisones anteriores al API 13
android:configChanges=»orientation|keyboard|keyboardHidden»

Para versiones posteriores al API 13
android:configChanges=»orientation|keyboard|keyboardHidden|screenSize»

23-febrero-2013
admin

Comprobar conexión a internet en un dispositivo Android

En primer lugar se deben dar permisos para conectarse a internet y para consultar el estado de la conexión en el Manifest.



A continuación se puede realizar la comprobación tal que así:

ConnectivityManager cm = (ConnectivityManager) 
                       this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
     //Hay conexión.
}else{
     //No hay conexión.
}

Esto es bastante útil cuando se usa por ejemplo el componente WebView para cargar alguna página web.

Categorias

Linkedin