¿Es “decrecimiento” una buena palabra?

Posted: Diciembre 5th, 2015 | Author: | Filed under: Sin categoría | Tags: , , , | No Comments »

Aunque puedo coincidir con algunas de sus ideas la palabra “Decrecimiento” me pone nervioso. Por eso el artículo de Kate Raworth en el blog de Duncan Green explicando algunos de los motivos por los que Decrecimiento es una mala palabra creo es digno de ser leído. Este otro post, con el que no concuerdo, es una respuesta al artículo original.

No dejéis de leer los comentarios y fijaros en la encuesta, en este momento la opción “buena idea, buena palabra” tienen 117 votos, “buena idea, mala palabra” 76 votos y “no una buena idea” tiene 41 votos. Es decir que aún sumando las dos últimas opciones el resultado está empatado. En cambio, la mayoría de comentarios, son críticos con la palabra.

Siendo un pelín malvado parece que a los fans del decrecimiento les va más la adhesión a la idea que a presentar argumentos a su favor.


El sol, la tierra la luna y animaciones con css3

Posted: Noviembre 21st, 2015 | Author: | Filed under: Sin categoría | Tags: , , | No Comments »

Hace algún tiempo vi un ejemplo brutal de como usar únicamente html5 y css3 para hacer una “representación” del sistema solar.

Viendo que estaba como uno de los proyectos de codeacademy hice una pequeña prueba que comparto. La diferencia fundamental con el de code academy es que en lugar de usar imágenes para representar a los planetas uso div con background-color y que he añadido la luna para poder jugar un poco con las animaciones “anidadas”. Que fundamentalmente es un problema de posicionamiento css.


Aquí el resultado.

Hay otros experimentos muy chulos en esta línea como este que trata de reproducir el primer experimento usando un html más semántico. O este otro clon del primero donde también modifica la estructura del html usando div todos al mismo nivel de anidamiento. Este otro también sigue la idea del primero pero añade cosas chulas como usar funciones css para posicionar las estrellas de fondo en localizaciones aleatorias.

Y por último, uno que a pesar de incluir algo de javascript (para los controles) es capaz de reproducir el sistema solar en 3D.


Aitor Guevara hablando de la arquitectura de Ducksboard

Posted: Septiembre 26th, 2015 | Author: | Filed under: Sin categoría | Tags: , , , , | No Comments »

Un vídeo algo antiguo (2013) en el que Aitor Guevara (CTO de Ducksboard) nos habla de cual era la arquitectura de Ducksboard en aquel momento. A pesar de que el vídeo dura más de una hora y media Aitor consigue hacer amena una charla técnica. No entra al mínimo detalle técnico pero si da una buena idea general. Responde sin rubor a preguntas como cual era el costo de la infraestructura que tenían en Linode (400$) o cuantos clientes de pago tienen.

Por el medio de la charla caen perlas del estilo de:

  • Usamos twisted para hacer aplicaciones asíncronas en python. ¿Conoceis nodejs? pues lo mismo pero tiene 10 años en lugar de 1.
  • Usamos backbone, porque tenemos un montón de javascript. Tenemos un montón no porque nos guste si no porque es lo que hay.

Otra de las cosas que más me gustan es la defensa que hace de PostgreSQL, que es el componente central de su infraestructura (especialmente hacia el minuto 50 pero en realidad lo hace en varios momentos). Hacia el minuto 44 explica como usan ellos backbone. La verdad es que aquí no me quedo muy claro desde donde servían el html, o si iba todo en los templates, porque el django del frontend en principio sólo actuaba como API Rest sirviendo JSON al navegador. Eso si, su django usa SQLAlchemy y no django-orm porque tenían cosas en el postgres que django-orm no soporta.

Los últimos minutos de la charla presenta un par de herramientas que “análisis del negocio” que también son de interés.

En este post además del vídeo están las transparencias.


Un sistema como otro cualquiera para recuperar tus contactos en un Android con la pantalla rota

Posted: Septiembre 23rd, 2015 | Author: | Filed under: Sin categoría | Tags: , , , , , | No Comments »

Uno de esos días cualquiera en que te llega alguien (a quien no puedes mandar a freír puñetas buscar en google) que una semana después de comprarse su primer móvil con Android se le ha caído al suelo, se le ha roto la pantalla y quiere recuperar sus contactos.

