viernes, 15 de febrero de 2019

MySQL: crear índice único y no único

Una PRIMARY KEY crea un índice único asociado al campo que es clave primaria, además es NOT NULL por defecto, y por tabla se tiene una sola clave primaria.
Cuando queremos que un campo o varios sean únicos entonces creamos una constraint UNIQUE y si queremos que sea un índice no único lo declaramos como KEY pero no en la misma línea del campo porque significaría que declaramos una PRIMARY KEY, y no es lo que queremos.

create table test(
    clave_primaria int unsigned not null,
    clave_unica varchar(128) default null,
    clave_nounica varchar(128) default null,
    constraint pk_test_claveprimaria primary key(clave_primaria),
    constraint uq_test_claveunica unique(clave_unica),
    key(clave_nounica)
);





Se ha utilizado
-MySQL Ver 14.14 Distrib 5.7.23, for Win64

Sublime text: colocar cursor al inicio de varias líneas seleccionadas


Cuando se quiere editar varias líneas colocamos el cursor en las líneas deseadas presionando cmd, pero cuando son muchas líneas o todas las líneas podemos:

cmd + A selecciona todas las líneas
cmd + shift + L divide el cursor en cada línea seleccionada
cmd + izquierda mueve el cursor al inicio de la línea

domingo, 7 de octubre de 2018

Cómo empecé con GTD


GTD es una metodología para gestión de tareas y la había visto brevemente mientras realicé mi Proyecto fin de grado sobre una herramienta para planificar tareas. Básicamente leí un poco en wikipedia y poco más. Un año después me decidí a conocerla, y lo primero sería leer el primer libro de su autor: Organízate con eficacia.
    Al leer el primer libro seguí la instrucción de leer todos los apartados que indicaba el proceso para tener la idea y entonces ponerme con el proceso. Quise aprovechar un fin de semana para hacerlo aunque me di cuenta que me iba a tomar varios días más, porque, por ejemplo, no iba a terminar de procesar cerca de cinco mil correos marcados como no leídos de entre  unos veinte mil que tendría que organizar. Así que decidí montar la estructura básica e ir haciendo lo que se tendría que hacer a partir del momento, y poco a poco lo iba a organizar. Al final, pensé todos esos correos son parte del archivo que hay que organizar, y lo que requiera acción colocaría donde debiese.
    Hice un primer montaje de la metodología al leer el primer libro y tres semanas después hice un repaso del sistema al leer un segundo libro.

Primer ciclo

Capturar

Es decir, sacar todas las cosas que tenía en la cabeza. Para ello, escribí en posits cada cosa, claro está que se me fue todo un paquete de posits. Algo que planteaba el libro era colocar todas las cosas físicas en un lugar o utilizar alguna tarjeta u hoja de papel por cada cosa e ir colocando en una bandeja. Por otro lado, tenía todos esos miles de correos. En principio solo identifiqué cuatro bandejas de entrada: posits, correos y dos listas que tenía en Trello, una del sobre el trabajo y otra personal. No me parecía que iba a estar tantas horas como se decía en el libro. Me pasé todo el sábado leyendo y capturando. Además, sentía que ya estaba todo. Quería seguir, ver más, cuál era lo siguiente.

Clarificar

Clarificar consiste en definir qué son las cosas que están en las bandejas de entrada. Definirlas con un verbo de acción tal como: escribir, enviar, llamar. algo que indique una única acción sino es un proyecto de varias acciones. No seguí el consejo de hacerlo todo en papel las primeras veces. Así que, creé en el correo etiquetas que llamé Acciones siguientes, En espera, Algún día/Tal vez, y el los tableros de similar forma.
    Tomé los últimos correos y los moví a los contenedores que consideré. Algunos los moví a Acciones siguientes pero para otros creé una acción en mi lista de Trello, el correo lo moví al contenedor Registro, mientras hacía esto pensé en cómo tenía que organizar el dichoso Archivo (nombre que se da al archivo de registro, cosas que solo sirven para consultar, como si fuese una biblioteca), es decir, crear contenedores tipo: Recibos, RRSS, Moodle y alguno genérico llamado Registro hasta que se me ocurra una forma de reorganizar.
    Como se puede ver a la vez de clarificar qué eran las cosas de las entradas estaba pensando en cómo organizar, qué me faltaba. Sentía que no lo tenía claramente definido, que me faltaban muchas cosas, pero no iba a ponerme varios días a pensar en la estructura de organización sino que sobre la marcha iba a organizar e ir capturando ideas de qué hacer. Me decía a mí mismo: empieza a moverte porque si quieres tenerlo todo claro no vas a moverte. Como parte de no tener el hábito de hacer las cosas por separado como plantea la metodología, a la vez que clarificaba qué eran las cosas de la entrada capturaba ideas que surgían y otras no, algunas las ponía ya como acciones siguientes y se saltaban la bandeja de entrada, es decir, que no separaba el capturar del aclarar y organizar en momentos de ejecución separados. 

