27th September 2008

Limite de los almacenes edb-stm de Exchange 2003

Como previamente habíamos comentado, Microsoft agregó algunas mejoras al store de Exchange standard edition.

Adios a los 16 GB
Ya todos sabemos que antes del SP2 de Exchange 2003, el límite de la base de datos era de 16 GB, sumando el .edb y el .stm. Es de recontra público conocimiento que con el SP2, este límite se va a 75 GB.
PERO, attenti a esto. Apenas instalamos SP2, el límite se va a 18 GB, y el resto lo deberemos configurar por entradas en el registro (registry) de Windows. Porqué se va a 18 GB y no a 75? Bueno, el grupo de desarrollo pensó en dos opciones:

1) Todas las implementaciones de Exchange, anteriores a SP2, se pudieron haber hecho pensando en el límite de 16 GB, por lo tanto los servidores podrían haber estado configurados para soportar sólo este tamaño (con particiones reducidas).
2) Tener mayor granularidad y evitar crecimiento no deseado en la base. A parte, sería bueno no configurarla al 100% de su capacidad, así tenemos la opción de volverla a montar con un nuevo límite y nos daría la posibilidad de reducir su “peso” bajando los correos a .pst.

La razón del cambio en registry? No se sabe, pero podemos suponer que no tuvieron tiempo para desarrollar una interface en tantos idiomas como Exchange está desarrollado.

El cambio en registry debería ser en la siguientes claves:

Store privado:
HKLM\System\CurrentControlSet\Services\MSExchangeIS\{server name}\Private-{GUID}

Para el store público:
HKLM\System\CurrentControlSet\Services\MSExchangeIS\{server name}\Public-{GUID}

La clave que debemos agregar es:
Tipo de valor: REG_DWORD
Nombre de valor: Database Size Limit in GB

Para la versión estándar, el valor que se puede agregar va de 1 a 75. Para la Enterprise, de 1 a 8000. Estos numeritos significan GB.

Para que los cambios apliquen, solamente debemos desmontar y montar el store. Si todo salió bien, un evento en el Visor de Sucesos con el número de ID 1216 será creado. Y dirá algo así como:

Tipo de suceso: Información
Origen del suceso: MSExchangeIS Mailbox Store
Categoría del suceso: General
Id. suceso: 1216
Fecha: 11/11/2005
Hora: 05:48:26 p.m.
Usuario: No disponible
Equipo: MSX01
Descripción:
El almacén de Exchange ‘Primer grupo de almacenamiento\Almacén del buzón (MSX01)’ está limitado a 53 GB. El tamaño físico actual de esta base de datos (el archivo .edb y el archivo .stm) es 13 GB. Si el tamaño físico de esta base de datos menos su espacio libre lógico excede el límite de 53 GB, la base de datos se desmontará de forma regular.

Para más información, haga clic en http://www.microsoft.com/contentredirect.asp.

Es capricho 18 GB?

Seguramente nos preguntaremos ¿porqué 18 GB y no otro número? Bien, para entender esto, tendremos que tener en mente el concepto de Database Size Buffer. Básicamente es un seteo que informa a Exchange para que grabe en el Visor de Sucesos (ID de evento: 9688) si la base de datos está cerca de su límite. La cercanía del límite sale del 10%… Cuando a la base le queda 10% para llegar al límite, Exchange entiende que está en esa cercanía. Teniendo un default de 18 GB, su frontera sería a los casi 2 GB, lo que significa que la entrada en el Visor de Sucesos sería a los 16 GB, el viejo límite.

El control del Database Size Buffer también es controlado via registro. Para modificar este valor, deberíamos tocar:

Tipo de Valor: REG_DWORD
Nombre de Valor: Database Size Buffer in Percentage

El valor ingresado debería ser el procentaje. Si ponemos 20, la advertencia se generará al 20%.

