jueves, 30 de junio de 2011

Gaming 3d android blender - gimp - android sdk - opengl - min3d import obj ParteII

Primera parte

http://mberrueta.blogspot.com/2011/06/gaming-3d-android-blender-gimp-android.html?spref=tw

 

Ahora vamos a importar el obj usando min3d

http://code.google.com/p/min3d/

en alguna carpeta, descargamos el código de min3d

svn checkout http://min3d.googlecode.com/svn/trunk/ min3d-read-only 

o con tortoise checkout  http://min3d.googlecode.com/svn/trunk/ 

creamos en eclipse una nueva aplicacion android (yo use la 2,1)

copio la carpeta src a mi carpeta src, para incluir el código fuente de min3d a mi proyecto

http://developer.android.com/resources/tutorials/hello-world.html

 

Creamos en nuestro proyecto , dentro de la carpeta de recursos "res" una carpeta "raw" y ahi ponemos el archivo obj y el mtl

IMPORTANTE cambiar el puntito por un guion bajo "ejemplo.obj" y "ejemplo.mtl" por "ejemplo_obj" y "ejemplo_mtl"  y las texturas, si las hay en drawable

 

ahora, en la clase main creada por defecto ponemos (pongo todo el codigo, desp explico cosa por cosa)

 

package b.android.games.ThirdGame;

 

import min3d.core.Object3dContainer;

import min3d.core.RendererActivity;

import min3d.parser.IParser;

import min3d.parser.Parser;

import min3d.vos.Color4;

import min3d.vos.Light;

 

public class ThirdGameActivity extends RendererActivity {

 

private Object3dContainer objModel;

 

private Light light;

 

@Override

public void initScene() {

 

//Luces de la escena

light = new Light();

light.ambient.setAll((short) 255, (short) 255, (short) 255, (short) 255);

light.position.setAll(3, 3, 3);

scene.lights().add(light);

 

//Color de fondo 

scene.backgroundColor().setAll(new Color4((short) 30, (short) 30, (short) 30, (short) 255));

 

//Importacion de obj

IParser parser = Parser.createParser(Parser.Type.OBJ, getResources(),

"b.android.games.ThirdGame:raw/mathbox_obj", true);

parser.parse();

objModel = parser.getParsedObject();

//Resize del objeto

objModel.scale().x = objModel.scale().y = objModel.scale().z = .5f;



//Agregado a la escena

scene.addChild(objModel);

 

}

 

@Override

public void updateScene() {

 

//Este metodo se ejecuta todo el tiempo cuando actualiza la escena

//Hace que rote el objeto, pueden jugar con la posicion, rotacion, en el eje que quieran

objModel.rotation().x++;

objModel.rotation().y++;

 

}

}

 

Gaming 3d android blender - gimp - android sdk - opengl - min3d import obj

Bueno, buscando un poco (sigo en la busqueda de lo ideal) explico como comenzar con juegos 3d en android, que herramientas (open source, no vamos a gastar plata) , frameworks , etc.

Vamos a generar un archivo en 3d, exportalo a obj , y despúes importalo en nuestro programa android.

Conocimiento básico, http://es.wikipedia.org/wiki/OpenGL

Progamas a usar (así van descargando)

Dibujo 3d

http://www.blender.org/download/get-blender/

 

Editor gráfico

http://www.gimp.org/downloads/

 

eclipse y sdk de android http://www.weterede.com/2009/06/instalacion-sdk-de-android-en-eclipse/

( seguro ya lo tienen ;) ) 

 

bueno primero abrimos blender (tutoriales de este hay miles en google)

 

 

apretamos "A" para que se seleccione/deseleccione todo

luego "u" para sacar las caras del cubo , a una imagen que podamos retocar afuera

y apretamos "lightMap pack" -> ok

 

 

 

ahora, abajo hay un boto new image, presionamos, y va a poner una imagen en el fondo 

seleccionamos en el menu de abajo , image->image  painting  y vamos a poder escribir en nuestra imagen.

 

en la otra ventana, apretamos   y seleccionamos textured (para que renderee con las texturas) 

si dibujamos en la ventana de textura, se replica en el objeto

 

 

ahora pueden poner en el submenu image-> save as image y editarla externamente con el gimp

 

luego volvemos a blender , y con image -> open image y seleccionamos la imagen editada

 

 

ahora vamos a exportar para poderlo utilizar afuera

 

 

file -> export -> wavefront.obj 

que es un archivo de texto, con toda la data para renderizar

 