La primera respuesta es fácil. No hay problema, estarán en la memoria de la tarjeta, o sincronizados en la cuenta de google. Pero no, ni uno ni otro. Están en la memoria del teléfono.

Las primeras búsquedas en google se refieren a sistemas que necesitan que el teléfono esté rooteado para por ejemplo copiar la base de datos (sqlite) con los contactos. Teniendo el sqlite es fácil sacar un csv o al menos un listado que copiar a mano. Pero por supuesto el teléfono no está rooteado.

Bueno, la pantalla no está del todo muerta, la parte de arriba responde. Así que igual da para hacer pulsar en los sitios clave. El teléfono en sí no puede desbloquearse, pero si se puede llegar al botón de “Ajustes“, porque no tiene activado la protección por figura. Jugando con la rotación automática para modificar los sitios a pulsar, podemos llegar de “Ajustes” a “Aplicaciones“, de ahí a la pestaña de “Todas” y desplazarnos hasta “Contactos“. Muchas de las apps, como la “Contactos” tienen un botón “Lanzar” equivalente a como si las abrieras desde el Launcher.

Estando en la app de Contactos sólo hay que poder lanzar la opción de “Exportar“, pero en este teléfono ese menú se lanza desde la tecla de “Menu” que no responde. Teóricamente con el conector adecuado, podríamos conectar un ratón al teléfono para controlarlo, pero a falta de conector resulta que es posible enviar eventos (como pulsaciones de teclas) al móvil a través de adb.

“Pulsamos” la tecla de menú:

$ ./adb shell input keyevent 82

Y un par de veces KEYCODE_DPAD_DOWN que actúa como el curso hacia abajo

$ ./adb shell input keyevent 20

Y enviamos el evento KEYCODE_DPAD_CENTER para hacer click / pulsar / tap sobre la opción seleccionada

$ ./adb shell input keyevent 23

Y ya tenemos lanzada la la aplicación de exportación. Siguiendo un proceso parecido de ver en que partes de la pantalla de puede pulsar y enviando eventos desde adb, seleccionamos como origen el smartphone, como destino la cuenta de gmail. Y listo. En un par de minutos tenemos los contactos en gmail, desde donde podemos exportarlos a csv, vcard o listos para ser usados desde otro teléfono android.

Espero que a alguien le sea de ayuda. Se admiten otros modos de hacerlo en los comentarios.


Video: Aplicaciones en tiempo real con python y postgres

Posted: Agosto 25th, 2015 | Author: | Filed under: Sin categoría | Tags: , , , , , , , | No Comments »

Una charla de como montar aplicaciones en tiempo real con python y postgres. Tiempo real entendido como notificaciones de un chat, hacer algo cada vez que se actulice una tabla de la bd etc,…

El vídeo se hace un poco largo, seguramente con las transparencias llegaba para hacerse una idea general. Pero aún así se hace interesante por alguna de las técnicas que emplea:

  • Aboga por no usar frameworks en python. Con las librerías de hoy en día es sencillo montar una API Rest gestionando las llamadas de bajo nivel directamente
  • Usa las funciones de postgres de LISTEN y NOTIFY que combinadas con un trigger permiten que código cliente (psycopg2) sean notificados cuando algo pasa en la base de datos (se modifica una fila o lo que sea) y actuén en consecuencia (provocar un cambio en el navegador mediante websockets)
  • Para simplificar la API y el diseño de la bd, los datos se guardan como tipos nativos postgres (varchar, boolean,…), y se usa la función de postgres row_to_json para recuperarlos una cadena de texto con formato json.
  • Usa httpie para probar la API Rest. Si alguna vez usaste curl para esto enseguida verás que está bien conocer httpie.
  • A pesar de que la idea principal de la charla es montar una aplicación en tiempo real con el mínimo número de dependencias (complejidad) el proceso de build que monta no parece trivial. pip para dependencias en python, nodeenv (una especie de entorno virtual para node que se integra con el virtualenv de python), bower para las dependencias javascript de cliente,… Todo ello orquestrado por un Makefile.
  • No muestra como hacer la parte del frontend, pero en todo caso el código está en su repo

Comentarios al artículo de Complejidad y Reversibilidad de Kent Beck

Posted: Agosto 9th, 2015 | Author: | Filed under: Sin categoría | Tags: , , | No Comments »

