jueves, 13 de agosto de 2015

Udacity: nanodegrees para el mercado laboral

Udacity lleva ya aproximadamente un año con sus "nanotítulaciones" con el fin de eliminar la brecha entre empleados y empleadores en el creciente mundo de la tecnología en donde se cree hay un déficit de talento (aunque algunas fuentes  argumentan lo contrario). Los títulos que se pueden completar son desarrollo fronted, android, ios, full stack, introducción a la programación y analista de datos.


Al final del nanodegree el estudiante tendrá listo un portafolio de proyectos para mostrar a posibles empleadores y demostrar las habilidades adquiridas. Por ejemplo, uno de los programas más populares es el de desarrollo frontend en donde se aprende a crear páginas estáticas o interactivas con herramientas como html, css, javascript, knockout, ajax, diseño adaptativo, optimización Web y control de versiones (Github).

El costo mensual es de 200 dólares aunque Udacity promete devolver la mitad de lo invertido al finalizar el curso. Algunos cursos cuentan con el apoyo de empresas reconocidas como Google, Cloudera, Salesforce y AT&T.

Finalmente, Udacity tiene un blog donde muestra los proyectos hechos por los egresados (se puede ver aquí).

sábado, 4 de abril de 2015

Ciencias de la Computación en edX: Harvard CS50

EdX es una plataforma educativa que ofrece cursos de importantes universidades como Harvard, Berkeley, MIT y en áreas como biología, química, matemáticas, infomática. Un curso popular en el campo de la informática es el de Harvard CS50 que enseña el uso de Linux, los lenguajes de programación C, PHP, JavaScript, desarrollo Web y algunos conceptos de algoritmos.



Algunos temas de CS50:

  • Linux, C, tipos de datos, criptografía
  • Línea de comandos, notación asintótica, ordenamientos, recursión
  • Listas enlazadas, manejo de archivos, tablas hash, stacks
  • HTTP, HTML, CSS
  • PHP, SQL, JavaScript, Ajax
Lo interesante de este curso es que hay una empresa en San Louis, Estados Unidos, que relaciona a las personas que completan este curso y que no están registrados en ninguna universidad, con posibles empleadores para realicen sus prácticas y eventualmente sean contratados. La empresa se llama LauchCode y asegura que el 90% de los practicantes son contratados más adelante de tiempo completo. 



Algunos de los empleos muy solicitados actualmente por las empresas de tecnología:
  • Desarrollador de Software
  • Desarrollador Frontend
  • Desarrollador Backend
  • Desarrollador de soluciones móbiles
  • Científico de datos
Completar un curso como CS50 no es suficiente. LaunchCode recomienda seguir con temas como:
  • Bases de datos relacionales
  • Tests unitarios
  • TDD (desarrollo guiado por tests)
  • Metodologías ágiles y scrum
  • Planeación de Software


lunes, 1 de septiembre de 2014

EXPRESIONES REGULARES EN PYTHON(II)

METACARACTERES Y PATRONES
Son símbolos que indican un comportamiento especial como repetición, rango, exclusión o separación.
. ^ $ * + ? { } [ ] \ | ( )

.
Indica cualquier carácter (letras, números, signos de puntuación, espacios) excepto una nueva línea (\n):
>>> re.findall('.', 'Benevolent dictator')
['B', 'e', 'n', 'e', 'v', 'o', 'l', 'e', 'n', 't', ' ', 'd', 'i', 'c', 't', 'a', 't', 'o', 'r']

>>> re.findall('.', 'Benevolent\ndictator') #Ignora la nueva línea (\n)
['B', 'e', 'n', 'e', 'v', 'o', 'l', 'e', 'n', 't', 'd', 'i', 'c', 't', 'a', 't', 'o', 'r']


>>> re.findall('.', 'Benevolent\tdictator') #Pero no ignora la tabulación (\t)
['B', 'e', 'n', 'e', 'v', 'o', 'l', 'e', 'n', 't', '\t', 'd', 'i', 'c', 't', 'a', 't', 'o', 'r']


*
Tiene en cuenta el carácter anterior cero o más veces. Por ejemplo, el patrón "in*o" identifica estas combinaciones: io (ninguna presencia de la "n"), ino (una aparición de la "n"), inno (dos apariciones de la "n").
>>> re.findall('in*o', 'inocencia, innovaciones')
['ino', 'inno', 'io']


+
Indica el carácter anterior una o más veces:
>>> re.findall('in+o', 'inocencia, innovaciones')
['ino', 'inno']


[ ]
Indica que puede haber una coincidencia con cualquier carácter entre los corchetes. También se puede incluir el rango entre los corchetes:
[a-z] : cualquier letra minúscula
[0-9] : cualquier dígito
[a-dA-D] : las letras de la a la d minúsculas o mayúsculas