Tamaño físico o tamaño lógico?
Como previamente habíamos comentado Exchange SP2 hará diferencias entre tamaño físico y lógico para determinar el tamaño de la base. El tamaño físico hacer referencia al tamaño del .edb y .stm como lo vemos en el Explorer, o viendo sus propiedades. El tamaño lógico es ese mismo tamaño, menos los bloques libres que quedaron en la base cuando los elementos son eliminados, o descargados a PSTs. La cantidad de espacio libre, lo podremos revisar mirando el Visor de Sucesos, específicamente el suceso con ID 1221.

De manera predeterminada, estos análisis son realizados a las 5 AM, pero se puede cambiar esta config. via registry (también…):

Tipo de Valor: REG_DWORD
Nombre de Valor: Database Size Check Start Time in Hours From Midnight

El valor que tenemos que poner acá es la cantidad de horas pasada la medianoche que queremos que espere Exchange para hacer el análisis. Por ejemplo, si queremos que se haga a las 6 de la tarde, el valor acá sería de 18.

Anterior al SP2, cuando la base de datos llegaba a su límite, se desmontaba. Desde ya, podremos encontrar distintos trucos para darle un respiro de 1 GB más. Los muchachos de Redmond se pusieron las pilas y cambiaron un poquito estsa cosas. Veamos que pasa cuando llegamos a nuestro límite.
Cuando la base de datos llega a su límite, y el primer chequeo ha sido realizado por Exchange (a las 5 am) la base no es desmontada. En su lugar, un evento con ID 9689 es creado. Luego de esta advertencia, tendremos 24 horas para resolver el problema, de lo contrario al siguiente chequeo (5 am del día siguiente), la base de datos se desmontará informando un evento con ID 9690…

PERO!! Podremos montar nuevamente la base. Lástima que se desmontará a las 5 am del otro día, cuando el chequeo periódico se realice. Al menos le ganamos 24 horas más al Server…

posted in Exchange2k3, Redes, windows | 0 Comments

25th September 2008

Varios Flex - Red5

SCORE
Tras volverme loco buscando que narices era el score y el IScore.. Tras no saber como pasar ese tipo de valor desde Flex, encontre que las clases creadas para red5 con java tienen una propiedad que siempre se crea y que reciben como parametro el score  o ambito en el que la aplicación trabajo.

IScore appScore;
public boolean appStart(IScope app) {
   appScore=app;
}

Con eso ya lo tenemos resuelto y disponemos del Score para usarlo donde necesitemos
dentro de la clase java, supongo que los expertos dirán “vaya chorrada”, pero yo he perdido
una tarde entera con este tema. Espero a alguíen le sea util.

SERVICEUTILS
ServiceUtils.invokeOnAllConnections(this.appScope,”ListaUsuarios”,new Object[]{pila});
Esto nos va a permitir ejecutar desde Red5 (codigo java) una funcion de flex de modo que se ejecute para todos los usuarios conectados en ese momento. 

VIDEODISPLAY
Aqui un ejemplo de como se usa este control para poder ver tu web cam con flash.

if (Camera.getCamera()){

Camara = Camera.getCamera();

this.ctrCamaraPrivada.attachCamera(Camara);

this.lblInfo.text+=”; Cámara conectada.”

}

else

{

this.lblInfo.text +=”; Cámara no disponible.”

} 

 

posted in PHP, Programacion | 0 Comments

24th September 2008

Como pasar parametros a Flex por URL

Cómo pasar parámetros y recuperarlos en Flex.

Podemos pasarle y recoger parámetros a nuestro SWF generado con Flex de la siguiente manera:

En la página html que genera Flex cuando compilamos nuestra Aplicación, nos encontramos con código en JavaScript y también con un objeto que embebe nuestro SWF. En nuestro ejemplo se llamarágraficas.swf

Supongamos que queremos abrir la página que contiene nuestra aplicación de gráficas creadas en Flex, y cuyos valores los recogerá de un HttpService, que envía y recoge el Usuario y la Contraseña a una página en ASP, y ésta nos devuelve el resultado en XML.

Sería algo así:

