miércoles, 16 de noviembre de 2022

Instalación de Framework Laravel

Laravel necesita un servidor web. No importa cuál sea pero la mayoría de la comunidad usa Apache o Nginx, por lo que es recomendable instalar uno de los dos para cuando se necesite buscar información sobre solucionar problemas.

Instalación de XAMPP (Windows)

XAMPP es un programa que nos ofrece una distribución de Apache, MySQL, PHP y Perl muy simple de instalar, administrar y utilizar. Podemos descargarlo aquí.

Instalación de LAMP (Linux)

LAMP es el conjunto de aplicaciones Apache, MySQL, PHP o Python en entornos Linux que nos facilitan el desarrollo de sistemas.

En Ubuntu o derivadas podemos instalarlo con los siguientes comandos:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install lamp-server^
sudo apt-get install php5-mcrypt
sudo php5enmod mcrypt

Después de tener instalado nuestro Servidor web, es necesario instalar Composer el cuál es un gestor de dependencias php muy útil y del cuál se hablará más tarde.

Instalación de composer (Windows)

La forma más sencilla de instalar Composer en tu ordenador Windows consiste en descargar y ejecutar el archivo Composer-Setup.exe, que instala la versión más reciente de Composer y actualiza el PATH de tu ordenador para que puedas ejecutar Composer simplemente escribiendo el comando composer.

Instalación de composer (Linux)

En ubuntu bastará con ejecutar los siguientes comandos en la terminal.

sudo apt-get install curl
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo echo 'PATH=$PATH:~/.composer/vendor/bin' >> ~/.profile

Instalación de Laravel

Existen diferentes formas de instalar laravel en nuestra computadora.

  • Podemos clonar el repositorio Laravel de github.
  • Usando el instalador:
    composer global require "laravel/installer=~1.1"
    laravel new Proyecto
    
  • Usando composer:
    composer create-project laravel/laravel --prefer-dist Proyecto
    
    Una vez instalado laravel es recomendable situarse en la raíz del proyecto y ejecutar:
    composer update
    php artisan key:generate
    php artisan app:name Curso

viernes, 11 de noviembre de 2022

Activar módulo rewrite de Apache en Ubuntu

El módulo rewrite es un módulo de la aplicación Apache que permite modificar la URL de un sitio. Este módulo viene desactivado por defecto.
Para activarlo en Ubuntu se utiliza el comando a2enmod que permite pasar los módulo disponibles de apache del directorio /etc/apache2/mods-available al directorio /etc/apache2/mods-enabled

$ sudo a2enmod rewrite

Se debe indicar donde se quiere aplicar el módulo, con lo cual se abre el archivo de configuración del sitio en efecto:

$ sudo gedit /etc/apache2/sites-enabled/000-default

Y se reemplaza "AllowOverride None" por "AllowOverride All" donde se quiera aplicar el cambio.
Por último se reinicia el Apache:

$ sudo /etc/init.d/apache2 force-reload

lunes, 8 de marzo de 2021

Fatal error base address marks unusable memory region (Opcache error - Local by Flywheel)

Lenguaje: Wordpress - Flywheel

Desarrollado para:  Aplicación web.

Luego de una instalación local normal de Local (de Flywheel) en un SO Windows 7, comienza la descarga e instalación de Wordpress y antes de poder iniciar el servidor, muestra el siguiente mensaje de error

 


Para poder corregir este error, debemos realizar lo siguiente:

  • Ir al archivo php.ini.hbs, que debe estar en la siguiente ruta: 
    • "C:\Users\[usuario de windows]\Local Sites\[nombre del sitio]\conf\php"
  • Dentro del archivo, ir a la sección Opcache y agregar las siguientes 2 lineas:

opcache.file_cache="C:\Windows\temp\php_opcache"
opcache.file_cache_fallback=1_

  • Luego guardar el archivo y reiniciar el sitio. Con eso debería iniciar correctamente. 

martes, 29 de septiembre de 2020

Cambio del valor propiedad en href con Javascript

Lenguaje: Javascript
Desarrollado para: Aplicación Web

Para cuando es necesario cambiar el valor de un parámetro (codigo) en un link a href, según el valor seleccionado en un combobox/select


//Función para el select, evento "change". Cuando se selecciona un valor, llama a la función que cambia el valor del link (change_link

$("#id-select").change(function(){
      change_link();
});


//Función que cambia el valor del parámetro del link

