CS50's Web Programming with Python and JavaScript

Recientemente he comenzado a hacer un curso sobre desarrollo web con Python y JavaScript en la plataforma EDX. Reconozco que inicialmente, además de la temática, me llamó mucho la atención que fuese impartido por la univerdiad de Harvard. Y encima es totalmente gratis.

Después de unas cuantas clases, sólo puede decir es bastante completo y muy recomendable. Vale tanto para hacer una instrodución rápida al tema, como para repasar y actualizar conceptos. Hace un recorrido completo de lo que se suele requerir hoy en día a un perfil de desarrollador fullstack. Hay tecnologías de frontend (html, cs, js), tecnologías de backend (python, django, sql) y herramientas de gestión del proyecto (git, integración y entrega continua). Obviamente en cada una de la partes hay muchas más opciones. Pero en mi opinión, aunque te conviertas en un especialista en una de ellas, creo que está bien hacer un recorrido completo para conocer al menos una opción de cada, y ver como encajan todas las piezas entre si armando una solución completa.

Mi intención es compartir mis notas clase a clase.

Indice.

  • HTML, CSS.
  • Git.
  • Python
  • Django
  • SQL, Models, and Migrations.
  • JavaScript.
  • User Interfaces.
  • Testing, CI/CD.
  • Scalability and Security

Estará disponible durante todo el 2022. Tiene la opción de obtener un certificado de realización pagando un extra (Entre $160 y $200). No hay opción a examen.

Aunque hace falta registrarse e iniciar sesión para ver las clases, también dan la posibilidad de bajarse los videos directamente en formato mp4 subtítulos y la transcripción completa de la clase. Así que no debería echarte para atrás empezar el curso muy cerca del final de año. Si no te da tiempo a terminarlo en la web, puedes descargar todo el contenido y continuar en local.

Dejo aquí el enlace la página principal del curso. Espero que te sirva de ayuda.

¡Vamos allá!

Raspberry Pi: Instalación y primeros pasos.

Con esta guía pretendo facilitar la puesta en marcha de una Raspberry Pi. El sistema operativo elegido es una Raspbian (Raspberry + Debian).

El primer paso será descargar la imagen la última versión disponible desde la página oficial del proyecto.

https://www.raspberrypi.org/downloads/raspberry-pi-os/

Ahí tenemos disponibles varias versiones
  • Raspberry Pi OS (32-bit) with desktop and recommended software
  • Raspberry Pi OS (32-bit) with desktop
  • Raspberry Pi OS (32-bit) Lite

La base es la misma, lo que cambia es la selección de software que se instala de manera predeterminada. Para tener un mayor control sobre sobre nuestra instalación, recomiendo utilizar siempre la versión lite y posteriormente ir añadiendo los problemas que se necesiten de manera manual.

Una vez concluida la descarga, debemos descomprimir el contenido para obtener el archivo con la extensión nombre_archivo.img, Este archivo contiene todos los datos que se deben copiar tal cual a nuestra tarjeta.

Conviente aclarar que un archivo .img es un volcado completo de todos los datos a nivel físico que contiene el dispositivo que se copia. No es una simple copia lógica de un grupo de archivos. Es un copia exacto bit a bit que incluye todos los sectores del dispositivo. Incluyendo, además de los archivos, toda la información sobre particiones y formato de las mismas.

Esta es la explicación de por qué no nos vale abrir el archivo .img y copiar toda la información que contiene dentro de la tarjeta SD formateada previamente.

Para hacer un volcado de una imagen a un dispositivo necesitamos un problema especial, como decía antes, no nos vale seleccionar las carpetas en una ventana y arrastralas a la tarjeta. Tenemos varias opciones. La recomendada en la web de raspberry es el rpi-imager. Disponible en el siguiente enlace.

https://www.raspberrypi.org/downloads/

Con versiones para Windows, MacOS y Ubuntu.

Pero una vez más, me salgo de la recomendación y uso la herramienta dd. Disponible en todos los linux y muy problablemente, lo que use el rpi-imager por debajo de su interfaz gráfica.

La sintaxis es muy sencilla. (Necesita un usuario privilegiado)

# dd if=imagen of=dispositivo [bs=4M conv=sync]

* Nota: los parámetros entre son opcionales