http://en.wikipedia.org/wiki/Wavefront_.obj_file

 

En el siguiente post, pongo como importar el obj desde java

 

 

 

 

 

 

 

 

 

 

 

lunes, 27 de junio de 2011

Custom Contact Manager Android

Quiero un listado de contactos en 2 columnas, hecho de la manera más simple posible. 
En principio solo mostraremos los nombres de los contactos, luego imagenes, abrir dialer, etc.
 Main.java
package b.android;

import java.util.ArrayList;

import java.util.HashMap;

import android.app.Activity;

import android.database.Cursor;

import android.net.Uri;

import android.os.Bundle;

import android.provider.ContactsContract;

import android.widget.GridView;

import android.widget.SimpleCursorAdapter;

public class Main extends Activity {

static final ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();

String[] projection = new String[] { ContactsContract.Data.DISPLAY_NAME,

ContactsContract.Data._ID };

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

populateContactList();

}

private void populateContactList() {

// Build adapter with contact entries

Cursor cursor = getContacts();

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,

R.layout.contact, cursor, projection,

new int[] { R.id.contactName });

GridView gridview = (GridView) findViewById(R.id.gridview);

gridview.setAdapter(adapter);

}

private Cursor getContacts() {

// Run query

Uri uri = ContactsContract.Contacts.CONTENT_URI;

String sortOrder = ContactsContract.Data.DISPLAY_NAME

+ " COLLATE LOCALIZED ASC";

return managedQuery(uri, projection, null, null, sortOrder);

}

}
Contacto Individual
 contact.xml 
 <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent" android:layout_height="wrap_content"

android:orientation="horizontal">

<TextView android:id="@+id/contactName" android:textSize="12sp"

android:textStyle="bold" android:layout_width="fill_parent"

android:layout_height="fill_parent" />

</LinearLayout>
Listado
 main.xml  
<?xml version="1.0" encoding="utf-8"?>

<GridView xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/gridview"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:numColumns="auto_fit"

android:verticalSpacing="10dp"

android:horizontalSpacing="10dp"

android:columnWidth="130dp"

android:stretchMode="columnWidth"

android:gravity="center"

/>
Seteamos el Main, y los permisos de lectura a contactos
 AndroidManifest.xml  

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="b.android"

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-permission android:name="android.permission.GET_ACCOUNTS" />

<uses-permission android:name="android.permission.READ_CONTACTS" />

<uses-permission android:name="android.permission.WRITE_CONTACTS" />

</manifest>


viernes, 9 de abril de 2010

Autentificacion con wicket

Autentificacion con wicket


Implementado en base a http://www.wicket-library.com/wicket-examples/authentication/



maven pom.xml

<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-auth-roles</artifactId>
<version>${wicket.version}</version>
</dependency>




Application.java

public class Application extends AuthenticatedWebApplication {

@Override
public Class<? extends Page> getHomePage() {
return Home.class;
}


@Override
protected void init() {
super.init(); // NO OLVIDAR (gracie Mauro Ciancio )
}


@Override
protected Class<? extends WebPage> getSignInPageClass() {
return Login.class;
}

@Override
protected Class<? extends AuthenticatedWebSession> getWebSessionClass() {
return Session.class;
}

}




Session.java

public class Session extends AuthenticatedWebSession {

public Session(Request request) {
super(request);
}

@Override
public boolean authenticate(final String username, final String password) {
return username.equals("admin") && password.equals("admin");
}

@Override
public Roles getRoles() {
if (isSignedIn()) {
return new Roles(Roles.ADMIN);
}

return new Roles();
}
}









Login.html

-En el base se agrega <span wicket:id="signInPanel" /> , si no lo ponemos, vemos en el error los nombre que espera (para poner nuestros textbox y botones)



<body>
<span wicket:id="signInPanel" />
</body>
</html>



Login.java
- Como se ve, lo hace todo la clase base


public class Login extends SignInPage{
}


PaginaConseguridad.html



<body>
solo visible por un admin
</body>
</html>


PaginaConseguridad.java

@AuthorizeInstantiation("ADMIN")
public class PaginaConseguridad extends WebPage {
}


LogOut.html


<body>

<h2>Ciaoo!</h2>
<a href="Home.html">Home</a>

</body>
</html>


LogOut.java

public class LogOut extends SignOutPage {
}

jueves, 24 de diciembre de 2009

post instalacion Kubuntu 9.10

Asumo que ya tenemos instalado Kubuntu 9.10 (la instalacion es facil y esta por todos lados como hacerla) y estos son los pasos para dejarla andando lindu




