Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - EdePC

#811
Bases de Datos / Re: Trigger SQL
29 Mayo 2020, 14:33 PM
- La sintaxis varía dependiendo del Motor de Base de Datos, en mi caso utilicé SQL Server. ¿Qué Motor estás utilizando? => SQL Server, MySQL, PosgreSQL, SQLite, Oracle, etc, etc...
#812
Programación C/C++ / Re: Punteros
29 Mayo 2020, 02:30 AM
Saludos,

- El tema de los punteros es un lío XD, yo no lo acabo de digerir completamente, cada vez que los necesito le echo una ojeada a este Paper: https://openlibra.com/es/book/introduccion-a-los-punteros-en-c al menos dándole un par de leídas y poniéndolo en práctica lo entiendo por un tiempo :xD




- Wow, yo pensé que los punteros eran simples direcciones de memoria, pero al parecer son rangos de direcciones de memoria donde el tamaño del rango es el tipo de variable.

- Estoy haciendo el siguiente experimento intentando sumarle +1 al puntero para que apunte al siguiente caracter pero no lo hace, este le suma +4 porque el tipo es int. Pero si lo hago con char me manda una advertencia el compilador:

Código (c,8) [Seleccionar]
/* Realice un programa que tenga una función que mediante apuntadores pueda transformar un
número entero en una cadena de caracteres formada por los dígitos del número entero. */

#include <stdio.h>

int main() {
  int numero = 1869898055; // "Gato" en decimal litle endian
  int *puntero = &numero;
  printf("Puntero - 1 = %p\n", puntero - 1);
  printf("Puntero     = %p\n", puntero);
  printf("Puntero + 1 = %p\n", puntero + 1);
  for (int i = 0; i < 4; i++) {
    printf("%c", *puntero);
    puntero += 1;
  }
  return 0;
}


CitarC:\Users\EdSon\Desktop>gcc punteros.c -o punteros.exe && punteros.exe
Puntero - 1 = 0028FF20
Puntero     = 0028FF24
Puntero + 1 = 0028FF28
G☺,Ç

Código (c,8) [Seleccionar]
/* Realice un programa que tenga una función que mediante apuntadores pueda transformar un
número entero en una cadena de caracteres formada por los dígitos del número entero. */

#include <stdio.h>

int main() {
  int numero = 1869898055; // "Gato" en decimal litle endian
  char *puntero = &numero;
  printf("Puntero - 1 = %p\n", puntero - 1);
  printf("Puntero     = %p\n", puntero);
  printf("Puntero + 1 = %p\n", puntero + 1);
  for (int i = 0; i < 4; i++) {
    printf("%c", *puntero);
    puntero += 1;
  }
  return 0;
}


Citar
C:\Users\EdSon\Desktop>gcc punteros.c -o punteros.exe && punteros.exe
punteros.c: In function 'main':
punteros.c:8:19: warning: initialization of 'char *' from incompatible pointer type 'int *' [-Wincom
patible-pointer-types]
    8 |   char *puntero = &numero;
      |                   ^
Puntero - 1 = 0028FF23
Puntero     = 0028FF24
Puntero + 1 = 0028FF25
Gato
#813
Bases de Datos / Re: SQL editor
29 Mayo 2020, 02:08 AM
- Para SQL Server recomiendo SQL Server Management Studio Express, yo trabajo con la 2008R2, las nuevas versiones pesan varios Gigas XD.

- Para MySQL tienes MySQL WorkBench, aunque yo prefiero PHPMyAdmin

- Un Editor gratuito y universal es HeidiSQL

- Depende mucho del tipo de ayuda que necesites, yo utilizo SublimeText para formatear mi código debido al autocompletar, cursores múltiples, etc. Para ejecutar el código SQL Server Management Studio o PHPMyAdmin o HeidiSQL
#814
Bases de Datos / Re: Trigger SQL
29 Mayo 2020, 02:03 AM
Saludos,

- Veo unas discrepancias entre tu modelo de datos, el enunciado y tus ejemplos ... Por ejemplo si yo inserto '33333333Z' no es lógico que se guarde '33333333W' como nuevo_valor XD. Por otro lado si actualizo '33333333Z' a '22222222H', lo lógico que se guarde como nuevo _valor '33333333Z' XD

- Voy a considerar lo que yo considero lógico, luego puedes hacer las correcciones que veas convenientes. Además voy a suponer que estás utilizando Microsoft SQL Server, si no es el caso puedes avisar.