Explicación de los parámetros:

if = la ruta del archivo .img descargado anteriormente.

of = dispositivo de destino

bs = tamaño de bloque (block size). Tamaño de datos que se copia de una vez. Influye en el rendimiento de la copia. 4M es un buen valor de referencia.

conv = Con la opción sync, forzamos un a sincronización del dispositivo externo, En este caso la tarjeta SD, para que no quede nada pendiente de escribir cuando extraemos la tarjeta del ordenador. Algo parecido a la extracción segura de Windows. En Linux se puede hacer en cualquier momento con el comando sync.

 En un ejemplo real, el comando quedaría tal que así:

# dd if=raspios_buster.img of=/dev/sde bs=4M conv=sync

* Nota: una manera fácil de ver a que dispositivo de nuestro sistema corresponde la tarjeta SD, es utilizar el comando dmesg. Si conectamos la tarjeta y luego lanzamos el comando dmesg, veremos en la ultimas líneas un aviso de que dispositivo le ha asignado el sistema a la tarjeta. En la mayoría de los casos debería parecerse a /dev/sdX . Reemplazando la X por una letra que normalmente se encontrará entre a la a y la e. (si tu equipo no tiene un desmesurado de discos duros). Es importante tener este dado claro, o podríamos peder por completo los datos almacenados en otro dispositivo de nuestro sistema.

Una vez terminada la copia, no tenemos más que retirar la tarjeta del ordenador, insertar en la Raspberry pi y encender la alimentación.

Extras:

Activar el servicio SSH desde el primero momento.

Si no tenemos pensando conectar un monitor y un teclado a nuestra Raspberry, conviente tener una manera de acceder a ella desde el primero momento. Para eso necesitaremos activar el servicio de SSH. 

Es muy sencillo, basta con añadir un archivo SSH en la partición boot para que arranque el servicio de ssh al inicio. Puedes usar el comando touch. Con esto el servicio se arrancará automáticamente desde la primera vez que enciendas el sistema.

Además necesitar tener un usuario y contraseña. El usuario y clave por defecto que trae raspbian es:

usuario: pi
password: raspberry

Obviamente, por tema de seguridad, conviente desactivar este usuario cuando antes.

Antes de hacer eso, deberías crear tu usuario personalizado con adduser. Y añadir ese usuario a los grupos users, sudo y ssh, para poder realizar todas las tareas de administración.

Nada más. Espero que esta guía te haya resultado de ayuda. Agradeceré cualquier comentario. Saludos.

Gestión de empresas informaticas - Capítulo 1: Empresa y empresario.

--- 1. Introducción ---
Economía de la empresa, del inglés ‘business administration’.
Economía de la empresa, disciplina científica sobre la administración y dirección de los negocios empresariales.
El objeto material de estudio de esta disciplina es la unidad económica de producción: la empresa.

--- 2. La empresa como organización ---

Una organización es un conjunto de personas y elementos materiales dirigidos, bajo el principio de la división del trabajo, con el fin de conseguir objetivos que no se podrían alcanzar mediante el esfuerzo individual aislado.

Cuatro elementos:
    Un objetivo. Razón de la existencia de la organización. Mantiene unidas a las personas.
    Elementos personales y materiales.
    La dirección. Dirigen a los demás a un objetivo común. Jerarquía.
    La división del trabajo. Trabajos complejos se dividen en tareas más simples. Principio de especialización.

Características de toda empresa:
    conjunto de factores
    fines
    coordinación
    sistema

--- 3. La empresa como sistema ---

La empresa es un sistema finalista.
    sistema, conjunto de elementos interrelacionados entre sí.
    sistema finalista, permite la elección de medios, o de fines o de ambos.

Características de la empresa como sistema:
    es un sistema abierto. Es decir, se interrelaciona con su entorno.
    produce sinergia.
    es un sistema global. Cualquier intervención en un elemento o subsistema repercute en el resto.
    es un sistema autoregulado. homeostasis.

Principales subsistemas:
…

--- 4. Clases de empresas informáticas ---

Clasificaciones, según su:
    tamaño. número de trabajadores, volumen de negocio o balance general.
    actividad. sector primario, secundario o industrial, ó terciario o de servicios.
    ámbito de su actividad. local, provincial, regional, nacional e internacional.
    titularidad de su propiedad. pública, privada o mixta. cooperativa.
    forma jurídica. individual. sociedad anónima. sociedad limitada.

