<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-464513392335827691</id><updated>2012-01-28T12:28:18.538-08:00</updated><title type='text'>El despacho de los jorges</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>72</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-515476664485683321</id><published>2011-04-24T02:47:00.000-07:00</published><updated>2011-04-24T03:36:39.374-07:00</updated><title type='text'>OpenGL-ES2.0 y Monotouch IV (Cube3D parte2)</title><content type='html'>En esta segunda parte veremos dos técnicas que mejorarán el ejemplo anterior. La primera será crear una estructura para todas las propiedades de nuestros vértices. Si nos damos cuenta de cada vértice cada vez vamos a necesitar más información, empezamos por la posición, el color, luego añadimos las coordenadas de textura y para técnicas de iluminación o normal map necesitaremos la normal, la binomial y la tangente por lo que tendríamos que tener un motón de arrays que pasar al VertexShader. &lt;br /&gt;&lt;br /&gt;La forma más elegante de resolver esto es usar una estructura básica para nuestros vértices. Para nuestro ejemplo en principio sólo necesitamos conocer la posición y las coordenadas de textura por lo que nuestra estructura será:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;struct VertexType{&lt;br /&gt;    public Vector3 position;&lt;br /&gt;    public Vector2 textureCoordinates;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Una vez tenemos nuestra estructura vamos a definir nuestro cubo. En la primera parte de este tutorial usamos para dibujar la función GL.DrawArrays de OpenGL lo cual nos provocaba tener que especificarle los 3 vértices de cada triángulo y teníamos muchos vértices repetidos en el array de vértices que le pasábamos a nuestro VertexShader. &lt;br /&gt;&lt;br /&gt;Esto se soluciona usando el método de dibujado &lt;span style="font-weight:bold;"&gt;GL.DrawElements&lt;/span&gt; ya que nos permite especificarle los triangulos a través de un array de índices. De esta forma nosotros ahora sólo tenemos que especificar los 8 vértices que tiene nuestro cubo y luego pasar el array de índices que cuenta con combinaciones de estos vértices.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://lh4.googleusercontent.com/_MqAEAq68mQ0/TbLrMvBP4FI/AAAAAAAAEuA/Y2lY1JOJv8Q/cubo.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 161px; height: 155px;" src="https://lh4.googleusercontent.com/_MqAEAq68mQ0/TbLrMvBP4FI/AAAAAAAAEuA/Y2lY1JOJv8Q/cubo.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;por lo que especificaremos los 8 vértices:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;vertexArray = new VertexType[8];&lt;br /&gt;vertexArray[0].position = new Vector3(-0.5f,-0.5f,0.0f);&lt;br /&gt;vertexArray[0].textureCoordinates = new Vector2(0,1);&lt;br /&gt;vertexArray[1].position = new Vector3(0.5f,-0.5f,0.0f);&lt;br /&gt;vertexArray[1].textureCoordinates = new Vector2(1,1);&lt;br /&gt;vertexArray[2].position = new Vector3(0.5f,0.5f,0.0f);&lt;br /&gt;vertexArray[2].textureCoordinates = new Vector2(1,0);&lt;br /&gt;vertexArray[3].position = new Vector3(-0.5f,0.5f,0.0f);&lt;br /&gt;vertexArray[3].textureCoordinates = new Vector2(0,0);&lt;br /&gt;vertexArray[4].position = new Vector3(-0.5f,-0.5f,1.0f);&lt;br /&gt;vertexArray[4].textureCoordinates = new Vector2(0,1);&lt;br /&gt;vertexArray[5].position = new Vector3(0.5f,-0.5f,1.0f);&lt;br /&gt;vertexArray[5].textureCoordinates = new Vector2(1,1);&lt;br /&gt;vertexArray[6].position = new Vector3(0.5f,0.5f,1.0f);&lt;br /&gt;vertexArray[6].textureCoordinates = new Vector2(1,0);&lt;br /&gt;vertexArray[7].position = new Vector3(-0.5f,0.5f,1.0f);&lt;br /&gt;vertexArray[7].textureCoordinates = new Vector2(0,0);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;y ahora vamos a especificar los índices o lo que es lo mismo como combinar dichos 8 vértices para construir los triángulos de nuestro cubo.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;ushort[] indexes = {0,1,2,0,2,3,&lt;br /&gt;                   4,5,1,4,1,0,&lt;br /&gt;                   4,0,3,4,3,7,&lt;br /&gt;                   1,5,6,1,6,2,&lt;br /&gt;                   6,7,3,6,3,2,&lt;br /&gt;                   5,4,7,5,7,6};&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;(Nota. Como podeís observar en el array de índices, cada fila sería una cara de nuestro cubo. Ej. la cara frontal estaría compuesta por 2 triángulos formados por los vértices 0-1-2 y 0-2-3)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bien pues ahora a nuestra función de dibujado GL.DrawElements le pasamos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;GL.DrawElements(All mode, int count, All type, IntPtr indices)&lt;/span&gt;&lt;br /&gt;- mode puede valer (All.Points/All.Lines/All.LineStrip,/All.LineLoop/ All.Triangles/ All.TriangleStrip / All.TriangleFan)&lt;br /&gt;- count es el número total de índices que vamos a pasarle.&lt;br /&gt;- type especifica el tipo de dato que alberga el array de índices, (All.UnsignedShort para nuestro ejemplo)&lt;br /&gt;- indices que será el array de índices.&lt;br /&gt;&lt;br /&gt;Una cosa importante en este punto es detectar que le tenemos que enviar un puntero a nuestra estructura y no nuestra propia estructura para ellos haremos uso de la clase &lt;span style="font-weight:bold;"&gt;GCHandle&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;GCHandle indexesHandle = GCHandle.Alloc(indexes, GCHandleType.Pinned);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;De esta forma tenemos un puntero a nuestro array de índices y para llamar al GL.DrawElements haremos:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;GL.DrawElements(All.Triangles, indexes.Length, All.UnsignedShort, indexesHandle.AddrOfPinnedObject());&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bien pues una cosa similar vamos a hacer con nuestra estructura de vértices para poder pasarsela a nuestro VertexShader, lo primero creamos un puntero a nuestra estructura.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;GCHandle vertexArrayHandle = GCHandle.Alloc(vertexArray, GCHandleType.Pinned);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y para poder inyectar los vértices en el VertexShader:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;int size = sizeof(float)*3+sizeof(float)*2;&lt;br /&gt;GL.VertexAttribPointer(attributePosition,3,All.Float,false,size,vertexArrayHandle.AddrOfPinnedObject());&lt;br /&gt;GL.VertexAttribPointer(attributeTexCoord,2,All.Float,false,size,(IntPtr)((uint)vertexArrayHandle.AddrOfPinnedObject()+(uint)(sizeof(float)*3)));&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Donde size es la variable que calcula el tamaño de nuestra estructura compuesta por un Vector3 y un Vector2 de ahí el sizeof(float)*3 + sizeof(float)*2 que nos será útil pasar al VertexAttribPointer para que conozca la unidad básica o stride que es como se conoce el parámetro. También añadir que para las coordenadas de texturas hemos tenido que sumar un offset a nuestro puntero que salte el Vector3 de la posición de los vértices y empiece siempre con las coordenadas de textura. Si tuvieramos más atributos para nuestros vértices tendríamos que ir realizando diferentes offset.&lt;br /&gt;&lt;br /&gt;Bueno pues con la creación de estructuras y la utilización del método de pintado GL.DrawElements el código final de nuestra clase EAGLView.cs nos queda:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;#define OPENGLES2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using OpenTK.Platform.iPhoneOS;&lt;br /&gt;using MonoTouch.CoreAnimation;&lt;br /&gt;using OpenTK;&lt;br /&gt;    &lt;br /&gt;using OpenTK.Graphics.ES20;&lt;br /&gt;&lt;br /&gt;using MonoTouch.Foundation;&lt;br /&gt;using MonoTouch.ObjCRuntime;&lt;br /&gt;using MonoTouch.OpenGLES;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Drawing;&lt;br /&gt;using OpenTK.Platform;&lt;br /&gt;using MonoTouch.CoreGraphics;&lt;br /&gt;using MonoTouch.UIKit;&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;&lt;br /&gt;namespace Cube3D2&lt;br /&gt;{&lt;br /&gt;    public partial class EAGLView : iPhoneOSGameView&lt;br /&gt;    {&lt;br /&gt;        int viewportWidth, viewportHeight;&lt;br /&gt;        int program;&lt;br /&gt;        &lt;br /&gt;        struct VertexType{&lt;br /&gt;            public Vector3 position;&lt;br /&gt;            public Vector2 textureCoordinates;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        VertexType[] vertexArray;&lt;br /&gt;        GCHandle vertexArrayHandle;&lt;br /&gt;        &lt;br /&gt;        ushort[] indexes = {0,1,2,0,2,3,&lt;br /&gt;                            4,5,1,4,1,0,&lt;br /&gt;                            4,0,3,4,3,7,&lt;br /&gt;                            1,5,6,1,6,2,&lt;br /&gt;                            6,7,3,6,3,2,&lt;br /&gt;                            5,4,7,5,7,6};&lt;br /&gt;        GCHandle indexesHandle;&lt;br /&gt;    &lt;br /&gt;        //Texture&lt;br /&gt;        int textureId;&lt;br /&gt;        &lt;br /&gt;        IntPtr data;&lt;br /&gt;        &lt;br /&gt;        Matrix4 matWorldViewProjection, matProjection, matView, matWorld;&lt;br /&gt;        int uniformMat, uniformSampler;&lt;br /&gt;        int attributePosition = 0;&lt;br /&gt;        int attributeTexCoord = 1;&lt;br /&gt;&lt;br /&gt;        [Export(&amp;quot;layerClass&amp;quot;)]&lt;br /&gt;        static Class LayerClass ()&lt;br /&gt;        {&lt;br /&gt;            return iPhoneOSGameView.GetLayerClass ();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [Export(&amp;quot;initWithCoder:&amp;quot;)]&lt;br /&gt;        public EAGLView (NSCoder coder) : base(coder)&lt;br /&gt;        {&lt;br /&gt;            LayerRetainsBacking = false;&lt;br /&gt;            LayerColorFormat = EAGLColorFormat.RGBA8;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        protected override void CreateFrameBuffer ()&lt;br /&gt;        {&lt;br /&gt;            ContextRenderingApi = EAGLRenderingAPI.OpenGLES2;&lt;br /&gt;            base.CreateFrameBuffer();&lt;br /&gt;            Initialize();&lt;br /&gt;        }                                 &lt;br /&gt;        &lt;br /&gt;        private bool Initialize()&lt;br /&gt;        {&lt;br /&gt;            viewportHeight = Size.Height; &lt;br /&gt;            viewportWidth = Size.Width;&lt;br /&gt;            &lt;br /&gt;            //Structure&lt;br /&gt;            vertexArray = new VertexType[8];&lt;br /&gt;            vertexArray[0].position = new Vector3(-0.5f,-0.5f,0.0f);&lt;br /&gt;            vertexArray[0].textureCoordinates = new Vector2(0,1);&lt;br /&gt;            vertexArray[1].position = new Vector3(0.5f,-0.5f,0.0f);&lt;br /&gt;            vertexArray[1].textureCoordinates = new Vector2(1,1);&lt;br /&gt;            vertexArray[2].position = new Vector3(0.5f,0.5f,0.0f);&lt;br /&gt;            vertexArray[2].textureCoordinates = new Vector2(1,0);&lt;br /&gt;            vertexArray[3].position = new Vector3(-0.5f,0.5f,0.0f);&lt;br /&gt;            vertexArray[3].textureCoordinates = new Vector2(0,0);&lt;br /&gt;            vertexArray[4].position = new Vector3(-0.5f,-0.5f,1.0f);&lt;br /&gt;            vertexArray[4].textureCoordinates = new Vector2(0,1);&lt;br /&gt;            vertexArray[5].position = new Vector3(0.5f,-0.5f,1.0f);&lt;br /&gt;            vertexArray[5].textureCoordinates = new Vector2(1,1);&lt;br /&gt;            vertexArray[6].position = new Vector3(0.5f,0.5f,1.0f);&lt;br /&gt;            vertexArray[6].textureCoordinates = new Vector2(1,0);&lt;br /&gt;            vertexArray[7].position = new Vector3(-0.5f,0.5f,1.0f);&lt;br /&gt;            vertexArray[7].textureCoordinates = new Vector2(0,0);&lt;br /&gt;            vertexArrayHandle = GCHandle.Alloc(vertexArray, GCHandleType.Pinned);&lt;br /&gt;                            &lt;br /&gt;            indexesHandle = GCHandle.Alloc(indexes, GCHandleType.Pinned);&lt;br /&gt;&lt;br /&gt;            // Vertex and fragment shaders&lt;br /&gt;            string vertexShaderSrc =  @&amp;quot;uniform mat4 uMVPMatrix;&lt;br /&gt;                                        attribute vec4 aPosition; &lt;br /&gt;                                        attribute vec2 aTexCoord;&lt;br /&gt;                                        varying vec2 vTexCoord;&lt;br /&gt;                                        void main()                  &lt;br /&gt;                                        {                         &lt;br /&gt;                                           vTexCoord = aTexCoord;&lt;br /&gt;                                           gl_Position = uMVPMatrix * aPosition; &lt;br /&gt;                                        }&amp;quot;;                           &lt;br /&gt;            &lt;br /&gt;            string fragmentShaderSrc = @&amp;quot;precision mediump float;&lt;br /&gt;                                         varying vec2 vTexCoord;&lt;br /&gt;                                         uniform sampler2D sTexture;&lt;br /&gt;                                           void main()                                &lt;br /&gt;                                           {                                         &lt;br /&gt;                                             //gl_FragColor = vec4(1.0,0.0,0.0,1.0);&lt;br /&gt;                                            gl_FragColor = texture2D(sTexture, vTexCoord);&lt;br /&gt;                                           }&amp;quot;;&lt;br /&gt;&lt;br /&gt;            int vertexShader = LoadShader (All.VertexShader, vertexShaderSrc );&lt;br /&gt;            int fragmentShader = LoadShader (All.FragmentShader, fragmentShaderSrc );&lt;br /&gt;            program = GL.CreateProgram();&lt;br /&gt;            if (program == 0)&lt;br /&gt;                throw new InvalidOperationException (&amp;quot;Unable to create program&amp;quot;);&lt;br /&gt;&lt;br /&gt;            GL.AttachShader (program, vertexShader);&lt;br /&gt;            GL.AttachShader (program, fragmentShader);&lt;br /&gt;            &lt;br /&gt;            //Set position&lt;br /&gt;            GL.BindAttribLocation (program, attributePosition, &amp;quot;aPosition&amp;quot;);&lt;br /&gt;            GL.BindAttribLocation (program, attributeTexCoord, &amp;quot;aTexCoord&amp;quot;);&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            GL.LinkProgram (program);&lt;br /&gt;&lt;br /&gt;            int linked = 0;&lt;br /&gt;            GL.GetProgram (program, All.LinkStatus, ref linked);&lt;br /&gt;            if (linked == 0) {&lt;br /&gt;                // link failed&lt;br /&gt;                int length = 0;&lt;br /&gt;                GL.GetProgram (program, All.InfoLogLength, ref length);&lt;br /&gt;                if (length &amp;gt; 0) {&lt;br /&gt;                    var log = new StringBuilder (length);&lt;br /&gt;                    GL.GetProgramInfoLog (program, length, ref length, log);&lt;br /&gt;                    Console.WriteLine (&amp;quot;GL2&amp;quot;, &amp;quot;Couldn't link program: &amp;quot; + log.ToString ());&lt;br /&gt;                    return false;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                GL.DeleteProgram (program);&lt;br /&gt;                throw new InvalidOperationException (&amp;quot;Unable to link program&amp;quot;);&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            //View&lt;br /&gt;            matWorld = Matrix4.Identity;&lt;br /&gt;            float aspectRatio = (float) (Size.Width) / (float)(Size.Height);&lt;br /&gt;            matProjection = Matrix4.CreatePerspectiveFieldOfView(((float)(Math.PI) / 180.0f)*45.0f, aspectRatio, 1.0f,20.0f);&lt;br /&gt;            matView = Matrix4.CreateRotationX(0.5f)*Matrix4.CreateTranslation(0,0,-8);&lt;br /&gt;            matWorldViewProjection = matWorld * matView * matProjection;&lt;br /&gt;            &lt;br /&gt;            GetUniformVariables();&lt;br /&gt;            &lt;br /&gt;            LoadTexture();&lt;br /&gt;            &lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        private int LoadShader ( All type, string source )&lt;br /&gt;        {&lt;br /&gt;           int shader = GL.CreateShader(type);&lt;br /&gt;&lt;br /&gt;           if ( shader == 0 )&lt;br /&gt;                   throw new InvalidOperationException(&amp;quot;Unable to create shader&amp;quot;);         &lt;br /&gt;        &lt;br /&gt;           // Load the shader source&lt;br /&gt;           int length = 0;&lt;br /&gt;            GL.ShaderSource(shader, 1, new string[] {source}, (int[])null);&lt;br /&gt;           &lt;br /&gt;           // Compile the shader&lt;br /&gt;           GL.CompileShader( shader );&lt;br /&gt;                &lt;br /&gt;              int compiled = 0;&lt;br /&gt;            GL.GetShader (shader, All.CompileStatus, ref compiled);&lt;br /&gt;            if (compiled == 0) {&lt;br /&gt;                length = 0;&lt;br /&gt;                GL.GetShader (shader, All.InfoLogLength, ref length);&lt;br /&gt;                if (length &amp;gt; 0) {&lt;br /&gt;                    var log = new StringBuilder (length);&lt;br /&gt;                    GL.GetShaderInfoLog (shader, length, ref length, log);&lt;br /&gt;                    Console.WriteLine(&amp;quot;GL2&amp;quot;, &amp;quot;Couldn't compile shader: &amp;quot; + log.ToString ());&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                GL.DeleteShader (shader);&lt;br /&gt;                throw new InvalidOperationException (&amp;quot;Unable to compile shader of type : &amp;quot; + type.ToString ());&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return shader;&lt;br /&gt;        &lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        private void LoadTexture()&lt;br /&gt;        {&lt;br /&gt;            &lt;br /&gt;            UIImage ui = UIImage.FromFile(&amp;quot;mario3.jpg&amp;quot;);&lt;br /&gt;            CGImage image = ui.CGImage;&lt;br /&gt;            &lt;br /&gt;            CGColorSpace colorspace = CGColorSpace.CreateDeviceRGB();&lt;br /&gt;            data = Marshal.AllocHGlobal(image.Height*image.Width*4);&lt;br /&gt;            CGContext context = new CGBitmapContext(data,image.Width,image.Height,8,4*image.Width, colorspace,CGImageAlphaInfo.NoneSkipLast);&lt;br /&gt;            colorspace.Dispose();&lt;br /&gt;            context.ClearRect(new RectangleF(0,0,image.Width,image.Height));&lt;br /&gt;            context.DrawImage(new RectangleF(0,0,image.Width,image.Height),image);&lt;br /&gt;            &lt;br /&gt;            //Generate a texture object&lt;br /&gt;            GL.GenTextures(1,ref textureId);&lt;br /&gt;            &lt;br /&gt;            //Bind the texture object&lt;br /&gt;            GL.ActiveTexture(All.Texture0);&lt;br /&gt;            GL.BindTexture(All.Texture2D, textureId);&lt;br /&gt;            GL.Uniform1(textureId,uniformSampler);&lt;br /&gt;            &lt;br /&gt;            //Load the texture&lt;br /&gt;            GL.TexImage2D(All.Texture2D, 0, (int)All.Rgba, image.Width, image.Height, 0 ,All.Rgba, All.UnsignedByte, data);&lt;br /&gt;            &lt;br /&gt;            //Set the filtering mode&lt;br /&gt;            GL.TexParameter(All.Texture2D, All.TextureMinFilter, (float)All.Nearest);&lt;br /&gt;            GL.TexParameter(All.Texture2D, All.TextureMagFilter, (float)All.Nearest);&lt;br /&gt;            &lt;br /&gt;            //Wrap setting&lt;br /&gt;            GL.TexParameter(All.Texture2D, All.TextureWrapS,(int)All.Repeat);&lt;br /&gt;            GL.TexParameter(All.Texture2D, All.TextureWrapT,(int)All.Repeat);&lt;br /&gt;            &lt;br /&gt;            context.Dispose();&lt;br /&gt;            Marshal.FreeHGlobal(data);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected override void ConfigureLayer (CAEAGLLayer eaglLayer)&lt;br /&gt;        {&lt;br /&gt;            eaglLayer.Opaque = true;&lt;br /&gt;        }    &lt;br /&gt;        &lt;br /&gt;        private void GetUniformVariables()&lt;br /&gt;        {&lt;br /&gt;            uniformMat =  GL.GetUniformLocation(program, &amp;quot;uMVPMatrix&amp;quot;);&lt;br /&gt;            uniformSampler = GL.GetUniformLocation(program, &amp;quot;sTexture&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        private void SetUniformMatrix4(int location, bool transpose, ref Matrix4 matrix)&lt;br /&gt;        {&lt;br /&gt;            unsafe&lt;br /&gt;            {&lt;br /&gt;                fixed (float* matrix_ptr = &amp;amp;matrix.Row0.X)&lt;br /&gt;                {&lt;br /&gt;                    GL.UniformMatrix4(location,1,transpose,matrix_ptr);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        float rotateY = 0;&lt;br /&gt;        &lt;br /&gt;        protected override void OnRenderFrame (FrameEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            base.OnRenderFrame (e);&lt;br /&gt;            &lt;br /&gt;            MakeCurrent();&lt;br /&gt;&lt;br /&gt;            GL.ClearColor (0.7f, 0.7f, 0.7f, 1);&lt;br /&gt;            GL.Clear ((int)All.ColorBufferBit);&lt;br /&gt;            &lt;br /&gt;            GL.FrontFace(All.Ccw);&lt;br /&gt;            GL.CullFace(All.Front);&lt;br /&gt;            GL.Enable(All.CullFace);&lt;br /&gt;            &lt;br /&gt;&lt;br /&gt;            GL.Viewport (0, 0, viewportWidth, viewportHeight);&lt;br /&gt;            GL.UseProgram (program);&lt;br /&gt;            &lt;br /&gt;            matWorld = Matrix4.CreateRotationY((float)e.Time + rotateY) * Matrix4.CreateTranslation(Vector3.Zero);&lt;br /&gt;            matWorldViewProjection = matWorld * matView * matProjection;&lt;br /&gt;            &lt;br /&gt;            SetUniformMatrix4(uniformMat,false,ref matWorldViewProjection);&lt;br /&gt;            &lt;br /&gt;            //Active params&lt;br /&gt;            GL.EnableVertexAttribArray (attributePosition);&lt;br /&gt;            GL.EnableVertexAttribArray (attributeTexCoord);&lt;br /&gt;            &lt;br /&gt;            //Set params&lt;br /&gt;            int size = sizeof(float)*3+sizeof(float)*2;&lt;br /&gt;            GL.VertexAttribPointer(attributePosition,3,All.Float,false,size,vertexArrayHandle.AddrOfPinnedObject());&lt;br /&gt;            GL.VertexAttribPointer(attributeTexCoord,2,All.Float,false,size,(IntPtr)((uint)vertexArrayHandle.AddrOfPinnedObject()+(uint)(sizeof(float)*3)));&lt;br /&gt;&lt;br /&gt;            //GL.DrawArrays (All.Triangles, 0, vertexArray);&lt;br /&gt;            GL.DrawElements(All.Triangles, indexes.Length, All.UnsignedShort, indexesHandle.AddrOfPinnedObject());&lt;br /&gt;            &lt;br /&gt;            rotateY += (float)Math.PI / 270;&lt;br /&gt;            &lt;br /&gt;            //Swapped buffer (Front and Back buffer)&lt;br /&gt;            SwapBuffers ();&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        protected override void OnDisposed (EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            base.OnDisposed (e);&lt;br /&gt;            Marshal.FreeHGlobal (data);&lt;br /&gt;            if (textureId != 0)&lt;br /&gt;                GL.DeleteTextures(1, ref textureId);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-515476664485683321?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/515476664485683321/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=515476664485683321&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/515476664485683321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/515476664485683321'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2011/04/opengl-es20-y-monotouch-iv-cube3d_24.html' title='OpenGL-ES2.0 y Monotouch IV (Cube3D parte2)'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/_MqAEAq68mQ0/TbLrMvBP4FI/AAAAAAAAEuA/Y2lY1JOJv8Q/s72-c/cubo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-157649885766569277</id><published>2011-04-23T07:40:00.001-07:00</published><updated>2011-04-23T09:57:56.178-07:00</updated><title type='text'>OpenGL-ES2.0 y Monotouch IV (Cube3D parte1)</title><content type='html'>Siguiendo con el aprendizaje de OpenGLES2.0 hoy voy a escribir un tutorial de como crear un cubo en 3D y texturizarlo. Esta tutorial es muy facil de entender si habéis leido los anteriores.&lt;br /&gt;&lt;br /&gt;Lo primero que necesitamos es definir nuestro cubo 3D, para ellos tenemos que entender como OpenGLES2.0 pinta objetos o mejor dicho triangulos en pantalla. OpenGLES2.0 tiene dos métodos para pintar:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;GL.DrawArrays&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;GL.DrawElements&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En los tutoriales anteriores hemos usado siempre DrawArrays pero a la hora de pintar un objeto más complejo que un quad es mucho más interesante usar DrawElements. De todas formas en esta primera parte vamos a usar el método DrawArrays y ya en la segunda parte veremos las ventajas que nos plantea usar DrawElements.&lt;br /&gt;&lt;br /&gt;Bueno como ya sabéis el método DrawArrays tiene la siguiente declaración:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;GL.DrawArrays(All mode, int first, int count);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="font-style:italic;"&gt;- mode -&gt; (All.Points/All.Lines/All.LineStrip,/All.LineLoop/ All.Triangles/ All.TriangleStrip / All.TriangleFan)&lt;br /&gt; - first -&gt; Indica el índice del primer vertices a pintar&lt;br /&gt; - count -&gt; Indica el número total de vertices a pintar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por lo tanto para pintar nuestro cubo necesitaremos descomponerlo en triangulos. Un cubo tiene 6 caras y cada cara se puede descomponer en 2 triangulos que son 3 vértices, por lo que tendremos un total de 36 vertices.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-wC5R5mI6n6c/TbLrMvBP4FI/AAAAAAAAEuA/p-_gFesEC70/s1600/cubo.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 161px; height: 155px;" src="http://2.bp.blogspot.com/-wC5R5mI6n6c/TbLrMvBP4FI/AAAAAAAAEuA/p-_gFesEC70/s320/cubo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5598795890787606610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;float[] squareVertices = { //Front&lt;br /&gt;        &amp;#160;&amp;#160; -0.5f,-0.5f,0.0f, //0&lt;br /&gt;        &amp;#160;&amp;#160; 0.5f,-0.5f,0.0f, //1&lt;br /&gt;        &amp;#160;&amp;#160; 0.5f,0.5f,0.0f, //2&lt;br /&gt;        &amp;#160;&amp;#160; -0.5f,-0.5f,0.0f, //0&lt;br /&gt;        &amp;#160;&amp;#160; 0.5f,0.5f,0.0f, //2&lt;br /&gt;        &amp;#160;&amp;#160; -0.5f,0.5f,0.0f, //3&lt;br /&gt;        &amp;#160;&amp;#160;//Botton&lt;br /&gt;         -0.5f,-0.5f,1.0f, //4&amp;#160;&amp;#160;&lt;br /&gt;      &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0.5f,-0.5f,1.0f, //5&lt;br /&gt;       &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0.5f,-0.5f,0.0f, //1&lt;br /&gt;        &amp;#160;&amp;#160; -0.5f,-0.5f,1.0f, //4&lt;br /&gt;        &amp;#160;&amp;#160; 0.5f,-0.5f,0.0f, //1&lt;br /&gt;         -0.5f,-0.5f,0.0f, //0&lt;br /&gt;         //Left&lt;br /&gt;        &amp;#160;&amp;#160; -0.5f,-0.5f,1.0f, //4&lt;br /&gt;       &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -0.5f,-0.5f,0.0f, //0&lt;br /&gt;        &amp;#160;&amp;#160; -0.5f,0.5f,0.0f, //3&lt;br /&gt;        &amp;#160;&amp;#160; -0.5f,-0.5f,1.0f, //4&lt;br /&gt;        &amp;#160;&amp;#160; -0.5f,0.5f,0.0f, //3&lt;br /&gt;        &amp;#160;&amp;#160; -0.5f,0.5f,1.0f, //7&lt;br /&gt;         &lt;br /&gt;         //Right&lt;br /&gt;        &amp;#160;&amp;#160; 0.5f,-0.5f,0.0f, //1&lt;br /&gt;        &amp;#160;&amp;#160; 0.5f,-0.5f,1.0f, //5&lt;br /&gt;        &amp;#160;&amp;#160; 0.5f,0.5f,1.0f, //6&lt;br /&gt;        &amp;#160;&amp;#160; 0.5f,-0.5f,0.0f, //1&lt;br /&gt;        &amp;#160;&amp;#160; 0.5f,0.5f,1.0f, //6&lt;br /&gt;        &amp;#160;&amp;#160; 0.5f,0.5f,0.0f, //2&lt;br /&gt;        &amp;#160;&amp;#160; //Top&lt;br /&gt;         0.5f,0.5f,1.0f, //6&lt;br /&gt;         -0.5f,0.5f,1.0f, //7&lt;br /&gt;         -0.5f,0.5f,0.0f, //3&lt;br /&gt;         0.5f,0.5f,1.0f, //6&lt;br /&gt;         -0.5f,0.5f,0.0f, //3&lt;br /&gt;        &amp;#160;&amp;#160; 0.5f,0.5f,0.0f, //2&lt;br /&gt;&lt;br /&gt;         //Back&lt;br /&gt;         0.5f,-0.5f,1.0f, //5&lt;br /&gt;         -0.5f,-0.5f,1.0f, //4&lt;br /&gt;         -0.5f,0.5f,1.0f, //7 &lt;br /&gt;         0.5f,-0.5f,1.0f, //5&lt;br /&gt;         -0.5f,0.5f,1.0f, //7&lt;br /&gt;         0.5f,0.5f,1.0f //6      &amp;#160;&amp;#160; &lt;br /&gt;         };&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Es importante el orden en el que especificáis los vértices ya que indican hacia donde apunta la normal del triangulo o lo que es lo mismo desde donde se va a ver el triangulo. Yo uso el sentido antihorario que es el estandar también llamado en física "la regla de la mano derecha" donde siguiendo el sentido en el que los dedos de la mano derecha rodearía en triangulo el pulgar sería el vector normal del triangulo.&lt;br /&gt;&lt;br /&gt;De la misma forma necesitamos también especificar las coordenadas de textura para cada vértice por lo tanto tendremos que construir el array de coordenadas de texturas:&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;flfloat[] texCoords = new float[] { 0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,0.0f,&lt;br /&gt;   &lt;br /&gt;          &amp;#160;&amp;#160;0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,0.0f,&lt;br /&gt;   &lt;br /&gt;          &amp;#160;&amp;#160;0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,0.0f,&lt;br /&gt;          &lt;br /&gt;          &amp;#160;&amp;#160;0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,0.0f,&lt;br /&gt;   &lt;br /&gt;          &amp;#160;&amp;#160;0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,0.0f,&lt;br /&gt;   &lt;br /&gt;          &amp;#160;&amp;#160;0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,0.0f&lt;br /&gt;          };&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;(Nota. Seguro que ya empezáis a notar que debe haber una forma más cómoda y menos repetitiva de definir un cubo, bien lo veremos en la segunda parte)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bien ahora una de las cosas que vamos a añadirle a este tutorial es que el cubo este girando, el motivo es que si no, no podríamos verlo desde todas sus caras y no podríamos comprobar si está correctamente construido y todas sus caras están correctamente texturizadas.&lt;br /&gt;&lt;br /&gt;Para ello vamos a definir las típicas 3 matrices (World / View / Projection):&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;                        matWorld = Matrix4.Identity;&lt;br /&gt;   float aspectRatio = (float) (Size.Width) / (float)(Size.Height);&lt;br /&gt;   matProjection = Matrix4.CreatePerspectiveFieldOfView(((float)(Math.PI) / 180.0f)*45.0f, aspectRatio, 1.0f,20.0f);&lt;br /&gt;   matView = Matrix4.CreateRotationX(0.5f)*Matrix4.CreateTranslation(0,0,-8);&lt;br /&gt;   matWorldViewProjection = matWorld * matView * matProjection;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bien pues modificando la matrix del mundo podremos hacer que nuestro cubo 3d esté rotando.&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;float rotateY = 0;&lt;br /&gt;  &lt;br /&gt;  protected override void OnRenderFrame (FrameEventArgs e)&lt;br /&gt;  {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;...&lt;br /&gt;   &lt;br /&gt;   matWorld = Matrix4.CreateRotationY((float)e.Time + rotateY) * Matrix4.CreateTranslation(Vector3.Zero);&lt;br /&gt;   matWorldViewProjection = matWorld * matView * matProjection;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;(Nota. Por motivos de eficiencia vamos a pasarle al VertexShader la multiplicación de las 3 matrices ya hecha de manera que &lt;br /&gt;no sea necesario que el la haga por cada vertice. Por lo que no se puede olvidar modificar la matriz &lt;span style="font-weight:bold;"&gt;matWorldViewProjection&lt;/span&gt; cada vez que modifiquemos la matriz del mundo.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nuestro VertexShader tendrá pues una variable de tipo &lt;span style="font-weight:bold;"&gt;uniform&lt;/span&gt; que albergará la matriz resultado de la multiplicación de las 3 matrices. Por lo que nuestro VertexShader será:&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;string vertexShaderSrc =&amp;#160;&amp;#160;@"uniform mat4 uMVPMatrix;&lt;br /&gt;          attribute vec4 aPosition; &lt;br /&gt;          attribute vec2 aTexCoord;&lt;br /&gt;          varying vec2 vTexCoord;&lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;void main()&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;{&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;          &amp;#160;&amp;#160; vTexCoord = aTexCoord;&lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl_Position = uMVPMatrix * aPosition; &lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;}"; &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bien ahora el problema siguiente es setear el valor de la variable uniform del VertexShader. Para ello existen unas funciones dependiendo del tipo de estructura que quieras pasar llamadas &lt;span style="font-weight:bold;"&gt;GL.UniformX&lt;/span&gt; y concretamente para setear una variable de tipo matrix4x4 tenemos GL.UniformMatrix4. El problema es que dicha función no admite un objeto de tipo Matrix4 que es lo que tenemos sino que se le tenemos que pasar un puntero a nuestra matriz.&lt;br /&gt;&lt;br /&gt;Para ello yo me he creado el siguiente método:&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;private void SetUniformMatrix4(int location, bool transpose, ref Matrix4 matrix)&lt;br /&gt;  {&lt;br /&gt;   unsafe&lt;br /&gt;   {&lt;br /&gt;    fixed (float* matrix_ptr = &amp;matrix.Row0.X)&lt;br /&gt;    {&lt;br /&gt;     GL.UniformMatrix4(location,1,transpose,matrix_ptr);&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;(Nota. Como podéis observar el método usa código no seguro "unsafe" por lo que para que esto es funcione deberéis activar la posibilidad de ejecutar código no seguro en vuestro IDE).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para terminar en nuestro método de dibujado deberemos especificar el sentido en el que vamos a dibujar los triángulos, a favor de las agujas del reloj o de forma antihoraria esto es conocido como el cullmode. En OpenGLES2.0 existen 3 funciones necesarias para especificar el cullmode:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;GL.FrontFace(All type)&lt;/span&gt;  -&gt; (Donde type puede ser All.Cw (horario) o All.Ccw (antihorario)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-Hu1h3qp0tLc/TbLxr-o6cdI/AAAAAAAAEuI/OCBwB43kHrk/s1600/cullmode.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 133px;" src="http://2.bp.blogspot.com/-Hu1h3qp0tLc/TbLxr-o6cdI/AAAAAAAAEuI/OCBwB43kHrk/s320/cullmode.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5598803024626217426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nosotros como explicamos anteriormente hemos especificado los triángulos de forma antihoraria por lo que usaremos All.Ccw.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;GL.CullFace(All mode)&lt;/span&gt; -&gt; (Donde mode puede ser All.Front / All.Back / All.FrontAndBack)&lt;br /&gt;&lt;br /&gt;Donde indicamos cual de las caras del triangulo vamos a dibujar, la delantera, la trasera o las dos. El valor por defecto es las caras traseras por lo que nosotros setearemos esta a All.Front.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;GL.Enable(All.CullFace)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y por último y para que todo esto tenga efecto activaremos el cullmode de la misma forma que la mayoría de parámetros en OpenGL, llamando al método GL.Enable.&lt;br /&gt;&lt;br /&gt;Como siempre os pongo el código completo de la clase &lt;span style="font-weight:bold;"&gt;EAGLView.cs&lt;/span&gt; de la plantilla de monotouch.&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;Paste your text here.#define OPENGLES2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using OpenTK.Platform.iPhoneOS;&lt;br /&gt;using MonoTouch.CoreAnimation;&lt;br /&gt;using OpenTK;&lt;br /&gt;    &lt;br /&gt;using OpenTK.Graphics.ES20;&lt;br /&gt;&lt;br /&gt;using MonoTouch.Foundation;&lt;br /&gt;using MonoTouch.ObjCRuntime;&lt;br /&gt;using MonoTouch.OpenGLES;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Drawing;&lt;br /&gt;using OpenTK.Platform;&lt;br /&gt;using MonoTouch.CoreGraphics;&lt;br /&gt;using MonoTouch.UIKit;&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;&lt;br /&gt;namespace Cube3D&lt;br /&gt;{&lt;br /&gt;    public partial class EAGLView : iPhoneOSGameView&lt;br /&gt;    {&lt;br /&gt;        int viewportWidth, viewportHeight;&lt;br /&gt;        int program;&lt;br /&gt;&lt;br /&gt;        float[] squareVertices = { //Front&lt;br /&gt;                                   -0.5f,-0.5f,0.0f, //0&lt;br /&gt;                                   0.5f,-0.5f,0.0f, //1&lt;br /&gt;                                   0.5f,0.5f,0.0f, //2&lt;br /&gt;                                   -0.5f,-0.5f,0.0f, //0&lt;br /&gt;                                   0.5f,0.5f,0.0f, //2&lt;br /&gt;                                   -0.5f,0.5f,0.0f, //3&lt;br /&gt;                                  //Botton&lt;br /&gt;                                    -0.5f,-0.5f,1.0f, //4  &lt;br /&gt;                                   0.5f,-0.5f,1.0f, //5&lt;br /&gt;                                   0.5f,-0.5f,0.0f, //1&lt;br /&gt;                                   -0.5f,-0.5f,1.0f, //4&lt;br /&gt;                                   0.5f,-0.5f,0.0f, //1&lt;br /&gt;                                    -0.5f,-0.5f,0.0f, //0&lt;br /&gt;                                    //Left&lt;br /&gt;                                   -0.5f,-0.5f,1.0f, //4&lt;br /&gt;                                   -0.5f,-0.5f,0.0f, //0&lt;br /&gt;                                   -0.5f,0.5f,0.0f, //3&lt;br /&gt;                                   -0.5f,-0.5f,1.0f, //4&lt;br /&gt;                                   -0.5f,0.5f,0.0f, //3&lt;br /&gt;                                   -0.5f,0.5f,1.0f, //7&lt;br /&gt;                                    &lt;br /&gt;                                    //Right&lt;br /&gt;                                   0.5f,-0.5f,0.0f, //1&lt;br /&gt;                                   0.5f,-0.5f,1.0f, //5&lt;br /&gt;                                   0.5f,0.5f,1.0f, //6&lt;br /&gt;                                   0.5f,-0.5f,0.0f, //1&lt;br /&gt;                                   0.5f,0.5f,1.0f, //6&lt;br /&gt;                                   0.5f,0.5f,0.0f, //2&lt;br /&gt;                                   //Top&lt;br /&gt;                                    0.5f,0.5f,1.0f, //6&lt;br /&gt;                                    -0.5f,0.5f,1.0f, //7&lt;br /&gt;                                    -0.5f,0.5f,0.0f, //3&lt;br /&gt;                                    0.5f,0.5f,1.0f, //6&lt;br /&gt;                                    -0.5f,0.5f,0.0f, //3&lt;br /&gt;                                   0.5f,0.5f,0.0f, //2&lt;br /&gt;&lt;br /&gt;                                    //Back&lt;br /&gt;                                    0.5f,-0.5f,1.0f, //5&lt;br /&gt;                                    -0.5f,-0.5f,1.0f, //4&lt;br /&gt;                                    -0.5f,0.5f,1.0f, //7    &lt;br /&gt;                                    0.5f,-0.5f,1.0f, //5&lt;br /&gt;                                    -0.5f,0.5f,1.0f, //7&lt;br /&gt;                                    0.5f,0.5f,1.0f //6                           &lt;br /&gt;                                 };&lt;br /&gt;//        int[] indices = { 0,1,2,0,2,3,&lt;br /&gt;//                           0,3,4,0,4,5,&lt;br /&gt;//                           0,5,6,0,6,1,&lt;br /&gt;//                           7,6,1,7,1,2,&lt;br /&gt;//                           7,4,5,7,5,6,&lt;br /&gt;//                           7,2,3,7,3,4&lt;br /&gt;//                         };&lt;br /&gt;        &lt;br /&gt;        //Texture&lt;br /&gt;        int textureId;&lt;br /&gt;        float[] texCoords = new float[] { 0.0f,1.0f,&lt;br /&gt;                                          1.0f,1.0f,&lt;br /&gt;                                          1.0f,0.0f,&lt;br /&gt;                                          0.0f,1.0f,&lt;br /&gt;                                          1.0f,0.0f,&lt;br /&gt;                                          0.0f,0.0f,&lt;br /&gt;            &lt;br /&gt;                                          0.0f,1.0f,&lt;br /&gt;                                          1.0f,1.0f,&lt;br /&gt;                                          1.0f,0.0f,&lt;br /&gt;                                          0.0f,1.0f,&lt;br /&gt;                                          1.0f,0.0f,&lt;br /&gt;                                          0.0f,0.0f,&lt;br /&gt;            &lt;br /&gt;                                          0.0f,1.0f,&lt;br /&gt;                                          1.0f,1.0f,&lt;br /&gt;                                          1.0f,0.0f,&lt;br /&gt;                                          0.0f,1.0f,&lt;br /&gt;                                          1.0f,0.0f,&lt;br /&gt;                                          0.0f,0.0f,&lt;br /&gt;                                        &lt;br /&gt;                                          0.0f,1.0f,&lt;br /&gt;                                          1.0f,1.0f,&lt;br /&gt;                                          1.0f,0.0f,&lt;br /&gt;                                          0.0f,1.0f,&lt;br /&gt;                                          1.0f,0.0f,&lt;br /&gt;                                          0.0f,0.0f,&lt;br /&gt;            &lt;br /&gt;                                          0.0f,1.0f,&lt;br /&gt;                                          1.0f,1.0f,&lt;br /&gt;                                          1.0f,0.0f,&lt;br /&gt;                                          0.0f,1.0f,&lt;br /&gt;                                          1.0f,0.0f,&lt;br /&gt;                                          0.0f,0.0f,&lt;br /&gt;            &lt;br /&gt;                                          0.0f,1.0f,&lt;br /&gt;                                          1.0f,1.0f,&lt;br /&gt;                                          1.0f,0.0f,&lt;br /&gt;                                          0.0f,1.0f,&lt;br /&gt;                                          1.0f,0.0f,&lt;br /&gt;                                          0.0f,0.0f&lt;br /&gt;                                        };&lt;br /&gt;        &lt;br /&gt;        IntPtr data;&lt;br /&gt;        &lt;br /&gt;        Matrix4 matWorldViewProjection, matProjection, matView, matWorld;&lt;br /&gt;        int uniformMat, uniformSampler;&lt;br /&gt;        int attributePosition = 0;&lt;br /&gt;        int attributeTexCoord = 1;&lt;br /&gt;&lt;br /&gt;        [Export(&amp;quot;layerClass&amp;quot;)]&lt;br /&gt;        static Class LayerClass ()&lt;br /&gt;        {&lt;br /&gt;            return iPhoneOSGameView.GetLayerClass ();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [Export(&amp;quot;initWithCoder:&amp;quot;)]&lt;br /&gt;        public EAGLView (NSCoder coder) : base(coder)&lt;br /&gt;        {&lt;br /&gt;            LayerRetainsBacking = false;&lt;br /&gt;            LayerColorFormat = EAGLColorFormat.RGBA8;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        protected override void CreateFrameBuffer ()&lt;br /&gt;        {&lt;br /&gt;            ContextRenderingApi = EAGLRenderingAPI.OpenGLES2;&lt;br /&gt;            base.CreateFrameBuffer();&lt;br /&gt;            Initialize();&lt;br /&gt;        }                                 &lt;br /&gt;        &lt;br /&gt;        private bool Initialize()&lt;br /&gt;        {&lt;br /&gt;            viewportHeight = Size.Height; &lt;br /&gt;            viewportWidth = Size.Width;&lt;br /&gt;&lt;br /&gt;            // Vertex and fragment shaders&lt;br /&gt;            string vertexShaderSrc =  @&amp;quot;uniform mat4 uMVPMatrix;&lt;br /&gt;                                        attribute vec4 aPosition; &lt;br /&gt;                                        attribute vec2 aTexCoord;&lt;br /&gt;                                        varying vec2 vTexCoord;&lt;br /&gt;                                        void main()                  &lt;br /&gt;                                        {                         &lt;br /&gt;                                           vTexCoord = aTexCoord;&lt;br /&gt;                                           gl_Position = uMVPMatrix * aPosition; &lt;br /&gt;                                        }&amp;quot;;                           &lt;br /&gt;            &lt;br /&gt;            string fragmentShaderSrc = @&amp;quot;precision mediump float;&lt;br /&gt;                                         varying vec2 vTexCoord;&lt;br /&gt;                                         uniform sampler2D sTexture;&lt;br /&gt;                                           void main()                                &lt;br /&gt;                                           {                                         &lt;br /&gt;                                             //gl_FragColor = vec4(1.0,0.0,0.0,1.0);&lt;br /&gt;                                            gl_FragColor = texture2D(sTexture, vTexCoord);&lt;br /&gt;                                           }&amp;quot;;&lt;br /&gt;&lt;br /&gt;            int vertexShader = LoadShader (All.VertexShader, vertexShaderSrc );&lt;br /&gt;            int fragmentShader = LoadShader (All.FragmentShader, fragmentShaderSrc );&lt;br /&gt;            program = GL.CreateProgram();&lt;br /&gt;            if (program == 0)&lt;br /&gt;                throw new InvalidOperationException (&amp;quot;Unable to create program&amp;quot;);&lt;br /&gt;&lt;br /&gt;            GL.AttachShader (program, vertexShader);&lt;br /&gt;            GL.AttachShader (program, fragmentShader);&lt;br /&gt;            &lt;br /&gt;            //Set position&lt;br /&gt;            GL.BindAttribLocation (program, attributePosition, &amp;quot;aPosition&amp;quot;);&lt;br /&gt;            GL.BindAttribLocation (program, attributeTexCoord, &amp;quot;aTexCoord&amp;quot;);&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            GL.LinkProgram (program);&lt;br /&gt;&lt;br /&gt;            int linked = 0;&lt;br /&gt;            GL.GetProgram (program, All.LinkStatus, ref linked);&lt;br /&gt;            if (linked == 0) {&lt;br /&gt;                // link failed&lt;br /&gt;                int length = 0;&lt;br /&gt;                GL.GetProgram (program, All.InfoLogLength, ref length);&lt;br /&gt;                if (length &amp;gt; 0) {&lt;br /&gt;                    var log = new StringBuilder (length);&lt;br /&gt;                    GL.GetProgramInfoLog (program, length, ref length, log);&lt;br /&gt;                    Console.WriteLine (&amp;quot;GL2&amp;quot;, &amp;quot;Couldn't link program: &amp;quot; + log.ToString ());&lt;br /&gt;                    return false;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                GL.DeleteProgram (program);&lt;br /&gt;                throw new InvalidOperationException (&amp;quot;Unable to link program&amp;quot;);&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            //View&lt;br /&gt;            matWorld = Matrix4.Identity;&lt;br /&gt;            float aspectRatio = (float) (Size.Width) / (float)(Size.Height);&lt;br /&gt;            matProjection = Matrix4.CreatePerspectiveFieldOfView(((float)(Math.PI) / 180.0f)*45.0f, aspectRatio, 1.0f,20.0f);&lt;br /&gt;            matView = Matrix4.CreateRotationX(0.5f)*Matrix4.CreateTranslation(0,0,-8);&lt;br /&gt;            matWorldViewProjection = matWorld * matView * matProjection;&lt;br /&gt;            &lt;br /&gt;            GetUniformVariables();&lt;br /&gt;            &lt;br /&gt;            LoadTexture();&lt;br /&gt;            &lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        private int LoadShader ( All type, string source )&lt;br /&gt;        {&lt;br /&gt;           int shader = GL.CreateShader(type);&lt;br /&gt;&lt;br /&gt;           if ( shader == 0 )&lt;br /&gt;                   throw new InvalidOperationException(&amp;quot;Unable to create shader&amp;quot;);         &lt;br /&gt;        &lt;br /&gt;           // Load the shader source&lt;br /&gt;           int length = 0;&lt;br /&gt;            GL.ShaderSource(shader, 1, new string[] {source}, (int[])null);&lt;br /&gt;           &lt;br /&gt;           // Compile the shader&lt;br /&gt;           GL.CompileShader( shader );&lt;br /&gt;                &lt;br /&gt;              int compiled = 0;&lt;br /&gt;            GL.GetShader (shader, All.CompileStatus, ref compiled);&lt;br /&gt;            if (compiled == 0) {&lt;br /&gt;                length = 0;&lt;br /&gt;                GL.GetShader (shader, All.InfoLogLength, ref length);&lt;br /&gt;                if (length &amp;gt; 0) {&lt;br /&gt;                    var log = new StringBuilder (length);&lt;br /&gt;                    GL.GetShaderInfoLog (shader, length, ref length, log);&lt;br /&gt;                    Console.WriteLine(&amp;quot;GL2&amp;quot;, &amp;quot;Couldn't compile shader: &amp;quot; + log.ToString ());&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                GL.DeleteShader (shader);&lt;br /&gt;                throw new InvalidOperationException (&amp;quot;Unable to compile shader of type : &amp;quot; + type.ToString ());&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return shader;&lt;br /&gt;        &lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        private void LoadTexture()&lt;br /&gt;        {&lt;br /&gt;            &lt;br /&gt;            UIImage ui = UIImage.FromFile(&amp;quot;mario3.jpg&amp;quot;);&lt;br /&gt;            CGImage image = ui.CGImage;&lt;br /&gt;            &lt;br /&gt;            CGColorSpace colorspace = CGColorSpace.CreateDeviceRGB();&lt;br /&gt;            data = Marshal.AllocHGlobal(image.Height*image.Width*4);&lt;br /&gt;            CGContext context = new CGBitmapContext(data,image.Width,image.Height,8,4*image.Width, colorspace,CGImageAlphaInfo.NoneSkipLast);&lt;br /&gt;            colorspace.Dispose();&lt;br /&gt;            context.ClearRect(new RectangleF(0,0,image.Width,image.Height));&lt;br /&gt;            context.DrawImage(new RectangleF(0,0,image.Width,image.Height),image);&lt;br /&gt;            &lt;br /&gt;            //Generate a texture object&lt;br /&gt;            GL.GenTextures(1,ref textureId);&lt;br /&gt;            &lt;br /&gt;            //Bind the texture object&lt;br /&gt;            GL.ActiveTexture(All.Texture0);&lt;br /&gt;            GL.BindTexture(All.Texture2D, textureId);&lt;br /&gt;            GL.Uniform1(textureId,uniformSampler);&lt;br /&gt;            &lt;br /&gt;            //Load the texture&lt;br /&gt;            GL.TexImage2D(All.Texture2D, 0, (int)All.Rgba, image.Width, image.Height, 0 ,All.Rgba, All.UnsignedByte, data);&lt;br /&gt;            &lt;br /&gt;            //Set the filtering mode&lt;br /&gt;            GL.TexParameter(All.Texture2D, All.TextureMinFilter, (float)All.Nearest);&lt;br /&gt;            GL.TexParameter(All.Texture2D, All.TextureMagFilter, (float)All.Nearest);&lt;br /&gt;            &lt;br /&gt;            //Wrap setting&lt;br /&gt;            GL.TexParameter(All.Texture2D, All.TextureWrapS,(int)All.Repeat);&lt;br /&gt;            GL.TexParameter(All.Texture2D, All.TextureWrapT,(int)All.Repeat);&lt;br /&gt;            &lt;br /&gt;            context.Dispose();&lt;br /&gt;            Marshal.FreeHGlobal(data);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected override void ConfigureLayer (CAEAGLLayer eaglLayer)&lt;br /&gt;        {&lt;br /&gt;            eaglLayer.Opaque = true;&lt;br /&gt;        }    &lt;br /&gt;        &lt;br /&gt;        private void GetUniformVariables()&lt;br /&gt;        {&lt;br /&gt;            uniformMat =  GL.GetUniformLocation(program, &amp;quot;uMVPMatrix&amp;quot;);&lt;br /&gt;            uniformSampler = GL.GetUniformLocation(program, &amp;quot;sTexture&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        private void SetUniformMatrix4(int location, bool transpose, ref Matrix4 matrix)&lt;br /&gt;        {&lt;br /&gt;            unsafe&lt;br /&gt;            {&lt;br /&gt;                fixed (float* matrix_ptr = &amp;amp;matrix.Row0.X)&lt;br /&gt;                {&lt;br /&gt;                    GL.UniformMatrix4(location,1,transpose,matrix_ptr);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        float rotateY = 0;&lt;br /&gt;        &lt;br /&gt;        protected override void OnRenderFrame (FrameEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            base.OnRenderFrame (e);&lt;br /&gt;            &lt;br /&gt;            MakeCurrent();&lt;br /&gt;&lt;br /&gt;            GL.ClearColor (0.7f, 0.7f, 0.7f, 1);&lt;br /&gt;            GL.Clear ((int)All.ColorBufferBit);&lt;br /&gt;            &lt;br /&gt;            GL.FrontFace(All.Ccw);&lt;br /&gt;            GL.CullFace(All.Front);&lt;br /&gt;            GL.Enable(All.CullFace);&lt;br /&gt;            &lt;br /&gt;&lt;br /&gt;            GL.Viewport (0, 0, viewportWidth, viewportHeight);&lt;br /&gt;            GL.UseProgram (program);&lt;br /&gt;            &lt;br /&gt;            matWorld = Matrix4.CreateRotationY((float)e.Time + rotateY) * Matrix4.CreateTranslation(Vector3.Zero);&lt;br /&gt;            matWorldViewProjection = matWorld * matView * matProjection;&lt;br /&gt;            &lt;br /&gt;            SetUniformMatrix4(uniformMat,false,ref matWorldViewProjection);&lt;br /&gt;            &lt;br /&gt;            //Active params&lt;br /&gt;            GL.EnableVertexAttribArray (attributePosition);&lt;br /&gt;            GL.EnableVertexAttribArray (attributeTexCoord);&lt;br /&gt;            &lt;br /&gt;            //Set params&lt;br /&gt;            GL.VertexAttribPointer(attributePosition,3,All.Float,false,3*sizeof(float),squareVertices);&lt;br /&gt;            GL.VertexAttribPointer(attributeTexCoord,2,All.Float,false,2*sizeof(float),texCoords);&lt;br /&gt;&lt;br /&gt;            GL.DrawArrays (All.Triangles, 0, 36);&lt;br /&gt;            //GL.DrawElements(All.Triangles, indices.Length, All.Int, indices);&lt;br /&gt;            &lt;br /&gt;            rotateY += (float)Math.PI / 270;&lt;br /&gt;            &lt;br /&gt;            //Swapped buffer (Front and Back buffer)&lt;br /&gt;            SwapBuffers ();&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        protected override void OnDisposed (EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            base.OnDisposed (e);&lt;br /&gt;            Marshal.FreeHGlobal (data);&lt;br /&gt;            if (textureId != 0)&lt;br /&gt;                GL.DeleteTextures(1, ref textureId);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y el resultado en pantalla sería algo así:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-zHPPM7hp54s/TbLz1qsjRJI/AAAAAAAAEuQ/8zYGEBwcQ8c/s1600/tutorial4.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 223px; height: 320px;" src="http://2.bp.blogspot.com/-zHPPM7hp54s/TbLz1qsjRJI/AAAAAAAAEuQ/8zYGEBwcQ8c/s320/tutorial4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5598805390094714002" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-157649885766569277?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/157649885766569277/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=157649885766569277&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/157649885766569277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/157649885766569277'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2011/04/opengl-es20-y-monotouch-iv-cube3d.html' title='OpenGL-ES2.0 y Monotouch IV (Cube3D parte1)'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-wC5R5mI6n6c/TbLrMvBP4FI/AAAAAAAAEuA/p-_gFesEC70/s72-c/cubo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-3535848296500377991</id><published>2011-04-22T00:18:00.000-07:00</published><updated>2011-04-23T09:51:16.140-07:00</updated><title type='text'>OpenGL-ES2.0 y Monotouch III (AlphaTest y Scissor)</title><content type='html'>En este tercer tutotrial muestro como realizar AlphaTest y Scissor.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;AlphaTest&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En la mayoría de motores 3D como sabéis existen dos técnicas a la hora de trabajar con el canal Alpha. Estas son AlphaTest o AlphaBlending.&lt;br /&gt;&lt;br /&gt;AlphaTest es la técnica más eficiente y consiste en marcar un umbral para el canal Alpha, si este lo supero el pixel se mostrará y si no lo supera el pixel no se pintará y por lo tanto la imagen será transparente en ese pixel.&lt;br /&gt;&lt;br /&gt;AlphaBlending esta técnica es mucho más sofisticada y al mismo tiempo menos eficiente, pero consigue implementar diferentes niveles de alpha de forma que un pixel con alpha 0.7 será más opaco que uno con alpha 0.2.&lt;br /&gt;&lt;br /&gt;En este tutorial explico como realizar AlphaTest a través de Fragment shader de OpenGLES2.0.&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;string fragmentShaderSrc = @&amp;quot;precision mediump float;&lt;br /&gt;                                         varying vec2 vTexCoord;&lt;br /&gt;                                         uniform sampler2D sTexture;&lt;br /&gt;                                           void main()                                &lt;br /&gt;                                           {                                         &lt;br /&gt;                                              vec4 baseColor = texture2D(sTexture, vTexCoord);&lt;br /&gt;                                        &lt;br /&gt;                                            if (baseColor.a &amp;lt; 0.5)&lt;br /&gt;                                            {&lt;br /&gt;                                                discard;&lt;br /&gt;                                            }&lt;br /&gt;                                            else&lt;br /&gt;                                            {&lt;br /&gt;                                                gl_FragColor = vec4(baseColor.xyz,1.0);&lt;br /&gt;                                            }&lt;br /&gt;                                           }&amp;quot;;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Lo que hacemos es coger el valor alpha de la textura (que tendrá que ser una textura que albergue canal alpha como PNG) y le hacemos un alphaTest diciendo que si supera nuestro umbral fijado en 0.5f (el canal alpha esta comprendido entre 0 y 1) se le manda al glFragColor y si no se llama a la función discard que descarta el pixel y no lo envia para pintar.&lt;br /&gt;&lt;br /&gt;El resultado sería:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/--EHQDeO9agM/TbEvMJGeaBI/AAAAAAAAEtw/7C3mXQi62E8/s1600/tutorial3_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 222px; height: 320px;" src="http://2.bp.blogspot.com/--EHQDeO9agM/TbEvMJGeaBI/AAAAAAAAEtw/7C3mXQi62E8/s320/tutorial3_1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5598307697446250514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Scissor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Scissor es una técnica por la cual le podemos decir al render que no pinte toda la pantalla sino un rectángulo de ella. Un ejemplo sería, imaginaros los tipicos juegos donde tenemos nuestra escena 3d pero esta está rodeada de controles o botones que nos permiten cambiar cosas de la escena. Bien pues la escena 3d no tiene que ocupar toda la pantalla sólo el rectangulo que queda libre dentro del marco de botones.&lt;br /&gt;&lt;br /&gt;Para esta técnica sólo necesitamos añadir dos funciones al método de dibujado que nos proporciona la clase iPhoneOSGameView llamado &lt;span style="font-style:italic;"&gt;OnRenderFrame&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Primero llamaremos al método &lt;span style="font-style:italic;"&gt;GL.Scissor&lt;/span&gt; de OpenglES para especificar el rectangulo que limitará el pintado. Y lo segundo que debemos hacer es decirle a OpenglES que active la fase de ScissorTest en el pipeline para que tenga efecto.&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;...&lt;br /&gt;GL.Scissor(0,0,viewportWidth/2,viewportHeight);&lt;br /&gt;GL.Enable(All.ScissorTest);&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;(Nota. Tener en cuenta que la coordenada (0,0) sería la esquina inferior izquierda de nuestra pantalla)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Resultado sería:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-cIbza9spE_Q/TbE2pQicFBI/AAAAAAAAEt4/chzXdBJBi80/s1600/tutorial3_2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 220px; height: 320px;" src="http://1.bp.blogspot.com/-cIbza9spE_Q/TbE2pQicFBI/AAAAAAAAEt4/chzXdBJBi80/s320/tutorial3_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5598315894240187410" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-3535848296500377991?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/3535848296500377991/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=3535848296500377991&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3535848296500377991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3535848296500377991'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2011/04/opengl-es20-y-monotouch-iii-alphatest-y.html' title='OpenGL-ES2.0 y Monotouch III (AlphaTest y Scissor)'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/--EHQDeO9agM/TbEvMJGeaBI/AAAAAAAAEtw/7C3mXQi62E8/s72-c/tutorial3_1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-1653115815384387798</id><published>2011-04-17T04:09:00.000-07:00</published><updated>2011-04-23T09:53:35.208-07:00</updated><title type='text'>OpenGL-ES2.0 y Monotouch II (textures)</title><content type='html'>Hoy publico un nuevo ejemplo de cómo cargar y renderizar texturas con Monotouch y OpenGL ES2.0.  En el anterior artículo publiqué como crear un poligono en pantalla el ejemplo de hoy es un poco más complejo aunque sólo amplía el código del artículo anterior, por lo que si no lo has leido te recomiendo que lo hagas "&lt;a href="http://eldespachodelosjorges.blogspot.com/2011/04/opengles20-y-monotouch.html"&gt;OpenGLES2.0 y Monotouch I&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Lo siguiente a cuando ya sabemos crear polígonos es poder aplicarles texturas, para ello es muy importante tener algunos conceptos claros.&lt;br /&gt;&lt;br /&gt;Lo primero vamos a crear un square en pantalla esto sería:&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;public float[] squareVertices = { -0.5f, -0.5f,&lt;br /&gt;          &amp;#160;&amp;#160; 0.5f, -0.5f,&lt;br /&gt;          &amp;#160;&amp;#160; -0.5f, 0.5f,&lt;br /&gt;          &amp;#160;&amp;#160; 0.5f, 0.5f };&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Con esto definimos los cuatro vertices que tendrá nuestro cuadrado.&lt;br /&gt;A la hora de texturizarlo es importante conocer lo que son las coordenadas de texturas. Estas permiten a los polígonos posicionar la textura sobre ellos. Estas suelen llamarse (u,v) o (s,t) y es un vector de 2 float en el que sus valores estan entre [0-1] por cada vertice de nuestro poligono.&lt;br /&gt;&lt;br /&gt;Para que la textura cubra totalmente nuestro square debemos definir un array de 4 vectores (u,v) que son las coordenadas de textura de cada vertice.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_QLwms0mVa4w/Shm2PNCrsBI/AAAAAAAAAUE/OpJPups2zlM/texture_coords.png?imgmax=800"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 401px; height: 318px;" src="http://lh5.ggpht.com/_QLwms0mVa4w/Shm2PNCrsBI/AAAAAAAAAUE/OpJPups2zlM/texture_coords.png?imgmax=800" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Las definimos como:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;float[] texCoords = new float[] { 0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f&lt;br /&gt; };&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ahora Vamos a definir el Vertex shader y el Fragment shader:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Vertex Shader&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;string vertexShaderSrc =&amp;#160;&amp;#160;@"attribute vec4 aPosition; &lt;br /&gt;          attribute vec2 aTexCoord;&lt;br /&gt;          varying vec2 vTexCoord;&lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;void main()&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;{&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;          &amp;#160;&amp;#160; vTexCoord = aTexCoord;&lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl_Position = aPosition;&lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;}";&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Definimos el atributo aTexCoord que es dónde cargaremos las coordenadas de textura del vertice que en ese momento estemos procesando. Pero como la única salida de un Vertex Shader es a través de variables de tipo &lt;span style="font-style:italic;"&gt;varying&lt;/span&gt; definimos también vTexCoord al que se le copiaran los valores.&lt;br /&gt;&lt;br /&gt;Y ahora el &lt;span style="font-weight:bold;"&gt;Fragment Shader&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;string fragmentShaderSrc = @"precision mediump float;&lt;br /&gt;           varying vec2 vTexCoord;&lt;br /&gt;           uniform sampler2D sTexture;&lt;br /&gt;   &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;     &amp;#160;&amp;#160;&amp;#160;&amp;#160; void main()&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;   &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;     &amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;   &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;     &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl_FragColor = texture2D(sTexture,vTexCoord); &lt;br /&gt;   &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;     &amp;#160;&amp;#160;&amp;#160;&amp;#160; }";&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En el fragment shader tenemos como variable de entrada vTexCoord que fue pasada por el vertex shader y se define un variable de tipo Uniform que es la que albergará los pixeles de la textura. Finalmente para aplicar la textura llamamos a la función texture2D y el pasamos la textura y las coordenadas de textura que le corresponden y esta pintará correctamente la textura sobre el polígono.&lt;br /&gt;&lt;br /&gt;Ahora necesitamos cargar la textura. Para ello desde código OpenGLES2 puro escribimos:&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;   //Generate a texture object&lt;br /&gt;   GL.GenTextures(1,ref textureId);&lt;br /&gt;   &lt;br /&gt;   //Bind the texture object&lt;br /&gt;   GL.ActiveTexture(All.Texture0);&lt;br /&gt;   GL.BindTexture(All.Texture2D, textureId);&lt;br /&gt;   GL.Uniform1(textureId,0);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Creamos un objeto textura con la función &lt;span style="font-style:italic;"&gt;GenTextures&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y luego muy importante activamos el canal de textura0 que tiene OpenGL-ES, básicamente le estamos diciendo que vamos a trabajar sobre el primer canal le decimos también que es una textura 2D y no una textura cúbica con la función &lt;span style="font-style:italic;"&gt;BindTexture&lt;/span&gt; y le decimos que la textura cargada será enlazada contra la primera variable de tipo uniform con &lt;span style="font-style:italic;"&gt;Uniform1&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Para cargar la textura usaremos las clases que wrapea monotouch sobre IPhone, que es la clase UIImage.&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;UIImage ui = UIImage.FromFile("mario3.jpg");&lt;br /&gt;   CGImage image = ui.CGImage;&lt;br /&gt;   &lt;br /&gt;   CGColorSpace colorspace = CGColorSpace.CreateDeviceRGB();&lt;br /&gt;   data = Marshal.AllocHGlobal(image.Height*image.Width*4);&lt;br /&gt;   CGContext context = new CGBitmapContext(data,image.Width,image.Height,8,4*image.Width, colorspace,CGImageAlphaInfo.NoneSkipLast);&lt;br /&gt;   colorspace.Dispose();&lt;br /&gt;   context.ClearRect(new RectangleF(0,0,image.Width,image.Height));&lt;br /&gt;   context.DrawImage(new RectangleF(0,0,image.Width,image.Height),image);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(Nota. La imagen debe ser multiplo de 2 para que la cargue opengl-es, es decir, 2-4-8-16-32-64... En otro tutorial explicaré como adaptar nuestra imagen dada la resolución que sea).&lt;br /&gt;&lt;br /&gt;Tener en cuenta que la imagen que estoy cargando es un retrato de Mario Bros en formato PNG que como sabeis tiene formato RGBA. de hay que el espacio reservado sea 4(bytes) por image.width para cada fila de nuestra variable &lt;span style="font-weight:bold;"&gt;data&lt;/span&gt; y tantas columnas como image.height.&lt;br /&gt;&lt;br /&gt;Una vez la imagen cargada para enlazarla a nuestro objeto textura escribiremos:&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;GL.TexImage2D(All.Texture2D, 0, (int)All.Rgba, image.Width, image.Height, 0 ,All.Rgba, All.UnsignedByte, data);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Con esto le decimos que es una imagen de tipo RGBA (con canal alpha) y que el contenido son bytes sin signos.&lt;br /&gt;&lt;br /&gt;Una vez cargada le aplicamos los filtros y el wrap a la textura:&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;//Set the filtering mode&lt;br /&gt;   GL.TexParameter(All.Texture2D, All.TextureMinFilter, (float)All.Nearest);&lt;br /&gt;   GL.TexParameter(All.Texture2D, All.TextureMagFilter, (float)All.Nearest);&lt;br /&gt;   &lt;br /&gt;   //Wrap setting&lt;br /&gt;   GL.TexParameter(All.Texture2D, All.TextureWrapS,(int)All.Repeat);&lt;br /&gt;   GL.TexParameter(All.Texture2D, All.TextureWrapT,(int)All.Repeat);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En otro tutorial explicaré los filtros posibles, así como los 3 modos de wrap que soporta OpenGL-ES2.0.&lt;br /&gt;&lt;br /&gt;Y por último y no menos importante liberar el espacio reservado:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;   context.Dispose();&lt;br /&gt;   Marshal.FreeHGlobal(data);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En el método draw aplicaremos al vertex shader los vértices y las coordenadas de textura de la siguiente forma:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;//Active params&lt;br /&gt;   GL.EnableVertexAttribArray (0);&lt;br /&gt;   GL.EnableVertexAttribArray (1);&lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;   //Set params&lt;br /&gt;   GL.VertexAttribPointer(0,2,All.Float,false,2*sizeof(float),squareVertices);&lt;br /&gt;   GL.VertexAttribPointer(1,2,All.Float,false,2*sizeof(float),texCoords);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y listo, si quereis probarlo sólo necesitais tener monodevelop con Monotouch instalado en vuestro MacOSX. Crear un proyecto de tipo Monotouch OpenGL y modificar el código de la clase llamada &lt;span style="font-weight:bold;"&gt;EAGLView.cs&lt;/span&gt; por:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-knxDaxk13ZA/TbErQJQyjsI/AAAAAAAAEto/vIlAFB45WkU/s1600/tutorial2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 220px; height: 320px;" src="http://2.bp.blogspot.com/-knxDaxk13ZA/TbErQJQyjsI/AAAAAAAAEto/vIlAFB45WkU/s320/tutorial2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5598303368162479810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;#define OPENGLES2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using OpenTK.Platform.iPhoneOS;&lt;br /&gt;using MonoTouch.CoreAnimation;&lt;br /&gt;using OpenTK;&lt;br /&gt;&lt;br /&gt;#if OPENGLES2&lt;br /&gt; using OpenTK.Graphics.ES20;&lt;br /&gt;#else&lt;br /&gt; using OpenTK.Graphics.ES11;&lt;br /&gt;#endif&lt;br /&gt;using MonoTouch.Foundation;&lt;br /&gt;using MonoTouch.ObjCRuntime;&lt;br /&gt;using MonoTouch.OpenGLES;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Drawing;&lt;br /&gt;using OpenTK.Platform;&lt;br /&gt;using MonoTouch.CoreGraphics;&lt;br /&gt;using MonoTouch.UIKit;&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;&lt;br /&gt;namespace Texturing&lt;br /&gt;{&lt;br /&gt; public partial class EAGLView : iPhoneOSGameView&lt;br /&gt; {&lt;br /&gt;  int viewportWidth, viewportHeight;&lt;br /&gt;  int program;&lt;br /&gt;  &lt;br /&gt;  float[] squareVertices = { -0.5f,-0.5f,&lt;br /&gt;        &amp;#160;&amp;#160; 0.5f,-0.5f,&lt;br /&gt;        &amp;#160;&amp;#160; -0.5f,0.5f,&lt;br /&gt;        &amp;#160;&amp;#160; 0.5f,0.5f&lt;br /&gt;         };&lt;br /&gt;//  byte[] pixels = {255,0,0, //Red&lt;br /&gt;//       0,255,0, //Green&lt;br /&gt;//    &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,0,255, //Blue&lt;br /&gt;//       255,255,0 //Yellow&lt;br /&gt;//      };&lt;br /&gt;  &lt;br /&gt;  //Texture&lt;br /&gt;  int textureId;&lt;br /&gt;  float[] texCoords = new float[] { 0.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,1.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.0f,0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;1.0f,0.0f&lt;br /&gt;          };&lt;br /&gt;  &lt;br /&gt;  IntPtr data;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  [Export("layerClass")]&lt;br /&gt;  static Class LayerClass ()&lt;br /&gt;  {&lt;br /&gt;   return iPhoneOSGameView.GetLayerClass ();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [Export("initWithCoder:")]&lt;br /&gt;  public EAGLView (NSCoder coder) : base(coder)&lt;br /&gt;  {&lt;br /&gt;   LayerRetainsBacking = false;&lt;br /&gt;   LayerColorFormat = EAGLColorFormat.RGBA8;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  protected override void CreateFrameBuffer ()&lt;br /&gt;  {&lt;br /&gt;#if OPENGLES2&lt;br /&gt;   ContextRenderingApi = EAGLRenderingAPI.OpenGLES2;&lt;br /&gt;   base.CreateFrameBuffer();&lt;br /&gt;   Initialize();&lt;br /&gt;#else&lt;br /&gt;   ContextRenderingApi = EAGLRenderingAPI.OpenGLES1;&lt;br /&gt;   base.CreateFrameBuffer();&lt;br /&gt;#endif &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;  &lt;br /&gt;#if OPENGLES2 &lt;br /&gt;  &lt;br /&gt;  private bool Initialize()&lt;br /&gt;  {&lt;br /&gt;   viewportHeight = Size.Height; &lt;br /&gt;   viewportWidth = Size.Width;&lt;br /&gt;&lt;br /&gt;   // Vertex and fragment shaders&lt;br /&gt;   string vertexShaderSrc =&amp;#160;&amp;#160;@"attribute vec4 aPosition; &lt;br /&gt;          attribute vec2 aTexCoord;&lt;br /&gt;          varying vec2 vTexCoord;&lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;void main()&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;{&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;          &amp;#160;&amp;#160; vTexCoord = aTexCoord;&lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl_Position = aPosition; &lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;}";&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;   &lt;br /&gt;   string fragmentShaderSrc = @"precision mediump float;&lt;br /&gt;           varying vec2 vTexCoord;&lt;br /&gt;           uniform sampler2D sTexture;&lt;br /&gt;   &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;     &amp;#160;&amp;#160;&amp;#160;&amp;#160; void main()&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;   &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;     &amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;   &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;     &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl_FragColor = texture2D(sTexture,vTexCoord); &lt;br /&gt;   &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;     &amp;#160;&amp;#160;&amp;#160;&amp;#160; }";&lt;br /&gt;&lt;br /&gt;   int vertexShader = LoadShader (All.VertexShader, vertexShaderSrc );&lt;br /&gt;   int fragmentShader = LoadShader (All.FragmentShader, fragmentShaderSrc );&lt;br /&gt;   program = GL.CreateProgram();&lt;br /&gt;   if (program == 0)&lt;br /&gt;    throw new InvalidOperationException ("Unable to create program");&lt;br /&gt;&lt;br /&gt;   GL.AttachShader (program, vertexShader);&lt;br /&gt;   GL.AttachShader (program, fragmentShader);&lt;br /&gt;   &lt;br /&gt;   //Set position&lt;br /&gt;   GL.BindAttribLocation (program, 0, "aPosition");&lt;br /&gt;   GL.BindAttribLocation (program, 1, "aTexCoord");&lt;br /&gt;   &lt;br /&gt;   GL.LinkProgram (program);&lt;br /&gt;&lt;br /&gt;   int linked = 0;&lt;br /&gt;   GL.GetProgram (program, All.LinkStatus, ref linked);&lt;br /&gt;   if (linked == 0) {&lt;br /&gt;    // link failed&lt;br /&gt;    int length = 0;&lt;br /&gt;    GL.GetProgram (program, All.InfoLogLength, ref length);&lt;br /&gt;    if (length &amp;gt; 0) {&lt;br /&gt;     var log = new StringBuilder (length);&lt;br /&gt;     GL.GetProgramInfoLog (program, length, ref length, log);&lt;br /&gt;     Console.WriteLine ("GL2", "Couldn't link program: " + log.ToString ());&lt;br /&gt;     return false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    GL.DeleteProgram (program);&lt;br /&gt;    throw new InvalidOperationException ("Unable to link program");&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   LoadTexture();&lt;br /&gt;   &lt;br /&gt;   return true;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private int LoadShader ( All type, string source )&lt;br /&gt;  {&lt;br /&gt;  &amp;#160;&amp;#160; int shader = GL.CreateShader(type);&lt;br /&gt;&lt;br /&gt;  &amp;#160;&amp;#160; if ( shader == 0 )&lt;br /&gt;  &amp;#160;&amp;#160;   throw new InvalidOperationException("Unable to create shader"); &amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;  &lt;br /&gt;  &amp;#160;&amp;#160; // Load the shader source&lt;br /&gt;  &amp;#160;&amp;#160; int length = 0;&lt;br /&gt;   GL.ShaderSource(shader, 1, new string[] {source}, (int[])null);&lt;br /&gt;  &amp;#160;&amp;#160; &lt;br /&gt;  &amp;#160;&amp;#160; // Compile the shader&lt;br /&gt;  &amp;#160;&amp;#160; GL.CompileShader( shader );&lt;br /&gt;    &lt;br /&gt;  &amp;#160;&amp;#160; int compiled = 0;&lt;br /&gt;   GL.GetShader (shader, All.CompileStatus, ref compiled);&lt;br /&gt;   if (compiled == 0) {&lt;br /&gt;    length = 0;&lt;br /&gt;    GL.GetShader (shader, All.InfoLogLength, ref length);&lt;br /&gt;    if (length &amp;gt; 0) {&lt;br /&gt;     var log = new StringBuilder (length);&lt;br /&gt;     GL.GetShaderInfoLog (shader, length, ref length, log);&lt;br /&gt;     Console.WriteLine("GL2", "Couldn't compile shader: " + log.ToString ());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    GL.DeleteShader (shader);&lt;br /&gt;    throw new InvalidOperationException ("Unable to compile shader of type : " + type.ToString ());&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return shader;&lt;br /&gt;  &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private void LoadTexture()&lt;br /&gt;  {&lt;br /&gt;   &lt;br /&gt;   UIImage ui = UIImage.FromFile("mario3.jpg");&lt;br /&gt;   CGImage image = ui.CGImage;&lt;br /&gt;   &lt;br /&gt;   CGColorSpace colorspace = CGColorSpace.CreateDeviceRGB();&lt;br /&gt;   data = Marshal.AllocHGlobal(image.Height*image.Width*4);&lt;br /&gt;   CGContext context = new CGBitmapContext(data,image.Width,image.Height,8,4*image.Width, colorspace,CGImageAlphaInfo.NoneSkipLast);&lt;br /&gt;   colorspace.Dispose();&lt;br /&gt;   context.ClearRect(new RectangleF(0,0,image.Width,image.Height));&lt;br /&gt;   context.DrawImage(new RectangleF(0,0,image.Width,image.Height),image);&lt;br /&gt;  &lt;br /&gt;   &lt;br /&gt;   //Use tightly packed data&lt;br /&gt;   //GL.PixelStore(All.UnpackAlignment, 1);&lt;br /&gt;   &lt;br /&gt;   //Generate a texture object&lt;br /&gt;   GL.GenTextures(1,ref textureId);&lt;br /&gt;   &lt;br /&gt;   //Bind the texture object&lt;br /&gt;   GL.ActiveTexture(All.Texture0);&lt;br /&gt;   GL.BindTexture(All.Texture2D, textureId);&lt;br /&gt;   GL.Uniform1(textureId,0);&lt;br /&gt;   &lt;br /&gt;   //Load the texture&lt;br /&gt;   GL.TexImage2D(All.Texture2D, 0, (int)All.Rgba, image.Width, image.Height, 0 ,All.Rgba, All.UnsignedByte, data);&lt;br /&gt;   //GL.TexImage2D(All.Texture2D,0, (int)All.Rgb,2,2,0, All.Rgb,All.UnsignedByte,pixels);&lt;br /&gt;   &lt;br /&gt;   //Set the filtering mode&lt;br /&gt;   GL.TexParameter(All.Texture2D, All.TextureMinFilter, (float)All.Nearest);&lt;br /&gt;   GL.TexParameter(All.Texture2D, All.TextureMagFilter, (float)All.Nearest);&lt;br /&gt;   &lt;br /&gt;   //Wrap setting&lt;br /&gt;   GL.TexParameter(All.Texture2D, All.TextureWrapS,(int)All.Repeat);&lt;br /&gt;   GL.TexParameter(All.Texture2D, All.TextureWrapT,(int)All.Repeat);&lt;br /&gt;   &lt;br /&gt;   context.Dispose();&lt;br /&gt;   Marshal.FreeHGlobal(data);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;  protected override void ConfigureLayer (CAEAGLLayer eaglLayer)&lt;br /&gt;  {&lt;br /&gt;   eaglLayer.Opaque = true;&lt;br /&gt;  }  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;#if OPENGLES2&lt;br /&gt;  protected override void OnRenderFrame (FrameEventArgs e)&lt;br /&gt;  {&lt;br /&gt;   base.OnRenderFrame (e);&lt;br /&gt;   &lt;br /&gt;   MakeCurrent();&lt;br /&gt;&lt;br /&gt;   GL.ClearColor (0.7f, 0.7f, 0.7f, 1);&lt;br /&gt;   GL.Clear ((int)All.ColorBufferBit);&lt;br /&gt;&lt;br /&gt;   GL.Viewport (0, 0, viewportWidth, viewportHeight);&lt;br /&gt;   GL.UseProgram (program);&lt;br /&gt;   &lt;br /&gt;   //Active params&lt;br /&gt;   GL.EnableVertexAttribArray (0);&lt;br /&gt;   GL.EnableVertexAttribArray (1);&lt;br /&gt;   &lt;br /&gt;   //Set params&lt;br /&gt;   GL.VertexAttribPointer(0,2,All.Float,false,2*sizeof(float),squareVertices);&lt;br /&gt;   GL.VertexAttribPointer(1,2,All.Float,false,2*sizeof(float),texCoords);&lt;br /&gt;&lt;br /&gt;   GL.DrawArrays (All.TriangleStrip, 0, 4);&lt;br /&gt;   &lt;br /&gt;   //Swapped buffer (Front and Back buffer)&lt;br /&gt;   SwapBuffers ();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  protected override void OnDisposed (EventArgs e)&lt;br /&gt;  {&lt;br /&gt;   base.OnDisposed (e);&lt;br /&gt;   Marshal.FreeHGlobal (data);&lt;br /&gt;   if (textureId != 0)&lt;br /&gt;    GL.DeleteTextures(1, ref textureId);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;#else&lt;br /&gt;  protected override void OnRenderFrame (FrameEventArgs e)&lt;br /&gt;  {&lt;br /&gt;   base.OnRenderFrame(e);&lt;br /&gt;&lt;br /&gt;   float[] squareVertices = { -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f };&lt;br /&gt;   byte[] squareColors = { 255, 255, 0, 255, 0, 255, 255, 255, 0, 0,&lt;br /&gt;   0, 0, 255, 0, 255, 255 };&lt;br /&gt;   &lt;br /&gt;   MakeCurrent ();&lt;br /&gt;   GL.Viewport (0, 0, Size.Width, Size.Height);&lt;br /&gt;   &lt;br /&gt;   GL.MatrixMode (All.Projection);&lt;br /&gt;   GL.LoadIdentity ();&lt;br /&gt;   GL.Ortho (-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);&lt;br /&gt;   GL.MatrixMode (All.Modelview);&lt;br /&gt;   GL.Rotate (3.0f, 0.0f, 0.0f, 1.0f);&lt;br /&gt;   &lt;br /&gt;   GL.ClearColor (0.5f, 0.5f, 0.5f, 1.0f);&lt;br /&gt;   GL.Clear ((uint)All.ColorBufferBit);&lt;br /&gt;   &lt;br /&gt;   GL.VertexPointer (2, All.Float, 0, squareVertices);&lt;br /&gt;   GL.EnableClientState (All.VertexArray);&lt;br /&gt;   GL.ColorPointer (4, All.UnsignedByte, 0, squareColors);&lt;br /&gt;   GL.EnableClientState (All.ColorArray);&lt;br /&gt;   &lt;br /&gt;   GL.DrawArrays (All.TriangleStrip, 0, 4);&lt;br /&gt;   &lt;br /&gt;   SwapBuffers ();&lt;br /&gt;  }&lt;br /&gt;#endif&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-1653115815384387798?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/1653115815384387798/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=1653115815384387798&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/1653115815384387798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/1653115815384387798'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2011/04/opengl-es20-y-monotouch-ii-textures.html' title='OpenGL-ES2.0 y Monotouch II (textures)'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_QLwms0mVa4w/Shm2PNCrsBI/AAAAAAAAAUE/OpJPups2zlM/s72-c/texture_coords.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-5384319882856978422</id><published>2011-04-12T07:42:00.000-07:00</published><updated>2011-04-23T09:53:57.241-07:00</updated><title type='text'>OpenGLES2.0 y Monotouch I (Poligon)</title><content type='html'>Actualmente me encuentro trabajando con OpenGLES2.0 en el proyecto &lt;a href="http://monogame.codeplex.com/"&gt;MonoGame&lt;/a&gt; y una de las cosas que más trabajo me ha costado encontrar&lt;br /&gt;es un ejemplo de monotouch usando openGL-ES2.0. Por ello he decido escribir uno para muchos como yo que estuvierán perdidos.&lt;br /&gt;&lt;br /&gt;Bien pues si teneís instalado Monotouch en vuestro MacOSX (actualmente monotouch sólo funciona sobre MacOSX) y usáis Monodevelop podréis ver una plantilla de Monotouch y OpenGL. &lt;br /&gt;&lt;br /&gt;Creamos un proyecto de este tipo y veremos que tenemos dos ficheros (Main.cs y EAGLView.cs) además del componente ventana (fichero xib). &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Main.cs&lt;/span&gt;: Es la clase que contiene el método main  y que llama a UIApplication.Main que es el método principal al trabajar en IOS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;EAGLView.cs&lt;/span&gt;: Es la clase de ejemplo que nos crea Monotouch usando OpenGL-ES1.1 con fixed pipeline. Que basicamente significa que no podemos modificar el pipeline de dibujado y por lo tanto no podemos usar shader. Los shader nos permiten tener un control más pontente del pipeline de dibujado y por lo tanto mayor flexibilidad. Otra de las mejoras al usar OpenGL-ES2.0 es que en vez de limitarnos a texturas de 1024x1024 en la versión ES1.1 en la segunda versión ya puedes usar texturas de 2048x2048.&lt;br /&gt;&lt;br /&gt;Bueno en resumen por estos motivos y muchos más es muy interesante migrarnos a OpenGL-ES2.0 pero con la salvedad de que en la actualidad aún todos los terminales no soportan ES2.0, así que si el dispositivo no detecta esto deberemos volver a la versión 1.1&lt;br /&gt;&lt;br /&gt;Para usar OpenGLES2.0 sobre este ejemplo sólo vamos a tocar la clase EAGLView.cs por lo que es la única que os muestro:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-sTyIswsBq9U/TbEq6JcqPKI/AAAAAAAAEtg/EfTy32AKrnk/s1600/tutorial1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 220px; height: 320px;" src="http://2.bp.blogspot.com/-sTyIswsBq9U/TbEq6JcqPKI/AAAAAAAAEtg/EfTy32AKrnk/s320/tutorial1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5598302990255144098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;EAGLView.cs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;#define OPENGLES2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using OpenTK.Platform.iPhoneOS;&lt;br /&gt;using MonoTouch.CoreAnimation;&lt;br /&gt;using OpenTK;&lt;br /&gt;&lt;br /&gt;#if OPENGLES2&lt;br /&gt; using OpenTK.Graphics.ES20;&lt;br /&gt;#else&lt;br /&gt; using OpenTK.Graphics.ES11;&lt;br /&gt;#endif&lt;br /&gt;using MonoTouch.Foundation;&lt;br /&gt;using MonoTouch.ObjCRuntime;&lt;br /&gt;using MonoTouch.OpenGLES;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Drawing;&lt;br /&gt;using OpenTK.Platform;&lt;br /&gt;&lt;br /&gt;namespace OpenGLES&lt;br /&gt;{&lt;br /&gt; public partial class EAGLView : iPhoneOSGameView&lt;br /&gt; {&lt;br /&gt;  int viewportWidth, viewportHeight;&lt;br /&gt;  int program;&lt;br /&gt;  float [] vertices = new float [] {0.0f, 0.5f, 0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;-0.5f, -0.5f, 0.0f,&lt;br /&gt;          &amp;#160;&amp;#160;0.5f, -0.5f, 0.0f&lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160; };&lt;br /&gt;&lt;br /&gt;  [Export("layerClass")]&lt;br /&gt;  static Class LayerClass ()&lt;br /&gt;  {&lt;br /&gt;   return iPhoneOSGameView.GetLayerClass ();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [Export("initWithCoder:")]&lt;br /&gt;  public EAGLView (NSCoder coder) : base(coder)&lt;br /&gt;  {&lt;br /&gt;   LayerRetainsBacking = false;&lt;br /&gt;   LayerColorFormat = EAGLColorFormat.RGBA8;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  protected override void CreateFrameBuffer ()&lt;br /&gt;  {&lt;br /&gt;#if OPENGLES2&lt;br /&gt;   ContextRenderingApi = EAGLRenderingAPI.OpenGLES2;&lt;br /&gt;   base.CreateFrameBuffer();&lt;br /&gt;   Initialize();&lt;br /&gt;#else&lt;br /&gt;   ContextRenderingApi = EAGLRenderingAPI.OpenGLES1;&lt;br /&gt;   base.CreateFrameBuffer();&lt;br /&gt;#endif &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;  &lt;br /&gt;#if OPENGLES2 &lt;br /&gt;//  protected override void OnLoad(EventArgs e)&lt;br /&gt;//  {&lt;br /&gt;//   Initialize();&lt;br /&gt;//  } &lt;br /&gt;  &lt;br /&gt;  private bool Initialize()&lt;br /&gt;  {&lt;br /&gt;   viewportHeight = Size.Height; &lt;br /&gt;   viewportWidth = Size.Width;&lt;br /&gt;&lt;br /&gt;   // Vertex and fragment shaders&lt;br /&gt;   string vertexShaderSrc =&amp;#160;&amp;#160;@"attribute vec4 aPosition;&amp;#160;&amp;#160;&lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;void main()&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;{&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl_Position = aPosition; &lt;br /&gt;         &amp;#160;&amp;#160;&amp;#160;&amp;#160;}";&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;   &lt;br /&gt;   string fragmentShaderSrc = @"precision mediump float;&lt;br /&gt;           varying vec4 vcolor;&lt;br /&gt;   &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;     &amp;#160;&amp;#160;&amp;#160;&amp;#160; void main()&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;   &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;     &amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;   &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;     &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl_FragColor = vec4(1.0,0.0,0.0,1.0); &lt;br /&gt;   &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;     &amp;#160;&amp;#160;&amp;#160;&amp;#160; }";&lt;br /&gt;&lt;br /&gt;   int vertexShader = LoadShader (All.VertexShader, vertexShaderSrc );&lt;br /&gt;   int fragmentShader = LoadShader (All.FragmentShader, fragmentShaderSrc );&lt;br /&gt;   program = GL.CreateProgram();&lt;br /&gt;   if (program == 0)&lt;br /&gt;    throw new InvalidOperationException ("Unable to create program");&lt;br /&gt;&lt;br /&gt;   GL.AttachShader (program, vertexShader);&lt;br /&gt;   GL.AttachShader (program, fragmentShader);&lt;br /&gt;   &lt;br /&gt;   //Set position&lt;br /&gt;   GL.BindAttribLocation (program, 0, "aPosition");&lt;br /&gt;   &lt;br /&gt;   GL.LinkProgram (program);&lt;br /&gt;&lt;br /&gt;   int linked = 0;&lt;br /&gt;   GL.GetProgram (program, All.LinkStatus, ref linked);&lt;br /&gt;   if (linked == 0) {&lt;br /&gt;    // link failed&lt;br /&gt;    int length = 0;&lt;br /&gt;    GL.GetProgram (program, All.InfoLogLength, ref length);&lt;br /&gt;    if (length &amp;gt; 0) {&lt;br /&gt;     var log = new StringBuilder (length);&lt;br /&gt;     GL.GetProgramInfoLog (program, length, ref length, log);&lt;br /&gt;     Console.WriteLine ("GL2", "Couldn't link program: " + log.ToString ());&lt;br /&gt;     return false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    GL.DeleteProgram (program);&lt;br /&gt;    throw new InvalidOperationException ("Unable to link program");&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   return true;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private int LoadShader ( All type, string source )&lt;br /&gt;  {&lt;br /&gt;  &amp;#160;&amp;#160; int shader = GL.CreateShader(type);&lt;br /&gt;&lt;br /&gt;  &amp;#160;&amp;#160; if ( shader == 0 )&lt;br /&gt;  &amp;#160;&amp;#160;   throw new InvalidOperationException("Unable to create shader"); &amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;  &lt;br /&gt;  &amp;#160;&amp;#160; // Load the shader source&lt;br /&gt;  &amp;#160;&amp;#160; int length = 0;&lt;br /&gt;   GL.ShaderSource(shader, 1, new string[] {source}, (int[])null);&lt;br /&gt;  &amp;#160;&amp;#160; &lt;br /&gt;  &amp;#160;&amp;#160; // Compile the shader&lt;br /&gt;  &amp;#160;&amp;#160; GL.CompileShader( shader );&lt;br /&gt;    &lt;br /&gt;  &amp;#160;&amp;#160; int compiled = 0;&lt;br /&gt;   GL.GetShader (shader, All.CompileStatus, ref compiled);&lt;br /&gt;   if (compiled == 0) {&lt;br /&gt;    length = 0;&lt;br /&gt;    GL.GetShader (shader, All.InfoLogLength, ref length);&lt;br /&gt;    if (length &amp;gt; 0) {&lt;br /&gt;     var log = new StringBuilder (length);&lt;br /&gt;     GL.GetShaderInfoLog (shader, length, ref length, log);&lt;br /&gt;     Console.WriteLine("GL2", "Couldn't compile shader: " + log.ToString ());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    GL.DeleteShader (shader);&lt;br /&gt;    throw new InvalidOperationException ("Unable to compile shader of type : " + type.ToString ());&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return shader;&lt;br /&gt;  &lt;br /&gt;  }&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;  protected override void ConfigureLayer (CAEAGLLayer eaglLayer)&lt;br /&gt;  {&lt;br /&gt;   eaglLayer.Opaque = true;&lt;br /&gt;  }  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;#if OPENGLES2&lt;br /&gt;  protected override void OnRenderFrame (FrameEventArgs e)&lt;br /&gt;  {&lt;br /&gt;   base.OnRenderFrame (e);&lt;br /&gt;   &lt;br /&gt;   MakeCurrent();&lt;br /&gt;&lt;br /&gt;   GL.ClearColor (0.7f, 0.7f, 0.7f, 1);&lt;br /&gt;   GL.Clear ((int)All.ColorBufferBit);&lt;br /&gt;&lt;br /&gt;   GL.Viewport (0, 0, viewportWidth, viewportHeight);&lt;br /&gt;   GL.UseProgram (program);&lt;br /&gt;   &lt;br /&gt;   GL.EnableVertexAttribArray (0);&lt;br /&gt;   &lt;br /&gt;   GL.VertexAttribPointer (0, 3, All.Float, false, 0, vertices);&lt;br /&gt;&lt;br /&gt;   GL.DrawArrays (All.Triangles, 0, 3);&lt;br /&gt;&lt;br /&gt;   SwapBuffers ();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;#else&lt;br /&gt;  protected override void OnRenderFrame (FrameEventArgs e)&lt;br /&gt;  {&lt;br /&gt;   base.OnRenderFrame(e);&lt;br /&gt;&lt;br /&gt;   float[] squareVertices = { -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f };&lt;br /&gt;   byte[] squareColors = { 255, 255, 0, 255, 0, 255, 255, 255, 0, 0,&lt;br /&gt;   0, 0, 255, 0, 255, 255 };&lt;br /&gt;   &lt;br /&gt;   MakeCurrent ();&lt;br /&gt;   GL.Viewport (0, 0, Size.Width, Size.Height);&lt;br /&gt;   &lt;br /&gt;   GL.MatrixMode (All.Projection);&lt;br /&gt;   GL.LoadIdentity ();&lt;br /&gt;   GL.Ortho (-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);&lt;br /&gt;   GL.MatrixMode (All.Modelview);&lt;br /&gt;   GL.Rotate (3.0f, 0.0f, 0.0f, 1.0f);&lt;br /&gt;   &lt;br /&gt;   GL.ClearColor (0.5f, 0.5f, 0.5f, 1.0f);&lt;br /&gt;   GL.Clear ((uint)All.ColorBufferBit);&lt;br /&gt;   &lt;br /&gt;   GL.VertexPointer (2, All.Float, 0, squareVertices);&lt;br /&gt;   GL.EnableClientState (All.VertexArray);&lt;br /&gt;   GL.ColorPointer (4, All.UnsignedByte, 0, squareColors);&lt;br /&gt;   GL.EnableClientState (All.ColorArray);&lt;br /&gt;   &lt;br /&gt;   GL.DrawArrays (All.TriangleStrip, 0, 4);&lt;br /&gt;   &lt;br /&gt;   SwapBuffers ();&lt;br /&gt;  }&lt;br /&gt;#endif&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nota. Para terminar si comentas la primera linea es decir "#define OPENGLES2" se renderizará usando ES1.1 y si no&lt;br /&gt;usará ES2.0 con shaders.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-5384319882856978422?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/5384319882856978422/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=5384319882856978422&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/5384319882856978422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/5384319882856978422'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2011/04/opengles20-y-monotouch.html' title='OpenGLES2.0 y Monotouch I (Poligon)'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-sTyIswsBq9U/TbEq6JcqPKI/AAAAAAAAEtg/EfTy32AKrnk/s72-c/tutorial1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-8911067065312286632</id><published>2011-04-12T07:37:00.000-07:00</published><updated>2011-04-12T07:42:03.929-07:00</updated><title type='text'>Abrir dos instancias de la misma aplicación en MacOSX</title><content type='html'>Actualmente estoy trabajando con Monodevelop en MacOSX y uno de los primeros incovenientes que te encuentras es el no poder abrir varias instancias de Monodevelop con lo necesario que esto es para un programador. En principio MacOSX no te deja hacerlo desde su interfaz gráfico pero esto no quiere decir que no se pueda. Así que hoy os cuento otro tip sobre MacOSX que a mi me facilitó mucho la tarea al trabajar con Monodevelop.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Abrimos un terminal y ponemos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;/Applications/MonoDevelop.app/Contents/MacOS/monodevelop &amp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dentro del directorio Applications se encuentran todas las aplicaciones que tenemos instaladas por lo que supongo que esto seguro que os sirve para otros programas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-8911067065312286632?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/8911067065312286632/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=8911067065312286632&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8911067065312286632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8911067065312286632'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2011/04/abrir-dos-instancias-de-la-misma.html' title='Abrir dos instancias de la misma aplicación en MacOSX'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-633926064939817877</id><published>2011-04-12T07:26:00.000-07:00</published><updated>2011-04-12T07:36:10.594-07:00</updated><title type='text'>Mostrar ficheros ocultos en MacOSX</title><content type='html'>Hoy escribo un pequeño truco que me reportó Javier fernandez de Syderis para poder ver en una ventana del finder en MacOSX los ficheros y directorios ocultos. Esto es un poco más rebuscado que en sistemas como Windows y no tenemos una propiedad fácilmente modificable. Necesitamos modificar la variable AppleShowAllFiles que es un bool y ponerla a true ya que por defecto viene a false, para ello:&lt;br /&gt;&lt;br /&gt;Abrimos un terminal y ponemos:&lt;br /&gt;&lt;br /&gt;Mostrar ficheros ocultos:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;defaults write com.apple.finder AppleShowAllFiles TRUE &lt;br /&gt;killall Finder&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ocultar ficheros ocultos:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;defaults write com.apple.finder AppleShowAllFiles FALSE&lt;br /&gt; killall Finder&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-633926064939817877?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/633926064939817877/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=633926064939817877&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/633926064939817877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/633926064939817877'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2011/04/mostrar-ficheros-ocultos-en-macosx.html' title='Mostrar ficheros ocultos en MacOSX'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-7770639993528321012</id><published>2011-03-22T01:00:00.000-07:00</published><updated>2011-03-22T01:09:10.563-07:00</updated><title type='text'>Crear un fichero de cualquier tamaño</title><content type='html'>Hoy estamos configurando el NAS y necesitamos ficheros de tamaños determinados para probar cuotas de espacio en disco. Para esto es muy util poder crear un fichero de un fichero determinado. Para esto en sistemas deribados de UNIX como MacOSX o la famila Linux tenemos el comando dd que nos ayudará a esta tarea.  Dejo este pequeño tip que espero le sea de utilidad a muchos de vosotros.&lt;br /&gt;&lt;br /&gt;Nos posicionamos en la carpeta donde queramos dejar el fichero&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;cd /tmp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Creamos un fichero de 50MGs&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;dd if=/dev/zero of=archivo50megas.txt bs=1024 count=51200&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;if - archivo de entrada (cogemos basura del dispositivo zero)&lt;br /&gt;of - archivo de salida (el nombre de nuestro fichero)&lt;br /&gt;bs - tamaño de bloque bytes (1024 indica bloques de 1k)&lt;br /&gt;count - Número de bloques (51200 = 50*1024(Mg)) &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-7770639993528321012?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/7770639993528321012/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=7770639993528321012&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7770639993528321012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7770639993528321012'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2011/03/crear-un-fichero-de-cualquier-tamano.html' title='Crear un fichero de cualquier tamaño'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-870319248560156962</id><published>2010-11-19T03:41:00.000-08:00</published><updated>2010-11-19T05:54:32.876-08:00</updated><title type='text'>Lanzar aplicaciones con retraso al iniciar windows 7</title><content type='html'>Como todos sabéis Windows tiene varios mecanismos para lanzar aplicaciones en el arranque del sistema operativo. La fórmula más conocida es colocar un acceso directo en la carpeta "Inicio". Pero hoy me encuentro con el problema de lanzar una aplicación que hace uso de la tarjeta gráfica y el problema consiste es que al poner la aplicación en la carpeta de Inicio esta se lanza antes de que se cargue el servicio de DirectX por lo que la aplicación da un fallo de no estar aún enable dichas funcionalidades. La manera de resolver el problema ha sido construir un pequeño script en bacth (lenguaje de script de MS-DOS) para que espero lo necesario hasta que los servicios gráficos hayan sido cargados. &lt;br /&gt;&lt;br /&gt;Os dejo el script:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;---------------------&lt;br /&gt;@echo off&lt;br /&gt;timeout 30&lt;br /&gt;start chrome&lt;br /&gt;------------------&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"@echo off"&lt;/span&gt; -&gt; no imprima la salida de los comandos por la consola&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"timeout 30"&lt;/span&gt; -&gt; espere 30 segundos (tiempo suficiente para el arranque de todos los servicios de windows 7&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"start chrome"&lt;/span&gt; -&gt; arrancar la aplicación&lt;br /&gt;&lt;br /&gt;Lo guardais como loquequerais.bat y lo colocais en la carpeta de "Inicio"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sintasis del comando start&lt;br /&gt;Syntax&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;START "title" [/Dpath] [options] "command" [parameters]&lt;br /&gt;&lt;br /&gt;Key:&lt;br /&gt;&amp;#160;&amp;#160; title&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;: Text for the CMD window title bar (required)&lt;br /&gt;&amp;#160;&amp;#160; path&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : Starting directory&lt;br /&gt;&amp;#160;&amp;#160; command&amp;#160;&amp;#160;&amp;#160;&amp;#160;: The command, batch file or executable program to run&lt;br /&gt;&amp;#160;&amp;#160; parameters : The parameters passed to the command&lt;br /&gt;&lt;br /&gt;Options:&lt;br /&gt;&amp;#160;&amp;#160; /MIN&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : Minimized&lt;br /&gt;&amp;#160;&amp;#160; /MAX&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : Maximized&lt;br /&gt;&amp;#160;&amp;#160; /WAIT&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;: Start application and wait for it to terminate&lt;br /&gt;&amp;#160;&amp;#160; /LOW&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : Use IDLE priority class&lt;br /&gt;&amp;#160;&amp;#160; /NORMAL&amp;#160;&amp;#160;&amp;#160;&amp;#160;: Use NORMAL priority class&lt;br /&gt;&amp;#160;&amp;#160; /HIGH&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;: Use HIGH priority class&lt;br /&gt;&amp;#160;&amp;#160; /REALTIME&amp;#160;&amp;#160;: Use REALTIME priority class&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160; /B&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : Start application without creating a new window. In this case&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;^C will be ignored - leaving ^Break as the only way to &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;interrupt the application&lt;br /&gt;&amp;#160;&amp;#160; /I&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : Ignore any changes to the current environment.&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160; Options for 16-bit WINDOWS programs only&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160; /SEPARATE&amp;#160;&amp;#160; Start in separate memory space (more robust)&lt;br /&gt;&amp;#160;&amp;#160; /SHARED&amp;#160;&amp;#160;&amp;#160;&amp;#160; Start in shared memory space (default)&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-870319248560156962?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/870319248560156962/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=870319248560156962&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/870319248560156962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/870319248560156962'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2010/11/lanzar-aplicaciones-con-retraso-al.html' title='Lanzar aplicaciones con retraso al iniciar windows 7'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-6435702717128018683</id><published>2010-10-27T07:24:00.000-07:00</published><updated>2010-10-28T04:46:15.959-07:00</updated><title type='text'>Mi primera DLL</title><content type='html'>Hoy he decidido grabarme un video construyendo una dll básica en c++ y consumiendola desde una aplicación de consola en c++ porque es una tarea util cuando necesitas hacer un wrapper de una librería en c o c++ y usarla desde otros lenguajes como c#.  Aunque es algo muy fácil me cuesta muchas veces recordar la nomenglatura de ahí la idea de este tutorial espero que os sea útil para arrancar vuestros proyectos.&lt;br /&gt;&lt;br /&gt;&lt;object style="height: 260px; width: 426px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/tjE0JyO0D0o?version=3"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/tjE0JyO0D0o?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="426" height="260"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;El codigo fuente de la dll sería:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include "stdafx.h"&lt;br /&gt;&lt;br /&gt;#define DLL_EXPORT extern "C" __declspec(dllexport)&lt;br /&gt;&lt;br /&gt;DLL_EXPORT double Sum(double a, double b);&lt;br /&gt;&lt;br /&gt;double Sum(double a, double b)&lt;br /&gt;{&lt;br /&gt; return a+b;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;y el de la clase en c++ que lo consume sería:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include "stdafx.h"&lt;br /&gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;&lt;br /&gt;extern "C" __declspec(dllimport)double Sum(double a, double b);&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;int main(){&lt;br /&gt; cout &amp;lt;&amp;lt; "hola dll" &amp;lt;&amp;lt; endl;&lt;br /&gt; cout &amp;lt;&amp;lt; "La suma de 2 + 3 es:" &amp;lt;&amp;lt; Sum(2,3);&lt;br /&gt;&lt;br /&gt; getchar();&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y ahora en este segundo video creo un proyecto de consola de c# desde&lt;br /&gt;el cual también consumiremos los métodos de nuestra DLL.&lt;br /&gt;&lt;br /&gt;&lt;object style="height: 260px; width: 426px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8Fn-yXVFc8M?version=3"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/8Fn-yXVFc8M?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="426" height="260"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;El código de la clase Wrapper:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;namespace UseDLLCSharp&lt;br /&gt;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;class WrapperDLL&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[DllImport("DLL.dll")]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;public static extern double Sum(double a, double b);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El código de la clase principal de C#:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;namespace UseDLLCSharp&lt;br /&gt;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;class Program&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;static void Main(string[] args)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Console.WriteLine("hola mundo");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Console.WriteLine("La suma de 3 + 2 es: " + WrapperDLL.Sum(3, 2));&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Thread.Sleep(5000);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-6435702717128018683?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/6435702717128018683/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=6435702717128018683&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/6435702717128018683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/6435702717128018683'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2010/10/mi-primera-dll.html' title='Mi primera DLL'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-6869077270365925267</id><published>2010-10-19T23:47:00.000-07:00</published><updated>2010-10-19T23:57:20.443-07:00</updated><title type='text'>La evolución de un programador</title><content type='html'>Hoy encontré un artículo super divertido sobre la evolución que sufre una programador al ir ascendiendo de cargo o rango con los años, no es perdáis el final.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;High School/Jr.High&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;10 PRINT "HELLO WORLD"&lt;br /&gt;&amp;#160;&amp;#160;20 END&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;First year in College&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;program Hello(input, output)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;begin&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;writeln('Hello World')&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;end.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Senior year in College&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;(defun hello&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;(print&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;(cons 'Hello (list 'World))))&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;New professional&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;void main(void)&lt;br /&gt;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;char *message[] = {"Hello ", "World"};&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;int i;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;for(i = 0; i &amp;lt; 2; ++i)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;printf("%s", message[i]);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;printf("\n");&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Seasoned professional&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;string.h&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;class string&lt;br /&gt;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;private:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;int size;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;char *ptr;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;string() : size(0), ptr(new char[1]) { ptr[0] = 0; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;string(const string &amp;s) : size(s.size)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ptr = new char[size + 1];&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;strcpy(ptr, s.ptr);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;~string()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;delete [] ptr;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;friend ostream &amp;operator &amp;lt;&amp;lt;(ostream &amp;, const string &amp;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;string &amp;operator=(const char *);&lt;br /&gt;&amp;#160;&amp;#160;};&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;ostream &amp;operator&amp;lt;&amp;lt;(ostream &amp;stream, const string &amp;s)&lt;br /&gt;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return(stream &amp;lt;&amp;lt; s.ptr);&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;string &amp;string::operator=(const char *chrs)&lt;br /&gt;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (this != &amp;chrs)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;delete [] ptr;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; size = strlen(chrs);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ptr = new char[size + 1];&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;strcpy(ptr, chrs);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return(*this);&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;int main()&lt;br /&gt;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;string str;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;str = "Hello World";&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cout &amp;lt;&amp;lt; str &amp;lt;&amp;lt; endl;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return(0);&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Master Programmer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;[&lt;br /&gt;&amp;#160;&amp;#160;uuid(2573F8F4-CFEE-101A-9A9F-00AA00342820)&lt;br /&gt;&amp;#160;&amp;#160;]&lt;br /&gt;&amp;#160;&amp;#160;library LHello&lt;br /&gt;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;// bring in the master library&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;importlib("actimp.tlb");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;importlib("actexp.tlb");&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;// bring in my interfaces&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;#include "pshlo.idl"&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;uuid(2573F8F5-CFEE-101A-9A9F-00AA00342820)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cotype THello&lt;br /&gt;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160; interface IHello;&lt;br /&gt;&amp;#160;&amp;#160; interface IPersistFile;&lt;br /&gt;&amp;#160;&amp;#160; };&lt;br /&gt;&amp;#160;&amp;#160;};&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;[&lt;br /&gt;&amp;#160;&amp;#160;exe,&lt;br /&gt;&amp;#160;&amp;#160;uuid(2573F890-CFEE-101A-9A9F-00AA00342820)&lt;br /&gt;&amp;#160;&amp;#160;]&lt;br /&gt;&amp;#160;&amp;#160;module CHelloLib&lt;br /&gt;&amp;#160;&amp;#160;{&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;// some code related header files&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;importheader(&amp;lt;windows.h&amp;gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;importheader(&amp;lt;ole2.h&amp;gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;importheader(&amp;lt;except.hxx&amp;gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;importheader("pshlo.h");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;importheader("shlo.hxx");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;importheader("mycls.hxx");&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;// needed typelibs&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;importlib("actimp.tlb");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;importlib("actexp.tlb");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;importlib("thlo.tlb");&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;uuid(2573F891-CFEE-101A-9A9F-00AA00342820),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;aggregatable&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;coclass CHello&lt;br /&gt;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160; cotype THello;&lt;br /&gt;&amp;#160;&amp;#160; };&lt;br /&gt;&amp;#160;&amp;#160;};&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;#include "ipfix.hxx"&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;extern HANDLE hEvent;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;class CHello : public CHelloBase&lt;br /&gt;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;public:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;IPFIX(CLSID_CHello);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;CHello(IUnknown *pUnk);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;~CHello();&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;HRESULT&amp;#160;&amp;#160;__stdcall PrintSz(LPWSTR pwszString);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;private:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;static int cObjRef;&lt;br /&gt;&amp;#160;&amp;#160;};&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;ole2.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;#include "thlo.h"&lt;br /&gt;&amp;#160;&amp;#160;#include "pshlo.h"&lt;br /&gt;&amp;#160;&amp;#160;#include "shlo.hxx"&lt;br /&gt;&amp;#160;&amp;#160;#include "mycls.hxx"&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;int CHello::cObjRef = 0;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;CHello::CHello(IUnknown *pUnk) : CHelloBase(pUnk)&lt;br /&gt;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cObjRef++;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return;&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;HRESULT&amp;#160;&amp;#160;__stdcall&amp;#160;&amp;#160;CHello::PrintSz(LPWSTR pwszString)&lt;br /&gt;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;printf("%ws&lt;br /&gt;", pwszString);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return(ResultFromScode(S_OK));&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;CHello::~CHello(void)&lt;br /&gt;&amp;#160;&amp;#160;{&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;// when the object count goes to zero, stop the server&lt;br /&gt;&amp;#160;&amp;#160;cObjRef--;&lt;br /&gt;&amp;#160;&amp;#160;if( cObjRef == 0 )&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;PulseEvent(hEvent);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;return;&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;ole2.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;#include "pshlo.h"&lt;br /&gt;&amp;#160;&amp;#160;#include "shlo.hxx"&lt;br /&gt;&amp;#160;&amp;#160;#include "mycls.hxx"&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;HANDLE hEvent;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160; int _cdecl main(&lt;br /&gt;&amp;#160;&amp;#160;int argc,&lt;br /&gt;&amp;#160;&amp;#160;char * argv[]&lt;br /&gt;&amp;#160;&amp;#160;) {&lt;br /&gt;&amp;#160;&amp;#160;ULONG ulRef;&lt;br /&gt;&amp;#160;&amp;#160;DWORD dwRegistration;&lt;br /&gt;&amp;#160;&amp;#160;CHelloCF *pCF = new CHelloCF();&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;// Initialize the OLE libraries&lt;br /&gt;&amp;#160;&amp;#160;CoInitializeEx(NULL, COINIT_MULTITHREADED);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;CoRegisterClassObject(CLSID_CHello, pCF, CLSCTX_LOCAL_SERVER,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;REGCLS_MULTIPLEUSE, &amp;dwRegistration);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;// wait on an event to stop&lt;br /&gt;&amp;#160;&amp;#160;WaitForSingleObject(hEvent, INFINITE);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;// revoke and release the class object&lt;br /&gt;&amp;#160;&amp;#160;CoRevokeClassObject(dwRegistration);&lt;br /&gt;&amp;#160;&amp;#160;ulRef = pCF-&amp;gt;Release();&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;// Tell OLE we are going away.&lt;br /&gt;&amp;#160;&amp;#160;CoUninitialize();&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;return(0); }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;extern CLSID CLSID_CHello;&lt;br /&gt;&amp;#160;&amp;#160;extern UUID LIBID_CHelloLib;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;CLSID CLSID_CHello = { /* 2573F891-CFEE-101A-9A9F-00AA00342820 */&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;0x2573F891,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;0xCFEE,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;0x101A,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{ 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }&lt;br /&gt;&amp;#160;&amp;#160;};&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;UUID LIBID_CHelloLib = { /* 2573F890-CFEE-101A-9A9F-00AA00342820 */&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;0x2573F890,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;0xCFEE,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;0x101A,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{ 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }&lt;br /&gt;&amp;#160;&amp;#160;};&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;ole2.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;#include "pshlo.h"&lt;br /&gt;&amp;#160;&amp;#160;#include "shlo.hxx"&lt;br /&gt;&amp;#160;&amp;#160;#include "clsid.h"&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;int _cdecl main(&lt;br /&gt;&amp;#160;&amp;#160;int argc,&lt;br /&gt;&amp;#160;&amp;#160;char * argv[]&lt;br /&gt;&amp;#160;&amp;#160;) {&lt;br /&gt;&amp;#160;&amp;#160;HRESULT&amp;#160;&amp;#160;hRslt;&lt;br /&gt;&amp;#160;&amp;#160;IHello&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;*pHello;&lt;br /&gt;&amp;#160;&amp;#160;ULONG&amp;#160;&amp;#160;ulCnt;&lt;br /&gt;&amp;#160;&amp;#160;IMoniker * pmk;&lt;br /&gt;&amp;#160;&amp;#160;WCHAR&amp;#160;&amp;#160;wcsT[_MAX_PATH];&lt;br /&gt;&amp;#160;&amp;#160;WCHAR&amp;#160;&amp;#160;wcsPath[2 * _MAX_PATH];&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;// get object path&lt;br /&gt;&amp;#160;&amp;#160;wcsPath[0] = '\0';&lt;br /&gt;&amp;#160;&amp;#160;wcsT[0] = '\0';&lt;br /&gt;&amp;#160;&amp;#160;if( argc &amp;gt; 1) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;mbstowcs(wcsPath, argv[1], strlen(argv[1]) + 1);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;wcsupr(wcsPath);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;else {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;fprintf(stderr, "Object path must be specified\n");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return(1);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;// get print string&lt;br /&gt;&amp;#160;&amp;#160;if(argc &amp;gt; 2)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;mbstowcs(wcsT, argv[2], strlen(argv[2]) + 1);&lt;br /&gt;&amp;#160;&amp;#160;else&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;wcscpy(wcsT, L"Hello World");&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;printf("Linking to object %ws\n", wcsPath);&lt;br /&gt;&amp;#160;&amp;#160;printf("Text String %ws\n", wcsT);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;// Initialize the OLE libraries&lt;br /&gt;&amp;#160;&amp;#160;hRslt = CoInitializeEx(NULL, COINIT_MULTITHREADED);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;if(SUCCEEDED(hRslt)) {&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;hRslt = CreateFileMoniker(wcsPath, &amp;pmk);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if(SUCCEEDED(hRslt))&lt;br /&gt;&amp;#160;&amp;#160; hRslt = BindMoniker(pmk, 0, IID_IHello, (void **)&amp;pHello);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if(SUCCEEDED(hRslt)) {&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160; // print a string out&lt;br /&gt;&amp;#160;&amp;#160; pHello-&amp;gt;PrintSz(wcsT);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160; Sleep(2000);&lt;br /&gt;&amp;#160;&amp;#160; ulCnt = pHello-&amp;gt;Release();&lt;br /&gt;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;else&lt;br /&gt;&amp;#160;&amp;#160; printf("Failure to connect, status: %lx", hRslt);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;// Tell OLE we are going away.&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;CoUninitialize();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;return(0);&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Apprentice Hacker&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;#!/usr/local/bin/perl&lt;br /&gt;&amp;#160;&amp;#160;$msg="Hello, world.\n";&lt;br /&gt;&amp;#160;&amp;#160;if ($#ARGV &amp;gt;= 0) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;while(defined($arg=shift(@ARGV))) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;$outfilename = $arg;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;open(FILE, "&amp;gt;" . $outfilename) || die "Can't write $arg: $!\n";&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;print (FILE $msg);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;close(FILE) || die "Can't close $arg: $!\n";&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;} else {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;print ($msg);&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;1;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Experienced Hacker&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;#define S "Hello, World\n"&lt;br /&gt;&amp;#160;&amp;#160;main(){exit(printf(S) == strlen(S) ? 0 : 1);}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Seasoned Hacker&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;% cc -o a.out ~/src/misc/hw/hw.c&lt;br /&gt;&amp;#160;&amp;#160;% a.out&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Guru Hacker&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;% echo "Hello, world."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;New Manager&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;10 PRINT "HELLO WORLD"&lt;br /&gt;&amp;#160;&amp;#160;20 END&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Middle Manager&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;mail -s "Hello, world." bob@b12&lt;br /&gt;&amp;#160;&amp;#160;Bob, could you please write me a program that prints "Hello, world."?&lt;br /&gt;&amp;#160;&amp;#160;I need it by tomorrow.&lt;br /&gt;&amp;#160;&amp;#160;^D&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Senior Manager&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;% zmail jim&lt;br /&gt;&amp;#160;&amp;#160;I need a "Hello, world." program by this afternoon.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chief Executive&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;% letter&lt;br /&gt;&amp;#160;&amp;#160;letter: Command not found.&lt;br /&gt;&amp;#160;&amp;#160;% mail&lt;br /&gt;&amp;#160;&amp;#160;To: ^X ^F ^C&lt;br /&gt;&amp;#160;&amp;#160;% help mail&lt;br /&gt;&amp;#160;&amp;#160;help: Command not found.&lt;br /&gt;&amp;#160;&amp;#160;% damn!&lt;br /&gt;&amp;#160;&amp;#160;!: Event unrecognized&lt;br /&gt;&amp;#160;&amp;#160;% logout&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;(Lo encontre en &lt;a href="http://www.ariel.com.au/jokes/The_Evolution_of_a_Programmer.html"&gt;fuente&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-6869077270365925267?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/6869077270365925267/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=6869077270365925267&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/6869077270365925267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/6869077270365925267'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2010/10/la-evolucion-de-un-programador.html' title='La evolución de un programador'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-8018485011855961886</id><published>2010-08-03T09:31:00.001-07:00</published><updated>2010-08-03T09:36:27.883-07:00</updated><title type='text'>Renombrar ficheros desde Java</title><content type='html'>Hoy tuve que hacer un programita muy tonto pero que me quitó muchas horas&lt;br /&gt;de trabajo de monos, así que os dejo el código por si a alguien le sirve &lt;br /&gt;del mismo modo que a mí.&lt;br /&gt;&lt;br /&gt;El programa lo que hace es renombrar todos los ficheros de un directorio&lt;br /&gt;desde java. Este directorio estaba lleno de imagenes en formato png y lo &lt;br /&gt;que tuve que hacer es añadir al final del nombre la coletilla "_thumb" que&lt;br /&gt;viene de thumbnail.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Código&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package renombradodeficheros;&lt;br /&gt;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FileReader;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author Jorge&lt;br /&gt; */&lt;br /&gt;public class Main {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;/**&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * @param args the command line arguments&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;public static void main(String[] args) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;String path = "resources/directory/";&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;File directory = new File(path);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;String[] files = directory.list();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;File f1,f2;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;String filename, filenameModif;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;int cutindex;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;for (int i = 0; i &amp;lt; files.length; i++) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;filename = files[i];&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;f1 = new File(path+"/"+filename);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cutindex = filename.indexOf(".png");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (cutindex != -1)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;filenameModif = filename.substring(0, cutindex)+"_thumb.png";&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;f2 = new File(path+"/"+filenameModif);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (f1.renameTo(f2))&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;System.out.println("Renombrado");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;else&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;System.out.println("Fallo al renombrar");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-8018485011855961886?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/8018485011855961886/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=8018485011855961886&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8018485011855961886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8018485011855961886'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2010/08/renombrar-ficheros-desde-java.html' title='Renombrar ficheros desde Java'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-5571987767307393330</id><published>2010-08-03T09:12:00.000-07:00</published><updated>2010-08-03T09:20:55.629-07:00</updated><title type='text'>Trabajar con XML y C#</title><content type='html'>Hola a todos,&lt;br /&gt;&lt;br /&gt;Hace tiempo que no escribo en el blog pero es que últimamente ando muy muy liado con los diferentes proyectos que estamos desarrollando en &lt;a href="http://www.syderis.com/"&gt;Syderis&lt;/a&gt;. Hoy os pongo un pequeño ejemplo de como leer y escribir XML con la API de .NET framework y C#.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Dado el xml:&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br /&gt;&amp;lt;sample&amp;gt;&lt;br /&gt; &amp;lt;equipments&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;equipment type="tipo1"&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;point x="1900" y="1000"&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;title&amp;gt;Titulo&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;image &amp;gt;DSCN2903&amp;lt;/image&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;description&amp;gt;Esta es la descripción del primer punto&amp;lt;/description&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/point&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;point x="1000" y="2300"&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;title&amp;gt;Titulo&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;image /&amp;gt;DSCN2903&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;description&amp;gt;mirador2&amp;lt;/description&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/point&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;/equipment&amp;gt;&lt;br /&gt; &amp;lt;/equipments&amp;gt;&lt;br /&gt;&amp;lt;/sample&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;C&amp;oacute;digo del lector:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public void Read(string filename)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; XmlDocument xml = new XmlDocument();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xml.Load(filename);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; XmlNodeList nodeEquipments = xml.GetElementsByTagName("Equipments");&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Equipamientos&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; XmlNodeList equipmentsNodes = ((XmlElement)nodeEquipments[0]).GetElementsByTagName("equipment");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string sfilename;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string stitle;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string sdescription;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string sx, sy;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (XmlElement equipment in equipmentsNodes)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string stype = equipment.GetAttribute("type");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; XmlNodeList pointsNodes = equipment.GetElementsByTagName("point");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (XmlElement pointNode in pointsNodes)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sx = pointNode.GetAttribute("x");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sy = pointNode.GetAttribute("y");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; stitle = pointNode.GetElementsByTagName("title")[0].InnerText;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sfilename = pointNode.GetElementsByTagName("image")[0].InnerText;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sdescription = pointNode.GetElementsByTagName("description")[0].InnerText;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.Writeline("type:"+stype+" coord:"+sx+sy+" filename"+sfilename+" title:"stitle+" description:"+sdescription);&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; catch (XmlException e)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine("XML file load Failure." + e.ToString());&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Código escritor:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public void Write(string filename)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; XmlTextWriter xmlWriter = new XmlTextWriter(filename, System.Text.Encoding.UTF8);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.Formatting = Formatting.Indented;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteStartDocument();&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteStartElement("Sample");&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Equipments&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteStartElement("Equipments");&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (string etype in equipments.keys)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteStartElement("equipment");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteAttributeString("type", etype);&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (Equipment e in equipments[etype])&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&amp;lt;point x="100" y="100"&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteStartElement("point");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteAttributeString("x", e.Point.X.ToString());&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteAttributeString("y", e.Point.Y.ToString());&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteStartElement("title");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteString(e.Title);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteEndElement();&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&amp;lt;image /&amp;gt;filename&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteStartElement("image");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteString(e.Image);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteEndElement();&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&amp;lt;description&amp;gt;mirador&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteStartElement("description");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteString(e.Description);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteEndElement();&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteEndElement(); // End point&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteEndElement(); //End equipment&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteEndElement(); //End Equipments&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.WriteEndElement(); //End Sample&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.Flush();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlWriter.Close();&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-5571987767307393330?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/5571987767307393330/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=5571987767307393330&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/5571987767307393330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/5571987767307393330'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2010/08/trabajar-con-xml-y-c.html' title='Trabajar con XML y C#'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-884741578970657689</id><published>2010-02-02T09:44:00.000-08:00</published><updated>2010-02-22T04:57:34.744-08:00</updated><title type='text'>Conectarse con el puerto Serie/paralelo desde Java</title><content type='html'>Bien pues para esta tarea existe una librería llamada Java Comunication API. Pero hay que tener en cuenta que para comunicarte a través de algo físico de la máquina Java nos proporciona una fachada  de métodos que por debajo se conectan con diferentes drivers según si estamos corriendo el programa en un windows, macos o linux. Esto quiere decir que además de tener la máquina virtual de java instalada tendrás que instalar un driver en el sistema operativo. Yo empece a trabajar con la implementación de Sun pero me dió muchos problemas y no conseguía que me detectara los drivers instalados, así que finalmente opte por usar una implementación de Java Comunication API open source llamada RXTX. Con ella fue todo rodado por lo que os recomiendo que la useís.&lt;br /&gt;&lt;br /&gt;Su página web es &lt;a href="http://rxtx.org/"&gt;http://rxtx.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La instalación es muy simple os bajais la librería en la que os viene:&lt;br /&gt;&lt;br /&gt;- RXTXcomm.jar (librería que implementa la especificación de Java Comunication API)&lt;br /&gt;- Directorio con drivers para Linux&lt;br /&gt;- Directorio con drivers para Solaris&lt;br /&gt;- Directorio con drivers para Mac_OS_X&lt;br /&gt;- Directorio con drivers para Windows&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Añadis RXTXcomm.jar como librería a vuestro proyecto java y el driver lo meteis en la instalación del jre\bin&lt;br /&gt;&lt;br /&gt;Ahora la implementación de una conexión al puerto serie.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class EjemploRXTX {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;static CommPortIdentifier portId;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;static CommPortIdentifier saveportId;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;static Enumeration&amp;#160;&amp;#160;portList;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;static InputStream inputStream;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;static OutputStream outputStream;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;static BufferedInputStream bufferedInputStream;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;static SerialPort&amp;#160;&amp;#160;serialPort;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;public static void main(String[] args){&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;boolean gotPort = false;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;String port;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;portList = CommPortIdentifier.getPortIdentifiers();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;while (portList.hasMoreElements()) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;portId = (CommPortIdentifier) portList.nextElement(); //get next port to check&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if ( portId.getName().equals("COM4") ) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;port = portId.getName(); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;gotPort = true;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (gotPort == true) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;try {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;serialPort = (SerialPort)portId.open("SMSSender", 2000);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} catch (PortInUseException ex) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ex.printStackTrace();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;try {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;outputStream = serialPort.getOutputStream();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} catch (IOException ex) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ex.printStackTrace();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;try {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;serialPort.setSerialPortParams(19200,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;SerialPort.DATABITS_8,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;SerialPort.STOPBITS_2,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;SerialPort.PARITY_NONE&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} catch (UnsupportedCommOperationException ex) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ex.printStackTrace();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;try {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;inputStream = serialPort.getInputStream();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;bufferedInputStream = new BufferedInputStream(inputStream);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} catch (IOException e) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;e.printStackTrace();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;serialPort.notifyOnDataAvailable(true);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Escribir en el puerto serie&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (!(outputStream == null))&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;outputStream.write("array de váis que queremos enviar");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;byte[] readBuffer = new byte[1];&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;boolean read = false;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;while(!read) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;try {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;String getInfo = "";&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Thread.sleep(100);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;while (bufferedInputStream.available() &amp;gt; 0) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;int numBytes = bufferedInputStream.read(readBuffer);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;getInfo += new String(readBuffer);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;read = true;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;feedback += getInfo;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;int length = getInfo.length();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} catch (Exception e){&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;e.printStackTrace();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} catch (IOException e){&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;e.printStackTrace();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En este ejemplo se usa por debajo una plataforma windows como podéis ver en el nombre del puerto "COM4" en un linux por ejemplo este sería algo como "/dev/ttyS0".&lt;br /&gt;&lt;br /&gt;Tambíen para cada caso teneis que tener en cuenta que los datos de conexión con el dispositivo son particulares a cada dispositivo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;serialPort.setSerialPortParams(19200,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;SerialPort.DATABITS_8,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;SerialPort.STOPBITS_2,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;SerialPort.PARITY_NONE&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El dispositivo de este ejemplo trabajaba a 19200 baudios, tamaño de mensaje 8 bits, sin paridad y con el bit de parada 2.&lt;br /&gt;&lt;br /&gt;Si ajustais estas cosas ya os debe funcionar para cualquier dispositivo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-884741578970657689?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/884741578970657689/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=884741578970657689&amp;isPopup=true' title='17 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/884741578970657689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/884741578970657689'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2010/02/conectarse-con-el-puerto-serieparalelo.html' title='Conectarse con el puerto Serie/paralelo desde Java'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-2628247403391921980</id><published>2010-02-02T09:31:00.000-08:00</published><updated>2010-02-02T09:37:54.495-08:00</updated><title type='text'>Enviar email desde Java 2º parte</title><content type='html'>Para usar el SMTP de google y nuestra cuenta de gmail tendremos que modificar el ejemplo anterior ya que google usa encriptación por SSL para la autenticación. A continuación el como se haría:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class Main {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;private static final String SMTP_HOST_NAME = "smtp.gmail.com";&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;private static final String SMTP_PORT = "465";&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;private static final String emailMsgTxt = "Esto sería el mensaje";&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;private static final String emailSubjectTxt = "Aqui el asunto";&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;private static final String emailFromAddress = "micuenta@gmail.com";&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;private static final String[] sendTo = { "Email destino"};&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;public static void main(String args[]) throws Exception {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;new Main().sendSSLMessage(sendTo, emailSubjectTxt,emailMsgTxt, emailFromAddress);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;System.out.println("Sucessfully Sent mail to All Users");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;public void sendSSLMessage(String recipients[], String subject,String message, String from) throws MessagingException {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;boolean debug = true;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Properties props = new Properties();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;props.put("mail.smtp.host", SMTP_HOST_NAME);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;props.put("mail.smtp.auth", "true");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;props.put("mail.debug", "true");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;props.put("mail.smtp.port", SMTP_PORT);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;props.put("mail.smtp.socketFactory.port", SMTP_PORT);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;props.put("mail.smtp.socketFactory.class", SSL_FACTORY);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;props.put("mail.smtp.socketFactory.fallback", "false");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Session session = Session.getDefaultInstance(props,new javax.mail.Authenticator() {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;protected PasswordAuthentication getPasswordAuthentication() {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return new PasswordAuthentication("micuenta@gmail.com", "micontraseñadegmail");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;});&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;session.setDebug(debug);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Message msg = new MimeMessage(session);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;InternetAddress addressFrom = new InternetAddress(from);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;msg.setFrom(addressFrom);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;InternetAddress[] addressTo = new InternetAddress[recipients.length];&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;for (int i = 0; i &amp;lt; recipients.length; i++) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;addressTo[i] = new InternetAddress(recipients[i]);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;msg.setRecipients(Message.RecipientType.TO, addressTo);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;msg.setSubject(subject);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;msg.setText(message);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Transport.send(msg);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-2628247403391921980?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/2628247403391921980/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=2628247403391921980&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/2628247403391921980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/2628247403391921980'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2010/02/enviar-email-desde-java-2-parte.html' title='Enviar email desde Java 2º parte'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-3317678448943205335</id><published>2010-02-02T08:46:00.000-08:00</published><updated>2010-02-02T09:29:13.811-08:00</updated><title type='text'>Como enviar emails desde Java</title><content type='html'>Hace ya un tiempo que no escribo en el blog, pero es que últimamente he estado muy muy liado, lo bueno es que he tenido que trabajar en muchos proyectos lo cuál me permitirá escribir unos cuantos tutoriales este més.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;   Para este primer tutorial he decidido poner un ejemplo de algo que puede parecer una tontería "enviar un correo electrónico desde Java" pero si no encuentra un buen ejemplo en la red puedes pegarte un buen rato.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lo primero debemos bajarnos la librería JavaMail.jar y activation.jar y añadirlos a nuestro proyecto.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://java.sun.com/products/javamail/"&gt;http://java.sun.com/products/javamail/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://72.5.124.55/javase/technologies/desktop/javabeans/jaf/downloads/index.html"&gt;JavaBean activation Framework&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Nota. No preocuparse son dos jar de poco peso.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En principio creamos una clase para el envío de emails:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class SendMail {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;private String from;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;private String to;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;private String subject;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;private String text;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;private ITracer tracer;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;public SendMail(String from, String to, String subject, String text){&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;this.from = from;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;this.to = to;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;this.subject = subject;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;this.text = text;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;tracer = FileTracer.getInstance();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;public void send(){&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Properties props = new Properties();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;props.put("mail.smtp.host", "ServidorSMTP");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;props.put("mail.smtp.port", "25"); //Suele ser este puerto&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;props.put("mail.smtp.auth", "true");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Session mailSession = Session.getDefaultInstance(props,new javax.mail.Authenticator() {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;protected PasswordAuthentication getPasswordAuthentication() {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return new PasswordAuthentication("UsuarioSMTP",&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;"PasswordSMTP");&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;});&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Message simpleMessage = new MimeMessage(mailSession);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;InternetAddress fromAddress = null;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;InternetAddress toAddress = null;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;try {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;fromAddress = new InternetAddress(from);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;toAddress = new InternetAddress(to);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} catch (AddressException e) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;tracer.send(ITracer.INFO,e.getMessage());&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;try {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;simpleMessage.setFrom(fromAddress);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;simpleMessage.setRecipient(RecipientType.TO, toAddress);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;simpleMessage.setSubject(subject);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;simpleMessage.setText(text);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Transport.send(simpleMessage);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;tracer.send(ITracer.INFO,"Email enviado a "+toAddress);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} catch (MessagingException e) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;tracer.send(ITracer.INFO,e.getMessage());&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;public void setSubject(String subject)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;this.subject = subject;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;public void setText(String message)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;this.text = message;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:monospace, serif;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:monospace, serif;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="font-size:13px;"&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Georgia, serif;font-size:16px;"&gt;Y por último sólo nos queda usarlo:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;code&gt;&lt;br /&gt;SendMail mail = new SendMail("FromEmail",&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; "ToEmail",&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; "Asunto",&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; "Mensaje");&lt;br /&gt;mail.send();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:monospace, serif;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:monospace, serif;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="font-size:13px;"&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Georgia, serif;font-size:16px;"&gt;Un saludo y espero que os sea útil  ;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-3317678448943205335?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/3317678448943205335/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=3317678448943205335&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3317678448943205335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3317678448943205335'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2010/02/como-enviar-emails-desde-java.html' title='Como enviar emails desde Java'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-7843718644369661335</id><published>2009-09-27T23:42:00.000-07:00</published><updated>2009-09-27T23:54:05.806-07:00</updated><title type='text'>Obtener objetos de la session en JSF</title><content type='html'>Otro de los descubrimientos que he realizado tras trabajar en el último proyecto sobre JSF ha sido obtener instancias de objetos o variables creadas por el contenedor web. Como sabéis todos las clases java que utilices para trabajar con JSF (Backing bean, JavaBean...) deben estar dadas de alta en el faces-config.xml y deben de tener un constructor público sin argumentos. Esto es debido a que el contenedor de aplicaciones web (Tomcat, Glassfish ...) crearán instancias de estas clases para cada session (según el ambito especificado en faces-config.xml), esto plantea algunos problemas al querer usar singleton o simplemente al querer comunicar estas instancias de objetos ya que no existen referencias entre estas clases.&lt;br /&gt;&lt;br /&gt;Bien pues desde cualquier clase java puedes escribir las siguientes líneas y obtendrás el valor de los atributos de otra instancia de las clases creadas por el contenedor.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;FacesContext fc = FacesContext.getCurrentInstance();&lt;br /&gt;&lt;br /&gt;String usr_id = (String)fc.getApplication().createValueBidding("#SessionScope.usr_id").getValue(fc);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Espero que os sea de utilidad a mi me ha venido de perlas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-7843718644369661335?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/7843718644369661335/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=7843718644369661335&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7843718644369661335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7843718644369661335'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2009/09/obtener-objectos-de-la-session-en-jsf.html' title='Obtener objetos de la session en JSF'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-5115198029255998703</id><published>2009-09-25T05:42:00.001-07:00</published><updated>2009-11-02T03:52:05.627-08:00</updated><title type='text'>Validator en JSF</title><content type='html'>Este último més he estado trabajando en una aplicación sobre JSF, una tecnología que bajo mi punto de vista todavía le queda para ser madura, sobre todo por la cantidad de framework que puedes usar pero que luego mezclarlos es un verdadero dolor de cabezas. Despues de investigar ICEFace el cual me gustó mucho, ahora tenías que usar tiles para poder incluyectarle trozos y poder crear plantilla. Total que al final uso MyFaces (implementación de Apache de JSF) con Tomahawk que parece ser el más tolerante.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Entonces he descubierto muchas de las bondades de JSF entre ellas los validadores, unas clases java que te sirven para la validación de campos en los formularios, pudiendote olvidar del javascript. Esto me ha gustado mucho pero me encontre un escoyo que me gustaría ilustrar. Tenía un campo Año que quería validar. Bien pues cree el validador correspondiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public void validate(FacesContext facesContext, UIComponent uiComponent, Object object) throws ValidatorException {&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;&lt;br /&gt;            int anio = Integer.parseInt(object.toString());&lt;br /&gt;&lt;br /&gt;            if (anio &amp;lt; 1960 || anio &amp;gt; 2050) {&lt;br /&gt;&lt;br /&gt;               &lt;br /&gt;&lt;br /&gt;                FacesMessage message = new FacesMessage();&lt;br /&gt;&lt;br /&gt;                message.setSummary("Año "+anio+" no válido");&lt;br /&gt;&lt;br /&gt;                throw new ValidatorException(message);&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        } catch (Exception e) {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            FacesMessage message = new FacesMessage();&lt;br /&gt;&lt;br /&gt;            message.setSummary("Año "+object.toString()+" no válido");&lt;br /&gt;&lt;br /&gt;            throw new ValidatorException(message);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y lo dí de alta en el faces-config.xml&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    &amp;lt;validator&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;validator-id&amp;gt;ValidaAnio&amp;lt;/validator-id&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;validator-class&amp;gt;Validadores.ValidaAnio&amp;lt;/validator-class&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/validator&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Ahora el problema es que al validar un campo:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;t:outputText id="Anyo" value="Año(aaaa):"/&amp;gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;t:inputText id="iAnyo" size="4" maxlength="4" value="#{ActasBusquedaBB.anyo}"&amp;gt;&lt;br /&gt;&lt;br /&gt;           &amp;lt;f:validator validatorId="ValidaAnio"/&amp;gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;/t:inputText&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;pues el campo dentro del formulario se quedaba relleno con el valor erroreo.&lt;br /&gt;&lt;br /&gt;Por ejemplo, si en el input anterior introduzco "abcd" como no es un año este falla en el validador&lt;br /&gt;al hacer el casting a entero y sale el mensaje de "Año abcd no válido", pero no se borra el campo del formulario.&lt;br /&gt;&lt;br /&gt;La pregunta es ¿ Como hacer desde la clase java ValidaAnio que el campo del formulario se borre si el valor es incorrecto?&lt;br /&gt;&lt;br /&gt;Bien pues se hace en 2 lineas pero encontrarlas me costo sangre y por eso la pongo aquí.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public void validate(FacesContext facesContext, UIComponent uiComponent, Object object) throws ValidatorException {&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;&lt;br /&gt;            int anio = Integer.parseInt(object.toString());&lt;br /&gt;&lt;br /&gt;            if (anio &amp;lt; 1960 || anio &amp;gt; 2050) {&lt;br /&gt;&lt;br /&gt;                 if (uiComponent instanceof UIInput)&lt;br /&gt;&lt;br /&gt;                    ((UIInput)uiComponent).setSubmittedValue("");&lt;br /&gt;&lt;br /&gt;                FacesMessage message = new FacesMessage();&lt;br /&gt;&lt;br /&gt;                message.setSummary("Año "+anio+" no válido");&lt;br /&gt;&lt;br /&gt;                throw new ValidatorException(message);&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        } catch (Exception e) {&lt;br /&gt;&lt;br /&gt;             if (uiComponent instanceof UIInput)&lt;br /&gt;&lt;br /&gt;                ((UIInput)uiComponent).setSubmittedValue("");&lt;br /&gt;&lt;br /&gt;            FacesMessage message = new FacesMessage();&lt;br /&gt;&lt;br /&gt;            message.setSummary("Año "+object.toString()+" no válido");&lt;br /&gt;&lt;br /&gt;            throw new ValidatorException(message);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Espero que os sirva  ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-5115198029255998703?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/5115198029255998703/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=5115198029255998703&amp;isPopup=true' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/5115198029255998703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/5115198029255998703'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2009/09/validator-en-jsf.html' title='Validator en JSF'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-4105543699471725288</id><published>2009-03-26T06:40:00.000-07:00</published><updated>2009-03-26T06:43:24.909-07:00</updated><title type='text'>Trabajar con Certificados SSL en Java</title><content type='html'>Este artículo es muy útil cuando desde java queremos comunicarnos a través del protocolo seguro SSL. Este articulo lo encontre en el blob Apaga y vámonos y espero que os sea tan útil como me lo fue a mi.&lt;br /&gt;&lt;br /&gt;Cuando desarrollamos una aplicación en Java que va ha hacer uso de un recurso seguro (mediante un certificado), debemos asegurarnos que este certificado podrá ser validado por una entidad certificadora que reconozca Java. Debido a que Java es un lenguaje multi-plataforma, no utiliza la información de certificados alojada en el Sistema Operativo.&lt;br /&gt;&lt;br /&gt;Por defecto, la máquina virtual de Java dispone de las Entidades Certificadoras (CA) más comunes, como Verisign o Thawte. Sin embargo, suele darse el caso, sobretodo en entornos de desarrollo, que necesitemos utilizar una Entidad Certificadora "de prueba". En este caso, debemos importar esta CA en el almacén de claves de la máquina virtual que estemos utilizando.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Importar Certificado en el almacén de certificados (keystore)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La máquina virtual de Java (JVM) cuenta con un almacén de claves (keystore) que incorpora las entidades más habituales y la posibilidad de agregar aquellas que nos sean necesarias. El keystore se encuentra en la ruta: JVM_PATH\lib\security\cacerts. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C:\Archivos de programa\Java\jre1.6.0_05\lib\security\cacerts&lt;br /&gt;C:\Archivos de programa\Java\jdk1.5.0_15\jre\lib\security&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para añadir una nueva entidad certificadora a la JVM que estemos utilizando, debemos utilizar el comando keytool (JVM_PATH\bin\keytool):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   keytool -import -keystore "C:\Archivos de&lt;br /&gt;   programa\Java\jre1.6.0_05\lib\security\cacerts" -file&lt;br /&gt;   c:\NuevaEntidadCertificadora.cer -alias CA_SwitchOffAndLetsGo -storepass&lt;br /&gt;   changeit&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Puede observarse que el almacén de certificados contiene la contraseña por defecto 'changeit'. El nombre que especifiquemos en el alias, debe ser único en el keystore y servirá de referencia futura en el almacén. Podemos listar los certificados instalados utilizando la opción list del keytool:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   keytool -list -keystore "C:\Archivos de&lt;br /&gt;   programa\Java\jre1.6.0_05\lib\security\cacerts" -storepass changeit&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Importar Certificado utilizando el panel de control de Java (Windows)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Atención: con esta opción únicamente se añadirán los certificados a la instalación activa de la JVM en Windows.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para añadir la nueva entidad, se accederá al Panel de Control de Windows, y se seleccionará la opción "Java". Seguidamente se marcará la pestaña "Seguridad" y se pulsará sobre el botón "Certificados".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En el apartado de Certificados, se seleccionará la opción "Importar" y se localizará el archivo que contiene el certificado (si el certificado tiene extensión .cer se tendrá que seleccionar la opción 'Todos los archivos'). El nuevo certificado aparecerá en la pestaña "Usuario".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-4105543699471725288?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/4105543699471725288/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=4105543699471725288&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/4105543699471725288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/4105543699471725288'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2009/03/trabajar-con-certificados-ssl-en-java.html' title='Trabajar con Certificados SSL en Java'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-7138599835476460415</id><published>2009-02-11T23:43:00.000-08:00</published><updated>2009-02-13T00:01:18.377-08:00</updated><title type='text'>Como hacer la descarga de ficheros con servlets</title><content type='html'>Pues este es un problema muy curioso, como sabéis los servlet devuelven un stream como respuesta. La configuración más usada para los servlet es que la respuesta sea de tipo html, que especificamos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;response.setContentType("text/html");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pero el contenido de la respuesta lo podemos cambiar a cualquier otro Mime type:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.webmaster-toolkit.com/mime-types.shtml"&gt;http://www.webmaster-toolkit.com/mime-types.shtml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Según esto podemos hacer que nuestro servlet devuelva cualquier tipo de fichero.&lt;br /&gt;&lt;br /&gt;En el siguiente ejemplo escribo un servlet capaz de enviarnos un fichero zip de cualquier parte del disco del servidor. (Nota. esto hay que manejarlo con cuidado porque puede producir un hueco de seguridad gordisimo)&lt;br /&gt;&lt;br /&gt;package org.company.servlet.readfile;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.util.*;&lt;br /&gt;import java.net.*;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * &lt;p&gt; This class handles Streaming Data Content&lt;/p&gt;&lt;br /&gt; **/&lt;br /&gt;public class Readfile extends HttpServlet {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void init(ServletConfig config) throws ServletException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super.init(config);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* This Method Handles Post&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* @param HttpServletRequest request&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* @param HttpServletResponse response&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doGet(request, response);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* This Method Handles Get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* @param HttpServletRequest request&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* @param HttpServletResponse response&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String urlstr = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UserBean user = (UserBean) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;request.getSession().getAttribute("user");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.reset();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;urlstr = request.getParameter("filename");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ServletOutputStream sOutStream = response.getOutputStream();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;streamBinaryData(user.getName(), &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;urlstr, sOutStream, response);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (Exception e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private void streamBinaryData(String username, String file, ServletOutputStream outstr, HttpServletResponse resp) throws IOException{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String ErrorStr = null;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BufferedInputStream bis = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BufferedOutputStream bos = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String inFile = "/midirectorio/" + file;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int tam = (int) new File(inFile).length();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bis = new BufferedInputStream(new FileInputStream(inFile));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {                &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Asignamos el tipo de fichero zip&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.setContentType("application/x-zip-compressed"); //Cualquier mime type&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Seteamos el tamaño de la respuesta&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.setContentLength(tam);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.setHeader("Content-Disposition", "attachment;filename=\"" + file + "\"");&lt;br /&gt;               &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bos = new BufferedOutputStream(outstr);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Bucle para leer de un fichero y escribir en el otro.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[] array = new byte[1000];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int leidos = bis.read(array);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (leidos &gt; 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bos.write(array, 0, leidos);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;leidos = bis.read(array);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (Exception e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ErrorStr = "Error Streaming the Data";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;outstr.print(ErrorStr);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} finally {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (bis != null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bis.close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (bos != null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bos.close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (outstr != null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;outstr.flush();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;outstr.close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (Exception e) {            &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("Fichero no encontrado");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.sendRedirect("fileNotFound.jsp");&lt;br /&gt;            &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;Con este servlet conseguimos que en el navegador aparezca la típica ventanita de "descargas" al hacer una llamada al servlet, que recibe como parámetro el nombre del fichero. Este es el motivo por el que debemos tener cuidado al usar esto ya que podríamos crear un hueco de seguridad y que el usuario final se pueda descargar cualquier fichero de nuestro servidor.&lt;br /&gt;&lt;br /&gt;Lo mejor sería tener un directorio controlado del que sacar los ficheros como en el ejemplo, o que se filtre el filename de entrada para saber que está entre los permitidos, etc ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-7138599835476460415?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/7138599835476460415/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=7138599835476460415&amp;isPopup=true' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7138599835476460415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7138599835476460415'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2009/02/como-hacer-la-descarga-de-ficheros-con.html' title='Como hacer la descarga de ficheros con servlets'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-6579750582585428766</id><published>2009-02-11T23:20:00.000-08:00</published><updated>2009-02-11T23:37:44.438-08:00</updated><title type='text'>Configurar la red manualmente en Ubuntu</title><content type='html'>Hace tiempo que no escribo en el blog, el motivo es que ando muy muy liado con el trabajo y no me ha dejado tiempo para escribir los artículos que tenía en mente. Pero hoy me ha pasado que al instalarme una máquina nueva con la ultima versión de ubuntu. Si uso la configuración gráfica de red, está no se porqué no se guarda, sólo está activa mientras esté el ordenador encendido pero al reiniciarlo toda la configuración se pierde.&lt;br /&gt;&lt;br /&gt;Bueno pues este artículo intenta explicar como configurarla manualmente para que se quede permanente ya que desde el UI no lo he conseguido.&lt;br /&gt;&lt;br /&gt;1 Paso:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&gt; vi /etc/network/interfaces&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El contenido debemos editarlo para que quede:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;auto lo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;iface lo inet loopback&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;iface eth0 inet static&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;address XXX.XXX.X.XXX&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;netmask 255.255.255.XXX&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;gateway XXX.XXX.X.XXX&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;nameserver XXX.XXX.X.XXX&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;domain midominio.es&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;auto eth0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esta configuración especifica:&lt;br /&gt;address -&gt; dirección ip&lt;br /&gt;netmask -&gt; máscara de red&lt;br /&gt;gateway -&gt; la puerta de enlace, suele ser la dirección ip del rooter&lt;br /&gt;nameserver -&gt; (opcional) dirección ip del servidor de dns, puedes poner tantos como servidores dns tengas&lt;br /&gt;domain -&gt; para configurar el dominio de red en el que te encuentras&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nota. Esta configuración está hecha para una conexión cableada por eso usa eth0&lt;br /&gt;&lt;br /&gt;Paso 2:&lt;br /&gt;&lt;br /&gt;Aunque en este fichero podemos especificar los dns, lo suyo es especificarlos en el fichero&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&gt; vi /etc/resolv.conf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El contenido del fichero debería ser:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;nameserver XXX.XXX.X.XXX&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nota. Tantos nameserver como servidores de dns tengamos.&lt;br /&gt;&lt;br /&gt;Bueno pues con esto, tu configuración quedará permanetemente configurada, de hecho&lt;br /&gt;si el NetworkManager (UI para la configuración de red de ubuntu)  funcionara bien, en estos ficheros debe poner algo así como&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;# Generated by NetworkManager&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eso es todo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-6579750582585428766?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/6579750582585428766/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=6579750582585428766&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/6579750582585428766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/6579750582585428766'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2009/02/configurar-la-red-manualmente-en-ubuntu.html' title='Configurar la red manualmente en Ubuntu'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-3777584980204701700</id><published>2008-10-20T09:25:00.000-07:00</published><updated>2008-10-20T09:54:42.689-07:00</updated><title type='text'>JUnit 3.8.1 vs JUnit 4.x</title><content type='html'>JUnit es una herramienta que nos ayuda en uno de los procesos más abandonados en el desarrollo software, que es la fase de pruebas. Esta fase no suele hacerse como se debería, sino que se suelen hacer pruebas a la vez que vamos desarrollando nuestro software. Pues bien, es importante tener una fase de pruebas en todo desarrollo y esta herramienta nos hace esta tarea mucho más sencilla. De hecho existen metodologías basadas en pruebas de modo que diseñas las pruebas antes que el software y vas desarrollando supervisado a través de los test.&lt;br /&gt;&lt;br /&gt; Bueno pues JUnit es una herramienta que desde que se publicó su versión 3.8.1 ha quedado un poco congelada. Pero recientemente el proyecto a vuelto a cobrar vida con las nuevas versiones 4.x. Estas nuevas versión introducen algunos conceptos nuevos y hacen uso de las anotaciones introducidas en la versión 1.5 de java.&lt;br /&gt;&lt;br /&gt;A continuación, se listan las principales novedades de esta versión de JUnit respecto a versiones precedentes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Es necesario utilizar la versión 5 de la JDK para ejecutar los tests.&lt;/li&gt;&lt;li&gt;Las clases de prueba no necesitan heredar de la clase junit.framework.TestCase.&lt;/li&gt;&lt;li&gt;Los métodos de inicialización y liberación pueden ser definidos con cualquier nombre siempre y cuando sean etiquetados adecuadamente con @Before y @After. Además puede existir más de un método de inicialización y liberación simultaneamente.&lt;/li&gt;&lt;li&gt;Los nombre de los métodos de prueba no necesitan contener el prefijo test, sin embargo es necesario que sean definidos con la etiqueta @Test, la cual permite ser utilizada con parámetros que enriquecen las posibilidades de la prueba.&lt;/li&gt;&lt;li&gt;Existe la posibilidad de declarar métodos de inicialización y liberación globales a la clase de pruebas mediante las etiquetas @BeforeClass y @AfterClass.&lt;/li&gt;&lt;/ul&gt;Y para terminar os pongo un mismo ejemplo desarrollado con las distintas versiones:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JUnit3.8.1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;package pruebasSistemaSoftware.junit381;&lt;br /&gt;&lt;br /&gt;import junit.framework.*;&lt;br /&gt;import servidorEstadoTrafico.Registro;&lt;br /&gt;import servidorEstadoTrafico.RegistroMalFormadoException;&lt;br /&gt;import servidorEstadoTrafico.Tramo;&lt;br /&gt;&lt;br /&gt;public class RegistroTest extends TestCase {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;   private Registro m_registro;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;   public void setUp(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         String strCarretera ="M-40";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         String strHora="12:23:45";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         String strFecha="1/3/2007";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         String strClima="Nublado";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         String strObras = "No";&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;        m_registro = new Registro(strCarretera,strHora,strFecha,strClima,strObras);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       Tramo tramo1 = new Tramo("0","10","3","1","Retenciones","Sin accidentes");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       Tramo tramo2 = new Tramo("10","12","2","0","Retenciones","Sin accidentes");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       Tramo tramo3 = new Tramo("12","15","3","1","Retenciones","Sin accidentes");&lt;br /&gt;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       m_registro.anadirTramo(tramo1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       m_registro.anadirTramo(tramo2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       m_registro.anadirTramo(tramo3);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public void tearDown(){&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public void testComprobarFormato(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       try{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;             m_registro.comporbarFormato();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       } catch (RegistroMalFormadoException e){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;              fail("Se ha originado una excepcion inesperada" + e.toString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       }&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public void testObtenerLongitud(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;     assertEquals(m_registro.obtenerLongitud(),10+2+3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JUnit 4.x&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;package pruebasSistemaSoftware.junit4.2;&lt;br /&gt;&lt;br /&gt;import java.lang.*;&lt;br /&gt;import java.util.*;&lt;br /&gt;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;import org.junit.After;&lt;br /&gt;import org.junit.Before;&lt;br /&gt;import static org.junit.Assert.*;&lt;br /&gt;import junit.framework.JUnit4TestAdapter;&lt;br /&gt;&lt;br /&gt;import servidorEstadoTrafico.Registro;&lt;br /&gt;import servidorEstadoTrafico.RegistroMalFormadoException;&lt;br /&gt;import servidorEstadoTrafico.Tramo;&lt;br /&gt;&lt;br /&gt;public class RegistroTest{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;private Registro m_registro;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Before public void inicializar(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;     String strCarretera = "M-40";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;     String strHora="12:23:45";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;     String strFecha="1/3/2007";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;     String strClima="Nublado";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;     String strObras = "No";&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       m_registro = new Registro(strCarretera,strHora,strFecha,strClima,strObras);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       Tramo tramo1 = new Tramo("0","10","3","1","Retenciones","Sin accidentes");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       Tramo tramo2 = new Tramo("10","12","2","0","Retenciones","Sin accidentes");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       Tramo tramo3 = new Tramo("12","15","3","1","Retenciones","Sin accidentes");&lt;br /&gt;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       m_registro.anadirTramo(tramo1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       m_registro.anadirTramo(tramo2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       m_registro.anadirTramo(tramo3);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@After public void liberar(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Test(expected=RegistroMalFormadoException.class)&lt;br /&gt;&amp;nbsp;&amp;nbsp;public void comprobarFormato() throws RegistroMalFormadoException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       m_registro.comprobarFormato();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Test(timeout=1000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;public void obtenerLongitud(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assertEquals(m_registro.obtenerLongitud(),10+2+3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Ejemplos extraidos del libro "Pruebas de Software y JUnit Un análisis en profundidad y ejemplos prácticos"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-3777584980204701700?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/3777584980204701700/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=3777584980204701700&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3777584980204701700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3777584980204701700'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/10/junit-381-vs-junit-4x.html' title='JUnit 3.8.1 vs JUnit 4.x'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-3209621406896912950</id><published>2008-10-20T08:39:00.000-07:00</published><updated>2008-10-20T09:22:51.338-07:00</updated><title type='text'>Plantilla Ant</title><content type='html'>Bueno como todos ya conoceréis Ant es una herramienta desarrollada integramente en java y que sirve para automatizar el proceso de compilación, despliegue, generación de documentación etc ... Estas y otras muchas son tareas que debemos repetir multiples veces. Bueno pues esta herramienta ha sido pensada de forma que tu describes un fichero xml que por norma general suele llamarse build.xml, en el que describes los pasos que quieres realizar una vez hayas modificado el código. De esta forma podremos desplegar nuestra aplicación tantas veces como queramos en el servidor bajando el fuente desde un ftp o un subversion y todo ejecutando en el directorio el comando "ant" (seguido del nombre del fichero de descripción en el caso de que no sea build.xml).&lt;br /&gt;&lt;br /&gt;Bueno pues voy a poneros una plantilla que va a recoger todas estas tareas:&lt;br /&gt;&lt;br /&gt;-&lt;span style="font-weight: bold;"&gt;Limpiar:&lt;/span&gt; Se eliminan los directorios que contienen las clases compiladas y la documentación que pudo ser generrada anteriormente. Se eliminan ambos a la vez para que no exista una versión de documentación que no se corresponda con las clases compiladas y viceversa.&lt;br /&gt;&lt;br /&gt;-&lt;span style="font-weight: bold;"&gt;Compilar&lt;/span&gt;: En la primera de sus tareas se crea, si no existe, el directorio donde se guardarán las clases compiladas. El directorio no existirá porque se ha eliminado con el objetivo limpiar, del cual depende compilar. La segunda tarea compila las clases, situadas en ${src} y almacena los resultados de la compilación en el directorio ${build}. Para ello utiliza el classpath definido en la propiedad ${classpath}.&lt;br /&gt;&lt;br /&gt;-&lt;span style="font-weight: bold;"&gt;Jar&lt;/span&gt;: Se genera un archivo .jar con todas las clases presentes een el directorio ${destino} (build). Esta tarea depende del objetivo compilar para garantizar que existan clases compiladas en este directorio antes de intentar generar el archivo .jar.&lt;br /&gt;&lt;br /&gt;-&lt;span style="font-weight: bold;"&gt;Documentar&lt;/span&gt;: En la primera tarea se crea, si no existe, el directorio donde se guardará la documentación generada. El directorio no existirá porque se ha eliminado con el objetivo limpiar, del cual depende compilar. La segunda tarea genera la documentación del proyecto.&lt;br /&gt;&lt;br /&gt;-&lt;span style="font-weight: bold;"&gt;Main&lt;/span&gt;: Se ejecutan todos los objetivos para crear el programa y dejarlo listo para ser ejecutado.&lt;br /&gt;&lt;br /&gt;&amp;lt;project name="Proyecto_basico" default="main" basedir="."&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;   &amp;lt;!-- propiedades globales del proyecto --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;   &amp;lt;!-- definición de directorios que se van a usar--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;   &amp;lt;property name="src" value="."/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;   &amp;lt;property name="build" value="build"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;   &amp;lt;property name="doc" value="doc"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;!-- caracteristicas del proyecto--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;property name="classpath" value="./lib/misclases.jar"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;target name="limpiar"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;delete dir="$"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;     &amp;lt;delete dir="${doc}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;target name="compilar" depends="limpiar"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    &amp;lt;mkdir dir="${build}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    &amp;lt;javac srcdir="${src}" destdir="${build}" classpath="${classpath}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;target name="jar" depends="compilar"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    &amp;lt;jar jarfile="clases.jar" basedir="${build}" includes="**"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;target name="documentar" depends="limpiar"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    &amp;lt;mkdir dir="${doc}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    &amp;lt;javadoc packagenames="proyectobasico" sourcepath="${src}" destdir="${doc}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;target name="main" depends="compilar,documentar"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;br /&gt;Bueno espero que os sirva para describir vuestros proyectos si en algún momento no recordáis la sintaxis de Ant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-3209621406896912950?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/3209621406896912950/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=3209621406896912950&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3209621406896912950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3209621406896912950'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/10/plantilla-ant.html' title='Plantilla Ant'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-3247295990949163944</id><published>2008-10-02T01:28:00.000-07:00</published><updated>2008-10-02T01:33:03.991-07:00</updated><title type='text'>Comprimir y descomprimir en Linux</title><content type='html'>Como siempre los artículos que publico son a modo de recordatorio, de forma que este blog es como una guía para  el día a día. Hoy he encontrado un artículo en (http://stolz.gsmlandia.com), que creo muy interesante y necesario, descomprimir y comprimir ficheros en linux desde línea de comandos.&lt;br /&gt;&lt;br /&gt;Comprimir y descomprimir archivos en Linux desde la línea de comandos es algo habitual y siempre viene bien tener a mano un pequeño resumen de cómo hacerlo. &lt;h2&gt;&lt;span style="font-size:130%;"&gt;Los típicos&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt; &lt;h2&gt;Ficheros .tar&lt;/h2&gt; &lt;span class="comando"&gt;tar&lt;/span&gt; empaqueta varios archivos en uno solo, pero no comprime. &lt;ul&gt;&lt;li&gt;&lt;p&gt;Instalar la herramienta: &lt;span class="comando"&gt;# emerge -n tar&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Empaquetar: &lt;span class="comando"&gt;# tar cf archivo.tar ficheros&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Desempaquetar: &lt;span class="comando"&gt;# tar -xvf archivo.tar&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ver contenido: &lt;span class="comando"&gt;# tar -tf archivo.tar&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h2&gt;Ficheros .gz&lt;/h2&gt; &lt;span class="comando"&gt;gzip&lt;/span&gt; sólo comprime fichero a fichero, no empaqueta varios ficheros en uno ni comprime directorios. &lt;ul&gt;&lt;li&gt;&lt;p&gt;Instalar la herramienta: &lt;span class="comando"&gt;# emerge -n gzip&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Comprimir: &lt;span class="comando"&gt;# gzip fichero&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Descomprimir: &lt;span class="comando"&gt;# gzip -d fichero.gz&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h2&gt;Ficheros .bz2&lt;/h2&gt; &lt;span class="comando"&gt;bzip2&lt;/span&gt; sólo comprime fichero a fichero, no empaqueta varios ficheros en uno ni comprime directorios. &lt;ul&gt;&lt;li&gt;&lt;p&gt;Instalar la herramienta: &lt;span class="comando"&gt;# emerge -n bzip2&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Comprimir: &lt;span class="comando"&gt;# bzip2 fichero&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Descomprimir: &lt;span class="comando"&gt;# bzip2 -d fichero.bz2&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  Para comprimir varios ficheros y archivarlos en uno solo, al estilo de los compresores &lt;span class="comando"&gt;zip&lt;/span&gt; o &lt;span class="comando"&gt;rar&lt;/span&gt; hay que combinar &lt;span class="comando"&gt;tar&lt;/span&gt; con &lt;span class="comando"&gt;gzip&lt;/span&gt; o con &lt;span class="comando"&gt;bzip2&lt;/span&gt; como muestro a continuación. &lt;h2&gt;Ficheros .tar.gz&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;p&gt;Comprimir: &lt;span class="comando"&gt;# tar -czf archivo.tar.gz ficheros&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Descomprimir: &lt;span class="comando"&gt;# tar -xvzf archivo.tar.gz&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ver contenido: &lt;span class="comando"&gt;# tar -tzf archivo.tar.gz&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h2&gt;Ficheros .tar.bz2&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;p&gt;Comprimir: &lt;span class="comando"&gt;# tar -c ficheros | bzip2 &gt; archivo.tar.bz2&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Descomprimir: &lt;span class="comando"&gt;# bzip2 -dc archivo.tar.bz2 | tar -xv&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ver contenido: &lt;span class="comando"&gt;# bzip2 -dc archivo.tar.bz2 | tar -t&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h2&gt;Ficheros .zip&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;p&gt;Instalar las herramientas: &lt;span class="comando"&gt;# emerge -n zip unzip&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Comprimir: &lt;span class="comando"&gt;# zip archivo.zip ficheros&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Descomprimir: &lt;span class="comando"&gt;#  unzip archivo.zip&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ver contenido: &lt;span class="comando"&gt;# unzip -v archivo.zip&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h2&gt;Ficheros .rar&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;p&gt;Instalar la herramienta: &lt;span class="comando"&gt;# emerge -n rar&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Comprimir: &lt;span class="comando"&gt;# rar a archivo.rar ficheros&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Descomprimir: &lt;span class="comando"&gt;# rar x archivo.rar&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ver contenido: &lt;span class="comando"&gt;#  rar l archivo.rar&lt;/span&gt; o &lt;span class="comando"&gt;# rar v archivo.rar&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h2&gt;&lt;span style="font-size:130%;"&gt;Los no tan típicos&lt;/span&gt;&lt;/h2&gt;  &lt;h2&gt;Ficheros .lha&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;p&gt;Instalar la herramienta: &lt;span class="comando"&gt;# emerge -n lha&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Comprimir: &lt;span class="comando"&gt;# lha a archivo.lha ficheros&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Descomprimir: &lt;span class="comando"&gt;# lha x archivo.lha&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ver contenido: &lt;span class="comando"&gt;# lha v archivo.lha&lt;/span&gt; o &lt;span class="comando"&gt;# lha l archivo.lha&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h2&gt;Ficheros .arj&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;p&gt;Instalar las herramientas: &lt;span class="comando"&gt;# emerge -n arj unarj&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Comprimir: &lt;span class="comando"&gt;# arj a archivo.arj ficheros&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Descomprimir: &lt;span class="comando"&gt;# unarj archivo.arj&lt;/span&gt; o &lt;span class="comando"&gt;# arj x archivo.arj&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ver contenido: &lt;span class="comando"&gt;# arj v archivo.arj&lt;/span&gt; o &lt;span class="comando"&gt;# arj l archivo.arj&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h2&gt;Ficheros .zoo&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;p&gt;Instalar la herramienta: &lt;span class="comando"&gt;# emerge -n zoo&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Comprimir: &lt;span class="comando"&gt;# zoo a archivo.zoo ficheros&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Descomprimir: &lt;span class="comando"&gt;# zoo x archivo.zoo&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ver contenido: &lt;span class="comando"&gt;# zoo L archivo.zoo&lt;/span&gt; o &lt;span class="comando"&gt;# zoo v archivo.zoo&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  Ahora que sabes como compimir directorios, recuerda hacerte una copia de seguridad de tu sistema :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-3247295990949163944?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/3247295990949163944/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=3247295990949163944&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3247295990949163944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3247295990949163944'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/10/comprimir-y-descomprimir-en-linux.html' title='Comprimir y descomprimir en Linux'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-1551740068441154563</id><published>2008-09-29T23:46:00.000-07:00</published><updated>2008-09-29T23:48:37.125-07:00</updated><title type='text'>Configuración de SSH en debian</title><content type='html'>&lt;div class="entry"&gt;       &lt;p&gt;Lo primero que hacemos es instalar el SSH&lt;/p&gt; &lt;pre&gt;#apt-get install ssh&lt;/pre&gt; &lt;p&gt;Luego de la instalación buscamos el archivo de configuración sshd_config que esta en&lt;/p&gt; &lt;pre&gt;# vi /etc/ssh/sshd_config&lt;br /&gt;&lt;br /&gt;(Nota. no confundir con el fichero ssh_config)&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Agregamos o modificamos las siguientes entradas en el archivo&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Parámetro Port&lt;/strong&gt;&lt;br /&gt;Si fuera necesario por seguridad se puede cambiar el puerto por el cual escucha el SSH&lt;/p&gt; &lt;pre&gt;Port 54321&lt;/pre&gt; &lt;p&gt;&lt;strong&gt;Parámetro ListenAddress&lt;/strong&gt;&lt;br /&gt;Especificamos bajo que direcciones intefaces responderá las peticiones&lt;/p&gt; &lt;pre&gt;ListenAddress 10.0.0.5&lt;/pre&gt; &lt;p&gt;&lt;strong&gt;Parámetro PermitRootLogin&lt;/strong&gt;&lt;br /&gt;Especificamos si el superusuario podrá conectarse mediante SSH&lt;/p&gt; &lt;pre&gt;PermitRootLogin no&lt;/pre&gt; &lt;p&gt;&lt;strong&gt;Parámetro X11Forwarding&lt;/strong&gt;&lt;br /&gt;Especificamos si es necesario que se ejecuten aplicaciones gráficas mediante SSH&lt;/p&gt; &lt;pre&gt;X11Forwarding no&lt;/pre&gt; &lt;p&gt;&lt;strong&gt;Parámetro AllowUsers&lt;/strong&gt;&lt;br /&gt;Especificamos que usuarios se conectarán mediante SSH&lt;/p&gt; &lt;pre&gt;AllowUsers espiridion, cascajo, pully&lt;/pre&gt; &lt;p&gt;Tambien se puede restringir el acceso por usuario y host&lt;/p&gt; &lt;pre&gt;AllowUsers espiridion@192.168.0.55 cascajo@192.168.5.22&lt;/pre&gt; &lt;p&gt;Reiniciamos el SSH&lt;/p&gt; &lt;pre&gt;#/etc/init.d/ssh restart&lt;/pre&gt;                &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-1551740068441154563?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/1551740068441154563/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=1551740068441154563&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/1551740068441154563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/1551740068441154563'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/09/configuracin-de-ssh-en-debian.html' title='Configuración de SSH en debian'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-7192543647857867704</id><published>2008-09-28T02:41:00.000-07:00</published><updated>2008-09-28T02:51:44.730-07:00</updated><title type='text'>Cómo llamar al recolector de basura JAVA</title><content type='html'>&lt;span class="Apple-style-span"   style="color: rgb(102, 102, 102);   font-family:Arial;font-size:12px;"&gt;&lt;h2  style=" color: rgb(0, 0, 0); font-size:120%;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;     He encontrado un árticulo muy bueno en&lt;/span&gt; (&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:'Lucida Grande';font-size:12px;"&gt;&lt;a href="http://www.programacion.com/"&gt;http://www.programacion.com/&lt;/a&gt;)  que te comenta cosas &lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2  style=" color: rgb(0, 0, 0); font-size:120%;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:'Lucida Grande';font-size:12px;"&gt;tan olvidadas para los programadores de lenguajes como JAVA, en la que nos olvidamos de la &lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2  style=" color: rgb(0, 0, 0); font-size:120%;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:'Lucida Grande';font-size:12px;"&gt;destrucción de objetos, ya que el recolector de basura lo hace supuestamente por nosotros. &lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 style="font-size: 120%; font-weight: bold; color: rgb(0, 0, 0); "&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2 style="font-size: 120%; font-weight: bold; color: rgb(0, 0, 0); "&gt;Forzar la Finalización y la Recolección de Basura&lt;/h2&gt;&lt;p&gt;El sistema de ejecución de Java realiza las tareas de manejo de memoria por tí. Cuando un programa ha terminado de utilizar un objeto-- esto es, cuando ya no hay más referencias a ese objeto- el objeto es finalizado y luego se recoge la basura.&lt;/p&gt;&lt;p&gt;Estas tareas suceden asíncronamente en segundo plano. Sin embargo, se puede forzar la finalización de un objeto y la recolección de basura utilizando los métodos apropiados de la clase System.&lt;/p&gt;&lt;a name="finalizar" style="color: rgb(153, 147, 17); text-decoration: none; "&gt;&lt;/a&gt;&lt;h3 style="font-size: 115%; font-weight: bold; color: rgb(65, 128, 190); "&gt;&lt;img src="http://www.programacion.com/java/graficos/item-lista.gif" align="absmiddle" alt="." style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /&gt; Finalizar Objetos&lt;/h3&gt;&lt;p&gt;Antes de recolectar la basura de un objeto, el sistema de ejecución de Java le da la oportunidad de limpiarse a sí mismo. Este paso es conocido como finalización y se consigue mediante una llamada al método &lt;b&gt;finalize()&lt;/b&gt; del objeto. El objeto debe sobreescribir este método para realizar cualquier tarea de limpieza final como la liberación de recursos del sistema como ficheros o conexiones. Para más informaciónsobre el método &lt;b&gt;finalize()&lt;/b&gt; puedes ver: &lt;a href="http://www.programacion.com/cursos/java_basico/finalize.htm" style="color: rgb(153, 147, 17); text-decoration: none; "&gt;Escribir un método finalize()&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Se puede forzar que ocurra la finalización de un objeto llamando al método &lt;b&gt;runFinalization()&lt;/b&gt; de la clase System.&lt;/p&gt;&lt;div&gt;&lt;b&gt;&lt;/b&gt;&lt;/div&gt;&lt;pre style="font-family: monospace; font-size: 11px; color: rgb(153, 0, 0); "&gt;System.runFinalization();&lt;/pre&gt;&lt;p&gt;Este método llama a los métodos &lt;b&gt;finalize()&lt;/b&gt; de todos los objetos que están esperando para ser recolectados.&lt;/p&gt;&lt;a name="recolector" style="color: rgb(153, 147, 17); text-decoration: none; "&gt;&lt;/a&gt;&lt;h3 style="font-size: 115%; font-weight: bold; color: rgb(65, 128, 190); "&gt;&lt;img src="http://www.programacion.com/java/graficos/item-lista.gif" align="absmiddle" alt="." style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /&gt; Ejecutar el Recolector de Basura&lt;/h3&gt;&lt;p&gt;Se le puede pedir al recolector de basura que se ejecute en cualquier momento llamando al método &lt;b&gt;gc()&lt;/b&gt; de la clase System.&lt;/p&gt;&lt;div&gt;&lt;b&gt;&lt;/b&gt;&lt;/div&gt;&lt;pre style="font-family: monospace; font-size: 11px; color: rgb(153, 0, 0); "&gt;System.gc();&lt;/pre&gt;&lt;p&gt;Se podría querer ejecutar el recolector de basura para asegurarnos que lo hace en el mejor momento para el programa en lugar de hacerlo cuando le sea más conveniente al sistema de ejecución.&lt;/p&gt;&lt;p&gt;Por ejemplo, un programa podría desear ejecutar el recolector de basura antes de entrar en un cálculo o una sección de utilización de memoria extensiva, o cuando sepa que va a estar ocupado algun tiempo. El recolector de basura requiere unos 20 milisegundos para realizar su tarea, por eso un programa sólo debe ejecutarlo cuando no tenga ningún impacto en su programa -- esto es, que el programa anticipe que el recolector de basura va a tener tiempo suficiente para terminar su trabajo.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-7192543647857867704?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/7192543647857867704/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=7192543647857867704&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7192543647857867704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7192543647857867704'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/09/cmo-llamar-al-recolector-de-basura-java.html' title='Cómo llamar al recolector de basura JAVA'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-7600975775424580939</id><published>2008-09-28T00:53:00.000-07:00</published><updated>2008-09-28T01:09:28.347-07:00</updated><title type='text'>Plantilla MIDlet J2ME</title><content type='html'>Como todos conocéis J2ME es la tecnología de Sun Microsystems para dispositivos empotrados. Se entienden como tal los dispositivos Moviles, PDAS, PocketPC, Video, Decodificadores, Lavadoras etc...&lt;br /&gt;&lt;br /&gt;    Bueno pues os cuento un poco de historia. Dentro de J2ME existe 2 configuraciones:&lt;br /&gt;&lt;br /&gt;CLDC: Connected Limited Device Configuration, para dispositivos con muy pocos recursos como móviles, PDAs ...&lt;br /&gt;&lt;br /&gt;CDC: Connected Device Configuration, para dispositivos con altos recursos como el decodificador de antena.&lt;br /&gt;&lt;br /&gt;Y ahora dentro de cada Configuración tenemos distintos perfiles (profile):&lt;br /&gt;&lt;br /&gt;&lt;img src="file:///E:/DOCUME%7E1/jcanton/CONFIG%7E1/Temp/moz-screenshot.jpg" alt="" /&gt;&lt;img src="file:///E:/DOCUME%7E1/jcanton/CONFIG%7E1/Temp/moz-screenshot-1.jpg" alt="" /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MqAEAq68mQ0/SN86tIZOHZI/AAAAAAAADf8/O5JzSAMCI78/s1600-h/j2me+scheme.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MqAEAq68mQ0/SN86tIZOHZI/AAAAAAAADf8/O5JzSAMCI78/s320/j2me+scheme.bmp" alt="" id="BLOGGER_PHOTO_ID_5250980237559078290" border="0" /&gt;&lt;/a&gt;    Para trabajar con dispositivos moviles por tanto nos centraremos en la configuración CLDC con el perfil MIDP que actualmente va por su versión 2.0.&lt;br /&gt;&lt;br /&gt;    Bien pues las aplicaciones MIDP se llaman MIDlets por afinidad con los APPlets.  Pues aquí os dejo la plantilla que nos ayudará a empezar a programar nuestro MIDlet, el "Hola mundo":&lt;br /&gt;&lt;br /&gt;import javax.microedition.midlet.*;&lt;br /&gt;import javax.microedition.lcdui.*;&lt;br /&gt;&lt;br /&gt;public class HolaMundo extends MIDlet{&lt;br /&gt;&lt;br /&gt;//Atributos&lt;br /&gt;private Display pantalla;&lt;br /&gt;private Form formulario = null;&lt;br /&gt;&lt;br /&gt;//Constructor&lt;br /&gt;public HolaMundo(){&lt;br /&gt;   pantalla = Display.getDisplay(this);&lt;br /&gt;   formulario = new Form(“Hola Mundo”);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void startApp(){&lt;br /&gt;   pantalla.setCurrent(formulario);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void pauseApp(){&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void destroyApp(boolean unconditional){&lt;br /&gt;   pantalla = null;&lt;br /&gt;  formulario = null;&lt;br /&gt;  notifyDestroyed();&lt;br /&gt;}&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-7600975775424580939?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/7600975775424580939/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=7600975775424580939&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7600975775424580939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7600975775424580939'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/09/plantilla-midlet-j2me.html' title='Plantilla MIDlet J2ME'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_MqAEAq68mQ0/SN86tIZOHZI/AAAAAAAADf8/O5JzSAMCI78/s72-c/j2me+scheme.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-8695060729616148360</id><published>2008-09-28T00:33:00.001-07:00</published><updated>2008-09-28T00:41:48.873-07:00</updated><title type='text'>Convierte tu viejo Windows XP en un MacosX tiger</title><content type='html'>Esta semana bicheado cosas por la red, he encontrado una herramienta que cambia totalmente tu windows XP y lo convierte en un Tiger. Es increible porque no estamos hablando de un simple skin. Estamos hablando de una transformación completa con el famoso Dock de MacosX o una utilidad llamada spysearch para búsquedas indexadas.&lt;br /&gt;&lt;br /&gt;    Os podéis hacer una idea del cambio brutal que hace en el sistema por lo que recomiendo que hagáis un punto de retorno antes de instalarlo pero no os preocupéis porque al instalarlo el se encarga de hacerlo.&lt;br /&gt;&lt;br /&gt;   Podéis encontrar el link para descargar:&lt;br /&gt;&lt;a href="http://www.flyakiteosx.com/"&gt;&lt;br /&gt;http://www.flyakiteosx.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://osx.portraitofakite.com/"&gt;http://osx.portraitofakite.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-8695060729616148360?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/8695060729616148360/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=8695060729616148360&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8695060729616148360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8695060729616148360'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/09/convierte-tu-viejo-windows-xp-en-un.html' title='Convierte tu viejo Windows XP en un MacosX tiger'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-2424052954510437892</id><published>2008-06-19T23:35:00.000-07:00</published><updated>2008-06-19T23:52:35.420-07:00</updated><title type='text'>Comandos de consola en Windows XP</title><content type='html'>Alguna vez que otra he tenido que montar un servidor IIS sobre un windows server. Todo esto porque a alguien se le ocurre que el lenguaje ASP es un bueno lenguaje para desarrollar páginas webs :S. Bueno cuando te encargan una tarea de estas, andas muy perdido ya que en un windows todo lo sabes hacer a través del entorno gráfico, pues bien aquí os dejo una lista de comandos de consola muy útiles que no servirán para trabajar más comodamente e incluso sin tener que arrancar un escritorio remoto, sino a través de un Openssh por ejemplo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;subst x: c:\carpeta:&lt;/span&gt;  Crea una unidad virtual a través de una carpeta.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Archivos y sistemas de ficheros&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;cacls:&lt;/b&gt; Permite modificar los permisos en ficheros y carpetas, permitiendo o prohibiendo a cada usuario leer, escribir o modificar el contenido de dichos archivos o carpetas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;chkdsk&lt;/b&gt;: Comprueba el estado de una partición y repara los daños en caso de que encuentre alguno. Si lo ponemos sin ningún parámetro simplemente escaneará la partición, si queremos que además corrija los errores, deberemos añadir la opción /F, es decir, chkdsk /F.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;cipher:&lt;/b&gt; Permite cifrar archivos, directorios o particiones siempre que se encuentren en el sistema de archivos NTFS.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;comp:&lt;/b&gt; Compara archivos o carpetas y muestra las diferencias existentes entre ellos.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;compact:&lt;/b&gt;&lt;span&gt; Permite comprimir archivos o carpetas para ahorrar espacio en el disco duro. Para comprimir los archivos deberemos utilizar el modificador /c y para descomprimirlo en modificador /u. Por ejemplo, para comprimir la carpeta c:\pruebas debemos utilizar el comando compact /c c:\pruebas y para descomprimirla compact /u &lt;/span&gt;&lt;a href="file:///c:/pruebas"&gt;c:\pruebas&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;convert:&lt;/b&gt;&lt;span&gt; Convierte particiones FAT ó FAT32 a NTFS. Antes de utilizar este  comando es recomendable realizar una copia de seguridad puesto que es  posible que durante la conversión se pierdan datos.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;defrag:&lt;/b&gt; Desfragmenta los archivos de una unidad, similar a la utilidad Defragmentador de discos de Windows pero en modo consola.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;diskpart:&lt;/b&gt;&lt;span&gt; Permite crear, eliminar y administrar particiones. Este programa en  modo consola debemos utilizarlo con cuidado puesto que es fácil que  eliminemos sin darnos cuenta todo el contenido del disco duro o de la  partición activa.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;find y findstr:&lt;/b&gt; Estos comandos buscan cadenas de textos en el interior de uno o varios archivos. Sin embargo, el comando findstr ofrece más opciones de búsqueda que el comando find.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;iexpress:&lt;/b&gt; Este comando lanzará un asistente para crear archivos comprimidos .CAB autodescomprimibles.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;openfiles:&lt;/b&gt; Muestra a un administrador los archivos abiertos en un sistema a un administrador y permite desconectarlos si se han abierto a través de red.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Configuración del sistema&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;bootcfg:&lt;/b&gt; Permite ver y modificar las entradas del archivo boot.ini. Estas entradas nos permiten seleccionar con que sistema operativo deseamos iniciar el equipo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;control userpasswords2:&lt;/b&gt;&lt;span&gt; Permite modificar las claves y los permisos de los diferentes usuarios, así como requerir la pulsación de control+alt+suprimir para poder iniciar sesión, haciendo el inicio de sesión más seguro.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;driverquery:&lt;/b&gt; Hace un listado de todos los drivers instalados en el sistema y muestra información sobre cada uno de ellos.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;dxdiag:&lt;/b&gt;&lt;span&gt; Lanza la herramienta de diagnóstico de Direct X, con la cual podremos comprobar la versión Direct X que tenemos instalada y permite comprobar mediante tests que todo lo referente a estos controladores funcione correctamente.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;gpresult:&lt;/b&gt; Muestra información sobre las políticas de grupo aplicadas a un usuario.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;gpupdate:&lt;/b&gt; Vuelve a aplicar las políticas de grupo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;msconfig:&lt;/b&gt;&lt;span&gt; Desde esta aplicación en modo gráfico podremos seleccionar que  programas y servicios se cargan durante el inicio de Windows así como  los sistemas operativos que el usuario puede seleccionar para iniciar  el ordenador.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;pagefileconfig:&lt;/b&gt;&lt;span&gt; Permite configurar el archivo de paginación de Windows.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;prncnfg:&lt;/b&gt; Muestra información sobre las impresoras instaladas&lt;br /&gt;&lt;br /&gt;&lt;b&gt;prnjobs:&lt;/b&gt; Muestra información sobre los trabajos de impresión en cola.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;reg:&lt;/b&gt;&lt;span&gt; Permite ver y modificar valores del registro de Windows. Las opciones posibles son:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;reg query =&gt; realiza una consulta en el registro&lt;br /&gt;&lt;br /&gt;reg add =&gt; añade una entrada al registro&lt;br /&gt;&lt;br /&gt;reg delete =&gt; elimina una clave del registro&lt;br /&gt;&lt;br /&gt;reg copy =&gt; copia una clave del registro a otra parte del registro o a otro equipo&lt;br /&gt;&lt;br /&gt;reg save =&gt; guarda una parte del registro en un archivo&lt;br /&gt;&lt;br /&gt;reg restore =&gt; restaura una parte del registro de un archivo&lt;br /&gt;&lt;br /&gt;reg load =&gt; carga una clave o árbol al registro desde un archivo&lt;br /&gt;&lt;br /&gt;&lt;span&gt;reg unload =&gt; descarga una clave o árbol del registro&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;reg compare =&gt; compara varios valores del registro&lt;br /&gt;&lt;br /&gt;reg export =&gt; exporta el registro o parte del registro a un archivo&lt;br /&gt;&lt;br /&gt;reg import =&gt; importa el registro o parte del registro de un archivo&lt;br /&gt;&lt;br /&gt;&lt;b&gt;regedit:&lt;/b&gt; Editor del registro en modo gráfico.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;sc:&lt;/b&gt; Este commando nos permite administrar los servicios, ya sea iniciar uno, detenerlo, mandarle señales, etc.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;sfc:&lt;/b&gt;&lt;span&gt; Este comando permite buscar archivos del sistema dañados y recuperarlos en caso de que estén defectuosos (es necesario el CD de instalación del  sistema operativo para utilizarlo). Para realizar una comprobación  inmediata, deberemos ejecutar la orden sfc /scannow.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;systeminfo:&lt;/b&gt;&lt;span&gt; Muestra información sobre nuestro equipo y nuestro sistema operativo:  número de procesadores, tipo de sistema, actualizaciones instaladas,  etc.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;taskkill:&lt;/b&gt; Permite eliminar un proceso conociendo su nombre o el número del proceso (PID).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;tasklist:&lt;/b&gt; Realiza un listado de todos los procesos que hay. Útil si deseamos eliminar un proceso y no conocemos exactamente su nombre o su PID.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Redes&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;arp:&lt;/b&gt;&lt;span&gt; Muestra y permite modificar las tablas del protocolo ARP, encargado de convertir las direcciones IP de cada ordenador en direcciones MAC (dirección física única de cada tarjeta de red).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ftp:&lt;/b&gt; Permite conectarse a otra máquina a través del protocolo FTP para transferir archivos.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;getmac:&lt;/b&gt; Muestra las direcciones MAC de los adaptadores de red que tengamos instalados en el sistema.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ipconfig:&lt;/b&gt; Muestra y permite renovar la configuración de todos los interfaces de red.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;nbtstat:&lt;/b&gt; Muestra las estadísticas y las conexiones actuales del protocolo NetBIOS sobre TCP/IP, los recursos compartidos y los recursos que son accesibles.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;net:&lt;/b&gt; Permite administrar usuarios, carpetas compartidas, servicios, etc. Para un listado completo de todas las opciones, escribir net sin ningún argumento. Para obtener ayuda sobre alguna opción en concreto, escribier net help opción.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;netsh:&lt;/b&gt; Este programa en modo consola permite ver, modificar y diagnosticar la configuración de la red&lt;br /&gt;&lt;br /&gt;&lt;b&gt;netstat:&lt;/b&gt; Mediante este comando obtendremos un listado de todas las conexiones de red que nuestra máquina ha realizado.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;nslookup:&lt;/b&gt; Esta aplicación se conecta a nuestros servidores DNS para resolver la IP de cualquier nombre de host. Por ejemplo, si ejecutamos nslookup y escribimos &lt;a target="_blank" href="http://www.xdireccion.com/"&gt;www.xdireccion.com&lt;/a&gt;, nos responderá con algo como:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Respuesta no autoritativa:&lt;br /&gt;Nombre: &lt;a target="_blank" href="http://www.xdireccion.com/"&gt;www.xdireccion.com&lt;/a&gt;&lt;br /&gt;Address: 217.76.130.250&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Esto quiere decir que la dirección web&lt;a target="_blank" href="http://www.xdireccion.com/"&gt;www.xdireccion.com&lt;/a&gt; corresponde con la IP 217.76.130.250.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;pathping:&lt;/b&gt; Muestra la ruta que sigue cada paquete para llegar a una IP determinada, el tiempo de respuesta de cada uno de los nodos por los que pasa y las estadísticas de cada uno de ellos.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ping:&lt;/b&gt; Poniendo detrás del comando ping el nombre o la dirección IP de la máquina, por ejemplo ping 192.168.0.1 enviaremos un paquete a la dirección que pongamos para comprobar que está encendida y en red. Además, informa del tiempo que tarda en contestar la máquina destino, lo que nos puede dar una idea de lo congestionada que esté la red.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;rasdial:&lt;/b&gt; Permite establecer o finalizar una conexión telefónica.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;route:&lt;/b&gt; Permite ver o modificar las tablas de enrutamiento de red.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;tracert:&lt;/b&gt; Muestra el camino seguido para llegar a una IP y el tiempo de respuesta de cada nodo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Varios&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;at:&lt;/b&gt; Permite programar tareas para que nuestro ordenador las ejecute en una fecha o en un momento determinado.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;logoff::&lt;/b&gt; Este comando nos permite cerrar una sesión iniciada, ya sea en nuestro ordenador o en otro ordenador remoto.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;msg::&lt;/b&gt; Envía un mensaje a unos o varios usuarios determinados mediante su nombre de inicio de sesión o el identificador de su sesión&lt;br /&gt;&lt;br /&gt;&lt;b&gt;msiexec::&lt;/b&gt; Permite instalar, desinstalar o reparar un programa instalado mediante un paquete MSI (archivos con extensión .msi).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;runas:&lt;/b&gt; Permite ejecutar un programa con privilegios de otra cuenta. Útil por ejemplo si estamos como usuario limitado y queremos hacer algo que necesite privilegios de administrador.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;shctasks:&lt;/b&gt; Permite administrar las tareas programadas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;shutdown:&lt;/b&gt; Permite apagar, reiniciar un ordenador o cancelar un apagado. Es especialmente útil si hemos sido infectado con el virus Blaster o una de sus variantes para cancelar la cuenta atrás. Para ello, tan sólo tendremos que utilizar la sintaxis shutdown -a.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Microsoft Management Console (MMC)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Estos comandos nos darán acceso a distintas partes de la Microsoft Management Console, un conjunto de pequeñas aplicaciones que nos permitirán controlar varios apartados de la configuración de nuestro sistema operativo.&lt;br /&gt;&lt;br /&gt;Para acceder a estas opciones, no es necesario entrar en la consola del sistema (cmd.exe), sino que basta con introducirlos directamente desde inicio - ejecutar.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ciadv.msc:&lt;/b&gt; Permite configurar el servicio de indexado, que acelera las búsquedas en el disco duro.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;compmgmt.msc:&lt;/b&gt; Da acceso a la Administración de equipos, desde donde podemos configurar nuestro ordenador y acceder a otras partes de la MMC.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;devmgmt.msc::&lt;/b&gt; Accede al Administrador de dispositivos.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;dfrg.msc:&lt;/b&gt; Desfragmentador del disco duro.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;diskmgmt.msc:&lt;/b&gt; Administrador de discos duros.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;fsmgmt.msc:&lt;/b&gt; Permite administrar y monitorizar los recursos compartidos.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;gpedit.msc:&lt;/b&gt; Permite modificar las políticas de grupo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;lusrmgr.msc:&lt;/b&gt; Permite ver y modificar los usuarios y grupos locales.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ntmsmgr.msc:&lt;/b&gt; Administra y monitoriza los dispositivos de almacenamientos extraíbles.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ntmsoprq.msc:&lt;/b&gt; Monitoriza las solicitudes del operador de medios extraíbles.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;perfmon.msc:&lt;/b&gt; Monitor de rendimiento del sistema.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;secpol.msc:&lt;/b&gt; Configuración de la política de seguridad local.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;services.msc:&lt;/b&gt; Administrador de servicios locales.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;wmimgmt.msc:&lt;/b&gt; Configura y controla el servicio Instrumental de administración (WMI) de Windows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-2424052954510437892?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/2424052954510437892/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=2424052954510437892&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/2424052954510437892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/2424052954510437892'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/06/comandos-de-consola-en-windows-xp.html' title='Comandos de consola en Windows XP'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-6438184688140016765</id><published>2008-05-28T23:43:00.000-07:00</published><updated>2008-05-28T23:54:32.965-07:00</updated><title type='text'>Configuración de Apache, Mod_JK y glassfish</title><content type='html'>A menudo se suele usar un apache como servidor de aplicaciones que redirecciona las peticiones a nuestro glassfish con nuestra aplicación J2EE. ¿Porqué se hacer esto? pues puede que tengas varios servicios en esa misma máquina, imaginate que quieres tener un servicio en php que va de sobra con un apache por el puerto 80, pero ahora necesitas colgar el nuevo servicio en J2EE para lo que apache no da soporte. Tambíen destacar que la gestión de peticiones y la compresión del tráfico de datos es mucho más eficiente en apache que en glassfish, por este motivo mucha gente suele usar estos dos servidores web en conjunción para trabajar. Y Mod_jk no es más que el modulo que nos permitira conectar apache y glassfish.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Instrucciones paso a paso:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;a) aptitude install apache2 libapache2-mod-jk&lt;br /&gt;&lt;br /&gt;b) Descargar:&lt;br /&gt;http://java.net/download/javaee5/v2ur2/promoted/Linux/glassfish-installer-v2ur2-b04-linux.jar&lt;br /&gt;&lt;br /&gt;c) Seguir estos pasos:&lt;br /&gt;Establecer JAVA_HOME al JDK que tengamos.&lt;br /&gt;Lanzar:&lt;br /&gt;   % sudo java -Xmx256m -jar glassfish-version-que-seea.jar&lt;br /&gt;Esto descomprime el glassfish y crea una nueva estructura.&lt;br /&gt; % cd glassfish&lt;br /&gt;Damos permisos al ant de glassfish:&lt;br /&gt;        % chmod -R +x lib/ant/bin&lt;br /&gt;        % lib/ant/bin/ant -f setup.xml&lt;br /&gt;&lt;br /&gt;Si queremos soporte a clustering (garantizaría disponibilidad absoluta del servicio), cambiamos lo anterior por:&lt;br /&gt;% lib/ant/bin/ant -f setup-cluster.xml&lt;br /&gt;&lt;br /&gt;d) Abrimos /etc/apache/httpd.conf y le copiamos estas líneas:&lt;br /&gt;&lt;br /&gt;JkWorkersFile /etc/apache2/worker.properties&lt;br /&gt;# Where to put jk logs&lt;br /&gt;JkLogFile /var/log/apache2/mod_jk.log&lt;br /&gt;# Set the jk log level [debug/error/info]&lt;br /&gt;JkLogLevel debug&lt;br /&gt;# Select the log format&lt;br /&gt;JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "&lt;br /&gt;# JkOptions indicate to send SSL KEY SIZE,&lt;br /&gt;JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories&lt;br /&gt;# JkRequestLogFormat set the request format&lt;br /&gt;JkRequestLogFormat "%w %V %T"&lt;br /&gt;# Send all jsp requests to GlassFish&lt;br /&gt;JkMount /*.jsp worker1&lt;br /&gt;# Enviar peticiones de clg-web a Glassfish&lt;br /&gt;#JkMount /clg-web/* worker1&lt;br /&gt;JkMount /* worker1&lt;br /&gt;&lt;br /&gt;e) ahora descargamos una instalación de tomcat exclusivamente para copiar el archivo tomcat-ajp.jar&lt;br /&gt;Pensé que podría descargarlo de aquí (tomcat6), por aquello de ser una versión más nueva:&lt;br /&gt;http://ftp.udc.es/apache-dist/tomcat/tomcat-6/v6.0.16/bin/apache-tomcat-6.0.16.tar.gz&lt;br /&gt;Pero no trae el archivo tomcat-ajp.jar, así que lo sacamos de aquí:&lt;br /&gt;wget http://archive.apache.org/dist/tomcat/tomcat-5/v5.5.16/bin/apache-tomcat-5.5.16.tar.gz&lt;br /&gt;&lt;br /&gt;f) Copiamos esto:&lt;br /&gt;/opt/glassfish/lib# cp /opt/apache-tomcat-5.5.16/server/lib/tomcat-ajp.jar .&lt;br /&gt;&lt;br /&gt;g) Hacemos lo mismo con:&lt;br /&gt;http://apache.rediris.es/commons/logging/binaries/commons-logging-1.1.1-bin.tar.gz&lt;br /&gt;Y luego:&lt;br /&gt;/opt/glassfish/lib# cp //tmp/commons-logging-1.1.1/commons-logging-1.1.1.jar commons-logging.jar&lt;br /&gt;Y lo mismo con:&lt;br /&gt;http://apache.rediris.es/commons/modeler/binaries/commons-modeler-2.0.1.tar.gz&lt;br /&gt;Y con:&lt;br /&gt;/opt/glassfish/lib# cp /tmp/commons-modeler-2.0.1/commons-modeler-2.0.1.jar commons-modeler.jar&lt;br /&gt;&lt;br /&gt;g) Por último, habilitamos mod_jk, arrancando primero Glassfish (asadmin start-domain domain1)y luego:&lt;br /&gt;&lt;br /&gt;asadmin create-jvm-options -Dcom.sun.enterprise.web.connector.enableJK=8009&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-6438184688140016765?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/6438184688140016765/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=6438184688140016765&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/6438184688140016765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/6438184688140016765'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/configuracin-de-apache-modjk-y.html' title='Configuración de Apache, Mod_JK y glassfish'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-8640747539949010770</id><published>2008-05-18T04:06:00.000-07:00</published><updated>2008-05-18T04:07:03.872-07:00</updated><title type='text'>Integrar Spring con Struts</title><content type='html'>¿Cómo podemos usar Spring como framework para la capa de negocio y struts para la presentación?&lt;br /&gt;&lt;br /&gt; El problema radica en que Spring es un framework empresarial "ligero". De esta forma, su tecnología IoC (inyección de dependencias) solo tiene alcance en el propio framework Spring y no inyecta dependencias en Struts. Si no inyecta dependencias en Struts, ¿como podemos desde struts llamar a los métodos de negocio implementados por Spring? En este tutorial intentaremos dar respuesta a esta pregunta. Tenemos el fichero de configuración de Struts que tendrá la información pertinente a los ActionForm y los Action, principalmente, junto con otra información adicional como los global-exceptions, etc., el fichero de configuración de struts (struts-config.xml) ¡no es necesario tocarlo con este método que vamos a mostrar para integrar struts con spring!.&lt;br /&gt;&lt;br /&gt;El único fichero que tocaremos será web.xml.&lt;br /&gt;&lt;br /&gt;Pero antes de nada, vamos por partes:&lt;br /&gt;&lt;br /&gt;1) Lo primero es tener el fichero de configuración de Spring que tendrá una pinta como esta (versión 2.5)&lt;br /&gt;&lt;br /&gt;&lt;!-- este fichero debe estar localizado en /WEB-INF/applicationContext.xml --&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;br /&gt;&lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;    xmlns:aop="http://www.springframework.org/schema/aop"&lt;br /&gt;    xmlns:context="http://www.springframework.org/schema/context"&lt;br /&gt;    xsi:schemaLocation="http://www.springframework.org/schema/beans&lt;br /&gt;           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;           http://www.springframework.org/schema/aop&lt;br /&gt;           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd&lt;br /&gt;           http://www.springframework.org/schema/context&lt;br /&gt;           http://www.springframework.org/schema/context/spring-context-2.5.xsd"&gt;&lt;br /&gt;    &lt;context:annotation-config /&gt;&lt;br /&gt;    &lt;context:component-scan base-package="com.myapp.negocio" /&gt;&lt;br /&gt;    &lt;aop:aspectj-autoproxy /&gt;&lt;br /&gt;&lt;/beans&gt;&lt;br /&gt;&lt;br /&gt;Podemos comprobar como se han activado con la línea &lt;context:annotation-config /&gt; el manejo de las anotaciones de las clases para que quede al más puro estilo EJB3. De este modo, las clases de negocio de Spring basta con anotarlas con @Service, por ejemplo:&lt;br /&gt;&lt;br /&gt;/* Interfaz de negocio (el equivalente al @Local de EJB, nótese que no requiere anotación en Spring) */&lt;br /&gt;package com.myapp.negocio;&lt;br /&gt;&lt;br /&gt;public interface IUnServicio {&lt;br /&gt;&lt;br /&gt;    boolean login(String user, String pass);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* Implementación de la interfaz, note que para indicarle a Spring que es un objeto de negocio se usa la anotación @Service (sería el "equivalente" a @Stateless de EJB3) */&lt;br /&gt;package com.myapp.negocio;&lt;br /&gt;&lt;br /&gt;import org.springframework.stereotype.Service;&lt;br /&gt;&lt;br /&gt;@Service&lt;br /&gt;public class UnGranServicioBean implements IUnServicio {&lt;br /&gt;    public boolean login(String user, String pass) {&lt;br /&gt;        return user.equals("jjj") &amp;&amp; pass.equals("mmm");&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Siguiendo con el fichero de configuración de Spring, la línea &lt;context:component-scan base-package="com.myapp.negocio" /&gt; le indica a Spring que rastree todas las clases del paquete indicado en el atributo "package" en busca de aquellas que estén anotadas (en nuestro caso con @Service, aunque serviría @Component y @Repository) y mantenerlas (posibilidad de inyección de dependencias en otras clases, etc.,).&lt;br /&gt;&lt;br /&gt;La última línea del fichero de configuración &lt;aop:aspectj-autoproxy /&gt; indica que se active la programación orientada a Aspectos (implementada por AspectJ que es el framework dónde se apoya Spring). De este modo si se encuentran Aspectos se compilan y tejen como si usáramos AspectJ.&lt;br /&gt;&lt;br /&gt;Hay que tener en cuenta que para activar AspectJ necesitamos tener dicha librería en el PATH. En el framework de Spring si nos lo bajamos con las dependencias tenemos en la carpeta LIB el jar correspondiente a AspectJ por lo que en teoría no deberíamos de bajarnos nada más. Para integrar AspectJ con Spring basta con añadir al PATH una librería más, la librería correspondiente a AspectJ que se encuentra en la subcarpeta Module del framework de Spring.&lt;br /&gt;&lt;br /&gt;Con el fichero de configuración de Spring, Struts y los @Service listos junto con las librerías de Spring necesarias, basta añadir las siguientes líneas al fichero web.xml para integrar Spring con Struts:&lt;br /&gt;&lt;br /&gt;&lt;!-- esto es para integrar struts con spring y hay que meterlo en el web.xml --&gt;&lt;br /&gt;    &lt;listener&gt;&lt;br /&gt;        &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;&lt;br /&gt;    &lt;/listener&gt;&lt;br /&gt;&lt;br /&gt;¿Cómo accedo, por tanto, al ApplicationContext de Spring para obtener los objetos de negocio?&lt;br /&gt;&lt;br /&gt;Basta con cambiar la clase que hereda los Action por ActionSupport. Por ejemplo:&lt;br /&gt;&lt;br /&gt;package com.myapp.struts;&lt;br /&gt;&lt;br /&gt;import com.myapp.negocio.IUnServicio;&lt;br /&gt;import javax.servlet.http.HttpServletRequest;&lt;br /&gt;import javax.servlet.http.HttpServletResponse;&lt;br /&gt;import org.apache.struts.action.ActionForm;&lt;br /&gt;import org.apache.struts.action.ActionMapping;&lt;br /&gt;import org.apache.struts.action.ActionForward;&lt;br /&gt;import org.springframework.web.struts.ActionSupport;&lt;br /&gt;&lt;br /&gt;// Nota como la clase que hereda es ActionSupport en vez del clásico Action de Struts.&lt;br /&gt;public class LoginAction extends ActionSupport {&lt;br /&gt;    &lt;br /&gt;    private final static String SUCCESS = "success";&lt;br /&gt;    &lt;br /&gt;    public ActionForward execute(ActionMapping mapping, ActionForm  form,&lt;br /&gt;            HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;            throws Exception {&lt;br /&gt;        IUnServicio servicio = (IUnServicio) this.getWebApplicationContext().getBean("unServicio");&lt;br /&gt;        return mapping.findForward(SUCCESS);&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Esta ActionSuppor nos permite sacar el contexto de Spring con getWebApplicationContext() y ahora si podemos sacar los objetos de negocio.&lt;br /&gt;&lt;br /&gt;El nombre del objeto de negocio es el nombre de la interfaz en minúscula la primera letra. Por ejemplo, si nuestra interfaz se llama MiInterfaz, tendremos que preguntar por getWebApplicationContet().getBean("miInterfaz"). También hay que tener en cuenta que si seguimos la convención de que los nombres de las interfaces empiecen por 'I' latina mayúscula, Spring la omite para el nombre. De este modo, la interfaz IMiInterfaz la conseguiremos del mismo modo que MiInterfaz, preguntando por "miInterfaz".&lt;br /&gt;&lt;br /&gt;Existen más métodos para integrar Struts con Spring. Este método es el más sencillo pero provoca que se acoplen Spring y Struts. Esto no debería ser un problema si la apuesta es segura. Los otros métodos requieren cambiar muchos parámetros de los ficheros de configuración de ambas herramientas lo que provoca, finalmente, que se acoplen a nivel de ficheros de configuración, por lo que personalmente prefiero este método que para desacoplar si, por ejemplo, se decide usar EJB en vez de Spring, bastaría con renombrar los ActionSupport por Action (un simple Replace All en cualquier IDE) y eliminar la línea de &lt;listener&gt; de web.xml.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-8640747539949010770?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/8640747539949010770/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=8640747539949010770&amp;isPopup=true' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8640747539949010770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8640747539949010770'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/integrar-spring-con-struts.html' title='Integrar Spring con Struts'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-8947700758586407623</id><published>2008-05-18T04:05:00.001-07:00</published><updated>2008-05-18T04:05:59.369-07:00</updated><title type='text'>Conexión a Base de datos con Java</title><content type='html'>Hay algunas aplicaciones chorras que tenemos que hacer de vez en cuando, que necesitan hacer una conexión a una bbdd y debido a lo pequeñas que son no merece la pena usar un motor de persistencia del tipo hibernate o toplink. En estos casos es importante tener claro como hacer conexiones  a pelo desde java contra una bbdd con jdbc.&lt;br /&gt;&lt;br /&gt;En este tutorial pongo el codigo java para hacer una conexión a una bbdd MYSQL y lanzar algunas consultas. &lt;br /&gt;&lt;br /&gt;Codigo java&lt;br /&gt;&lt;br /&gt;(Para que este codigo os funcione teneis que añadir el conector jdbc para mysql, en el caso de usar otra bbdd simplemente con cambiar el connector o driver es suficiente para que funcione. Lo interesante de jdbc es que nos hace de fachada y nos permite conectarnos de la misma forma con cualquier base de datos) &lt;br /&gt;&lt;br /&gt;-----------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;import java.sql.*;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   public class Connect&lt;br /&gt;   {&lt;br /&gt;       public static void main (String[] args)&lt;br /&gt;       {&lt;br /&gt;           Connection conn = null;&lt;br /&gt;&lt;br /&gt;           try&lt;br /&gt;           {&lt;br /&gt;               String userName = "nombre_usuario";&lt;br /&gt;               String password = "password_usuario";&lt;br /&gt;               String url = "jdbc:mysql://localhost/nombre_bbdd";&lt;br /&gt;               Class.forName ("com.mysql.jdbc.Driver").newInstance ();&lt;br /&gt;               conn = DriverManager.getConnection (url, userName, password);&lt;br /&gt;               System.out.println ("Database connection established");&lt;br /&gt;              &lt;br /&gt;               Statement s = conn.createStatement ();&lt;br /&gt;               int count;&lt;br /&gt;               count= s.executeUpdate(&lt;br /&gt;                           "INSERT INTO revistas (idrevista, fecha, titulo , destino)"&lt;br /&gt;                           + " VALUES"&lt;br /&gt;                           + "('78','2007-11-22','esto va a pelo','va a pelitooo')");&lt;br /&gt;               s.close ();&lt;br /&gt;               System.out.println (count + " rows were inserted");&lt;br /&gt;&lt;br /&gt;           }&lt;br /&gt;           catch (Exception e)&lt;br /&gt;           {&lt;br /&gt;               System.err.println ("Cannot connect to database server");&lt;br /&gt;               e.printStackTrace();&lt;br /&gt;           }&lt;br /&gt;           finally&lt;br /&gt;           {&lt;br /&gt;               if (conn != null)&lt;br /&gt;               {&lt;br /&gt;                   try&lt;br /&gt;                   {&lt;br /&gt;                       conn.close ();&lt;br /&gt;                       System.out.println ("Database connection terminated");&lt;br /&gt;                   }&lt;br /&gt;                   catch (Exception e) { /* ignore close errors */ }&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Espero que os sirva  ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-8947700758586407623?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/8947700758586407623/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=8947700758586407623&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8947700758586407623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8947700758586407623'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/conexin-base-de-datos-con-java.html' title='Conexión a Base de datos con Java'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-5261091953816239526</id><published>2008-05-18T04:03:00.000-07:00</published><updated>2008-05-18T04:04:35.006-07:00</updated><title type='text'>Configurar java en ubuntu</title><content type='html'>Tengo  muchos amigos, en el trabajo que se vuelven locos instalando java. Y mira que es la cosa más tonta del mundo incluso te puedes bajar el Automatix que te lo instala solo. Ahora que ocurre cuando tienes varias versiones de java instaladas. Ohhh no tengo instalada la versión ultima de java pero me sigue saliendo la version 1.4.2 que viene por defecto con el sistema operativo. Oh no el eclipse no me arranca.... Bien pues os mostraré el super comando que lo arregla, y es que con poner en la consola:&lt;br /&gt;&lt;br /&gt;&gt;  sudo update-alternatives --config java&lt;br /&gt;&lt;br /&gt; Os saldran en forma de lista todas las versiones de java que tengais instalados en la maquina y simplemente seleccionado su numeración se configura el sistema para usar dicha versión.&lt;br /&gt;&lt;br /&gt; Espero que os sea tan util como a mi  ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-5261091953816239526?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/5261091953816239526/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=5261091953816239526&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/5261091953816239526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/5261091953816239526'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/configurar-java-en-ubuntu.html' title='Configurar java en ubuntu'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-1206871166023102003</id><published>2008-05-18T04:02:00.000-07:00</published><updated>2008-05-18T04:03:46.382-07:00</updated><title type='text'>Comandos de interés IV - SVN</title><content type='html'>Subversión es el sistema de control de versiones probablemente más usado, pero una vez que te acostumbras a trabajar con él, solo te dedicas a hacer update o commit. Bien pues esto es una vez que ya esta todo configurado, por ello creo interesante hacer este articulo sobre los comandos más usados en SVN a nivel de administrador, ya que se usan en contadas ocasiones y nunca las recuerdas por lo que tener una guía rápida donde mirar siempre viene bien&lt;br /&gt;&lt;br /&gt;Espero que os sirva a todos también. &lt;br /&gt;&lt;br /&gt;Crear un repositorio nuevo&lt;br /&gt;&lt;br /&gt;svnadmin create nombre_repositorio&lt;br /&gt;&lt;br /&gt;Añadir un árbol de directorios al repositorio&lt;br /&gt;&lt;br /&gt;svn import path_al_directorio nombre_repositorio&lt;br /&gt;&lt;br /&gt;Obtener una copia de trabajo&lt;br /&gt;&lt;br /&gt;svn checkout file:///nombre_repositorio/dir directorio_de_trabajo&lt;br /&gt;&lt;br /&gt;Obtener una copia sin control de versiones&lt;br /&gt;&lt;br /&gt;svn export file:///nombre_repositorio/dir directorio_destino&lt;br /&gt;&lt;br /&gt;Hacer una copia de seguridad de todo el repositorio&lt;br /&gt;&lt;br /&gt;svnadmin dump nombre_repositorio &gt; ficheroBackup&lt;br /&gt;&lt;br /&gt;Restaurar una copia de seguridad en un nuevo repositorio&lt;br /&gt;&lt;br /&gt;svnadmin create nombre_nuevo_repositorio&lt;br /&gt;svnadmin load nombre_nuevo_repositorio &lt; ficheroBackup&lt;br /&gt;&lt;br /&gt;Ver el estado actual de la copia de trabajo&lt;br /&gt;&lt;br /&gt;svn status&lt;br /&gt;&lt;br /&gt;Añadir nuevos ficheros o directorios&lt;br /&gt;&lt;br /&gt;svn add nombre_fichero&lt;br /&gt;&lt;br /&gt;Eliminar ficheros&lt;br /&gt;&lt;br /&gt;svn del nombre_fichero --force&lt;br /&gt;&lt;br /&gt;Actualizar la copia de trabajo con los últimos cambios en el repositorio&lt;br /&gt;&lt;br /&gt;svn update&lt;br /&gt;&lt;br /&gt;Actualizar el repositorio con los cambios de tu copia de trabajo&lt;br /&gt;&lt;br /&gt;svn commit -m "Mensaje para etiquetar los cambios"&lt;br /&gt;&lt;br /&gt;Permitir accesos anónimos al repositorio (si se usa svnserve)&lt;br /&gt;&lt;br /&gt;Editar el fichero nombre_repositorio/conf/svnserve.conf y descomentar según proceda las lineas:&lt;br /&gt;&lt;br /&gt;# anon-access = read&lt;br /&gt;# auth-access = write&lt;br /&gt;NOTA: Sustituir file:/// por svn:///SERVIDOR si los repositorios están en otra máquina y se está usando svnserve.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-1206871166023102003?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/1206871166023102003/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=1206871166023102003&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/1206871166023102003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/1206871166023102003'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/comandos-de-inters-iv-svn.html' title='Comandos de interés IV - SVN'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-7141983093160034793</id><published>2008-05-18T04:01:00.001-07:00</published><updated>2008-05-18T04:01:48.392-07:00</updated><title type='text'>SSH en windows</title><content type='html'>Hola a todos, como ya sabreis el protocolo SSH es una tonteria instalarlo en un linux, pero no en windows, existen todos los clientes que quieras pero los servidores suelen ser de pago.&lt;br /&gt;&lt;br /&gt;Muchas veces ahi que copiar ficheros de un linux a un windows o viceversa y el protocolo SSH suele ser uno de los métodos más seguro.&lt;br /&gt;&lt;br /&gt;En este tutorial os explicaré como instalar un servidor SSH en windows totalmente gratuito. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Lo primero que vamos a hacer es bajarnos el fichero de instalación de OpenSSH, que es la implementación libre, la cual dispone de una implementación sobre windows, aunque cuando lo instaleis podréis ver que es una emulación del ssh en linux.&lt;br /&gt;&lt;br /&gt; http://sshwindows.sourceforge.net/&lt;br /&gt;&lt;br /&gt;Descargais el ejecutable y lo instalais como cualquier juego que se instala en windows ;)&lt;br /&gt;&lt;br /&gt;He podido comprobar que las ultimas versiones de OpenSSH para windows ya te configuran las variables de entorno y te crean el par de claves y llaves, por lo que no tenemos que preocuparnos por estos temas &lt;br /&gt;&lt;br /&gt;  Bien pues si comprobais la instalación vereis una estructura de carpetas muy similar a la de un linux, por eso podriamos decir que se está emulando este servicio.&lt;br /&gt;&lt;br /&gt;Para poder tener acceso al servicio ssh necesitamos autenticar los usuarios para ello, cogeremos tomaremos todos los usuarios de la maquina windows y los exportaremos para OpenSSH:&lt;br /&gt;&lt;br /&gt;en la carpeta /bin&lt;br /&gt;&lt;br /&gt;&gt; mkpasswd -l -u [usuario_del_sistema_windows] &gt;&gt; ..\etc\passwd (1 vez por cada usuario)&lt;br /&gt;&lt;br /&gt;&gt;mkgroup -l &gt;&gt; ..\etc\group (esto copia todos los grupos)&lt;br /&gt;&lt;br /&gt;Bien, pues por ultimo arrancamos el servicio ssh.&lt;br /&gt;&lt;br /&gt;&gt;C:\net start opensshd &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Tan facil como esto, ya tendremos SSH en windows  ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-7141983093160034793?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/7141983093160034793/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=7141983093160034793&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7141983093160034793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7141983093160034793'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/ssh-en-windows.html' title='SSH en windows'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-5716430674823062974</id><published>2008-05-18T04:00:00.000-07:00</published><updated>2008-05-18T04:01:18.150-07:00</updated><title type='text'>Tunea Gimp para que parezca photoshop</title><content type='html'>Gimp es la mejor herramienta de diseño que conozco en linux, pero en windows y Macos tenemos la herramienta rey "photoshop". Bien pues ahi un grupo que esta adaptando Gimp para que la su organización y opcion sean similares a las de photoshop, es muy curioso porque a todos aquellos que sepais manejar photoshop y querais trabajar con Gimp pero no os sintais cómodos, está es la solución.&lt;br /&gt;&lt;br /&gt;Lo he probado y es muy curioso ;) &lt;br /&gt;&lt;br /&gt;Necesitaremos descargar el paquete gimp shop para eso tecleamos en consola&lt;br /&gt;&lt;br /&gt;    wget http://www.plasticbugs.com/blogimg/gimpshop_2.2.11-1_i386.deb&lt;br /&gt;&lt;br /&gt;Cuando lo tengamos descargado o hacemos doble click sobre él para que se instale o tecleamos en consola&lt;br /&gt;&lt;br /&gt;    sudo dpkg -i gimpshop_2.2.11-1_i386.deb&lt;br /&gt;&lt;br /&gt;Ejecutamos Gimp y observaremos como ha cambiado.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-5716430674823062974?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/5716430674823062974/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=5716430674823062974&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/5716430674823062974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/5716430674823062974'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/tunea-gimp-para-que-parezca-photoshop.html' title='Tunea Gimp para que parezca photoshop'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-4001222074774506509</id><published>2008-05-18T03:59:00.000-07:00</published><updated>2008-05-18T04:26:48.574-07:00</updated><title type='text'>Redirigir de un pagina a otra</title><content type='html'>Muchas veces ocurre que cambiais una web de nombre o de alojamiento y esto hace imposible que mantenga la misma URL que tenia. Si os ocurre esto pero teneis ya un volumen de clientes teneis que ir mostrandoles la nueva URL de la forma menos drastica posible. Para ello se usa la redirección para que en la URL donde antes teniais vuestra pagina ejemplo : www.midominio.com, colgais un html con la unica funcion de llevaros a la nueva url: www.minuevodominio.com.&lt;br /&gt;&lt;br /&gt;Bien pues en el ejemplo que os pongo muestro como hacer esto sin uso de javascript de forma que si el navegador del cliente no lo tiene activado siga redireccionando. Como podeis imaginaros esto es una tonteria del copón pero a mi siempre se me olvida, así que este artículo sirve más que nada de recordatario  ;).&lt;br /&gt;&lt;br /&gt;Bajo la url antigua colgais el siguiente html:&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;   &amp;lt;head&amp;gt;&lt;br /&gt;       &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;       &amp;lt;meta http-equiv="refresh" content = "5;url=http://www.minuevodominio.es"&amp;gt;&lt;br /&gt;       &amp;lt;title&amp;gt;Redirection&amp;lt;/title&amp;gt;&lt;br /&gt;      &amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body style="font-family: verdana,arial; font-style: normal; font-variant: normal; font-weight: bold; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&amp;gt;&lt;br /&gt;   &amp;lt;center&amp;gt;&lt;br /&gt;      &amp;lt;div style="border: 6px solid rgb(70, 130, 180); padding: 35px; width: 550px; margin-top: 50px; background-color: rgb(248, 248, 255); text-align: left;"&amp;gt;&lt;br /&gt;      &amp;lt;h2&amp;gt;Redirección URL&amp;lt;/h2&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;p&amp;gt;La página solicitada ya no existe.&amp;lt;/p&amp;gt;&lt;br /&gt;      &amp;lt;p&amp;gt;En unos segundos, será redirigido automáticamente a la nueva página.&amp;lt;br&amp;gt;Por favor, espere...&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;br&amp;gt;&lt;br /&gt;      &amp;lt;div style="text-align: right;"&amp;gt;&amp;lt;a style="font-family: verdana; font-style: normal; font-variant: normal; font-weight: bold; font-size: 9px; line-height: normal; font-size-adjust: none; font-stretch: normal;" href="http://www.minuevodominio.es"&amp;gt;Si no es redirigido automáticamente, haga clic sobre este enlace.&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;      &amp;lt;/div&amp;gt;&lt;br /&gt;      &amp;lt;/center&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Donde lo unico importante es esta linea:&lt;br /&gt;&lt;br /&gt;&amp;lt;meta http-equiv="refresh" content = "5;url=http://www.minuevodominio.es"&amp;gt;&lt;br /&gt;&lt;br /&gt;que es la que nos redirecciona lo demas es para la estética del mensaje.&lt;br /&gt;&lt;br /&gt;;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-4001222074774506509?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/4001222074774506509/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=4001222074774506509&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/4001222074774506509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/4001222074774506509'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/redirigir-de-un-pagina-otra.html' title='Redirigir de un pagina a otra'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-1583748096323486936</id><published>2008-05-18T03:47:00.000-07:00</published><updated>2008-05-18T03:58:53.814-07:00</updated><title type='text'>Stepmania en Ubuntu</title><content type='html'>Bien para todos aquellos que no lo sepais, stepmania es un simulador de baile muy divertido. Se puede jugar con el teclado convencional aunque lo ideal es comprarse las tipica alfombrilla que habreis visto alguna vez con flechas arriba, abajo, izq, derecha que se conecta usb.&lt;br /&gt;&lt;br /&gt;Tambien destacar que se hace mucho ejercicio jugando ha este juego, asi q todos aquellos que esteis buscando algo divertido para perder peso ya que no teneis tiempo para el gym. Tirar a la basura todo eso que anuncia la teletienda esto es  sin dudas lo mejor para ello.&lt;br /&gt;&lt;br /&gt; Y por ultimo añadir que esto es otro zasss en toda la boca a todo aquel que dice aquello de "en linux no se puede jugar"   ;)&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Para instalar la ultima versión de Stepmania (version 4) solo tendreis que seguir estas instrucciones:&lt;br /&gt;&lt;br /&gt;1) Añadir un nuevo repositorio a nuestro source.list&lt;br /&gt;&lt;br /&gt;$sudo gedit /etc/apt/source.list&lt;br /&gt;&lt;br /&gt;Y al final del fichero añadimos la linea&lt;br /&gt;&lt;br /&gt;#Repositorio de stepmania&lt;br /&gt;&lt;br /&gt;deb http://repositorios.nighto.net/ feisty/ &lt;br /&gt;&lt;br /&gt;(Nota.Nos os preocupeis por lo de feisty yo lo he probado en una edgy y va perfe)&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;2) Actualizar e instalar&lt;br /&gt;&lt;br /&gt;$sudo apt-get update&lt;br /&gt;&lt;br /&gt;$sudo apt-get install stepmania&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;3) Inicialmente nuestro juego viene sin canciones asi que nos bajaremos unas cuantas del repositorio para tener por donde empezar a jugar. De todos modos podreis encontrar por internet grandes colecciones y bajaroslas.&lt;br /&gt;&lt;br /&gt;$sudo apt-get install stepmania-songs*&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Y fin ya teneis esta maravilloso juego instalado que lo encontrareis en la ruta&lt;br /&gt;&lt;br /&gt;Aplicaciones &gt; juegos &gt; Stepmania&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;A bailarr !!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-1583748096323486936?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/1583748096323486936/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=1583748096323486936&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/1583748096323486936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/1583748096323486936'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/stepmania-en-ubuntu.html' title='Stepmania en Ubuntu'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-4072479332869461616</id><published>2008-05-18T03:40:00.001-07:00</published><updated>2008-05-18T04:30:32.885-07:00</updated><title type='text'>Peticion POST con Google Web Toolkit y PHP</title><content type='html'>Bien actualmente estoy diseñando un interfaz web usando Google Web Toolkit un kit que aunque aun esta muy verde y no existe demasiada documentación pues siempre cuesta un poco dar cada paso.&lt;br /&gt;&lt;br /&gt;Ahora eso si os recomiendo este toolkit es increible, de una facilidad pasmosa y lo mas aluciante programas en JAVA, es decir olvidate de lenguajes de script. Es un proyecto que esta evolucionando rapidamente y seguro que dentro de poco será una nueva alternativa muy válida para el desarrollo de interfaces webs.&lt;br /&gt;&lt;br /&gt;En este ejemplo muy simple os explico como se haria una petición POST con google web toolkit que se ejecuta en el cliente, y capturar esa petición con codigo PHP que se ejecute en el servidor.&lt;br /&gt;&lt;br /&gt;Espero que os sea muy util  ;)&lt;br /&gt;&lt;br /&gt;Bien pues con google web toolkit lo primero es crearnos un proyecto para ello actualmente se tiene que hacer desde consola y las instrucciones de como hacerlo podeis encontrarlas en la dirección:&lt;br /&gt;http://code.google.com/webtoolkit/gettingstarted.html&lt;br /&gt;&lt;br /&gt;Una vez creado el proyecto como sabreis google web toolkit usa una clase que implementa el interfaz EntryPoint y que será nuestra clase principal como el MAIN en otros lenguajes.&lt;br /&gt;&lt;br /&gt;Bien inicialmente esta clase ya viene implementa con un ejemplo de un boton que dice click me! cuando lo pulsas.&lt;br /&gt;&lt;br /&gt;Bien el primer paso será sustituir el contenido de esta clase por este otro:&lt;br /&gt;public class MakePost implements EntryPoint {&lt;br /&gt;&lt;br /&gt;    public static void doPost(String url, String postData){&lt;br /&gt;        RequestBuilder builder = new RequestBuilder(RequestBuilder.POST,url);&lt;br /&gt;        builder.setHeader("Content-type","application/x-www-form-urlencoded");&lt;br /&gt;      &lt;br /&gt;        try{&lt;br /&gt;            Request response = builder.sendRequest(postData, new RequestCallback(){&lt;br /&gt;&lt;br /&gt;                public void onError(Request request, Throwable exception) {&lt;br /&gt;                    Window.alert("onError");&lt;br /&gt;                  &lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                public void onResponseReceived(Request request, Response response) {&lt;br /&gt;                    Window.alert("onResponseReceived request:"+response.getText());&lt;br /&gt;                  &lt;br /&gt;                }                          &lt;br /&gt;            });&lt;br /&gt;        } catch (RequestException e){&lt;br /&gt;            Window.alert("Failed to send the request:"+e.getMessage());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;    public void onModuleLoad() {&lt;br /&gt;        doPost("/post.php", "nombre=HelloWorld");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;Como podeis observar en el codigo creamos un metodo doPost que nos permitirá hacer peticiones POST a una web. Para nuestro ejemplo la petición será realizada hacia post.php fichero php que se ejecutará en el servidor para capturar la petición y que como indica la barra "/" delante del nombre la colocaremos en el DocumentRoot de nuestro Apache.&lt;br /&gt;&lt;br /&gt;Nota importante observar que para que la petición se realice correctamente en el objeto Request se actualiza la cabecera de la petición con este valor:&lt;br /&gt; builder.setHeader("Content-type","application/x-www-form-urlencoded");&lt;br /&gt;&lt;br /&gt;Si no hacemos esto no funcionará!!&lt;br /&gt;&lt;br /&gt;Ahora en el fichero de configuración de nuestro proyecto google web toolkit que es un fichero xml  llamado:&lt;br /&gt;MiAplicacion.gwt.xml&lt;br /&gt;&lt;br /&gt;Tendremos que añadir una linea que nos permita usar las clases para la petición HTTP:&lt;br /&gt;&amp;lt;module&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;!-- Inherit the core Web Toolkit stuff.                  --&amp;gt;&lt;br /&gt;    &amp;lt;inherits name='com.google.gwt.user.User'/&amp;gt;&lt;br /&gt;    &amp;lt;inherits name='com.google.gwt.http.HTTP'/&amp;gt;&lt;br /&gt;  &lt;br /&gt;    &amp;lt;!-- Specify the app entry point class.                   --&amp;gt;&lt;br /&gt;    &amp;lt;entry-point class='com.cica.client.MakePost'/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/module&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El siguiente paso será compilar nuestra clase, con el script shell que nos genera gwt automaticamente y que se encuentra en el directorio raiz de nuestro proyecto:&lt;br /&gt;MiAplicacion-compile&lt;br /&gt;&lt;br /&gt;Al ejecutarlo nos generará una carpeta WWW con todo el contenido repleto de ficheros html y javascript que son el resultado de traducir nuestro codigo java.&lt;br /&gt;&lt;br /&gt;Esta carpeta la copiaremos en el documentRoot de nuestro Apache tambien&lt;br /&gt;&lt;br /&gt;Por ultimo lo unico que nos queda es el fichero que captura la petición llamado post.php que como he dicho anteriormente se encuentra en el DocumentRoot de apache y tendrá el siguiente contenido:&lt;br /&gt; &amp;lt;html&amp;gt;&lt;br /&gt;        &amp;lt;head&amp;gt;&lt;br /&gt;                &amp;lt;title&amp;gt;Recibir Post&amp;lt;/title&amp;gt;&lt;br /&gt;        &amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;        &amp;lt;h1&amp;gt;Recibir Post&amp;lt;/h1&amp;gt;&lt;br /&gt;        &amp;lt;?php&lt;br /&gt;                echo "Recibo: ".$_POST['nombre'].";&lt;br /&gt;        ?&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;Y bueno eso es todo ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-4072479332869461616?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/4072479332869461616/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=4072479332869461616&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/4072479332869461616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/4072479332869461616'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/peticion-post-con-google-web-toolkit-y.html' title='Peticion POST con Google Web Toolkit y PHP'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-3860945654298250210</id><published>2008-05-18T03:39:00.001-07:00</published><updated>2008-05-18T03:39:57.436-07:00</updated><title type='text'>Javascript Request POST and PHP</title><content type='html'>&lt;p&gt;Como ya sabeis desde html la unica forma de hacer una peticion POST es a través de un formulario. Pero y si quereis mandar una información sin tener que usar un formulario.&lt;/p&gt;&lt;p&gt; Bien en este ejemplo os cuento como hacer una peticion desde javascript (cliente) y capturarla desde un php (servidor). Estos tutoriales son los más utiles porque puedes entender perfectamente su funcionamiento debido a su simplicidad, y ayudarte a iniciarte. &lt;/p&gt;  &lt;p&gt;Bien pues lo primero que vamos ha hacer es generarnos un fichero javascript que constituirá como nuestra pequeña libreria para hacer Request.&lt;/p&gt;&lt;p&gt;Crear un fichero llamado &lt;strong&gt;xmlhttp.js&lt;/strong&gt; con el siguiente contenido:&lt;/p&gt;&lt;pre&gt;function getXMLHttp() {&lt;br /&gt; var XMLHttp = null;&lt;br /&gt; if (window.XMLHttpRequest) {&lt;br /&gt;   try {&lt;br /&gt;     XMLHttp = new XMLHttpRequest();&lt;br /&gt;   } catch (e) { }&lt;br /&gt; } else if (window.ActiveXObject) {&lt;br /&gt;   try {&lt;br /&gt;     XMLHttp = new ActiveXObject("Msxml2.XMLHTTP");&lt;br /&gt;   } catch (e) {&lt;/pre&gt;&lt;pre&gt;      try {&lt;br /&gt;       XMLHttp = new ActiveXObject(&lt;br /&gt;         "Microsoft.XMLHTTP");&lt;br /&gt;     } catch (e) { }&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt; return XMLHttp;&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt; Ahora crearemos el fichero html que contendrá el código javascript que se ejecuta en cliente para hacer la petición. Este fichero lo llamaremos &lt;strong&gt;request.html &lt;/strong&gt;y contendrá:&lt;/p&gt;&lt;pre&gt;&lt;script language="JavaScript"&lt;br /&gt; type="text/javascript" src="xmlhttp.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="JavaScript"&lt;br /&gt; type="text/javascript"&gt;&lt;br /&gt;var XMLHttp = getXMLHttp();&lt;br /&gt;XMLHttp.open("POST", "post.php");&lt;br /&gt;XMLHttp.onreadystatechange = handlerFunction;&lt;br /&gt;XMLHttp.setRequestHeader("Content-type",&lt;br /&gt; "application/x-www-form-urlencoded");&lt;br /&gt;XMLHttp.send("word1=JavaScript&amp;amp;word2=Phrasebook");&lt;br /&gt;&lt;br /&gt;function handlerFunction() {&lt;br /&gt; if (XMLHttp.readyState == 4) {&lt;br /&gt;   window.alert("Returned data: " +&lt;br /&gt;                XMLHttp.responseText);&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;pre&gt; &lt;/script&gt;&lt;/pre&gt;&lt;p&gt;Por ultimo crearemos el fichero &lt;strong&gt;post.php&lt;/strong&gt; que se ejecuta en el servidor y que captura la petición post :&lt;/p&gt;&lt;pre&gt;&lt;?php&lt;br /&gt; if (isset($_POST['word1']) &amp;amp;&amp;amp;&lt;br /&gt;     isset($_POST['word2'])) {&lt;br /&gt;   echo $_POST['word1'] . ' ' . $_POST['word2'];&lt;br /&gt; } else {&lt;br /&gt;   echo 'No data sent.';&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt; }?&gt;&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;p&gt;Y eso es todo ;)&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-3860945654298250210?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/3860945654298250210/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=3860945654298250210&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3860945654298250210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3860945654298250210'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/javascript-request-post-and-php.html' title='Javascript Request POST and PHP'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-4137922901981943604</id><published>2008-05-18T03:38:00.002-07:00</published><updated>2009-03-25T06:44:21.354-07:00</updated><title type='text'>Peticion HTTP/HTTPS GET/POST Java</title><content type='html'>&lt;p&gt;Esto es una curiosidad muy util, como hacer una petición HTTP por ejemplo para usar los nuevos servicios de Yahoo. Pues aqui teneis el fragmento de código que te resolverá el problema es muy facilito y usando ese maravilloso lenguaje llamado java.&lt;/p&gt;&lt;p&gt; Seguro que muchos de vosotros no habiais hecho esto con java en la vida, pues es increible pero si esta en el paquete java.net... &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;  &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;private static String conexionGET(String request, String protocolo) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;String responce = "";&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;BufferedReader rd = null;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;try {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;URL url = new URL(request);&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (protocolo.equals("HTTPS")) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;rd = new BufferedReader(new InputStreamReader(conn1.getInputStream()));&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} else {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;URLConnection conn2 = url.openConnection();&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;rd = new BufferedReader(new InputStreamReader(conn2.getInputStream()));&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;String line;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;while ((line = rd.readLine()) != null) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;//Process line...&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;responce += line;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} catch (Exception e) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;System.out.println("Web request failed");&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;// Web request failed&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} finally {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (rd != null) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;try {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;rd.close();&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} catch (IOException ex) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;System.out.println("Problema al cerrar el objeto lector");&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return responce;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;private static String conexionPOST(String request, String datos, String protocolo) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;String responce = "";&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;OutputStreamWriter wr = null;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;BufferedReader rd = null;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;try {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;URL url = new URL(request);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (protocolo.equals("HTTPS")) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;//Escribir los parametros en el mensaje&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;conn.setDoOutput(true);&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;wr = new OutputStreamWriter(conn.getOutputStream());&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;wr.write(datos);&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;wr.flush();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;//Recibir respuesta&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} else {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;URLConnection conn = url.openConnection();&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;//Escribir los parametros en el mensaje&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;conn.setDoOutput(true);&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;wr = new OutputStreamWriter(conn.getOutputStream());&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;wr.write(datos);&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;wr.flush();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;//Recibir respuesta&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;String line;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;while ((line = rd.readLine()) != null) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;//Process line...&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;responce += line;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} catch (Exception e) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} finally {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;try {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (wr != null) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;wr.close();&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (rd != null) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;rd.close();&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} catch (IOException ex) {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;System.out.println("Exception al cerrar el lector o el escritor");&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return responce;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-4137922901981943604?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/4137922901981943604/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=4137922901981943604&amp;isPopup=true' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/4137922901981943604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/4137922901981943604'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/peticion-http-java.html' title='Peticion HTTP/HTTPS GET/POST Java'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-3921276466617290373</id><published>2008-05-18T03:38:00.001-07:00</published><updated>2008-05-18T03:38:54.805-07:00</updated><title type='text'>AMule daemon (emule)</title><content type='html'>&lt;p&gt;Para todos aquellos que esten intentado dar el paso de cambiarse de un windows a tener un linux instalado, o para aquellos que tenga un ordenador antiguo con pocas prestaciones de hardware y quieran aprovecharlo, creo que este artículo os viene como anillo al dedo.&lt;/p&gt;&lt;p&gt;El famoso emule de windows podemos instalarlo en linux con su versión aMule es practicamente igual por lo que no tendréis motivos para perderos. Es más yo tengo un ordenador antiguo que lo uso de servidor y un entorno windows consume muchisimos recursos por lo al instalarle un ubuntu pude comprobar lo bien que va este sistema en máquinas ya anticuadas y así poder sacarle provecho. Reto: Intenta instalarle a un Pentium 1 a 133 Mhz un Windows Server 2003 o un XP a ver que tal va  ;). &lt;/p&gt;  &lt;p&gt;Instalar y configurar amule-daemon para poder utilizar amuleweb&lt;/p&gt;&lt;p&gt;    $sudo apt-get install amule-daemon&lt;/p&gt;&lt;p&gt;    $amuled&lt;/p&gt;&lt;p&gt;Calcular la contraseña cifrada&lt;/p&gt;&lt;p&gt;    $echo -n [CONTRASEÑA] | md5sum | cut -d ' ' -f 1&lt;/p&gt;&lt;p&gt; Edita el fichero amule.conf&lt;/p&gt;&lt;p&gt;    $gedit .aMule/amule.conf&lt;/p&gt;&lt;p&gt;    Actualizar las siguientes lineas con estos valores:&lt;/p&gt;&lt;p&gt;    AccpetExternalCOnnections=1&lt;/p&gt;&lt;p&gt;    ECPassword=CONTRASEÑA CIFRADA ANTERIORMENTE&lt;/p&gt;&lt;p&gt;    Session [WebServer]&lt;/p&gt;&lt;p&gt;    Enable=1&lt;/p&gt;&lt;p&gt;    Password= CONTRASEÑA CIFRADA ANTERIORMENTE&lt;/p&gt;&lt;p&gt;Para que todo funcione debes tener los siguientes puertos abiertos&lt;/p&gt;&lt;p&gt;4662 TCP, 4665 UDP, 4672 UDP y 4711 TCP&lt;/p&gt;&lt;p&gt;Por ultimo para arrancar el servidor de amule:&lt;/p&gt;&lt;p&gt;$amuled -f (la f es para que se ejecute de fondo)&lt;/p&gt;&lt;p&gt;Nota para saber que se esta ejecutando -&gt; $ps -ef | grep amule&lt;/p&gt;&lt;p&gt;Para acceder desde el navegador http://localhost:4711 e introducir la [CONTRASEÑA] en el formulario&lt;/p&gt;&lt;p&gt;NOTA. Por seguridad es aconsejable que cambies estos puertos por otros no tan conocidos. &lt;/p&gt;&lt;p&gt;También recomendar que en vez de usar amuleweb, useis amulegui es un pakete que te lo puedes instalar con synaptic además lo puedes encontrar para windows y para Unix. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-3921276466617290373?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/3921276466617290373/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=3921276466617290373&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3921276466617290373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/3921276466617290373'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/amule-daemon-emule.html' title='AMule daemon (emule)'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-4842837141112100140</id><published>2008-05-18T03:36:00.002-07:00</published><updated>2010-02-15T23:36:37.221-08:00</updated><title type='text'>Virtual Host en Apache2 (Ubuntu)</title><content type='html'>&lt;p&gt;Bien pues ya sabeis que hay mil y una versiones de apache y sus fichero de configuración. En red hat o CentOS se llaman httpd y el fichero de configuración httpd.conf y ahi se mete todo a pelo. En ubuntu/debian se llama apache2 y dentro de /etc/apache2 tenemos un conjunto de carpetas y ficheros para configurar el servidor esto lo hace más elegante que en los red hat, pero también es más entretenido de aprender.&lt;/p&gt;&lt;p&gt;Pues nada yo estaba muy acostumbrado a red hat pero cuando cogi un ubuntu dije ostias esto como es, así que aqui os dejo lo que teneis que hacer para crear un virtual host de apache en una ubuntu/debian. &lt;/p&gt;  &lt;div class="main"&gt;      &lt;p&gt;Lo que sigue es una breve nota técnica que me sirva (y a otros) como recordatorio para la próxima vez , dado que hoy he perdido un rato con la configuración de un host virtual en Ubuntu (en Fedora lo tenía todo ya hecho, y sólo era copiar y pegar :-)&lt;/p&gt; &lt;p&gt;En /etc/apache2 disponemos de varios subdirectorios, dos de ellos importantes para nuestra tarea. El primero sites-available y el segundo sites-enabled.&lt;/p&gt; &lt;p&gt;Los ficheros de configuración de los hostings virtuales se configuran en sites-available. El segundo subdirectorio sólo contiene enlaces a aquellos virtulhost que queremos activar.&lt;/p&gt; &lt;p&gt;Queremos crear un virtualhost de nombre "jorges" Es decir, cuando ponga en mi navegador http://jorges me debe de llevar a la página principal de ese host. Si pongo http://localhost me llevará al virtualhost por defecto (distinto del de jorges).&lt;/p&gt; &lt;p&gt;Lo primero, creo una nueva entrada en /etc/hosts (mantengo lo que había y añado lo siguiente):&lt;/p&gt; &lt;p&gt;127.0.0.1 jorges&lt;/p&gt; &lt;p&gt;Copio los archivos del nuevo site en /var/www/jorges.&lt;/p&gt; &lt;p&gt;Comienza el procedimiento de configuración del nuevo virtualhost en Apache2:&lt;/p&gt; &lt;p&gt;$ cd /etc/apache2/sites-available&lt;/p&gt; &lt;p&gt;Edito las dos primeras líneas del fichero default  para que queden así:&lt;/p&gt; &lt;p&gt;NameVirtualHost *:80&lt;br /&gt;&lt;virtualhost&gt;&lt;br /&gt;$ cp default jorges&lt;/p&gt; &lt;p&gt;Edito hackit para que las primeras líneas queden así:&lt;/p&gt;  &lt;p&gt;&lt;virtualhost&gt;&lt;br /&gt;ServerAdmin webmaster@jorges&lt;/p&gt;&lt;p&gt;ServerName jorges&lt;/p&gt; &lt;p&gt;DocumentRoot /var/www/jorges&lt;/p&gt;&lt;p&gt; &lt;directory&gt;&lt;br /&gt;Options FollowSymLinks&lt;br /&gt;AllowOverride None&lt;br /&gt;&lt;/directory&gt;&lt;br /&gt;&lt;directory&gt;&lt;br /&gt;$ cd /etc/apache2&lt;/p&gt; &lt;p&gt;El siguiente comando, a2ensite (available2enablesite) crea un enlace en sites-enable al site que le indiquemos (es decir, activa el virtualhost que acabamos de crear)&lt;/p&gt; &lt;p&gt;# a2ensite jorges&lt;/p&gt; &lt;p&gt;Comprobamos:&lt;/p&gt; &lt;p&gt;$ ls -al sites-enabled/&lt;/p&gt; &lt;p&gt;Recargamos apache2:&lt;/p&gt; &lt;p&gt;#/etc/init.d/apache2 force-reload&lt;br /&gt;Listo!&lt;/p&gt;                &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Fuente: &lt;a href="http://diariolinux.com/2007/05/29/hosts-virtuales-en-apache-2-ubuntu/"&gt; diariolinux &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-4842837141112100140?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/4842837141112100140/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=4842837141112100140&amp;isPopup=true' title='12 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/4842837141112100140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/4842837141112100140'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/virtual-host-en-apache2-ubuntu.html' title='Virtual Host en Apache2 (Ubuntu)'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-2915255712878870528</id><published>2008-05-18T03:36:00.001-07:00</published><updated>2008-05-18T03:36:40.990-07:00</updated><title type='text'>Error Mysql 1016 Can't open file: 'jos_session.MYI'</title><content type='html'>&lt;p&gt;Hoy en el trabajo saltaron las alarmas cuando una de nuestras maquinas tras algunas pruebas sobre ella, de repente dejo de funcionar el portal con joomla que corria sobre ella con este error tan estraño y sin que nadie hubiera tocado.&lt;/p&gt;&lt;p&gt;Todo quedo en un susto y que existe una forma muy facil de corregirlo. El error era algo similar a esto:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;BD function failed with error number 1016&lt;/p&gt;&lt;p&gt;Can't open file: 'jos_session.MPYI' (errno:145) SQL=SELECT session_id FROM jos_session&lt;/p&gt;&lt;p&gt;WHERE session_id='dadfa23rdfa3t4fgfd2323'&lt;/p&gt;&lt;p&gt;SQL=&lt;/p&gt;&lt;p&gt;SELECT session_id&lt;/p&gt;&lt;p&gt;FROM jos_session&lt;/p&gt;&lt;p&gt;WHERE session_id = '1234dfjskfa2dffa'&lt;/p&gt;&lt;p&gt;Si reconoces este problema aqui tienes la solucción... &lt;/p&gt;&lt;p&gt; &lt;/p&gt;  &lt;p&gt;Necesitas reparar la tabla "jos_session" de tu base de datos MYSQL porque ha sido corrompida.&lt;/p&gt;&lt;p&gt;Para ello desde linea de comandos&lt;/p&gt;&lt;p&gt;//Accedes a mysql  &lt;/p&gt;&lt;p&gt;$mysql -u [usuario] -p &lt;/p&gt;&lt;p&gt;//Introduces en la base de datos de joomla&lt;/p&gt;&lt;p&gt;$show databases;&lt;/p&gt;&lt;p&gt;$use [bd_joomla];&lt;/p&gt;&lt;p&gt;//Reparas las tabla&lt;/p&gt;&lt;p&gt;$repair table jos_session&lt;/p&gt;&lt;p&gt;Despues de esto todo tiene que ir como la ceda. También puedes realizar esta misma operación desde tu phpmyadmin, desde la pestaña SQL introduces "REPAIR TABLE 'jos_session'"&lt;/p&gt;&lt;p&gt; Espero que os solucione el problema como a mi ;) &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-2915255712878870528?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/2915255712878870528/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=2915255712878870528&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/2915255712878870528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/2915255712878870528'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/error-mysql-1016-cant-open-file.html' title='Error Mysql 1016 Can&apos;t open file: &apos;jos_session.MYI&apos;'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-7227125870329266964</id><published>2008-05-18T03:34:00.000-07:00</published><updated>2008-05-18T03:35:59.933-07:00</updated><title type='text'>Seguridad en Joomla</title><content type='html'>&lt;p&gt;Bueno muchos de vosotros que utiliceis Joomla, os sonará eso de que para acceder al backend de joomla es tan facil como http://www.midominio.com/administrator.&lt;/p&gt;&lt;p&gt;Bien pues eso lo sabe cualquiera que conozca joomla y lo haya instalado alguna vez. Es más &lt;/p&gt;&lt;p&gt;es tan fácil como irte a una página web y si en el pie de la página pone "by power joomla" o algo así o si el favicon no lo han cambiado y sale el logitipo joomla. Si es así ya sabes que concatenandole a la dirección /administrator te sale el control de acceso de joomla y si tienes usuarios con niveles pobres de password o aparece un hueco de seguridad de joomla, pues estas jodido.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Solución: y si restringimos el acceso a /administrator de forma que no todo el mundo pueda acceder al formulario... &lt;/p&gt;&lt;p&gt; &lt;/p&gt;  &lt;p&gt;Pues para nuestro fin utilizaremos la potencia que nos ofrecen los fichero .htaccess  en nuestro apache.&lt;/p&gt;&lt;p&gt;1) Nos colocamos en el directorio raiz de nuestro servidor apache&lt;/p&gt;&lt;p&gt;$ cd /var/www (suele estar en esa dirección en los linux)&lt;/p&gt;&lt;p&gt;2) Accedemos a la carpeta de nuestro dominio joomla y luego a la carpeta de administration&lt;/p&gt;&lt;p&gt;$ cd joomla/administrator &lt;/p&gt;&lt;p&gt;3) Creamos el fichero llamado .htaccess, es importante el "." ya que hace que el archivo sea oculto y apache no lo publique.&lt;/p&gt;&lt;p&gt;$sudo gedit .htaccess&lt;/p&gt;&lt;p&gt; 4) y le copiamos el siguiente texto&lt;/p&gt;&lt;p&gt;#Comentario&lt;/p&gt;&lt;p&gt;deny from all&lt;/p&gt;&lt;p&gt;allow from 127.0.0.1&lt;/p&gt;&lt;p&gt;Nota. Con esto conseguimos que sólo desde la máquina local donde esta instalado el servidor podremos acceder al backend de joomla&lt;/p&gt;&lt;p&gt;Así podemos poner añadir una lista de sentencias "allow from ip" dando permiso a varias &lt;/p&gt;&lt;p&gt;máqinas más:&lt;/p&gt;&lt;p&gt;deny from all&lt;/p&gt;&lt;p&gt;allow from 127.0.0.1&lt;/p&gt;&lt;p&gt;allow from www.google.es&lt;/p&gt;&lt;p&gt;etc ...&lt;/p&gt;&lt;p&gt;5) Por último recordar que en el apache deberéis tener configurado el virtual host para que permita sobreescritura de la configuración por los ficheros .htaccess que se consigue tocando en el fichero de configuración de apache (httpd.conf):&lt;/p&gt;&lt;address&gt;... &lt;/address&gt;&lt;address&gt;&lt;virtualhost&gt;&lt;/address&gt;&lt;address&gt;    ServerName www.midominiojoomla.com &lt;/address&gt;&lt;address&gt;    ...&lt;/address&gt;&lt;address&gt;    &lt;directory&gt;&lt;/address&gt;&lt;address&gt;        AllowOverride All&lt;/address&gt;&lt;address&gt;        Options None&lt;/address&gt;&lt;address&gt;    &lt;/directory&gt;&lt;/address&gt;&lt;address&gt;...&lt;/address&gt;&lt;address&gt;&lt;/virtualhost&gt; &lt;/address&gt;&lt;p&gt; Nota. Si os daís cuenta lo mismo que estamos haciendo con el .htaccess lo podríamos poner directamente en el fichero de configuración de Apache, pero de esta forma nos permite restringir cualquier directorio de la misma forma con sólo copiar el fichero en otros directorios.&lt;/p&gt;&lt;p&gt;Bueno espero que con esto reduzcais los posibles ataques a vuestra web joomla.&lt;/p&gt;&lt;p&gt;;)&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-7227125870329266964?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/7227125870329266964/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=7227125870329266964&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7227125870329266964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7227125870329266964'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/seguridad-en-joomla.html' title='Seguridad en Joomla'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-2328187987085539251</id><published>2008-05-18T03:33:00.002-07:00</published><updated>2008-05-18T03:34:26.057-07:00</updated><title type='text'>Google Desktop en Linux (Ubuntu)</title><content type='html'>Bueno supongo que ya conoceréis google desktop, es una herramienta de google totalmente gratuita. Ya estaréis hartos de utilizar el buscador del windows que se te da tiempo a tomarte un cafe antes de que encuentre un fichero, pues los de google utilizan toda la potencia de su algoritmo de indexación pero para organizar los ficheros de tu ordenador. Ademas la herramienta se encuentra totalmente integrada con gmail, buscador de google etc ... Una maravilla. Pues bien ya podemos disponer de esta herramienta en nuestro linux también, aunque ya algunos utilizarais como beagle que también es un buscador buenísimo.&lt;p&gt;Yo siempre pienso que google nos controlará a todos ya que conoce todas las webs que buscamos en internet y con herramientas como google desktop conocerá todo lo que tenemos en nuestro disco duro, pero weno esto es sólo una opinión, ahora si si no poseeis datos &lt;strong&gt;Top Secret &lt;/strong&gt;la herramienta es una chulería. &lt;/p&gt;&lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Instalar google Desktop en ubuntu&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1. Autentificar el repositorio que vamos a usar (repositorio provisional)&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;$ wget -q -O - http://dl.google.com/linux/linux_signing_key.pub &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;$ sudo apt-key add - &lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;2. Añadimos el repositorio a nuestra lista&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;$ sudo gedit /etc/apt/sources.list&lt;/p&gt;&lt;p&gt;Y añadimos al final del fichero las siguientes líneas &lt;/p&gt;&lt;p&gt;# Google software repository&lt;br /&gt;deb http://dl.google.com/linux/deb/ stable non-free &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;3. Finalmente instalamos google desktop&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;$ sudo aptitude update&lt;br /&gt;$ sudo aptitude install google-desktop-linux&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;4. La próxima vez que iniciemos nuestra sesión google desktop se pondrá en marcha, y aparecerá un icono nuevo en nuestra barra de herramientas. En ese momento google desktop comienza a indexar ficheros de tu disco duro por lo que según la cantidad de fichero y la potencia de vuestro ordenador puede llevar varias horas el que se encuentre en disposición de funcionar de forma eficiente. Ahora una vez indexado la mayor parte de tus fichero aquello es rapidísimo. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-2328187987085539251?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/2328187987085539251/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=2328187987085539251&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/2328187987085539251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/2328187987085539251'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/google-desktop-en-linux-ubuntu.html' title='Google Desktop en Linux (Ubuntu)'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-8291739878010395620</id><published>2008-05-18T03:33:00.001-07:00</published><updated>2008-05-18T03:33:52.882-07:00</updated><title type='text'>URL amigables en Joomla</title><content type='html'>&lt;p&gt;Bueno para el que no sepa lo que son las Url amigables se lo cuento rápidamente. Si habeis utilizado el gestor de contenidos Joomla alguna vez, habréis podido observar que cuando pichas en un enlace de tu dominio la url será algo como esto: &lt;/p&gt;&lt;p&gt; http://www.dominio.com/index.php?option=com_zoom&amp;amp;Itemid=42 &lt;/p&gt;&lt;p&gt;Bien pues esta dirección es a mi gusto algo dificil de recordar, esto sería una Url poco amigable, además si tienes un portal web y quieres darlo a conocer y que aparezca lo más alto posible en el buscador de google, tienes que vigilar este tema ya que el motor de google penaliza url poco amigables como la del ejemplo anterior.&lt;/p&gt;&lt;p&gt;Bíen pues en este artículo os muestro como configurar vuestro Joomla y Apache para conseguir dicho fin. &lt;/p&gt;&lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;0º&lt;/strong&gt; En la configuración de tu apache tendrás un virtual host asignado para tu dominio, en el debes introducir la opción de AllowOverride All que permite que el .htaccess modifique la configuración de apache.&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;virtualhost&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;     ServerName www.midominio.com&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;     DocumentRoot "/usr/var/www/midominio"&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;    &lt;strong&gt;&lt;directory&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;        AllowOverride All&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;        Options None&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;     &lt;/directory&gt; &lt;/strong&gt; &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;/Virtual Host&gt; &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1º&lt;/strong&gt; En el directorio donde alojas Joomla encontrarás un fichero llamado &lt;strong&gt;htaccess.txt&lt;/strong&gt;  para usarlo deberás renombrarlo por &lt;strong&gt;.htaccess&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2º&lt;/strong&gt; En el Backend de Joomla o panel de administración vete a&lt;strong&gt;  Sitio &gt; Configuración Global &gt; SEO&lt;/strong&gt;. y activa las opciones:&lt;br /&gt;&lt;br /&gt;    URLs amigables para buscadores: Presiona SÍ&lt;br /&gt;    Títulos dinámicos en las páginas: Presiona SÍ&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3º&lt;/strong&gt; Guarda tu configuración.&lt;/p&gt;&lt;p&gt;Con esto acabas de activar el  componente que trae  Joomla (versión 1.0.12) para implementar las Url Amigables, pero para mi gusto no es demasiado bueno así que instalaremos un componente de terceros. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;4º&lt;/strong&gt; Bájate el componente &lt;a href="http://www.joomlaspanish.org/component/option,com_remository/Itemid,28/func,fileinfo/id,15/" target="_blank"&gt;404 SEF RC1 en español&lt;/a&gt; desde Joomlaspanish.org&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;5º &lt;/strong&gt;Instala el componente ya sabes como es Backend&gt;Instaladores&gt; Instalar componente&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6º&lt;/strong&gt; Ahora debes abrir tu archivo .htaccess y descomentar las siguientes líneas:&lt;/p&gt;&lt;pre&gt;&lt;em&gt;########## Begin - 3rd Party SEF Section&lt;br /&gt;############# Use this section if you are using a 3rd party (Non Joomla! core) SEF extension - e.g. OpenSEF, 404_SEF, 404SEFx, SEF Advance, etc&lt;br /&gt;#&lt;br /&gt;&lt;strong&gt;RewriteCond %{REQUEST_URI} ^(/component/option,com) [NC,OR] ##optional - see notes##&lt;br /&gt;RewriteCond %{REQUEST_URI} (/|\.htm|\.php|\.html|/[^.]*)$ [NC]&lt;br /&gt;RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;RewriteRule (.*) index.php&lt;/strong&gt;&lt;br /&gt;#&lt;br /&gt;########## End - 3rd Party SEF Section &lt;/em&gt;&lt;/pre&gt;&lt;p&gt; Estas líneas son referentes a los SEF implementados por terceras partes, y si se te olvida descomentarlas el componente 404SEF no funcionará.&lt;/p&gt;&lt;p&gt;Listo. Ahora en vez de tener direcciones como:&lt;br /&gt;&lt;a href="http://www.tusitio.com/index.php?option=com_weblinks&amp;amp;catid=2&amp;amp;Itemid=75" target="_blank"&gt;http://www.dominio.com/index.php?opt...id=2&amp;amp;Itemid=75&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Serán verá así:&lt;br /&gt;&lt;a href="http://www.tusitio.com/el-titulo-de-tu-pagina.html" target="_blank"&gt;http://www.dominio.com/nombre_relevante.html&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Este componente tiene muchas opciones y entre ellas te permite editar el nombre asignado a cada url real, todo ello lo encontrareis en el panel del administrador o backend. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Lista de problemas&lt;/strong&gt; &lt;strong&gt;encontrados&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1) En las debian/ubuntu por defecto el modulo de Rewrite no viene instalado por defecto por lo que tendras que darlo de alta con el comando:&lt;/p&gt;&lt;p&gt;&gt; a2enmod rewrite&lt;/p&gt;&gt; /etc/init.d/apache2 restart&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-8291739878010395620?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/8291739878010395620/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=8291739878010395620&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8291739878010395620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8291739878010395620'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/url-amigables-en-joomla.html' title='URL amigables en Joomla'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-633359193493606896</id><published>2008-05-18T03:32:00.000-07:00</published><updated>2008-05-18T03:33:18.864-07:00</updated><title type='text'>Convertir Joomla a UTF-8</title><content type='html'>&lt;p&gt;Bueno en mi trabajo hemos utilizado Joomla (Gestor de contenidos) para desarrollar alguno de los portales que ofrecemos (tales como www.cica.es o supercomputacion.cica.es), una vez ya con las manos en la masa, nos encontramos con el problema de que la versión española de joomla (descargada de http://www.joomlaspanish.org/) se encuentra con la codificación ISO-8859-1 es decir latin 1.&lt;/p&gt;&lt;p&gt;Existen unos follones con las codificaciónes increibles, porque el ISO-8859-1 trae los caracteres especiales solo del castellano, luego existe otro para los caracteres griegos o los caracteres árabes, os podeis imaginar menudo follón.&lt;/p&gt;&lt;p&gt;Bueno pues para resolver el problema se ha inventado el UTF-8 que contiene todos los caracteres internacionales de modo que si utilizas esta codificación todos los navegadores ya sean arábes o griegos poseen este estandar y podrán ver los textos tal y como ha sido escritos y no con caracteres raros. &lt;/p&gt;&lt;p&gt;Bien pues en este artículo elaborado por dos compañeros de trabajo se explica como convertir todo el proyecto tanto frontend como backend de joomla a la codificación UTF-8. &lt;/p&gt;&lt;p&gt; &lt;/p&gt;                  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;    &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;span style="font-size: 16pt;font-size:130%;" &gt;&lt;strong&gt;GUÍA PARA CONVERTIR UN SITIO JOOMLA&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt; &lt;span style="font-size: 16pt;font-size:130%;" &gt;&lt;strong&gt;DESDE CODIFICACIÓN ISO-8859-1x A UTF-8&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Introducción:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt; &lt;/strong&gt;&lt;span&gt;Joomla es una potente herramienta capaz de gestionar un sito web de forma fácil a la vez que eficiente. Sin embargo, esta útil herramienta nos llega a los españoles con un problema que tiene mucho que ver con su política de desarrollo. La versión española de Joomla se entrega por defecto con una codificación ISO-8859-1, mientras que todo el mundo está migrando a la nueva codificación UTF-8. Este conflicto de codificaciones no es nuevo en el mundo de internet, y provocará que todos los símbolos no internacionales (tildes, eñes y similares) se muestren como carácteres desconocidos si nuestro navegador está configurado para mostrar las páginas bajo UTF-8.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Surge, por tanto, la necesidad de poder cambiar la codificación de todo el sitio web gestionado por Joomla a la internacional UTF-8, sin que por ello tengamos que perder mucho de nuestro valioso tiempo examinando archivos y modificándolos manualmente. Desgraciadamente, hay poca información al respecto sobre cómo se podría realizar esta migración, y mucho menos sobre cómo se podría hacer automáticamente.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Este documento pretende ser una guía con la que mostrar el camino a seguir para migrar un sitio Joomla ISO-8859-1 a UTF-8 de forma automática y bajo Linux, indicando todo el proceso paso a paso. &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Visión general del proceso:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Estos van a ser, expresados de forma esquemática, los &lt;/span&gt;                &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;    &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;pasos a seguir para realizar la migración del sitio web:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ol&gt;&lt;ol&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;    &lt;span style="font-size:130%;"&gt;Realizar una copia de seguridad del sitio.&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;    &lt;span style="font-size:130%;"&gt;Aplicar el script para convertir los archivos   iso-8859-1 a utf-8.&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;    &lt;span style="font-size:130%;"&gt;Instalar el paquete de idioma español utf-8   para Joomla.&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;    &lt;span style="font-size:130%;"&gt;Actualizar la base de datos de Joomla.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt; &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;                &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;    &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Realizar una copia de seguridad del sitio:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Ni que decir tiene que es una muy buena idea tener a mano una copia de seguridad del sitio que vayamos a migrar, por si acaso. Supongamos que nuestro sitio web se encuentra alojado en la carpeta /var/www/ejemplo de nuestro servidor. Para realizar la copia de seguridad y crear una carpeta llamado ejemploBAK, ejecutaremos las siguientes ordenes:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; cd /var/www&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; mv ejemplo ejemploBAK&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Aplicar el script para convertir los archivos iso-8859-1 a utf-8:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt; &lt;/strong&gt;&lt;span&gt;Ahora necesitamos copiar el script webiso2utf.sh a un sitio que sea accesible por nosotros, como por ejemplo el directorio en donde se encuentra alojado nuestro sitio de ejemplo. Supongamos que ya tenemos el script creado en nuestro directorio home. En este caso, tendríamos que hacer:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; cd /var/www&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; mv $HOME/webiso2utf.sh .&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Con el script en este directorio, sólo nos resta ejecutarlo sobre la carpeta de copia de seguridad, generando de esta forma nuestro sitio originial pero codificado como utf-8:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; ./webiso2utf.sh ejemploBAK ejemplo&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Esto debería tardar un poco (Dependiendo del tamaño total del sitio que estemos migrando) y, al acabar, aparecerá una carpeta ejemplo en la que todos los archivos sujetos a ser convertidos estarán en utf-8. El script no convierte a utf-8 todos los archivos porque existen algunos, como los jpg o los png, que guardan su valor tal cual en binario, por lo que no tiene ningún sentido que se modifiquen para adaptarlos a una u otra codificación.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Nótese que la carpeta ejemploBAK sigue estando intacta y aún posee todos los archivos originales, en codificación iso-8859-1 por si nos hiciera falta en el futuro.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;                 &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;    &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Instalar el paquete de idioma español utf-8 para Joomla:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Una vez que todos los demás archivos han sido convertidos a la codificación utf-8, tenemos que instalar en el propio Joomla el paquete español para utf-8. Este paso no se ha realizado previamente debido a que el paquete copia algunos archivos en codificación utf-8, con lo que al aplicarle el script estos archivos son recodificados y nos mostrarían carácteres extraños al representarlos nuestro navegador.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Para instalar el paquete en español utf-8, seguiremos los siguientes pasos:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Actualizar la base de datos de Joomla:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Por último, aún nos queda un paso para tener completamente nuestro sitio migrado. Joomla guarda la mayoría de su configuración en una base de datos, que se establece a la hora de la instalación. Esta base de datos es la encargada de mostrar las descripciones y opciones de la interfaz de cara al administrador del sitio, y estará por defecto codificada bajo iso-8859-1, por lo que tendremos que modificar su contenido para ajustarlo a utf-8.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Suponiendo que usamos mysql y que el nombre de la base de datos que guarda todas las tablas de configuración de Joomla es ejemplo, esto es lo que habría que hacerse:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ol&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;  &lt;span style="font-size:130%;"&gt;Volcamos el contenido del schema ejemplo a un archivo  ejemplo.sql:&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt; &lt;/p&gt; &lt;/li&gt;&lt;/ol&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; mysqldump -u [usuario] -p –opt ejemplo &gt; ejemplo.sql&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; (Nos pedirá nuestra contraseña de acceso a la base de datos)&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ol&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;  &lt;span style="font-size:130%;"&gt;Convertimos el archivo desde iso-8859-1 a utf-8:&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ol&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; iconv -f iso-8859-1 -t utf-8 ejemplo.sql &gt; ejemploutf.sql&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ol&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;  &lt;span style="font-size:130%;"&gt;Volcamos este archivo codificado como utf a la base de  datos:&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ol&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; mysql -u [usuario] -p &lt;&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Con esto, nuestra base de datos ya debería estar codificada en utf-8.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Sin embargo, cuando estuvimos trabajando con nuestro sitio de Joomla, los pasos previamente comentados no nos realizaron correctamente la codificación. Para convertir la base de datos a una codificación que mostrara correctamente los carácteres no internacionales en un navegador configurado para UTF-8, tuvimos que aplicar el siguiente script a ejemplo.sql en lugar de usar el comando iconv:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; sqlfix.sh ejemplo.sql ejemploutf.sql&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; El tercer paso es idéntico al utilizado previamente, y una vez volcado el contenido, la base de datos funcionaba correctamente.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Scripts utilizados:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; A continuación se incluyen los códigos de los dos scripts utilizados para realizar la migración del sitio. Estos han sido webiso2utf.sh y sqlfix.sh&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt; webiso2utf.sh&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#!/bin/bash&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Script que copia la estructura de archivos desde dir_origen hasta&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#dir_destino y convierte todos los archivos del origen de iso-&lt;/span&gt;                &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;    &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;8859-1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#a utf-8 en el destino.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Ejemplo de uso:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#iso2utf.sh dir_origen dir_destino&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Creado por: Jhonatan Garcia Gutierrez&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Primero creamos algunas variables que usaremos mas adelante&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;comando=$0&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;dir_or=$1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;dir_base=$2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#En principio, dir_des y nuevo tendran la cadena vacia. &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Conforme se vaya ejecutando el script, se iran llamando con otros valores&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;dir_des=$3&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;nuevo=$4&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#En lista guardamos la relacion de archivos existentes en el directorio actual&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;if [ ! -z $nuevo ] ; then&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;lista=$(ls -A $dir_or/$dir_des);&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;else&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;lista=$(ls -A $dir_or);&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;fi&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Creamos una matriz ext en donde guardaremos las extensiones de los archivos que convertiremos a utf-8&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Los archivos de tipo jpg o png, por ejemplo, no serán convertidos a utf-8 (No tendria sentido)&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;declare -a ext&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;ext=( asp cfg css en es euc-jp euc-kr fr freebsd htm html js js_ lib linux php php~ php-dist properties sh sql src txt TXT xml )&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;tam=${#ext[*]}&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Si el directorio destino en donde vamos a crear los archivos convertidos no existe, crearlo&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;if [ ! -e ${dir_base}/${dir_des} ] ; then&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;mkdir ${dir_base}/${dir_des};&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;fi&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Por cada archivo existente en el directorio origen actual hacer:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;for arch in $lista ; do&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Guardamos el nombre del archivo para usarlo mas adelante&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;nom_arch=${arch}&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Si no es la primera vez que se llama al script, sera porque estamos convirtiendo&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#tambien los archivos incluidos dentro de un subdirectorio.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#En este caso le agregamos la ruta de este subdirectorio al archivo actual.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;if [ ! -z $nuevo ] ; then&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;arch=${dir_des}/${arch};&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;fi&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Si el archivo es un directorio, habra que ejecutar esta script sobre el para convertir&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#tambien sus archivos en el directorio destino.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;if [ -d ${dir_or}/${arch} ] ; then&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;$comando ${dir_or} ${dir_base} ${arch} 1;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#En cambio, si es un archivo ordinario, tendremos que comprobar si lo convertimos o no&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;else&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Obtenemos el valor del archivo origen y destino para usarlos luego mas comodamente&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;archivo=${dir_or}/${arch}&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;archivo_des=${dir_base}/${arch}&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Obtenemos la extension del archivo&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;                 &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;    &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;extension=${nom_arch##*.}&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Recorremos la matriz de extensiones. Si la extension del archivo actual esta dentro de&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#la matriz, entonces tendremos que convertir el archivo.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#En otro caso, sera un archivo de tipo jpg o similar y nos limitaremos a copiarlo en el destino&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;let flag=1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;let indice=0&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;while [ $flag -eq 1 -a $indice -lt $tam ] ; do&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;if [ $extension = ${ext[$indice]} ] ; then&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Si encontramos la extension en la matriz, ponemos la bandera a 0&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;let flag=0&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;fi&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;let indice=($indice + 1) &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;done&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Si la extension del archivo era una de las que vamos a convertir a utf-8:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;if [ $flag -eq 0 ] ; then&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Creamos dos archivos temporales para guardar datos intermedios&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;aux1=$0$$1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;aux2=$0$$2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Convertimos todas las referencias que nos indican que el archivo esta en iso-8859-1X a utf-8&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/[cC][hH][aA][rR][sS][eE][tT]\ *=\ *[iI][sS][oO]-8859-1[0-9]/charset=utf-8/g $archivo &gt; $aux1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/[cC][hH][aA][rR][sS][eE][tT]\ *=\ *[iI][sS][oO]-8859-1/charset=utf-8/g $aux1 &gt; $aux2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Esta ultima es para los archivos de SQL&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/[cC][hH][aA][rR][sS][eE][tT]\ *=\ *[lL][aA][tT][iI][nN]1/CHARSET=UTF-8/g $aux2 &gt; $aux1&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;                &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;    &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Realizamos la conversion del archivo ayudandonos del comando iconv&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;iconv -f iso-8859-1 -t utf-8 $aux1 &gt; $archivo_des; &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Borramos los archivos temporales que habiamos utilizado previamente&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;rm $aux1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;rm $aux2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Si la extension del archivo no era una de las que vamos a convertir, lo copiamos en el destino&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;else&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;cp $archivo $archivo_des;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;fi&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;fi&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;done&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt; sqlfix.sh&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#!/bin/bash&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Fichero creado por: Jhonatan Garcia Gutierrez&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Este script se ha creado para solucionar un problema que da muchos&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#quebraderos de cabeza.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Muchas veces consultamos una base de datos y el resultado nos lo&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#devuelve en iso-8859-1, por lo que nuestro navegador no muestra&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#bien los simbolos cuando esta configurado para mostrar utf-8.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Usa solucion a este problema seria hacer un volcado de la base de datos:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#mysqldump -u [usuario] -p --opt [tabla] &gt; [archivo].sql&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#convertir el archivo resultante a utf-8 y subir este archivo&lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;                  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;    &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;convertido&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#a nuestra base de datos:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#mysql -u [usuario] -p [tabla] &lt; [archivo].sql&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Sin embargo, hay veces en las que esto no funciona, y hay que codificar&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#nuestro archivo de una manera especial para que la base de datos muestre&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#los resultados de nuestras consultas como deberia.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#Para arreglar este problema, simplemente tendremos que ejecutar los &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#siguientes pasos:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#mysqldump -u [usuario] -p --opt [tabla] &gt; [archivo].sql&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#./sqlfix.sh [archivo].sql [archivofix].sql&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#mysql -u [usuario] -p [tabla] &lt; [archivofix].sql&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;#&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;arch_or=$1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;arch_des=$2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;aux1=${0}$$1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;aux2=${0}$$2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/¿/Â¿/g $arch_or &gt; $aux1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/¡/Â¡/g $aux1 &gt; $aux2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/á/Ã¡/g $aux2 &gt; $aux1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/é/Ã©/g $aux1 &gt; $aux2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/í/Ã­/g $aux2 &gt; $aux1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/ó/Ã³/g $aux1 &gt; $aux2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/ú/Ãº/g $aux2 &gt; $aux1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/Á/Ã\201/g $aux1 &gt; $aux2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/É/Ã‰/g $aux2 &gt; $aux1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/Í/Ã\215/g $aux1 &gt; $aux2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/Ó/Ã“/g $aux2 &gt; $aux1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/Ú/Ãš/g $aux1 &gt; $aux2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/ñ/Ã±/g $aux2 &gt; $aux1&lt;/span&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;                &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;    &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/Ñ/Ã‘/g $aux1 &gt; $aux2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/ü/Ã¼/g $aux2 &gt; $aux1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/Ü/Ãœ/g $aux1 &gt; $aux2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/ç/Ã§/g $aux2 &gt; $aux1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;sed -e s/CHARSET=latin1/CHARSET=utf8/g $aux1 &gt; $aux2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;mv $aux2 $arch_des&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;rm $aux1&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Paquetes instalados una vez migrada la web:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Nos hemos dado cuenta de que una vez que la web ha sido migrada a utf-8, al instalar un paquete nuevo, éste aparecía en formato iso-8859-1. Al parecer, la codificación del paquete no se modifica automáticamente al instalarlo, por lo que por defecto se instalará con la codificacón con la que el paquete fue creado.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Esto quiere decir que, cada vez que instalemos un paquete nuevo, habrá que convertirlo a utf-8. Afortunadamente, esto se puede hacer sólo con la carpeta del paquete, y no con el sitio web completo. Para realizar ésto, tendremos que buscar la carpeta en la que se ha instalado el nuevo paquete. Supongamos que el paquete se instala en la carpeta administrator/components/jos_paquete del sitio ejemplo. Lo que tendríamos que hacer sería:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; cd /var/www/ejemplo/administrator/components&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; mv jos_paquete jos_paqueteBAK&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; $HOME/webiso2utf.sh jos_paqueteBAK jos_paquete&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Y con eso el nuevo paquete estará codificado en utf-8. Ahora, si vemos carácteres extraños al usar el paquete, se deben a que los datos introducidos en la base de datos al instalar el paquete se han realizado en formato iso-8859-1. Por lo tanto, deberíamos reconvertir la base de datos a utf-8, usando los mismos pasos explicados anteriormente.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Todo esto hay que hacerlo, obviamente, si el nuevo &lt;/span&gt;                &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;    &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;paquete que hemos instalado se encontraba realizado en iso-8859-1 y nos encontramos con carácteres raros al usar el Joomla. Si el paquete fue creado con la codificación utf-8 y no nos crea ningún problema a la hora de mostrarlo cuando estemos usando el navegador, mejor no tocamos nada.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Consideraciones finales:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Todo lo expuesto en esta guía ha sido probado y ejecutado satisfactoriamente para realizar la migración de codificaciones en el sitio web del CICA (&lt;a href="http://www.cica.es/"&gt;www.cica.es&lt;/a&gt;). Los scripts cumplen su cometido cuando se ejecutan bajo Debian y con un bash como consola. Sin embargo, no hemos podido probar la eficacia de lo anteriormente expuesto en ninguna otra configuración de máquinas o sistemas operativos.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Debido a esto, puede que lo dicho previamente no funcione correctamente para la configuración actual de trabajo que estés usando. Si has tenido algún problema que no haya sido recogido por esta guía y has conseguido solucionarlo, exponlo abiertamente para que podamos recoger la información y ayudar a más personas con el mismo problema.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; De todas formas, a continuación voy a redactar una pequeña guía de problemas relacionados con la configuración de equipos que sí son esperados y que podrían solucionarse con relativa facilidad:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Si al ejecutar los scripts no obtienes el resultado esperado, comprueba que tu máquina posee el comando iconv y que es accesible directamente. Si no lo posee, deberás buscar el comando equivalente para tu sistema operativo y modificar el script para que realice una llamada al comando correspondiente.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Si tu script no se ejecuta en absoluto, comprueba que tu consola de comandos es bash y no otra similar (Como &lt;/span&gt;                &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;    &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;ksh). Si no es bash, prueba a modificar el script para que busque tu consola de comandos al principio en lugar de realizar la llamada a #!/bin/bash&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt; Espero que no haga falta decir que estos scripts no funcionarán en Windows :P&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Guía elaborada por:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;Jhonatan Garcia Gutierrez&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:130%;"&gt;Cristóbal Tamayo&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-633359193493606896?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/633359193493606896/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=633359193493606896&amp;isPopup=true' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/633359193493606896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/633359193493606896'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/convertir-joomla-utf-8.html' title='Convertir Joomla a UTF-8'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-8758716260803869986</id><published>2008-05-18T03:31:00.002-07:00</published><updated>2008-05-18T03:32:28.816-07:00</updated><title type='text'>Instalar glassfish en ubuntu edgy</title><content type='html'>&lt;p&gt;Bueno ya sabeis que Sun a liberado su mega servidor chachi de la muerte conocido como Sun aplication server. Esto que quiere decir, pues disponer de un servidor que soporta lo último de Sun de forma gratuita y aun mejor lo podemos instalar de manera muy simple en nuestro linux. Waaa esto pinta muy bien. Al parecer Sun esta luchando por competir contra la unión Red Hat - JBoss, para ello colabora con la gente de ubuntu para crear un nuevo exponente ubuntu - Glassfish. Bueno os cuento para quién no lo sepa la nueva versión de Sun Aplication Server al parecer a cambiado de nombre y ahora se llama glassfish.&lt;/p&gt;&lt;p&gt;Bueno en este artículo os comento como instalar glassfish en ubuntu edgy o inferiores, ya que en ubuntu Feisty Fawn es un simple &lt;em&gt;apt-get install&lt;/em&gt;, pero si aún no nos atrevemos con la nueva distro de ubuntu o disponemos de Ubuntu Server Edition, con esto podreís instalar glassfish.&lt;/p&gt;  &lt;p&gt;1. Lo primero necesitais tener que aseguraros es de que teneis las java 1.5 o superior para ello:&lt;/p&gt;&lt;p&gt;$&gt; java -version&lt;/p&gt;&lt;p&gt;En caso de que tengais unas java inferiores os recomiendo que para instalarlas&lt;/p&gt;&lt;p&gt;$&gt; apt-get install sun-java5-jdk&lt;/p&gt;&lt;p&gt; (También podeis usar Automatix2 o Synaptic o lo que querais si os resulta más simple)&lt;/p&gt;&lt;p&gt;2. Instalar ant&lt;/p&gt;&lt;p&gt;$&gt; apt-get install ant&lt;/p&gt;&lt;p&gt;3. Descargarse glassfish&lt;/p&gt;&lt;p&gt;(web oficial) https://glassfish.dev.java.net/&lt;/p&gt;&lt;p&gt;4. Copiar el fichero al /opt e instalar glassfish&lt;/p&gt;&lt;p&gt;$&gt; cd /opt&lt;/p&gt;&lt;p&gt;$&gt; java -jar -Xmx256M glassfish-installer-v2-b41d.jar&lt;/p&gt;&lt;p&gt;(En mi caso la versión más reciente es la b41d)&lt;/p&gt;&lt;p&gt;5. Reconstruimos el proyecto con ant&lt;/p&gt;&lt;p&gt;$&gt; cd glassfish&lt;/p&gt;&lt;p&gt;$&gt; ant -f setup.xml &lt;/p&gt;&lt;p&gt;(Nota. También existe un setup-cluster.xml por si queres desplegar el servidor en un cluster)&lt;/p&gt;&lt;p&gt;6. Arracamos glassfish&lt;/p&gt;&lt;p&gt;$&gt; cd glassfish/bin&lt;/p&gt;&lt;p&gt;$&gt; ./asadmin start-domain domain1&lt;/p&gt;&lt;p&gt;Tras esto glassfish se despliega ocupando el puerto 8080 como puerto  de publicaciones web y el 4848 para la administración del servidor con un completisimo backend.&lt;/p&gt;&lt;p&gt;7. Acceder al backend de administración&lt;/p&gt;&lt;p&gt;En un navegador ponemos: http://localhost:4848 (si lo hemos instalado en local)&lt;/p&gt;&lt;p&gt;nos aparecera la pantalla de acceso y por defecto el usuario y el password de glassfish es:&lt;/p&gt;&lt;p&gt;user: admin&lt;/p&gt;&lt;p&gt;password: adminadmin&lt;/p&gt;&lt;p&gt;(Nota. Cambiar el password será una de las primeras cosas que tendremos que hacer)&lt;/p&gt;&lt;p&gt;que lo disfruteis  ;)&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-8758716260803869986?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/8758716260803869986/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=8758716260803869986&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8758716260803869986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8758716260803869986'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/instalar-glassfish-en-ubuntu-edgy.html' title='Instalar glassfish en ubuntu edgy'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-450956161383402368</id><published>2008-05-18T03:31:00.001-07:00</published><updated>2008-05-18T03:31:50.408-07:00</updated><title type='text'>java 6 en Debian etch</title><content type='html'>&lt;p&gt;Hoy he tenido que instalarle java 1.6 a la ultima distro de debian estable que hay en el mercado, para ello logicamente tuve que tirar de un repositorio inestable, pero es que para lo que quiero hacer correr en la máquina requeria de la nueva java 1.6 o 6.0 existe ambiguedad entre su nombre.&lt;/p&gt;&lt;p&gt;Por ello creo que es interesante este árticulo en el que se explica como desistalar tu java 1.5 si la tuvieras instalada y acto seguido instalar java 1.6 (en este caso las jdk + jre).&lt;/p&gt;&lt;p&gt;Seguro que le servirá a alguién más ademas de a mí ;). &lt;/p&gt;&lt;p&gt; &lt;/p&gt;   ======================&lt;br /&gt;Desinstalar sun-java5&lt;br /&gt;======================&lt;br /&gt;en mi caso tengo instalado sun-java5&lt;br /&gt;&lt;br /&gt;1) Para ver los paquetes sun-java instalados&lt;br /&gt;&lt;br /&gt;# dpkg -l |grep sun-java&lt;br /&gt;&lt;br /&gt;2) en mi caso, aparecen:&lt;br /&gt;- sun-java5-bin&lt;br /&gt;- sun-java5-demo&lt;br /&gt;- sun-java5-jdk&lt;br /&gt;- sun-java5-jre&lt;br /&gt;&lt;br /&gt;3) Para eliminar los paquetes&lt;br /&gt;&lt;br /&gt; # apt-get --purge remove sun-java5-bin sun-java5-demo sun-java5-jdk sun-java5-jre&lt;br /&gt;&lt;br /&gt;4) para ver si se había creado algún enlace:&lt;br /&gt;&lt;br /&gt; # update-alternatives --display java&lt;br /&gt; # update-alternatives --display javac&lt;br /&gt;&lt;br /&gt;5) se eliminan los enlaces que se habian creado&lt;br /&gt;&lt;br /&gt; # update-alternatives --remove-all java&lt;br /&gt; # update-alternatives --remove-all javac&lt;br /&gt;&lt;br /&gt;=====================&lt;br /&gt;Instalar sun-java6&lt;br /&gt;=====================&lt;br /&gt;En mi caso, tengo Debian etch y los paquetes de sun-java6 estan en unstable. Para poder instalar estos paquetes desde la rama inestable hay que hacer lo siguiente:&lt;br /&gt;&lt;br /&gt;1) Se necesita agregar una línea de apt source (repositorio para la rama unstable) a la lista en /etc/apt/sources.list:&lt;br /&gt;&lt;br /&gt;Por ejemplo, en mi caso:&lt;br /&gt;&lt;br /&gt; deb &lt;a href="http://ftp.fi.debian.org/debian/"&gt;http://ftp.fi.debian.org/debian/&lt;/a&gt; unstable main contrib non-free&lt;br /&gt;&lt;br /&gt;2) Una vez que esto esté hecho, se actualiza la lista con:&lt;br /&gt;&lt;br /&gt; # apt-get update&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3) Ahora ya estamos listos para instalar los paquetes. Para ver los paquetes disponibles, tecleamos:&lt;br /&gt;&lt;br /&gt; # apt-cache search sun-java6&lt;br /&gt;&lt;br /&gt;Nos mostrará una lista con los paquetes disponibles.&lt;br /&gt;&lt;br /&gt;4) En mi caso deseo instalar sun-java6-jdk&lt;br /&gt;&lt;br /&gt; # apt-get -t unstable install sun-java6-jdk&lt;br /&gt;&lt;br /&gt;mostrará que instalará tambien los paquetes: sun-java6-bin, sun-java6-jre&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5) Establecemos la alternativa por defecto de la VM de java:&lt;br /&gt;&lt;br /&gt; # /usr/sbin/update-alternatives --config java&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mostraría algo como esto:&lt;br /&gt;&lt;br /&gt; There is only 1 program which provides java&lt;br /&gt;(/usr/lib/jvm/java-6-sun/jre/bin/java). Nothing to configure.&lt;br /&gt;rcs:/etc/apt# update-alternatives --display java&lt;br /&gt;java - status is auto.&lt;br /&gt;link currently points to /usr/lib/jvm/java-6-sun/jre/bin/java&lt;br /&gt;/usr/lib/jvm/java-6-sun/jre/bin/java - priority 63&lt;br /&gt;slave java.1.gz: /usr/lib/jvm/java- 6-sun-1.6.0.00/jre/man/man1/java.1.gz&lt;br /&gt;Current `best' version is /usr/lib/jvm/java-6-sun/jre/bin/java. &lt;br /&gt;&lt;br /&gt;6) si queremos ver los enlaces que nos ha creado, tecleamos:&lt;br /&gt;&lt;br /&gt; # /usr/sbin/update-alternatives --display java&lt;br /&gt;&lt;br /&gt;y nos saldría algo como esto:&lt;br /&gt;&lt;br /&gt;java - status is auto.&lt;br /&gt;&lt;br /&gt;link currently points to /usr/lib/jvm/java-6-sun/jre/bin/java&lt;br /&gt;/usr/lib/jvm/java-6-sun/jre/bin/java - priority 63&lt;br /&gt;slave java.1.gz: /usr/lib/jvm/java- 6-sun-1.6.0.00/jre/man/man1/java.1.gz&lt;br /&gt;Current `best' version is /usr/lib/jvm/java-6-sun/jre/bin/java. &lt;br /&gt;&lt;br /&gt;7) hacemos lo mismo que en el paso 6, pero con javac:&lt;br /&gt;&lt;br /&gt; # /usr/sbin/update-alternatives --config javac&lt;br /&gt;&lt;br /&gt;mostraría algo como esto:&lt;br /&gt;&lt;br /&gt; There is only 1 program which provides javac&lt;br /&gt;(/usr/lib/jvm/java-6-sun/bin/javac). Nothing to configure.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;7.1) si queremos ver los enlaces que nos ha creado, tecleamos:&lt;br /&gt;&lt;br /&gt; # /usr/sbin/update-alternatives --display javac&lt;br /&gt;&lt;br /&gt;y nos saldría algo como esto:&lt;br /&gt;&lt;br /&gt;javac - status is auto.&lt;br /&gt; link currently points to /usr/lib/jvm/java-6-sun/bin/javac&lt;br /&gt;/usr/lib/jvm/java-6-sun/bin/javac - priority 63&lt;br /&gt; slave javac.1.gz: /usr/lib/jvm/java-6-sun-1.6.0.00 /man/man1/javac.1.gz&lt;br /&gt;Current `best' version is /usr/lib/jvm/java-6-sun/bin/javac.&lt;br /&gt;&lt;br /&gt;8) si toda va bien, tecleamos:&lt;br /&gt;&lt;br /&gt; # java -version&lt;br /&gt;&lt;br /&gt;y mostraría:&lt;br /&gt;&lt;br /&gt; java version "1.6.0"&lt;br /&gt;Java(TM) SE Runtime Environment (build 1.6.0-b105)&lt;br /&gt;Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;9) para instalar la documentación de sun-java6, me conecto a &lt;a href="http://java.sun.com/javase/download"&gt;http://java.sun.com/javase/download&lt;/a&gt; y me descargo el archivo jdk-6-doc.zip.&lt;br /&gt;&lt;br /&gt;10) el fichero jdk-6-doc.zip lo descargo en /tmp y establezco como propietario y grupo a root.&lt;br /&gt;&lt;br /&gt;11) instalo el paquete sun-java6-doc, que tira del jdk-6-doc.zip&lt;br /&gt;&lt;br /&gt; # apt-get -t unstable install sun-java6-doc&lt;br /&gt;&lt;br /&gt;Una vez instalado puedes borrar el fichero jdk-6-doc.zip de /tmp&lt;br /&gt;&lt;br /&gt;Bueno, pues con esto parece que ya va ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-450956161383402368?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/450956161383402368/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=450956161383402368&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/450956161383402368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/450956161383402368'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/java-6-en-debian-etch.html' title='java 6 en Debian etch'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-7365414811261484481</id><published>2008-05-18T03:30:00.000-07:00</published><updated>2008-05-18T03:31:04.626-07:00</updated><title type='text'>comandos de interes III: John</title><content type='html'>Hoy he asistido a un seminario de seguridad en sistemas linux, y hemos estado jugueteando con una herramienta muy potente y muy popular para romper ficheros de password en diferentes encriptaciones. Este artículo no está escrito para que hagais un mal uso de la herramienta, sino que esta orientado a que podais comprobar lo dificil o fácil que lo tendría un atacante para romper los password que usas o en el caso de que administres máquinas, los password de tus usuarios. &lt;h1&gt;Jonh The Ripper password cracker&lt;/h1&gt;&lt;p&gt; John the Ripper es un crackeador de claves muy rápido, está disponible en muchos Unix, DOS, Hasefroch32, BeOS y OpenVMS. Su principal función es un detectar claves &lt;span style="color: rgb(255, 0, 0);"&gt;débiles&lt;/span&gt; de Unix, pero puede analizar claves hash de varios sabores Unix, Kerberos AFS y Hasefroch NT/2000/XP LM hashes, y otros  muchos parches disponibles en la Red.&lt;br /&gt;&lt;br /&gt;En este momento John NO se puede ejecutar en paralelo, por lo que la efectividad de la resolución de la clave se ve limitada a la capacidad del PC en el que se ejecuta, el autor asegura que está trabajando en ello. Un proyecto muy interesante en cuanto al procesado en paralelo y la obtención de claves es &lt;a href="http://www.cisiar.org/proyectos/cisilia/home_es.php"&gt;http://www.cisiar.org/proyectos/cisilia/home_es.php&lt;/a&gt; este puede resolver contraseñas de Hasefroch NT/2000/XP ó Samba y Unix mediante los algoritmos DES/MD4 y MD5 respectivamente, lo único que necesita para poder funcionar es un clúster y el software que está en la web (apenas 1Mega), y con la facilidad de montar un &lt;span style="color: rgb(255, 0, 0);"&gt;clúster&lt;/span&gt; con &lt;a href="http://bofh.be/clusterknoppix/"&gt;knoppix-clúster&lt;/a&gt; puede ser una opción cuando te juntes con los amigos en red Lan.&lt;/p&gt;&lt;h2&gt;Obteniendo el John&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;En &lt;a href="http://www.openwall.com/Owl/"&gt;http://www.openwall.com/Owl/&lt;/a&gt; venden el CD oficial de OpenWall "Owl CD's" o bien lo puedes descargar de la misma web, donde vienen muchas de las soluciones que provee openwall para la seguridad.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Debian GNU/Linux, EnGarde Linux, Gentoo Linux, Mandrake Linux, y SuSE Linux. Hay colecciones de ports/packages para FreeBSD, NetBSD, y OpenBSD.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Bajarse el binario o las sources de &lt;a href="http://www.openwall.com/john/"&gt;http://www.openwall.com/john/&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Importante&lt;/span&gt;: Normalmente las instalaciones de binarios o paquetes (Debian...) &lt;span style="font-weight: bold;"&gt;NO&lt;/span&gt; tienen los&lt;span style="color: rgb(255, 0, 0);"&gt; parches incorporados&lt;/span&gt;, esto significa que no están todas las posibles funcionalidades del John. Los parches son estos:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jl.gailly.net/security/john-1.6.32-VMS-patch-5.tar.gz"&gt;OpenVMS and SYSUAF.DAT support&lt;/a&gt; (&lt;a href="http://jl.gailly.net/security/john-1.6.32-VMS-patch-5.tar.gz.sig"&gt;signature&lt;/a&gt;), by &lt;a href="http://gailly.net/security/"&gt;Jean-loup Gailly&lt;/a&gt;&lt;br /&gt;    &lt;a href="http://jl.gailly.net/security/john-1_6_32-vms-5.zip"&gt;OpenVMS executables for Alpha and VAX&lt;/a&gt; (&lt;a href="http://jl.gailly.net/security/john-1_6_32-vms-5.zip.sig"&gt;signature&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://olle.nxs.se/software/john-ntlm/"&gt;Hasefroch NT/2000/XP NTLM (MD4) hash support&lt;/a&gt;, by &lt;a href="http://olle.nxs.se/"&gt;Olle Segerdahl&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.monkey.org/%7Edugsong/john-1.6.krb4.patch-3"&gt;AFS/Kerberos v4 TGT support&lt;/a&gt;, by &lt;a href="http://www.monkey.org/%7Edugsong/"&gt;Dug Song&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.monkey.org/%7Edugsong/john-1.6.skey.patch-1"&gt;S/Key skeykeys files support&lt;/a&gt;, by &lt;a href="http://www.monkey.org/%7Edugsong/"&gt;Dug Song&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.bastard.net/%7Ekos/john-sha/john-1.6-nsldap-1.diff"&gt;Netscape LDAP server passwords support&lt;/a&gt;, by &lt;a href="http://www.bastard.net/%7Ekos/john-sha/"&gt;K Evangelinos&lt;/a&gt;   &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.openwall.com/john/contrib/john-1.6-mysql-1.diff"&gt;MySQL passwords support&lt;/a&gt; (&lt;a href="http://www.openwall.com/john/contrib/john-1.6-mysql-1.diff.sig"&gt;signature&lt;/a&gt;), by &lt;a href="http://guh.nu/"&gt;Andrew Hintz (Drew)&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.openwall.com/john/contrib/john-1.6.33-eggpatch-10.diff.gz"&gt;Eggdrop userfile support&lt;/a&gt;, by &lt;a href="mailto:sun-zero-at-freemail.hu"&gt;Sun-Zero&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.bebits.com/app/2396"&gt;BeOS port&lt;/a&gt;, by &lt;a href="http://www.bebits.com/devprofile/1639"&gt;Adam Milner&lt;/a&gt; &lt;/li&gt;&lt;li&gt;MacOS X packages of 1.6.33 as &lt;a href="http://deepquest.code511.com/os_X_tools/john-1.6.33-binaries-OSX.dmg.gz"&gt;dmg.gz&lt;/a&gt; (&lt;a href="http://deepquest.code511.com/os_X_tools/john-1.6.33-binaries-OSX.dmg.gz.sig"&gt;sig&lt;/a&gt;) and &lt;a href="http://deepquest.code511.com/os_X_tools/john-1.6.33-binaries-OSX.tar.gz"&gt;tar.gz / pkg&lt;/a&gt; (&lt;a href="http://deepquest.code511.com/os_X_tools/john-1.6.33-binaries-OSX.tar.gz.sig"&gt;sig&lt;/a&gt;), by &lt;a href="http://deepquest.code511.com/"&gt;Deepquest&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Los puedes descargar de &lt;a href="ftp://ftp.openwall.com/pub/projects/john/contrib/"&gt;aquí&lt;/a&gt;, la aplicación del parche elegido requiere necesariamente de las sources del john y su posterior instalación, únicamente debes descomprimir el parche en /src (en el código fuente del Jonh) y aplicar el parche como viene indicado en el &lt;span style="color: rgb(255, 0, 0);"&gt;FAQ&lt;/span&gt; del parche.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Usando el John&lt;/h2&gt;&lt;p&gt; Las &lt;span style="color: rgb(255, 0, 0);"&gt;configuraciones&lt;/span&gt; se guardan en &lt;span style="font-family: monospace;"&gt;/usr/share/john/ &lt;/span&gt;y el programa debe ejecutarse como &lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;root&lt;/span&gt; &lt;/span&gt;(al menos en Debian)&lt;span style="font-family: monospace;"&gt;.&lt;br /&gt;&lt;/span&gt;Los ficheros &lt;span style="font-family: monospace;"&gt;*.chr&lt;/span&gt; y el &lt;span style="font-family: monospace;"&gt;john.conf&lt;/span&gt; son &lt;span style="color: rgb(255, 0, 0);"&gt;necesarios&lt;/span&gt; para que funcione el programa, cuando lo instalé desde el código fuente estos ficheros no estaban, los tuve que pillar de la instalación del binario.&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;Existen &lt;span style="font-weight: bold;"&gt;tres &lt;/span&gt;formas de aplicar el John:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;WordList&lt;/span&gt; (archivo de palabras): Este es el modo más simple, todo lo que necesitas hacer es especificar un archivo que contenga una palabra por línea.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-family: monospace;"&gt;john -wordfile:NOMBRE_FICHERO &lt;/span&gt;&lt;/em&gt;&lt;span style="font-family: monospace;"&gt;&lt;em&gt;&lt;span style="font-family: monospace;"&gt;FICHERO_PASSWORD&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;o bien puedes añadirle -rules para que "juegue" con las palabras del diccionario&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;john -w:FICHERO_DICCIONARIO -rules FICHERO_PASSWORD&lt;/span&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;SigleCrack&lt;/span&gt;: Este es el modo con el que deberías comenzar a crackear.  Este modo intentará usar la información de &lt;span style="font-family: monospace;"&gt;login/GECOS&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;john -single FICHERO_PASSWORD&lt;/span&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Incremental&lt;/span&gt; (fuerza bruta): El más potente, ya que probará todas las combinaciones de caracteres posibles. Necesitas indicar la longitud de la clave y los juegos de caracteres.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;john -i &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;FICHERO_PASSWORD&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;puedes especificar que caracteres usará con este método y la longitud, las configuraciones están en el fichero &lt;span style="font-family: monospace;"&gt;john.conf &lt;/span&gt;en la sección &lt;span style="font-family: monospace;"&gt;[incremental:MODO]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;john -i:Alpha &lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;FICHERO_PASSWORD &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;(a..z - 26 caracteres)&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;john -i:All &lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;FICHERO_PASSWORD &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;(todo - 95 caracteres)&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;john -i:Digits &lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;FICHERO_PASSWORD &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;(0..9 - 10caracteres)&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Externo&lt;/span&gt;: Mediante funciones en un sublenguaje de C podrás crear palabras que luego usará John.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;john -external:NOMBRE_MODO &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;FICHERO_PASSWORD&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;h2&gt;Detalles&lt;/h2&gt;&lt;p&gt; Una vez finalizado la operación, las claves obtenidas se guardan en &lt;span style="font-family: monospace;"&gt;john.pot, &lt;/span&gt;para &lt;span style="color: rgb(255, 0, 0);"&gt;visualizarlas&lt;/span&gt;:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;john -show FICHERO_PASSWORD&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Para seguir con un crackeo &lt;span style="color: rgb(255, 0, 0);"&gt;pausado&lt;/span&gt; se hace con:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;john -restore &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;FICHERO_PASSWORD&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Es importante indicar al john que &lt;span style="color: rgb(255, 0, 0);"&gt;tipo&lt;/span&gt; de crackeo quieres efectuar con&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt; -format:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;john -i:alpha -format:NT &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;FICHERO_PASSWORD &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;(prueba de 5 a 8 caracteres con a...z para claves de Hasefroch NT/2000/XP, debes tener el parche al respecto).&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;Es importante que si obtienes la clave le informes al &lt;span style="color: rgb(255, 0, 0);"&gt;usuario&lt;/span&gt; de que posee una clave débil y debe cambiarla, para esta posibilidad el john trae&lt;span style="font-family: monospace;"&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;mailer  &lt;/span&gt;&lt;/span&gt;que permite mandar un mail al usuario afectado.&lt;/p&gt;&lt;p&gt;En  $:/usr/share/doc/john# tienes toda la documentación al respecto en perfecto inglés, si te parece un poco liosa y prefieres leerlo en español puedes mirar&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;a href="http://www.decowar.com/manual_john_the_ripper.htm"&gt;aquí.&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-7365414811261484481?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/7365414811261484481/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=7365414811261484481&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7365414811261484481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7365414811261484481'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/comandos-de-interes-iii-john.html' title='comandos de interes III: John'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-6702174678906186192</id><published>2008-05-18T03:29:00.000-07:00</published><updated>2008-05-18T03:30:07.397-07:00</updated><title type='text'>comandos de interes II: sl</title><content type='html'>Bueno esto es una coña de comando pero me hizo tanta gracia que tenía que escribir un artículo sobre él. Para los que no lo conozcais este comando nació con la idea de que a veces cuando el administrador esta tecleando en la máquina se altera y empieza a teclear demasiado deprisa, bien pues si os dais cuanta puede ocurrir que escriba "sl" en vez de "ls" para listar el contenido de algún directorio, pues alguien tuvo la idea de crear un aviso que te diga que te tranquilices porque al escribir tan rápido seguramente comenterás una gamba "Las prisas nunca son buenas"... &lt;p&gt;Pues como siempre los comandos estos frikis no viene instalados por defecto en las distribuciones de linux por lo que tendremos que instalarla con nuestro apt-get:&lt;/p&gt;&lt;p&gt;&lt;em&gt; $ sudo apt-get install sl&lt;/em&gt;&lt;/p&gt;&lt;p&gt;pues una vez instalado como hemos comentado antes si alguien en vez de teclear ls escribe sl aparecerá un trenesito por la pantalla que te impide la escritura durante pocos segudos. &lt;/p&gt;&lt;p&gt;Nota. Es una chorrada de comando lo se pero tiene su gracia &lt;/p&gt;&lt;br /&gt;                                                                          (@@) (  ) (@)  ( )  @@    ()    @     O     @     O      @&lt;br /&gt;                                                                     (   )&lt;br /&gt;                                                                 (@@@@)&lt;br /&gt;                                                              (    )&lt;br /&gt;&lt;br /&gt;                                                            (@@@)&lt;br /&gt;                                                           ====        ________                ___________&lt;br /&gt;                                                       _D _|  |_______/        \__I_I_____===__|_________|&lt;br /&gt;                                                        |(_)---  |   H\________/ |   |        =|___ ___|      _________________&lt;br /&gt;                                                        /     |  |   H  |  |     |   |         ||_| |_||     _|                \_____A&lt;br /&gt;                                                       |      |  |   H  |__--------------------| [___] |   =|                        |&lt;br /&gt;                                                       | ________|___H__/__|_____/[][]~\_______|       |   -|                        |&lt;br /&gt;                                                       |/ |   |-----------I_____I [][] []  D   |=======|____|________________________|_&lt;br /&gt;                                                     __/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__|__________________________|_&lt;br /&gt;                                                      |/-=|___|=   O=====O=====O=====O|_____/~\___/          |_D__D__D_|  |_D__D__D_|&lt;br /&gt;                                                       \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-6702174678906186192?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/6702174678906186192/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=6702174678906186192&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/6702174678906186192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/6702174678906186192'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/comandos-de-interes-ii-sl.html' title='comandos de interes II: sl'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-7676271773177521908</id><published>2008-05-18T03:28:00.002-07:00</published><updated>2008-05-18T03:29:25.546-07:00</updated><title type='text'>Comandos de interes I: ipcalc</title><content type='html'>La semana pasada asistí a un curso de administración de redes, en la que dimos un repaso un poco pesado de todo el modelo OSI, tcp/udp etc etc. Pero saque algo interesante que quería comentar y es un comando de linux que no conocía y que tiene mucha mucha utilidad. Es como una calculadora especializada en formatos de direcciones ip de forma que nos será muy util para hacer subneting o para configurar nuestro servidor apache para que sólo escuche en un rango de direcciones ... &lt;p&gt;Pues bien, no es muy corriente encontrarlo instalado en la distribución que useis por lo que&lt;/p&gt;&lt;p&gt;tendreis que instalarlo previamente:&lt;/p&gt;&lt;p&gt;&lt;em&gt;$ sudo apt-get install ipcalc&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;(Podeis usar synaptic si preferis)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Nota. Yo como siempre uso la distro ubuntu para otras distros ya sabeis yum, up2date etc.&lt;/p&gt;&lt;p&gt; Y una vez instalado el modo de uso es muy sencillo, aqui os dejo algunos ejemplos:&lt;/p&gt;&lt;p&gt;&lt;em&gt;$ ipcalc 192.168.0.1/24&lt;br /&gt;$ ipcalc 192.168.0.1/255.255.128.0&lt;br /&gt;$ ipcalc 192.168.0.1 255.255.128.0 255.255.192.0&lt;br /&gt;$ ipcalc 192.168.0.1 0.0.63.255&lt;/em&gt;&lt;/p&gt;&lt;p&gt;bueno pues el resultado será algo así como esto:&lt;/p&gt;&lt;p&gt;&lt;em&gt;$ ipcalc 192.168.0.1/24&lt;br /&gt;Address:   192.168.0.1          11000000.10101000.00000000. 00000001&lt;br /&gt;Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000&lt;br /&gt;Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111&lt;br /&gt;=&gt;&lt;br /&gt;Network:   192.168.0.0/24       11000000.10101000.00000000. 00000000&lt;br /&gt;HostMin:   192.168.0.1          11000000.10101000.00000000. 00000001&lt;br /&gt;HostMax:   192.168.0.254        11000000.10101000.00000000. 11111110&lt;br /&gt;Broadcast: 192.168.0.255        11000000.10101000.00000000. 11111111&lt;br /&gt;Hosts/Net: 254                   Class C, Private Internet&lt;/em&gt;&lt;/p&gt;&lt;p&gt; Como podéis comprobar ese /24 que siempre tenemos que calcular mentalmente cuanto sería pues esta es la solución más cómoda que la máquina calcule por ti. Y como veis te dice la minima y máxima dirección de host  la mínima será la getaway, la dirección de broadcast, el número máximo de host que puede convivir en la red el tipo o clase de la ip y el desglose de los números binarios, vamos una maravilla de comando ;). &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-7676271773177521908?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/7676271773177521908/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=7676271773177521908&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7676271773177521908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7676271773177521908'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/comandos-de-interes-i-ipcalc.html' title='Comandos de interes I: ipcalc'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-7762833942568358212</id><published>2008-05-18T03:28:00.001-07:00</published><updated>2008-05-18T03:28:51.472-07:00</updated><title type='text'>TortoiseSVN y Google Code</title><content type='html'>&lt;p&gt;Bueno como ya sabreís google ha creado un nuevo servicio ofreciendo a la comunidad de desarrolladores de software libre un espacio de hasta 100 mgs gestionado con Subversion, al estilo de SourceForge. Pues bien una vez tenemos nuestra cuenta de google y nuestro espacio disponible ahora necesitamos un cliente SVN para gestionar nuestro código (subirlo al servicio de google, bajarlo , actualizarlo, etc.) por ese motivo en este artículo explico como hacerlo desde TortoiseSVN una herramienta muy sencillita pero sólo disponible en windows, para otros sistemas podeis buscar:   &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Mac OS X finder plugin - &lt;a href="http://scplugin.tigris.org/"&gt;SCPlugin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Unix graphical SVN client - &lt;a href="http://esvn.umputun.com/"&gt;eSVN&lt;/a&gt;&lt;/li&gt;&lt;li&gt;KDE-integrated SVN client - &lt;a href="http://www.alwins-world.de/programs/kdesvn/"&gt;kdesvn&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;Antes de empezar ahi 5 cosas que tu necesitas:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1 Google Account (cuenta en google)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;   Si usas gmail ya tienes cuenta y el user y el password será el mismo. Si no es así puedes creartela en aqui: &lt;em&gt;https://www.google.com/accounts/NewAccount&lt;/em&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;2 Tener un proyecto  &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;  En la url:  &lt;em&gt;http://code.google.com/hosting/ &lt;/em&gt;&lt;/p&gt;&lt;p&gt;  encontrarás el enlace "&lt;em&gt;&lt;u&gt;Sign in with your Gmail account to create a project&lt;/u&gt;&lt;/em&gt;" una vez introduzcas tu user y password te permiterirá crear un proyecto en google code.&lt;/p&gt;&lt;p&gt;Pues bien una vez tengamos nuestro proyecto creado podrás gestionar los miembros la licencia etc etc y todo con un interfaz usando AJax muy bonito..&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3 TortoiseSVN&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;Bajate e instala la última versión de este software que podrás encontrarlo en SourceForge&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4 Tu password de google code&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;La conexión a tu espacio de google se hace a través de HTTPS (conexión segura) para ello google utiliza como user el mismo que el de gmail (ej jorge@gmail -&gt; user:jorge ) pero como password por seguridad te ofrece uno autogenerado que encontrarás en la web de tu proyecto (&lt;em&gt;http://code.google.com/hosting/&lt;/em&gt;), pues una vez logeado con tu usuario y password de gmail:&lt;/p&gt;&lt;p&gt;Te vas a "&lt;em&gt;My Profile -&gt; Settings" &lt;/em&gt;y alli esta tu password asignado a google code&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5 Tu URL project &lt;/strong&gt; &lt;/p&gt;&lt;p&gt; Pues al igual que antes pero ahora en My Profile podemos ver la lista de proyectos a los que pertenecemos y si pinchamos sobre alguno de ellos nos direcciona a la web de nuestro proyecto. Pues bien, una vez dentro de nuestro proyecto nos vamos a la sesion Source y encontraremos algo así:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;em&gt;Command-Line Access&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;# Project members authenticate over HTTPS to allow committing changes.&lt;br /&gt;svn checkout &lt;strong&gt;https://[tuproyecto].googlecode.com/svn/trunk/&lt;/strong&gt; [tuproyecto] --username jorge &lt;/em&gt;&lt;/p&gt;&lt;p&gt;Pues en negrita te marco cual será la URL de conexión de tu proyecto.&lt;/p&gt;&lt;p&gt;Una vez tengamos estás cinco cosas ya podemos subir nuestro código desde nuestra máquina a google code y gestionarlo posteriormente.&lt;/p&gt;&lt;h4&gt;¿Cómo subir nuestros ficheros a google code? &lt;/h4&gt;&lt;p&gt;- En nuestra máquina seleccionamos la carpeta donde se encuentra tu proyect&lt;/p&gt;&lt;p&gt; - Clic botón derecho del ratón y nos aparecerán las opciones y si habeis instalado Tortoise correctamente tendremos añadidas las opciones de Tortoise&lt;/p&gt;&lt;p&gt;- "&lt;em&gt;TortoiseSVN &gt; Import &lt;/em&gt;"&lt;/p&gt;&lt;p&gt;- Nos aparece una ventana que nos pregunta por la URL de nuestro respositorio, introducimos: &lt;em&gt;&lt;strong&gt;https://[tuproyecto].googlecode.com/svn/trunk/ &lt;/strong&gt;&lt;/em&gt;(obtenida en el punto 5)&lt;/p&gt;&lt;p&gt;- Tras darle aceptar nos preguntará por user y password (obtenidos en punto 4) &lt;/p&gt;&lt;p&gt;- Tras aceptar la conexión, comenzará la subida de tus ficheros al espacio de google code.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h4&gt;¿Cómo bajarte el proyecto desde google code? &lt;/h4&gt;&lt;p&gt;- Creamos una carpeta en nuestro disco duro&lt;/p&gt;&lt;p&gt;- Click sobre el botón derecho del ratón&lt;/p&gt;&lt;p&gt;- Seleccionamos "&lt;em&gt;SVN checkout...&lt;/em&gt;" &lt;/p&gt;&lt;p&gt;- Nos preguntará la URL del repositorio, al igual que antes introducimos:  &lt;em&gt;&lt;strong&gt;https://[tuproyecto].googlecode.com/svn/trunk/ &lt;/strong&gt;&lt;/em&gt;(obtenida en el punto 5)&lt;/p&gt;&lt;p&gt; - Tras darle aceptar nos preguntará por user y password (obtenidos en punto 4) &lt;/p&gt;&lt;p&gt;- Comienza la descarga de todo el código de tu proyecto que se almacenará en la carpeta creada.&lt;/p&gt;&lt;p&gt;Bueno eso es todo, para subir una actualización a google code lo harás con 'commit' y para preguntar al servidor por una versión más actualizada pulsamos sobre 'update'.&lt;/p&gt;&lt;p&gt;Y poco más espero que os sirva para crear vuestros proyecto en google code  &lt;img src="http://87.217.22.202/eldespachodelosjorges/mambots/editors/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-wink.gif" alt="Guiño" title="Guiño" border="0" /&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-7762833942568358212?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/7762833942568358212/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=7762833942568358212&amp;isPopup=true' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7762833942568358212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7762833942568358212'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/tortoisesvn-y-google-code.html' title='TortoiseSVN y Google Code'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-7785159105531860047</id><published>2008-05-18T03:27:00.002-07:00</published><updated>2008-05-18T03:28:16.777-07:00</updated><title type='text'>Java de File a String</title><content type='html'>&lt;p&gt;Bueno este artículo es muy interesante, muchas veces necesitamos leer el contenido de un fichero y pasarlo todo a un string de manera que podramos concatenarlo con otros o podamos hacer tratamiento de cadenas en java. Pues bien aquí veras cuatro formas de hacer esto y como de eficientes son...&lt;/p&gt;&lt;p&gt; &lt;/p&gt;  &lt;table border="0"&gt;&lt;tbody&gt;&lt;tr style="background-color: rgb(0, 51, 204);"&gt;&lt;td style="color: rgb(255, 255, 255);"&gt;&lt;strong&gt;Técnica&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong style="color: rgb(255, 255, 255);"&gt;jview (sec) &lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong style="color: rgb(255, 255, 255); text-decoration: none;"&gt;java (sec) &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background-color: rgb(153, 204, 153);"&gt;&lt;td&gt; Read into byte-buffer &amp;amp; convert to string&lt;/td&gt;&lt;td&gt; 0.6&lt;/td&gt;&lt;td&gt;1.1&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background-color: rgb(153, 204, 153);"&gt;&lt;td&gt; Read into byte-buffer &amp;amp; ByteArrayOutputStream&lt;br /&gt;&lt;/td&gt;&lt;td&gt;1.0&lt;br /&gt;&lt;/td&gt;&lt;td&gt;1.7&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background-color: rgb(153, 204, 153);"&gt;&lt;td&gt; BufferedReader line at a time&lt;/td&gt;&lt;td&gt;1.7&lt;br /&gt;&lt;/td&gt;&lt;td&gt;2.1&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background-color: rgb(153, 204, 153);"&gt;&lt;td&gt; Read single byte at a time&lt;br /&gt;&lt;/td&gt;&lt;td&gt;62&lt;br /&gt;&lt;/td&gt;&lt;td&gt;77&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;  &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Read into byte-buffer &amp;amp; convert to string  &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;import java.io.*;&lt;br /&gt;&lt;br /&gt;public class ReadIntoStr4 {&lt;br /&gt;    public static void main(String argv[]){&lt;br /&gt;        try {&lt;br /&gt;            FileInputStream file = new FileInputStream (argv[0]);&lt;br /&gt;            long tcalc ;&lt;br /&gt;            long begin = System.currentTimeMillis() ;&lt;br /&gt;            byte[] b = new byte[file.available ()];&lt;br /&gt;            file.read(b);&lt;br /&gt;            file.close ();&lt;br /&gt;            String result = new String (b);&lt;br /&gt;            /* */&lt;br /&gt;            tcalc = (System.currentTimeMillis() - begin);&lt;br /&gt;            System.out.println("Compute time: " + tcalc + " ms for " + result.length() + "                 bytes.");&lt;br /&gt;            //System.out.println("The string \n " + result) ;&lt;br /&gt;        }&lt;br /&gt;        catch (Exception e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Read into byte-buffer &amp;amp; ByteArrayOutputStream&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;import java.io.*;&lt;br /&gt;&lt;br /&gt;public class ReadIntoStr2 {&lt;br /&gt;    public static void main(String argv[]){&lt;br /&gt;        try {&lt;br /&gt;            FileInputStream file = new FileInputStream (argv[0]);&lt;br /&gt;            long tcalc ;&lt;br /&gt;            long begin = System.currentTimeMillis() ;&lt;br /&gt;            ByteArrayOutputStream bout = new ByteArrayOutputStream() ;&lt;br /&gt;            int bytesread = 0;&lt;br /&gt;            byte [] buff = new byte[512] ;&lt;br /&gt;       &lt;br /&gt;            while(true) {&lt;br /&gt;                bytesread = file.read(buff);&lt;br /&gt;                if (bytesread == -1)    // if EOF&lt;br /&gt;                    break ;&lt;br /&gt;                bout.write(buff,0,bytesread) ;&lt;br /&gt;            }&lt;br /&gt;    &lt;br /&gt;            file.close ();&lt;br /&gt;            bout.close();&lt;br /&gt;            String result = bout.toString() ;&lt;br /&gt;            /* */&lt;br /&gt;            tcalc = (System.currentTimeMillis() - begin);&lt;br /&gt;            System.out.println("Compute time: " + tcalc + " ms for " + result.length() + "                 bytes.");&lt;br /&gt;            //System.out.println("The string \n " + result) ;&lt;br /&gt;        }&lt;br /&gt;        catch (Exception e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;         }&lt;br /&gt;    }&lt;br /&gt;   }&lt;/p&gt;&lt;p&gt;&lt;strong&gt;BufferedReader line at a time&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;import java.io.*;&lt;br /&gt;public class ReadIntoStr3  {&lt;br /&gt;    public static void main (String args[]) {&lt;br /&gt;        String thisLine;&lt;br /&gt;        StringBuffer strb = new StringBuffer("") ;&lt;br /&gt;   &lt;br /&gt;        for (int i=0; i &lt; args.length; i++) {&lt;br /&gt;            try {&lt;br /&gt;                FileInputStream fin =  new FileInputStream(args[i]);&lt;br /&gt;                BufferedReader myInput = new BufferedReader(new InputStreamReader(fin));&lt;br /&gt;                long tcalc ;&lt;br /&gt;                long begin = System.currentTimeMillis() ;&lt;br /&gt;                while ((thisLine = myInput.readLine()) != null) { &lt;br /&gt;                    strb.append(thisLine+"\r\n");&lt;br /&gt;                }&lt;br /&gt;                String result = strb.toString();&lt;br /&gt;                tcalc = (System.currentTimeMillis() - begin);&lt;br /&gt;                System.out.println("Compute time: " + tcalc + " ms for " + result.length() + "                 bytes.");&lt;br /&gt;                //System.out.println("The string \n " + result) ;&lt;br /&gt;        &lt;br /&gt;            }&lt;br /&gt;            catch (Exception e) {&lt;br /&gt;                e.printStackTrace();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;  }&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Read single byte at a time&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;import java.io.*;&lt;/p&gt;&lt;p&gt;public class ReadIntoStr1 {&lt;/p&gt;&lt;p&gt;    public static void main(String argv[]){&lt;/p&gt;&lt;p&gt;        try {&lt;/p&gt;&lt;p&gt;            FileInputStream file = new FileInputStream (argv[0]);&lt;/p&gt;&lt;p&gt;            long tcalc ;&lt;/p&gt;&lt;p&gt;            long begin = System.currentTimeMillis() ;&lt;/p&gt;&lt;p&gt;            ByteArrayOutputStream bout = new ByteArrayOutputStream() ;&lt;/p&gt;&lt;p&gt;   &lt;br /&gt;            int c;&lt;/p&gt;&lt;p&gt;            while ((c = file.read()) != -1)&lt;/p&gt;&lt;p&gt;                bout.write(c);&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;            file.close ();&lt;/p&gt;&lt;p&gt;            bout.close(); &lt;/p&gt;&lt;p&gt;            String result = bout.toString() ;&lt;/p&gt;&lt;p&gt;            /* */&lt;/p&gt;&lt;p&gt;            tcalc = (System.currentTimeMillis() - begin);&lt;/p&gt;&lt;p&gt;            System.out.println("Compute time: " + tcalc + " ms for " + result.length() + "                 bytes.");&lt;/p&gt;&lt;p&gt;            //System.out.println("The string \n " + result) &lt;/p&gt;&lt;p&gt;        }&lt;/p&gt;&lt;p&gt;        catch (Exception e) {&lt;/p&gt;&lt;p&gt;            e.printStackTrace();&lt;/p&gt;&lt;p&gt;        }&lt;/p&gt;&lt;p&gt;    }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-7785159105531860047?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/7785159105531860047/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=7785159105531860047&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7785159105531860047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/7785159105531860047'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/java-de-file-string.html' title='Java de File a String'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-8566005831158340694</id><published>2008-05-18T03:27:00.001-07:00</published><updated>2008-08-13T23:42:12.345-07:00</updated><title type='text'>Comandos basicos en Mysql</title><content type='html'>&lt;p&gt;Este árticulo es para las personas inespertas en Mysql que necesiten hacer las 4 chorradas más importantes como crear un usuario o borrar una tabla, y no quiera para ello tener que leerse un Manual de 250 páginas de Mysql.&lt;/p&gt;&lt;p&gt;Para todos vosotros espero que os sea de utilidad  &lt;img src="http://87.217.22.202/eldespachodelosjorges/mambots/editors/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-laughing.gif" alt="Riendo" title="Riendo" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;(Nota.  sustituir los corchetes por la palabra adecuada) &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Entrar en el MiniShell de Mysql&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;$mysql -u [usuario] -p&lt;/em&gt;&lt;/p&gt;&lt;p&gt;A continuación introducir password del usuario &lt;/p&gt;&lt;p&gt;Ya dentro del Shell de Mysql&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Listar las bases de datos existentes&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&gt; show databases;&lt;/em&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Borrar una base de datos&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;em&gt;&gt; drop database [nombre_base_de_datos];&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Crear una base de datos&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;em&gt;&gt; create database [nombre_base_de_datos]; &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Crear un usuario con privilegios sólo sobre una base de datos existente&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&gt; grant all on [database].* to [nombre_usuario]@[localhost|'%'] identified by '[password_usuario]'; &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Borrar un usuario&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;(Mostrar los privilegios del usuario)&lt;/p&gt;&lt;p&gt;&gt;show grants for [nombre_usuario]@localhost; &lt;/p&gt;&lt;p&gt;&gt; revoke all privileges on [database].* from [nombre_usuario]@localhost; &lt;/p&gt;&lt;p&gt;&gt; drop user [nombre_usuario]@localhost; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Selecionar una base de datos para explorar&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;em&gt;&gt; use [nombre_base_de_datos];&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Lista las tablas de la base de datos seleccionada &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&gt; show tables;&lt;/em&gt; &lt;/p&gt;&lt;p&gt; Este artículo esta incompleto, se irá cumplimentando a petición de los usuarios.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/464513392335827691-8566005831158340694?l=eldespachodelosjorges.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eldespachodelosjorges.blogspot.com/feeds/8566005831158340694/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=464513392335827691&amp;postID=8566005831158340694&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8566005831158340694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/464513392335827691/posts/default/8566005831158340694'/><link rel='alternate' type='text/html' href='http://eldespachodelosjorges.blogspot.com/2008/05/comandos-basicos-en-mysql.html' title='Comandos basicos en Mysql'/><author><name>Jorge Cantón Ferrero</name><uri>http://www.blogger.com/profile/17843977389818051312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp0.blogger.com/_MqAEAq68mQ0/SDfKFAg_7zI/AAAAAAAAB2s/wIY1s5Yy49A/S220/jorge_canton_ferrero.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-464513392335827691.post-3642452828898347864</id><published>2008-05-18T03:26:00.000-07:00</published><updated>2008-05-18T03:27:06.268-07:00</updated><title type='text'>Linux+Apache+Mysql+Php en distros Red Hat</title><content type='html'>&lt;p&gt;En este tutorial explico clara y brevemente todo lo necesario a la hora de montar un servidor LAMP (Linux+Apache+Mysql+Php) en sólo 20 minutillos sobre distros Red Hat y derivados como Fedora o CentOS.&lt;/p&gt;&lt;p&gt;Quizás este titular esta un poco puesto a la ligera ya que en el tutorial solo explico como instalar todos los componentes necesarios para nuestro servidor, pero no como configurarlo, así que una vez montado ya será tarea vuestra configurar apache de forma segura o quizás también lo podréis encontrar próximamente en otro tutorial en el Despacho de los Jorges.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1 Instalación de Apache&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1.1 Instalación a través de yum &lt;/p&gt;&lt;p&gt;    Si se utiliza CentOS o White Box Enterprise Linux y Fedora sólo basta ejecutar lo siguiente:&lt;/p&gt;&lt;p&gt;&lt;em&gt;$yum -y install httpd&lt;/em&gt;&lt;/p&gt;&lt;p&gt;(Nota. El parametro '-y' le indica a yum q no nos pida confirmación y lo ejecute directamente, si preferimos ser más cautelosos suprimelo) &lt;/p&gt;&lt;p&gt;Si se desea que Apache incluya soporte para:&lt;/p&gt;&lt;p&gt;Php y Mysql&lt;/p&gt;&lt;p&gt;&lt;em&gt;$yum -y install php php-mysql &lt;/em&gt;&lt;/p&gt;&lt;p&gt;Perl&lt;/p&gt;&lt;p&gt;&lt;em&gt;$yum -y mod_perl&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Python&lt;/p&gt;&lt;p&gt;&lt;em&gt;$yum -y mod_python &lt;/em&gt;&lt;/p&gt;&lt;p&gt; SSL&lt;/p&gt;&lt;p&gt;&lt;em&gt;$yum -y mod_ssl&lt;/em&gt; &lt;/p&gt;&lt;p&gt;1.2 Instalación a través de Up2date&lt;/p&gt;&lt;p&gt;    Si utilizas Red Hat Enterprise Linux sólo basta ejecutar lo siguiente:&lt;/p&gt;&lt;p&gt;&lt;em&gt;$up2date -i httpd&lt;/em&gt;&lt;/p&gt;&lt;p&gt;(Nota. El parámetro '-i' indica install no es equivalente al -y de yum no confundiros).&lt;/p&gt;&lt;p&gt; Si se desea igual que antes soporte para Php/Mysql, Python o SSL bastará con ejecutar (Ahora lo incluiremos todo en una línea)&lt;/p&gt;&lt;p&gt;&lt;em&gt;$up2date -i php php-mysql mod_perl mod_python mod_ssl&lt;/em&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;2 Arrancando Apache&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;    Apache es un servicio que por fortuna sólo es necesario instalar e iniciar. No requiere modificaciones adicionales para su funcionamiento básico. Para añadir el servicio a los servicios que inician junto con el sistema, basta con ejecutar:&lt;/p&gt;&lt;p&gt;&lt;em&gt;$/sbin/chkconfig httpd on&lt;/em&gt; &lt;/p&gt;&lt;p&gt;Para iniciar el servicio por primera vez, sólo ejecuta:&lt;/p&gt;&lt;p&gt;&lt;em&gt;$/sbin/service httpd start&lt;/em&gt;&lt;/p&gt;&lt;p&gt;ó&lt;/p&gt;&lt;p&gt;&lt;em&gt;$service httpd start (si eres root)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Si el servicio ya está trabajando, también puedes utilizar reload para que Apache vuelva a leer la configuración sin interrumpir el servicio&lt;/p&gt;&lt;p&gt;&lt;em&gt;$/sbin/service httpd reload&lt;/em&gt; &lt;/p&gt;&lt;p&gt;Pero cuando instalas un módulo nuevo apache necesita cargarlo para ello lamentablemente debemos interrumpir el servicio aunque por un espacio muy reducido de tiempo usando:&lt;/p&gt;&lt;p&gt;&lt;em&gt;$/sbin/service httpd restart&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Bueno pues ya tenemos nuestro Apache (Ultima versión del repositorio) instalado con soporte para php si instalamos el módulo como se explicó arriba, por lo que ahora solo nos queda instalar el Mysql. &lt;/p&gt;&lt;p&gt;&lt;strong&gt; 3 Instalación de Mysql&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Si utilizas Red Hat Entreprise Linux, para instalarlo usaremos:&lt;/p&gt;&lt;p&gt;&lt;em&gt;$up2date -i mysql mysql-server&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Si por el contrario no dispones de up2date sino que usas sistemas White Box Enterprise Linux o bien clones de Red Hat como CentOS, ejecuta:&lt;/p&gt;&lt;p&gt;&lt;em&gt;$yum -y install mysql mysql-server&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Con el comando anterior descargarás la versión más actualizada de Mysql así como todas las dependencias de bibliotecas u otros software necesarios para su correcto funcionamiento.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4 Arrancando Mysql&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;     La manera más apropiada de iniciar el servicio mysqld será ejecutando el siguiente mandato:&lt;/p&gt;&lt;p&gt;&lt;em&gt;$/sbin/service mysqld start&lt;/em&gt; &lt;/p&gt;&lt;p&gt;Procederemos a agregar a Mysql al los niveles de corrida 3, 4 y 5 de modo que la siguiente vez que se tenga que iniciar el equipo Mysql se encuentre habilitado.&lt;/p&gt;&lt;p&gt;&lt;em&gt;$/sbin/chkconfig --level 345 mysqld on&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt; 4 Asignar password al usuario root de Mysql&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;    Cuando instalamos Mysql, esté deja la tarea de asignar el password de root al administrador de la máquina. Por este motivo es muy importante que no se nos olvide nunca este paso.&lt;/p&gt;&lt;p&gt;Para entrar en el MiniShell de Mysql cuando lo arracamos por primera vez como usuario root basta con ejecutar:&lt;/p&gt;&lt;p&gt;&lt;em&gt;$mysql&lt;/em&gt; &lt;/p&gt;&lt;p&gt;Ahora comprendereis la importancia que tiene asignar password de forma inmediata.&lt;/p&gt;&lt;p&gt;Primero podemos indicarle a mysql que nos liste todas las base de datos que albergar con el comando:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&gt; show databases;&lt;/em&gt; &lt;/p&gt;&lt;p&gt;Podemos comprobar que ahi una llamada mysql, la cual usaremos para cambiar su configuración.&lt;/p&gt;&lt;p&gt;Para selecionar la base de datos mysql, ejecutamos:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&gt; use mysql;&lt;/em&gt; &lt;/p&gt;&lt;p&gt;Una vez seleccionada la base de datos podemos listar todas las tablas que contiene con el siguiente comando:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&gt; show tables;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Podemos ver como existe una tabla User la cual contiene la lista de usuarios y sus password codificados, para visualizar esta información ejecutamos:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&gt; select Host, User, Password from user;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Como podeis comprobar el usuario root no tiene password asignado,  ahora procederemos a asignarle uno de la siguiente forma:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&gt; update us
