Web scrapper with Scrapy

Instalar minted en Windows 10

minted es un paquete de LaTeX que permite añadir código a tu documento y mostrarlo resaltado. Minted utiliza Python para compilar, por lo que el primer paso es instalar Python 2.6 o superior.

  1. Instalar Python
  2. Añadir la ruta de Python a las variables del entorno de Windows.
    1. Botón derecho en el icono de Windows.
    2. Sistema
    3. En el buscador añadir “variables” y clickar en “Editar variables del sistema”.
    4. Clickar en Variables del entorno.
    5. En Variables del sistema, añadir a la entrada Path la localización de la carpeta Scripts de Python. En mi caso está en D:\Windows\Python\Python36-32\Scripts. Es muy probable que este paso no sea necesario en tu sistema y que al instalar Python ya se haya añadido la ruta a las variables del sistema. Si al ejecutar python en CMD da un error, entonces este paso es obligatorio.
    6. Instalar pip.
    7. Instalar pygments:
      1. Abrir CMD en Windows y escribir: pip install Pygments
      2. Probar que se ha instalado correctamente escribiendo en CMD pygmentize -h
    8. Ahora desde TexStudio hay que modificar la llamada al compilador de LaTeX.
      1. Opciones > Configurar TeXStudio > Órdenes
      2. Modificar las entradas LaTeX y PdfLaTeX por: latex.exe -src -interaction=nonstopmode -shell-escape %.tex y pdflatex.exe -synctex=1 -interaction=nonstopmode -shell-escape %.tex respectivamente. De esta manera se añade la etiqueta -shell-escape después de -interaction=nonstopmode
      3. Cerrar TeXStudio
      4. Abrir de nuevo

Y si no ha habido ningún problema en los pasos anteriores, se debería poder compilar utilizando minted. Para más información, visitad la guía de instalación de minted.

 

Desajuste en la referencia a figuras, ecuaciones o tablas en Latex

Si el número que aparece como referencia al referenciar un objeto (imagen, ecuación, tabla, etc.) mediante el comando \ref{} no coincide con el del elemento, es porque la sentencia \caption{} aparece después de la de \label{}.

Esto ocurre porque elementos numerados como /section, \begin{equation} o \caption utilizan un contador para saber qué número es el siguiente elemento. Este contador es \refstepcounter y sirve para incrementar el contador que lleva la cuenta del número de índice de un capítulo, número de ecuación o número de figura. Cuando se escribe una etiqueta \label se guarda esa información en el archivo .aux con el fin de que cuando se escriba \ref en el documento, sepa cuál de todos los contadores debe mostrar para esa referencia. Cuando se está dentro de un entorno como por ejemplo \begin{equation} o \begin{figure} se le está diciendo a \label que incremente el contador de ese entorno. Lo mismo ocurre con table. Por tanto, cuando se pone \label antes que \caption, se incrementa el contador de \label y se muestra el número erróneo en \ref

Para ver los cambios puede que sea necesario recompilar un par de veces.

Fuente: Table numbering mismatch in caption and in text

Identidades trigonométricas

Coseno de la suma:

\[ \cos{(a+b)} = \cos{a} \cos{b} – \sin{a}\sin{b} \]

\[ \cos{(a-b)} = \cos{a} \cos{b} + \sin{a}\sin{b} \]

Seno de la suma:

\[ \sin{(a+b)} = \sin{a}\cos{b} + \sin{b}\cos{a} \]

\[ \sin{(a-b)} = \sin{a}\cos{b} – \sin{b}\cos{a} \]

Coseno del ángulo doble:

\[ \cos{2a} = \cos^2{a} – \sin^2{a}\]

Seno del ángulo doble:

\[ \sin{2a} = 2\sin{a}\cos{a}\]

Diferencia de senos:

\[ \sin{a} – \sin{b} = 2\cos{\frac{a+b}{2}}\cos{\frac{a-b}{2}} \]

Forzar a una imagen aparecer en la sección correspondiente en LaTeX

En LaTeX hay veces que al compilar el documento la imagen aparece en la página siguiente o incluso antes. Para evitar esta situación basta con utilizar unos modificadores en la definición de la figura que son [!h]

  • !: fuerza a sobreescribir cualquier configuración anterior ya descrita.
  • h: fuerza a aparecer en esa misma sección la imagen. h viene de here

Ejemplo:

Coeficiente binomial

\(\binom{n}{i}\) es el número de subconjuntos de \(i\) elementos que se puede hacer con un conjunto \(n\) elementos.