--- 5. El empresario ---

El empresario es quien arriesga su capital.
Teoría del empresario innovador. Aplicar invenciones tecnológicas a usos comerciales o industriales.
Teoría del empresario de riesgo. La asunción de riesgos es la principal función del empresario.

--- 6. La empresa y el sistema económico ---

-- Los sistemas económicos y <<la mano invisible del mercado>>. --

Todos los sistemas económicos se encuentran entre estos dos extremos:
    sistema de libre mercado. todas las empresas se someten a la competencia. toman sus propias decisiones y tienen sus propios objetivos.
    sistema de economía centralizada. todas las empresas se encuentran sometidas a la autoridad del estado. el estado interviene en las decisiones y las empresas tiene como objetivo cumplir con el plan previsto por las autoridades.

-- La <<mano invisible de la empresa>>. --

Teoría de los costes de transacción. La intervención de una organización empresarial facilita los intercambios, ordena las relaciones, reduce la incertidumbre y minimiza los costes.

-- Los derechos individuales y la intervención de los poderes públicos. --

Objetivos de la intervención de los entes públicos en la economía:
    Proteger los derechos y libertades de las personas.
    Producir bienes y servicios de interés público.
    Regular las actividades económica. Defensa de la competencia. Actividades de la entidades financieras. Salario mínimo.
    Promover la estabilidad y el crecimiento económico.
    
    Corto plazo: estabilidad de precios. Pleno empleo. Equilibrio comercio exterior.
    Largo plazo: mejora en la distribución de la renta. Crecimiento económico y desarrollo.

    Ofrecer ayudas directas a personas que lo necesitan por razones de salud, edad, desempleo, ...
    Estas actividades se financian a través de los impuestos.

--- 7. La responsabilidad de la empresa y su organización social. ---

-- La responsabilidad social de la empresa. --

Las decisiones empresariales no sólo deben considerar los efectos económicos, si no también los efectos sociales.
Costes sociales, pérdidas directas o indirectas soportadas por terceros, con resultado de las actividades de la empresa. Gobiernos introducen normas para paliar estos costes sociales.

Temas fundamentales de carácter social:
    protección de los trabajadores.
    protección de los consumidores.
    participación de los trabajadores.
    medio ambiente.
    conservación de los recursos no renovables.
    Ética empresarial.

-- La orientación social de la empresa --

Dos posiciones extremas:
    lo único exigible a la empresa es rentabilidad y beneficios.
    la principal responsabilidad de la empresa es contribuir al bienestar social.

--- 8. Teorías sobre la empresa ---

-- La teoría neoclásica. --

La empresa es un mecanismo que se sitúa entre el mercado de factores (bienes iniciales) y el mercado de productos (bienes finales). Su actuación consiste en combinar los factores para transformarlos en productos.
Contempla la empresa como una “caja negra”.

-- La teoría de la agencia. --

La empresa es un conjunto de relaciones de agencia.
La relación de agencia es un contrato en el cual una o más personas (a quienes se denomina principal) recurren al servicio de otra u otras (el agente) para que cumpla una tarea en su nombre, lo que implica delegar autoridad.

Típicas relación principal-agente:  
    accionistas-directivos.
    empleador-empleado.
    regulador-regulado.
    asegurador-asegurado.

Problemas en las relaciones:
    divergencia de intereses entre principal y agente.
    incertidumbre en la actuación del agente. impide establecer buenos contratos.
    Los agentes tratarán de aprovechar los fallos que tengan los contratos con el principal, por lo cual aparecen los costes de agencia.

Tipos de costes de agencia:
    costes explícitos de vigilancia y control del principal al agente.
    costes explícitos de atención del agente al principal para que este mantenga su confianza.
    costes de oportunidad provocados por las divergencias de interés, entre el principal y agente.

-- La teoría de los costes de transacción --

Plantea la disyuntiva entre la asignación de recursos vía mercado y la realizada por la empresa.

...

-- La teoría de los derechos de propiedad --

Considera a la empresa como un conjunto de contratos bilaterales, y no de relaciones de autoridad.
La empresa se concibe como una “caja transparente”.

