Translate

domingo, 27 de mayo de 2012

ANT: Conversión de la fecha del sistema a String con formato.


Prerequisitos: Conocimientos básicos de apache ANT (instalación y uso)

Partiendo de la base que ya tenemos los conocimentos básicos de como instalar y usar apache ant, vamos a ver como conseguir imprimir una fecha con el formato 20120412190755.

El objetivo de esta investigación ha sido para utilizar este formato de fecha como nombre de un archivo JAR que se genera cada cierto tiempo. De este modo conseguimos un nombre siempre diferente para el archivo.


La manera de conseguir esto es con la tarea de ANT tsamp que permite recuperar la fecha del sistema y darle el formato deseado.

Para darle formato utilizarmos la propiedad pattern y los formatos disponibles lo podemos formar como queramos en base a estas opciones:

Letter Date or Time Component Presentation Examples
G Era designator Text AD
y Year Year 1996; 96
M Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800


Aquí os pongo el código que genera la fecha actual en formato [añomesdiahoraminutosysegundos]




<project basedir="." default="run" name="test">
<target name="run">
   <tstamp>
     <format pattern="yyyyMMdHHmmss" property="VERSION">
     </format>   
   </tstamp>
 
   <echo message="${VERSION}">
   </echo></target>
</project>

Referencias:

Documentación de tstamp

Ejemplo de uso para nombrar un archivo

jueves, 17 de mayo de 2012

Flex 4: Acceder al contenedor padre de un Itemrenderer

Calling parent container from ItemRendere.

Pre-requisitos: Conocimientos básicos de Flex 4 (funcionamiento de un Itemrenderer) y Action Script 3.

Una de las mejores características de flex es que te permite crear listas de objetos, con la particularidad de que podemos crear diseños e interfaces muy visuales de estos objetos gracias a los Itemrederers. Por ejemplo, una lista botones donde cada botón tiene un diseño similar con funcionalidad similar.

Pero puede que tengamos la necesidad de acceder, no sólo a la lista que contiene al itemrenderer sino también a la vista que contiene a esta lista para acceder a alguno de sus objetos declarados o funciones.

La parte negativa de esto es que el Itemrenderer que lo utilice quedará totalmente acoplado a la vista padre a la que hacemos referencia y no podrá ser un elemento independiente y reutilizable por otras listas.

El propio itemrenderer ya nos trae distintas propiedades rellenas con la información de los datos con lo que hemos rellenado la lista.


data: Contiene la información del elemento de la lista al que representa el itemrenderer.
parentDocument: hace referencia a algún objetos padre que contiene al itemrederer.

También se puede sobre-escribir funciones  como set data() que se ejecutará para de asignar el valor de uno de los elementos de la lista al itemrenderer.

Para acceder a la vista padre lo que debemos utilizar es parentDocument.parentDocument que nos devolverá un objeto del tipo de contiene a lista.


El ejemplo que os pongo a continuación es una mxml principal(MainApp.mxml) con una lista y el itemrender utilizado (ServiceIR.mxml). Se supone que ambos están en el mismo paquete de la aplicación.


MainApp.mxml

<s:Application
................

<s:Group width="100%">
                              <s:HGroup left="40" top="40">

                                        <s:List width="100%" dataProvider="{items}"
                                                            itemRenderer="ServicesIR"
                                                            contentBackgroundColor="#E6E7E8" borderVisible="false">

                                                  <s:layout>
                                                            <s:HorizontalLayout columnWidth="50" gap="5"/>
                                                  </s:layout>
                                        </s:List>

.....

</Application>


El objeto items del data provider podría ser un arrayCollections de Strings por ejemplo.

ServicesIR.mxml


<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                                        xmlns:s="library://ns.adobe.com/flex/spark"
                                        xmlns:mx="library://ns.adobe.com/flex/mx"
                                        autoDrawBackground="true">
...

