Crear Un Botón Volver Al Principio Y Una Barra De Progreso DeLa Página

A medida que se desplaza, probablemente haya visto el botón "Volver al principio" en la esquina inferior derecha de muchos sitios web. Haga clic en ese botón para volver a la parte superior de la página.

Esta es una gran característica en cualquier sitio web, y hoy veremos cómo construirla solo con HTML, CSS y JavaScript.

También veremos cómo agregar una barra de progreso de página. Esta barra aumenta el progreso cuando se desplaza hacia abajo y disminuye cuando se desplaza hacia arriba.

Tenga en cuenta que esto se puede agregar a cualquier sitio web, ya sea un sitio web existente o un sitio web con el que recién está comenzando. El único requisito es que su sitio web necesite suficiente contenido (o altura) para poder desplazarse. Si no, no tiene sentido agregar esto.

Volver arriba Botones HTML, CSS, JSCodePen y barra de progreso de la página

Cómo hacer un botón de volver al principio para su sitio web

Primero, haz que el cuerpo de tu sitio web sea enorme para que puedas desplazarte.

body {
  height: 5000px;
}

El cuerpo del documento se puede desplazar configurando una altura de 5000px

Además, agregue un degradado lineal al cuerpo del documento para que pueda ver que el documento se desplaza.