<object classid=”clsid:D27CDB6E-11cf”
id=”graficas”
width=”100%” height=”100%”
codebase=”macromedia.com/get/flashplayer/current/swfla…
param name=”movie”
value=”graficas.swf?usuario=Antonio&pass=12345” />
<param name=”quality” value=”high” />
<param name=”bgcolor” value=”#869ca7″ />
<param name=”allowScriptAccess” value=”sameDomain” />
<embed src=”graficas.swf?usuario=Antonio&pass=12345
quality=”high” bgcolor=”#869ca7″ width=”100%” height=”100%”
name=”graficas” align=”middle” play=”true” loop=”false”
quality=”high” allowScriptAccess=”sameDomain”
type=”application/x-shockwave-flash”
pluginspage=”adobe.com/go/getflashplayer%22%3E…
</embed></object> 

Para pasarlo mediante el código en JavaScript, haríamos lo siguiente:

AC_FL_RunContent( “src”, “graficas?usuario=Antonio&pass=12345“,
“width”, “100%”, “height”, “100%”, “align”,
“middle”, “id”, “graficas”, “quality”, “high”,
“bgcolor”, “#869ca7″, “name”, “graficas”,
“flashvars”,’historyUrl=history.htm%3F&lconid=’ + lc_id + ”,
flashvars”,’usuario=Antonio&pass=12345′,
“allowScriptAccess”,”sameDomain”, “type”,
“application/x-shockwave-flash”, “pluginspage”,
);

En el código en JS podemos pasarle los parámetros concatenados al nombre del swf o bien ponerlos como un flashvars. De cualquiera de las dos maneras funciona.

y Podemos recuperarlos desde Flex de la siguiente manera:

private var Usuario:String=”";
private var Pass:String=”";

private function ini():void{
Usuario=Application.application.parameters.usuario;
Pass=Application.application.parameters.pass; 
}

posted in JavaScript, PHP, Programacion | 0 Comments

24th September 2008

Flex y MySql

En este primer post dedicado a la publicación o uso de bases de datos Mysqlcon nuestras aplicaciones Flex, vamos a abordar la conexión a través de una pasarela creada en PHP.

Esta primera solución es la más sencilla de todas y nos permite tener por ejemplo el frontend de nuestra aplicación en HTML y el backend en Flex.

Pongamos de ejemplo una tienda online que tiene un catálogo de productos y que queremos crear un administrador de éste mediante Flex.

El primer paso que vamos a hacer es la creación de un fichero PHP que haga las consultas pertinentes a la base de datos MySQL y nos devuelva el conjunto de resultados en XML. Este XML será procesado o consumido desde la aplicación Flex y será asociado mediante Data Binding (enlace entre controles y datos) a los controles de nuestro administrador.

Un ejemplo podría ser el siguiente:

  1. <productos>
  2. <?php
  3.     if(!($link=mysql_connect(“localhost”,“[usuario]“,“[contraseña]“))){
  4.           echo “Error conectando a la base de datos.”;
  5.           exit();
  6.     }
  7.            
  8.     if (!mysql_select_db(“[nombre_bd]“,$link)) {
  9.           echo “Error seleccionando la base de datos.”;
  10.           exit();
  11.     }
  12.  
  13.     $sql = “SELECT nombre, referencia, precio “;
  14.     $sql .= “FROM productos “;
  15.     $sql .= “ORDER BY referencia”;
  16.  
  17.     $result = mysql_query($sql,$link);
  18.     while($row = mysql_fetch_object($result)){
  19. ?>
  20.     <producto>
  21.         <referencia><?php echo $row->referencia ?></referencia>
  22.         <nombre><?php echo $row->nombre ?></nombre>
  23.         <precio><?php echo $row->precio ?></precio>
  24.     </producto>
  25. <?php
  26.     }   
  27. ?>
  28. </productos>

 

Como resultado este fichero devolverá algo como lo siguiente:

  1. <?xml version=“1.0″ encoding=“utf-8″?>
  2. <productos>
  3.      <producto>
  4.           <referencia>1</referencia>
  5.           <nombre>Primer Producto</nombre>
  6.           <precio>10.99</precio>
  7.      <producto>
  8.  
  9.      <producto>
  10.           <referencia>2</referencia>
  11.           <nombre>Segundo Producto</nombre>
  12.           <precio>15.45</precio>
  13.      <producto>
  14.  
  15.      <producto>
  16.           <referencia>3</referencia>
  17.           <nombre>Tercer Producto</nombre>
  18.           <precio>58.99</precio>
  19.      <producto>
  20. </productos>

 