\(n\): número total de elementos
\(i\): longitud de los subconjuntos
\[\binom{n}{i} = \frac{n!}{i! \left( n-k \right)! }\]
Esto nos sirve también para poder entender el ensayo de Bernoulli. Este nos dice que si el resultado de un experimento ocurre con probabilidad \(k\) veces es:
\[P_n \left( k \right) = \binom{n}{k} P_A^k \left( 1-P_A \right)^{n-k}\]

Codificación de vídeo

Para la creación de vídeo, cada píxel se guarda con 8 bits (valores de 0-255). Si se guarda de manera diferencial, los valores pueden ir de -255 a 255. Por tanto, necesitamos 9 bits para codificar cada píxel. La codificación diferencial se utiliza en vídeo porque en muchos casos, las diferencias entre fotograma y fotograma son pequeñas. De esta manera, si se codifica de manera diferencial, es posible ahorra bits. Sin embargo, si las diferencias suelen ser grandes, como ocurre en un cambio de escena, este tipo de codificación no es rentable.

Como en vídeo sí se utiliza codificación diferencial, es necesario intercalar fotogramas codificados de manera absoluta (llamados keyframes) para evitar que un error en un fotograma se propague hasta el final del vídeo. En vídeos que no se supone que se tienen que editar se coloca un keyframe cada 100~200 fotogramas, en TDT se coloca un keyframe cada 0.5 segundos y en vídeos para edición un keyframe cada 2~3 fotogramas.

Además, la información no es diferencial bit a bit, sino que utiliza el movimiento de una zona. Para detectar si el contenido de un fotograma está en el siguiente, se divide la imagen en bloques y se busca el grupo de píxels entero. Si el tamaño de estos bloques fuese muy pequeño, habría que informar del movimiento de muchos bloques, por lo que consumiría muchos bits. Es por ello que los bloques tienen un tamaño de 16×16 y se les llama macrobloques (MB). Sin embargo, para buscar el movimiento los saltos del MB no son de 16 en 16 sino que son más pequeños.

En MPEG-2 se definen 3 tipos de imagen:

  • Intra (I): tiene su información guardada en el propio frame por lo que no se codifica diferencialmente. Un error en I se propaga hasta la siguiente I ya que todo el resto de tipos, depende de su información.
  • Predicción (P): tiene una codificación diferencial, y su información solo puede estar referida a imágenes anteriores intra o otras también predictivas.
  • Bidireccional (B): utiliza información de referencia frames futuros y pasados de imágenes I, P  o una imagen intermedia, pero nunca de otras B. Por tanto, un error en una imagen B no se propaga. La imagen intermedia es el calculo de la imagen media a partir de la referencia futura y la referencia pasada. Se guarda el menor error entre la media, la pasada y la futura. Para guardar la media, el codificador debe guardar los dos vectores de movimiento.

Por tanto, en la codificación y decodificación se necesita más memoria para almacenar las imágenes hasta que se satifagan las dependencias.

Polarización de una onda plana que no se propaga según los ejes

Uno de los casos más complicados y que engloban todas las posibles dificultades en el cálculo de la polarización es en el caso de tener una onda plana que no se propaga según los ejes.

Primero vamos a comenzar por recordar cómo se pueden clasificar las diferentes polarizaciones de onda electromagnética.

  1. Polarización lineal: la onda electromagnética se propaga variando su amplitud en una línea.
  2. Polarización circular: la onda electromagnética dibuja una circunferencia.
  3. Polarización elíptica: la onda electromagnética se propaga dibujando una elipse.

Para averiguar con qué polarización se propaga una onda electromagnética se tienen que satisfacer las siguientes condiciones:

  1. Polarización lineal: se da cuando una de las dos componentes perpendiculares es nula o cuando el desfase entre ambas es múltiplo de $\pi$ ($0$, $\pi$, $2\pi$, …).
  2. Polarización circular: la onda electromagnética tiene dos componentes de la misma amplitud y se encuentran desfasadas un multiplo entero de $\frac{\pi}{2}$, por lo que la onda electromagnética. Si $\phi_2 – \phi_1 > 0$ se trata de polarización circular a izquierdas (o levogira) mientras que si $\phi_2 – \phi_1 < 0$ se trata de polarización circular a derechas (o dextrogira).
  3. Polarización elíptica: no se satisfacen ninguno de los requisitos anteriores.

