Cómo Definir Colores Personalizados en LaTeX

05/04/2019
Artículo original

Cómo Definir Colores Personalizados en LaTeX

Os traigo hoy otro artículo interesante que he encontrado en el blog de blog de Tom. Veremos cómo es posible definir colores personalizados en LaTeX con el paquete xcolor.

Hay distintas formas de definir un color específico en LaTeX. Normalmente lo más fácil es elegir un color predefinido del paquete xcolor o definirlo a mano usando el modelo RGB. Otra notación existente es red!40!blue. Esta notación crea un morado con 40% rojo y 60% azul. Veamos en este artículo los distintos métodos disponibles para la especificación de colores.

Colores predefinidos

El paquete xcolor trae definidos una gama amplia de colores, especificados en su documentación. Es tan simple de usar como se muestra en este trozo de código:

\documentclass[11pt]{article}
\usepackage{blindtext}

\usepackage[x11names]{xcolor}

\begin{document}

\textcolor{RoyalBlue2}{\blindtext}

\end{document}
Cómo Definir Colores Personalizados en LaTeX Crédito de la imagen: texblog.org

Mezclar colores usando un modelo de color

El paquete xcolor permite definir colores usando modelos de color (gris, RGB, HTML, CMYK y otros ). Veamos un ejemplo de RGB, al que estamos más acostumbrados:

\documentclass[11pt]{article}
\usepackage{blindtext}

\usepackage{xcolor}
\definecolor{myOrange}{rgb}{1,0.5,0}

\begin{document}

\textcolor{myOrange}{\blindtext}

\end{document}
Cómo Definir Colores Personalizados en LaTeX Crédito de la imagen: texblog.org

Mezclar dos colores

Para terminar, el paquete xcolor también permite definir un color mediante la mezcla de dos colores predefinidos. Por ejemplo, para definir un morado con 40% de azul y 60% de rojo:

\documentclass[11pt]{article}
\usepackage{blindtext}

\usepackage{xcolor}
\colorlet{myPurple}{blue!40!red}

\begin{document}

\textcolor{myPurple}{\blindtext}

\end{document}
Cómo Definir Colores Personalizados en LaTeX Crédito de la imagen: texblog.org

Ejemplo: Colores brillantes

Los colores básicos como el rojo, verde o amarillo son demasiado chillones a la vista. Para atenuar su intensidad, es posible usar el modo de definir colores de arriba y luego mezclarlos con gris. Por ejemplo, combinar el 40% del color chillón con 60% de gris atenua la intensidad del color, haciendolo más agradable a la vista, compruébalo tú mismo:

Cómo Definir Colores Personalizados en LaTeX Crédito de la imagen: texblog.org

Aquí el código que genera la imagen de arriba:

\documentclass[border=10pt,varwidth]{standalone}
\usepackage{pgffor}
\usepackage[x11names]{xcolor}