body {
  height: 5000px;
  background: linear-gradient(#00ff04, #09aad3);
}

Además, agregue rápidamente un botón Volver al principio a su marcado.

<button class="back-to-top">Back To Top</button>

Botón de volver al principio que contiene clases de estilo básicas

Además, organice los botones de la siguiente manera.

.back-to-top {
  position: fixed;
  right: 2rem;
  bottom: 2rem;
}

Volver al estilo de botón superior

Aquí, se especifica una posición fija para que el documento permanezca visible incluso cuando se desplaza. 2remTambién puede presionarlo desde la parte inferior derecha de la pantalla.

Así es como debería verse nuestra documentación ahora:

Documentos con un fondo degradado, botones fijos y "Volver al principio" en la esquina inferior derecha

Documentos con un fondo degradado, botones fijos y "Volver al principio" en la esquina inferior derecha

Ahora es el momento de agregar algo de lógica y diversión.

Cómo mostrar solo el botón Volver al principio al desplazarse

Actualmente, no desea que el botón Volver al principio aparezca siempre, como cuando el usuario está en la parte superior de la página. Te lo mostraré condicionalmente.

En este ejemplo, solo se mostrará si el usuario se ha desplazado al menos 100 píxeles.

Primero, debe ocultar el botón cada vez que el usuario abre el sitio. Además, dado que el botón debe aparecer en el desplazamiento, debe agregar este estilo por separado del estilo básico del botón.

HTML:

<button class="back-to-top hidden">Back To Top</button>

Botón de volver al principio con clases ocultas y estilos básicos

CSS:

.hidden {
  display: none;
}

Clase oculta sin pantalla

Aquí está el código para mostrar condicionalmente el botón:

const showOnPx = 100;
const backToTopButton = document.querySelector(".back-to-top")

const scrollContainer = () => {
  return document.documentElement || document.body;
};

document.addEventListener("scroll", () => {
  if (scrollContainer().scrollTop > showOnPx) {
    backToTopButton.classList.remove("hidden")
  } else {
    backToTopButton.classList.add("hidden")
  }
})

Código para mostrar / ocultar botones condicionalmente

Aquí, la scrollContainerfunción regresa document.documentElement. Este es solo el elemento HTML del documento. Si no está disponible document.body, se devuelve el elemento en su lugar.

Luego, agregue un detector de eventos a su documento que active la función de devolución de llamada cuando se desplaza. scrollTop( Referencia de MDN que obtenemos de cada uno) El valor scrollContainerno es nada de que el elemento se haya desplazado desde la parte superior, ni el número de píxeles.

Ahora, si el valor es showOnPxmayor que el valor establecido , es decir 100px, elimine la clase oculta del botón. De lo contrario, agregue la clase al botón (especialmente si el usuario se desplaza hacia arriba manualmente).

Ahora trabajemos en la lógica que se desplaza hacia la parte superior cada vez que el usuario hace clic en un botón.

Cómo desplazarse hacia la parte superior cada vez que el usuario hace clic en el botón Volver al principio

Escribamos brevemente una función para esto.

const goToTop = () => {
  document.body.scrollIntoView();
};

goToTop función

scrollIntoView()La función ( Referencia de MDN ) desplaza la página para traer el elemento que se llama vista. Aquí lo llamamos en el cuerpo para que la página se desplace hacia la parte superior.

Ahora debe llamar a esta función cada vez que se hace clic en el botón Volver al principio.

backToTopButton.addEventListener("click", goToTop)

goToTop()Haga clic en el botón volver al principio para llamar

¡Eso es! Se agregó la función BackToTop al sitio web.

Cómo suavizar el desplazamiento

Bueno, volver a la parte superior fue bastante difícil. Veamos cómo hacerlo más suave. Para hacer esto, pase behaviourcomo smootha la función scrollIntoView().

const goToTop = () => {
  document.body.scrollIntoView({
    behavior: "smooth",
  });
};

Desplazamiento suave

¡Eso es! Ahora el desplazamiento es suave.

Cómo diseñar el botón Volver al principio

Actualmente, el botón Volver al principio es un botón HTML simple con texto y es muy feo. Ahora establezcamos el estilo.

Antes de eso, te reemplace el texto con SVG, por lo que te salga bien lejos de HeroIcons .

<button class="back-to-top hidden">
  <svg
    xmlns="http://www.w3.org/2000/svg"
    class="back-to-top-icon"
    fill="none"
    viewBox="0 0 24 24"
    stroke="currentColor"
  >
    <path
      stroke-linecap="round"
      stroke-linejoin="round"
      stroke-width="2"
      d="M7 11l5-5m0 0l5 5m-5-5v12"
    />
  </svg>
</button>

Agregue un icono SVG en lugar de texto al botón Volver al principio

Al icono back-to-top-icon. Adjuntaré la clase. Esto es importante porque el ícono no aparece de inmediato y necesita darle estilo para verlo.

.back-to-top-icon {
  width: 1rem;
  height: 1rem;
  color: black;
}

Aplicar estilo y mostrar el icono del botón [Volver al principio]

Así es como se ve el botón.

Botón con icono de estilo SVG

Botón con icono de estilo SVG

Los botones todavía se ven bastante feos, así que vamos a diseñarlos.

.back-to-top {
  position: fixed;
  right: 2rem;
  bottom: 2rem;
  border-radius: 100%;
  background: #141c38;
  padding: 0.5rem;
  border: none;
  cursor: pointer;
}

Estilo de botones para que se vea bien

Ahora desaparece la flecha hacia arriba del botón. Cambie el color a un color más claro para que sea visible.

.back-to-top-icon {
  width: 1rem;
  height: 1rem;
  color: #7ac9f9;
}

Se actualizó el estilo del icono de flecha en el botón Volver al principio.

También puede agregar un efecto de desplazamiento para mejorarlo un poco.

.back-to-top:hover {
  opacity: 60%;
}

Agregue algunos estilos de desplazamiento al botón

Bueno, así es como deberían verse nuestros botones:

Volver al estilo de botón superior

Volver al estilo de botón superior

Cómo hacer que la entrada de botones sea fluida

Parece que el botón aparece de la nada cada vez que me desplazo. Cambiemos este comportamiento agregando una transición. En lugar de cambiar la pantalla, cambie la opacidad.

.back-to-top {
  position: fixed;
  right: 2rem;
  bottom: 2rem;
  border-radius: 100%;
  background: #7ac9f9;
  padding: 0.5rem;
  border: none;
  cursor: pointer;
  opacity: 100%;
  transition: opacity 0.5s;
}

Agregar transiciones a la opacidad del botón

.hidden {
  opacity: 0%;
}

Establecer la clase oculta a 0% de opacidad

Esto también hace que el efecto de desplazamiento sea más suave.

Ahora centrémonos en la barra de progreso de la página.

Cómo agregar una barra de progreso de página a su sitio web

Úselo para crear una barra de progreso div. A medida que el usuario se desplaza por la página, se determina el porcentaje de desplazamiento y sigue aumentando width. divAgregue el primero y dé el nombre de la clase a progress-bar:.

<div class="progress-bar" />

Marcado de la barra de progreso de desplazamiento de página

A continuación, agregue algunos estilos.

.progress-bar {
  height: 1rem;
  background: white;
  position: fixed;
  top: 0;
  left: 0;
}

Estilo de barra de progreso de desplazamiento de página

Se ha modificado para que se muestre cuando el usuario se desplaza. También se coloca en la parte superior de la página.

A continuación, agreguemos JavaScript para establecer el ancho de la barra de progreso.

const pageProgressBar = document.querySelector(".progress-bar")
document.addEventListener("scroll", () => {
  const scrolledPercentage =
      (scrollContainer().scrollTop /
        (scrollContainer().scrollHeight - scrollContainer().clientHeight)) *
      100;
  
  pageProgressBar.style.width = `${scrolledPercentage}%`
  
  if (scrollContainer().scrollTop > showOnPx) {
    backToTopButton.classList.remove("hidden");
  } else {
    backToTopButton.classList.add("hidden");
  }
});

Código que calcula la velocidad de desplazamiento y establece el mapa de la barra de progreso

Observe que estamos usando una función de escucha de eventos de desplazamiento de documentos existente.

A medida que se desplaza, la barra de progreso se ve así:

Desplazarse por la barra de progreso de desplazamiento de la página

Desplazarse por la barra de progreso de desplazamiento de la página

Cómo calcular la velocidad de desplazamiento

Calcular la velocidad de desplazamiento es realmente muy fácil. scrollTop( Ver MDN ) La propiedad es el número de píxeles de desplazamiento como se describe arriba.

scrollHeight( Referencia MDN ) es la altura mínima requerida para caber en todos los elementos secundarios del elemento llamado.

Y finalmente, clientHeight( Referencia MDN ) es la altura dentro del elemento llamado.

clientHeightRestado scrollHeight, no solo si no hacemos eso, sino porque el área de visualización se considera que nunca llegamos al 100% de desplazamiento.

He reunido esta figura para explicarlo mejor:

Capturas de pantalla que explican clientHeight y scrollHeight

Descripción de la captura de pantalla clientHeightyscrollHeight

Aquí, las líneas sin flechas clientHeightrepresentan la altura del contenido que vemos. Una línea con una flecha representa e indica que scrollHeightesta línea continúa en ambas direcciones. Esta es la altura de la vista requerida para adaptarse a todo el contenido.

Finalmente scrollTop, divida el valor por la diferencia de scrollHeightpara obtener clientHeightla cantidad desplazada de valor decimal. Multiplique esto 100para obtener el valor porcentual utilizado para determinar el ancho de div, es decir, el progreso de la barra de progreso.

en conclusión

Espero que este artículo le haya resultado útil. También esperamos implementar un botón para volver al principio y una barra de progreso de la página en su sitio web.

Si tiene alguna pregunta , comuníquese conmigo en Twitter . El siguiente paso es implementar esto en su sitio web y realizar los cambios necesarios. 

Enlace: https://www.freecodecamp.org/news/back-to-top-button-and-page-progressbar-with-html-css-and-js/

#html  #css  #javascipt 

What is GEEK

Buddha Community

Crear Un Botón Volver Al Principio Y Una Barra De Progreso DeLa Página

Crear Un Botón Volver Al Principio Y Una Barra De Progreso DeLa Página

A medida que se desplaza, probablemente haya visto el botón "Volver al principio" en la esquina inferior derecha de muchos sitios web. Haga clic en ese botón para volver a la parte superior de la página.

Esta es una gran característica en cualquier sitio web, y hoy veremos cómo construirla solo con HTML, CSS y JavaScript.

También veremos cómo agregar una barra de progreso de página. Esta barra aumenta el progreso cuando se desplaza hacia abajo y disminuye cuando se desplaza hacia arriba.

Tenga en cuenta que esto se puede agregar a cualquier sitio web, ya sea un sitio web existente o un sitio web con el que recién está comenzando. El único requisito es que su sitio web necesite suficiente contenido (o altura) para poder desplazarse. Si no, no tiene sentido agregar esto.

Volver arriba Botones HTML, CSS, JSCodePen y barra de progreso de la página

Cómo hacer un botón de volver al principio para su sitio web

Primero, haz que el cuerpo de tu sitio web sea enorme para que puedas desplazarte.

body {
  height: 5000px;
}

El cuerpo del documento se puede desplazar configurando una altura de 5000px

Además, agregue un degradado lineal al cuerpo del documento para que pueda ver que el documento se desplaza.

body {
  height: 5000px;
  background: linear-gradient(#00ff04, #09aad3);
}

Además, agregue rápidamente un botón Volver al principio a su marcado.

<button class="back-to-top">Back To Top</button>

Botón de volver al principio que contiene clases de estilo básicas

Además, organice los botones de la siguiente manera.

.back-to-top {
  position: fixed;
  right: 2rem;
  bottom: 2rem;
}

Volver al estilo de botón superior

Aquí, se especifica una posición fija para que el documento permanezca visible incluso cuando se desplaza. 2remTambién puede presionarlo desde la parte inferior derecha de la pantalla.

Así es como debería verse nuestra documentación ahora:

Documentos con un fondo degradado, botones fijos y "Volver al principio" en la esquina inferior derecha

Documentos con un fondo degradado, botones fijos y "Volver al principio" en la esquina inferior derecha

Ahora es el momento de agregar algo de lógica y diversión.

Cómo mostrar solo el botón Volver al principio al desplazarse

Actualmente, no desea que el botón Volver al principio aparezca siempre, como cuando el usuario está en la parte superior de la página. Te lo mostraré condicionalmente.

En este ejemplo, solo se mostrará si el usuario se ha desplazado al menos 100 píxeles.

Primero, debe ocultar el botón cada vez que el usuario abre el sitio. Además, dado que el botón debe aparecer en el desplazamiento, debe agregar este estilo por separado del estilo básico del botón.

HTML:

<button class="back-to-top hidden">Back To Top</button>

Botón de volver al principio con clases ocultas y estilos básicos

CSS:

.hidden {
  display: none;
}

Clase oculta sin pantalla

Aquí está el código para mostrar condicionalmente el botón:

const showOnPx = 100;
const backToTopButton = document.querySelector(".back-to-top")

const scrollContainer = () => {
  return document.documentElement || document.body;
};

document.addEventListener("scroll", () => {
  if (scrollContainer().scrollTop > showOnPx) {
    backToTopButton.classList.remove("hidden")
  } else {
    backToTopButton.classList.add("hidden")
  }
})

Código para mostrar / ocultar botones condicionalmente

Aquí, la scrollContainerfunción regresa document.documentElement. Este es solo el elemento HTML del documento. Si no está disponible document.body, se devuelve el elemento en su lugar.

Luego, agregue un detector de eventos a su documento que active la función de devolución de llamada cuando se desplaza. scrollTop( Referencia de MDN que obtenemos de cada uno) El valor scrollContainerno es nada de que el elemento se haya desplazado desde la parte superior, ni el número de píxeles.

Ahora, si el valor es showOnPxmayor que el valor establecido , es decir 100px, elimine la clase oculta del botón. De lo contrario, agregue la clase al botón (especialmente si el usuario se desplaza hacia arriba manualmente).

Ahora trabajemos en la lógica que se desplaza hacia la parte superior cada vez que el usuario hace clic en un botón.

Cómo desplazarse hacia la parte superior cada vez que el usuario hace clic en el botón Volver al principio

Escribamos brevemente una función para esto.

const goToTop = () => {
  document.body.scrollIntoView();
};

goToTop función

scrollIntoView()La función ( Referencia de MDN ) desplaza la página para traer el elemento que se llama vista. Aquí lo llamamos en el cuerpo para que la página se desplace hacia la parte superior.

Ahora debe llamar a esta función cada vez que se hace clic en el botón Volver al principio.

backToTopButton.addEventListener("click", goToTop)

goToTop()Haga clic en el botón volver al principio para llamar

¡Eso es! Se agregó la función BackToTop al sitio web.

Cómo suavizar el desplazamiento

Bueno, volver a la parte superior fue bastante difícil. Veamos cómo hacerlo más suave. Para hacer esto, pase behaviourcomo smootha la función scrollIntoView().

const goToTop = () => {
  document.body.scrollIntoView({
    behavior: "smooth",
  });
};

Desplazamiento suave

¡Eso es! Ahora el desplazamiento es suave.

Cómo diseñar el botón Volver al principio

Actualmente, el botón Volver al principio es un botón HTML simple con texto y es muy feo. Ahora establezcamos el estilo.

Antes de eso, te reemplace el texto con SVG, por lo que te salga bien lejos de HeroIcons .

<button class="back-to-top hidden">
  <svg
    xmlns="http://www.w3.org/2000/svg"
    class="back-to-top-icon"
    fill="none"
    viewBox="0 0 24 24"
    stroke="currentColor"
  >
    <path
      stroke-linecap="round"
      stroke-linejoin="round"
      stroke-width="2"
      d="M7 11l5-5m0 0l5 5m-5-5v12"
    />
  </svg>
</button>

Agregue un icono SVG en lugar de texto al botón Volver al principio

Al icono back-to-top-icon. Adjuntaré la clase. Esto es importante porque el ícono no aparece de inmediato y necesita darle estilo para verlo.

.back-to-top-icon {
  width: 1rem;
  height: 1rem;
  color: black;
}

Aplicar estilo y mostrar el icono del botón [Volver al principio]

Así es como se ve el botón.

Botón con icono de estilo SVG

Botón con icono de estilo SVG

Los botones todavía se ven bastante feos, así que vamos a diseñarlos.

.back-to-top {
  position: fixed;
  right: 2rem;
  bottom: 2rem;
  border-radius: 100%;
  background: #141c38;
  padding: 0.5rem;
  border: none;
  cursor: pointer;
}

Estilo de botones para que se vea bien

Ahora desaparece la flecha hacia arriba del botón. Cambie el color a un color más claro para que sea visible.

.back-to-top-icon {
  width: 1rem;
  height: 1rem;
  color: #7ac9f9;
}

Se actualizó el estilo del icono de flecha en el botón Volver al principio.

También puede agregar un efecto de desplazamiento para mejorarlo un poco.

.back-to-top:hover {
  opacity: 60%;
}

Agregue algunos estilos de desplazamiento al botón

Bueno, así es como deberían verse nuestros botones:

Volver al estilo de botón superior

Volver al estilo de botón superior

Cómo hacer que la entrada de botones sea fluida

Parece que el botón aparece de la nada cada vez que me desplazo. Cambiemos este comportamiento agregando una transición. En lugar de cambiar la pantalla, cambie la opacidad.

.back-to-top {
  position: fixed;
  right: 2rem;
  bottom: 2rem;
  border-radius: 100%;
  background: #7ac9f9;
  padding: 0.5rem;
  border: none;
  cursor: pointer;
  opacity: 100%;
  transition: opacity 0.5s;
}

Agregar transiciones a la opacidad del botón

.hidden {
  opacity: 0%;
}

Establecer la clase oculta a 0% de opacidad

Esto también hace que el efecto de desplazamiento sea más suave.

Ahora centrémonos en la barra de progreso de la página.

Cómo agregar una barra de progreso de página a su sitio web

Úselo para crear una barra de progreso div. A medida que el usuario se desplaza por la página, se determina el porcentaje de desplazamiento y sigue aumentando width. divAgregue el primero y dé el nombre de la clase a progress-bar:.

<div class="progress-bar" />

Marcado de la barra de progreso de desplazamiento de página

A continuación, agregue algunos estilos.

.progress-bar {
  height: 1rem;
  background: white;
  position: fixed;
  top: 0;
  left: 0;
}

Estilo de barra de progreso de desplazamiento de página

Se ha modificado para que se muestre cuando el usuario se desplaza. También se coloca en la parte superior de la página.

A continuación, agreguemos JavaScript para establecer el ancho de la barra de progreso.

const pageProgressBar = document.querySelector(".progress-bar")
document.addEventListener("scroll", () => {
  const scrolledPercentage =
      (scrollContainer().scrollTop /
        (scrollContainer().scrollHeight - scrollContainer().clientHeight)) *
      100;
  
  pageProgressBar.style.width = `${scrolledPercentage}%`
  
  if (scrollContainer().scrollTop > showOnPx) {
    backToTopButton.classList.remove("hidden");
  } else {
    backToTopButton.classList.add("hidden");
  }
});

Código que calcula la velocidad de desplazamiento y establece el mapa de la barra de progreso

Observe que estamos usando una función de escucha de eventos de desplazamiento de documentos existente.

A medida que se desplaza, la barra de progreso se ve así:

Desplazarse por la barra de progreso de desplazamiento de la página

Desplazarse por la barra de progreso de desplazamiento de la página

Cómo calcular la velocidad de desplazamiento

Calcular la velocidad de desplazamiento es realmente muy fácil. scrollTop( Ver MDN ) La propiedad es el número de píxeles de desplazamiento como se describe arriba.

scrollHeight( Referencia MDN ) es la altura mínima requerida para caber en todos los elementos secundarios del elemento llamado.

Y finalmente, clientHeight( Referencia MDN ) es la altura dentro del elemento llamado.

clientHeightRestado scrollHeight, no solo si no hacemos eso, sino porque el área de visualización se considera que nunca llegamos al 100% de desplazamiento.

He reunido esta figura para explicarlo mejor:

Capturas de pantalla que explican clientHeight y scrollHeight

Descripción de la captura de pantalla clientHeightyscrollHeight

Aquí, las líneas sin flechas clientHeightrepresentan la altura del contenido que vemos. Una línea con una flecha representa e indica que scrollHeightesta línea continúa en ambas direcciones. Esta es la altura de la vista requerida para adaptarse a todo el contenido.

Finalmente scrollTop, divida el valor por la diferencia de scrollHeightpara obtener clientHeightla cantidad desplazada de valor decimal. Multiplique esto 100para obtener el valor porcentual utilizado para determinar el ancho de div, es decir, el progreso de la barra de progreso.

en conclusión

Espero que este artículo le haya resultado útil. También esperamos implementar un botón para volver al principio y una barra de progreso de la página en su sitio web.

Si tiene alguna pregunta , comuníquese conmigo en Twitter . El siguiente paso es implementar esto en su sitio web y realizar los cambios necesarios. 

Enlace: https://www.freecodecamp.org/news/back-to-top-button-and-page-progressbar-with-html-css-and-js/

#html  #css  #javascipt 

Diego  Elizondo

Diego Elizondo

1652926080

Cómo Construir Un Analizador En Rust Por Diversión Y Ganancias

Un viernes por la mañana, holgazaneando, estás pensando en los nuevos programas de Netflix para ver. Su jefe viene y le pide que escriba un analizador para un archivo de unidad de Systemd .

Lo necesita para el lunes.

Cada vez que pensabas que el fin de semana estaba disponible

Estás nervioso.

La última vez que se le pidió que escribiera un analizador, se metió en la madriguera del conejo de la web, copiando y pegando fórmulas Regex hasta que funcionó™.

Básicamente lo que todos los desarrolladores habían hecho (sangre en la mano)

Tomas un sorbo de tu té de boba para calmarte. Buscas Systemd en Google y te gusta... no, no es tan simple como pensabas.

Ese sentimiento cuando estás tan desesperado porque te quitan el fin de semana

Tu buen truco de copiar y pegar expresiones regulares sale volando por la ventana. Las posibilidades de pasar un fin de semana sin interrupciones para atracones de programas se acercan rápidamente null.

#PEG al rescate

No pierdas la esperanza todavía. Permítame presentarle Parse Expression Grammer (PEG) , una manera fácil de familiarizarse con los analizadores y ahorrar su valioso fin de semana.

PEG es una forma legible de escribir reglas de sintaxis y es bastante similar a las expresiones regulares, que es diferente de una contraparte de gramática libre de contexto como Backus-Naur Form (BNF) en la que las expresiones deben reducirse a símbolos más pequeños. Lo siento, Noam Chomsky , quizás otros días de trabajo.

Usaré una biblioteca de análisis de Rust PEG llamada Pest , que es bastante impresionante. Si aún no lo has hecho, esperaré mientras instalas Rust .

En serio, ¿quién no se oxida en estos días?

#Empezando

Comencemos con una gramática simple para analizar una declaración de declaración de variable similar a JavaScript. Comenzaremos pensando en un conjunto de reglas para entradas válidas.

#Una declaración de declaración:

  • comienza con una palabra clave var, seguida de uno o más identificadores.
  • es insensible al espacio en blanco
  • termina con un punto y coma ( ;)

#Un grupo de identificadores:

  • está precedido por una varpalabra clave
  • está delimitado por comas
  • es insensible al espacio en blanco

#Un identificador:

  • puede contener cualquier número de dígitos, caracteres y guiones bajos en mayúsculas y minúsculas
  • no puede comenzar con un dígito
  • no puede contener ningún espacio

Un identificador es un término , lo que significa que es una pieza irrompible del token. También lo son las varpalabras clave y los puntos y comas.

Regresa un poco al lado BNF, usando Extended Backus-Naur Grammar (EBNF) , podrías definir formalmente la gramática anterior de esta manera:

<alpha>  := 'a' | 'b' | 'c' | 'd' | 'e' | /* ... */ 'z'
         |  'A' | 'B' | 'C' | 'D' | 'E' | /* ... */ 'Z'

<digit>  := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

<Decl>   := 'var' <Idents> '\n'? ';'
<Idents> := <Ident> ('\n'? ',' <Ident>)*
<Ident>  := <alpha>+ (<alpha> | <digit> | '_')*

El nombre de la regla en mayúsculas representa un símbolo que no termina (es decir, se puede dividir en términos más pequeños). El nombre en minúscula representa un término.

En aras de la brevedad, omitimos los espacios en blanco implícitos de las reglas. Básicamente, pueden existir uno o más espacios en blanco entre cada símbolo que ve.

¡Vamos a profundizar en ello! Las reglas <alpha>y <digit>se explican por sí mismas, por lo que dejaremos que lo adivines.

<Decl>es la regla más compleja para una instrucción de declaración, que presenta una varpalabra clave, un <Idents>símbolo, una nueva línea opcional y termina con un punto y coma. Básicamente, esta regla dice: "Cualquier entrada de cadena que comience con var, seguida de uno o más espacios, luego una subregla <Idents>, seguida de uno o más espacios y finalmente termine con un solo punto y coma es válida y felizmente la masticaré. "

<Idents>puede ser un solo <Ident>símbolo, seguido de cero o más pares de comas y <Ident>.

Finalmente, un <Ident>debe comenzar con uno o más caracteres, seguido de cero o más caracteres, dígitos o guiones bajos.

#Ok, código por favor

¡Espera, joven Anakin! Cabeza caliente, eres. He aquí que, con la gramática definida, podremos analizar estas declaraciones:

var foo, bar, baz;

var   foo_1, baRamYu,baz99;

var foo_x
  , baroo
  , bazoo
  ;

No, no me olvidé de formatear mi código. ¡Es JS válido, y también es para nuestro analizador! Aquí hay algo que nuestras reglas no soportarán:

var 99Problems

¿Alguien quiere adivinar qué está mal aquí? ✋ Deja tu respuesta en el comentario. (psss, si tu respuesta es correcta, te sigo + 3 me gusta en tu publicación 👍)

#Entra el óxido y las plagas

Ok, espero que ya tengas Rust instalado (En tu terminal, intenta escribir which cargoy ver si aparece). Comience creando un nuevo proyecto binario de Rust con

$ cargo new --bin maybe-js; cd maybe-js

Dentro de la carpeta del proyecto, abra el Cargo.tomlarchivo y agregue lo siguiente en dependencies, y ejecútelo cargo updatepara instalarlo.

[dependencies]
pest = "2.0"
pest_derive = "2.0"

Una vez hecho esto, cdingrese srcy cree un archivo llamado grammar.pesty pegue lo siguiente en él:

alpha = { 'a'..'z' | 'A'..'Z' }
digit = { '0'..'9' }
underscore = { "_" }
newline = _{ "\n" | "\r" }
WHITESPACE = _{ " " }

declaration = { "var" ~ !newline ~ idents ~ newline? ~ ";" }
idents = { ident ~ (newline? ~ "," ~ ident)* }
ident = @{ !digit ~ (alpha | digit | underscore)+ }

Ahora bien, si he tenido su atención durante los últimos minutos, no debería ser difícil adivinar lo que está sucediendo aquí. (Oh, ¿no lo he hecho? De todos modos... aquí vamos)

Los cinco primeros son todos términos. Son conjuntos de valores válidos. el | se llama Choice Operator , que es como "o-si no".

first | or_else

Al hacer coincidir una expresión de elección, firstse intenta. Si first coincide con éxito, la expresión completa se realiza correctamente de inmediato. Sin embargo, si firstfalla, or_elsese intenta a continuación.

La newlineregla tiene un peculiar _antes del corchete, que en Pest habla significa "silencioso": simplemente no lo queremos como parte de nuestros tokens analizados, pero de todos modos es parte de una sintaxis válida.

La WHITESPACEregla tiene un lugar especial en Pest. Si lo definió, Pest insertará automáticamente espacios en blanco opcionales implícitos (de acuerdo con la WHITESPACEregla que defina) entre cada símbolo. Nuevamente, _dice que queremos silenciarlo, ya que no queremos toneladas de espacios en blanco como parte de nuestro árbol de sintaxis.

La declarationregla es muy similar a la contraparte de EBNF que aprendimos antes. Las tildes ("~") simplemente significan "y luego". La regla comienza con una palabra clave "var", seguida de cualquier cosa que no sea un salto de línea (el "!" hace lo que hubiera adivinado intuitivamente: negar una regla), seguida de una subregla idents, un salto de línea opcional y finaliza con un punto y coma.

La identsregla es nuevamente similar al ejemplo EBNF. Es un solo ident, seguido de cero o más idents separados por comas.

La identregla es un poco especial. La "@", conocida como Atomic , delante del corchete está ahí para decir: "No quiero que se apliquen espacios en blanco implícitos a esta regla". Seguro que no queremos incluir ningún espacio en nuestro nombre de variable. Además, marcar una regla como atómica de esta manera trata la regla como un término, silenciando las reglas internas de coincidencia. Cualquier regla interna se descarta.

string_lit = { "\"" ~ inner ~ "\"" }
inner = { ASCII_ALPHANUMERIC* }

Tenga en cuenta que ASCII_ALPHANUMERICes una regla incorporada conveniente en Pest para cualquier carácter y dígito ASCII.

Si analizamos una cadena "hola" con esta regla, esto generará primero un string_litnodo, que a su vez tiene un innernodo que contiene la cadena "hola", sin comillas.

Árbol de regla no atómica

Agregar un sigilo "@" delante del string_litcorchete:

string_lit = @{ "\"" ~ inner ~ "\"" }
inner = { ASCII_ALPHANUMERIC* }

string_litTerminaremos con un nodo plano que contiene ""hola"".

Árbol de la regla atómica

Un sigilo similar "$" conocido como Compound Atomic , protege los espacios en blanco implícitos dentro de la regla. La diferencia es que permite que las reglas de coincidencia internas se analicen normalmente.

La !digitparte evita que la regla avance si comienza con un número. Si no es así, una o más combinaciones de caracteres, números y guiones bajos están bien.

#Pero espera, ¿dónde está el código?

¡Dang, mi inteligente explorador! Pareces arrinconarme en cada movimiento. Sí, eso no era código en absoluto, sino una definición de gramática de Pest. Ahora tenemos que escribir un código de Rust para analizar un texto. Inicie src/main.rsy agregue lo siguiente:

/// You need to do this to use macro
extern crate pest;                                                                                                                                                                                   
#[macro_use]                                                                                                                                                                                         
extern crate pest_derive;                                                                                                                                                                            

/// 1. Import modules                                                                                                                                                                                            
use std::fs;                                                                                                                                                                                         
use pest::Parser;                                                                                                                                                                                    
use pest::iterators::Pair;                                                                                                                                                                           

/// 2. Define a "marker" struct and add a path to our grammar file.                                                                                                                                                                                                 
#[derive(Parser)]                                                                                                                                                                                    
#[grammar = "grammar.pest"]                                                                                                                                                                            
struct IdentParser; 

/// 3. Print the detail of a current Pair and optional divider
fn print_pair(pair: &Pair<Rule>, hard_divider: bool) {
    println!("Rule: {:?}", pair.as_rule());
    println!("Span: {:?}", pair.as_span());
    println!("Text: {:?}", pair.as_str());
    if hard_divider {
        println!("{:=>60}", "");
    } else {
        println!("{:->60}", "");
    }
}

fn main() {
    /// 4. Parse a sample string input
    let pair = IdentParser::parse(Rule::declaration, "var foo1, bar_99, fooBar;")
        .expect("unsuccessful parse")
        .next().unwrap();

    print_pair(&pair, true);
    
    /// 5. Iterate over the "inner" Pairs
    for inner_pair in pair.into_inner() {
 
        print_pair(&inner_pair, true);

        match inner_pair.as_rule() {
            /// 6. If we match an idents rule...
            Rule::idents =>  {
                /// 7. Iterate over another inner Pairs
                for inner_inner_pair in inner_pair.into_inner() {
                    match inner_inner_pair.as_rule() {
                        /// 8. The term ident is the last level
                        Rule::ident => {
                            print_pair(&inner_inner_pair, false);
                        }
                        _ => unreachable!(),
                    }
                }
            }
            _ => unreachable!(),
        }
    }
}

Está bien si no entiendes la mayoría de las cosas aquí. Ejecutémoslo cargo runen el directorio de su proyecto y miremos la salida impresa.

Rule: declaration
Span: Span { str: "var foo1, bar_99, fooBar;", start: 0, end: 28 }
Text: "var foo1, bar_99, fooBarBaz;"
============================================================
Rule: idents
Span: Span { str: "foo1, bar_99, fooBar", start: 4, end: 27 }
Text: "foo1, bar_99, fooBarBaz"
============================================================
Rule: ident
Span: Span { str: "foo1", start: 4, end: 8 }
Text: "foo1"
------------------------------------------------------------
Rule: ident
Span: Span { str: "bar_99", start: 10, end: 16 }
Text: "bar_99"
------------------------------------------------------------
Rule: ident
Span: Span { str: "fooBar", start: 18, end: 27 }
Text: "fooBarBaz"
------------------------------------------------------------

El concepto más importante aquí es un Pair. Representa un par de tokens coincidentes o, de manera equivalente, el texto distribuido que una regla con nombre coincidió correctamente.

A menudo usamos Pairs para:

Determinar qué regla produjo elPair

Usar el Paircomo materia prima&str

Inspeccionar las sub-reglas internas nombradas que produjeron elPair

let pair = Parser::parse(Rule::enclosed, "(..6472..) and more text")
    .unwrap().next().unwrap();

assert_eq!(pair.as_rule(), Rule::enclosed);
assert_eq!(pair.as_str(), "(..6472..)");

let inner_rules = pair.into_inner();
println!("{}", inner_rules); // --> [number(3, 7)]

A Pairpuede tener cero, una o más reglas internas. Para máxima flexibilidad, Pair::into_inner()devuelve Pairs, que es un tipo de iterador sobre cada par.

💡 Pair::into_inner()es un idioma muy común cuando se trabaja con Pest. Asegúrate de entender qué Paires a.

#Vamos a analizar Systemd

Si has llegado hasta aquí, te mereces este gatito.

Ahora es el momento de poner el trabajo. Aquí hay un ejemplo de un archivo de unidad Systemd:

[Unit]
Description=Nginx
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/ec2-user/.local/bin
Environment=LD_LIBRARY_PATH=/usr/local/lib
Environment=PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
ExecStart=/usr/local/sbin/nginx-runner.sh
Restart=on-failure
RestartSec=0
KillMode=process

[Install]
WantedBy=multi-user.target

El archivo está agrupado en secciones, cada una con un nombre entre corchetes. Cada sección contiene cero o más pares de nombre y valor de propiedad, separados por un signo igual "=".

Tratemos de desarrollar un conjunto de reglas. Cree un nuevo proyecto de óxido con cargo new --bin systemd-parser, luego cree un archivo con el nombre src/grammar.pestcon las siguientes reglas:


/// Implicit white spaces are ok.
WHITESPACE = _{ " " }

/// Set of characters permited 
char = { ASCII_ALPHANUMERIC | "." | "_" | "/" | "-"  }

/// name is one or more chars. Note that white spaces are allowed.
name = { char+ }

// value can be zero or more char, plus = and : for path variables.
value = { (char | "=" | ":" )* }

/// section is a name, enclosed by square brackets.
section = { "[" ~ name ~ "]" }

/// property pair is a name and value, separated by an equal sign.
property = { name ~ "=" ~ value }

/// A Systemd unit file structure
file = {
    SOI ~
    ((section | property)? ~ NEWLINE)* ~
    EOI
}

En el main.rsarchivo, comience con lo siguiente

extern crate pest;
#[macro_use]
extern crate pest_derive;

use std::fs;
use std::env::current_dir;
use std::collections::HashMap;
use pest::Parser;

#[derive(Parser)]
#[grammar = "grammar.pest"]
struct SystemdParser;

/// Implement a simple AST representation
#[derive(Debug, Clone)]
pub enum SystemdValue {
    List(Vec<String>),
    Str(String),
}

// ...

Como primer paso, después de las importaciones y la configuración iniciales, definimos una SystemdValueenumeración como una representación simple del tipo de datos en un archivo Systemd. SystemdValue::Str(String)capturará un solo valor de propiedad y SystemdValue::List(Vec<String>)capturará varios valores de propiedad con un nombre de clave de propiedad duplicado. Por ejemplo, en el nginx.servicearchivo anterior hay varias Environmentpropiedades.

Aquí está la mainfunción:


fn main() {
    // Read and parse the unit file.
    let unparsed_file = fs::read_to_string("nginx.service")
        .expect("cannot read file");
    let file = SystemdParser::parse(Rule::file, &unparsed_file).expect("fail to parse")
        .next()
        .unwrap();

    // Create a fresh HashMap to store the data.
    let mut properties: HashMap<String, HashMap<String, SystemdValue>> = HashMap::new();

    // These two mutable variables will be used to store
    // section name and property key name.
    let mut current_section_name = String::new();
    let mut current_key_name = String::new();

    // Iterate over the file line-by-line.
    for line in file.into_inner() {
		match line.as_rule() {
			Rule::section => {
                // Update the current_section_name
                let mut inner_rules = line.into_inner();
                current_section_name = inner_rules.next().unwrap().as_str().to_string();
			}
			Rule::property => {
                let mut inner_rules = line.into_inner();
                // Get a sub map of properties with the current_section_name key, or create new.
                let section = properties.entry(current_section_name.clone()).or_default();

                // Get the current property name and value.
                let name = inner_rules.next().unwrap().as_str().to_string();
                let value = inner_rules.next().unwrap().as_str().to_string();

                // If the property name already exists...
                if name == current_key_name {
                    // Get the section of the map with the key name, or insert a new SytemdValue::List.
                    let entry = section.entry(current_key_name.clone()).or_insert(SystemdValue::List(vec![]));
                    // Push the value onto the inner vector of SystemdValue::List.
                    if let SystemdValue::List(ent) = entry {
                        ent.push(value);
                    }
                } else {
                    // Create a new SystemdValue::List and save it under name key.
                    let entry = section.entry(name.clone()).or_insert(SystemdValue::List(vec![]));
                    // Push the current value onto the vector, then set the
                    // current_key_name to the current name.
                    if let SystemdValue::List(ent) = entry {
                        ent.push(value);
                    }
                    current_key_name = name;
                }
			}
			Rule::EOI => (),
			_ => unreachable!(),
		}
    }
}

Todo esto está bien, pero no usamos SystemdValue::Strninguna parte del código. Para mantener limpio el código, decidimos tratar cada propiedad como HashMap<String, SystemdValue::List(Vec<String>), donde la clave del mapa es la clave de propiedad y el vector String almacena la lista de valores de propiedad. Si no hay valor, el vector está vacío. Si hay un valor, este vector contiene ese único valor, y así sucesivamente.

Para que la API sea un poco más fácil de usar, escribiremos una pequeña función auxiliar para procesar todos los correos electrónicos de un solo valor Systemd::List(Vec<String>)y convertirlos en archivos Systemd::Str(String).

// Iterate over the nested maps, and convert empty and 
// single-element `SystemdValue::List<Vec<String>>` to 
// `SystemdValue::Str(String)`.
fn pre_process_map(map: &mut HashMap<String, HashMap<String, SystemdValue>>) {
    for (_, value) in map.into_iter() {
		for (_, v) in value.into_iter() {
			if let SystemdValue::List(vs) = v {
				if vs.len() == 0 {
					let v_ = SystemdValue::Str(String::new());
					*v = v_.clone();
				} else if vs.len() == 1 {
					let v_ = SystemdValue::Str((vs[0]).clone());
					*v = v_.clone();
				}
			}
		}
    }
}

¡Ahora estamos listos para imprimirlo para que el mundo lo vea!

fn main() {

    // Our main code 

    pre_process_map(properties);

    println!("{:#?}", properties);
}

¡Auge! ¡Felicidades! Acaba de escribir un analizador de archivos Systemd, además de uno mini JS. 🤯 Ahora tendrás algo de tiempo libre para divertirte el viernes por la noche. Con otra tarde, es posible que incluso descubras cómo serializar el archivo de tu unidad Systemd en JSON para impresionar a tu jefe el lunes.

Puede consultar el código del analizador implementado como biblioteca en [este repositorio] (https://github.com/jochasinga/systemd-parser)

Fuente: https://hackernoon.com/how-to-build-a-parser-in-rust-for-fun-and-profit

#rust 

joe biden

1617257581

Software de restauración de Exchange para restaurar sin problemas PST en Exchange Server

¿Quiere restaurar los buzones de correo de PST a Exchange Server? Entonces, estás en la página correcta. Aquí, lo guiaremos sobre cómo puede restaurar fácilmente mensajes y otros elementos de PST a MS Exchange Server.

Muchas veces, los usuarios necesitan restaurar los elementos de datos de PST en Exchange Server, pero debido a la falta de disponibilidad de una solución confiable, los usuarios no pueden obtener la solución. Háganos saber primero sobre el archivo PST y MS Exchange Server.

Conozca PST y Exchange Server

PST es un formato de archivo utilizado por MS Outlook, un cliente de correo electrónico de Windows y muy popular entre los usuarios domésticos y comerciales.

Por otro lado, Exchange Server es un poderoso servidor de correo electrónico donde todos los datos se almacenan en un archivo EDB. Los usuarios generalmente guardan la copia de seguridad de los buzones de correo de Exchange en el archivo PST, pero muchas veces, los usuarios deben restaurar los datos del archivo PST en Exchange. Para resolver este problema, estamos aquí con una solución profesional que discutiremos en la siguiente sección de esta publicación.

Un método profesional para restaurar PST a Exchange Server

No le recomendamos que elija una solución al azar para restaurar los datos de PST en Exchange Server. Por lo tanto, al realizar varias investigaciones, estamos aquí con una solución inteligente y conveniente, es decir, Exchange Restore Software. Es demasiado fácil de manejar por todos los usuarios y restaurar cómodamente todos los datos del archivo PST a Exchange Server.

Funciones principales ofrecidas por Exchange Restore Software

El software es demasiado simple de usar y se puede instalar fácilmente en todas las versiones de Windows. Con unos pocos clics, la herramienta puede restaurar los elementos del buzón de Exchange.

No es necesario que MS Outlook restaure los datos PST en Exchange. Todos los correos electrónicos, contactos, notas, calendarios, etc. se restauran desde el archivo PST a Exchange Server.

Todas las versiones de Outlook son compatibles con la herramienta, como Outlook 2019, 2016, 2013, 2010, 2007, etc. La herramienta proporciona varios filtros mediante los cuales se pueden restaurar los datos deseados desde un archivo PST a Exchange Server. El programa se puede instalar en todas las versiones de Windows como Windows 10, 8.1, 8, 7, XP, Vista, etc.

Descargue la versión de demostración del software de restauración de Exchange y analice el funcionamiento del software restaurando los primeros 50 elementos por carpeta.

Líneas finales

No existe una solución manual para restaurar los buzones de correo de Exchange desde el archivo PST. Por lo tanto, hemos explicado una solución fácil e inteligente para restaurar datos de archivos PST en Exchange Server. Simplemente puede usar este software y restaurar todos los datos de PST a Exchange Server.

Más información:- https://www.datavare.com/software/exchange-restore.html

#intercambio de software de restauración #intercambio de restauración #buzón del servidor de intercambio #herramienta de restauración de intercambio

joe biden

1617255938

¿Cómo migrar los buzones de correo de Exchange a la nube de Office 365?

Si tiene problemas para migrar los buzones de correo de Exchange a Office 365, debe leer este artículo para saber cómo migrar los buzones de correo de Exchange EDB a Office 365. Al migrar a Office 365, los usuarios pueden acceder a sus buzones de correo desde cualquier lugar y desde cualquier dispositivo.

En esta publicación, explicaremos las razones detrás de esta migración y una solución profesional para migrar de Exchange a Office 365.

Razones para migrar Exchange Server a la nube de Office 365

Office 365 apareció por primera vez en 2011 y, dado que se considera la mejor plataforma para aquellas organizaciones que desean administrar todo su sistema de correo electrónico en la nube. Estas son las características clave de Office 365:

  1. Permite trabajar desde cualquier lugar y desde cualquier lugar.
  2. No se preocupe por el spam y el malware.
  3. La seguridad proporcionada por Office 365 es altamente confiable.
  4. Controla el costo total y brinda flexibilidad financiera.
  5. Todas las actualizaciones y mejoras son administradas por Microsoft.

¿Cómo migrar los buzones de correo de Exchange a Office 365?

Hay varias formas manuales de migrar los buzones de correo de Exchange EDB a Office 365, pero para evitar estos complicados y prolongados procedimientos, presentamos una solución de terceros, es decir, la herramienta de migración de Exchange, que es automatizada y directa para la migración de Exchange a Office 365. La herramienta funciona rápidamente y migra todos los elementos del buzón de Exchange Server a Office 365.

La herramienta de migración de Datavare Exchange es demasiado fácil de usar y ofrece pasos sencillos para migrar EDB a Office 365:

  1. Descargue e instale el software en su sistema.
  2. Agregue el archivo EDB de Exchange con el botón Examinar.
  3. Seleccione exportar a buzones de correo de Office 365.
  4. Proporcione los detalles de inicio de sesión de la cuenta de Office 365.
  5. Seleccione la carpeta y presione el botón Finalizar.

Por lo tanto, todos sus buzones de correo de Exchange EDB ahora se migran a Office 365.
Nota: puede usar filtros para migrar los elementos de datos deseados de la cuenta de Exchange a la de Office 365

Líneas finales

Este blog le indica una solución profesional para la migración de buzones de correo de Exchange a la cuenta de Office 365. Dado que las soluciones manuales son complicadas, sugerimos la herramienta de migración de Exchange, que es demasiado simple de usar. Los usuarios no se enfrentan a problemas al operar el programa. La mejor parte de este software es que no necesita habilidades técnicas para realizar la migración. Se puede comprender el funcionamiento del software descargando la versión de demostración que permite la migración de los primeros 50 elementos por carpeta.

Más información:- https://www.datavare.com/software/edb-migration.html

#herramienta de migración de intercambio #migración de intercambio #migrar buzones de correo de exchange

Herramienta de recuperación EDB para recuperar archivos EDB de Exchange corruptos

Todos los datos de Exchange Server, como correos electrónicos, contactos, notas, eventos, calendario, etc. se almacenan en el archivo Exchange EDB. A veces, el archivo EDB se vuelve inaccesible debido a la corrupción o daños en el archivo EDB. La corrupción del archivo EDB puede deberse a varias razones, como: B. grandes cantidades de datos, ataques de virus, problemas de red, etc. En este caso, los usuarios no pueden acceder a sus datos a través de archivos EDB dañados. Debido a esto, es necesario restaurar los elementos del buzón de un archivo EDB dañado. Pero, ¿cómo recuperar elementos de buzón dañados para archivos EDB? La respuesta a esa pregunta se encuentra en este blog. Así que sigamos con esta publicación para obtener una solución inmediata para la recuperación de elementos del buzón de Exchange.

¿Conoce el archivo EDB

El archivo Exchange EDB almacena datos en forma de archivos de base de datos:

Priv1.edb y Pub1.edb

La corrupción puede ocurrir en cualquier archivo EDB. Aquí le ofrecemos una solución para la recuperación de datos de estos dos archivos EDB.

Antes de eso, aclaremos las razones detrás de la corrupción en el archivo EDB, que discutiremos en la siguiente sección de este blog.

Razones detrás de la corrupción de archivos EDB

Estas son las principales razones detrás de la corrupción de archivos EDB.

• Un problema de sincronización con Exchange Server puede dañar el archivo EDB.
• El antivirus instalado en el servidor ha eliminado el archivo de registro.
• Almacenamiento excesivo en Exchange Server.
• Error al proporcionar datos del archivo EDB por Exchange Server.
• Los problemas de hardware o de red pueden dañar el archivo EDB.

Una solución inteligente para restaurar archivos EDB de Exchange

Hay varias formas manuales, como la utilidad Eseutil e Isinteg de Exchange Server, para restaurar la base de datos de Exchange Server. Sin embargo, estos métodos son complicados y es más probable que fallen. En esta situación, se recomienda utilizar otra solución inteligente y eficaz como la herramienta de terceros EDB Recovery. Esta es una de las soluciones más fáciles para restaurar todos los elementos como correo electrónico, contactos, notas, calendario, etc. desde el buzón de Exchange. El software soluciona rápidamente los problemas del archivo EDB y ayuda a los usuarios a obtener todos los elementos del buzón del archivo EDB dañado. Se necesitan unos minutos para reparar los elementos del archivo EDB y le permite exportar los datos recuperados a varios formatos de archivo como PST, EML, MSG, HTML, etc.

Siga los pasos para usar el software de recuperación de EDB para recuperar elementos de buzón de correo corruptos para archivos EDB.

  1. Descargue e inicie el Datavare software de recuperación EDB.
  2. Agregue el archivo EDB usando la opción Examinar.
  3. Seleccione la opción para guardar los datos después de la recuperación.
  4. Seleccione la ubicación del archivo de salida y haga clic en Siguiente.
  5. Guarde el informe de recuperación de archivos EDB y haga clic en Finalizar.
Líneas de cierre

Mit dieser Software, d. H. Der oben beschriebenen EDB-Wiederherstellung, können Benutzer alle beschädigten EDB-Dateien reibungslos reparieren und wiederherstellen. Benutzer haben keine Probleme beim Bedienen der Software. Benutzer können Exchange EDB-Dateien mithilfe der Software in PST und verschiedenen anderen Formaten wiederherstellen und speichern. Durch Herunterladen der Testversion können Benutzer die Funktionen und die Arbeitsgeschwindigkeit der Software überprüfen, indem sie die ersten 50 Elemente pro Ordner wiederherstellen. Wenden Sie sich bei Unklarheiten rund um die Uhr an unser technisches Personal.

Más información:- https://www.datavare.com/software/edb-recovery.html

#herramienta de recuperación de edb #recuperación de adobe #recuperar archivos edb de intercambio corruptos #recuperar archivos edb