Código (sql) [Seleccionar]
/*
USE master
DROP DATABASE db_prueba
*/

CREATE DATABASE db_prueba
GO
USE db_prueba

CREATE TABLE tb_persona (
  dni    CHAR(9),
  nombre VARCHAR(50)
)

INSERT INTO tb_persona VALUES
( '11111111X', 'jaimico' )

CREATE TABLE tb_logs (
  accion      CHAR(6),
  nuevo_valor CHAR(9),
  viejo_valor CHAR(9)
)

GO
CREATE TRIGGER tr_persona_insert ON tb_persona
AFTER INSERT AS
INSERT INTO tb_logs VALUES
( 'insert', (SELECT dni FROM INSERTED), NULL )

GO
CREATE TRIGGER tr_persona_delete ON tb_persona
AFTER DELETE AS
INSERT INTO tb_logs VALUES
( 'delete', NULL, (SELECT dni FROM DELETED) )

GO
CREATE TRIGGER tr_persona_update ON tb_persona
AFTER UPDATE AS
INSERT INTO tb_logs VALUES
( 'update', (SELECT dni FROM INSERTED), (SELECT dni FROM DELETED) )

///////////////////////////////////
INSERT INTO tb_persona VALUES
('33333333Z', 'paco')
SELECT * FROM tb_logs

DELETE FROM tb_persona
WHERE dni = '11111111X'
SELECT * FROM tb_logs

UPDATE tb_persona
SET dni = '22222222H'
WHERE dni = '33333333Z'
SELECT * FROM tb_logs


Mis resultados:
+--------+-------------+-------------+
| accion | nuevo_valor | viejo_valor |
+--------+-------------+-------------+
| insert | 33333333Z   | NULL        |
+--------+-------------+-------------+
| delete | NULL        | 11111111X   |
+--------+-------------+-------------+
| update | 22222222H   | 33333333Z   |
+--------+-------------+-------------+


- En SQL Server exiten las tablas predeterminadas INSERTED y DELETED que solo existen para los TRIGGER, dependiendo de la Acción realizada estos contienen los campos Insertados, Actualizados o Eliminados:

Citar+--------+-----------------------------------+-----------------------------------+
| Acción | INSERTED                          | DELETED                           |
+--------+-----------------------------------+-----------------------------------+
| INSERT | Filas insertadas                  | NULL                              |
+--------+-----------------------------------+-----------------------------------+
| UPDATE | Filas despues de ser actualizadas | Filas antes de ser actualizadas   |
+--------+-----------------------------------+-----------------------------------+
| DELETE | NULL                              | Filas eliminadas                  |
+--------+-----------------------------------+-----------------------------------+
#815
Desarrollo Web / Re: Duda funcion javascript
28 Mayo 2020, 23:12 PM
Saludos,

- Lo siguiente me funciona a mí según e entendido tu enunciado:

Código (javascript) [Seleccionar]
<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <script>
   var charSet = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz0123456789"

   function addInfo() {
     var lista = document.getElementById("lista")
     // Tamaño del String aleatorio es entre 3 a 10 caracteres
     lista.innerHTML += "<li>" + genStringAleatorio(numAleatorio(3, 10)) + "</li>"
   }
   function genStringAleatorio(tam) {
     var stringAleatorio = ""
     for (var i = 0; i < tam; i++) {
       // Se va extrayendo un caracter aleatorio desde el charSet
       stringAleatorio += charSet[numAleatorio(0, charSet.length - 1)]
     }
     return stringAleatorio
   }
   function numAleatorio(min, max) {
     // Genera un número aleatorio entre min y max incluyéndolos
     return Math.floor( Math.random() * (max + 1 - min) ) + min
   }
 </script>
</head>
<body>
 <ul id="lista">
   <li>Lorem ipsum dolor sit amet</li>
   <li>Consectetuer adipiscing elit</li>
   <li>Sed mattis enim vitae orci</li>
   <li>Phasellus libero</li>
   <li>Maecenas nisl arcu</li>
 </ul>
 <input type="button" value="Añadir elemento" onclick="addInfo()">
</body>
</html>


- HTML5 es soportado completamente en la actualidad, mejor usar esa sintáxis. Con respecto al javascript yo prefiero seguir utilizando la sintáxis clásica, al menos por este año más XD.

- Dependiendo de la complejidad de los elementos a crear suele ser mejor utilizar innerHTML para cosas muy sencillas, luego createElement() para cosas algo más complejas y documentFragment para crear elementos complejos con muchos sub-elementos como formularios o árboles de elementos.
#817
Saludos,