Andrés me pincha para que lea y comente el último post de Kent Beck en su muro de facebook. Como todo lo que escribe Beck hay que leerlo con atención y se pueden sacar lecciones interesantes. Pero este artículo en particular se me hace complicado de leer porque creo que mezcla demasiadas cosas a la vez. Comienza con una teoría general sobre sistemas complejos y luego salta a prácticas concretas de facebook para atajarla en distintos estadios del desarrollo sin pararse a explicar que técnicas tienen sentido en según que contextos. Analicémoslo por tanto atendiendo al artículo como dos partes separadas.

Complejidad y Software

Software complexity es un término con definición propia en el mundo académico. En la práctica todo desarrollador tiene una noción intuitiva de que es complejidad y debería tener como principio el atajarla. Beck explica alguno de los elementos de la complejidad y cuales de ellos se puede intentar mantener bajo control en un producto como facebook. La cuestión es, si en otro tipo de productos software se puede o tiene más sentido atacar otro frente distintos al de la irreversibilidad. Personalmente se escapa de mis conocimientos esta reflexión pero apunto algunos elementos para el debate:

  • Estados. Atendiendo al producto como un todo (hardware, acciones del usuario, red,..) seguramente será difícil de atajar. Si nos quedamos con las acciones (interacción) del usuario me recuerda a la diferenciación entre mapa y camino de la que se reapropió Andrés atendidendo a Verplank.
  • Interdependencias. SOLID, KIS, Patrones, Modularidad o cualquier práctica de buen diseño entiendo que ayuda a disminuirla a no ser que se me escape algo.
  • Incertidumbre. Supongo que es el más complicado. Usuarios usando la aplicación en formas no previstas. Requisitos cambiantes,…
  • Irreversibilidad. Nada que decir, es en el que se centra Beck.

Atajar la Irreversibilidad

La segunda parte del artículo habla de algunas de las técnicas que usan en Facebook para combatirla. Algunas pueden ser consideradas de modernas como el Frequent Pushes (¿Continuous Delivery?) y otras como el Code Review llevan con nosotros mucho tiempo. Beck las enumera todas juntas pero creo que intentar ponerlas bajo una clasificación más o menos habitual en factorías de software tradicionales puede ayudar a decidir cuales pueden ser aplicables en cada caso. Dejo fuera (IRC y Data-informed decisions)

  • Desarrollo
    • Development servers
    • Code review
    • Correlation
  • Pre-Producción / Testing
    • Internal usage
    • Staged rollout
    • Advance countries
    • Shadow production
  • Producción
    • Frequent pushes
    • Soft launches
    • Dynamic configuration
    • Right hand side units
    • Double write/bulk migrate/double read

Sin duda algunas de las técnicas como Staged Rollout es discutible en que fase van y son clasificables bajo esta óptica. La idea de intentar clasificarlas es sólo para poder compararlas con una forma de trabajo que nos resulte más cercana para a partir de ahí ver cuales podemos empezar a aplicar y en que punto de nuestro proceso.

Qué puedo aplicar y cómo si no soy Facebook

Más que técnicas concretas en realidad lo que Beck plantea es una cultura (o dos). El Desarrollo Ágil y el DevOp. Intentar aplicar alguna de sus estrategias de forma separada sin abrazar la filosofía subyacente creo que sólo produce desgaste. Con esto no quiero decir que tengas que hacer pair programming y tener un devop en tu equipo, pero sí al menos comprender que hay valor en los principio que proponen.

Para mi los pasos en ese camino son tres: Tests, Automatización y Monitorización.

Monitorización. Si no estás midiendo lo que sucede rendimiento, comportamiento de usuarios, … saber lo que está pasando o cuando un cambio no tiene el efecto previsto.

Automatización. Si hacer un despliegue es costoso e implica varios pasos, se harán pocos , se tardará más tiempo en tener feedback, se introducen más posibilidades de error y no hablemos de lo que supone revertir un mal cambio. Si no se automatizan los procesos se vuelve más complicado que todos los desarrolladores tengan el mismo entorno y este sea parecido a producción.

Tests. Probablemente la piedra angular. Estoy leyendo Working Effectively with Legacy Code, y en los primeros capítulos expone algunas cuestiones sobre tests que tienen relevancia para la “reversibilidad”. En el libro comparan trabajar sin tests a hacer acrobacias sin red, y expone dos formas de introducir cambios en un sistema.