Organizar

Además de las listas comentadas anteriormente tenía listas en la aplicación Recordatorios de Apple, y muchas otras listas en Trello. Tenía varios duplicados de los contenedores comentados prácticamente en cada aplicación. Como había que vaciar las bandejas de entrada me centré en lo más fácil que era los posits que los trasladé en tareas de listas en Trello, las acciones que tenía que recordar las programé en Recordatorios. Empecé a organizar el correo con contenedores como: Leer_revisar que se mantuvo con una sola cosa y sigue así pendiente de ser eliminado de ser el caso; Personal donde dejé correos de carácter personal, Recibos donde colocar todo lo que sea como factura, recibo; SocialMedia correos de Twitter, Facebook, Linkedin; Notificaciones donde coloqué notificaciones de reservas, compras, envío de paquetes; Amazon lo que tenía que ver con Amazon; UPM correos de la universidad; transporte relacionado con el vehículo; un contenedor de la empresa donde trabajé; y otros dos para un par de proyectos.
    El problema que me surgió era filtrar y mover los correos, puesto que no podía simplemente decir todo lo que es de la cuenta UPM va a UPM, si era un correo de Amazon que tenía el valor del producto lo dejaba en Amazon o en Recibos. También quería separar los mensajes en redes sociales del resto de correos que envían las redes sociales. Sí muchos de esos debían ir a la basura pero al filtrar era difícil identificarlos entre miles. Por el momento no decidí hacer más cambios, quería dejar a cero la bandeja de entrada. Y no quería eliminar aún. Varias veces la aplicación de quedó bloqueada pues mientras estaba moviendo varios miles de correos yo intentaba mover otros miles a otro sitio, filtraba y movía, filtraba y movía. Vi que no podía ir tan rápido como quería. Así que fue un proceso de varios días. Perdí las notas que tenía en google sincronizadas con la aplicación de Notas de Apple eso hizo que no quiera eliminar nada. Hice un movimiento de correos entre distintas cuentas de correo. Por supuesto siendo consciente que más adelante tendría que repensar los contenedores por ver si se añaden, eliminan, fusionan, u otra forma de organizar.

Reflexionar

Hasta el momento tenía varias listas en las que estaba organizando las cosas. Según avanzaban las semanas seguía con dudas del estilo de si colocaba las acciones que tenían fecha en Google Calendar o en Recordatorios de Apple. Recordaba el consejo de empezar con papel y estar así varios meses hasta ir dominando el método antes de pasarse a lo digital pero me parecía que iba a empapelar un par de paredes en la habitación e igualmente necesitaba tener acceso a las listas fuera de mi habitación.
    Lo de dividir las acciones en contextos no lo tenía claro cómo dividirlo, tenía una sola lista de Acciones siguientes, entendía la utilidad pero no veía claramente el tener una lista Llamadas en la que tendría solo una o dos acciones, ahí influía el que no registrara llamadas por ocio o saludar. La mayoría de las cosas las hago con mi Portátil así que no veía la necesidad de ese contexto, mucho menos veía la necesidad de un contexto sin conexión a Internet pues no veía ese caso en mi día a día. De momento me mantendría con una sola lista si al final no pasaban de una veintena de acciones, otra docena más en Espera y una media docena en Haciendo. Claro está eso era en uno de mis tableros, en el otro era algo similar (Trabajo y Personal).
    Para las cosas que necesitan más de una acción se generan Proyectos, e inicialmente pensé en crear una lista Proyectos en donde listarlos y luego una lista por cada proyecto. En principio no hubo problema porque claro está la inercia de llamar proyecto a cosas más complejas o similares al concepto de proyecto fuera de GTD, me centré en solo una media docena, y muchas otras cosas estaban en incubación en las listas: Algún día-talvez, películas, libros, lugares. Siguiendo lo de que por cada proyecto debe de haber una acción siguiente en algún contenedor coloqué acciones en las listas: Acciones siguientes, En espera, Haciendo.