<fx:Script>
                    <![CDATA[

              override public function set data(value:Object):void
              {
              var parent:MainApp =  parentDocument.parentDocument; //Instance of MainApp.mxml
                    ............................
              }

]]>
</fx:Script>


     ..............
  }

<s:ToggleButton id="tab"  label="{data}" horizontalCenter="0" verticalCenter="0"/>


</s:ItemRenderer>


Utilizo la función set data para asignar para recuperar al objeto padre y acceder a lo que necesite para modificar los datos como sea necesario.






miércoles, 16 de mayo de 2012

Action Script 3: Sentencias condicionales con el operador ternario.

Conditional sentencies with ternary operator Ya sé que es un inmensa tontería y que en casi todos los lenguajes es muy similar pero no puedo evitar liarme siempre con este operador.

Así que lo pongo en el blog y no me lio más.


Código normal:
var color:String;
var verdura:String = 'tomate';
if (verdura == 'tomate') {
   color= 'rojo';
} else {
   color= '????';
}
trace(color); //muestra 'rojo'
Código con el operador ternario
var color:String;
var verdura:String = 'tomate';
color = verdura == 'tomate' ? 'rojo' : '????'
trace(color) //muestra 'rojo'

martes, 8 de mayo de 2012

MAVEN: Eliminar las dependencias transitivas de tu POM.xml


Remove transitive dependencies from your pom.xml

Prerequistos: Conocimientos básicos de MAVEN y la configuración de las dependencias de un proyecto en el pom.xml.

El objetivo de eliminar las dependencias transitivas es porque no quiero que las dependencias de mis proyectos  descarguen sus propias dependencias ya que en la mayoría de casos es innecesaria.

Por ejemplo imaginemos que tenemos el siguiente caso:

  • ProyectoPrincipal
    • Dependencias
      • ProyectoApi
    • genera un archivo WAR: ProyectoPrincipal.war
  • ProyectoApi
    • Dependencias
      • ProyectoLibrería
    • genera un archivo JAR  ProyectoApi.jar.
  • ProyectoLibrería
    • Dependencias (ninguna)
    • genera un archivo JAR: ProyectoLibrería.jar


Con esta estructura de dependencias, cuando miro los JAR que hay en las dependencias de MAVEN del proyecto principal y veo los dos archivos jar.
  • ProyectoApi.jar
  • ProyectoLibrería.jar
Cuando lo que yo quiero es que sólo aparezca la librería ProyectoApi.jar

Cuando tienes pocos proyectos dependientes puede resultar cómodo pero cuando tienes muchos puede liarte mucho e incluso mezclar archivos jar de otros proyectos que no son necesarios.

Yo prefiero por mi mismo poner el en POM del ProyectoPrincipal las dos dependencias si son necesarias y no que MAVEN lo haga por si mismo.

Para evitar que MAVEN descargue las dependencias transitivas del proyectoApi tenemos que añadir el apartado <exclusions> para evitarlo.

Ejemplo:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.antuansoft</groupId>
  <artifactId>ProyectoPrincipal</artifactId>
  <version>1.0.0</version>
  <groupId>org.antuansoft</groupId>
  <packaging>war</packaging> 

  <dependencies>

  <dependency>
       <artifactId>ProyectoApi</artifactId>
       <version>1.0.0</version>
       <exclusions>
          <exclusion>
              <groupId>*</groupId>
              <artifactId>*</artifactId>
          </exclusion>
        </exclusions>
     </dependency>
 
 .......

  <dependencies>
 
 .....
 
</project> 



jueves, 3 de mayo de 2012

Problemas con eclipse y proyectos flex: output folder

Configurando proyectos en eclipse para flex concretamente, cuando un proyecto flex tenía que generar un swf dentro de otro, me he encontrado que cuando he intentado volver cambiar la configuración del lugar donde estos módulos tienen que generar su swf, no es tan fácil.

Por ejemplo tengo estos proyectos:

ProyectoFlexprincipal (ppal.swf)
  • flex_src
    • assets
      • modules
        • pfs1.swf
        • pfs2.swf
      • images
    • com
      • app.....
  • bin-debug
    •  ppal.swf
  • libs
ProyectoFlexSecundario1 (pfs1.swf):
  • src
    •  com
      • app.....
  • bin-debug
  • libs
ProyectoFlexSecundario2 (pfs2.swf):
  • src
    •  com
      • app.....
  • bin-debug
  • libs

Para hacer que los proyectos secundarios generen su swf dentro del proyecto principal seleccionamos el proyecto >> botón derecho >> properties>>Flex Build Path


En el campo output Folder ponemos la siguiente ruta:
${DOCUMENTS}\ProyectoFlexprincipa\flex_src\assets\modules

Y funciona perfectamente.

El problema es que a veces me he encontrado en la situación que después de usar mucho tiempo  esta configuración, he tenido que cambiar y a veces el entorno me hadado problemas devolviendo el siguiente error:

The current displayed page contains invalid values.



Y no había manera de modificar estos valores.

Para modificar los lo que he tenido que hacer es modificar los archivos de eclipse.

Concretamente el .project y el .actionScriptProperties, en realidad sólo hay que modificar este segundo archivo ya que el primero se cambia sólo.

El parámetro que tengo que añadir a este archivo .actionScriptProperties es lo siguiente
 
  •  outputFolderLocation="DOCUMENTS/ProyectoFlexprincipa/flex_src/assets/modules" 
  • outputFolderPath="bin-debug"

en el apartado de <compiler ....


 
  <compiler additionalCompilerArguments="-locale es_ES" autoRSLOrdering="true" copyDependentFiles="false" fteInMXComponents="false" generateAccessible="false" htmlExpressInstall="true" htmlGenerate="false" htmlHistoryManagement="true" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderLocation="DOCUMENTS/ProyectoFlexprincipa/flex_src/assets/modules" outputFolderPath="bin-debug" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" verifyDigests="true" warn="true">
Este cambio hace que en el .project se añada automáticamente la siguiente línea que completa la configuración y permite hacer la modificación


 <projectDescription>

<linkedResources>
  <link>
   <name>bin-debug</name>
   <type>2</type>
   <locationURI>DOCUMENTS/ProyectoFlexprincipa/flex_src/assets/modules</locationURI>
  </link>
 </linkedResources>
</projectDescription> 

martes, 1 de mayo de 2012

Creación de un certificado para firmas aplicaciones Android hechas en Flex

Para la creación del paquete en FLEX para ANDROID se requieren dos cosas principales
 
1 - el número de versión de la aplicación que debemos de poner en el archivo nombre_aplicacion-app.xml de proyecto flex mobile

2 - la creación de un certificado con 25 años de vigencia para que firme el apk generado 
 
 
Para obtener el certificado debemos abrir una ventana de línea de comandos y situarnos en el directorio bin de la SDK de flex que utilicemos:
 
...\Adobe Flash Builder 4.6\sdks\4.6.0\bin 
 
y  utilizar el siguiente comando 

 
adt -certificate -validityPeriod 25 -cn XXXX 2048-RSA c:\XXXXX\certificado.pfx cert_ped 
 
 
Los paramétros e información son los siguientes:
 
- validityPeriod periodod de validación del certificado 25 años

- cn Nombre de la empresa: XXXX 
 
- codificación: 2048-RSA 
 
- ruta donde se generará el certificado:  c:\XXXXX\certificado.pfx

- password del certficado: cert_ped 
 
 
Con el certificado que nos genere ya podre firmar la aplicación desde el exportador de proyectos de flash builder 4.6
 
 
 
Referencias:


http://help.adobe.com/en_US/air/build/air_buildingapps.pdf
 
Referencias para IOS:
 
http://www.adobe.com/devnet/air/articles/packaging-air-apps-ios.html