Changes in a system can be made in two primary ways. I like to call them Edit and Pray and Cover and Modify. Unfortunately, Edit and Pray is pretty much the industry standard. When you use Edit and Pray, you carefully plan the changes you are going to make, you make sure that you understand the code you are going to modify, and then you start to make the changes. When you’re done, you run the system to see if the change was enabled, and then you poke around further to make sure that you didn’t break anything. The poking around is essential. When you make your changes, you are hoping and praying that you’ll get them right, and you take extra time when you are done to make sure that you did.
Superficially, Edit and Pray seems like “working with care,” a very professional thing to do. The “care” that you take is right there at the forefront, and you expend extra care when the changes are very invasive because much more can go wrong. But safety isn’t solely a function of care. I don’t think any of us would choose a surgeon who operated with a butter knife just because he worked with care. Effective software change, like effective surgery, really involves deeper skills. Working with care doesn’t do much for you if you don’t use the right tools and techniques.
Cover and Modify is a different way of making changes. The idea behind it is that it is possible to work with a safety net when we change software. The safety net we use isn’t something that we put underneath our tables to catch us if we fall out of our chairs. Instead, it’s kind of like a cloak that we put over code we are working on to make sure that bad changes don’t leak out and infect the rest of our software. Covering software means covering it with tests. When we have a good set of tests around a piece of code, we can make changes and find out very quickly whether the effects were good or bad. We still apply the same care, but with the feedback we get, we are able to make changes more carefully.

En esencia, durante el desarrollo tener tests te permite probar y si no funciona revertir a coste casi cero. En producción el coste de revertir no es cero (al menos sin aplicar otras de las técnicas mencionadas) pero al menos te permite detectar errores de forma temprana.

 

 

 

 


Libro: Ready Player One

Posted: Agosto 8th, 2015 | Author: | Filed under: Sin categoría | Tags: , , | 2 Comments »

Ready Player One es sobre todo una buena lectura ligera para el verano. En un mundo futurista donde la energía resulta un bien escaso y grandes cantidades de población viven empobrecidas la única diversión, fuente de trabajo y vía de escape es OASIS. Una versión a lo grande de Second Life a la que los usuarios se conectan mediante aparatos de realidad virtual. En OASIS no importa quien seas o como seas, tu Avatar es lo que te representa. La historia cuenta como el protagonista del libro intenta resolver el reto planteado por el creador de OASIS a su muerte y quien lo consiga herederá su fortuna.

 

El libro es una mezcla ligera de ficción ciberpunk con corporaciones tratando de resolver la búsqueda (no leas demasiado del enlace hay spoilers) y misiones al más puro estilo Dungeons & Dragons por el medio del mundo virtual.

 

Si te gustan películas ochenteras como Lady Halcon o los Goonies, eres geek/freak, jugaste al rol o estás enganchado a los MMORPG este libro te encantará.

 

Puedes comprarlo en amazon y también hay gente que lo comparte.


Portátiles entre 600 y 700€ para CAD y Diseño

Posted: Agosto 8th, 2015 | Author: | Filed under: Sin categoría | Tags: , , | No Comments »

Estos días un amigo me pidió ayuda para comprar un ordenador. Los requisitos:

  • Ofimática, CAD y Diseño sin grandes necesidades
  • Entre 600€ y 700€
  • Pantalla de 15.6”

Échando un ojo a lo que había en el mercado empecé a hacer una hoja de cálculo. Descarté todas los que tuvieran una gráfica peor que una 820M y un micro peor que un i5-4210 porque son configuraciones habituales en ese rango de precios. Luego comparando precios, características y preferencias personales llegamos a esta lista.

Están separados dos rangos de precios los que están más cerca de 600 y los que están más cerca de 700, con mis preferencias resaltadas en amarillo. Si alguién está buscando un portátil así espero que le sirva. El hecho de hacer la hoja de cálculo ya lleva un buen rato, igual hay espacio aquí para hacer un scrapper. ¿Algún programador en la sala :P?


Buscando un portátil – Listado de candidatos entre 900 y 1150€

Posted: Marzo 21st, 2015 | Author: | Filed under: Sin categoría | Tags: , , | 10 Comments »