function change_link(){
    var val = $("#id-select option:selected").val();    // Selecciona el valor seleccionado en el select - ej.: 34
    $("#link").each(function(){
        var nhref = "";
        var href = $(this).attr("href").split("=");     // Obtiene el valor del link "href" y lo divide en un arreglo 
                                                                                             // - ej.: [pagina.php?codigo][]"
        nhref += href[0]+"=";                                 //Obtiene lo de la primera posición - ej.: pagina.php?codigo=
        nhref += val;                                               //Pega el valor del select - ej.: pagina.php?codigo=34
        $(this).attr("href",nhref);                            //Coloca el valor en el atributo "href"
    });
}

miércoles, 8 de mayo de 2019

HashtableUtil - Pasar una lista tipificada a Hashtable, utilizando Reflection


Lenguaje: C#
Desarrollado para: Aplicación de Consola C#

Clase que permite transformar una lista de valores en Hashtable y todas las listas que tanga asociadas, llamandose recursivamente.


using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;


namespace Util
{
    /// <summary>
    /// Clase que permite transformar un objeto en hashtable
    /// </summary>
    public class HashtableUtil
    {
        /// <summary>
        /// Clase que permite generar un Hashtable de una lista de objetos, por su tipo.
        /// </summary>
        /// <typeparam name="T">Tipo de objeto al que pertenece la lista</typeparam>
        /// <param name="objetos" />
        /// <returns></returns>
        public static Hashtable ObtieneHash<t>(List<t> objetos)
        {
            // obtiene las propiedades del tipo de objeto y las guarda en un arreglo
            PropertyInfo[] props = typeof(T).GetProperties();

            // se ordenan las propiedades por nombre
            Array.Sort(props ,delegate (PropertyInfo propertyInfo1, PropertyInfo propertyInfo2)
            { return propertyInfo1.Name.CompareTo(propertyInfo2.Name); });

            int indexProp = 0;
            // recorre las propiedades, para encontrar el indice de la propiedad "cod_code"
            foreach (PropertyInfo propertyInfo in props)
            {
                if (propertyInfo.Name.ToUpper().Equals("CODCODE")) { break; }
                indexProp++;
            }

            bool usaCorrelativo = false;
            if (indexProp &gt;= props.Length) { usaCorrelativo = true; }


            // se recorre la lista de objetos para guardar los objetos con su codigo asociado
            Hashtable retorno = new Hashtable();
            // indice de las propiedades
            int indice = 0;
            foreach (T obj in objetos)
            {
                //se crean los objetos a utilizar
                Hashtable ht = new Hashtable();
                List<object> lista = new List<object>();

                foreach (PropertyInfo propertyInfo in props)
                {
                    // se obtiene el tipo (type) de la propiedad y se compara con el tipo de la lista
                    Type tipo = ((T)obj).GetType().GetProperty(propertyInfo.Name).PropertyType;
                    if (tipo.Name == lista.GetType().Name)
                    {
                        // si es una lista, se obtiene el valor (T) de la lista
                        Type itemTipo = tipo.GetGenericArguments()[0];
                        // se crea un MethodInfo con el mismo método, pasandole el tipo de la lista
                        MethodInfo mi = typeof(HashtableUtil).GetMethod("ObtieneHash", BindingFlags.Static | BindingFlags.Public);
                        MethodInfo mi2 = mi.MakeGenericMethod(new Type[] { itemTipo });
                        // Invocamos el método con los valores obtenidos de la propiedad
                        ht[propertyInfo.Name] = mi2.Invoke(null, new object[] { ((T)obj).GetType().GetProperty(propertyInfo.Name).GetValue(obj, null) });
                    }
                    else
                    {
                        // si no es una lista, se mete directo el valor del objeto, con su nombre de propiedad.
                        ht[propertyInfo.Name] = ((T)obj).GetType().GetProperty(propertyInfo.Name).GetValue(obj, null);
                    }
                }

                if (usaCorrelativo)
                    retorno[indice.ToString()] = ht;
                else
                {
                    string nombrePropiedad = props[indexProp].Name;
                    // se coloca el código como key en el Hashtable de retorno, asociando su misma hashtable de valores.
                    retorno[((T)obj).GetType().GetProperty(nombrePropiedad).GetValue(obj, null).ToString()] = ht;
                }
                indice++;
            }
            return retorno;

        } 
    }
}

miércoles, 27 de diciembre de 2017

Clase GIF para WPF