notas generales :
-kate es el blog de notas (si,muuuuuucho mejor que notepad)
-konsole es la consola de comandos (es mas facil copiar texto, pegarlo y ejecutarlo que esplicar el modo grafico de hacer las cosas, pero casi todo se puede hacer por ventanitas si no )
-konqueror es el navegador web(ya vamo a meter firefox y chrome(el de google) )
-aptitude es un programa (lo vamos a usar por linea de comando) que se encarga de instalar-desinstalar-actualizar programas y librerias de programas.
este busca en el listado de servidores que tiene configurado (en un archivo de texto que esta en /etc/apt/sources.list ) si hay una version mas nueva de lo que tengamos instalado
tambien por este programa podemos instalar soft nuevo (obviamente si esta en los repositorios configurados . sino hay que agregar la direccion del servidor donde esta )
Esto es una gran ventaja, ya que si queremos un programa, lo bajamos de un lugar seguro, nadie va a poner un virus,troyano,gusano, etc en un programa que esta en un lugar tan observado y mantenido
por la comunidad linux/gnu y si lo hicieran, enseguida seria corregido y bloqueado el usuario que lo hizo (ademas para poner programas, hay que tener cierta trayectoria en software libre )
-wine es un programa que permite instalar software que es para windows (tipo juegos, office, etc, etc)
-virtualbox es un programa para crear maquinas virtuales con este podemos instalar un xp, dentro de nuestro linux es muuuy completo este programa
-devede programa para pasar avi, mpeg, etc a dvd (y poderlo ver en el dvd comun)
-amsn y/o emesene el nombre lo dice todo
-pidgin lo mismo que los msn pero sirve para poner cuentas tipo gmail
-IRC es un canal del estilo chat, es muy importante por que es una manera genial de pedir ayuda si algo no anda, hay mucha gente muy predispuesta a ayudar
-ubuntu-tweak







Bueno primero lo primero

Alt + F2 ( lanzador de aplicaciones)-> konsole (consola-shell)

ejecutar lo que esta en despues del $ (sin el simbolo)

# (damos permisos de admin a lo que ejecutemos despues)
$ sudo -s

#(actualizamos por bugs y todo eso)
$ aptitude update && aptitude safe-upgrade

# source de mediaubuntu
$ wget http://www.medibuntu.org/sources.list.d/karmic.list --output-document=/etc/apt/sources.list.d/medibuntu.list; aptitude -q update; aptitude --yes -q --allow-unauthenticated install medibuntu-keyring; aptitude -q update


# esto va todo junto
$ cp -p /etc/apt/sources.list /etc/apt/sources.list_backup
echo "deb http://archive.ubuntu.com/ubuntu/ karmic main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ karmic main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ karmic-backports main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ karmic-backports main restricted universe multiverse
# deb http://archive.ubuntu.com/ubuntu/ karmic-proposed main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ karmic-proposed main restricted universe multiverse
deb http://archive.canonical.com/ubuntu karmic partner
deb-src http://archive.canonical.com/ubuntu karmic partner
deb http://security.ubuntu.com/ubuntu karmic-security main restricted universe multiverse
deb-src http://security.ubuntu.com/ubuntu karmic-security main restricted universe multiverse
deb http://packages.medibuntu.org/ karmic free non-free
deb-src http://packages.medibuntu.org/ karmic free non-free
deb http://archive.getdeb.net/ubuntu karmic-getdeb apps
deb http://download.virtualbox.org/virtualbox/debian karmic non-free" | sudo tee /etc/apt/sources.list ; aptitude -q update



# Programitas varios
$ aptitude install kubuntu-restricted-extras firestarter firefox libdvdread4 msttcorefonts ndiswrapper* wine devede amsn emesene pidgin ubuntu-tweak unrar


# Codecs (si tenes instalada la version de 32 bit reemplaza w64codecs por w32codecs)
aptitude install realplayer w64codecs



setxkbmap -option -option compose:lwin,compose:rwin
# si tienes un teclado US deja la linea anterior de lo contrario eliminala o comentala


--------------------------------------------------------------------------------
bueno, no termine es 24-12 =D despues edito el post y sigo Felicidades!!
--------------------------------------------------------------------------------



ref: http://ingelinux.wordpress.com/2009/09/17/afinar-kubuntu-9-04-despues-de-la-instalacion/
http://www.virtualbox.org/wiki/Linux_Downloads
http://www.nicolasgonik.com.ar/2009/11/script-post-instalacion-para-karmic-koala/ (muy groso el script)