Ahora pasamos a la parte Flex que se encargará de consumir este XML que nos devuelve PHP. Para ello crearemos un DataGrid que nos mostrará el resultado. Lo asociaremos mediante data binding al resultado de la llamada al php (mediante HTTPService). Usaremos el formato E4X para mayor comodidad.

  1. <?xml version=“1.0″ encoding=“utf-8″?>
  2. <mx:Application xmlns:mx=“http://www.adobe.com/2006/mxml”layout=“absolute” creationComplete=“prodRPC.send()” width=“100%”>
  3.    
  4.     <mx:HTTPService id=“prodRPC”url=“http://localhost/productos.php” resultFormat=“e4x”/>
  5.    
  6.             <mx:DataGrid id=“dgProductos” x=“10″ y=“10″dataProvider=“{prodRPC.lastResult..producto}” width=“561″height=“526″>
  7.                 <mx:columns>
  8.                     <mx:DataGridColumn dataField=“referencia” />
  9.                     <mx:DataGridColumn dataField=“nombre” />
  10.                     <mx:DataGridColumn dataField=“precio” />
  11.                 </mx:columns>
  12.             </mx:DataGrid> 
  13.    
  14. </mx:Application>

 

El resultado sería el siguiente:

Flex DataGrid Mysql

posted in PHP, Programacion | 0 Comments

24th September 2008

Flex y PHP

Continuando con la serie de minitutoriales dedicados a la integración entre Adobe Flex y una base de datos Mysql, vamos a ilustrar un nuevo ejemplo de inserción de datos a través de nuestra pasarela PHP.

Para ello vamos a seguir trabajando sobre el primer ejemplo que teníamos y vamos a crear un nuevo estado con el nombre “insert”, donde pondremos el formulario de inserción de un nuevo producto.

Formulario de Inserción de Productos

El código fuente sería el siguiente:

  1. <mx:states>
  2.     <mx:State name=“insert”>
  3.         <mx:RemoveChild target=“{button1}”/>
  4.         <mx:RemoveChild target=“{dgProductos}”/>
  5.         <mx:AddChild position=“lastChild”>
  6.             <mx:Panel x=“10″ y=“10″ width=“319″ height=“215″layout=“absolute” title=“Nuevo Producto”>
  7.                 <mx:Form x=“0″ y=“0″>
  8.                     <mx:FormItem label=“Referencia”>
  9.                         <mx:TextInput id=“referencia” width=“106″/>
  10.                     </mx:FormItem>
  11.                     <mx:FormItem label=“Nombre”>
  12.                         <mx:TextInput id=“nombre”/>
  13.                     </mx:FormItem>
  14.                     <mx:FormItem label=“Precio”>
  15.                         <mx:TextInput id=“precio”/>
  16.                     </mx:FormItem>
  17.                 </mx:Form>
  18.                 <mx:ControlBar horizontalAlign=“right”>
  19.                     <mx:Button label=“Cancelar”click=“this.currentState=””/>
  20.                     <mx:Button label=“Insertar” id=“botInsertar”click=“insertaProducto()”/>
  21.                 </mx:ControlBar>
  22.             </mx:Panel>
  23.         </mx:AddChild>
  24.     </mx:State>
  25. </mx:states>

 

Por otra parte deberemos crear una llamada HTTPService para llamar al fichero PHP que se encarga de la inserción. Destacar que debemos poner el mismo método de petición (GET o POST) en ambos sitios:

  1. <mx:HTTPService id=“insertProd”url=“http://localhost/lsensualite/xml/insertProductos.php”method=“GET” resultFormat=“text” result=“resultHandler(event)”/>

 