Lenguaje: C#
Desarrollado para: Aplicación de Consola C#

Clase que permite utilizar imagenes GIF animadas en aplicaciones de escritorio con WPF
  • En el Summary de la misma clase aparece la descripción de como utilizarla, invocando un control en el archivo XAML.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Media.Animation;

namespace Miro.Utils
{
    /// 
    /// Clase para utilizar imagenes GIF en WPF
    /// Forma de utilizar: 
    /// * Primero indicar el namespace en el archivo XAML
    /// Ej.:xmlns:local="clr-namespace:WpfApplication1"
    /// * Segundo invocar el control del tipo indicado anteriormente (local), 
    /// indicando en la propiedad GifSource la ruta de la imagen a utilizar
    /// Ej.:""
    /// 
    public class GifImageUtils : Image
    {
        private GifBitmapDecoder _decoder;
        private Int32Animation _animation;

        #region FrameIndex

        public static readonly DependencyProperty FrameIndexProperty = DependencyProperty.Register("FrameIndex", typeof(int), typeof(GifImageUtils), new UIPropertyMetadata(0, new PropertyChangedCallback(ChangingFrameIndex)));

        public int FrameIndex
        {
            get { return (int)GetValue(FrameIndexProperty); }
            set { SetValue(FrameIndexProperty, value); }
        }

        private static void ChangingFrameIndex(DependencyObject obj, DependencyPropertyChangedEventArgs ev)
        {
            GifImageUtils gifImage = obj as GifImageUtils;
            gifImage.ChangeFrameIndex((int)ev.NewValue);
        }

        private void ChangeFrameIndex(int index)
        {
            Source = _decoder.Frames[index];
        }

        #endregion

        #region GifSource

        public static readonly DependencyProperty GifSourceProperty = DependencyProperty.Register("GifSource", typeof(string), typeof(GifImageUtils), new UIPropertyMetadata(String.Empty, new PropertyChangedCallback(GifSourceChanged)));
        public string GifSource
        {
            get { return (string)GetValue(GifSourceProperty); }
            set { SetValue(GifSourceProperty, value); }
        }

        private static void GifSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs ev)
        {
            GifImageUtils gifImage = obj as GifImageUtils;
            gifImage.GifSourceChanged(ev.NewValue.ToString());
        }

        private void GifSourceChanged(string newSource)
        {
            if (_animation != null)
                BeginAnimation(FrameIndexProperty, null);

            _decoder = new GifBitmapDecoder(new Uri(newSource), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
            Source = _decoder.Frames[0];

            int count = _decoder.Frames.Count;
            _animation = new Int32Animation(0, count - 1, new Duration(new TimeSpan(0, 0, 0, count / 10, (int)((count / 10.0 - count / 10) * 1000))));
            _animation.RepeatBehavior = RepeatBehavior.Forever;
            BeginAnimation(FrameIndexProperty, _animation);
        }

        #endregion
    }
}

martes, 5 de julio de 2016

Error al convertir aplicación VS2008 en VS2012 - The primary reference "xxxxx.dll" could not be resolved because it has an indirect dependency on the .NET Framework assembly

Al abrir la solución de una aplicación de escritorio (WPF/C#) desarrollada en Visual Studio 2008 en un Visual Studio 2012, luego de realizar la conversión de los proyectos, envía el siguente error/warning:

The primary reference "X:\xxxx\xxx\xxx.dll" could not be resolved because it has an indirect dependency on the .NET Framework assembly "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework

Aunque se cambie el Framework utilizado por el proyecto que genera la dll con problemas, sigue saliendo este error.
Para corregir esto, se debe editar el proyecto donde se referencia la dll con problemas (click derecho -> abrir con...) y buscar la linea donde se encuentra la referencia:

<ProjectReference Include="..\xxxxx\PROYECTO.csproj">
<Project>{8DD71CAF-BEF7-40ED-9DD0-25033CD8009D}</Project><Name>PROYECTO</Name>
</ProjectReference>
Se debe agregar la etiqueta "SpecificVersion" en "true", para que el proyecto pueda generar la dll en la versión que se ha estacificado del Framework .NET

<ProjectReference Include="..\xxxxx\PROYECTO.csproj">
<Project>{8DD71CAF-BEF7-40ED-9DD0-25033CD8009D}</Project><Name>PROYECTO</Name>
<SpecificVersion>true</SpecificVersion>
</ProjectReference>