Decidido el tipo de procesador que queremos, podemos echar una ojeada a las páginas de distintas tiendas.

Lo mejor es entrar en varias, ver lo usables que son en función de como puedes filtrar los portátiles, y quedarse con aquellas en que la búsqueda sea más o menos rápida. Como mínimo porque nos dejan filtrar por rango de precios y tipo de procesador.

Después de ver varias yo he usado las siguientes porque me parecieron las más cómodas:

Lógicamente buscando en varias tiendas salen portátiles repetidos, pero está bien para comparar hay veces que de una tienda a otra el mismo portátil puede variar en 100€. Así que una vez escogido uno toca buscar una tienda fiable con el precio más barato.

De la búsqueda anterior me he quedado por distintos motivos con unos 25 portátiles. Esta es una tabla resumen:

Y por lo que se ve, hay varias decisiones clave que tomar (a parte del precio):

  • Resolución de la pantalla.[1] [2]Sin duda yo me iré a 1920×1080 antes que a 1366×768. Creo que la inversión merece la pena para el eclipse
  • Tarjeta gráfica. Tras leer un poco descarto las Ati RM9M265X que vienen con los Toshiba de la lista. Tienen muy buena pinta, sobre todo el P50B-11M, pero veo que podrían dar problemas con linux [1] [2] [3]. Hay que investigar un poco el resto de nvidia de la lista, por si es un factor clave para descartar más ordenadores o no. Aunque basándome en estas tres páginas las he clasificado
  • 8 o 16 de RAM. O ver si es ampliable a posteriori.
  • Si hay una diferencia real entre los discos duros de 5400 rpm y los de 7200 rpm
  • Si el VGA es fundamental o llega con HDMI. Con el uso que yo le doy al ordenador, teniendo en cuenta que cualquier pantalla moderna soporta HDMI y que cada vez más proyectores sólo tienen HDMI, la existencia de VGA no es un factor clave

Disco Duro

El rendimiento de un disco duro no viene sólo determinado por las rpm, pero averigüar el modelo concreto que monta cada ensamblador y comparar es una tarea demasiado complicada como para que la búsqueda compense. En general la gente parece notar diferencias entre los 7200 rpm y los de 5400 rpm [1] [2][3].

Los discos duros híbridos (con cache SSD) parecen dar un mejor rendimiento que los tradicionales [1] [2] [3], aunque también hay algunas opiniones a favor de los de 7200 sobre 5400 híbridos o de que depende del uso que se le de.

Así que como criterio para descartar portátiles elimino los de 5400 que no tiene cache ssd y/o no tiene 16 GB de RAM y no le doy relevancia a los hibridos sobre los de 7200 rpm.

Tarjeta gráfica

En esta página tenemos un listado de las diferentes gráficas de nvidia. Siendo las que nos interesan, ordenadas de mayor rendimiento a menor:

Tras investigar un poco no he sido capaz de determinar que tarjeta gráfica necesito o cuales son las ventajas reales de unas sobre otras si no te dedicas a jugar. Entre lo poco que he creido entender está que si vas a trabajar con resoluciones altas (como es mi caso al usar monitor extendido) debería priorizar la cantidad de RAM sobre la velocidad de la misma. Es decir mejor 4GB de RAM DDR3 que 2GB de RAM DDR5. Si te vas a dedicar a jugar es mejor priorizar al reves.

Además revisando las especificaciones de las tarjetas, la 740, la 840, la 850 y supongo que la 845 también, tienen soporte para la misma resolución, así que entre estas creo que cualquiera es suficiente para mis requisitos, por lo que puedo descartar los portátiles más caros cuya diferencia principal sea mejor gráfica.

 Conclusiones

Con el listado final de 8 ordenadores donde todos cumplen los requisitos que me había fijado quedan pocas decisiones para descartar.

  • Fundamentalmente si sacrificar rendimiento a cambio de quedarme con mountain en formato ultrabook. Lo que no me interesa en este momento teniendo en cuenta que mi portátil actual es de 2.9 kg y eso no me molesta.
  • Si 16 de RAM es un requisito. Que en principio para mi no lo es, aunque que sea ampliable a 16 sí.
  • Si alguna review de alguno de los modelos que quedan aporta algo muy negativo que lo descarte o algo muy positivo que le de puntos sobre los más económicos

Resto de artículos de esta serie


Buscando ordenador portátil – Micros

