Trabajando con el Config en Laravel

laravel

Una de las potentes características con que poder crear y escalar una aplicación, es que facilita de un modo muy sencillo, desarrollar empleando el config en Laravel.

Esta flexibilidad para establecer y modificar parámetros de configuración, diferentes  y alternos, es parte de la magia que Laravel ofrece.

En el directorio config, podremos crear nuestra propia configuración de la api, no ya solo de modificar parámetros, sino además de crear nuestros propios archivos de configuración

Crear un archivo de configuración

Para crearlo basta con crear en la carpeta config, un nuevo file, a modo de ejemplo podemos llamarlo, sitios.php.

Siguiendo las convenciones de Laravel, un archivo de configuración es esencialmente un array de arrays que agrupa parámetros, o sea que con declarar un return que devuelva un arreglo vacío dentro, ya tendríamos un archivo listo.

Nuestro próximo paso será añadir las opciones que declararan el comportamiento que esperamos, por tanto siendo un array de array acepta matrices multidimensionales.

Supongamos que trabajaremos con tres tipos de sitios, sitio_grande, sitio_mediano y sitio_pequeño,  a los cuales nos interesa configurarles las opciones url, cookie, y el tiempo  de vida de esta; entonces creamos para ellos una matriz múltiples con sus parámetros:

 return [ 
     'sitio_grande' => [ 
                        'url' => '',
                        'cookie' => '',
                        'durac_cookie' => ''
             ], 
     'sitio_mediano' => [ 
                        'url' => '',
                        'cookie' => '',
                        'durac_cookie' => ''
             ],
     'sitio_pequeño' => [ 
                        'url' => '',
                        'cookie' => '',
                        'durac_cookie' => ''
             ],
     ]; 

En nuestro ejemplo no hemos dado valor a las variables, pues queremos asignarlos luego de modo dinámico, pero si no fuera necesario y tuviéramos valores únicos, el archivo pordria quedar configurado asi:

 return [ 
     'sitio_grande' => [ 
                        'url' => 'https://sitio_grande.com',
                        'cookie' => 'ksiwiwjwoiii99k393j33’303j0',
                        'durac_cookie' => '3600'
             ], 
     'sitio_mediano' => [ 
                        'url' => 'https://sitio_mediano.com',
                        'cookie' => 'msksnsossjwoiii5858484n33j0',
                        'durac_cookie' => '3600'              
 ],
     'sitio_pequeño' => [ 
                        'url' => 'https://sitio_pequeño.com',
                        'cookie' => '0siwiwj09090393j33’zjsjiwwj9',
                        'durac_cookie' => '3600'
             ],
     ]; 

Acceder a la configuración

Para acceder a la configuración podemos usar la fachada Config, y su método get, siguiendo la notación de punto. Podriamos acceder a la cookie del sitio mediano, de este modo:

dd(Config::get(‘sitios.sitio_mediano.cookie’);

Esto nos devolverá el valor de la configuración para el sitio medio, y su variable cookie.

La estructura es :

nombre_archivo_configuracion.nombre_array_nivel_superior.variable.

Para acceder a las variables y modificarlas, la fachada Config, dispone del método set, con el cual pasamos un array con dos valores: la ruta de la variable y el valor que estamos asignadole.

Config::set(‘sitios.sitio_mediano.cookie’,
’82828h2922992922n28282’);

Funcion Config()

Se puede acceder también a los parámetros de configuración mediante la función Config(), su diferencia con la fachada es que no usa métodos para ejecutarse

Para devolver los valores:

dd(config(‘sitios.sitio_mediano.cookie’);

 Para asignar valores:

config(‘sitios.sitio_mediano.cookie’,
’82828h2922992922n28282’);

o

config(‘[sitios.sitio_mediano.cookie’=>
’82828h2922992922n28282’]);

Para aprovechar de modo más integro y abarcador, las posibilidades de configuración de Laravel, podemos utilizar las variables de entorno, lo cual protege aún mas nuestros datos y su acceso.

La estructura que nos ofrece Laravel es hacer referencia a los valores que hemos establecido en el archivo env.  donde guardamos las variables de entorno. En nuestro ejemplo nuestro archivo sitios.php quedaría así:

 return [ 
     'sitio_grande' => [ 
                        'url' => env('URL_SITIO_GRANDE'),
                        'cookie' => env('COOKIE_SITIO_GRANDE'),
                        'durac_cookie' => ' env('DURAC_ COOKIE_SITIO_GRANDE')
             ], 
     'sitio_mediano' => [ 
                        'url' => env('URL_SITIO_MEDIANO'),
                        'cookie' => env('COOKIE_SITIO_MEDIANO'),
                        'durac_cookie' => ' env('DURAC_COOKIE_SITIO_MEDIANO')
 ],
     'sitio_pequeño' => [ 
                        'url' => env('URL_SITIO_PEQUEÑO'),
                        'cookie' => env('COOKIE_SITIO_PEQUEÑO'),
                        'durac_cookie' => ' env('DURAC_COOKIE_SITIO_PEQUEÑO')
             ],
     ]; 

Para lograr esto bastara con haber añadido en el archivo env los valores que esperamos recibir.

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

…..subir montañas, hermana hombres……

Usando hashlib en Python

logo python

Cuando hablamos de encriptado a usar, una de las herramientas es librería hashlib en Python, que nos va a permitir trabajar con un tipo de encriptado conocido como SHA

Python nos ofrece multiples librerías con valor incalculable para todo el tema de criptografía, pero hashlib es una de las mas usadas.

Su nombre proviene del inglés, ( Secure Hash Algorithms ), y su labor consiste en crear estructuras seguras, mediante funciones de encriptado, que puedan ser utilizados por diferentes lenguajes de modo transversal.

Los algoritmos o funciones SHA con que trabaja haslib, son varios(‘sha256', 'sha384', 'sha224', 'sha512', 'sha1'), con diferentes tamaños de bloque

hashlib, posee dos funciones asociadas, que usaremos al aplicar las transformaciones:

  • encode() : Convierte las cadenas en bytes, para que la funcion hash pueda procesarla.
  • hexdigest() : Devuelve el dato codificado en formato hexadecimal.

Haremos una pequeña demostración de su uso:

Introduciremos un cadena  y la convertiremos a su equivalencia en bytes utilizando la funcion enconde(),  para que la funcion SHA  pueda manipularla, esta la codifica con hexdigest(), e imprimimos la cadena resultante

import hashlib 
import hashlib 
   
 # valor de entrada 
 str = "el comienzo de todo"
   
 result = hashlib.sha256(str.encode()) 
  
 # Imprimiendo el valor hexadecimal. 
 print("El resultado es: ") 
 print(result.hexdigest()) 
 print ("\r") 
  
 # salida: El resultado es: 
 9f78aef8f9e252913e43156c570568592f014cb0175d52a6071a5eed8959e183
    
   
 # valor de entrada 
 str = " el comienzo de todo "
  
 result = hashlib.MD5(str.encode()) 
   
 # Imprimiendo el valor hexadecimal. 
 print("El resultado es: ") 
 print(result.hexdigest())
 # salida: El resultado es: 3455ed58e2999e23fc7385207e4fb999 

Y listo esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

…. hay que levantarse cada mañana con una esperanza y dormirse cada noche con una meta….

El uso de Having y Raw

laravel

La combinación de las clausulas having  y  raw, nos ayudará, crear consultas más básicas

Por ejemplo, si necesitamos crear una consulta que devuelva  la cantidad de productos que correspondan a aquellas categorías cuyo id sea mayor de 1.

Podemos entonces construir la consulta de este modo.

 Raw  indicara el carácter directo de la consulta, group by  agrupará  a los productos por categoría, Count  los contará y  Having devolverá aquellos con categoría  >1

SELECT *, COUNT(*) FROM products GROUP BY category_id HAVING count(*) > 1;

DB::table('products')
	->select('*', DB::raw('COUNT(*) as products_count'))
	->groupBy('category_id')
	->having('products_count', '>', 1)
	->get();

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

Subir montañas hermana a los hombres……

Supuestos del modelo de regresión lineal

Como todo modelo estadístico, existen supuestos del modelo de regresión lineal, cuyo cumplimiento son necesarios para  validar su confiabilidad.

Esto supuestos o condiciones, constituyen la base teórica del análisis, por lo que su incumplimiento, impide su ejecución de forma tacita.

Esto quiere decir que antes de intentar aplicar el modelo de regresión lineal, a nuestros datos, es necesario examinar los supuestos que lo condicionan.

En algunos de estos , como en los de independencia, homocedasticidad y normalidad, estrechamente relacionados con los residuos, nos será de mucha ayuda observar en detalle, el comportamientos de estos.

Los supuestos son:

Independencia.

Los residuos son independientes entre sí, es decir, los residuos constituyen una variable aleatoria.

Cuando se trabaja con series temporales, podemos hallar residuos autocorrelacionados entre sí.

Linealidad.

La ecuación de regresión, posee una forma particular que responde a una recta. A partir de ello, se dan como característica que la variable dependiente constituye la suma de un conjunto de elementos que son: el origen de la recta, una combinación lineal de variables independientes o predictoras y los residuos.

Este  supuesto puede incumplirse por varias causas, como por ejemplo la no linealidad (la relación entre las variables independientes y la dependiente no es lineal), la no aditividad (el efecto de alguna variable independiente es sensible a los niveles de alguna otra variable independiente), la omisión de variables independientes  que son importantes para el estudio, la  inclusión de variables independientes irrelevantes,  parámetros cambiantes (los parámetros no permanecen constantes durante el tiempo que dura la recogida de datos), entre otros.

 A este incumplimiento se le denomina error de especificación y es fácilmente predecible observando el diagrama de dispersión.

También el uso de gráficos parciales, ayudará a observar la linealidad entre las variables,  al ser herramientas que ofrecen una representación espacial, de la relación neta entre dos variables.

Homocedasticidad.

Para cada valor de la variable independiente (o combinación de sus valores), la varianza de los residuos es constante.

Normalidad.

Para cada valor de la variable independiente (o combinación de sus valores), los residuos se distribuyen normalmente con media cero.

No-colinealidad.

No existe relación lineal exacta entre ninguna de las variables independientes.

El incumplimiento de este supuesto da origen a colinealidad o multicolinealidad en dependencia de las variables que afecte.

La no-colinealidad, no tiene  por supuesto sentido en  el análisis de regresión simple,  ya que para su análisis es necesaria la existencia de más de una variable independiente.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

Puedo absorber tus pecados, pero no vivir tu vida.

Y

Programación lineal. Conceptos básicos.

Este post se titula Programación lineal. Conceptos básicos, y eso es porque hablaremos de los elementos mas importantes sobre el tema, con la limitación de espacio propia de un blog, como este.

Haciendo un ligero esbozo histórico, diré que la programación lineal, es una técnica que surgió en el primer tercio del siglo XX, y fue desarrollada, aplicándola a situaciones reales  para resolver problemas relacionados, con la programación, el transporte, y logística en los años, de la segunda guerra mundial.

Su creador fue el matemático ruso L. Kantorovich, y su aplicación inicial tuvo que ver con una optimización de los programas de  fabricación.

Sin embargo su aceptación, se extendió rápidamente a la economía y para 1950  el matemático estadounidense George Dantzig creó el primer algoritmo.

La programación lineal en esencia, es una función compleja que intenta determinar a partir de un conjunto de variables conocida, su influencia optima en determinados resultados.

Componentes de un problema de programación lineal

Las variables de decisión:

Son las cantidades, volúmenes o comportamientos, que se intentan estimar, como resultado.

La función objetivo:

Es la expresión matemática que intenta optimizar (maximizar o minimizar), algún valor numérico que representa ganancias, costos, cantidad de producción, volumen de inversión, etc;

Su razón de ser es evaluar, en qué medida cada variable de decisión contribuye al valor neto de una actividad económica especifica.

Coeficiente de la función:

Expresa la cantidad en la que el valor de la función objetivo cambiaría cuando se modifica una unidad de una variable de decisión, viene dada por el coeficiente de función objetivo correspondiente.

Restricciones:

Las restricciones son ecuaciones que limitan o definen la cantidad total de un recurso particular, que es necesario o requerido para llevar a cabo las actividades que decidirían el nivel de optimización de las variables de decisión.

Restricciones no negativas.

Una condición obligatoria de este tipo de restricciones, es que tienen que ser positivas con independencia, de que el objetivo de la función sea maximizar o minimizar el valor.

La solución óptima de un problema de programación lineal, es aquella que satisfaga mejor las restricciones.

Esto quiere decir que de todas las soluciones factibles.

será óptima aquella que en el caso de una necesidad de maximización, el valor de la función objetivo sea el mayor posible, o sea el máximo.

Por el contrario, si nos encontramos ante un problema de minímización , la solución más adecuada será aquella donde la función objetivo ofrezca el mínimo.

Recursos disponibles

Constituyen los materiales, recursos, o elementos que participan en la ecuación y sobre los que se aplica la misma

Coeficientes tecnológicos

Cuando intentamos prever el futuro a través de la programación lineal, es importante considerar las limitaciones técnicas que nos impone la realidad objetiva y el entorno.

Los coeficientes tecnológicos, son elementos de referencia que conocemos y sobre los que se mueve el fenómeno que necesitamos estimar.  

La estructura de un problema de programación lineal debería ser algo como esto

Maximize  20* vd1 + 18*vd2; subject to
0.25*vd1 + 1*vd2  ≤60
1.40*vd1  + 0.5*vd2 ≤ 90 where vd1 & vd2 ≥ 0

Aquí podemos identificar los diferentes componentes:

vd1 y vd2 son las variables de decisión

Maximize  20* vd1 + 18*vd2 es la función objetivo

20* vd1  y  18*vd2 son los coeficientes de la función

0.25*vd1 + 1*vd2  ≤  60 la primera restricción

1.40*vd1  + 0.5*vd2  ≤  90 segunda restricción

vd1 & vd2  ≥ 0 restricción negativa

0.25, 1, 1.40, 0.5 son los coeficientes tecnológicos

65, 90 es la disponibilidad de recursos

Elementos importantes de la Programación lineal

Potenciación

Partimos de considerar que las variables de decisión, siempre tienen una potencia de uno.

La condición critica

Para poder aplicar un problema  de programación lineal, es necesario tener definidas: la función objetivo, la disponibilidad de recursos y las variables de decisión positivas relacionadas entre sí.

Dualidad

Todo problema de programación lineal, puede convertirse a  su par correspondiente,  capaz de dar la misma solución factible de la función objetivo.

Esto lo puede hacer de modo automático el programa con el que trabajemos, pero conocer su esencia es importante.

Cuando se trata, por ejemplo de un problema de maximización, por lógica todas las restricciones asociadas con su función objetivo serán del tipo «menor que igual a» la disponibilidad de recursos dada, (podría ser solo «igual a», en el caso de una   restricción en particular restringida)

Si eso no sucediese y alguna restricción fuera del tipo «mayor que igual a» lo recomendable es convertir la solución a una forma canónica (multiplicar por un «menos») para que la restricción del problema de maximización se transforme en «menor que igual a» .

Por oposición si fuera un problema de minimización, entonces todas las restricciones asociadas con la función objetivo deben tener restricciones «mayor que igual a» a la disponibilidad de recursos considerada, a menos que exista alguna restricción que particularmente no esté restringida (tipo «igual a»), lo adecuado es multiplicar por -1, para convertirlas. 

Antes de la dualidad

Antes de proceder con un ejercicio de dualidad es necesario que las variables de decisión sean igual  mayor que cero, de no ser asi necesitan ser transformadas de forma canonical.

En Python, podemos trabajar los problemas de programación lineal con Ipsolve.

Por ultimo, decir que la programación lineal, se basa en la creación de modelos cuando el problema que necesitamos resolver tiene solo funciones lineales, esto es :

Tenemos variables de decisión conocidas y queremos saber que influyen en un problema dado.

Dicho de otro modo: el concepto programación lineal  no se enmarca dentro de la programación de computadoras, sino que se refiere a escoger una vía de solución cuando el modelo matemático del problema contiene solo funciones lineales

Este articulo, pretende solo ser un esbozo de los conceptos más básicos de la solución a problemas de programación lineal.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

«… y yo tenia respuesta a todas sus preguntas, incluso a las que aún no se ha hecho.»

Y

Crear Consultas de la base de datos caché

laravel

Laravel simplifica bastante, el acto de crear consultas de la base de datos caché.

Esto permite al framework limitar las consultas repetidas a la base de datos, poniendo a nuestra disposición llamadas al  método que maneja la  caché.

Pongamos como ejemplo que tenemos una tabla ‘consultas’, que se actualiza poco y a la cual necesitamos acceder, muchas veces, para incorporar sus datos en algún analisis.

Lo que nos permite Laravel es almacenar estas consultas en cache  durante  un tiempo, ene nuestro ejemplo colocamos  60 minutos y acceder a ellas mediante el uso de remember, sin tocar la BD

$consultas = Consulta::remember(60)->get();

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

Subir montañas hermana hombres……..

TypeError: argument of type ‘NoneType’ is not iterable. Python

python error

El error, TypeError: argument of type ‘NoneType’ is not iterable, que Python lanza, obedece, según mi experiencia, a casos en que una función con una declaración  condicional (if, else, case, etc) no devuelve un resultado o lo  devuelve vacío.

Si esto sucede, Python devuelve un valor por defecto que es None, el cual no es iterable, por tanto en la próxima iteración lanzara un error.

La solución a esto, es detener la iteración en casos donde pueda haber un valor vacío (por ejemplo utilizando break), o añadiendo acciones (por ejemplo con while), de modo que se solucione o detenga la iteración.

«Puedo absorber tus pecados, pero no vivir tu vida.»

Y

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

El uso del método update

laravel

El método update es el encargado de retornar las columnas afectadas por un acción, veámoslo debajo

$cantidad = $casas->whereNull('categoria_id')->update(['categoria_id' => 2]);

Aquí update nos devuelve el número de registros o filas donde se cumple el planteamiento, asignar el valor 2 a aquellas casas donde categoría_id es null

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

….Un sueño es más que todo  y casi nada……

Open para abrir archivos en Python

logo python

Normalmente empleamos open para abrir archivos en Python, y aunque tenemos diferentes formas, la más común es open(),.

Intentaré explicar en este post, su uso. 

Python nos ofrece open(), que es una función que devuelve un objeto del tipo file.

La sintaxis de la función open() es:

open(file, mode)

El parámetro file, ofrece la ubicación del archivo que intentamos abrir, ya sea una url o una uri.

mode nos permite definir que haremos con ese objeto.

'r'    Read: nos permite leer el documento. Viene dado como parámetro por defecto, abre el file o nos lanza un error si este no existe

'a'   Append: Abre el archivo para añadirlo y lo crea si este no existe.

'w'  Write: Abre el archivo para escribir sobre el, y al igual que a crea el archivo si este no existe.

'x'   Create: Crea el archivo indicado y devolverá un error si este no existe.

't'   Text: nos permite indicar que usaremos el archivo en modo texto, y es el valor por defecto de la función.

'b'   Binary: Nos permite manejar el archivo en modo binario, por ejemplo para trabajar con imágenes.

El formato más común de apertura utilizando open() es:

variable = open('archivo_prueba.txt')

Como los valores 'r' y 't' del parámetro mode, están establecidos por defecto, el ejemplo anterior, sería lo mismo que escribir:

variable = open('archivo_prueba.txt', 'rt')

Si pudiera detenerme a ver pasar el tiempo,… pues no sabría que hacer con el

Y

Translate »