(Fichero PHP)

  1. if(!($link=mysql_connect(“localhost”,“[usuario]“,“[contraseña]“))){
  2.      echo “Error conectando a la base de datos.”;
  3.      exit();
  4. }
  5. if (!mysql_select_db(“[nombre_bd]“,$link)) {
  6.      echo “Error seleccionando la base de datos.”;
  7.      exit();
  8. }
  9.  
  10. $sql = “INSERT INTO productos (referencia, nombre, precio) “;
  11. $sql .= “VALUES (’” . $_GET["referencia"] . “‘,’” . $_GET["nombre"]“‘,” . $_GET["precio"] . “) “;
  12.  
  13. $result = mysql_query($sql,$link);

 

Por último nos queda definir la función que se desencadenará al pulsar el botón insertar del formulario:

  1. <mx:Script>
  2.     <![CDATA[         
  3.         import mx.rpc.events.ResultEvent;
  4.            
  5.         public function resultHandler( event: ResultEvent ):void {
  6.             // Refresco el DataGrid del primer estado
  7.             prodRPC.send();           
  8.         }   
  9.        
  10.         public function insertaProducto():void {
  11.             // Recojo los parámetros
  12.             var parametros:Object = new Object;
  13.             parametros.referencia = referencia.text;
  14.             parametros.nombre = nombre.text;
  15.             parametros.precio = precio.text;
  16.             // Llamo a PHP
  17.             insertProd.send(parametros);
  18.             // Vuelvo al estado inicial
  19.             this.currentState = "";    
  20.         }
  21.     ]]>
  22. </mx:Script>

posted in PHP, Programacion | 0 Comments

24th September 2008

Proyectos Java para RED5

aqui dejo un link interesante para todos aquellos que quieran montar una aplicacion java sobre red5.

http://groups.google.com/group/cea-j2ee/web/proyecto-nuevo-con-red5-y-spring?hl=es

posted in General | 0 Comments

21st September 2008

Truco para obtener los servicios que corren en windows

Lo vi en el blog de “Noticias Informaticas” y me parecio tan chorra como interesante. Aqui os lo dejo.

En Windows hay decenas de servicios funcionando por detrás que son los que hacen que el sistema funcione al 100% (o no, claro). Para consultar estos servicios y ver cuales están funcionando y cuales no podemos acceder a la consola de servicios simplemente yéndonos a Inicio, Ejecutar, escribimos services.msc y dándole a Aceptar.

En esta consola encontraremos todos los servicios, tanto los que están corriendo como los que no. Sin embargo desde la consola de servicios no podemos obtener una lista de los que están funcionando para consultarla más tarde o simplemente guardar un registro.

Para hacer esto debemos recurrir a la consola de comandos y al comando net. Para ello nos vamos a Inicio, Ejecutar, escribimos cmd y le damos a Aceptar. En la consola debemos introducir lo siguiente:

net start

En pantalla se mostrarán todos los servicios que están funcionando. Si lo que queremos es volcar esta información a un archivo simplemente escribiríamos esto:

net start > servicios.txt

Donde servicios.txt se puede sustituir por el nombre que nosotros queramos.

posted in windows | 0 Comments

16th September 2008

Instalar disco usb en Ubuntu

Aqui os dejo un post de http://www.syntaxerror.es.
Lacie 500 GBEste artículo es a la vez simple y útil. Dado que los discos duros externos USB están tan baratos en relación a la capacidad que tienen (en Mediamarkt, un Lacie de 500 GB por 116 euros, por ejemplo) sale muy a cuenta adquirir uno para almacenar nuestras fotos y nuestros documentos… hasta de aquí 3 años almenos ;)

Partiendo de los anteriores artículos Instalar un Servidor Linux Casero: Ubuntu Festy 7.04 y Montar Samba en Ubuntu Festy Server: Carpetas Compartidas, voy a explicar el proceso para instalar un disco duro USB en el servidor y prepararlo para el acceso via Samba, como un recurso compartido visto desde Windows.

Llegamos a casa con nuestro flamante disco duro externo USB bajo el brazo, lo desembalamos y lo dejamos preparado para ser conectado. Antes de conectarlo abrimos una consola al servidor y verificamos qué volúmenes tenemos conectados al USB, para saber luego cuáles son los nuevos cuando lo conectemos:

$ ls -l /dev/sd*

En Ubuntu, las unidades de almacenamiento de datos (discos duros, lápices USB, …) se nombran como si de unidades SCSI se trataran (sda, sdb, …). Justo ahora podemos conectar el disco duro al ordenador y lo encendemos. El sistema operativo lo reconoce y crea un dispositivo nuevo en /dev. Volvemos a ejecutar el mismo comando:

$ ls -l /dev/sd*

Nos habrán aparecido al menos dos entradas más. Por ejemplo, sdb y sdb1. Este ultimo sera el volumen que montaremos. Ubuntu tiene una nueva forma de identificar los dispositivos, usando su UUID, y lo descubrimos mediante la siguiente instruccion:

$ vol_id /dev/sdb1

Esta nos dara informacion sobre el volumen, de la que nos interesa apuntarnos los valores de los campos ID_FS_TYPE y ID_FS_UUID. El primero es el tipo de particion, importante pues la necesitamos tambien para montarlo, y el segundo es el famoso UUID.

Seguidamente, creamos el directorio que contendra el volumen para nuestros acesos

$ mkdir /mnt/datos2

Y ahora el punto importante, registrar el volumen en el archivo fstab para arrancarlo cada vez que inicie el sistema.

$ vim /etc/fstab

Y crearemos una linea nueva al final del archivo como la siguiente:

UUID=xxxxx /mnt/datos2 vfat

Donde xxxxx es el UUID que nos hemos apuntado anteriormente y vfat es el tipo de particion que tmbien nos hemos apuntado antes.

Una vez guardado el archivo, solo necesitamos recargar el fstab con la siguiente instruccion:

$ mount -a

Compartir el disco duro externo USB por Samba

Dado que tenemos tanto espacio, que tal si lo agregamos a la lista de recursos compartidos que tenemos disponibles? La tarea es sencilla, pero debemos fijarnos en algunos parametros especiales que hasta ahora no hemos tenido en cuenta. Si recordamos el articulo anterior Montar Samba en Ubuntu Festy Server: Carpetas Compartidas, una de las gracias del sistema que montamos es el tema de permisos basado en un grupo de usuarios y unos derechos heredados para todos los archivos que se generen dentro del arbol. La gran diferenia en el caso que nos ocupa es el tipo de particion vfat, que no permite jugar con los permisos de usuario y archivo como lo hacemos con particiones propias de Linux (ext3, …).

Asi que la unica forma de poder setar los mismos permisos es en el momento de montar el volumen. Para ello, debemos editar el archivo de montaje de volumenes:

$ vim /etc/fstab

Y sustituir la entrada referente al disco duro externo USB que acabamos de insertar por la siguiente:

UUID=xxxxx /mnt/datos2 vfat rw,owner,group,uid=1000,gid=1004,suid,dmask=002,fmask=113

Los valores nuevos son los siguientes:

  • rw: Para permitir el acceso en modo lectura y escritura.
  • owner: Define que al montaje del volumen se relacione este con el usuario especificado (mas adelante)
  • group: Lo mismo pero relacionado con el grupo.
  • uid: Define el usuario que tomara posesion del volumen montado. Se define por ID, no por nombre, asi que se debera consultar el archivo /etc/passwd para conocer el ID del usuario que nos interese (en nuestro caso, pepe).
  • gid: Lo mismo pero relacionado con el grupo. El ID lo sacamos del archivo /etc/group, y en nuestro caso nos interesa el grupo samba.
  • suid: Especifica el bit de herencia para los permisos de usuario y archivos que se creen a posteriori en el volumen.
  • dmask: Espeifica que permisos adquiriran los directorios al crearse. Esta escrito en forma de mascara, asi que si queremos que adquieran el permiso 775 deberemos introducir el 002 (777 - 775 = 002).
  • fmask: Lo mismo pero relacionado con los permisos de los archivos. Si queremos el permiso 664 deberemos introducir el 113.

Y acto seguido recargamos el fstab:

$ mount -a

posted in Linux | 0 Comments