Algoritmo general de análisis de polarización

  1. Definir vector unitario del sentido de propagación $\hat{\mathbf{k}}$: es el vector que acompaña la exponencial compleja cambiado de signo.
  2. Escoger una base unitaria en la que descomponer la amplitud $\mathbf{e_1}$. Para calcular la polarización, hay que escribir la amplitud de la onda electromagnética en dos vectores perpendiculares al vector de propagación. Por tanto, podemos escoger cualquier vector que sepamos que sea perpendicular al vector $\hat{\mathbf{k}}$.
  3. Calcular la base perpendicular a $\hat{\mathbf{k}}$ y $\mathbf{e_1}$. Para ello hay que realizar el producto vectorial $\hat{\mathbf{k}} \times \mathbf{e_1}$.
  4. Descomponer la amplitud del campo en las bases $\mathbf{e_1}$ y $\mathbf{e_2}$ en forma compleja polar. Es tan sencillo como hacer el producto escalar de la amplitud por el vector unitario de ambas bases.
  5. Dividir el módulo de $E_{01}$ entre $E_{02}$ y restar $\phi_2 – \phi_1 $ y verificar a qué caso de polarización pertenece.

Ejemplo

\[\mathbf{E} = \left[ 4\hat{\mathbf{x}} + \left(1+\sqrt{3}j \right)\hat{\mathbf{y}} – \left(5+\sqrt{3}j \right)\hat{\mathbf{z}} \right]e^{-j \pi \left(x + y +z \right)}\]

    1. Vector unitario del sentido de propagación: $\hat{\mathbf{k}} = \frac{\mathbf{x} + \mathbf{y} +\mathbf{z} }{\sqrt{3}}$
    2. Escoger base unitaria perpendicular a $\hat{\mathbf{k}}$: $\mathbf{e_1} = \frac{\mathbf{x}-\mathbf{y}}{\sqrt{2}}$
    3. Calcular base unitaria perpendicular a $\hat{\mathbf{k}}$ y $\mathbf{e_1}$: $\mathbf{e_2} = \hat{\mathbf{k}} \times \mathbf{e_1}$ $= \frac{1}{\sqrt{3}\sqrt{2}}
      \begin{vmatrix}\mathbf{x} & \mathbf{y} & \mathbf{z}\\ 1 & 1 & 1\\ 1 & -1 & 0\end{vmatrix}

      $ $= \frac{\hat{\mathbf{x}} + \hat{\mathbf{y}} -2\hat{\mathbf{z}}}{\sqrt{6}}$

    4. Reescribimos la onda original con las nuevas bases $\mathbf{e_1}$ y $\mathbf{e_2}$.

$E_{01}$ $= \mathbf{E} \cdot \mathbf{e_1} $ $= \left( 4\hat{\mathbf{x}} + \left(1+\sqrt{3}j \right)\hat{\mathbf{y}} – \left(5+\sqrt{3}j \right)\hat{\mathbf{z}} \right)\cdot \left( \frac{\hat{\mathbf{x}}-\hat{\mathbf{y}}}{\sqrt{2}} \right)$ $= \sqrt{6} e^{-j \frac{\pi}{6}}$

$E_{02}$ $= \mathbf{E} \cdot \mathbf{e_2} $ $= \left( 4\hat{\mathbf{x}} + \left(1+\sqrt{3}j \right)\hat{\mathbf{y}} – \left(5+\sqrt{3}j \right)\hat{\mathbf{z}} \right)\cdot \left(\frac{\hat{\mathbf{x}} + \hat{\mathbf{y}} -2\hat{\mathbf{z}}}{\sqrt{6}} \right)$ $= \sqrt{42} e^{j 0.33}$

$\mathbf{E}$ $= \left[ \sqrt{6} e^{-j \frac{\pi}{6}} \frac{\hat{\mathbf{x}}-\hat{\mathbf{y}}}{\sqrt{2}} + \sqrt{42} e^{j 0.33} \frac{\hat{\mathbf{x}} + \hat{\mathbf{y}} -2\hat{\mathbf{z}}}{\sqrt{6}} \right]e^{-j \pi \left(x + y +z \right)}$

    1. Comprobar las condiciones:

$\frac{E_{02}}{E_{01}} = \frac{\sqrt{42}}{\sqrt{6}} \approx 2.64$, $\phi_2 – \phi_1 = 0.33 + \frac{\pi}{6} \approx 0.8565$
Como no se satisface ninguna de las condiciones para polarización lineal ni circular, se trata de una polarización elíptica a izquierdas (diferencia de fases positiva).