-- La teoría de los recursos y capacidades --

Considera a la empresa como un conjunto de recursos y capacidades, que no se pueden comprar y vender libremente en el mercado.
Recursos, stock de factores productivos.
Capacidad organizativa, habilidad de una empresa para llevar a cabo un actividad concreta en grupo.
Rutina organizativa:
    pauta de actuación regulares.
    aprendizaje colectivo de la organización.

UNED - Gestión de empresas informáticas

GESTIÓN DE EMPRESAS INFORMÁTICAS
Parte I - La empresa y la función directiva
Capítulo 1 - Empresa y empresario
Capítulo 2 - El proceso de dirección de la empresa
Capítulo 3 - La dirección de los recursos humanos
Capítulo 4 - Análisis de problemas y toma de decisiones
Capítulo 5 - Técnicas instrumentales de planificación, programación y control.

Parte II – Finanzas
Capítulo 6 - Elementos financieros
Capítulo 7 - Las inversiones y su selección. La rentabilidad de las inversiones
Capítulo 8 - Las fuentes de financiación y su selección. El coste del capital

Parte III - Producción
Capítulo 9 - Elementos productivos. El proceso de producción y el factor humano
Capítulo 10 - La capacidad de producción
Capítulo 11 - La logística

Parte IV – Marketing
Capítulo 12 - Elementos de marketing. El mercado, la demanda y el presupuesto mercadotécnico
Capítulo 13 - Investigación de mercados, segmentación y experimentación comercial
Capítulo 14 - Las variables del marketing

UNED - Grado en Ingeniería informática.

Una vez mas, me decido retomar este blog de apuntes sueltos.
La idea es la misma que tenía inicialmente. Publicar notas y apuntes de distintos cursos y clases que hago. Este curso espero darle un poco más de uso, ya que me he matriculado en el curso puente de grado de informática de la UNED. Sólo son unas pocas asignaturas de diferencia entre la antigua ingeniería técnica de sistemas y el actual grado en informática. No tengo ninguna urgencia, de manera que sólo me he matriculado de 2 asignaturas en cada cuatrimestre. Espero poder evaluar los resultados y la nueva experiencia de estudiar en una universidad a distancia.
Si más, espero que le sirva de ayuda a alguien. Ya sea por estar estudiando alguna de las asignaturas o por simple intenterés en la materia. Cualquier comentario o sugerencia será bienvenido.

Android: instalación de Android-studio en una distro para arquitectura amd64.

Siguiendo con el espíritu del blog añado una pequeña receta que ahorrará algunos quebraderos de cabeza a aquellos que querías usar el nuevo Android-studio (actualmente en la versión 0.2.10) en una máquina de 64-bits.

Aquí podeís encontrar toda la información oficial y los enlaces para descargarlo.

El problema viene con las herramientas android-sdk, ya que están compiladas enlazando dinamicamente con bibliotecas de 32-bits y no hay versión de 64-bits. Esto quiere decir que tiene que tener esas librerías de 32-bits disponibles en tu máquina ó no funcionarán.

Para resolver esto tienes dos opciones:
  1. Utilizar 'multiarch'. (Ya lo mencioné en el blog anteriormente. En concreto como desinstalarlo :-D ) Multiarch te permite instalar paquetes de varias arquitecturas (x86/amd64, lo más problable) en una sóla máquina.
  2. Instalar las versión lib32[xxx] correspondiente.
Si optamos por la segunda opción, la más recomendable en mi opinión, deberemos instalar al menos:
  • lib32z1
  • lib32stdc++6
  • lib32ncurses5
Y con esto ya deberíamos tener todo el android-studio operativo.

Debian multiarch: desactivar una arquitectura.

Os dejo una receta para resolver una situación un poco molesta que presenta de vez en cuando.

A veces, por alguna razón importante, necesitamos instalar en nuestro linux un programa propietario que necesita paquetes de la arquitectura i386. Después de investigar un poco, acabamos modificando la configuración del sistema para que acepte paquetes de la nueva arquitectura y desde ese momento tenemos una mezcla de paquetes compilados para varias arquitecturas, normalmente i386 y amd64. Después de un tiempo, dejamos de necesitar ese programa y queremos hacer limpieza de todos los paquetes que sobran.