- Si son imágenes pues te las descargas y conviertes a vídeo XD. Lo normal sería descargarlas con wget o curl y luego tratarlas con tu editor de vídeo preferido, en mi caso VirtualDub, MovieMaker, el propio editor de Windows o simplemente ffmpeg:

Código (dos) [Seleccionar]
curl -O http://estamay.diacert.com/videos/1154/414095017/[1-50].JPG
ffmpeg -i %d.JPG video.mp4


- cURL para Windows: https://curl.haxx.se/windows/
- FFMPEG para Windows: https://ffmpeg.zeranoe.com/builds/

Resultado en vídeo: https://i.imgur.com/y10LQNI.mp4

Resultado en Gif (ffmpeg -i %d.JPG gif.gif):

#818
- No soy experto en Angular pero tengo entendido que Angular trabaja exclusivamente en Front-End ya que al final es javascript, CSS y HTML. Además Angular tiene la manía de dar la posibilidad de subdividir bastante el código mediante Clases (ng generate class), Interfaces (ng generate interface), Servicios (ng generate service), Componentes y Módulos. Todos estos al final son Clases o partes de Clases que de importan, heredan o inyectan en caso de los Servicios.

- Un Servicio en Angular solo está disponible para tu proyecto (Front-End) y está a la espera de ser Inyectado en algún Componente que lo requiera; un Servicio Web está en la Web y se puede utilizar en cualquier proyecto que lo implemente.
#819
Saludos,

- Dependiendo del grado de manipulación sobre los Items podrías usar Table, Flex, Grid o Flex + Grid. Table sería lo más sencillo, en todos los casos lo mejor es hacer que el navegador haga el cálculo. La ventaja de Table es que lo tiene innato el espaciado entre Celdas (border-spacing) y el crecimiento equitativo de las Celdas hasta rellenar todo el espacio disponible.

Con Table
Código (css) [Seleccionar]
<style>
 .tbl-container {
   background-color: red;
   border-spacing: 5px;
   width: 100%;
 }
 .tbl-container td {
   background-color: orange;
 }
</style>

<table class="tbl-container">
 <tr>
   <td>&nbsp;</td>
   <td>&nbsp;</td>
   <td>&nbsp;</td>
 </tr>
</table>


Con Flex
Código (css) [Seleccionar]
<style>
 .ul-container {
   background-color: red;
   display: flex;
   padding: 0;
 }
 .ul-container li {
   background-color: orange;
   flex: 1;
   list-style: none;
   margin: 5px 5px 5px 0px;
 }
 .ul-container li:first-child {
   margin-left: 5px;
 }
</style>

<ul class="ul-container">
 <li>&nbsp;</li>
 <li>&nbsp;</li>
 <li>&nbsp;</li>
</ul>



- La ventaja de Flex es que se puede manipular cada Celda individualmente, es más complejo su uso pero dependerá de los requisitos de tu proyecto.




- Por cierto a lo que @Nebire se refiere es que tienes que calcular la medida de cada espacio que se reparte, como quieres medidas relativas a un total 100% pues haces eso, repartes todo hasta llegar a un 100%, por ejemplo consideras los márgenes que en total serán 4 (postes) y luego las 3 cajas naranjas en sí (vallas), tenemos 7 objetos que se deben repartir, entonces en mi caso reparto un 1% * 4 para los márgenes y 32% * 3 para las cajas, dando todo un 100%:

Con Float
Código (css) [Seleccionar]
<style>
 .ul-container {
   background-color: red;
   overflow: hidden;
   padding: 0;
 }
 .ul-container li {
   background-color: orange;
   float: left;
   list-style: none;
   margin: 1% 1% 1% 0;
   width: 32%;
 }
 .ul-container li:first-child {
   margin-left: 1%;
 }
</style>

<ul class="ul-container">
 <li>&nbsp;</li>
 <li>&nbsp;</li>
 <li>&nbsp;</li>
</ul>
#820
Saludos,

- Cuando tiene problemas para leer o escribir desde el medio de instalación o el disco duro respectivamente, suele tardar un buen tiempo ahí. Me ha pasado algunas veces pero a lo mucho a tardado media hora XD.

- Aunque ahora que recuerdo, en mi Lenovo Y50-70 se quedó ahí más de 30 minutos ... al final instalé Windows 8, no insistí. Podrías revisar en tu BIOS que esté deshabilitado el OS Protection, también asegurarse que tu medio de instalación este funcionando bien, lo mismo con el disco duro del PC.