Hacer

Me plantee la existencia de la lista Haciendo y de momento la dejé por tener un sitio para las tareas que había empezado y que por el motivo que fuese no podía terminarlas, una razón porque tenía que hacer otra cosa y la dejaba de hacer; otra porque tenía tareas que duraban un par de días como «hacer planificación del SprintX del mes».
    Revisaba las listas para saber qué hacer pero seguía realizando cosas según surgían, o me distraía con cosas no previstas hacer, como leer un artículo o noticia.

Segundo ciclo

No sabía si leer el segundo libro de David Allen, Haz que funcione, o algún otro, y fue cuando encontré y decidí, por las buenas valoraciones y comentarios, por el libro de José Miguel, Productividad personal. Así que pensé en leerlo y dejar para más adelante el otro libro a modo de dar un repaso a lo que se enseña sobre el modelo cada cierto tiempo, para ir afinando y entendiendo otras cosas que según se relee pueden verse.

Capturar

Dejé como bandejas de entrada principales una bandeja física para papeles en casa, dos listas Cosas Entrada en cada tablero de Trello, y la bandeja de entrada del correo. Claro está que hay otras bandejas como la de SMS, Whatsapp, para las cuales ya tenía la costumbre de cada semana dejarlas vacías. Otros chats como los del trabajo no los dejo vacíos sino que quedan como un archivo de referencia, al igual que Telegram. Telegram incluso lo utilizo para enviarme mensajes a mí mismo y así capturo cosas sean texto o imágenes de ideas, notas, cosas que necesito luego analizar.
    Por enésima vez re-nombré mis listas, la de Entrada en algún momento la llamé Capturar y ahora se llama Cosas Entrada/Captura  para dejar claro si lo que hay en las listas son cosas o acciones ya que es una de las primeras preguntas que me hacía. Por ejemplo, creé una lista Esta semana no y no sabía si dejar acciones o cosas. 
    Siguiendo el consejo de José Miguel intentaba tener cosas donde tenían que haber cosas, sin utilizar verbos, y con las acciones utilizar verbos. Esto lo tomé a modo de ir mejorando la forma de nombrar, aclarar o definir. El tema de cómo nombrar las cosas y la definición de objetivos es algo sobre lo que ya había leído, y ahora lo estaba aplicando al nivel más bajo, el de cosas y acciones siguientes, no aún a los niveles más altos de objetivos que era sobre lo que había leído.

Clarificar o Aclarar

Uno de los problemas que encontré fue que cuando estaba trabajando surgían cosas que tenía que limitarme a capturar pero terminaba capturando y aclarando las bandejas de entrada demasiado seguido. Todo esto como una forma de evitar el trabajo que tenía que hacer y procrastinar. Así que me propuse solo capturar, evitar el aclarar para ver en qué lista o contenedor colocar la acción y realizar el aclarado de las cosas en tres momentos del día, al iniciar el día por si tenía algún correo que necesitase ver antes de empezar la jornada laboral, luego de comer y luego de cenar. Desactivé las notificaciones para evitar las interrupciones, aún así si el correo lo reviso unas tres veces, los chats los reviso una docena de veces al día.
    También tenía que lidiar con cosas que surgían y prácticamente las quería convertir en acciones para tratarlas el mismo día, es algo con lo que luchar para evitar procrastinar las acciones que estaba haciendo. Así mismo pedidos de otras personas que antes tenía como costumbre atender inmediatamente, ahora me resulta complicado cambiar a decir: ahora no, causando momentos incómodos y un cambio en la actitud de mi parte. A veces parece que te perciben como egocéntrico porque ven como que se les diera menos importancia a sus cosas y sí hay que aprender a dar la debida importancia a las cosas y mucha gente quiere que se les de importancia inmediata a las suyas.
    Los proyectos empezaron a ser mucho más que una docena y me pareció inviable el tener una lista por cada proyecto. La herramienta sobre la que empecé a desarrollar plantea la relación entre los distintos niveles, objetivos, metas, acciones pero al no tener algo que facilite en manejar esto de momento trabajo con una lista de los proyectos y en cada revisión veo si hay una acción siguiente en alguna lista.

Organizar