El comando para eliminar una arquitectura de los repositorios es:

dpkg --remove-architecture i386

Pero esto nos dará un ...

dpkg: error: cannot remove architecture 'i386' currently in use by the database

... ya que tenemos varios paquetes instalados en el sistema de esas arquitectura.

La solución es fácil. Con ...

dpkg -l | grep i386

... obtenemos la lista de paquetes instalados en el sistema de una arquitectura. Si son pocos, puedes desinstalarlos manualmente pero si son muchos puedes usar este comando para hacerlo de una vez.

apt-get remove --purge `dpkg --get-selections | grep i386 | awk '{print $1}'`

Una vez terminada la desinstalación el comando para eliminar la arquitectura funciona correctamente y listo. Tu sistema vuelve a tener sólo paquetes de la arquitectura adecuada.

Python: manejo básico de listas.

Declaración de la variable de tipo lista:
milista = list();

Añadir elemento a la lista:
milista.append('elemento')

Mostrar la lista al completo:
print milista

Mostrar el número de elementos que componen la lista:
len(milista)

Acceder al elemento de la lista en la posición n:
milista[n]

Ordenar los elementos de la lista:
milista.sort()

Ordenar los elementos de la lista en orden inverso:
milista.reverse()

Eliminar el primer elemento de la lista que coincida con x:
milista.remove(x)

Añadir un elemento en una posición concreta de la lista:
milista.insert(posicion,elemento)

Mostrar la posición de un elemento en la lista:
milista.index(elemento)

Python: manejo básico de cadenas.

En Python podemos utilizar tanto comillas simples ' ' como comillas dobles " " para indicar que el texto en su interior debe tratarse como una cadena. Para facilitar la distinción del código Python con el código HTML intercalado se suelen usar las comillas simples ' '.

Asignación:
cadena = 'cualquier texto'

Comparación:
cadena1 == cadena2

El carácter en la posición n:
cadena[n]
Conviene recordar que las posiciones empiezan en 0.

Los caracteres que van de la posición n a la m-1:
cadena[n:m]

Los caracteres que van desde el inicio de la cadena hasta la posición n-1:
cadena[:n]

Los caracteres que van desde la posiciones n hasta el final de la cadena:
cadena[n:]

Concatenar cadenas:
cadena3 = cadena1 + cadena2

Funciones especiales de la biblioteca String.

Búsqueda de una cadena dentro de otra.
cadena.find('hola')
Devuelve la posición de la primera coincidencia, ó -1 si cadena no contiene el texto buscado.

Concatenar una cadena con una variable de tipo entero:
cadena_destino = cadena + str(variable_entero)

La operación inversa, obtener el entero que hay dentro de una cadena se hace con int():
entero = int(cadena)

Conviene recordar que podemos consultar el tipo de cualquiera variable con type:
type(entero)
Devuelve <type 'int'>

Github: primeros pasos.

Para los que no lo conozcan, Github es un repositorio de git gratuito para que organices todos tus códigos fuente. Es gratuito, siempre en cuando tu código sea abierto. Si quieres tener repositorios con acceso restringido tendrás que pasar por caja ($7/mes aprox). Además de servirte como respaldo para tus proyectos, tiene algunas características sociales. Puedes hacer contactos, colaborar en proyectos de otros, etc. Por ahora me centraré en los básico. Crear un proyecto, subir y bajar código.
Sigo los pasos que indica el própio github.

touch README.md
Creo un archivo de README. Opcional, pero siempre recomendable.

git init
Inicializa un repositorio git en la ruta donde ejecutemos el comando.

git add README.md
Añade el archivo README a la lista de archivos controlados del repositorio. Es decir, que se modifica, crea ó borra cada vez que sincronices el repositorio.

git commit -m "first commit"
Sincroniza tu copia local con el repositorio.Si es la primera vez que usas git en tu máquina, es posible que aparezca algunos mensajes de error indicando que necesita algunos datos sobre tí. No hay problema. Sólo necesitamos modificar un par de variables "globales de git" para evitar esto.

git config --global user.name "tu nombre"
Indica tu nombre de usuario.

git config --global user.email you@example.com
Indica tu correo electrónico.