Posted: Marzo 10th, 2015 | Author: | Filed under: Sin categoría | Tags: , , | 3 Comments »

En el último artículo veiamos que para encontrar un ordenador portátil adecuado (en rendimiento y presupuesto) uno los factores más importantes era el micro. Centrándonos en los Intel, la wikipedia nos da un buen punto de entrada. Lo primero a saber es que existen varias generaciones.

  • La 5 generación de nombre Broadwell (o Intel Core 5th Gen) salió (aproximadamente) en Enero de 2015 y utiliza tecnología de 14nm
  • La 4 generación de nombre Haswell (o Intel Core 4th Gen) salieron en Junio de 2013 y utiliza tecnología de 22nm
  • La 3 generación lleva por nombre Ivy Bridge y es de 2012 así que la descartamos en el análisis.
  • Por el medio tenemos el Haswell-E (Agosto de 2014) y el Ivi Bridge-E (Septiembre de 2013) de los que sólo hay versiones i7 también en 22nm.

Hasta donde he podido entender a pesar de ser un logro tecnológico importante hasta finales de año probablemente no tenga mucho sentido comprar un ordenador con micro de 5 generación. Tras la generación la forma de clasificarlos es por “familia” o “gama” (o “product line”). Donde las fundamentales para portátiles como el que buscamos serían:

  • i3. Los de gama baja.
  • i5. Gama media. En versón mobile, tienen 3M de cache, 2 cores y TDP de entre 11.5 y 47 con muy pocos siendo de 47.
  • i7. Gama alta. En versión mobile, tienen entre 4 y 8M de cache, los hay de 2 y de 4 cores y TDP de entre 11.5 y 47 siendo la mayoría de 47.

Tanto los i5 como los i7 tienen Hyperthreading, Virtualización por hardware (VT-x) y Turbo Boost. Hay otras tecnologías (menos importantes para nuestro caso) como VT-d que dependen del modelo concreto y no de ser i5 o i7. Además hay que tener en cuenta que en algunos portátiles se montan micros de desktop y no de mobile. Por ello al final es necesario consultar las características concretas de cada micro. Para orientarnos con los modelos es bueno saber que suelen tener cuatro números y a continuación 1 o más letras. El primero de los números hace referencia a la generación, y las letras del final depende. Si son:

  • K, X, S o T se refieren a modificaciones concretas sobre el micro
  • Una M significa que es versión mobile con dos cores (aunque puede tener otro sufijo en lugar de la M y ser mobile igual)
  • MQ o HQ significa que es mobile pero tiene cuatro cores. La diferencia entre HQ y MQ es que los HQ van soldados a la placa (más difíciles de cambiar por tanto, pero mi impresión es que ligeramente superiores para el mismo modelo) y los MQ no.
  • U e Y significa que son pensados para ultrabooks porque tienen un menor consumo. Y menor consumo que U

Por ejemplo un  i7-4600M, es un i7 de cuarta generación mobile con dos cores mientras que un i7-4770HQ es un i7 de cuarta generación mobile con 4 cores. Otro ejemplo, un i5-4210Y consumirá menos que un i5-4210U que consumirá menos que un i5-4210M. Pero generalmente a menor consumo también menor velocidad de reloj y peor rendimiento.

GPU

Los micros actuales llevan “incluida” una tarjeta gráfica en el propio micro, y por tanto sería algo a considerar a la hora de escoger micro pero por ahora vamos a obviarlo.

Conclusiones

Lo que hemos visto en este artículo nos permite identificar a grandes rasgos las diferencias entre un micro y otro. Pero la pregunta más importante a resolver es al final si escoger un i7 con cuatro cores o un i5 con dos. Entender si para un caso concreto como el de escoger un ordenador para desarrollo es mejor más cores o más velocidad de reloj es algo que resulta difícil de responder. ¿Alguna opinión? Pero teniendo varias aplicaciones, incluidos servidores y máquinar virtuales funcionando a la vez, sin ser ninguno de los procesos muy intensivos, parece lógico pensar que más cores aunque sea reduciendo la velocidad es la decisión acertada. Para tratar de reducir el precio en la página de intel vemos que los modelos i7 del 470x al 472x serían buenas opciones, aunque como siempre al final dependerá de como cada fabricante monte el portátil.

Referencias

Resto de artículos de esta serie