Como decía antes las listas las re-nombré y como palabra inicial coloqué «Acción» o «Cosa» para facilitarme el saber lo que tenía que contener. Creé en Trello tres tableros: uno de tareas, otro de revisión y otro de archivo. 
    Así que en el tablero que llamé tareas coloqué las listas del día a día: Cosas entrada/captura, Acciones próximas, Acciones físicamente en casa, Acciones físicamente en el trabajo, Acciones en supermercado, Acciones haciendo, Acciones en espera,  Acciones hechas en semana. En el tablero de revisión coloqué las listas a ver en la revisión semanal como: cosas esta semana no, cosas algún día/talvez, Metas, y otras listas que son listas de comprobación.
    Uno de los problemas con que me encuentro es cuando una cosa pasa a ser un proyecto GTD, es decir, varias acciones, la acción siguiente pasa a una de las listas de acciones siguientes pero en mi cabeza rápidamente surgen como varias cosas a realizar para ese proyecto, es decir, una necesidad de listar varias acciones del mismo proyecto. Por el momento para estos casos dejaré una lista para el proyecto. 

Reflexionar

La incorporación del hábito de la revisión semanal no me costó pues era algo que ya llevaba haciendo, además, tengo uno similar mensualmente para la revisión de los movimientos bancarios y revisión de cuentas. Para el paso de reflexión veo las Acciones hechas en la semana y las archivo, vacío las entradas y reviso la lista de Cosas esta semana no para mover elementos a las listas de acciones siguientes. Le doy un repaso también a la lista de proyectos para revisar que hay una acción siguiente de cada uno en alguna lista de acciones. En definitiva que quede el sistema listo para una nueva semana.
    Como aún no tengo mi aplicación desarrollada la parte de alto nivel lo plasmé en papel, es decir, visión, objetivos. Los proyectos de GTD para mí son mis metas.

Hacer

Un problema con el que ya llevaba desde mucho tiempo atrás y con el que igualmente llevaba lidiando es el de dedicar demasiado tiempo a leer información sobre el tema y no actuar, entraba en un bucle de buscar algo, surgía algo nuevo y vuelta. De esto que entraba a Internet a buscar algo y pasaba por ver algún documental, trailers de películas, una película, gatitos, redes sociales, y entonces me acordaba de lo que quería buscar, o aunque buscara lo que quería, eso me llevase a otra información y veía que ignoraba mucho ocasionando una necesidad de conocer más antes de hacer. Es por eso que me plantee el ir implementando la metodología, y leer sobre ella en distintos periodos para ir afinando y no desviarme.
    Lo de compartir tablero se veía que no funcionaría porque uno de los problemas es el concepto de acabado o terminado, pues varias veces algo que otra persona había colocado en Hecho luego yo lo estaba moviendo a Acciones En espera porque no consideraba que estuviera terminado. Como bien decía Allen en su libro, mis acciones en espera serán acciones de otra persona pero tendrá que estar en su sistema, en donde corresponda. Además, aumenta el número de contenedores sin aportar ventaja.
    La parte más difícil para mí es el Hacer por mi tendencia a procrastinar. La siguiente parte que me cuesta es la de separar el capturar del, aclarar y organizar. Para lo primero, una de las acciones fue el tener una lista de Acciones hechas en la semana que luego cada semana pase a archivarse; la lista de hecho en la semana con el fin de diferenciar lo hecho esa semana de lo hecho en general. Otra de las acciones es el intentar hacer en la semana las acciones organizadas en la revisión semanal, y hacer lo posible por enviar a encubar o a la lista de cosas esta semana no las acciones que surgen durante la semana para evitar el buscar hacer tareas más fáciles en vez de las que me cuesta hacer. Otra de las tendencias con las que tengo que luchar es el de hacer tareas de otros, porque necesitan ayuda,  o para otros antes que las mías. Así como luchar con las ganas de aclarar las entradas cada momento.


domingo, 19 de agosto de 2018

Moodle: Enviar email como HTML




  • Se añade un quinto valor a la función email_to_user que corresponde con el mensaje en HTML.
Archivo en el que reemplazar texto: moodle/lib/moodlelib.php
Texto a buscar: email_to_user($user, $supportuser, $subject, $message);
Se reemplaza por: email_to_user($user, $supportuser, $subject, $message, $message);
  • Se elimina la función html_to_text