git commit --amend --reset-author
Hace un commit fijando tus dos cambios anteriores. Antes de enviar los datos te dará la posibilidad de cambiar el mensaje del commit, usando el editor nano. Basta con pulsar ctrl+o (salvar) y ctrl+x (salir), para continuar sin cambiar nada. Arreglado esto, ya podemos seguir.

git remote add origin https://github.com/[usuario en github]/[nombre del repositorio].git
Hasta ahora no hemos utilizado para nada github. Con esta orden, enlazamos nuestro repositorio con la copia gemela en github, a la que damos el nombre de origin.

git push -u origin master
Y con esto enviamos nuestra copia local al servidor.

Esto sólo es lo básico para empezar. En otro post, quizá, veremos los comandos más utilizados durante el desarrollo del proyecto.

Añadir un disco nuevo en linux.

Para añadir un disco nuevo a nuestro sistema linux sólo necesitamos dos comandos; fdisk y mkfs.
fdisk nos permite modficar la tabla de particiones; consultar, crear y borrar.
mkfs nos permite crear el sistema de ficheros que queramos en cada una de la particiones creadas para que nuestro sistema operativo pueda usarlas.
Comando imprescindibles:
fdisk -l muestra las tablas de particiones de todos los dispositivos conectados.
fdisk -l [dev] para ver la de un dispositivo concreto. ej: fdisk -l /dev/sdb
fdisk [dev] nos permite entrar en el menu de fdisk para realizar las operaciones necesarias. Pulsando m tendremos la ayuda.
Las opciones más importantes son:
q - salir sin guardar los cambios
w - escribir los cambios en la tabla de particiones (asegúrate bien antes, no hay vuelta atrás)
c - crear un partición
d - borrar una partición
p - mostrar la lista de particiones
Una vez que tenemos las particiones hechas y en su sitio, vamos con mkfs. Lo primero es decidir el sistema de ficheros queremos usar; ext2, ext3, ext4, swap, reiserfs, xfs, ... Cada uno tiene sus ventajas y sus inconvenientes. En este caso uso ext2 y supongo que la partición quiero formatear es la primera de mi disco nuevo. Según eso sólo te que ejecutar
mkfs.ext2 /dev/sdb1
... y en unos segundos, según el tamaño del disco, tendré mis disco nuevo preparado para usar.

Bash: caracteres especiales.

En bash se usan con frecuencia una serie de caracteres especiales que luego no salen tal cual en la consola. Todo el mundo, conoce \n para cambiar de línea, pero hay algunos más. Esta es la lista completa:

\a - beep de la consola
    se puede conseguir un control más avanzado con al aplicación beep (disponible en debian) -l [tiempo del beep] -f [frecuencia] y más
\b - retroceso
\e \E - escape (no ANSI C)
\f - form feed
\n - cambio de línea
\r - retorno de carro
\t - tabulación
\v - tabulación vertical
\\ - una barra invertida
\' - una comilla simple
\" - una comilla doble
\nnn - valor en octal
\xHH - valor en hexadecimal
\cx - control-x

Control de jobs linux; jobs, bg, fg.

Operaciones básicas para gestionar la ejecución de varias tareas de manera simultanea en linux.
Ejecutar en segundo plano:
 [comando] &
 ej: sleep 10 &
Consultar los trabajos en curso:
 jobs
 jobs -pl - lista de jobs (p mostrar pid, l lista)
Terminar un trabajo que se esta ejecutando en primer plano:
 ctrl+c
Pasar el trabajo de primer plano a segundo plano y dejarlo en pausa:
 ctrl+z
Redireccionar salida estandar. Es útil cuando tenemos trabajos ejecutándose en segundo plano y no queremos su salida aparezca en la consola.
 > /dev/null - descartar la salida
Parar un trabajo que se está ejecutando en segundo plano:
 kill -s 19 [pid] (señal 19 = SIGSTOP)
Reanudar un trabajo en segundo plano:
 bg [job_id]
Reanudar un trabajo en primer plano:
 % [id_job]
ó  fg [job_id]

Bienvenida.

Bienvenido a apuntes sueltos. Este blog no es más que un contenedor personal para organizar de trucos, recetar, manuales, y enlaces que he ido necesitado con el tiempo. En cualquier caso, espero que sea de utilidad para cualquiera que llegue a el por la gracia de Google.