>>> re.findall('cu[sz]co', 'se puede escribir cusco o cuzco')
['cuzco', 'cusco']

Se puede señalar un rango usando guión. Por ejemplo, [0-9] busca cualquier dígito entre 0 y 9.

>>> re.findall('[0-9]', '3 de enero de 2014')
['3'] # el único con una sola cifra

[^ ]
Busca cualquier caracter excepto el indicado en corchetes

>>> re.findall('est[^a]s', 'estas, estos, estes')
['estos', 'estes']

{ n }
Repite el elemento previo n veces. Se puede definir un rango de coincidencias

{2,4} : de 2 a 4 caracteres siendo el comportamiento "voraz", es decir, primero trata de hacer coincidir cuatro caracteres, luego tres, luego dos.
{2,} : indica dos o más caracteres.

>>> re.findall('[a-z]{3}', 'Django es un framework de desarrollo web')
['jan', 'fra', 'mew', 'ork', 'des', 'arr', 'oll', 'web']

>>> re.findall('[a-z]{3,4}', 'Django es un framework de desarrollo web')
['jang', 'fram', 'ewor', 'desa', 'rrol', 'web']

>>> re.findall('[a-z]{3,}', 'Django es un framework de desarrollo web')
['jango', 'framework', 'desarrollo', 'web']


^ $
Buscan al comienzo y al final de la cadena de texto respectivamente.
>>> re.findall('^Django', 'Django es un framework de desarrollo web')
['Django']

>>> re.findall('^web', 'Django es un framework de desarrollo web')
[]  # 'web' no está al comienzo de la cadena

>>> re.findall('web$', 'Django es un framework de desarrollo web')
['web']  # 'web' está al final de la cadena


?
Busca una o cero coincidencias del caracter anterior.
i?python : busca python o ipython.
>>> re.findall('i?python', 'ipython es iron python')
['ipython', 'python']

\
Permite ignorar caracteres especiales como [], ?, +, etc. Por ejemplo, si queremos analizar operaciones matemáticas debemos ignorar el significado de + y * en el módulo de expresiones regulares:
>>> re.split(' \+ ', '4 + 8') #Queremos extraer sólo los números
['4', '8']

|
Identifica un patrón u otro siendo su comportamiento "no voraz (not greedy)", es decir, al encontrar la coincidencia de la izquierda se detiene. Por ejemplo, queremos sustituir un anglicismo:
>>> re.sub('basket|basketball', 'baloncesto', 'Jugadores de basketball de la liga nacional de basket') #Encuentra basketball y lo sustituye por baloncestoball
'Jugadores de baloncestoball de la liga nacional de baloncesto'

Para corregir este comportamiento simplemente colocamos el más largo primero:
>>> re.sub('basketball|basket', 'baloncesto', 'Jugadores de basketball de la liga nacional de basket')
'Jugadores de baloncesto de la liga nacional de baloncesto'


()
Los paréntesis agrupan expresiones regulares e indican el comienzo y el final de un grupo. Findall agrupa las coincidencias en tuplas:

>>> re.findall(r"(\w+): (\w+)", "nombre: Gabriel, apellido: Marquez, numero: 3")
[('nombre', 'Gabriel'), ('apellido', 'Marquez'), ('numero', '3')]



(?:)

 Agrupa expresiones regulares pero no captura coincidencias. Esto es más evidente al usar split:
>>> re.split(r"(?:\w+):", "nombre: Gabriel, apellido: Marquez, numero: 3")
['', ' Gabriel, ', ' Marquez, ', ' 3']


Comparemos al usar sólo paréntesis:
>>> re.split(r"(\w+):", "nombre: Gabriel, apellido: Marquez, numero: 3")
['', 'nombre', ' Gabriel, ', 'apellido', ' Marquez, ', 'numero', ' 3']


(?P:<>)

Agrupa coincidencias que pueden ser referenciadas por un nombre:
>>> patron = r'(?P<mes>[\d])/(?P<dia>[\d])/(?P<año>[0-9][0-9][0-9][0-9])'
>>> m = re.search(patron, 'nacio en 7/2/1978')

>>> m.group('año')
'1978'
>>> m.group('mes')
'7'
>>> m.group('dia')
'2'

Un ejemplo de la página del tutorial de django:
urlpatterns = [
    # ex: /polls/
    url(r'^$', views.index, name='index'),
    # ex: /polls/5/
    url(r'^(?P[0-9]+)/$', views.detail, name='detail'),
    # ex: /polls/5/results/
    url(r'^(?P[0-9]+)/results/$', views.results, name='results'),
    # ex: /polls/5/vote/
    url(r'^(?P[0-9]+)/vote/$', views.vote, name='vote'),
]