Archivo: moodle/message/lib.php
Texto a buscar: $eventdata->fullmessage = html_to_text($eventdata->fullmessagehtml);
Se reemplaza por: $eventdata->fullmessage = $eventdata->fullmessagehtml;
  • Dónde escribir el texto HTML:

- Personalizar email auto-matriculación en curso:
Cuando el usuario se auto-matricula en un curso.
Administración del curso/Usuarios/Método de matriculación/Auto-matriculación (estudiante)
Rellenar con el texto HTML en la casilla «Mensaje personalizado de bienvenida» y guardar.

- Personalización email alta usuario manual:
Cuando el administrador lo añade de forma manual al sitio, tanto de forma individual como en subida con fichero CSV.
Administración del sitio/Idioma/Personalización idioma
core: moodle.php
string: newusernewpasswordtext
Escribir el texto HTML en la casilla «Traducción local personalizada» y guardar los cambios del paquete de idioma.



- Personalizar email de restablecimiento de contraseña:
Cuando el usuario ha olvidado su usuario o contraseña, y busca por nombre de usuario o contraseña se le envía el e-mail de restablecimiento.
Administración del sitio/Idioma/Personalización idioma
core: moodle.php
string: emailresetconfirmation
Escribir el texto HTML en la casilla «Traducción local personalizada» y guardar los cambios del paquete de idioma.

- Personalizar email de inscripción manual en el sitio:
Cuando el usuario se registra en el sitio.
Administración del sitio/Idioma/Personalización idioma
core: moodle.php
string: emailconfirmation
Escribir el texto HTML en la casilla «Traducción local personalizada» y guardar los cambios del paquete de idioma.

Personalizar email de solicitud de nueva contraseña:
Administración del sitio/Idioma/Personalización idioma
core: moodle.php
string: emailpasswordconfirmation
Escribir el texto HTML en la casilla «Traducción local personalizada» y guardar los cambios del paquete de idioma.

Personalizar email con nueva contraseña:
Administración del sitio/Idioma/Personalización idioma
core: moodle.php
string: newpasswordtext
Escribir el texto HTML en la casilla «Traducción local personalizada» y guardar los cambios del paquete de idioma.

Probado en Moodle 3.3.7

miércoles, 1 de agosto de 2018

MySQL: Generar un número aleatorio



Para generar un número aleatorio entre un rango [a,b], es decir inclusivo: n>=a, n<=b

FLOOR(RAND()*(b-a+1))+a;

Probado en MySQL 5.7

domingo, 8 de julio de 2018

Fábula: La escuela de los animales.


Una vez, los animales decidieron que tenían que hacer algo heroico para solucionar los problemas de un«nuevo mundo», de modo que organizaron una escuela.

Adoptaron un currículo de actividades consistente en correr, trepar, nadar y volar. Para facilitar la administración todos los animales cursaban todas las materias.

El pato era excelente en natación, mejor incluso que su instructor, y obtuvo muy buenas notas en vuelo, pero pobres en carrera. Con el objeto de mejorar en este aspecto tenía que quedarse a practicar después de clase, e incluso abandonó la natación. Esto duró hasta que se le lastimaron sus patas de palmípedo y se convirtió en un nadador mediano. Pero el promedio era aceptable en la escuela, de modo que nadie se preocupó, salvo el pato.

El conejo empezó a la cabeza de la clase en carrera; sin embargo, tuvo un colapso nervioso como consecuencia del tiempo que debía dedicar a la práctica de la natación.

La ardilla trepaba muy bien hasta que comenzó a sentirse frustrada en la clase de vuelo, en la que el maestro le hacía partir del suelo en lugar de permitirle bajar desde la copa del árbol. También sufrió muchos calambres como consecuencia del excesivo esfuerzo, y le pusieron apenas un suficiente en trepar y un «insuficiente» en correr.

El águila era una alumna problemática y fue severamente castigada. En la clase de trepar llegaba a la cima del árbol antes que todos los otros, pero insistía en hacerlo a su modo.

Al final del año, una anguila anormal que nadaba muy bien y también corría, trepaba y volaba un poco, tenía el promedio más alto y le correspondió pronunciar el discurso de despedida.

Los perros de la pradera quedaron fuera de la escuela y cuestionaron por qué la administración no incluyó en el currículo las materias de cavar y construir madrigueras. Pusieron a sus cachorros a aprender con el tejón, y más tarde se unieron a marmotas y topos para inaugurar una escuela privada de gran éxito.

R. H. Reeves