jueves, 19 de noviembre de 2009

Test paginas con wicket messages

En el anterior post puse algo sobre la Internacionalización en wicket, ahora que pasa si tenemos los archivos.properties en otro lado que no sea la pagina

por ejemplo

home.java
home.html
home.properties

application.java
application.properties


las claves-valor q tengamos en application.properties cuando corramos los tests, no van a andar (no las va a encontrar )

esto se debe a que corriendo, wicket busca

panel_locale -> panel -> form_locale -> form -> page_locale -> page -> appication_locale -> application


pero WicketTester no, solo busca las primeras

lo q podemos hacer es en el setUp del test, especificarle que lo use, x.properties




import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import org.apache.wicket.spring.test.ApplicationContextMock;
import org.apache.wicket.util.tester.WicketTester;
import org.apache.wicket.resource.loader.ClassStringResourceLoader;

public class testHome extends TestCase {


@Override
public void setUp() {
appctx = new ApplicationContextMock();
testerApplication = new WicketTester();
testerApplication.getApplication().addComponentInstantiationListener(
new SpringComponentInjector(testerApplication.getApplication(),
appctx));
testerApplication.getApplication().getResourceSettings().addStringResourceLoader(new ClassStringResourceLoader(Application.class));
}
}





miércoles, 18 de noviembre de 2009

Internacionalización en wicket (aplicaciones multi idioma )

Obvio, no se usa mas poner los textos hace mil años =D, incluso, aunque la aplicacion este pensada para un solo idioma.
Por ? y facil, correcciones ortograficas, estandarizacion de palabras (no queda bien que un boton diga guardar, otro diga save, y otro aplicar )

Solucion magica gracias a java y wicket

archivos.properties

Simple, es un archivo de texto (o varios ) que tienen clave-valor para los textos (o configuraciones)



# comentarios
clave=valor

#clasico ejemplo hola mundo
message=Hola mundo !




ahora donde y como ponemos estos archivos ?

wicket busca primero en un archivo.properties con el mismo nombre que la pagina
por ej: home.html y home.java , va a buscar el home.properties, si no lo encuentra, va a buscar el de la clase super de este (WebPage.properties ) si no puede, su padre y asi hasta
llegar al object.java

si no encuentra la clave hasta ahi, busca por los componentes (por ejemplo panelMenu.properties , panelFooter.properties, etc ) o por la aplicacion.

Con esto, podemos tener uno con el nombre de la aplicacion, y sobreescribir si queremos algo particular, en uno

entonces


Application.properties



#clasico ejemplo hola mundo
message=Hola mundo !




home.properties



#clasico ejemplo hola mundo
message=Hola mundo sobreescrito


como se usa ?




<wicket:message key="message">esto se pisa si encuentra una clave (si no, no )</wicket:message>





en vez de poner el texto en el html


si lo queremos en un componente html por ejemplo un input



<input type="submit" value="Hello world"/>
lo reemplazamos por
<input type="submit" value="texto por defecto" wicket:message="value:helloworld"/>


y si quicieramos poner mas de una propiedad



<input type="submit" value="texto por defecto" wicket:message="value:helloworld,title:hellotitle"/>




como darle varios idiomas

se pone un archivo por cada idioma

(idioma por defecto)
application.properties
(ingles)
application.properties
(españo)
application.properties
(español argentina)
application.properties


codigos en http://msdn.microsoft.com/en-us/library/ms533052(VS.85).aspx

"si, m$ hace cosas buenas =P"



tambien podemos usar esto para configuraciones,

desde codigo java podemos levantarlo con wicket

new StringResourceModel(key, this,null)





MyPanel.properties:
bla=Un texto loco

MyPanel.html:
<span wicket:id="summary">Text that will be replaced.</span>

MyPanel.java:

Summary summary = ...;
add(new Label("summary", new StringResourceModel("bla", this, null)));





tambien se puede inducir cual locale usar

Locale.getDefault() y Locale.setDefault(Locale))




Referencias


http://cwiki.apache.org/WICKET/everything-about-wicket-internationalization.html
http://www.chuidiang.com/java/ResourceBundle/internacionalizacion.php
http://wicket.apache.org/docs/wicket-1.3.2/wicket/apidocs/org/apache/wicket/model/StringResourceModel.html
listado locales
http://msdn.microsoft.com/en-us/library/ms533052(VS.85).aspx















Powered by ScribeFire.