\newcommand\colorrulemix[1]{\textcolor{#1!40!gray}{\rule{1cm}{1cm}} }
\newcommand\colorrule[1]{\textcolor{#1}{\rule{1cm}{1cm}} }

\begin{document}

\begin{center}
\foreach \name in { {red},{orange},{yellow},{green},{cyan},{blue},{purple}} {
    \colorrule{\name}}

\rule{\linewidth}{1pt}
\phantom{}\par


\foreach \name in { {red},{orange},{yellow},{green},{cyan},{blue},{purple}} {
    \colorrulemix{\name}}
\end{center}
\end{document}

Referencias

21 alias útiles para git

05/04/2019
Artículo original

Todo aquel que use git sabrá que en ocasiones es un poco tedioso escribir los comandos a ejecutar. Para ello existen los alias, que nos permiten crearnos atajos a la hora de ejecutar un comando. En este artículo se recopilarán unos cuantos alias útiles para el día a día. Os animo a que comentéis vuestros preferidos para ir aumentando la lista!. Comencemos.

git ec

Como no, el primer alias tenía que ser uno que nos permita editar la configuración de git rápidamente:

git config --global alias.ec "config --global -e"

A partir de ahora, podremos abrir la configuración de git con nuestro editor por defecto con git ec.

El resto del artículo asumirá que se tiene la configuración abierta con un editor, los aliases se escribirán directamente en la sección [alias] de dicho fichero.

git co, br, cm, st

Estos aliases pretenden más que facilitar la escritura de checkout, branch, commit -am y status. Básicamente los comandos que más uso.

co = checkout
br = branch
cm = commit -am
st = status

Veamos ahora una serie de aliases que he extraido de haacked:

Actualizar el directorio de trabajo

Para simplificar estos dos comandos

git pull --rebase --prune
git submodule update --init --recursive

en los que el primero obtiene los cambios desde el servidor, si se tienen commits locales, se ponen al principio de los descargados (rebase), y con prune se eliminan ramas que ya no existan en el servidor. El segundo simplemente actualiza recursivamente submódulos. El alias quedará:

up = !git pull --rebase --prune $@ && git submodule update --init --recursive

Este alias es algo distinto, la exclamación indica que se va a ejecutar un comando en la shell, es decir, podemos ejecutar cualquier comando, no solo de git. En este caso, se están ejecutando dos comandos git.

git save, git wip, git undo, git amend

Estos dos alias están destinados a cuando simplemente queremos guardar nuestros cambios, ya sea porque tenemos que irnos a hacer otras cosas, o simplemente no hemos acabado el trabajo y aún no tenemos un nombre para el commit adecuado. Con ellos, se guardan los cambios con un mensaje de commit SAVEPOINT o WIP, en función del alias que os guste más:

save = !git add -A && git commit -m 'SAVEPOINT'
wip = commit -am "WIP"

Una vez volvamos a trabajar, simplemente ejecutamos el alias undo, que elimina el último commit, pero deja intactos los cambios:

undo = reset HEAD~1 --mixed

O si simplemente queremos modificar el mensaje del commit, usamos el alias amend:

amend = commit -a --amend

Resetear el directorio de trabajo adecuadamente, git wipe

Cuantas veces hemos comenzado a trabajar o intentar añadir algo al código y al final lo único que hicimos fue ensuciar todo el directorio, montones de líneas de código sin ordenar etc. Lo mejor en estos casos es descartar todo y volver a empezar. Para ello es posible usar git reset HEAD --hard, pero esto borrará todo, sin que quede constancia de lo que hicimos. Para descartar el código, pero que quede constancia de lo que hicimios, por si alguna vez nos hace falta, crearemos el alias wipe:

wipe = !git add -A && git commit -qm 'WIPE SAVEPOINT' && git reset HEAD~1 --hard

Hace un commit de todo lo que hay en el directorio de trabajo para luego hacer un hard reset y eliminar dicho commit. A pesar de ello, el commit seguirá ahí, en la historia del repositorio, aunque inalcanzable. Estos commits son un poco complejos de recuperar, pero al menos seguimos teniendo aquel trabajo del que no quedamos del todo convencidos. Quizá algún día recuerdes que necesitabas una línea de código que escribiste. Para recuperarlo hay que ejecutar git reflog y buscar el SHA del commit que tenga como mensaje “WIPE SAVEPOINT”.

Alias para logs

Veamos ahora una serie de alias para mostrar los logs de los commits de distintos modos.

Mostrar commits de forma compacta y colores, git ls

21 alias útiles para git

El alias es el siguiente:

ls = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate

Listar commits y ficheros modificados, git ll

21 alias útiles para git

El alias es el siguiente:

ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat

Mostar commits de forma compacta y con fechas, git lds

21 alias útiles para git
lds = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=short

Si lo preferimos con fechas relativas, usaremos el alias git ld:

21 alias útiles para git
ld = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=relative

Buscar ficheros y contenido dentro de ficheros (grep)

Para buscar ficheros con conteniendo el nombre indicado:

f = "!git ls-files | grep -i"

Ejemplo:

$ git f one

P3/oneway/Utils.py
P3/oneway/__init__.py
P3/oneway/ej1.py
P3/oneway/ej2.py
P3/oneway/ej3.py
P3/oneway/ej4.py
P3/oneway/ej5.py
P3/oneway/ej6.py
P3/oneway/ej7.py

Para buscar contenido dentro de todo el repositorio:

grep = grep -Ii
gr = grep -Ii

Ejemplo:

$ git grep Rabin

P1/modularArith/ej4.py:def MillerRabin(p):
P1/modularArith/ej4.py:    print MillerRabin(90221078753392184154149622269679731705920869572364323146777389106744249167893287091491005751893264013854756094230384816436985035887367570198390830836626929620930395458607390051335962764852769424941031051670131521265969408350800112779692655340042253991970492761524977413231930703094065023050574077317620529581736775256036443993928340221545607375549860405933153255776836414051570996984167934585339322850189347872718439350738428272565094611168867981011370318335242028953808721309056435214502065537377043)

Para buscar desde el directorio raíz:

gra = "!f() { A=$(pwd) && TOPLEVEL=$(git rev-parse --show-toplevel) && cd $TOPLEVEL && git grep --full-name -In $1 | xargs -I{} echo $TOPLEVEL/{} && cd $A; }; f"

Listar todos los aliases, git la

Ahora que ya llevamos unos cuantos aliases, quizá sean dificil de recordar hasta que nos acostumbremos, por ello, podemos crear un alias que liste todos los nuestros aliases :-):

la = "!git config -l | grep alias | cut -c 7-"

Listar la última etiqueta, git lt

lasttag = describe --tags --abbrev=0
lt = describe --tags --abbrev=0

Alias para hacer merges, git ours, git theirs

ours = "!f() { git co --ours $@ && git add $@; }; f"
theirs = "!f() { git co --theirs $@ && git add $@; }; f"

Eso es todo, comentad vuestras alias para completar este artículo!

Recopilación

Aquí se muestran todos los alias vistos:

[alias]
  ec = config --global -e
  co = checkout
  br = branch
  cm = commit -am
  st = status
  up = !git pull --rebase --prune $@ && git submodule update --init --recursive
  save = !git add -A && git commit -m 'SAVEPOINT'
  wip = commit -am "WIP"
  undo = reset HEAD~1 --mixed
  amend = commit -a --amend
  wipe = !git add -A && git commit -qm 'WIPE SAVEPOINT' && git reset HEAD~1 --hard
  ls = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate
  ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat
  lds = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=short
  ld = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=relative
  f = "!git ls-files | grep -i"
  grep = grep -Ii
  gr = grep -Ii
  gra = "!f() { A=$(pwd) && TOPLEVEL=$(git rev-parse --show-toplevel) && cd $TOPLEVEL && git grep --full-name -In $1 | xargs -I{}   echo $TOPLEVEL/{} && cd $A; }; f"
  la = "!git config -l | grep alias | cut -c 7-"
  lasttag = describe --tags --abbrev=0
  lt = describe --tags --abbrev=0
  ours = "!f() { git co --ours $@ && git add $@; }; f"
  theirs = "!f() { git co --theirs $@ && git add $@; }; f"

Referencias

Vídeo - Evolución Del Blog Desde El Punto De Vista De Git

05/04/2019
Artículo original

Vídeo - Evolución Del Blog Desde El Punto De Vista De Git

Hace algún tiempo que hablé del programa Gource, una herramienta que permite visualizar la evolución y contribuciones de un proyecto git. En su día expliqué en un breve tutorial cómo usar gource. Hoy se me ocurrió ejecutar este programa sobre el repositorio que almacena este blog. El resultado me pareció curioso y quise grabarlo en vídeo para enseñároslo.

La plantilla de este blog es obra de Minimal Mistakes, yo simplemente adapté dicha plantilla a mi blog.

Visualización del repositorio git con gource

Sin más dilaciones, aquí el vídeo, a la izquierda, en rojo, se ven los ficheros correspondientes a los artículos. A la derecha, en azul, las imágenes. Espero que os guste.

Los 10 Artículos Más Visitados De 2015

05/04/2019
Artículo original

Los 10 Artículos Más Visitados De 2015 Crédito de la imagen: Buffer

Prácticamente hemos terminado este 2015. Llegadas estas fechas, me gusta acudir a las estadísticas para sacar conclusiones y ver qué artículos han gustado más. Abajo se muestra una lista con los 10 más visitados. ¿Y a tí, qué artículo del blog ha sido el que más te ha gustado?, déjanos un comentario con tu opinión.

#1 Códigos secretos y ocultos para Android

En este caso el título es bastante explicativo

Enlace al artículo

#2 Cual es la diferencia entre los distintos formatos de audio y cual debería elegir

Un repaso por los distintos formatos de audio que existen, describiendo las características de cada uno de ellos

Enlace al artículo

#3 Los 11 mejores frameworks gratuitos para aplicaciones webs

Un repaso a los frameworks webs gratuitos disponibles.

Enlace al artículo

#4 Cursores PL/SQL

Explicación de cómo funcionan los cursores en el lenguaje PL/SQL.

Enlace al artículo

#5 Programación Android: Intents - conceptos básicos

Este artículo forma parte del [curso de Android][/curso-programacion-android/]. En él se explica el funcionamiento de los intents en Android, qué son, y qué tipos hay.

Enlace al artículo

#6 Mini tutorial y chuleta de comandos git

Un artículo que ha ido ganando popularidad en estos meses. Decidí crearlo a raiz de leer el libro Pro Git a modo de resumen. En él se describe el uso de los principales comandos en git.

Enlace al artículo

#7 Cómo configurar un servidor DNS

Este artículo es parte de una serie de 3 artículos en los que se describe cómo configurar un servidor DNS desde cero.

Enlace al artículo

#8 20 Ejemplos de iptables para SysAdmins

Un artículo que recopila 20 ejemplos de uso del comando iptables. A lo largo de los años he escrito bastante sobre este comando, puedes ver todos los artículos en la sección de iptables.

Enlace al artículo

#9 Buenas prácticas para el diseño de una api RESTFUL

Recopilación de buenas prácticas que se deberían seguir a la hora de diseñar una API RESTFUL.

Enlace al artículo

#10 PL/SQL Disparadores o Triggers

Otro artículo se cuela en la lista sobre PL/SQL, en este caso para explicar qué son los triggres.

Enlace al artículo

Programación Android - Conceptos básicos

05/04/2019
Artículo original

Conceptos básicos Android

  • View: Representa el componente básico en el que se apoyan todos los elementos que construyen una interfaz. Todos los elementos que generan interfaces heredan de la clase View
  • Activity: Encargada de mostrar la interfaz de usuario e interactuar con él. Responden a los eventos generados por el usuario (pulsar botones etc). Heredan de la clase Activity.
  • Services: No tienen interfaz visual y se ejecutan en segundo plano, se encargan de realizar tareas que deben continuar ejecutandose cuando nuestra aplicación no está en primer plano. Todos los servicios extienden de la clase Service
  • Content Provider: Ponen un grupo de datos a disposición de distintas aplicaciones, extienden de la clase ContentProvider para implementar los métodos de la interfaz, pero para acceder a esta interfaz se ha de usar una clase llamada ContentResolver.
  • BroadcastReceiver: Simplemente reciben un mensaje y reaccionan ante él, extienden de la clase BroadcastReceiver, no tienen interfaz de usuario, pero pueden lanzar Actividades como respuesta a un evento o usar NotificationManager para informar al usuario.
  • Intent: Permite realizar la comunicación y transferencia de datos entre objetos de la clase Activity o Service. También permite iniciar otras Activities o lanzar otras aplicaciones.

Hola Mundo

Veamos ahora cómo crear la típica aplicación Hola Mundo .

Crear el proyecto

Para ello, en Android Studio, hacemos click en File » New Project. Una vez creada, veremos que la estructura de la aplicación es la mostrada en la imagen.

Componentes del proyecto

Los proyectos de Android siguen una estructura fija de carpetas que debemos respetar.

{{ page.title }}

Carpeta Res

Esta es una de las carpeta que más se va a usar junto con src. Se compila y se generan referencias en la clase R, para acceder a ellos desde código. Están escritos en XML. El propósito de esta carpeta es separar la lógica de la aplicación de la interfaz.

  • anim: Definición de Animaciones.
  • color: Definición de colores
  • drawable: Ficheros bitmap(.png, .9.png, .jpg, .gif) o XML con contenidos que se dibujarán (fondos, botones etc).
  • layout: Definen la capa de interfaz de usuario
  • menu: Definición de los menús de la aplicación
  • raw: Binarios que no se pueden colocar en las otras carpetas.
  • values: Definición de estilos, cadenas de texto para Localización etc.
  • xml: Ficheros XML que pueden ser accedidos en tiempo de ejecución

Hola Mundo

Pasemos ahora a describir los distintos componentes de la aplicación.

La apliación creada por defecto tendrá un Activity muy simple, uno de los métodos más importantes de esta clase es onCreate, en él se crean y se instancias los componentes necesarios para dicha Activity, se instancias componentes gráficos, se establecen los callbacks necesarios, eventos etc. El código más simple que se puede obtener en este método es el siguiente:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  /**
   * Método encargado de “inflar” la actividad.
   * Inicializar cada componente de la actividad
   * con su correspondiente View.
   */
  setContentView(R.layout.activity_main);
}

Es importante añadir la línea setContentView(R.layout.activity_main);, ya que aquí se define qué layout (Interfaz gráfica) va a usar esta Activity. De no añadirla, cualquier referencia que intentemos hacer de un componente gráfico fallará.

Ciclo de vida de una Activity

La siguiente imagen muestra el ciclo de vida de una Activity, esto es qué flujo de llamadas siguen las aplicaciones. Como vemos, onCreate es el primero método en llamarse al lanzar una Activity, es por ello que en él debemos hacer todas las inicializaciones necesarias. Si lo necesitamos, podemos implementar todos y cada uno de estos métodos. Por ejemplo, en una aplicación de vídeo, interesará detener la reproducción cuando se recibe una llamada, o cuando la pantalla se apaga, toda esa lógica deberá ir en el método onPause o onStop, y debería reanudarse implementando la lógica en onRestart o onResume.

{{ page.title }}

./res/layout/activity_main.xml

Este es el fichero que especifica qué interfaz gráfica queremos en nuestra Activity (Recordemos la llamada setContentView(R.layout.activity_main);). En este caso, la interfaz es un simple TextView que mostrará el mensaje Hola Mundo. (El texto se ha especificado haciendo referencia al fichero de cadenas (strings.xml) definido más abajo, en concreto se hace referencia a la cadena de texto de valor hello_world).

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
</RelativeLayout>

./res/values/strings.xml

Aquí se definen las cadenas de texto a usar en la aplicación. Siempre deben escribirse en un fichero XML dentro de la carpeta values, ya que de este modo podremos traducir la aplicación a otro idioma fácilmente con tan solo crear otra carpeta llamada values-de, por ejemplo, que contenga las cadenas de texto en Alemán. En este caso, se crea una única cadena de texto de nombre hello_world y de valor Hello World!.

<resources>
    <string name="hello_world">Hello world!</string>
</resources>

En el siguiente artículo se verá a fondo la aplicación Hola Mundo tal y como la crea en estos momentos Android Studio, usando Fragments en lugar de Activity.

¿Por qué es Linux más rápido que Windows?

05/04/2019
Artículo original

En el blog techdrivein escribieron un artículo hace poco a mi parecer interesante, ¿Por qué es Linux más rápido que Windows?, veamos algunos de los motivos:

La pregunta y su consecuente respuesta, aparecieron en un hilo de Reddit en el que un usuario que acababa de instalar Ubuntu en su máquina afirmaba que nunca había visto ninguna web cargar tan rápido como Reddit en su recién instalado Ubuntu.

La pregunta anterior genera mucho debate. Algunos dicen que es un mito pero la mayoría de usuarios Linux saben que no lo es. En cierta manera porque casi todo aquel que instala Linux fue un usuario Windows descontento. Sin embargo, ¿Qué hace a Linux más rápido?, citaremos los puntos que el usuario de Reddit ok_you_win mencionó.

  • Uno de los mayores beneficios ocultos de Linux es que las aplicaciones comparten archivos mejor que Windows. En lugar de usar DLLs como en Windows, Linux usa ficheros .so (Shared Objects [Objetos Compartidos]), que vienen a llamarse librerías. Existen también ficheros .ko, que son los homólogos para el kernel, de alguna manera, como los drivers en Windows.
  • Una aplicación Windows puede depender de una versión muy específica de una DLL. El desarrollador de ésta aplicación no conoce en qué versión de Windows se instalará, ni tampoco qué DLL estará presente en el sistema. Por lo tanto, la solución más fácil es incluir la DLL necesaria junto a la aplicación. Como consecuencia los instaladores son mucho más pesados, ocupará más espacio en disco y usará más memoria RAM.
  • Linux actua de forma diferente. Por ejemplo, si se quiere instalar el navegador web Midori, apt-get o el centro de software que actúe como front-end comprueba el paquete en busca de una lista de dependencias. En lugar de incluir todos los archivos, Midori sólo se limita a decir de qué aplicaciones o librerías depende.
  • Por tanto, apt-get comprueba el sistema y detecta que el fichero FileX.so.1 ya está instalado, y es una dependencia de Midori. Con lo cual no es necesario descargarlo e instalarlo. Éste proceso se repite para todas las dependencias del paquete a instalar (en este caso Midori) e instalará las que no existan actualmente en el sistema. Una vez satisfechas todas las dependencias, se instala el paquete en sí. Como consecuencia, cualquier programa se puede instalar más rápido y no usa tanto espacio ni en disco ni en memoria.
  • El sistema apt-get realiza un seguimiento de cuantas aplicaciones necesitan FileX.so.1, de modo que si se desinstala midori y otras aplicaciones necesitan FileX.so.1, éste no será eliminado.

Éstos motivos no son los únicos que hacen a linux más rápido que Windows. Se pueden encontrar motivos a nivel del Kernel explicados por un desarrollador anónimo del kernel de Windows.

Referencias

¿Eres chica y te gusta la informática?, participa en el campus UGR/Google para chicas

05/04/2019
Artículo original

La facultad de informática de Granada (ETSIIT), en la cual estudio, está llevando a cabo una campaña junto a Google para que más chicas se animen a cursar carreras tecnológicas como Informática o Telecomunicaciones.

El campus comienza el día 7 de Julio y acabará el 18 de ese mismo mes. A continuación se describe de qué trata dicho campus. Espero que todas las chicas Granadinas que lean esto se animen a participar y disfruten de la experiencia.

Hasta 32 chicas de 14 a 18 años y 3 profesoras de IES aprenderán a crear aplicaciones y videojuegos en un curso diseñado para impulsar las carreras de ingeniería entre las mujeres

Google, la ETS de Ingenierías Informática y de Telecomunicaciones y la Oficina de Software Libre de la Universidad de Granada organizan, con la financiación de Google, el “Campus Tecnológico UGR/Google para chicas”, que comenzará el próximo lunes 7 y durará hasta el 18 de julio.

Hasta 32 alumnas de tercero, cuarto de ESO, primero de Bachillerato y módulos, junto a tres profesoras de Tecnología, Matemáticas y Física, tendrán la oportunidad de aprender lenguajes de programación para crear una aplicación móvil, un juego o un sistema electrónico; ayudadas y enseñadas por profesoras y tutoras estudiantes o doctoras de Informática y Telecomunicaciones, o en general personas relacionadas con las nuevas tecnologías.

Según el INE el último año el alumnado que se matriculó en la opción científico tecnológico de la ESO supuso aproximadamente la tercera parte de chicas que de chicos (1.392 frente a 4.090) De esas 1.392, sólo 16 acabaron escogiendo el grado en Informática; si sumamos Telecomunicación y el doble grado serían en total 50 aproximadamente, es decir, sólo una de cada 40 chicas que elige la opción tecnológico en ESO estudia Informática.

Es un hecho que hay pocas mujeres que estudian Informática, como demuestra que este curso el porcentaje de mujeres matriculadas en el Grado de Informática en la ETS de Ingenierías Informática y de Telecomunicaciones no supera el 10%. Empresas como Microsoft o IBM intentan que la Informática sea una carrera más atractiva para las mujeres y ofrecen campamentos para alumnas de instituto donde aprendan a usar la informática de forma instrumental, un enfoque que les puede resultar más interesante.

Las clases de este campus tendrán un enfoque práctico y estarán encaminadas a que las alumnas aprendan herramientas básicas de programación y creen, en grupo, una aplicación para móviles, un juego o un dispositivo de cualquier tipo basado en Arduino o Raspberry Pi. Al final del curso las alumnas habrán terminado un pequeño proyecto informático y, además, habrán aprendido a trabajar en grupo usando herramientas TIC y a presentar los resultados de las mismas. Las monitoras serán también estudiantes de Informática o Telecomunicaciones de los últimos cursos, y ayudarán a todos los grupos de trabajo a llevar a cabo los proyectos; estos se evaluarán y recibirán una serie de premios.

Cómo contactar con los organizadores

Universidad de Granada

JJ Merelo, director de la Oficina de Software Libre. dirosl@ugr.es

Comunicación

Sandra Cámara, Community Manager No Solo Una Idea: sandracamara@nosolounaidea.com

¿Odias Java? Estás peleando una batalla equivocada

05/04/2019
Artículo original

Una de las más interesantes tendencias que se ven ultimamente es la impopularidad de Java en los blogs, foros y otros. Pareciera que la gente está ofendida hasta incluso a nivel personal, cuando se sugiere a Java como el lenguaje superior en la web 2.0.

Java ha sido ampliamente exitoso por varias razones:

  • Es extensamente aceptado en las compañías establecidas
  • Es uno de los lenguajes más rápidos
  • Es uno de los más seguros
  • Las primitivas de sincronización están incorporadas en el lenguaje
  • Es independiente a la plataforma
  • Hotspot es open source
  • Existen miles de vendedores para una gran cantidad de productos Java
  • Existen miles de librerías open source para Java
  • Tiene un gobierno comunitario vía JCP (pre-Oracle)

Estos son aspectos importantes en cualquier lenguaje, y se nota, ya que Java ha disfrutado de una larga racha de ser uno de los lenguajes más populares. Entonces, ¿por qué entre el 2010 y 2011, Java se volvió repentinamente el demonio más odiado?

  1. Está de moda odiar Java
  2. La sintaxis estilo C ya no está de moda
  3. El odio por Oracle está siendo estimulado por la promoción de los intereses individuales
  4. La gente ha tenido que enfrentarse con código realmente malo, escrito en Java
  5. … Inserte las próximas cien razones aquí.

Java (el lenguaje y las APIs) tiene algunos problemas reales… demasiados como para listarlos aquí (una mezcla de tipos nativos y tipos de objetos, una gran cantidad de APIs abandonadas, uso inconsistente de excepciones checkeadas). Pero no nos vayamos por las ramas… Discutamos el problema real y no nos focalicemos en nimiedades. Entonces, ¿cuál es el verdadero problema en esta industria? Java, con sus faltas, ha conquistado completamente la programación web. Al margen, nuevos lenguajes están siendo inventados tan rápido como se imaginan, para también conquistar la programación web. La batalla se dio a lugar, y nos quedamos con lo que pareciera una disputa callejera de adolescentes que se enfrentan a través del break-dancing. Y mientras todo el mundo está discutiendo entre PHP o Rails 3.1 cuál es más rápido y puede responder a más peticiones simultáneas, se esconde un elefante silencioso en la sala, que se está riendo en voz baja mientras se discuten argumentos infantiles sobre sintaxis y tiempos de ejecución.

Sigamos.

¿Qué tienen en común las siguientes acciones?

  • Pagar con tarjeta de crédito.
  • Ir a una guardia de emergencias.
  • Pagar la jubilación
  • Usar la tarjeta de tu cobertura médica en el dentista.
  • Ir de shopping para conseguir el mejor seguro de auto.
  • Un tren de BNSF remolcando un coche de Union Pacific.
  • Transferir dinero entre bancos.
  • Llenar una receta médica

Todas las industrias mencionadas son jugadores de miles de millones de dólares en nuestra economía. A día de hoy, muchas de estas industrias siguen escribiendo sus programas en COBOL, FoxPro y ensamblador para mainframes.

Por alguna razón, COBOL, inventado en 1959, sigue usándose para crear aplicaciones hoy día. ¡En serio! No estamos hablando de mantener unas pocas líneas de código aquí o allá, hablamos de miles de nuevas líneas, cada día, para implementar nuevas funcionalidades y nuevos requerimientos. Estas industrias son esenciales; forman los ladrillos de nuestra economía. A pesar de ello, no innovan y por ello acarrean gastos masivos a raíz de las nuevas tendencias tecnológicas. Los costos de poner en marcha negocios son enormes, y un buen porcentaje de ellos corresponde a IT.

¿Qué tanto? Hablemos sobre licencias de mainframes, por ejemplo. Digamos que compras un versión Enterprise de MongoDB y la pones en una caja. Luego procedes a colapsar la CPU haciendo una transacción tras otra a la base de datos… La siguiente semana, te vas de vacaciones, y dejas a MongoDB levantada sin hacer nada. ¿Cuánto costará MongoDB en ambas semanas? Lo mismo.

La licencia del software de mainframes es muy diferente. Supongamos que compras tu mainframe por un par de millones y compras una base de datos para él. Luego pasas toda la semana saturando la CPU(s) con peticiones a la base de datos. Revisas tu email, y tienes una factura de un millón de dólares del vendedor de la base de datos. Un momento, yo compré el hardware, ¿por qué tengo que pagar otra factura? El software en un mainframe es generalmente cobrado por su uso, o por cuántos ciclos de CPU gastas usándolo. Si usas 2000000 ciclos de cpu corriendo la base de datos, terminarás debiéndole 2000 euros al vendedor. ¿Bizarro? ¡Absolutamente!

Estas industrias invisibles que utilizas cada día están llenas de sistemas engordados y heredados, y de altos costos. Java se propone conquistar muchos frentes, y mientras se mete a fondo en el terreno de las aplicaciones web, se está distrayendo respecto a la computación centralizada. Estas industrias se siguen quedando con sus sistemas heredados porque no creen que Ruby, Python, Scala, Lua, PHP o Java puedan manejar la carga, la escalabilidad, o los requerimientos en tiempo que sus sistemas ya proveen. Esto dista mucho de ser cierto, pero repito, no ha habido innovación en este área en los últimos 15 años, a pesar de que el progreso de la tecnología web viene dando un salto galáctico.

Probablemente la semana próxima alguien invente un nuevo DSL que haga Twitter más fácil de usar, pero tu banco estará desarrollando nuevo COBOL o FoxPro para transferir fondos a otro banco de forma más eficiente. Nos complicamos a nosotros mismos con nuestros propios argumentos. Hay una economía entera que necesita ver los beneficios de la computación distribuida, pero si la guerra continúa, seguimos perdiendo. Dejemos estos argumentos ridículos, levantemos la bandera de la paz, y conquistemos algunos de estos gigantes.

Referencias

¿Cual es la diferencia entre los distintos formatos de audio, y cual debería elegir?

05/04/2019
Artículo original

Hay tantos formatos de sonido que podemos hacernos un lío a la hora de decidir cual usar, cual aporta mayor calidad al sonido… echemos una vista rápida a los distintos formatos existentes:

Formatos sin pérdidas: WAV, AIFF, FLAC, Apple Lossless y otros

Para conocer la diferencia entre formatos con y sin pérdida visita Does Bitrate Really Make a Difference In My Music?. En resumen, hay dos tipos de calidad de sonido: sin pérdida y con pérdida. La música si pérdida conserva la calidad de sonido de la fuente original — en la mayoría de los casos, CD — intacta, por otra parte, la música con pérdidas comprime el archivo para ahorrar espacio (a cambio de disminuir la calidad). En los formatos sin pérdidas se incluyen los siguientes formatos:

  • WAV y AIFF: Ambos son formatos sin compresión, con lo cual son copias exactas de la fuente original de sonido. Los dos formatos tienen esencialmente la misma calidad; simplemente almacenan los datos de manera diferente. AIFF lo creó Apple -Lo verás a menudo en sus productos-, pero WAV es mucho más universal. Sin embargo, ya que no están comprimidos, ocupan demasiado espacio innecesario. A no ser que estés editando sonido, no es necesario que usemos este formato.
  • FLAC: Códec de sonido sin pérdidas libre — Free Lossless Audio Codec (FLAC). Es el códec sin pérdida más usado, es una buena opción si buscamos almacenar nuestra música sin perder calidad. A diferencia de WAV y AIFF, usa compresión, ocupando menos espacio. Sin embargo, sigue siendo un formato sin pérdidas, lo que significa que la calidad de sonido es la misma que la fuente original, así que es mejor para escuchar que WAV y AIFF. Además es software libre y gratuito, lo cual es útil si te gusta echarle un vistazo a cómo funciona.
  • Apple sin pérdidas (Apple Lossless): También conocido como ALAC, es similar a FLAC. Usa compresión, aunque está hecho por Apple. Su compresión no es tan eficiente como la de FLAC, por lo que los archivos serán un poco más grandes, pero es compatible con iTunes y iOS (FLAC no). Por lo tanto, si usas iTunes o iOS como software principal para escuchar música, deberías elegir este formato.
  • APE: Es un archivo de muy alta compresión sin pérdidas, lo que significa que ahorrarás más espacio. La calidad es la misma que FLAC, ALAC y otros archivos sin pérdidas, pero no es compatible con la mayoría de reproductores. Por contrapartida hace que el procesador trabaje más para descodificar al estar tan comprimido. Por lo general, no recomendaría usar este formato a menos que te preocupe mucho el espacio y tengas un reproductor compatible.

Formatos con pérdidas: MP3, AAC, OGG y más

Para el día a día, es más probable que usemos formatos con pérdidas. Ahorran bastante más espacio, y si tienen una tasa de bits suficientemente alta (bitrate), será muy dificil de distinguir la calidad de la fuente original. A continuación se muestran los formatos que más se usan:

  • MP3: MPEG Audio Layer III, o MP3 para abreviar, es el formato con pérdidas más común. Tanto que se ha convertido en sinónimo de las descargas de música en internet. No es el formato más eficiente de todos, pero es sin duda el más compatible, haciendo así que este sea la primera opción a elegir entre los sonidos con pérdida.
  • AAC: Advanced Audio Coding, también conocido como AAC, es similar a MP3, aunque un poco más eficiente. Lo que significa que los archivos ocupan menos espacio y con la misma calidad de sonido que MP3. Y, con el iTunes de Apple haciendolo tan popular, es tan compatible como MP3.
  • Ogg Vorbis: El formato Vorbis, a menudo conocido como Ogg Vorbis debido al uso del contenedor Ogg, es la versión software libre a MP3 y AAC. Su principal atractivo es que no está restringido por patentes, pero eso no te afecta como usuario — de hecho, a pesar de ser abierto es de calidad similar, y mucho menos popular que MP3 y AAC, por lo que no todos los reproductores lo soportan. No lo recomiendo a no ser que te interese por el hecho de ser código abierto.
  • WMA: Windows Media Audio. El formato propietario de Microsoft, parecido a MP3 o AAC. Realmente no ofrece ninguna ventaja sobre los demás formatos, y no está muy bien soportado.

Entonces, ¿Cual deberías usar?

Ahora que hemos visto las diferencias existentes entre cada formato, ¿Cual deberíamos usar para nuestra música? En general, recomendamos usar MP3 o AAC. Son compatibles con la mayoría de reproductores, y la calidad de ambos es muy parecida a la de la fuente original si se codifica con un ratio de bits alto (bitrate). A no ser que tengas necesidades específicas, MP3 y AAc son las opciones más recomendables.

Sin embargo, hay algo que decir para almacenar música en formátos sin pérdida como FLAC.Aunque probablemente no notemos una mayor calidad, es bueno para almacenar música si tienes pensado convertirla a otros formatos más adelante — ya que convertir de un formato con pérdidas a otro con pérdidas (ej: de AAC a MP3) producirá archivos de menor calidad. En ese caso recomendamos FLAC. Además, podemos elegir el formáto sin pérdidas que queramos, ya que convertir entre formátos sin pérdidas no degrada la calidad del archivo.

Como conclusión final, podemos decir que no hay que obsesionarse con el tema. Simplemente hemos de estar seguros de escoger algo ampliamente compatible, no convertir entre dos formatos con pérdidas, y disfrutar de la música.

Referencias

¿Cómo detectar ficheros con bloqueo/cerrojo en Linux?

05/04/2019
Artículo original

¿Cómo detectar ficheros con bloqueo/cerrojo en Linux? Crédito de la imagen: pixabay.com

Éste artículo tiene su origen en una pregunta a la que respondí en serverfault, el usuario preguntaba How to detect exceptionally long file locks in linux?. Aunque mi respuesta no solucionó su problema, creo que la explicación puede ser de utilidad para alguien. A continuación escribo la traducción de mi respuesta al usuario:

Creo que lo que buscas es el fichero /proc/locks. Éste fichero muestra los archivos bloqueados actualmente en el sistema. Sin embargo, no muestra Cuanto tiempo ha estado bloqueado un fichero, pero sí que muestra qué proceso lo está bloqueando. Quizá sea posible detectar cuando se produce el bloqueo en éste fichero y medir el tiempo transcurrido. Un ejemplo de /proc/locks es el siguiente:

$ cat /proc/locks
1: POSIX  ADVISORY  WRITE 2245 08:06:1182714 1073741824 1073741824
2: POSIX  ADVISORY  WRITE 2245 08:06:1182714 1073741826 1073742335
3: POSIX  ADVISORY  WRITE 3058 08:06:10752740 0 0
4: POSIX  ADVISORY  WRITE 3058 08:06:10752739 0 0
5: POSIX  ADVISORY  WRITE 2421 08:06:10752766 0 EOF
6: POSIX  ADVISORY  WRITE 2421 08:06:11142048 0 EOF
7: POSIX  ADVISORY  WRITE 2421 08:06:9964366 1073741824 1073742335
8: POSIX  ADVISORY  WRITE 2421 08:06:11142040 0 EOF

Donde las columnas significan:

  • Primera: El identificador del bloqueo.
  • Segunda: Tipo de bloqueo (POSIX si el bloqueo se hizo con fcntl y FLOCK si se creó con flock.)
  • Tercera: Modo de bloqueo (ADVISORY o MANDATORY)
  • Cuarta: Tipo de bloqueo (WRITE o READ), correspondiente a bloqueos compartidos o exclusivos.
  • Quinta: PID del proceso que tiene el bloqueo sobre el fichero.
  • Sexta: Tres números separados por :, que identifican el fichero bloqueado.
  • Séptima: Byte donde comienza el bloqueo en el fichero.
  • Octava: Byte donde acaba el bloqueo del fichero.

Referencias

  • How to detect exceptionally long file locks in linux? »» serverfault.com

Página Anterior Página Siguiente